home *** CD-ROM | disk | FTP | other *** search
- { 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.
- }