Zvuky, procedury

Nejen psát na obrazovku umožňuje Pascal. Také umí vyluzovat zvuky. K tomu slouží procedury v unitě CRT. (To znamená, že na začátku programu musí být uvedeno Uses CRT.)

Sound( freq );

Spustí zvuk o frekvenci freq Hz (0..65535)

Nosound;

Ukončí zvuk.

Delay( čas );

Čeká čas milisekund. Delay(1000) čeká jednu sekundu.

Typická ukázka „pípnutí" vypadá asi takto:

Sound(1000);
Delay(500);
Nosound;

Pokud následují tóny po sobě, není třeba je oddělovat příkazem NoSound:

Sound(500);
Delay(250);
Sound(740);
Delay(250);
Sound(1000);
Delay(250);
Nosound;

Připomínám pouze, že člověk běžně slyší frekvence 20Hz..16kHz. Frekvence nad 20 kHz uslyší možná váš pes a nad 40 kHz leda prolétávající netopýr.

Oblíbeným efektem jest siréna — mění se frekvence zvuku v rozsahu 500..5000 Hz.

For i:= 500 to 5000 do Begin
Sound( i );
Delay( 10 );
End;
NoSound;

Pokud následuje cyklus For i:=5000 downto 500.., je efekt hotov.

Příklad:

Program, hrající jednoduchou melodii.

Program Hudba;
{       Hraje tóny     }
 Uses
  Crt;
 Const
  Cela = 500;
  Tab: Array[1..12] of Word =
   ( 262, 277, 294, 311,
     330, 349, 369, 392,
     415, 440, 466, 494 );
 Procedure Beep( Fr, T: Word );        { Pípne }
  Begin
   Sound( Fr );
   Delay( T );
   Nosound;
  End;

 Procedure Hraj( Nota: Char; Delka, Oktava: Byte );
  Var                                  { Hraje tón}
   Nasob: Word;
   i    : Integer;
   Nt   : Byte;
  Begin
   Case Nota of                        { Převod znaku na index }
    'c': Nt:= 1;
    'C': Nt:= 2;
    'd': Nt:= 3;
    'D': Nt:= 4;
    'e': Nt:= 5;
    'f': Nt:= 6;
    'F': Nt:= 7;
    'g': Nt:= 8;
    'G': Nt:= 9;
    'a': Nt:= 10;
    'A': Nt:= 11;
    'h': Nt:= 12;
    else Nt:= 0;
   end;
   Nasob:= 1;
   For i:=1 to Oktava do Nasob:= Nasob*2;
   If Nt=0 then Begin
    Nosound;
    Delay( Cela div Delka );
   end else Beep( Tab[ Nt ]*Nasob, Cela div Delka );
  End;

 Begin
  Hraj( 'g', 2, 1 );
  Hraj( 'g', 2, 1 );
  Hraj( 'g', 2, 1 );
  Hraj( 'D', 1, 1 );
  Hraj( ' ', 1, 1 );
  Hraj( 'f', 2, 1 );
  Hraj( 'f', 2, 1 );
  Hraj( 'f', 2, 1 );
  Hraj( 'd', 1, 1 );
  Nosound;
 End.

Tabulka frekvencí

označení oktáv neodpovídá oktávám tak, jak jsou obecně užívány (protože programování není muzika :-)

  0 1 2 3 4 5
c 262 523 1047 2093 4186 8372
c# 277 554 1109 2217 4435 8870
d 294 587 1175 2349 4699 9397
d# 311 622 1245 2489 4978 9956
e 330 659 1319 2637 5274 10548
f 349 699 1397 2794 5588 11175
f# 369 740 1480 2960 5920 11840
g 392 784 1568 3136 6272 12544
g# 415 831 1661 3322 6645 13290
a 440 880 1760 3520 7040 14080
a# 466 932 1865 3729 7459 14917
h 494 988 1976 3951 7902 15804