;-----------------------------------------------------------------------------------------------; ; Program: Speakjet Allophone Babbler ; ; 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 = Speakjet allophone (0 - 5 volts) ' IN2 = Range (0 to max) ' IN3 = Offset (0 to 127) ' note: Offset range is inversely proportional to Range ' Outputs: ' Speakjet = Voice output ' ' Run led indicates data transmission to SpeakJet ' ' Stop led indicates waiting for trigger ' ' Written by David J. Brown ' Revision: 0.2 ' April 22, 2006 ' History: 0.2 changed speakjet to i2c protocol ; 0.1 added display of program name ' 0.0 Initial release of SPEAKJET ALLOPHONE BABBLER 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 (line 50) ' 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 BSTART CON 4 'Start button BSTOP CON 5 'Stop button AUX CON 8 'AUX jack STOPLED CON 9 'Red stop led RUNLED CON 10 'Green run led 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 ' SPKDATA VAR BYTE 'Speakjet data VALUE VAR WORD 'Working variable RNUM VAR WORD 'Working variable CURRENT VAR BIT 'Current trigger input PREVIOUS VAR BIT 'Inverted previous value of trigger input ' '***************************************************** ' '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 processors initialize ENABLEHSERIAL SETHSERIAL H31200,H8DATABITS,HNOPARITY,H1STOPBITS HSEROUT [$f0,$7d,$0a,$18,"SpeakJetAllophon",$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 'Get CV controls LET RNUM=((ADC1V&$1FF)/2) 'Reduce to 5 volt range and 256 values LET VALUE=(RNUM*(ADC2V/4))/512 'Allophone X range / 256 is still 256 values LET VALUE=VALUE+((ADC3V/8)*((1024-ADC2V)/8)/32) 'Offset effect is scaled by Range LET VALUE=VALUE|$80 'Shift it to 128 TO 255 LET SPKDATA=VALUE GOSUB SPEAKJET GOTO LP ' ' '************************************************************************ ' 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 'Set current to (current(n) and not(current(n-1))) LET PREVIOUS=0 'Looking for 0 to 1 transition ELSE 'Have a low LET CURRENT=0 LET PREVIOUS=1 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 variables with A/D values SCANADC: ADIN ADC1,ADC1V ADIN ADC2,ADC2V ADIN ADC3,ADC3V ADIN ADC4,ADC4V RETURN ' ' '************************************************************************ ' END OF PROGRAM '************************************************************************