'16 analog & 8 digital inputs to midi 'Fredrik Olofsson 011011 (http://olofsson.da.ru) 'based on Matt Rogalsky's "green lunchbox" (http://www.mrogalsky.net) ' 'pins 0-2 are used to control the adc0831 chip 'pins 3-6 are used to select MUX channel on the MC14067 'pins 7-14 are used for digital input 'pin 15 is used for midi out ' 'results are sent out (reduced to 7 bits from 8) as controllers 20-35 'on midi channel 1 and note on/off (60-67) on midi channel 1 'latest value is only sent if it's different from the previous one ' '------------------------------------------------------------------------- CS con 0 'chip select is pin 0 ADCdata con 1 'ADC data out is pin 1 CLK con 2 'ADC clock is pin 2 NOTE con 144 'note on/off on channel 1 VELO con 80 'note on velocity is 80 CTRL con 176 'controllers on channel 1 ADtemp var byte 'temp storage for previous controller value AD0 var byte 'to hold data shifted in from ADC AD1 var byte 'for each of 16 channels AD2 var byte AD3 var byte AD4 var byte AD5 var byte AD6 var byte AD7 var byte AD8 var byte AD9 var byte AD10 var byte AD11 var byte AD12 var byte AD13 var byte AD14 var byte AD15 var byte D0state var bit 'to hold previous value of pin D1state var bit D2state var bit D3state var bit D4state var bit D5state var bit D6state var bit D7state var bit '------------------------------ high CS 'deselect ADC to start D0state=in7 D1state=in8 D2state=in9 D3state=in10 D4state=in11 D5state=in12 D6state=in13 D7state=in14 loop: 'MAIN LOOP do0: gosub select0 gosub sample0 do1: gosub select1 gosub sample1 do2: gosub select2 gosub sample2 do3: gosub select3 gosub sample3 do4: gosub select4 gosub sample4 do5: gosub select5 gosub sample5 do6: gosub select6 gosub sample6 do7: gosub select7 gosub sample7 do8: gosub select8 gosub sample8 do9: gosub select9 gosub sample9 do10: gosub select10 gosub sample10 do11: gosub select11 gosub sample11 do12: gosub select12 gosub sample12 do13: gosub select13 gosub sample13 do14: gosub select14 gosub sample14 do15: gosub select15 gosub sample15 doDigi0: gosub check0 doDigi1: gosub check1 doDigi2: gosub check2 doDigi3: gosub check3 doDigi4: gosub check4 doDigi5: gosub check5 doDigi6: gosub check6 doDigi7: gosub check7 goto loop '------------------------------ '*** send MIDI CC 20-35 on MIDI channel 1, using Stamp pin 15 *** cc0: serout 15,12,0,[CTRL,20,AD0] goto do1 cc1: serout 15,12,0,[CTRL,21,AD1] goto do2 cc2: serout 15,12,0,[CTRL,22,AD2] goto do3 cc3: serout 15,12,0,[CTRL,23,AD3] goto do4 cc4: serout 15,12,0,[CTRL,24,AD4] goto do5 cc5: serout 15,12,0,[CTRL,25,AD5] goto do6 cc6: serout 15,12,0,[CTRL,26,AD6] goto do7 cc7: serout 15,12,0,[CTRL,27,AD7] goto do8 cc8: serout 15,12,0,[CTRL,28,AD8] goto do9 cc9: serout 15,12,0,[CTRL,29,AD9] goto do10 cc10: serout 15,12,0,[CTRL,30,AD10] goto do11 cc11: serout 15,12,0,[CTRL,31,AD11] goto do12 cc12: serout 15,12,0,[CTRL,32,AD12] goto do13 cc13: serout 15,12,0,[CTRL,33,AD13] goto do14 cc14: serout 15,12,0,[CTRL,34,AD14] goto do15 cc15: serout 15,12,0,[CTRL,35,AD15] goto doDigi0 '------------------------------ '*** sample input 0-15, after selecting MUX channel *** sample0: ADtemp=AD0 'save previous value low CS 'activate ADC shiftin ADCdata,CLK,msbpost,[AD0\9] 'shift in data high CS 'deactivate ADC AD0=AD0>>1 'divide by 2 if AD0<>ADtemp then cc0 'check if changed return sample1: ADtemp=AD1 low CS shiftin ADCdata,CLK,msbpost,[AD1\9] high CS AD1=AD1>>1 if AD1<>ADtemp then cc1 return sample2: ADtemp=AD2 low CS shiftin ADCdata,CLK,msbpost,[AD2\9] high CS AD2=AD2>>1 if AD2<>ADtemp then cc2 return sample3: ADtemp=AD3 low CS shiftin ADCdata,CLK,msbpost,[AD3\9] high CS AD3=AD3>>1 if AD3<>ADtemp then cc3 return sample4: ADtemp=AD4 low CS shiftin ADCdata,CLK,msbpost,[AD4\9] high CS AD4=AD4>>1 if AD4<>ADtemp then cc4 return sample5: ADtemp=AD5 low CS shiftin ADCdata,CLK,msbpost,[AD5\9] high CS AD5=AD5>>1 if AD5<>ADtemp then cc5 return sample6: ADtemp=AD6 low CS shiftin ADCdata,CLK,msbpost,[AD6\9] high CS AD6=AD6>>1 if AD6<>ADtemp then cc6 return sample7: ADtemp=AD7 low CS shiftin ADCdata,CLK,msbpost,[AD7\9] high CS AD7=AD7>>1 if AD7<>ADtemp then cc7 return sample8: ADtemp=AD8 low CS shiftin ADCdata,CLK,msbpost,[AD8\9] high CS AD8=AD8>>1 if AD8<>ADtemp then cc8 return sample9: ADtemp=AD9 low CS shiftin ADCdata,CLK,msbpost,[AD9\9] high CS AD9=AD9>>1 if AD9<>ADtemp then cc9 return sample10: ADtemp=AD10 low CS shiftin ADCdata,CLK,msbpost,[AD10\9] high CS AD10=AD10>>1 if AD10<>ADtemp then cc10 return sample11: ADtemp=AD11 low CS shiftin ADCdata,CLK,msbpost,[AD11\9] high CS AD11=AD11>>1 if AD11<>ADtemp then cc11 return sample12: ADtemp=12 low CS shiftin ADCdata,CLK,msbpost,[AD12\9] high CS AD12=AD12>>1 if AD12<>ADtemp then cc12 return sample13: ADtemp=AD13 low CS shiftin ADCdata,CLK,msbpost,[AD13\9] high CS AD13=AD13>>1 if AD13<>ADtemp then cc13 return sample14: ADtemp=AD14 low CS shiftin ADCdata,CLK,msbpost,[AD14\9] high CS AD14=AD14>>1 if AD14<>ADtemp then cc14 return sample15: ADtemp=AD15 low CS shiftin ADCdata,CLK,msbpost,[AD15\9] high CS AD15=AD15>>1 if AD15<>ADtemp then cc15 return '------------------------------ '*** select channels 0-15 of MUX *** select0: low 3 low 4 low 5 low 6 return select1: high 3 low 4 low 5 low 6 return select2: low 3 high 4 low 5 low 6 return select3: high 3 high 4 low 5 low 6 return select4: low 3 low 4 high 5 low 6 return select5: high 3 low 4 high 5 low 6 return select6: low 3 high 4 high 5 low 6 return select7: high 3 high 4 high 5 low 6 return select8: low 3 low 4 low 5 high 6 return select9: high 3 low 4 low 5 high 6 return select10: low 3 high 4 low 5 high 6 return select11: high 3 high 4 low 5 high 6 return select12: low 3 low 4 high 5 high 6 return select13: high 3 low 4 high 5 high 6 return select14: low 3 high 4 high 5 high 6 return select15: high 3 high 4 high 5 high 6 return '------------------------------ '*** check digital inputs 7-14 and send note on/off *** check0: if in7=D0state then check1 'check if changed D0state=in7 'save new state serout 15,12,0,[NOTE,60,VELO*abs(D0state-1)] 'send note on/off return check1: if in8=D1state then check2 D1state=in8 serout 15,12,0,[NOTE,61,VELO*abs(D1state-1)] return check2: if in9=D2state then check3 D2state=in9 serout 15,12,0,[NOTE,62,VELO*abs(D2state-1)] return check3: if in10=D3state then check4 D3state=in10 serout 15,12,0,[NOTE,63,VELO*abs(D3state-1)] return check4: if in11=D4state then check5 D4state=in11 serout 15,12,0,[NOTE,64,VELO*abs(D4state-1)] return check5: if in12=D5state then check6 D5state=in12 serout 15,12,0,[NOTE,65,VELO*abs(D5state-1)] return check6: if in13=D6state then check7 D6state=in13 serout 15,12,0,[NOTE,66,VELO*abs(D6state-1)] return check7: if in14=D7state then do0 D7state=in14 serout 15,12,0,[NOTE,67,VELO*abs(D7state-1)] return