[Back to SOUND SWAG index]  [Back to Main SWAG index]  [Original]

{ Here is a Unit that plays music. It came out of this echo recently. }


Unit Music;

Interface

Uses
  Crt;
Const
   e_note = 15;       { Eighth Note      }
   q_note = 30;       { Quarter Note     }
   h_note = 60;       { Half Note        }
   dh_note = 90;      { Dotted Half Note }
   w_note = 120;      { Whole Note       }
   R = 0;             { Rest             }
   C = 1;             { C                }
   Cs = 2;            { C Sharp          }
   Db = 2;            { D Flat           }
   D = 3;             { D                }
   Ds = 4;            { D Sharp          }
   Eb = 4;            { E Flat           }
   E = 5;             { Etc...           }
   F = 6;
   Fs = 7;
   Gb = 7;
   G = 8;
   Gs = 9;
   Ab = 9;
   A = 10;
   As = 11;
   Bb = 11;
   B = 12;

Procedure PlayTone(Octave : Byte; Note : Byte; Duration : Word);
Procedure ToneOn(Octave   : Byte; Note     : Byte);

Implementation

Var
  Oct_Val  : Array [0..8] Of Real;
  Freq_Val : Array [C..B] Of Real;

Procedure Set_Frequencies;
Var
  N : Byte;
begin
  Freq_Val[1] := 1;
  For N := 2 To 12 Do
    Freq_Val[N] := Freq_Val[N-1] * 1.0594630944;
  Oct_Val[0] := 32.70319566;
  For N := 1 To 8 Do
    Oct_Val[N] := Oct_Val[N-1] * 2;
end;

Procedure PlayTone(Octave : Byte; Note : Byte; Duration : Word);
begin
  If Note = R Then
    NoSound
  Else
    Sound(Round(Oct_Val[Octave] * Freq_Val[Note]));
  Delay(Duration*8);
  NoSound;
end;

Procedure ToneOn(Octave : Byte; Note : Byte);
begin
  If Note = R Then
    NoSound
  Else
    Sound(Round(Oct_Val[Octave] * Freq_Val[Note]));
end;

begin
  Set_Frequencies;
  NoSound;
end.

{
  This does not include the actual values of the tones, but it is still
very helpful (more so than if you had the actual freqencies). If you still
want the tones, just substitute the value For the tone into the Procedures
that play the tone.
}

[Back to SOUND SWAG index]  [Back to Main SWAG index]  [Original]