;-----------------------------------------------------------------------------------------------; ; Program: SpeakJet Phrase Sayer ; ; Developed by David J. Brown ; ; Email: davebr@earthlink.net ; ; Web site: http://modularsynthesis.com ; ;-----------------------------------------------------------------------------------------------; ' ' Description: ' ' Inputs: ' START = Trigger ' note: triggers on 0 to 1 transition ' IN1 = Phrase selection ' 0 to 1 volt phrase 1 ' 1 to 2 volts phrase 2 ' 2 to 3 volts phrase 3 ' 3 to 4 volts phrase 4 ' 4+ volts phrase 5 ' Outputs: ' Speakjet = Voice output ' ' Run led indicates data transmission to SpeakJet ' ' Stop led indicates waiting for trigger ' ' Written by David J. Brown ' Revision: 0.3 ' April 22, 2006 ' History: 0.3 changed speakjet to i2c protocol ' 0.2 added display of program name ' 0.1 Modified pin initialization ' 0.0 Initial release of SPEAKJET PHRASE SAYER program ' Date: April 24, 2004 ' ' Based on code written by Brice Hornback '***************************************************************** ' Module: PSIM-1 REV1b ' Processor Type: Basic Micro - Basic Atom Pro24M '***************************************************************** ' ' Basic Micro Atom Pro-24M Configuration ' note: P0 is I/O 0 and NOT pin 0 on the microprocessor ' ' P0 - Analog IN-1 (0-5 VDC) ' P1 - Analog IN-2 (0-5 VDC) ' P2 - Analog IN-3 (0-5 VDC) ' P3 - Analog IN-4 (0-5 VDC) ' P4 - START Button (momentary normally open switch) ' P5 - STOP Button (momentary normally open switch) ' P6 - I2C/SDA (Reserved) - J3 Pin 2 (SpeakJet flow control) ' P7 - I2C/SDL (Reserved) - J3 Pin 1 (Serial data to SpeakJet) ' P8 - AUX digital I/O ' P9 - STOP LED ' P10 - RUN LED ' P11 - DAC - LOADDACS ' P12 - DAC - SERDATA ' P13 - DAC - CLOCK ' P14 - RXD (Reserved) - J5 Pin 1 (MIDI In) ' P15 - TXD (Reserved) - J5 Pin 2 (MIDI Out) ' '***************************************************** ' 'Define Variables ADC1 CON 0 ADC2 CON 1 ADC3 CON 2 ADC4 CON 3 STOPLED VAR OUT9 'Red stop led RUNLED VAR OUT10 'Green run led SPKJ_FULL VAR IN6 ;Speakjet buffer half full SPKJ_SDATA CON 7 ;Speakjet data LOADDACS CON 11 'Pin OUT to DAC LOADDACS SERDATA CON 12 'Pin OUT Serial Data to DAC (16-bit) CLOCK CON 13 'Pin OUT to Clock DAC ' RAWDAC1 VAR WORD 'Raw DAC1 data RAWDAC2 VAR WORD 'Raw DAC2 data RAWDAC3 VAR WORD 'Raw DAC3 data RAWDAC4 VAR WORD 'Raw DAC4 data DAC1V VAR WORD 'DAC value to be sent to OUT-1 DAC2V VAR WORD 'DAC value to be sent to OUT-2 DAC3V VAR WORD 'DAC value to be sent to OUT-3 DAC4V VAR WORD 'DAC value to be sent to OUT-4 ' ADC1V VAR WORD 'IN-1 ADC ADC2V VAR WORD 'IN-2 ADC ADC3V VAR WORD 'IN-3 ADC ADC4V VAR WORD 'IN-4 ADC ' INDX VAR WORD 'Phrase index counter SPKDATA VAR BYTE 'Speakjet data CURRENT VAR BIT 'Current trigger input PREVIOUS VAR BIT 'Inverted previous value of trigger input ' 'SpeakJet phrases ' note: Terminate phrase data with 255 ' &%!/# compiler cannot calculate length of table ' Must define byte length for each table ' Table length MUST be even so pad with extra byte if necessary ' LEN1 CON 46 'Length of PHRASE1: Hello Dave, everything is running OK PHRASE1 BYTETABLE 020, 096, 021, 114, 022, 088, 023, 005, 183, 007,| 159, 146, 164, 174, 007, 154, 007, 128, 008, 166,| 030, 050, 130, 166, 148, 128, 008, 190, 008, 129,| 008, 143, 008, 129, 167, 148, 134, 141, 128, 144,| 137, 164, 194, 154, 255, 255 ' LEN2 CON 46 'Length of PHRASE2: My synthesizer talks and sings (tones) PHRASE2 BYTETABLE 020, 096, 021, 114, 022, 088, 023, 005, 140, 155,| 187, 129, 141, 190, 006, 133, 187, 155, 167, 148,| 191, 008, 136, 195, 188, 008, 132, 008, 141, 177,| 006, 187, 128, 008, 143, 187, 242, 244, 248, 248,| 240, 220, 217, 221, 255, 255 ' LEN3 CON 32 'Length of PHRASE3: I'm a PSIM and I'm OK PHRASE3 BYTETABLE 020, 096, 021, 114, 022, 088, 023, 005, 155, 140,| 154, 128, 198, 128, 128, 030, 005, 188, 129, 140,| 008, 132, 008, 141, 177, 155, 140, 137, 164, 194,| 154, 255 ' LEN4 CON 34 'Length of PHRASE4: I am a speakjet synthesizer PHRASE4 BYTETABLE 020, 096, 021, 114, 022, 088, 023, 005, 157, 132,| 132, 140, 154, 128, 187, 198, 008, 128, 196, 165,| 131, 131, 191, 187, 129, 141, 190, 006, 133, 187,| 155, 167, 148, 255 ' LEN5 CON 28 'Length of PHRASE5: welcome to the machine PHRASE5 BYTETABLE 020, 096, 021, 114, 022, 088, 023, 005, 147, 159,| 194, 134, 140, 008, 191, 162, 008, 169, 008, 128,| 140, 007, 134, 008, 189, 128, 141, 255 ' OFF1 CON 0 'Offset to PHRASE1 OFF2 CON OFF1+LEN1 'Offset from PHRASE1 to PHRASE2 OFF3 CON OFF2+LEN2 'Offset from PHRASE1 to PHRASE3 OFF4 CON OFF3+LEN3 'Offset from PHRASE1 to PHRASE4 OFF5 CON OFF4+LEN4 'Offset from PHRASE1 to PHRASE5 ' '***************************************************** 'Initialize PSIM pins DIRS=%0011111010000000 'Configure pin direction (1=output, 0=input) ' Inputs: ' MIDI In, AUX, SpeakJet flow control, ' Start, Stop, IN-4, IN-3, IN-2, IN-1 ' Outputs: ' MIDI Out, LOADDACS, SERDATA, CLOCK, ' stop led, run led, SpeakJet serial output HIGH P7 'Set SpeakJet serial output to mark HIGH LOADDACS 'Set DAC load-0 high LOW SERDATA 'Set DAC data low LOW CLOCK 'Set DAC clock low HIGH P15 'Set MIDI Out to mark LET DAC1V=0 'Set OUT-1 low LET DAC2V=0 'Set OUT-2 low LET DAC3V=0 'Set OUT-3 low LET DAC4V=0 'Set OUT-4 low GOSUB LOADALLDACS 'Display program name PAUSE 250 'Let other processors initialize ENABLEHSERIAL SETHSERIAL H31200,H8DATABITS,HNOPARITY,H1STOPBITS HSEROUT [$f0,$7d,$0a,$18,"SpeakJetPhraseSy",$f7] 'Clear display, overwrite, program name 'Initialize TTS256 I2COUT P6,P7,$0,[($48<<1),"passthruon",$0d] 'Turn pass through mode on ' 'Main loop LP: HIGH STOPLED 'Indicate ready LOW RUNLED GOSUB CHKTRIG 'Check for trigger IF CURRENT=0 THEN LP 'Have trigger TRIG: LOW STOPLED HIGH RUNLED 'Indicate time to transmit data GOSUB SCANADC 'Determine phrase selection by In1 IF ADC1V > 410 THEN '4+ volts LET INDX=OFF5 ELSEIF ADC1V > 308 '3 to 4 volts LET INDX=OFF4 ELSEIF ADC1V > 204 '2 to 3 volts LET INDX=OFF3 ELSEIF ADC1V > 102 '1 to 2 volts LET INDX=OFF2 ELSE LET INDX=OFF1 '0 to 1 volt ENDIF ' 'Output phrase MORE: LET SPKDATA=PHRASE1(INDX) 'Get next entry in phrase IF SPKDATA=255 THEN LP 'End if 255 GOSUB SPEAKJET 'Send it out INDX=INDX+1 'Increment the index GOTO MORE ' '************************************************************************ ' SUBROUTINES '************************************************************************ ' 'Check for trigger 'Returns CURRENT=1 if valid trigger received CHKTRIG: LET CURRENT=IN4 'Check for trigger on start IF CURRENT=1 THEN 'Have a high LET CURRENT=PREVIOUS 'Trigger if last time was low LET PREVIOUS=0 'Flag this time as high ELSE 'Have a low LET CURRENT=0 'No trigger yet LET PREVIOUS=1 'Flag this time as low ENDIF RETURN ' 'Outputs SPKDATA SPEAKJET: IF SPKDATA="X" THEN SPKDATA=89 'Do not send "X" since it ends pass through ENDIF I2COUT P6,P7,$0,[($48<<1),SPKDATA] 'Send out i2c RETURN ' 'Output variables to DACs 'Written by Grant Richter, Jan 17, 2004, Wiard Synthesizer Company LOADALLDACS: LET RAWDAC1=DAC1V+49152 'Add addresses to values LET RAWDAC2=DAC2V+32768 LET RAWDAC3=DAC3V+16384 LET RAWDAC4=DAC4V 'Shift out 16 bits mode 4 gotta bang loaddacs pin for each channel 'Skew from channels 1 to 4 = 400 usecs 'Approximately 1 msec execution time for subroutine SHIFTOUT SERDATA,CLOCK,4,[RAWDAC1\16] PULSOUT LOADDACS,1 SHIFTOUT SERDATA,CLOCK,4,[RAWDAC2\16] PULSOUT LOADDACS,1 SHIFTOUT SERDATA,CLOCK,4,[RAWDAC3\16] PULSOUT LOADDACS,1 SHIFTOUT SERDATA,CLOCK,4,[RAWDAC4\16] PULSOUT LOADDACS,1 RETURN ' 'Load buffers with A/D values SCANADC: ADIN ADC1,ADC1V ADIN ADC2,ADC2V ADIN ADC3,ADC3V ADIN ADC4,ADC4V RETURN ' ' '***************************************************** 'END OF PROGRAM '*****************************************************