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