******************************************

*  Voice Recognition Demo by Richard Horne

*  Requires voice.library (V 4.0) in sys:libs

******************************************

   INCLUDE     "exec/types.i"
   INCLUDE     "intuition/intuition.i"
   INCLUDE     "libraries/dos.i"

*********** external references **********

   XREF  _AbsExecBase
   XREF  _LVOOpenLibrary
   XREF  _LVOCloseLibrary
   XREF  _LVOOpenWindow
   XREF  _LVOCloseWindow
   XREF  _LVOOpenScreen
   XREF  _LVOCloseScreen
   XREF  _LVOSetMenuStrip
   XREF  _LVOClearMenuStrip
   XREF  _LVODisplayBeep
   XREF  _LVOWait
   XREF  _LVOGetMsg
   XREF  _LVOReplyMsg
   XREF  _LVOLoadRGB4
   XREF  _LVOSetAPen
   XREF  _LVOText
   XREF  _LVOMove
   XREF  _LVOOpen
   XREF  _LVOClose
   XREF  _LVORead
   XREF  _LVOWrite
   XREF  _LVOExecute

   XDEF  _main

*******  Voice.library Functions ********

_LVOLearn            EQU   -30
_LVORecognize        EQU   -36
_LVOAddVoiceTask     EQU   -42
_LVORemVoiceTask     EQU   -48
_LVOGainUp           EQU   -54
_LVOGainDown         EQU   -60
_LVORecDataAddress   EQU   -66
_LVORecMapAddress    EQU   -72
_LVOWordScore        EQU   -78
_LVOPickSampler      EQU   -84

*********** Begin Program  **************

_main:
   movea.l  _AbsExecBase,a6      ;Open DOS Llibrary
   movea.l  #DOS_Name,a1
   moveq.l  #0,d0
   jsr      _LVOOpenLibrary(a6)
   move.l   d0,DOS_Base
   beq      Close50

   movea.l  DOS_Base,a6          ;Open NIL
   move.l   #NILFileName,d1
   move.l   #MODE_NEWFILE,d2
   jsr      _LVOOpen(a6)
   move.l   d0,NIL_Handle
   beq      Close40

   movea.l  _AbsExecBase,a6      ;Open Intuition Library
   movea.l  #INTUITION_Name,a1
   moveq.l  #0,d0
   jsr      _LVOOpenLibrary(a6)
   move.l   d0,Intuition_Base
   beq      Close30

   movea.l  #GRAPHICS_Name,a1    ;Open Graphics Library
   moveq.l  #0,d0
   jsr      _LVOOpenLibrary(a6)
   move.l   d0,Graphics_Base
   beq      Close20

   movea.l  #VOICE_Name,a1       ;Open Voice Library
   moveq.l  #4,d0
   jsr      _LVOOpenLibrary(a6)  ;Version 4 Only
   move.l   d0,Voice_Base
   beq      Close10

****** Open Info Screen and Window *******

   movea.l  #InfoScreen,a0       ;Open Info Screen
   movea.l  Intuition_Base,a6
   jsr      _LVOOpenScreen(a6)
   move.l   d0,InfoScr
   beq      Close8

   add.l    #sc_RastPort,d0
   move.l   d0,InfoRastPort

   move.l   InfoScr,d0
   add.l    #sc_ViewPort,d0
   move.l   d0,InfoViewPort

   movea.l  Graphics_Base,a6     ;Set Colors
   movea.l  InfoViewPort,a0
   move.l   #Colors,a1
   move.l   #4,d0
   jsr      _LVOLoadRGB4(a6)

   movea.l  #InfoWindow,a0       ;Open Info Window
   move.l   InfoScr,nw_Screen(a0)
   movea.l  Intuition_Base,a6
   jsr      _LVOOpenWindow(a6)
   move.l   d0,InfoWdw
   beq      Close4

   bsr      WriteInfoText        ;Write Information

   movea.l  Intuition_Base,a6
   movea.l  InfoWdw,a0
   movea.l  #ProjectMenu,a1
   jsr      _LVOSetMenuStrip(a6)

InfoPause:
   movea.l  InfoWdw,a0
   movea.l  wd_UserPort(a0),a0
   move.b   MP_SIGBIT(a0),d1
   moveq.l  #1,d0
   lsl.l    d1,d0
   movea.l  _AbsExecBase,a6
   jsr      _LVOWait(a6)

GetInfoMessage:
   movea.l  InfoWdw,a0
   movea.l  wd_UserPort(a0),a0
   movea.l  _AbsExecBase,a6
   jsr      _LVOGetMsg(a6)
   move.l   d0,IDCMPMessage
   beq      InfoPause

   movea.l  d0,a0                ;Get Message Class and Code
   move.l   im_Class(a0),MessageClass
   move.w   im_Code(a0),MessageCode

   movea.l  _AbsExecBase,a6      ;Reply
   move.l   d0,a1
   jsr      _LVOReplyMsg(a6)

   cmpi.l   #CLOSEWINDOW,MessageClass  ;Close and quit?
   beq      Close

   cmpi.l   #MENUPICK,MessageClass     ;Menu Selection?
   bne      GetInfoMessage

MenuSelect:
   moveq.l  #0,d0
   move.w   MessageCode,d0
   and.w    #$1F,d0
   move.w   d0,MenuNumber

   moveq.l  #0,d0
   move.w   MessageCode,d0
   move.w   #5,d1
   lsr.w    d1,d0
   and.w    #$3F,d0
   move.w   d0,ItemNumber

   cmpi.w   #1,MenuNumber        ;Learn Menu Chosen?
   beq      LearnRoutine

   cmpi.w   #2,MenuNumber        ;Options Chosen?
   beq      GetInfoMessage

   cmpi.w   #0,ItemNumber        ;Project Menu Chosen
   beq      SaveFileRoutine
   cmpi.w   #1,ItemNumber
   beq      LoadFileRoutine
   cmpi.w   #2,ItemNumber
   beq      RecognizeRoutine
   cmpi.w   #3,ItemNumber
   beq      Close
   bra      GetInfoMessage

SaveFileRoutine:
   movea.l  DOS_Base,a6
   move.l   #VoiceFileName,d1
   move.l   #MODE_NEWFILE,d2
   jsr      _LVOOpen(a6)
   move.l   d0,File_Handle

   move.l   File_Handle,d1
   move.l   #MapBuffer,d2
   move.l   #1824,d3
   jsr      _LVOWrite(a6)

   move.l   File_Handle,d1
   jsr      _LVOClose(a6)

   bra      GetInfoMessage

LoadFileRoutine:
   movea.l  DOS_Base,a6
   move.l   #VoiceFileName,d1
   move.l   #MODE_OLDFILE,d2
   jsr      _LVOOpen(a6)
   move.l   d0,File_Handle
   beq      1$

   moveq.l  #0,d0
   move.l   File_Handle,d1
   move.l   #MapBuffer,d2
   move.l   #1824,d3
   jsr      _LVORead(a6)

   cmpi.l   #-1,d0
   bne      2$

1$
   movea.l  Intuition_Base,a6          ;Beep if no voice.dat
   movea.l  InfoScr,a0
   jsr      _LVODisplayBeep(a6)
   bra      6$

2$
   movea.l  #OneLearnItem,a0           ;Erase all checkmarks
   move.l   #5,d7
4$
   move.w   #ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT,mi_Flags(a0)
   move.l   mi_NextItem(a0),a0
   dbra     d7,4$

6$
   movea.l  DOS_Base,a6
   move.l   File_Handle,d1
   jsr      _LVOClose(a6)

8$
   bra      GetInfoMessage

******************************************

RecognizeRoutine:
   movea.l  #VoiceWindow,a0      ;Open VoiceTask Window
   move.l   InfoScr,nw_Screen(a0)
   movea.l  Intuition_Base,a6
   jsr      _LVOOpenWindow(a6)
   move.l   d0,VoiceWdw          ;Intuition Window
   beq      Close

   add.l    #wd_RPort,d0
   move.l   d0,a0
   move.l   (a0),VoiceRastPort

   movea.l  VoiceRastPort,a0
   move.l   rp_BitMap(a0),VoiceBitMap
   movea.l  VoiceBitMap,a0
   move.l   bm_Planes(a0),VoiceBitPlane

   movea.l  VoiceWdw,a0
   movea.l  #RecProjectMenu,a1
   jsr      _LVOSetMenuStrip(a6)

   movea.l  Voice_Base,a6
   bsr      ChooseDigitizer

   movea.l  #ResHighSubItem,a0   ;What resolution?
   move.w   mi_Flags(a0),d0
   btst     #8,d0
   bne      2$
   move.l   #1,Resolution        ;Low
   bra.s    4$
2$
   move.l   #0,Resolution        ;High
4$
   movea.l  #MapBuffer,a0        ;User's voice map buffer
   movea.l  VoiceWdw,a1
   movea.l  wd_UserPort(a1),a1   ;User's message port
   move.l   #6,d0                ;Number words in vocabulary
   move.l   Resolution,d1        ;Resolution
   jsr      _LVOAddVoiceTask(a6)

   movea.l  Intuition_Base,a6    ;Clear Info Menu
   movea.l  InfoWdw,a0
   movea.l  #ProjectMenu,a1
   jsr      _LVOClearMenuStrip(a6)

VoicePause:
   movea.l  _AbsExecBase,a6      ;Wait IntuiMessages
   movea.l  VoiceWdw,a0          ;or Message from VoiceTask
   movea.l  wd_UserPort(a0),a0
   move.b   MP_SIGBIT(a0),d1
   moveq.l  #1,d0
   lsl.l    d1,d0
   jsr      _LVOWait(a6)

GetVoiceMessage:
   movea.l  _AbsExecBase,a6
   movea.l  VoiceWdw,a0
   movea.l  wd_UserPort(a0),a0
   jsr      _LVOGetMsg(a6)
   move.l   d0,IDCMPMessage
   beq      VoicePause

   movea.l  IDCMPMessage,a0
   move.l   im_Class(a0),MessageClass
   move.w   im_Code(a0),MessageCode

   cmp.l    #0,MessageClass      ;A Reply from VoiceTask?
   beq      ReceiveVoiceMsg

   movea.l  _AbsExecBase,a6      ;Reply if not from VoiceTask
   movea.l  IDCMPMessage,a1
   jsr      _LVOReplyMsg(a6)

   cmpi.l   #CLOSEWINDOW,MessageClass     ;Close and Exit?
   beq      CloseVoiceTask

   cmpi.l   #MENUPICK,MessageClass
   bne      GetVoiceMessage

   moveq.l  #0,d0                ;Menu Selected
   move.w   MessageCode,d0
   move.w   #5,d1
   lsr.w    d1,d0
   and.w    #$3F,d0
   move.w   d0,ItemNumber

   cmpi.w   #0,ItemNumber        ;Volume Up?
   bne      2$
   movea.l  Voice_Base,a6
   jsr      _LVOGainUp(a6)
   bra      GetVoiceMessage

2$
   cmpi.w   #1,ItemNumber        ;Volume Down?
   bne      4$
   movea.l  Voice_Base,a6
   jsr      _LVOGainDown(a6)
   bra      GetVoiceMessage

4$
   cmpi.w   #2,ItemNumber        ;Quit?
   bne      GetVoiceMessage

CloseVoiceTask:
   movea.l  Voice_Base,a6        ;Remove Voice Task
   jsr      _LVORemVoiceTask(a6)

   movea.l  Intuition_Base,a6
   movea.l  VoiceWdw,a0
   jsr      _LVOCloseWindow(a6)

   movea.l  Intuition_Base,a6    ;Set Info Menu
   movea.l  InfoWdw,a0
   movea.l  #ProjectMenu,a1
   jsr      _LVOSetMenuStrip(a6)

   bra      GetInfoMessage

ReceiveVoiceMsg:                 ;Process Message From VoiceTask
   move.w   MessageCode,d7

   btst     #15,d7               ;Match Error?
   beq      MatchFound

   movea.l  Graphics_Base,a6
   movea.l  VoiceRastPort,a1
   move.l   #24,d0
   move.l   #60,d1
   jsr      _LVOMove(a6)

   movea.l  VoiceRastPort,a1
   move.l   #2,d0
   jsr      _LVOSetAPen(a6)

   cmpi.w   #-1,d7               ;No Matches?
   bne.s    2$
   movea.l  Graphics_Base,a6
   movea.l  VoiceRastPort,a1
   movea.l  #NegMatchWord,a0
   move.l   #9,d0
   jsr      _LVOText(a6)
   bra      EndRec

2$
   cmpi.w   #-2,d7               ;Clip?
   bne.s    4$
   movea.l  Graphics_Base,a6
   movea.l  VoiceRastPort,a1
   movea.l  #ClipWord,a0
   move.l   #9,d0
   jsr      _LVOText(a6)
   bra      EndRec

4$
   cmpi.w   #-3,d7               ;Low Volume?
   bne      6$
   movea.l  Graphics_Base,a6
   movea.l  VoiceRastPort,a1
   movea.l  #LowVolWord,a0
   move.l   #9,d0
   jsr      _LVOText(a6)
   bra      EndRec

6$
   cmpi.w   #-4,d7               ;Noisy?
   bne      GetVoiceMessage
   movea.l  Graphics_Base,a6
   movea.l  VoiceRastPort,a1
   movea.l  #NoiseWord,a0
   move.l   #9,d0
   jsr      _LVOText(a6)
   bra      EndRec

MatchFound:
   bsr      PlotMap              ;Plot Word Map

   movea.l  Graphics_Base,a6
   movea.l  VoiceRastPort,a1
   move.l   #24,d0
   move.l   #60,d1
   jsr      _LVOMove(a6)

   movea.l  VoiceRastPort,a1
   move.l   #1,d0
   jsr      _LVOSetAPen(a6)

   movea.l  Graphics_Base,a6     ;Write recognized word
   movea.l  VoiceRastPort,a1
   movea.l  #MapBuffer,a0
   move.w   MessageCode,d5
   mulu     #304,d5              ;304 bytes for each map in sequence
   adda.l   d5,a0
   move.l   #9,d0
   jsr      _LVOText(a6)

   movea.l  #SayOnSubItem,a0     ;Say On?
   move.w   mi_Flags(a0),d0
   btst     #8,d0
   beq      EndRec

   movea.l  #SayString,a0        ;Load Say String
   adda.l   #18,a0
   movea.l  #MapBuffer,a1
   move.w   MessageCode,d0
   mulu     #304,d0              ;304 bytes for each map in sequence
   adda.l   d0,a1
   move.l   (a1)+,(a0)+          ;Insert Say String
   move.l   (a1)+,(a0)+
   move.l   (a1)+,(a0)+

   movea.l  DOS_Base,a6          ;Say
   move.l   #SayString,d1
   moveq.l  #0,d2
   move.l   #NIL_Handle,d3
   jsr      _LVOExecute(a6)

EndRec:
   movea.l  _AbsExecBase,a6      ;Now Reply to VoiceTask
   movea.l  IDCMPMessage,a1      ;in order to listen for
   jsr      _LVOReplyMsg(a6)     ;the next word.

   bra      GetVoiceMessage      ;Return and wait for message

******************************************

LearnRoutine:
   movea.l  Voice_Base,a6
   bsr      ChooseDigitizer

   movea.l  #MapBuffer,a0              ;MapBuffer address in a0
   movea.l  #WordList,a1               ;Start of Word List
   move.w   ItemNumber,d0              ;Sequence Number of Word
   lsl.w    #4,d0                      ;16 bytes per word
   adda.w   d0,a1                      ;ASCII text string in a1

   movea.l  InfoScr,a2                 ;Screen for Learn Window
   move.w   ItemNumber,d0              ;Sequence Number of Word
   move.l   #130,d1                    ;X Position of Learn Window
   move.l   #40,d2                     ;Y Position of Learn Window
   jsr      _LVOLearn(a6)

   cmpi.l   #0,d0                      ;Intentionally Cancelled?
   bne      GetInfoMessage

   movea.l  #OneLearnItem,a0           ;If Cancelled, erase checkmark
   move.w   ItemNumber,d0
   subq.w   #1,d0
2$
   cmpi.w   #-1,d0
   beq      4$
   move.l   mi_NextItem(a0),a0
   subq.w   #1,d0
   bra.s    2$
4$
   move.w   #ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT,mi_Flags(a0)

   bra      GetInfoMessage

*********** Close and Exit ****************

Close:
   movea.l  Intuition_Base,a6
   movea.l  InfoWdw,a0
   jsr      _LVOCloseWindow(a6)

Close4:
   movea.l  Intuition_Base,a6
   movea.l  InfoScr,a0
   jsr      _LVOCloseScreen(a6)

Close8:                                ;Close Libraries
   movea.l  _AbsExecBase,a6
   movea.l  Voice_Base,a1
   jsr      _LVOCloseLibrary(a6)

Close10:
   movea.l  _AbsExecBase,a6
   movea.l  Graphics_Base,a1
   jsr      _LVOCloseLibrary(a6)

Close20:
   movea.l  _AbsExecBase,a6
   movea.l  Intuition_Base,a1
   jsr      _LVOCloseLibrary(a6)

Close30:
   movea.l  DOS_Base,a6
   move.l   NIL_Handle,d1
   jsr      _LVOClose(a6)

Close40:
   movea.l  _AbsExecBase,a6
   movea.l  DOS_Base,a1
   jsr      _LVOCloseLibrary(a6)

Close50:

   rts

************ SubRoutines *****************

ChooseDigitizer:
   movea.l  Voice_Base,a6
   movea.l  #PS3SubItem,a0       ;What digitizer?
   move.w   mi_Flags(a0),d0
   btst     #8,d0
   beq      2$
   moveq.l  #0,d0                ;PS3 Chosen
   bra.s    4$
2$
   moveq.l  #1,d0                ;SoundMaster Chosen
4$
   jsr      _LVOPickSampler(a6)

   rts


**************** Plot Map ***************

PlotMap:
   movem.l  d2-d7/a4-a5,-(a7)

   movea.l  Voice_Base,a6        ;Find Map Address
   jsr      _LVORecMapAddress(a6)
   move.l   d0,a5

   move.w   #20,d0               ;Starting X in d7
   movea.l  VoiceWdw,a0
   add.w    wd_LeftEdge(a0),d0
   ext.l    d0
   move.l   d0,d7

   move.l   #71,d5               ;Loop counter (72 frequency Points)
PMLoop:
   move.w   #18,d0               ;Starting Y in d6
   movea.l  VoiceWdw,a0
   add.w    wd_TopEdge(a0),d0
   ext.l    d0
   move.l   d0,d6

   move.l   (a5)+,d3             ;32 bit word from map

   move.l   d7,d2
   divu     #8,d2                ;X/8 Bytes

   move.l   #31,d4               ;Loop counter (32 bits per frequency)
PFLoop:
   move.l   d6,d0
   mulu     #80,d0               ;Y*80 Bytes per line

   add.w    d2,d0                ;Byte Position in d0

   move.l   d2,d1
   swap     d1                   ;7 - (Remainder of X/8)
   sub.w    #7,d1
   neg.w    d1                   ;Bit Position in d1

   movea.l  VoiceBitPlane,a4
   btst     d4,d3
   beq      10$
   bset     d1,0(a4,d0.w)
   bra.s    12$
10$
   bclr     d1,0(a4,d0.w)
12$
   addq.w   #1,d6
   dbra     d4,PFLoop

   addq.l   #1,d7
   dbra     d5,PMLoop

   movem.l  (a7)+,d2-d7/a4-a5
   rts

************** Info Text *****************

WriteInfoText:
   movea.l  Graphics_Base,a6
   movea.l  InfoRastPort,a1
   move.l   #1,d0
   jsr      _LVOSetAPen(a6)

   movea.l  #InfoText,a5
   move.l   #22,d7               ;Loop Counter, 23 lines
   move.l   #24,d6               ;Starting X
   move.l   #18,d5               ;Starting Y

WILoop:
   movea.l  InfoRastPort,a1
   move.l   d6,d0
   move.l   d5,d1
   jsr      _LVOMove(a6)

   movea.l  InfoRastPort,a1
   movea.l  a5,a0
   move.l   #71,d0
   jsr      _LVOText(a6)

   adda.l   #72,a5
   add.l    #8,d5
   dbra     d7,WILoop

   rts

***************** Data *******************

   SECTION  data,DATA

DOS_Name:
   dc.b     'dos.library',0

INTUITION_Name:
   dc.b     'intuition.library',0

GRAPHICS_Name:
   dc.b     'graphics.library',0,0

VOICE_Name:
   dc.b     'voice.library',0

VoiceFileName:
   dc.b     'Voice.dat',0

NILFileName:
   dc.b     'NIL:',0,0

WordList:                        ;16 bytes each
   dc.b     'Peter          ',0
   dc.b     'Piper          ',0
   dc.b     'Picked         ',0
   dc.b     'A Peck Of      ',0
   dc.b     'Pickled        ',0
   dc.b     'Peppers        ',0

NegMatchWord:
   dc.b     'No Match ',0

LowVolWord:
   dc.b     'Low Vol  ',0

ClipWord:
   dc.b     'Clipping ',0

NoiseWord:
   dc.b     'Noisy    ',0

SayString:
   dc.b     'sys:utilities/Say              ',0

InfoScreen:
   dc.w     0,0,640,200,2
   dc.b     0,1
   dc.w     V_HIRES,CUSTOMSCREEN!NS_EXTENDED
   dc.l     MyFont,0,0,0,ScreenTagList

MyFont:
   dc.l     MyFontName     ;pointer to font name
   dc.w     8              ;size
   dc.w     0

MyFontName:
   dc.b     'topaz.font',0,0

ScreenTagList:
   dc.l     SA_Pens,MyPenArray
   dc.l     TAG_DONE

ScreenTitle:
   dc.b     'InfoScreen',0,0

MyPenArray:
   dc.w     0     ;Detail Pen
   dc.w     1     ;Block Pen
   dc.w     1     ;Text Pen
   dc.w     2     ;Shine Pen
   dc.w     1     ;Shadow Pen
   dc.w     3     ;Hifill Pen
   dc.w     1     ;Text over Hifill
   dc.w     0     ;Background Pen
   dc.w     1     ;Hilight text Pen

******************************************

InfoWindow:
   dc.w     0,0,640,200
   dc.b     0,1
   dc.l     CLOSEWINDOW!RAWKEY!MENUPICK,WINDOWCLOSE!WINDOWDEPTH!ACTIVATE
   dc.l     0,0,InfoWindowTitle,0,0
   dc.w     640,200,0,0,CUSTOMSCREEN

InfoWindowTitle:
   dc.b     '                        VoiceDemo Information',0
   cnop     0,2

******************************************

VoiceWindow:
   dc.w     160,30,112,65
   dc.b     0,1
   dc.l     CLOSEWINDOW!MENUPICK,WINDOWCLOSE!WINDOWDRAG!ACTIVATE
   dc.l     0,0,VoiceWindowTitle,0,0
   dc.w     160,30,0,0,CUSTOMSCREEN

VoiceWindowTitle:
   dc.b     'VoiceWdw ',0
   cnop     0,2

Colors:
   dc.w     $0999,$0000,$0eee,$0679    ;gray, black, white, blue

************ Project Menu ****************

ProjectMenu:
   dc.l     LearnMenu
   dc.w     5,0,70,0,MENUENABLED
   dc.l     ProjectMenuTitle,SaveVoiceFileItem
   dc.w     0,0,0,0

ProjectMenuTitle:
   dc.b     'PROJECT',0

SaveVoiceFileItem:
   dc.l     LoadVoiceFileItem
   dc.w     0,0,120,9,ITEMTEXT!ITEMENABLED!HIGHCOMP
   dc.l     0,SaveVoiceFileItemText,0,0,0

SaveVoiceFileItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     0,0
   dc.l     0,SaveVoiceFileItemTitle,0

SaveVoiceFileItemTitle:
   dc.b     'Save Voice File',0

LoadVoiceFileItem:
   dc.l     RecognizeItem
   dc.w     0,10,120,9,ITEMTEXT!ITEMENABLED!HIGHCOMP
   dc.l     0,LoadVoiceFileItemText,0,0,0

LoadVoiceFileItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     0,0
   dc.l     0,LoadVoiceFileItemTitle,0

LoadVoiceFileItemTitle:
   dc.b     'Load Voice File',0
   cnop     0,2

RecognizeItem:
   dc.l     QuitItem
   dc.w     0,20,120,9,ITEMTEXT!ITEMENABLED!HIGHCOMP
   dc.l     0,RecognizeItemText,0,0,0

RecognizeItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     0,0
   dc.l     0,RecognizeItemTitle,0

RecognizeItemTitle:
   dc.b     'Recognize Voice',0

QuitItem:
   dc.l     0
   dc.w     0,30,120,9,ITEMTEXT!ITEMENABLED!HIGHCOMP
   dc.l     0,QuitItemText,0,0,0

QuitItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     0,0
   dc.l     0,QuitItemTitle,0

QuitItemTitle:
   dc.b     'Quit',0,0

************ Learn Menu ******************

LearnMenu:
   dc.l     OptionMenu
   dc.w     120,0,60,0,MENUENABLED
   dc.l     LearnMenuTitle,OneLearnItem
   dc.w     0,0,0,0

LearnMenuTitle:
   dc.b     'LEARN',0

OneLearnItem:
   dc.l     TwoLearnItem
   dc.w     0,0,100+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT
   dc.l     0,OneLearnItemText,0,0,0

OneLearnItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     CHECKWIDTH,0
   dc.l     0,OneLearnItemTitle,0

OneLearnItemTitle:
   dc.b     '"Peter"',0

TwoLearnItem:
   dc.l     ThreeLearnItem
   dc.w     0,10,100+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT
   dc.l     0,TwoLearnItemText,0,0,0

TwoLearnItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     CHECKWIDTH,0
   dc.l     0,TwoLearnItemTitle,0

TwoLearnItemTitle:
   dc.b     '"Piper"',0

ThreeLearnItem:
   dc.l     FourLearnItem
   dc.w     0,20,100+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT
   dc.l     0,ThreeLearnItemText,0,0,0

ThreeLearnItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     CHECKWIDTH,0
   dc.l     0,ThreeLearnItemTitle,0

ThreeLearnItemTitle:
   dc.b     '"Picked"',0,0

FourLearnItem:
   dc.l     FiveLearnItem
   dc.w     0,30,100+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT
   dc.l     0,FourLearnItemText,0,0,0

FourLearnItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     CHECKWIDTH,0
   dc.l     0,FourLearnItemTitle,0

FourLearnItemTitle:
   dc.b     '"A Peck Of"',0

FiveLearnItem:
   dc.l     SixLearnItem
   dc.w     0,40,100+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT
   dc.l     0,FiveLearnItemText,0,0,0

FiveLearnItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     CHECKWIDTH,0
   dc.l     0,FiveLearnItemTitle,0

FiveLearnItemTitle:
   dc.b     '"Pickeled"',0,0

SixLearnItem:
   dc.l     0
   dc.w     0,50,100+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT
   dc.l     0,SixLearnItemText,0,0,0

SixLearnItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     CHECKWIDTH,0
   dc.l     0,SixLearnItemTitle,0

SixLearnItemTitle:
   dc.b     '"Peppers"',0

************ Option Menu *****************

OptionMenu:
   dc.l     0
   dc.w     240,0,60,0,MENUENABLED
   dc.l     OptionMenuTitle,DigitizerOptionItem
   dc.w     0,0,0,0

OptionMenuTitle:
   dc.b     'OPTIONS',0

*************************************

DigitizerOptionItem:
   dc.l     ResOptionItem
   dc.w     0,0,100,10,ITEMTEXT!ITEMENABLED!HIGHCOMP
   dc.l     0,DigitizerOptionItemText,0
   dc.w     0
   dc.l     PS3SubItem
   dc.w     0

DigitizerOptionItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     0,0
   dc.l     0,DigitizerOptionItemTitle,0

DigitizerOptionItemTitle:
   dc.b     'Digitizer',0

PS3SubItem:
   dc.l     SMSubItem
   dc.w     98,4,108+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT!CHECKED
   dc.l     2,PS3SubItemText
   dc.l     0,0,0

PS3SubItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     CHECKWIDTH,0
   dc.l     0,PS3SubItemTitle,0

PS3SubItemTitle:
   dc.b     'PerfectSound3',0

SMSubItem:
   dc.l     0
   dc.w     98,14,108+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT
   dc.l     1,SMSubItemText
   dc.l     0,0,0

SMSubItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     CHECKWIDTH,0
   dc.l     0,SMSubItemTitle,0

SMSubItemTitle:
   dc.b     'SoundMaster',0

*************************************

ResOptionItem:
   dc.l     SayOptionItem
   dc.w     0,10,100,10,ITEMTEXT!ITEMENABLED!HIGHCOMP
   dc.l     0,ResOptionItemText,0
   dc.w     0
   dc.l     ResHighSubItem
   dc.w     0

ResOptionItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     0,0
   dc.l     0,ResOptionItemTitle,0

ResOptionItemTitle:
   dc.b     'Resolution',0,0

ResHighSubItem:
   dc.l     ResLowSubItem
   dc.w     98,4,50+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT
   dc.l     2,ResHighSubItemText,0,0,0

ResHighSubItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     CHECKWIDTH,0
   dc.l     0,ResHighSubItemTitle,0

ResHighSubItemTitle:
   dc.b     'High',0,0

ResLowSubItem:
   dc.l     0
   dc.w     98,14,50+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT!CHECKED
   dc.l     1,ResLowSubItemText,0,0,0

ResLowSubItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     CHECKWIDTH,0
   dc.l     0,ResLowSubItemTitle,0

ResLowSubItemTitle:
   dc.b     'Low',0

******************************************

SayOptionItem:
   dc.l     0
   dc.w     0,20,100,10,ITEMTEXT!ITEMENABLED!HIGHCOMP
   dc.l     0,SayOptionItemText,0
   dc.w     0
   dc.l     SayOnSubItem
   dc.w     0

SayOptionItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     0,0
   dc.l     0,SayOptionItemTitle,0

SayOptionItemTitle:
   dc.b     'Say',0

SayOnSubItem:
   dc.l     SayOffSubItem
   dc.w     98,4,50+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT
   dc.l     2,SayOnSubItemText
   dc.l     0,0,0

SayOnSubItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     CHECKWIDTH,0
   dc.l     0,SayOnSubItemTitle,0

SayOnSubItemTitle:
   dc.b     'On',0,0

SayOffSubItem:
   dc.l     0
   dc.w     98,14,50+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT!CHECKED
   dc.l     1,SayOffSubItemText
   dc.l     0,0,0

SayOffSubItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     CHECKWIDTH,0
   dc.l     0,SayOffSubItemTitle,0

SayOffSubItemTitle:
   dc.b     'Off',0

******** Recognize Project Menu **********

RecProjectMenu:
   dc.l     0
   dc.w     5,0,70,0,MENUENABLED
   dc.l     RecProjectMenuTitle,VolumeUpItem
   dc.w     0,0,0,0

RecProjectMenuTitle:
   dc.b     'PROJECT',0

VolumeUpItem:
   dc.l     VolumeDownItem
   dc.w     0,0,80,9,ITEMTEXT!ITEMENABLED!HIGHCOMP
   dc.l     0,VolumeUpItemText,0,0,0

VolumeUpItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     0,0
   dc.l     0,VolumeUpItemTitle,0

VolumeUpItemTitle:
   dc.b     'Volume Up',0

VolumeDownItem:
   dc.l     RecQuitItem
   dc.w     0,10,80,9,ITEMTEXT!ITEMENABLED!HIGHCOMP
   dc.l     0,VolumeDownItemText,0,0,0

VolumeDownItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     0,0
   dc.l     0,VolumeDownItemTitle,0

VolumeDownItemTitle:
   dc.b     'Volume Dn',0
   cnop     0,2

RecQuitItem:
   dc.l     0
   dc.w     0,20,80,9,ITEMTEXT!ITEMENABLED!HIGHCOMP
   dc.l     0,RecQuitItemText,0,0,0

RecQuitItemText:
   dc.b     0,1,RP_JAM1,0
   dc.w     0,0
   dc.l     0,RecQuitItemTitle,0

RecQuitItemTitle:
   dc.b     'Quit',0
   cnop     0,2

*************************** Information Text  ************************************

InfoText:
   dc.b '      This program utilizes the PerfectSound3 or SoundMaster audio     ',0
   dc.b 'digitizer and the public domain disk-based voice.library to learn and  ',0
   dc.b 'recognize six simple spoken phrases.  The phrases are "Peter ... Piper ',0
   dc.b '... Picked ... A Peck Of ... Pickled ... Peppers."                     ',0
   dc.b '      First, the program must learn each phrase.  To do this, select   ',0
   dc.b 'the desired phrase from the "Learn" menu.  You will then be prompted to',0
   dc.b 'speak this phrase to produce three acceptable digital samples.  Choose ',0
   dc.b 'the "Sample" gadget to record, and the "Accept" gadget to save each of ',0
   dc.b 'the THREE REQUIRED SAMPLES for each phrase.  You may need to increase  ',0
   dc.b 'or decrease volume by moving your microphone or by choosing the        ',0
   dc.b 'appropriate volume adjustment gadget.  Speak each phrase slowly and    ',0
   dc.b 'forcefully, pronouncing each syllable distinctly.  After learning all  ',0
   dc.b 'six phrases, you may save a complete file of voice data as voice.dat.  ',0
   dc.b '      After learning is complete, you may proceed to recognize any     ',0
   dc.b 'phrase at random.  Choose "Recognize Voice" from the Project Menu to   ',0
   dc.b 'start a separate task that listens to the audio digitizer and          ',0
   dc.b 'recognizes each phrase based on an audio frequency analysis.  When a   ',0
   dc.b 'phrase is recognized, it will be spoken back to you using the Amiga    ',0
   dc.b 'speach capability.  A voice map showing a frequency range of 3200 Hz   ',0
   dc.b 'versus 3/4 second of time will also be plotted.  Digitizer volume may  ',0
   dc.b 'be changed by menu selection.  "Clipping" indicates volume is too high.',0
   dc.b '"Low Vol" indicates volume is too low.                                 ',0
   dc.b '                                                                       ',0

**********************************************************************************

   SECTION  Memory,BSS

DOS_Base:
   ds.l     1

Intuition_Base:
   ds.l     1

Graphics_Base:
   ds.l     1

Voice_Base:
   ds.l     1

InfoScr:
   ds.l     1

InfoWdw:
   ds.l     1

InfoRastPort:
   ds.l     1

InfoViewPort:
   ds.l     1

VoiceWdw:
   ds.l     1

VoiceRastPort:
   ds.l     1

VoiceBitMap:
   ds.l     1

VoiceBitPlane:
   ds.l     1

Resolution:
   ds.l     1

File_Handle:
   ds.l     1

NIL_Handle:
   ds.l     1

MessageClass
   ds.l     1

MessageCode:
   ds.w     1

IDCMPMessage:
   ds.l     1

MenuNumber:
   ds.w     1

ItemNumber:
   ds.w     1

MapBuffer:
   ds.b     1824  ;6 word maps, (72*4 + 16) bytes each

   END
