[Back to SOUND SWAG index] [Back to Main SWAG index] [Original]
(*
===========================================================================
BBS: Canada Remote Systems
Date: 09-02-93 (00:16) Number: 36877
From: CATHY NICOLOFF Refer#: NONE
To: ALL Recvd: NO
Subj: Musical Notes!!! 1/2 Conf: (1221) F-PASCAL
---------------------------------------------------------------------------
Here's some help for all you programmers out there! It's straight from
my personal programming library!
SBNotes : Array[1..12] Of Byte =
($AE, $6B, $81, $98, $B0, $CA, $E5, $02, $20, $41, $63, $87);
SBOctaves : Array[1..84] Of Byte =
($22, $25, $25, $25, $25, $25, $25, $26, $26, $26, $26, $26,
$26, $29, $29, $29, $29, $29, $29, $2A, $2A, $2A, $2A, $2A,
$2A, $2D, $2D, $2D, $2D, $2D, $2D, $2E, $2E, $2E, $2E, $2E,
$2E, $31, $31, $31, $31, $31, $31, $32, $32, $32, $32, $32,
$32, $35, $35, $35, $35, $35, $35, $36, $36, $36, $36, $36,
$36, $39, $39, $39, $39, $39, $39, $3A, $3A, $3A, $3A, $3A,
$3A, $3D, $3D, $3D, $3D, $3D, $3D, $3E, $3E, $3E, $3E, $3E);
Notes : Array[1..84] Of Word =
{ C C#,D- D D#,E- E F F#,G- G G#,A- A A#,B- B }
(0065, 0070, 0073, 0078, 0082, 0087, 0093, 0098, 0104, 0110, 0117, 0123,
0131, 0139, 0147, 0156, 0165, 0175, 0185, 0196, 0208, 0220, 0233, 0247,
0262, 0277, 0294, 0311, 0330, 0349, 0370, 0392, 0415, 0440, 0466, 0494,
0523, 0554, 0587, 0622, 0659, 0698, 0740, 0784, 0831, 0880, 0932, 0987,
1047, 1109, 1175, 1245, 1329, 1397, 1480, 1568, 1661, 1760, 1865, 1976,
2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 3520, 3729, 3951,
4186, 4435, 4699, 4978, 5274, 5588, 5920, 6272, 6645, 7040, 7459, 7902);
Explanation : This is used to emulate single note music (IE-ANSI music).
The array NOTES is the frequencies used to do a SOUND/NOSOUND on the PC
speaker.
The SBNOTES and SBOCTAVES arrays are the hex values of the notes, and
their octaves for any ADLIB compatible card.
Just take which note you want, and input the note AND the octave
into the Adlib port. Here's some sample code to show you how :
*)
Unit Music;
Interface
Uses Crt;
CONST
SBNotes : Array[1..12] Of Byte =
($AE, $6B, $81, $98, $B0, $CA, $E5, $02, $20, $41, $63, $87);
SBOctaves : Array[1..84] Of Byte =
($22, $25, $25, $25, $25, $25, $25, $26, $26, $26, $26, $26,
$26, $29, $29, $29, $29, $29, $29, $2A, $2A, $2A, $2A, $2A,
$2A, $2D, $2D, $2D, $2D, $2D, $2D, $2E, $2E, $2E, $2E, $2E,
$2E, $31, $31, $31, $31, $31, $31, $32, $32, $32, $32, $32,
$32, $35, $35, $35, $35, $35, $35, $36, $36, $36, $36, $36,
$36, $39, $39, $39, $39, $39, $39, $3A, $3A, $3A, $3A, $3A,
$3A, $3D, $3D, $3D, $3D, $3D, $3D, $3E, $3E, $3E, $3E, $3E);
Notes : Array[1..84] Of Word =
{ C C#,D- D D#,E- E F F#,G- G G#,A- A A#,B- B }
(0065, 0070, 0073, 0078, 0082, 0087, 0093, 0098, 0104, 0110, 0117, 0123,
0131, 0139, 0147, 0156, 0165, 0175, 0185, 0196, 0208, 0220, 0233, 0247,
0262, 0277, 0294, 0311, 0330, 0349, 0370, 0392, 0415, 0440, 0466, 0494,
0523, 0554, 0587, 0622, 0659, 0698, 0740, 0784, 0831, 0880, 0932, 0987,
1047, 1109, 1175, 1245, 1329, 1397, 1480, 1568, 1661, 1760, 1865, 1976,
2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 3520, 3729, 3951,
4186, 4435, 4699, 4978, 5274, 5588, 5920, 6272, 6645, 7040, 7459, 7902);
Procedure Play_SB(N, M : Byte);
Procedure Init_SB;
Procedure Reset_SB;
Function Detect_SB : Boolean;
Implementation
(***********************)
Procedure Play_SB(N, M : Byte);
Var Loop : Integer;
Temp : Integer;
Begin
Port[$0388] := N;
For Loop := 1 To 6 Do
Temp := Port[$0388];
Port[$0389] := M;
For Loop:=1 To 35 Do
Temp := Port[$0388];
End;
(***********************)
Procedure Init_SB;
Var
A : Integer;
Begin
For A := 1 to 244 Do
Play_SB(A,$00);
Play_SB($01,32);
Play_SB($B0,$11);
Play_SB($04,$60);
Play_SB($04,$80);
End;
(***********************)
Procedure Reset_SB;
Begin
Play_SB($20,$41);
Play_SB($40,$10);
Play_SB($60,$F0);
Play_SB($80,$77);
Play_SB($23,$41);
Play_SB($43,$00);
Play_SB($63,$F0);
Play_SB($83,$77);
Play_SB($BD,$10);
End;
(***********************)
Function Detect_SB : Boolean;
Var
Dummy1,
Dummy2 : Byte;
Begin
Play_SB($04,$60);
Play_SB($04,$80);
Dummy1 := Port[$388];
Play_SB($02,$FF);
Play_SB($04,$21);
Delay(8);
Dummy2 := Port[$388];
Play_SB($04,$60);
Play_SB($04,$80);
If ((Dummy1 AND $E0) = $00) And ((Dummy2 AND $E0) = $C0) Then
Detect_SB := True
Else
Detect_SB := False;
End;
(***********************)
End.
That is my own soundblaster unit I use to output.
To play note 'C' at octave 3, do the following :
Play_SB($A0, SBNotes[1]);
Play_SB($B0, SBOctaves[1 + 3 * 12]);
To shut off Adlib output, do this :
Play_SB($83, $FF);
Play_SB($B0, $11);
{ TEST PROGRAM }
Uses DOS,Crt,Music;
VAR I : BYTE;
BEGIN
Init_SB;
Reset_SB;
FOR I := 1 To 8 DO
BEGIN
Play_SB($A0, SBNotes[i]);
Play_SB($B0, SBOctaves[i + 3 * 12]);
DELAY(500);
END;
Init_SB;
Reset_SB;
END.
[Back to SOUND SWAG index] [Back to Main SWAG index] [Original]