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

{
Sasha Case,

12-Apr-94 20:07, Sasha Case wrote to All
               Subject: SBTALKER
              Terminate 1.40 REGISTERED


 SC> @MSGID: 3:711/929@fidonet 72328398
 SC> @REGEED: 1.02u2 00910093
 SC> Hi Everyone,
 SC> 
 SC> I've tried once, a coupla months ago, but I'll try again:
 SC> 
 SC> I'm look for anyone with a Sound Blaster SDK or anyone who knows/has 
 SC> source for 
 SC> how to access SBTALKER that comes with soundblaster.  Programs like 
 SC> SBTALKER 
 SC> and READ do it, and I have seen source for something that did what I
 SC> needed,
 SC> except it used a library I haven't got.  Any help on Units that do this
 SC> or

Here you go!
}

Unit SBTS;

Interface

{     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.

       SBTALKER is a registred trade mark of First Byte, Inc. }

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.
  Gender: 0 is male, 1 is female;
  Tone:   0 is bass, 1 is treble;
  Volume, pitch and speed must be within the range 0..9.   }

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 }


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