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

    {
    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.

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