home *** CD-ROM | disk | FTP | other *** search
- (****************************************************************************)
- (* INITIALIZE MUSIC VARIABLES *)
- (****************************************************************************)
- procedure
- initialize_music;
- var
- j,k : integer;
- begin
-
- { Frequencies for Octave 4. }
- scale[ 0 ] := 1661.220; { A }
- scale[ 1 ] := 1760.000;
- scale[ 2 ] := 1864.640;
- scale[ 3 ] := 1864.640; { B }
- scale[ 4 ] := 1975.540;
- scale[ 5 ] := 1975.540;
- scale[ 6 ] := 987.770; { C }
- scale[ 7 ] := 1046.500;
- scale[ 8 ] := 1108.740;
- scale[ 9 ] := 1108.740; { D }
- scale[ 10 ] := 1174.700;
- scale[ 11 ] := 1244.500;
- scale[ 12 ] := 1244.500; { E }
- scale[ 13 ] := 1318.500;
- scale[ 14 ] := 1318.500;
- scale[ 15 ] := 1318.500; { F }
- scale[ 16 ] := 1396.900;
- scale[ 17 ] := 1479.980;
- scale[ 18 ] := 1479.980; { G }
- scale[ 19 ] := 1568.000;
- scale[ 20 ] := 1661.224;
-
- factor[ 0 ] := 0.0625;
- factor[ 1 ] := 0.1250;
- factor[ 2 ] := 0.2500;
- factor[ 3 ] := 0.5000;
- factor[ 4 ] := 1.0000;
- factor[ 5 ] := 2.0000;
- factor[ 6 ] := 4.0000;
-
- notes[ 49 ] := 1047;
- notes[ 50 ] := 1109;
- notes[ 51 ] := 1175;
- notes[ 52 ] := 1245;
- notes[ 53 ] := 1319;
- notes[ 54 ] := 1397;
- notes[ 55 ] := 1480;
- notes[ 56 ] := 1568;
- notes[ 57 ] := 1661;
- notes[ 58 ] := 1760;
- notes[ 59 ] := 1865;
- notes[ 60 ] := 1976;
- k := 48;
- while k > 0 do begin
- notes[ k ] := notes[ k+12 ] div 2;
- k := pred(k);
- end;
- k := 61;
- while k < 85 do begin
- notes[ k ] := notes[ k-12 ] * 2;
- k := succ(k);
- end;
-
- dnote[ 0 ] := 1.0;
- dnote[ 1 ] := 1.5;
- dnote[ 2 ] := 1.75;
- dnote[ 3 ] := 1.875;
- dnote[ 4 ] := 1.9375;
- dnote[ 5 ] := 1.96875;
- dnote[ 6 ] := 1.984375;
-
- tempo := 120.0;
- music_mode := 0.875;
- rest_mode := 0.125;
- octave := 4;
- note_length := 4;
- end;
-
- procedure
- play_note( note,length,dcnt : integer );
- var
- dur : real;
- begin
- dur := 240.0 / tempo * a_second / length * dnote[dcnt] - 3.0;
- if note > 100 then
- sound( notes[ note - 100 ] )
- else
- if note <= 20 then
- sound( round( scale[ note ] * factor[ octave ] ) )
- else
- nosound;
- delay( round(dur * music_mode) );
- if rest_mode > 0.09 then begin
- nosound;
- delay( round(dur * rest_mode) );
- end;
- end;
-
- function
- mval( s : strtype; var i : integer ) : integer;
- var
- v : integer;
- begin
- v:=0;
- i:=succ(i);
- while s[i] in [ '0'..'9' ] do begin
- v:= ( v * 10 ) + ord(s[i]) - ord('0');
- i:=succ(i);
- end;
- mval:=v;
- end;
-
- procedure
- play( ms : strtype );
- var
- i : integer;
- l : integer;
- n : integer;
- begin
- if silent_mode then exit;
- i := 1;
- while i < length( ms ) do begin
- if ms[i] in [ 'A'..'G','P' ] then begin
- n := ( ( ord(ms[i]) - ord('A') ) * 3 ) + 1;
- case ms[succ(i)] of
- '#','+' : begin
- i:=succ(i);
- n:=succ(n);
- end;
- '-' : begin
- i:=succ(i);
- n:=pred(n);
- end;
- end;
- l:=mval( ms,i );
- if l=0 then l:=note_length;
- dots:=0;
- while ms[i]='.' do begin
- i:=succ(i);
- dots:=succ(dots);
- end;
- play_note(n,l,dots);
- end
- else begin
- case ms[i] of
- 'T' : begin
- tempo:=mval( ms,i );
- if tempo<32 then tempo:=32;
- if tempo>255 then tempo:=255;
- end;
- 'O' : begin
- octave:=mval( ms,i );
- if octave>6 then octave:=6;
- end;
- '>' : begin
- if octave < 6 then octave := succ(octave);
- i:=succ(i);
- end;
- '<' : begin
- if octave > 0 then octave := pred(octave);
- i:=succ(i);
- end;
- 'L' : begin
- note_length:=mval( ms,i );
- if note_length=0 then note_length:=4;
- end;
- 'N' : begin
- n:=mval( ms,i )+100;
- if n>184 then n:=184;
- dots:=0;
- while ms[i]='.' do begin
- i:=succ(i);
- dots:=succ(dots);
- end;
- play_note(n,note_length,dots);
- end;
- 'M' : begin
- i:=succ(i);
- case ms[i] of
- 'N' : begin
- music_mode := 0.875;
- rest_mode := 0.125;
- end;
- 'L' : begin
- music_mode := 1.0;
- rest_mode := 0.0;
- end;
- 'S' : begin
- music_mode := 0.75;
- rest_mode := 0.25;
- end;
- end;
- i:=succ(i);
- end;
- else
- i:=succ(i);
- end;
- end;
- end;
- nosound;
- end;