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

{
                         -- Adlib Unit  --
 
                         1995 - CJ Cliffe
               Programmer's Reference BBS - 382-8503
 
        Note --  This Unit is not an EXACT Sound() emulation,
         Sound(); is emulated as close as possible, and will
                  sound remarkably like Sound();
 
 
               This file is most welcome in SWAG!!  ;->
 
               The  _SB functions are by Cathy Nicoloff       }
 
       {------------------------------------------------------}
       {--                  }Unit ADLIB;{                   --}
       {------------------------------------------------------}
       {--                   }Interface{                    --}
       {------------------------------------------------------}
 
Uses Crt;
 
Procedure Play_SB(N, M : Byte);
Procedure Init_SB;
Procedure Reset_SB;
Function  Detect_SB : Boolean;
 
Procedure ADLSound(Hz: Longint);
Procedure AdlNoSound;
 
Var Inited : Boolean;
 
Implementation
 
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 Integer =
    { 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);
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;
(*********My Stuff Starts here***********)
Procedure ADLSound(Hz: Longint);
Var  Noteval,Notecomp: LongInt;
Begin
  If Not Inited then begin         { If Adlib is still Deinited, Init it! }
   Init_SB;                        { Inits the Adlib  }
  Reset_SB;                        { Clears the Adlib }
   Inited := True;                 { Stops from Re-Initing more than once }
  End;
  For Noteval := 1 to 84 do Begin                 { Find the closest note }
    Notecomp := Noteval;                   {  Keep a copy for the Octaves }
      If Hz < Notes[Noteval] then begin              { Found that's close }
        {^^^^^^^^^^^^^^^^^^^  If it doesn't make sense, just take my word }
                                                  {       for it..        }
          While Noteval > 12 do dec(Noteval,12);  { Decrease it to a Note }
          Play_SB($A0,   SBnotes[Noteval]  );     {   Output Note value   }
          Play_SB($B0, Sboctaves[Notecomp] );     {  Tell it what octave  }
          Exit;                                   { Quit the NOTEVAL loop }
      End;
   End;
End;
 
Procedure AdlNoSound;  { Not good for loops !! }
Begin
  Init_Sb;
  Reset_Sb;
End;


Begin
Inited := False;
End.

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