{
BILL BUCHANAN

> I'm just learning Pascal, and I was 1dering if it's possible 2 play
> music in Pascal?  if so... how?

Here's a little Program that allows you to play the "PIANO" on your keyboard.
No Soundcard needed or anything like that.  This may give you a small idea
on how to create your own Sounds ...

}

Program Music;                         {by Judy Birmingham, 9/18/92}
Uses
  Crt;

Const
  {-------------------------------------------------------------------}
  {These values will Vary by the song you choose}
  {I wish I could have made these Variables instead of Constants,
  but I seemed to be locked into using Const, because they define
  Array sizes in the Types declared below.}

  TotalLinesInSong = 4;             {Number of lines in song}
  MaxNotesInPhrase = 9;             {Max number of notes in any line}
  BeatNote         = 4;             {Bottom number in Time Signature}
                                    {Handles cut time (2/2), 6/8 etc.}
  Tempo            = 160;           {Number of beats per minute}
  {-------------------------------------------------------------------}
  {Note frequencies}
  R = 0;                            {Rest = frequency of 0 : silence}
  C = 260;                          {Frequency of middle c          }
  CC = 277;                         {Double letter indicates a sharp}
  D = 294;
  DD = 311;
  E = 330;
  F = 349;
  FF = 370;
  G = 392;
  GG = 415;
  A = 440;
  AA = 466;
  B = 494;

  {Note durations}
  Q  = 1 * (BeatNote/4);                            {Quarter note}
  I  = 0.5 * (BeatNote/4);                          {Eighth note}
  H  = 2 * (BeatNote/4);                            {Half note}
  W  = 4 * (BeatNote/4);                            {Whole note}
  S  = 0.25 * (BeatNote/4);                         {Sixteenth note}
  DQ = 1.5 * (BeatNote/4);                          {Dotted quarter}
  DI = 0.75 * (BeatNote/4);                         {Dotted eighth}
  DH = 3 * (BeatNote/4);                            {Dotted half}
  DS = 0.375 * (BeatNote/4);                        {Dotted sixteenth}

  Beat = 60000/Tempo;       {Duration of 1 beat in millisecs}

Type
  IValues = Array [1..MaxNotesInPhrase] of Integer;
  RValues = Array [1..MaxNotesInPhrase] of Real;
  Phrase  = Record
    Lyric  :  String;
    Notes  : IValues;   {Array of note frequencies}
    Octave : IValues;   {Array of note octaves}
    Rhythm : RValues;   {Array of note durations}
  end;
  Song = Array [1..TotalLinesInSong] of Phrase;

 {Sample song}
Const
  RowRow : Song = (
    (Lyric : 'Row Row Row Your Boat';
    NOTES   :  (C,C,C,D,E,R,0,0,0);
    OCTAVE  :  (1,1,1,1,1,1,0,0,0);
    RHYTHM  :  (DQ,DQ,Q,I,Q,I,R,0,0)
    ),

    (Lyric : 'Gently down the stream';
    NOTES   :  (E,D,E,F,G,R,0,0,0);
    OCTAVE  :  (1,1,1,1,1,1,0,0,0);
    RHYTHM  :  (Q,I,Q,I,DQ,DQ,0,0,0)
    ),

    (Lyric : 'Merrily merrily merrily merrily';
    NOTES :  (C,C,G,G,E,E,C,C,0  );
    OCTAVE : (2,2,1,1,1,1,1,1,0  );
    RHYTHM : (Q,I,Q,I,Q,I,Q,I,0  )
    ),

    (Lyric : 'Life is but a dream.';
    NOTES  : (G,F,E,D,C,R,0,0,0  );
    OCTAVE : (1,1,1,1,1,1,0,0,0  );
    RHYTHM  : (Q,I,Q,I,H,Q,0,0,0  )
    ));

Procedure LYRICS(THE_WORDS : String);
begin
  Writeln(THE_WORDS);
end;

Procedure PLAYNOTE (NOTE, OCT: Integer; DURATION : Real);
begin
  Sound (NOTE * OCT);
  Delay (Round(BEAT * DURATION));
  NoSound;
end;

Procedure PLAYPHRASE(N : Integer; NOTES, OCTAVE : IValues; RHYTHM : RValues);
Var
  INDEX : Integer;
begin
  For INDEX := 1 to N do
    PLAYNOTE (NOTES[INDEX], OCTAVE[INDEX], RHYTHM[INDEX]);
end;

Procedure PLAYSONG (Title : String; Tune : Song);
Var
  Counter : Integer;
begin
  ClrScr;
  GotoXY(11,3);
  Writeln (Title);
  Window (10,5,70,19);
  ClrScr;
  For counter := 1 to TotalLinesInSong do
  begin
    LYRICS(Tune[counter].Lyric);
    PLAYPHRASE(MaxNotesInPhrase, Tune[counter].Notes,
               Tune[counter].Octave, Tune[counter].Rhythm);
  end;
end;

begin
  ClrScr;
  PlaySong('"Row Row Row Your Boat "', RowRow);
end.
