home *** CD-ROM | disk | FTP | other *** search
/ Carousel / CAROUSEL.cdr / mactosh / code / asm_spee.sit < prev    next >
Text File  |  1988-05-14  |  35KB  |  954 lines

  1. 11-May-88 21:59:58-MDT,35873;000000000000
  2. Return-Path: <u-lchoqu%sunset@cs.utah.edu>
  3. Received: from cs.utah.edu by SIMTEL20.ARPA with TCP; Wed, 11 May 88 21:59:13 MDT
  4. Received: by cs.utah.edu (5.54/utah-2.0-cs)
  5.     id AA04113; Wed, 11 May 88 21:27:55 MDT
  6. Received: by sunset.utah.edu (5.54/utah-2.0-leaf)
  7.     id AA29313; Wed, 11 May 88 21:27:51 MDT
  8. Date: Wed, 11 May 88 21:27:51 MDT
  9. From: u-lchoqu%sunset@cs.utah.edu (Lee Choquette)
  10. Message-Id: <8805120327.AA29313@sunset.utah.edu>
  11. To: rthum@simtel20.arpa
  12. Subject: SpeechLib.asm.shar
  13.  
  14. #! /bin/sh
  15. #
  16. # This is a shell archive.  Save this into a file, edit it
  17. # and delete all lines above this comment.  Then give this
  18. # file to sh by executing the command "sh file".  The files
  19. # will be extracted into the current directory owned by
  20. # you with default permissions.
  21. #
  22. # The files contained herein are:
  23. #
  24. #   11 SpeechLib.doc
  25. #   19 SpeechLib.asm
  26. #    1 LibInit.asm
  27. #    2 SpeechLib.r
  28. #
  29. echo 'Extracting SpeechLib.doc'
  30. if test -f SpeechLib.doc; then echo 'shar: will not overwrite SpeechLib.doc'; else
  31. sed 's/^X//' << '________This_Is_The_END________' > SpeechLib.doc
  32. XSpeechLib 3.0 : a Microsoft BASIC Library
  33. Xfor accessing MacinTalk
  34. X
  35. XProgram by: Kevin J. Willey
  36. XMacDisk Librarian for Apple-Dayton (c)
  37. X
  38. X
  39. X    SpeechLib is a Microsoft BASIC Library routine developed with
  40. Xthe Macintosh 68000 Development System.  It was written using the
  41. Xguidelines in the Microsoft publication, "Microsoft BASIC for the
  42. XMacintosh - Building Machine Language Libraries".  SpeechLib is used in
  43. Xconjunction with MacinTalk, the software speech synthesis resource
  44. Xdeveloped by Apple Computer.
  45. X
  46. X
  47. X    These are the icons for MacinTalk and SpeechLib.  Both of these
  48. Xresources must be accessible by the Microsoft BASIC Interpreter in order
  49. Xto use the speech synthesis capabilities of MacinTalk from within
  50. XBASIC.  (Only BASIC versions 2.0 and higher are supported by SpeechLib.)
  51. X
  52. X
  53. XUSING SPEECHLIB:
  54. X
  55. X    The Library routine has to be initialized before it can be
  56. Xaccessed.  Therefore, the following line should appear in your program
  57. Xbefore any speech calls:
  58. X
  59. X    LIBRARY "[Volume:]SpeechLib"    
  60. X
  61. Xthe Volume name must be used if SpeechLib is on a disk other than the
  62. Xdisk containing Microsoft BASIC.
  63. X
  64. X    If BASIC cannot free enough memory to initialize the library, an
  65. X"illegal function call" error will be generated.  Try changing the
  66. Xamount of memory allocated to the heap with the CLEAR command if this
  67. Xhappens.  (The CLEAR command is documented on page 109 of the BASIC
  68. Xmanual, also check the memory management section beginning on page 71.)
  69. X
  70. X    Once BASIC has successfully opened the library, the SpeechLib
  71. Xroutines can be used to access MacinTalk.  SpeechLib 3.0 fully supports
  72. Xall the existing capabilities of MacinTalk plus providing several other
  73. Xfunctions to make programming easier.
  74. X
  75. X
  76. XSpeechLib Routines:
  77. X
  78. X    The SpeechLib library is the interface between your BASIC
  79. Xprogram and MacinTalk.  The following BASIC commands will initiate
  80. Xvarious SpeechLib routines which will then access MacinTalk:
  81. X
  82. X* CALL Speech (1[,"Exception File"] )
  83. X    Loads the speech driver.  The "Exception File" parameter
  84. Xspecifies an exception file created with the exception file editor
  85. Xdistributed by Apple in the May software supplement.  If the "Exception
  86. XFile" parameter is omitted, MacinTalk will use its default English input
  87. Xpronunciation rules.  If "noReader" is used as the exception file
  88. Xparameter, MacinTalk will be limited to phonetic code input.  
  89. X
  90. X* CALL Speech (2,"String to be spoken")
  91. X    The default mode is English input, where the English text in
  92. X"String to be spoken" is converted into a phoneme string which is then
  93. Xpassed to MacinTalk for pronunciation.  If direct Phonetic input was
  94. Xspecified by using 'noReader' as the exception file (see above), then
  95. X"String to be spoken" must be a phoneme string to be passed directly to
  96. XMacinTalk.
  97. X
  98. X* CALL Speech (3)
  99. X    Closes the speech driver.  It is important that this call be
  100. Xissued before ending your program, since it deallocates locked blocks of
  101. Xmemory.
  102. X
  103. X* CALL Speech (4, RATE)    ;(85 <= RATE <= 425)
  104. X    Controls the number of words spoken per minute.  The allowable
  105. Xrange is from 85 to 425 words/minute.
  106. X
  107. X* CALL Speech (5, PITCH)    ;(65 <= PITCH <= 500)
  108. X    Sets the baseline pitch in hertz for the speech waveform.  The
  109. Xbaseline pitch is constrained to lie between 65 and 500 Hz.
  110. X
  111. X* CALL Speech (6,MODE)    ;(0: Natural Voice   1: Robotic Voice)
  112. X    Sets the "MODE" with which the speech will be generated.  The mode can be either 0 for "Natural" speech or 1 for "Robotic" voice.
  113. X
  114. X* CALL Speech (7,SEX)*    ;(reserved for future use by Apple)
  115. X
  116. X* CALL Speech (8,LANGUAGE)*    ;(reserved for future use by Apple)
  117. X
  118. X* CALL Speech (9)
  119. X    Resets all the Speech parameters to their default values.
  120. X    {RATE:150  PITCH:110  MODE:Natural  SEX:Male}
  121. X
  122. X* CALL Speech (10,"Text for Translation",Phoneme$)
  123. X    This can only be used if English input is in effect.  "Text for Translation" is an English string.  Phoneme$ is a string variable which will contain the translated phoneme codes upon return.
  124. X
  125. X* CALL Speech (11)
  126. X    Provides spoken information about SpeechLib.
  127. X
  128. X
  129. X*  These two routines are reserved by Apple for future use within
  130. XMacinTalk.  They will not be functional until Apple "fleshes them out"
  131. Xin a future version of MacinTalk.
  132. X
  133. XPhonetic Input:
  134. X    The MacinTalk driver produces speech from phonetic codes.
  135. XMacinTalk can translate English input into phonetic codes, but errors in
  136. Xtranslation cause the nuances of speech to become lost.  Optimal use of
  137. XMacinTalk for fine tuning of speech is achieved by direct phonetic code
  138. Xinput.  To fully understand the direct phonetic input capabilities, the
  139. Xuser should be familiar with the MacinTalk v1.1 manual from Apple
  140. XComputer.   This reproduction of the MacinTalk Phoneme Table is included
  141. Xfor quick reference.
  142. X
  143. X
  144. X    MACINTALK PHONEME TABLE
  145. X    =============================
  146. X            VOWELS
  147. X    ---------------------------
  148. X    IY    bEEt      IH    bIt
  149. X    EH    bEt       AE    bAt
  150. X    AA    hOt       AH    Under
  151. X    AO    tAlk      UH    lOOk
  152. X    ER    bIRd      OH    bOrder
  153. X    AX    About     IX    solId
  154. X    AX and IX should never be used in stressed syllables
  155. X
  156. X            DIPHTHONGS
  157. X    ---------------------------
  158. X    EY    mAde      AY    hIde
  159. X    OY    bOIl      AW    pOWer
  160. X    OW    lOW       UW    crEW
  161. X
  162. X            CONSONANTS
  163. X    ---------------------------
  164. X    R    Red        L    yeLLow
  165. X    W    aWay       Y    Yellow
  166. X    M    Men        N    meN
  167. X    NX   siNG
  168. X    S    Sail       SH   ruSH
  169. X    F    Fed        TH   THin
  170. X    Z    haS        ZH   pleaSure
  171. X    V    Very       DH   THen
  172. X    CH   CHeck      J    JuDGe
  173. X    /H   Hole       /C   loCH
  174. X    B    But        P    Put
  175. X    D    Dog        T    Toy
  176. X    G    Guest      K    Camp
  177. X
  178. X        SPECIAL  SYMBOLS
  179. X    ---------------------------
  180. X    DX      piTy        (tongue flap)  
  181. X    Q       kitt_en     (glottal stop)
  182. X    RX      caR         (postvocalic R and L)
  183. X    LX      caLL
  184. X    QX                  silent vowel
  185. X
  186. X    UL  =   AXL     IL  =   IXL     (contractions,  see text) 
  187. X    UM  =   AXM     IM  =   IXM
  188. X    UN  =   AXN     IN  =   IXN
  189. X
  190. X
  191. X         Stress marks
  192. X    --------------------------
  193. X    Nouns               5
  194. X    Pronouns            2
  195. X    Verbs               4
  196. X    Adjectives          5
  197. X    Adverbs             7
  198. X    Quantifiers         7
  199. X    Exclamations        9
  200. X    Articles            0   (no stress)
  201. X    Prepositions        0
  202. X    Conjunctions        0
  203. X    Secondary stress    1, 2
  204. X
  205. X    Punctuation
  206. X    ---------------------------
  207. X    .       sentence terminator
  208. X    ?       sentence terminator
  209. X    -       phrase delimiter
  210. X    ,       clause delimiter
  211. X    (   )   noun phrase delimiters
  212. X
  213. X
  214. XHints for usage:
  215. X
  216. X* The Speech 1 and Speech 3 calls must be paired in order for your
  217. Xprogram to function correctly.  Before any speech commands can be
  218. Xissued, Speech 1 must be called and once speech is done, Speech 3 should
  219. Xbe called to remove the code segments from memory.
  220. X
  221. X-    If speech is used consistently throughout your program ,the
  222. Xspeech driver should be installed  (Speech 1) at the beginning of the
  223. Xprogram and closed (Speech 3) only at the end.  (The speech driver must
  224. Xfind an available block of memory each time it is installed.  If the
  225. Xheap becomes fragmented between installations of the speech driver, its
  226. Xpossible that  loading will fail.)
  227. X
  228. X-    If speech is used only in widely separated and selective parts
  229. Xof the program, then Speech 1 and Speech 3 calls should be used locally
  230. Xthose areas.  (The speech driver takes up memory and remains resident
  231. Xuntil closed.)
  232. X
  233. X* Both constants and variables can be used as arguments to the speech
  234. Xroutines.  This leaves the programming options wide open:
  235. X
  236. X       CALL Speech 2, (TextArray(2) + Name$)
  237. X       etc...
  238. X
  239. X* SpeechLib is written to accept any numeric size/type (e.g. single or
  240. Xdouble precision) as the input for the speech parameters.  The library
  241. Xwill take care of converting the number to an integer for internal use.
  242. X
  243. X* The use of a DEFINT statement has some side effects which must be
  244. Xtaken into account:
  245. X
  246. XIf DEFINT a-z is used at the beginning of the program, you must remember to specify a larger numeric variable type for the library routine name, otherwise the program will crash.  (BASIC stores the address of the machine language routine in a variable with the same name as the library routine.  An integer variable can't hold a complete 32 bit address so the address is invalid.)
  247. X
  248. X    DEFINT A-Z
  249. X    Init=1
  250. X    Call Speech# (Init)
  251. X
  252. X* English conversion should only be used when the string to be spoken is
  253. Xnot known in advance (e.g. keyboard input).  Direct phonetic input
  254. Xshould be used as much as possible to insure maximum listener
  255. Xrecognition.
  256. X
  257. X* In those instances when English input and translation is used, two
  258. Xmethods are available to correct mispronunciation.  A MacinTalk
  259. Xexception file can be created with the exception file editor from Apple
  260. Xor the English spelling can be adjusted to more accurately reflect the
  261. Xpronunciation. (e.g. "Willey" becomes "Why lee")
  262. X
  263. X* To aid program readability and ease of programming, I recommend the following opening program assignments:
  264. X
  265. X    Init=1: Say=2: Quit=3: Rate=4: Pitch=5: 
  266. X    Mode=6: Defaults=9: Translate=10: Info=11: 
  267. X    Natural=0: Robotic=1
  268. X
  269. X* Using these assignments and the implied CALL structure (see the
  270. X"SpeechLib" device.CALL statement in the BASIC manual for more
  271. Xinformation), you can access speech in a very straightforward manner:
  272. X
  273. X    LIBRARY "SpeechLib"    this opens up SpeechLib for BASIC access
  274. X
  275. X    A$="Translate This"    a variable assignment for a string
  276. X
  277. X    Speech Init,"NewRulz"    initialize speech with the exception
  278. X                file "NewRulz"
  279. X
  280. X    Speech Info        pronounces a 'canned' informational
  281. X                announcement
  282. X
  283. X    Speech Rate,100        sets the speaking rate to 100 words/minute
  284. X
  285. X    Speech Pitch,245    sets the speaking pitch to 245 hz.
  286. X
  287. X    Speech Mode,Robotic    sets the speaking mode to Robotic
  288. X
  289. X    Speech Say,"Hello"    pronounces the word 'Hello'
  290. X
  291. X    Speech Defaults        resets all the speech parameters to
  292. X                their default values (RATE:150  PITCH:110
  293. X                MODE:Natural)
  294. X
  295. X    Speech Say,A$        says the English string stored in A$
  296. X
  297. X    Speech Translate A$,B$    takes the English string in A$ and
  298. X                returns the Phonetic string in B$
  299. X
  300. X    Speech Quit        closes the speech driver
  301. X
  302. X    LIBRARY CLOSE        closes the link between BASIC and all
  303. X                libraries
  304. X
  305. X
  306. XIf you have any questions, problems or comments, please contact me:
  307. X    Kevin J. Willey                       home phone: (513) 426-2329
  308. X    4453 Stonecastle Dr. #1102
  309. X    Dayton, OH 45440
  310. X
  311. X    DELPHI : KWILLEY
  312. X    GEnie : K.WILLEY
  313. X
  314. X    This project would never have been completed were it not for the
  315. Xsupport and direct help of Jim Hopper and the entire Apple-Dayton User's
  316. XGroup in Dayton, Ohio.  If you plan on using SpeechLib in a commercial
  317. Xventure please contact me first.  If any of you are feeling generous,
  318. Xyou can send me what you think this is worth, a few bucks, a blank disk,
  319. Xsome of your source code, or just a few comments.  I promise in return
  320. Xto make every effort to support all worthwhile suggestions which come to
  321. Xmy attention.  Future efforts will be directed at the adaptation of the
  322. XSpeechLib interface into the BASIC "virtual device" format.  The PRINT#
  323. Xcommand could then be redirected to the 
  324. ________This_Is_The_END________
  325. if test `wc -l < SpeechLib.doc` -ne 292; then
  326.     echo 'shar: SpeechLib.doc was damaged during transit'
  327.   echo '      (should have been 292 bytes)'
  328. fi
  329. fi        ; : end of overwriting check
  330. echo 'Extracting SpeechLib.asm'
  331. if test -f SpeechLib.asm; then echo 'shar: will not overwrite SpeechLib.asm'; else
  332. sed 's/^X//' << '________This_Is_The_END________' > SpeechLib.asm
  333. X;This is the source code for SpeechLib, a machine language library
  334. X;for accessing MacinTalk from within Microsoft BASIC
  335. X
  336. X;Kevin J. Willey
  337. X;15 March 1986
  338. X;Version 3.0a
  339. X
  340. X;Provides access to all of MacinTalk
  341. X;+ Translation function to convert English to Phonemes
  342. X;+ Command to change all parameters back to defaults
  343. X
  344. X;|=========================================================================|
  345. X;|    BASIC Syntax                                                         |
  346. X;|=========================================================================|
  347. X;|    Speech 1[,"Exception Filename"]           calls SpeechOn             |
  348. X;|     if Filename='noReader', then only Phonetic input is allowed.        |
  349. X;|-------------------------------------------------------------------------|
  350. X;|    Speech 2,"Text to Speak"                  calls Reader and MacinTalk |
  351. X;|     unless Phonetic input was specified then calls only Macintalk       |
  352. X;|-------------------------------------------------------------------------|
  353. X;|    Speech 3                                  calls SpeechOff            |
  354. X;|-------------------------------------------------------------------------|
  355. X;|    Speech 4,RATE     (85 <= RATE  <= 425)    calls SpeechRate           |
  356. X;|-------------------------------------------------------------------------|
  357. X;|    Speech 5,PITCH    (65 <= PITCH <= 500)    calls SpeechPitch          |
  358. X;|-------------------------------------------------------------------------|
  359. X;|    Speech 6,MODE      MODE=0:Natural         calls SpeechPitch          |
  360. X;|                           =1:Robotic          (but sets MODE)           |
  361. X;|-------------------------------------------------------------------------|
  362. X;|    Speech 7,SEX       reserved for future implementation                |
  363. X;|-------------------------------------------------------------------------|
  364. X;|    Speech 8,LANGUAGE  reserved for future implementation                |
  365. X;|-------------------------------------------------------------------------|
  366. X;|    Speech 9           sets all parameters back to defaults              |
  367. X;|-------------------------------------------------------------------------|
  368. X;|    Speech 10,"English to Translate",Phoneme$                            |
  369. X;|-------------------------------------------------------------------------|
  370. X;|    Speech 11          pronounces infostring                             |
  371. X;|=========================================================================|
  372. X
  373. X
  374. X;External References (these are the routines in SpeechAsm.Rel)
  375. X;~~~~~~~~~~~~~~~~~~~
  376. XXREF    SpeechOn        ;open driver and exception file
  377. XXREF    MacinTalk       ;pronounce phonemes
  378. XXREF    Reader          ;translate English to phonemes
  379. XXREF    SpeechOff       ;close the driver and clean up memory
  380. XXREF    SpeechRate      ;set the speaking rate
  381. XXREF    SpeechPitch     ;set the baseline pitch and/or mode
  382. X
  383. X
  384. X
  385. X;TRAP calls
  386. X;~~~~~~~~~~
  387. X.TRAP    _NewHandle    $A122   ;INSIDE MACINTOSH (promo ed.) lists $A022
  388. X.TRAP    _DisposHandle    $A023   
  389. X.TRAP    _BlockMove    $A02E
  390. X.TRAP    _CmpString    $A03C
  391. X.TRAP    _PtrToHand    $A9E3
  392. X.TRAP    _GetHandleSize    $A025
  393. X
  394. X
  395. X;jump table for BASIC routines {pointed to by a5}
  396. X;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  397. XGetNextLibArg    EQU $2A    ;retrieves next argument from input list
  398. XIntegerArg    EQU $32    ;converts argument into 16 bit signed integer
  399. XBasicError    EQU $42    ;generates error code indicated by d2
  400. XAllocString    EQU $72    ;creates space for a string
  401. XAllocTempDesc    EQU $7A    ;generates a temporary string desc for a string
  402. XFreeTempDesc    EQU $82    ;frees temporary string descriptors from memory
  403. XLoadStringDesc    EQU $8A    ;loads contents of string descriptor in registers
  404. XAssignString    EQU $92    ;assigns a temporary string to a string variable
  405. X
  406. X
  407. X
  408. X;SpeechLib Routines
  409. X
  410. X;##########################################################################
  411. XSpeech:
  412. X
  413. X;----- Parse the Function Number ------------------------------------------
  414. X;      ~~~~~~~~~~~~~~~~~~~~~~~~~    
  415. X;Get the input argument from BASIC and branch to the correct code
  416. X
  417. X    JSR    GetIntegerArg    ;Comparison Table to parse chosen function
  418. X    CMP.B    #1,d3
  419. X    BEQ    InitSpeech
  420. X    CMP.B    #2,d3
  421. X    BEQ    Talk
  422. X    CMP.B    #3,d3
  423. X    BEQ    QuitSpeech
  424. X    CMP.B    #4,d3
  425. X    BEQ    SetRate
  426. X    CMP.B    #5,d3
  427. X    BEQ    SetPitch
  428. X    CMP.B    #6,d3
  429. X    BEQ    SetMode
  430. X    CMP.B    #7,d3
  431. X    BEQ    SetSex
  432. X    CMP.B    #8,d3
  433. X    BEQ    SetLanguage
  434. X    CMP.B    #9,d3
  435. X    BEQ    SetDefault
  436. X    CMP.B    #10,d3
  437. X    BEQ    Translate
  438. X    CMP.B    #11,d3
  439. X    BEQ    GiveInfo
  440. X    MOVE.L    #9,d2           ;"SUBSCRIPT OUT-OF-RANGE" error preloaded
  441. X    BRA    ErrorReport     ;report error
  442. X;##########################################################################
  443. X
  444. X
  445. X;##########################################################################
  446. XInitSpeech:
  447. X
  448. X;----- Load the Speech Driver and Speech Globals --------------------------
  449. X;      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  450. X
  451. X    JSR    GetNextLibArg(a5)   ;get argument from BASIC
  452. X    CMP.B    #0,d0               ;check if end of argument list
  453. X    BEQ    NoRules             ;if no argument then use default rules
  454. X    BSR    ParseStringArg      ;move string descriptor into regs.
  455. X    BSR    GenerateFilename    ;convert BASIC string to STR255
  456. X    BRA    OpenDriver
  457. X
  458. XNoRules:
  459. X;  use default pronunciation rules
  460. X    LEA    ExceptionFile,a1
  461. X    MOVE.L    #0,(a1)
  462. X        
  463. XOpenDriver:
  464. X
  465. X;FUNCTION SpeechOn (ExceptionFile:STR255; VAR theSpeech:SpeechHandle):
  466. X;                   SpeechErr;
  467. X    
  468. X    CLR.W    -(SP)          ;clear space for result code
  469. X    PEA    ExceptionFile  ;load Exception File
  470. X    PEA    theSpeech      ;load speech globals
  471. X    JSR    SpeechOn       ;jump to driver open routine
  472. X    MOVE.W    (SP)+,d0       ;check resulting error code
  473. X    MOVE.L    #7,d2          ;d2 pre-loaded with "OUT OF MEMORY" error
  474. X    CMP.W    #0,d0          ;if error code=0 then open worked
  475. X    BNE    ErrorReport    ;"OUT OF HEAP SPACE" error pre-loaded in d2
  476. X    BRA    CloseItUp      ;Return to BASIC
  477. X;##########################################################################
  478. X
  479. X
  480. X;##########################################################################
  481. XTalk:
  482. X
  483. X;----- Check for English or Phonetic Input --------------------------------
  484. X;      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  485. X;PhonemeFlag was either set or cleared depending on the exception file used
  486. X
  487. X    LEA    PhonemeFlag,a1
  488. X    TST.B    (a1)        ;if Phoneme flag is clear then convert
  489. X    BEQ    English        ;English to Phonemes
  490. X
  491. X
  492. XPhonemes:
  493. X    BSR    GenPHandle    ;Create a handle and fill it with phonemes
  494. X    BSR    Pronounce    ;Pass the phonemes to MacinTalk for speech    
  495. X    BRA    CleanMem    ;Clean Up
  496. X
  497. X
  498. XEnglish:
  499. X    BSR    GenEHandle    ;Create an Empty Handle    
  500. X    BSR    Read        ;Fill with translated English phonemes
  501. X    BSR    Pronounce    ;Pass the phonemes to MacinTalk for speech
  502. X    BRA    CleanMem    ;Clean Up
  503. X
  504. X
  505. X;*********************** Subroutines for Talking ***************************
  506. X;***************************************************************************
  507. X
  508. X;----- Generate a handle to the input Phonetic string ---------------------
  509. X;      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  510. XGenPHandle:
  511. X
  512. X;FUNCTION PtrToHandle (srcPtr:Ptr; VAR dstHndl:Handle; size:LongInt):OSErr;
  513. X;on Input  : a0=srcPtr, a1=dstHndl, d0=size
  514. X;on Output : a1=dstHndl, d0=result code
  515. X
  516. X    BSR    GetStringArg    ;get input string
  517. X    MOVE.L    a3,a0        ;set up registers for _PtrToHand conversion
  518. X    MOVE.L    d2,d0
  519. XInfo:    MOVE.L    #7,d2        ;pre-load an "OUT OF MEMORY" error
  520. X    _PtrToHand        ;create a handle to the Phonemes
  521. X    BMI    ErrorReport    ;report error
  522. X    LEA    phHandle,a1    ;copy handle into phHandle
  523. X    MOVE.L    a0,(a1)
  524. X    RTS
  525. X
  526. X;----- Generate a handle for the translated English text ------------------
  527. X;      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  528. XGenEHandle:
  529. X
  530. X;FUNCTION NewHandle (logicalSize:Size):Handle
  531. X;on Input  : d0=logicalSize
  532. X;on Output : a0=Handle, d0=result code
  533. X    
  534. X    MOVEQ    #0,d0         ;set up empty handle
  535. X    _NewHandle            ;allocate handle for reader to fill 
  536. X                              ;with phonemes (output:a0 = the handle)
  537. X    LEA    phHandle,a1   
  538. X    MOVE.L    a0,(a1)       ;save handle in phHandle
  539. X    RTS
  540. X
  541. X;----- Translate the English text ------------------------------------------
  542. X;      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  543. XRead:
  544. X
  545. X;FUNCTION Reader (theSpeech:SpeechHandle; EnglishInput:Ptr
  546. X;           InputLength:LongInt; PhoneticOutput:Handle):SpeechErr;
  547. X
  548. X    CLR.W    -(SP)           ;clear space for result
  549. X    MOVE.L    theSpeech,-(SP) ;load speech globals
  550. X    BSR    GetStringArg    ;Get text to be spoken from BASIC
  551. X    MOVE.L    a3,-(SP)        ;load Ptr to string
  552. X    MOVE.L    d2,-(SP)        ;load String length
  553. X    MOVE.L    phHandle,-(SP)  ;we just allocated this handle for phonemes
  554. X    JSR    Reader          ;do translation of English to phonemes
  555. X    MOVE.W    (SP)+,d0        ;get resulting error code
  556. X    MOVE.L    #7,d2           ;"OUT OF HEAP SPACE" error pre-loaded in d2
  557. X    CMP.W    #0,d0           ;if error code=0 then Reader worked
  558. X    BNE    ErrorReport     ;report error
  559. X    RTS
  560. X
  561. X
  562. X;----- Pronounce a string of Phonemes -------------------------------------
  563. X;      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  564. XPronounce:
  565. X
  566. X;now feed the phonemes to Macintalk
  567. X;FUNCTION MacinTalk (theSpeech:SpeechHandle; Phonemes:Handle):SpeechErr
  568. X    
  569. X    CLR.W    -(SP)           ;space for result code
  570. X    MOVE.L    theSpeech,-(SP) ;load speech globals
  571. X    MOVE.L    phHandle,-(SP)  ;load handle to phonemes
  572. X    JSR    MacinTalk       ;say it
  573. X    MOVE.W    (SP)+,d0        ;get result code
  574. X    MOVE.L    #3,d2           ;"DEVICE UNAVAILABLE" error preloaded in d2
  575. X    CMP.B    #0,d0           ;if error code=0 then MacinTalk worked
  576. X    BNE    ErrorReport     ;report error
  577. X    RTS
  578. X
  579. X
  580. X;----- Dispose of memory blocks -------------------------------------------
  581. X;      ~~~~~~~~~~~~~~~~~~~~~~~~
  582. XCleanMem:
  583. X
  584. X;PROCEDURE DisposHandle (h:Handle)
  585. X;on Input  : a0=handle
  586. X    MOVE.L    phHandle,a0     ;_DisposHandle expects input in a0
  587. X    _DisposHandle           ;deallocate handle to free up memory
  588. X    BRA CloseItUp           ;return to BASIC
  589. X;##########################################################################
  590. X
  591. X
  592. X;##########################################################################
  593. XQuitSpeech:
  594. X
  595. X;------ Clean up memory and leave -----------------------------------------
  596. X;       ~~~~~~~~~~~~~~~~~~~~~~~~~
  597. X;PROCEDURE SpeechOff (theSpeech:SpeechHandle)
  598. X
  599. X    MOVE.L    theSpeech,-(SP) ;handle to speech globals
  600. X    JSR    SpeechOff       ;close it up
  601. X    MOVE.L    #0,d0           ;exit with 0 in d0 makes code purgeable
  602. X                            ;          1 in d0 makes code resident
  603. X    RTS
  604. X;##########################################################################
  605. X
  606. X
  607. X;##########################################################################
  608. XSetRate:
  609. X
  610. X;------ Set the speaking rate ---------------------------------------------
  611. X;       ~~~~~~~~~~~~~~~~~~~~~
  612. X;PROCEDURE SpeechRate (theSpeech:SpeechHandle; theRate:INTEGER);
  613. X
  614. X    BSR    GetIntegerArg   ;Get user input RATE {returned in d3}
  615. X    MOVE.L    #9,d2           ;"SUBSCRIPT OUT-OF-RANGE" error pre-loaded
  616. X    CMP.W    #85,d3          ;check lower bound
  617. X    BLT    ErrorReport     ;report error
  618. X    CMP.W    #425,d3         ;check upper bound
  619. X    BGT    ErrorReport     ;report error
  620. X    MOVE.L    theSpeech,-(SP) ;load speech globals
  621. X    MOVE.W    d3,-(SP)        ;load RATE - {RATE is contained in d3...
  622. X    JSR    SpeechRate      ;set the RATE    
  623. X    BRA    CloseItUp       ;return to BASIC
  624. X;##########################################################################
  625. X
  626. X;##########################################################################
  627. XSetPitch:
  628. X
  629. X;------ Set the baseline pitch --------------------------------------------
  630. X;       ~~~~~~~~~~~~~~~~~~~~~~
  631. X;PROCEDURE SpeechPitch (theSpeech:SpeechHandle; thePitch:INTEGER;
  632. X;            theMode:FOMode);    
  633. X;     - theMode is NoChange in order to only affect PITCH
  634. X
  635. X    BSR    GetIntegerArg   ;Get user input PITCH {returned in d3}
  636. X    MOVE.L    #9,d2           ;"SUBSCRIPT OUT-OF-RANGE" error preloaded
  637. X    CMP.W    #65,d3          ;check lower bound
  638. X    BLT    ErrorReport     ;report error
  639. X    CMP.W    #500,d3         ;check upper bound
  640. X    BGT    ErrorReport     ;report error
  641. X    MOVE.L    theSpeech,-(SP) ;speech globals
  642. X    MOVE.W    d3,-(SP)        ;Pitch
  643. X    MOVE.B    #2,-(SP)        ;Specify 'NoChange' for the MODE
  644. X    JSR    SpeechPitch     ;change SpeechPitch
  645. X    BRA    CloseItUp       ;return to BASIC
  646. X;##########################################################################
  647. X
  648. X
  649. X;##########################################################################
  650. XSetMode:
  651. X
  652. X;------ Set the speech mode -----------------------------------------------
  653. X;       ~~~~~~~~~~~~~~~~~~~
  654. X;PROCEDURE SpeechPitch (theSpeech:SpeechHandle; thePitch:INTEGER;
  655. X;            theMode:FOMode);
  656. X;  set PITCH out of range and PITCH will default to previous value
  657. X    
  658. X    BSR    GetIntegerArg   ;Get user selected MODE {returned in d3}
  659. X    MOVE.L    #9,d2           ;"SUBSCRIPT OUT-OF-RANGE" error preloaded
  660. X    CMP.B    #1,d3           ;check upper bound
  661. X    BGT    ErrorReport     ;report error
  662. X    MOVE.L    theSpeech,-(SP) ;speech globals
  663. X    MOVE.W    #0,-(SP)        ;PITCH out of range so no change to SpeechPitch    
  664. X    MOVE.B    d3,-(SP)        ;set MODE - MODE is the ordinality of the 
  665. X                            ;elements of the Pascal data type F0Mode.
  666. X    JSR    SpeechPitch     ;set the MODE
  667. X    BRA    CloseItUp       ;return to BASIC    
  668. X;##########################################################################
  669. X
  670. X    
  671. X;##########################################################################
  672. XSetSex:
  673. X
  674. X;------ Set the speech sex -------------------------------------------------
  675. X;       ~~~~~~~~~~~~~~~~~~
  676. X;PROCEDURE SpeechSex (theSpeech:SpeechHandle; theSex:SEX);
  677. X    
  678. X    BRA    CloseItUp       ;return to BASIC    
  679. X;##########################################################################
  680. X
  681. X
  682. X;##########################################################################
  683. XSetLanguage:
  684. X
  685. X;------ Set the speech language --------------------------------------------
  686. X;       ~~~~~~~~~~~~~~~~~~~~~~~
  687. X;PROCEDURE SpeechLanguage (theSpeech:SpeechHandle; ?:?);
  688. X    
  689. X    BRA    CloseItUp       ;return to BASIC    
  690. X;##########################################################################
  691. X
  692. X
  693. X;##########################################################################
  694. XSetDefault:
  695. X    MOVE.L    theSpeech,-(SP)    ;load speech globals
  696. X    MOVE.W    #150,-(SP)    ;load RATE
  697. X    JSR    SpeechRate    ;set the RATE    
  698. X    MOVE.L    theSpeech,-(SP) ;load speech globals
  699. X    MOVE.W    #110,-(SP)    ;load PITCH
  700. X    MOVE.B    #0,-(SP)    ;load MODE
  701. X    JSR    SpeechPitch    ;set the PITCH and the MODE
  702. X    BRA    CloseItUp
  703. X;##########################################################################
  704. X
  705. X
  706. X;##########################################################################
  707. XTranslate:
  708. X
  709. X;------ Input English and Output Phonetic code -----------------------------
  710. X;       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  711. X    LEA    PhonemeFlag,a1    ;if Phoneme flag is clear then convert
  712. X    TST.B    (a1)        ;English to Phonemes, else leave and do
  713. X    BNE    CloseItUp    ;nothing
  714. X                
  715. X    BSR    GenEHandle        ;create empty handle for phonemes
  716. X    BSR    Read            ;convert English to Phonemes
  717. X    MOVE.L    phHandle,a0        ;set up regs. for _GetHandleSize
  718. X    _GetHandleSize            ;get length of Phoneme string
  719. X    MOVE.W    d0,d2            ;use same length for AllocString
  720. X    JSR    AllocString(a5)        ;create an empty string
  721. X    MOVE.L    a2,a1            ;set up regs. for _BlockMove
  722. X    MOVE.L    (a0),a0            ;de-reference Phoneme handle
  723. X    _BlockMove            ;copy Phonemes to empty string
  724. X    JSR    AllocTempDesc(a5)    ;create a string desc. for string
  725. X    MOVE.L    a3,a1            ;save pointer to new string desc.
  726. X    JSR    GetNextLibArg(a5)    ;get string var from BASIC
  727. X    MOVE.L    #13,d2            ;"TYPE MISMATCH" error preloaded
  728. X    CMP.B    #2,d0            ;only string arguments allowed
  729. X    BNE    ErrorReport        ;report error
  730. X    MOVE.L    a2,a3            ;set up regs. for AssignString
  731. X    MOVE.L    a1,a2
  732. X    JSR    AssignString(a5)    ;assign string desc. to string var
  733. X    BRA    CleanMem        ;clean up memory and return to BASIC    
  734. X;##########################################################################
  735. X
  736. X
  737. X;##########################################################################
  738. XGiveInfo:
  739. X    LEA    InfoString,a0
  740. X    MOVE.L    #100,d0
  741. X    BSR    Info
  742. X    BSR    Pronounce    
  743. X    BRA    CleanMem
  744. X;##########################################################################
  745. X
  746. X    
  747. X;LOCAL SUBROUTINES
  748. X;**************************************************************************
  749. X
  750. X;----- Subroutines for parsing arguments ----------------------------------
  751. X
  752. XGetIntegerArg:
  753. X    JSR    GetNextLibArg(a5) ;get argument from BASIC
  754. X    MOVE.L    #13,d2            ;"TYPE MISMATCH" error preloaded
  755. X    CMP.B    #3,d0             ;only numeric arguments allowed
  756. X                              ; {d0 contains argument type}
  757. X    BLT    ErrorReport       ;report error
  758. X    JSR    IntegerArg(a5)    ;16 bit signed integer now in d3
  759. X    MOVE.L    #9,d2             ;"SUBSCRIPT OUT-OF-RANGE" error
  760. X    CMP.L    #0,d3             ;no negative inputs allowed
  761. X    BLT    ErrorReport       ;report error
  762. X    RTS
  763. X    
  764. XGetStringArg:
  765. X    JSR    GetNextLibArg(a5)   ;get argument from BASIC
  766. X
  767. XParseStringArg:
  768. X    MOVE.L    #13,d2              ;"TYPE MISMATCH" error preloaded
  769. X    CMP.B    #2,d0               ;only string arguments allowed
  770. X                                ;  {d0 contains argument type}
  771. X    BNE    ErrorReport         ;report error
  772. X    MOVE.L    a2,a3               ;copy pointer into a3
  773. X    JSR    FreeTempDesc(a5)    ;free string space
  774. X    JSR    LoadStringDesc(a5)  ;on input a3 => string descriptor
  775. X                                ;on output a3 => string data
  776. X                                ;          d2 =  string length
  777. XRTS
  778. X;**************************************************************************
  779. X
  780. XCloseItUp:
  781. X
  782. X;------ Leave, but remain resident ----------------------------------------
  783. X;       ~~~~~~~~~~~~~~~~~~~~~~~~~~
  784. X    MOVE.L    #1,d0  ;exit with 0 in d0 makes code purgeable
  785. X                   ;          1 in d0 makes code resident
  786. X    RTS
  787. X
  788. X;**************************************************************************
  789. X
  790. X;-----Subroutine for generating a STR255 Exception Filename ---------------
  791. X
  792. XGenerateFilename:
  793. X    MOVE.L    a2,a3            ;input needs to be in a3
  794. X    JSR    LoadStringDesc(a5)    ;move string descriptor into regs.
  795. X    MOVE.L    a3,a0            ;set up regs for _BlockMove
  796. X    LEA    ExceptionFile,a1
  797. X    MOVE.B    d2,(a1)+        ;push length byte
  798. X    MOVE.L    d2,d0
  799. X
  800. X;PROCEDURE BlockMove (sourcePtr,destPtr:Ptr; byteCount:Size);    
  801. X    _BlockMove
  802. X    
  803. X    LEA    ExceptionFile,a0    ;set up regs for _CmpString
  804. X    LEA    PhonemeExFile,a1
  805. X    MOVE.L    #$00080008,d0
  806. X
  807. X;FUNCTION EqualString (aStr,bStr:Str255; caseSens,diacSens:BOOLEAN):BOOLEAN;    
  808. X    _CmpString
  809. X
  810. X    BNE    ClearFlag        ;if strings not equal then ClearFlag
  811. X    
  812. XSetFlag:
  813. X    LEA    PhonemeFlag,a1        ;set flag = phoneme input
  814. X    ST    (a1)
  815. X    RTS        
  816. X
  817. XClearFlag:
  818. X    LEA    PhonemeFlag,a1        ;clear flag = English input
  819. X    CLR.B    (a1)
  820. X    RTS
  821. X
  822. X;**************************************************************************
  823. X
  824. X;-----Subroutine for error handling ---------------------------------------
  825. X
  826. XErrorReport:
  827. X    BSR    QuitSpeech
  828. X    JSR    BasicError(a5)
  829. X    
  830. X;**************************************************************************
  831. X;**************************************************************************
  832. X
  833. X;-----------STATIC DATA----------------------------------------------------
  834. XInfoString    DC.B    'DHIHS IHZ SPIY4CH LIH1B THRIY4 POYNT ZIY4ROW.'    
  835. X        DC.B    'RIH1TEHN BAY KEHVIH1N WAYLIY2 AHV AE2PUL DEY5TUN.#'
  836. X    .ALIGN    4
  837. XtheSpeech    DC.L    0         ;storage for handle to speech globals
  838. XStringBuf    DC.L    0          ;buffer for string variable
  839. XphHandle    DC.L    0         ;storage for handle to phonetic codes
  840. XExceptionFile    DCB.B    256,0       ;storage for exception filename
  841. XPhonemeExFile    DC.B    8
  842. X        DC.B    'noReader' ;'noReader' filename        
  843. XPhonemeFlag    DC.B    0       ;test flag -0:Phoneme input
  844. X                                   ;          =0:English input
  845. X
  846. ________This_Is_The_END________
  847. if test `wc -l < SpeechLib.asm` -ne 514; then
  848.     echo 'shar: SpeechLib.asm was damaged during transit'
  849.   echo '      (should have been 514 bytes)'
  850. fi
  851. fi        ; : end of overwriting check
  852. echo 'Extracting LibInit.asm'
  853. if test -f LibInit.asm; then echo 'shar: will not overwrite LibInit.asm'; else
  854. sed 's/^X//' << '________This_Is_The_END________' > LibInit.asm
  855. XBasicVersion        EQU 0    ;i.e.  2 in version 2.00
  856. XBasicResult        EQU 6    ;if library is compatible with BASIC's 
  857. X                ;version, it sets this field to 0.
  858. X                ;If it is incompatible, it sets it non-zero.
  859. X    
  860. XLibInit:
  861. X    CLR.W    BasicResult(a0)
  862. X    CMP.W    #2,BasicVersion(a0)
  863. X    BGE    LibInitExit
  864. X    MOVE.W    #-1,BasicResult(a0)
  865. XLibInitExit:
  866. X    CLR.L    d0
  867. X    RTS
  868. ________This_Is_The_END________
  869. if test `wc -l < LibInit.asm` -ne 13; then
  870.     echo 'shar: LibInit.asm was damaged during transit'
  871.   echo '      (should have been 13 bytes)'
  872. fi
  873. fi        ; : end of overwriting check
  874. echo 'Extracting SpeechLib.r'
  875. if test -f SpeechLib.r; then echo 'shar: will not overwrite SpeechLib.r'; else
  876. sed 's/^X//' << '________This_Is_The_END________' > SpeechLib.r
  877. XSpeechLib
  878. XBLIBYLEE
  879. X
  880. X*CODE SEGMENTS FOR SPEECHLIB
  881. X*---------------------------
  882. X*These two code segments are necessary for SpeechLib
  883. X
  884. XTYPE CODE=GNRL
  885. XLibInit,1
  886. X.R
  887. XSpLibIntermediate CODE1
  888. X
  889. XTYPE CODE=GNRL
  890. XSpeech,2
  891. X.R
  892. XSpLibIntermediate CODE2
  893. X
  894. X
  895. X*The rest of the resources are to give SpeechLib a custom ICON
  896. X*-------------------------------------------------------------
  897. X
  898. X
  899. X*SET ID
  900. X*------
  901. XTYPE YLEE=GNRL
  902. X ,0
  903. X.P
  904. XSPEECHLIB 3.0 BY KEVIN WILLEY
  905. X
  906. X
  907. X*SET UP FILE REFERENCE
  908. X*---------------------
  909. XTYPE FREF
  910. X ,128
  911. XBLIB 0
  912. X
  913. X
  914. X*SET UP BUNDLE
  915. X*-------------
  916. XTYPE BNDL
  917. X ,128
  918. XYLEE 0
  919. XICN#
  920. X0 128
  921. XFREF
  922. X0 128
  923. X
  924. X
  925. X*ICON AND MASK FOR SPEECHLIB
  926. X*---------------------------
  927. XTYPE ICN#=GNRL
  928. X ,128
  929. X.H
  930. X00FFFFC0 03000030 0464A5C8 088AA484
  931. X084E4484 082A4484 04CA4488 03000030
  932. X00FFF9C0 00000A00 00001C00 00003000
  933. X00006000 00008000 007E0000 00FF0000
  934. X01FF8000 03BFC000 0791E000 06006000
  935. X06E76000 06426000 06006000 04182000
  936. X0600660C 02004912 017E8112 013C8212
  937. X00810112 00420912 003C064C 00000000
  938. X00FFFFC0 03FFFFF0 07FFFFF8 0FFFFFFC
  939. X0FFFFFFC 0FFFFFFC 07FFFFF8 03FFFFF0
  940. X00FFFFC0 00000E00 00001C00 00003000
  941. X00006000 00008000 007E0000 00FF0000
  942. X01FF8000 03FFC000 07FFE000 07FFE000
  943. X07FFE000 07FFE000 07FFE000 07FFFFFF
  944. X07FFFFFF 03FFDFFF 01FF9FFF 01FF9FFF
  945. X00FF1FFF 007E1FFF 003C1FFF 00001FFF
  946. ________This_Is_The_END________
  947. if test `wc -l < SpeechLib.r` -ne 69; then
  948.     echo 'shar: SpeechLib.r was damaged during transit'
  949.   echo '      (should have been 69 bytes)'
  950. fi
  951. fi        ; : end of overwriting check
  952. exit 0
  953.