09 kwietnia 2007

paradox DIY #1 - jak przestraszyć nauczyciela informatyki i kilku sąsiadów?

Wiem, że czytają mnie osoby nie-ścisłe, które z kompem radzą sobie w stopniu "użytkowym" (GG, Winamp, IE, czasem Word). Tym osobom ten post może zaszkodzić. Reszta niech obejrzy czym się zajmowałem w gimnazjum jak mi się nudziło na lekcjach :D

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!

4 komentarze:

  1. 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ń
  2. o Boshhh... to ten program do rozwalania mózgów...

    :f

    OdpowiedzUsuń
  3. 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.
    Można też użyć generatora liczb pseudolosowych (randomize uruchamia go, a polecenie random(Z) zwraca liczbę 0<=x<Z), np. w poleceniu delay.

    OdpowiedzUsuń
  4. yyy... ale o co kaman?? ;)

    OdpowiedzUsuń