Potrzebujemy:
- kompa z porządnym speakerem (głośniczkiem systemowym wewnątrz obudowy)
- kompilatora PASCALA
- kilku sekund spokoju na wklepanie kodu
Kompilujemy następujący kod:
program speaker;
uses crt;
var
i : integer;
begin
for i := 1 to 20000 do
begin
sound(i); delay(5); nosound;
end;
end.
Jak nietrudno się domyśleć, program generuje serię 20000 5-milisekundowych dźwięków o zwiększającej się liniowo częstotliwości, od 1Hz do 20kHz. Delay ustawiłem taki jak pamiętam że dobrze brzmiał, można poeksperymentować z wartością, ale nie ma sensu wchodzić powyżej kilkudziesięciu. Odpalałem go kilka razy w gimnazjum i liceum, i reakcje były zbliżone*.
Jeśli ktoś uważa efekty dźwiękowe za mało interesujące, można wprowadzić drugą zmienną, której wartość zmienia się w jakiś ciekawy sposób, np:
for x := 1 to xxx do
begin
y := round(x * abs(sin(x)));
sound(y); delay(5); nosound;
end;
Trzeba tak dobrać wartość xxx, by wyrażenie przypisywane do zmiennej y nie przekroczyło 19000-20000 - speaker nie wyrabia już tych częstotliwości. Funkcja round() musiała się pojawić gdyż niestety wyrażenie wewnątrz niej przybiera wartości niewymierne, a sound() operuje tylko na integerach. Oczywiście powoduje to "spłaszczenie" różnorodności dźwiękowej. Jest problemem otwartym jak tego uniknąć.
* Łukasz/paradox/Flisu, komp ci zaraz wybuchnie!
zapomniałem dodać: wewnątrz pętli można dodać jeszcze writeln(y);, by móc obserwować aktualnie brzmiącą częstotliwość. Przydatne przy eksperymentowaniu z różnymi wariantami kodu.
OdpowiedzUsuńo Boshhh... to ten program do rozwalania mózgów...
OdpowiedzUsuń:f
Nie wiem czemu, ale ten drugi przykład napisany jest trochę nie w moim stylu. W postaci, w której jest przedstawiony, użycie zmiennej y jest nieuzasadnione, gdyż niepotrzebnie zwiększa złożoność pamięciową. Jest sens jej używać, gdy z przechowywaną tam wartością mamy zamiar zrobić coś jeszcze - np. wydrukowac na ekran.
OdpowiedzUsuńMożna też użyć generatora liczb pseudolosowych (randomize uruchamia go, a polecenie random(Z) zwraca liczbę 0<=x<Z), np. w poleceniu delay.
yyy... ale o co kaman?? ;)
OdpowiedzUsuń