[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]