Przykład demonstruje odtwarzanie gamy dźwięków za pomocą pascal'a.
Tworzenie Gamy dźwięków, częstotliwości nut
W dużym przybliżeniu: C = 538Hz, D=615Hz, (nagrałem widmo dźwięku C granego na flecie i zbadałem częstotliwość najgłośniejszego tonu) E = D * D / C, F = E * D / C itd..
Każdy dźwięk gamy ma własną częstotliwość, następny jest po prostu kolejnym elementem ciągu geometrycznego. Ten sam dźwięk wyższej oktawy ma dokładnie dwukrotnie wyższą częstotliwość. Dźwięków w oktawie jest 8. Jest 8 dźwięków granych normalnie, są też bemole i krzyżyki. Każdy kolejny dźwięk jest wyższy częstotliwością od poprzedniego o około 71/65. Taki pomiar można uzyskać mierząc 2 sąsiednie progi gitary. Ich stosunek da nam różnicę wysokości tonów. Za pierwszy dźwięk np. C można przyjąć dowolną częstotliwość (tak jakby przestroić gitarę), ale lepiej przyjąć standardową wartość, ok 538Hz
A teraz w praktyce:
{$N+}
PROGRAM Organki;
USES Crt;
CONST MaxNut=20;
FirstK1 = 16;
FirstK2 = 2;
C = 538;
D = 615;
VAR
Temp : Single;
Temp2 : Single;
Temp3 : Single;
Tab:ARRAY [0..MaxNut] OF Word;
PROCEDURE Generate;
VAR i:Integer;
BEGIN
Temp:=D;
Temp2:=C;
FOR i:=0 TO MaxNut DO
BEGIN
Temp3:=Temp+(Temp-Temp2)*65/71;
Temp2:=Temp;Temp:=Temp3;
Tab[i]:=Round(Temp);
END;
END;
BEGIN
Generate;
REPEAT
Sound(Tab[PORT[$60]-FirstK1]);
IF KeyPressed THEN ReadKey;
IF PORT[$60]>127 THEN NoSound;
UNTIL PORT[$60]=1;
END.