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

    { SBTS.PAS -- Sound Blaster Text To Speech Interface for Turbo Pascal 6.0 }

    Unit SBTS;

    Interface

    {$IFNDEF VER60 }
       ** Needs Version 6.0 of Turbo Pascal to compile **
    {$ENDIF }

    {                                  SBTS.PAS

          This unit provides an interface to the SBTALKER (TM) Text-to-Speech
          driver.

          USAGE NOTES:
           1.  Make sure you have made SBTALKER resident, prior to running your
               application.  Call from the DOS command line:
                  SBTALKER /DBLASTER

               SBTALKER.EXE and BLASTER.DRV are found on the diskettes that
               came with the Sound Blaster.
           2.  Due to the fact that this unit relies on the built-in assembler,
               you'll need Turbo Pascal, version 6.0 or later to recompile.
           3.  IMPORTANT:  Don't attempt to run an application within the
               Turbo Pascal Integrated Development Environment.  Do not launch
               it inside a software-debugger either!  It'll HANG your system.
               RUN it from the DOS command line.

           Written by Wilbert van Leijen, Amsterdam 1991.
           Released with source code and all to the Public Domain on an
           AS-IS basis.  The author assumes NO liability; you use this at your
           risk.

    }
    Type
      SpeechType   = Record                { SBTALKER configuration record }
                       talk,
                       phoneme     : String;
                       gender,
                       tone,
                       volume,
                       pitch,
                       speed       : Integer;
                     end;
    Const
      TalkerReady  : Boolean = False;      { Flag indicating SBTALKER status }

    Var
      TalkPtr      : Pointer;              { Pointer to the resident driver }
      SpeechRec    : ^SpeechType;          { Pointer to the configuration record }

    Procedure Say(talk : String);
    Procedure Settings(gender, tone, volume, pitch, speed : Integer); Function
    UnloadDriver : Boolean;

    Implementation

    {$R-,S- }

    { Talk to me }

    Procedure Say(talk : String); Assembler;

    ASM
            CMP    [TalkerReady], False
            JE     @1
            LES    DI, [SpeechRec]
            PUSH   DS
            LDS    SI, talk
            CLD
            LODSB
            STOSB
            XOR    CH, CH
            MOV    CL, AL
            REP    MOVSB
            POP    DS
            MOV    AL, 7
            CALL   [TalkPtr]
    @1:
    end;  { Say }

    { Alter the settings of the SBTALKER driver }

    Procedure Settings(gender, tone, volume, pitch, speed : Integer); Assembler;

    ASM
            CMP    [TalkerReady], False
            JE     @1
            LES    DI, [SpeechRec]
            CLD
            ADD    DI, SpeechType.gender
            MOV    AX, gender
            STOSW
            MOV    AX, tone
            STOSW
            MOV    AX, volume
            STOSW
            MOV    AX, pitch
            STOSW
            MOV    AX, speed
            STOSW
            MOV    AL, 2
            CALL   [TalkPtr]
    @1:
    end;  { Settings }

    { Unload the SBTALKER driver.  Returns True is successful }

    Function UnloadDriver : Boolean; Assembler;

    ASM
            MOV    AX, False
            CMP    [TalkerReady], False
            JE     @1
            MOV    AX, 0FBFFh
            INT    2Fh
    @1:
    end;  { UnloadDriver }

    Begin  { SBTS }
    ASM

      { Get the vector to multiplex interrupt 2Fh.  Assume it belongs to SBTALKER }

            MOV    AX, 352Fh
            INT    21h
            MOV    AX, ES
            OR     AX, AX
            JZ     @1

      { Pass the magic number to the handler }

            MOV    AX, 0FBFBh
            INT    2Fh

      { Driver responds if the return code is non zero }

            OR     AX, AX
            JNE    @1

      { Retrieve the pointers to the SBTALKER driver and its configuration record }

            MOV    AX, ES:[BX+4]
            MOV    DX, ES:[BX+6]
            MOV    Word Ptr [TalkPtr], AX
            MOV    Word Ptr [TalkPtr+2], DX
            ADD    BX, 20h
            MOV    Word Ptr [SpeechRec], BX
            MOV    Word Ptr [SpeechRec+2], DX

      { Put the default values for gender, tone etc. into this record }

            LES    DI, [SpeechRec]
            ADD    DI, SpeechType.gender
            CLD
            SUB    AX, AX
            STOSW                          { gender = male }
            STOSW                          { tone   = bass }
            MOV    AX, 5
            STOSW                          { volume = 5 }
            STOSW                          { pitch  = 5 }
            STOSW                          { speed  = 5 }
            MOV    AL, 2
            CALL   [TalkPtr]
            MOV    [TalkerReady], True
    @1:
    end;
    end.  { SBTS }

    Sample call:  Say('hello world!');

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