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

UNIT Tones;

{ TONES - a set of functions that provide some
  interesting sonic effects.  Useful for games
  or alerts.                                                                        }

INTERFACE

PROCEDURE Tone(CycleLen,NbrCycles: Integer);
PROCEDURE Noise(D: Longint);
PROCEDURE Chirp(F1,F2,Cycles: Integer);
PROCEDURE Sound2(F: Longint);
PROCEDURE NoSound2;

IMPLEMENTATION

{ Tone - output a tone

  INP:        cyclen - Length (counts) for 1/2 cycle
         numcyc - number of cycles to make  }

PROCEDURE Tone(CycleLen,NbrCycles: Integer);

VAR
        T,I,J : Integer;

BEGIN
   NbrCycles := NbrCycles SHL 1;  {# half Cycles}
        T := Port[$61];                {Port contents}
        FOR I := 1 TO NbrCycles DO
                BEGIN
                  T := T XOR 2;
                  Port[$61] := T;
        FOR J :=1 TO CycleLen DO
      END
END;


{ Noise - make noise for a certain amount of
  counts.

  INP:   D - the number of kilocounts of Noise}

PROCEDURE Noise(D: Longint);
VAR
        Count : Longint;
        T,J,I : Integer;
BEGIN
        T := Port[$61];
        Count := 0;
        WHILE Count < D DO
      BEGIN
         J := (Random(32768) MOD 128) SHL 4;
         FOR I := 1 TO J DO;
         T := T XOR 2;
                   Port[$61] := T;
                        Inc(Count,J)
      END
END;

{ Chirp - create a 'bird Chirp' TYPE Noise

  INP:F1 - # OF counts FOR the starting freq.
                 F2 - # OF counts FOR the ending freq.
  Cycles - # OF Cycles OF each frequency }

PROCEDURE Chirp(F1,F2,Cycles: Integer);
VAR
        I,J,K,L : Integer;
BEGIN
        L := Port[$61];
        Cycles := Cycles * 2;
        I := F1;
        WHILE I <> F2 DO
                BEGIN
                        FOR J := 1 TO Cycles DO
                                BEGIN
                                        L := L XOR 2;
                                        Port[$61] := L;
                                        FOR K := 1 TO I DO
                                END;
                        IF F1 > F2 THEN Dec(I)
                        ELSE Inc(I)
                END
END;

{ Sound2 - Generate a continuous tone using the
  internal timer.

  INP:        F - the desired frequeny }

PROCEDURE Sound2(F: Longint);
VAR
        C : Longint;
BEGIN
        IF F < 19 THEN F := 19;             {Prevent overflow}
        C := 1193180 DIV F;
        Port[$43] := $B6;         {Program new divisor}
        Port[$42] := C MOD 256;   {Rate into the timer}
        Port[$42] := C DIV 256;
        C := Port[$61];         {Enable speaker output}
        Port[$61] := C OR 3     {from the timer       }
END;


{ NoSound2 - turn off the continuous tone               }

PROCEDURE NoSound2;
VAR
        C : Integer;
BEGIN
        C := Port[$61];             {Mask off speaker}
        Port[$61] := C AND $FC      {output from timer}
END;

END.

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