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

    {
    Hello.  I am developing a text-to-speech synthesizer for IBM-
    compatible computers.  The system will support sound output
    through the SoundBlaster-DAC, an LPT-port DAC, or the PC speaker
    if no other device is available.  One of its goals is to provide
    an _INEXPENSIVE_ speech option for visually-impaired computer
    users.

    Could someone please examine the following code and make
    comments/suggestions on it?  It takes an eight-bit sample byte
    and outputs it on the speaker.  The speaker I/O port address is
    configurable, for the internal squeaker or an external speaker
    device on a serial or parallel port.
    }
    Procedure Play_Eight_Bits (SoundByte, BitShift  : Byte;
    Spkr  : Word);  Assembler;
    CONST
       OffMask = 253;
       DataMask = 128;

    ASM
       Push     AX
       Push     BX
       Push     CX
       Push     DX
       MOV     AH, SoundByte
       MOV     BL, BitCount
       MOV     CL, BitShift
       MOV     DX, Spkr     (* Speaker I/O port address *)
       And     AH, DataMask

       @SpeakerPoll:  In     AL, DX     (* Input from speaker port *)
       And     AL, OffMask
       Or     AL, AH     (* Set up byte to output *)
       Out     DX, AL     (* Send to speaker *)
       SHR     AH, CL     (* Position next bit *)
       SUB     BL, CL     (* Are we done with this byte? *)
       JNz     @SpeakerPoll     (* No, poll speaker again *)
       Pop     DX
       Pop     CX
       Pop     BX
       Pop     AX
    End;     (* Play_Eight_Bits *)
    {--------
    Here's a straight Pascal way of polling the speaker and sending a
    byte:
    }
    Procedure Play_Eight_Bits (SoundByte  : Byte;  Spkr  : Word);
    CONST
       OffMask = 253;
       DataMask = 128;

    Begin
       Port[Spkr] := (Port[Spkr] and OffMask)
       Or ((SoundByte and DataMask) shr 6);
       (* I am not sure why 6 is the magic number to shift by. *)
    End;     (* Play_Eight_Bits *)
    {
    Using the assembler procedure, I have achieved _TWO_ volume
    levels through the speaker: the first barely audible, the second
    quite adequate (at least on my speaker).  A BitShift value of 1
    results in the very low volume, and a shift value of 2 produces
    the higher volume; anything higher produces either silence or
    unintelligible squeaks.

    Are there more effective [i.e] higher sound quality, methods of
    playing eight-bit samples on the speaker, short of using the
    driver built into Windows?  I've developed my playback routines
    on my 286 under DOS 5.  Being blind, I cannot use the GUI
    environment of windows with my text-based screen reader software,
    so I plan to keep working on my synthesizer project under DOS,
    until I can invest in a 486 machine.

    I would greatly appreciate any hints/suggestions concerning the
    above-listed playback procedure.  Thanks in advance.
    }

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