*** drum.a: electronic drumkit with 68HC11E1 (or 68HC11A1) @8MHz *** Author: Paddy Strebel, Oct-1998. Assembler: AS11.EXE *** drumpad to MIDI converter with RS232 PC interface *** control wheel for custom trigger and metronom function *** bass drum input for one or two foot switches *** hihat input: analog trigger and foot switch *** analog dual trigger inputs (snare/rim, tom1/2, custom1/2) * A small box 112x62x22mm houses five .25inch stereo jack inputs, a MIDI * connector, a potentiometer, a led, a dc-power connector and a 3.5mm * stereo jack for the RS323 interface. A MAX232 chip is used to adapt the * SCI lines of the processor to RS232 levels. The interface may be used * to load new programs to RAM or EEPROM of the 68HC11. * When the 3.5mm jack is unplugged rx is connected to tx (with the switch * in the socket) to run the program from the 512 Byte EEPROM at power on. * The MIDI output is driven from tx over a PNP/NPN pair. A 220R resistor * resistor at the NPN open collector and another to VCC limit the output * current. The control LED is at the PNP collector with 330R to GND. * Pullups of 10k are needed at IRQ, XIRQ, RESET, TX, PA0/1/2 and PA7. * An MC34064 is used as reset controller. MODA and MODB are grounded. * Analog voltage references are connected to VCC and GND. * Piezo trigger inputs have 220kOhm to GND and a diode to VCC to protect * ADC-inputs A0..A6 from overvoltage. A peak detector is realized of a * diode to a grounded 10nF cap and a 680kOhm resistor for decharging. * Pedal inputs have pullups and are switched to GND by the pedal. * Input supply voltage goes over a diode to a 5V regulator. * The control wheel (0..5V at AN7) is split in two zones: The first selects * cymbals, bongos, bells or wood blocks for the custom trigger inputs. The * second adds a metronom click adjustable from around 50 to 120 beets/min. * E * X S S M M * T T T O O V V V A A A A * A R R D D S R R N N N N * L B E A A B S H L 7 3 6 2 * * XTAL 1 AN5 * PC0 AN1 * PC1 AN4 * PC2 AN0 * PC3 PB0 * PC4 MOTOROLA PB1 * PC5 68HC11E1 PB2 * PC6 PB3 * PC7 512 Byte RAM PB4 * RESET 512 Byte EEPROM PB5 * XIRQ XTAL 8MHz (2MCLK) PB6 * IRQ PB7 * RXD PA0 * * T P P P P V P P P P P P P * X D D D D D A A A A A A A * D 2 3 4 5 D 7 6 5 4 3 2 1 * code equ EEPROM code location (RAM or EEPROM) period equ 500 int time (*0.5us), sample time (*1us) trg equ 8 number of analog triggers ped equ 3 number of pedal inputs xnum equ 0*trg midi note number xtim equ 1*trg time since last trigger xsam equ 2*trg current adc result xlas equ 3*trg last sample result xsum equ 4*trg trigger level, trigger lock xvol equ 5*trg minimum volume xdyn equ 6*trg dynamic velocity xloc equ 7*trg retrigger locking pnum equ 0*ped pedal midi note number ptim equ 1*ped pedal low time *** variables: may overwrite initializing code in ram org RAM varbeg equ * aux0 rmb 1 snare drum head aux1 rmb 1 snare drum rim aux2 rmb 1 tom trigger 1 aux3 rmb 1 tom trigger 2 aux4 rmb 1 custom trigger 1 aux5 rmb 1 custom trigger 2 aux6 rmb 1 hihat trigger aux7 rmb 1 metronom rmb 7*trg .. xtim,xsam,xlas,xsum,xvol,xdyn,xloc ped0 rmb 1 bass drum pedal 1 ped1 rmb 1 bass drum pedal 2 ped2 rmb 1 hihat pedal rmb 1*ped .. ptim for each ped scnt rmb 1 scan counter pwrd rmb 1 power up delay (suppress transmit) iflg rmb 1 interrupt flag (inverted by int) dual rmb 1 first of dual trigger pad mtim rmb 2 metronom timer rptr rmb 1 read pointer wptr rmb 1 write pointer varend equ * dbuf rmb 32 transmit data buffer *** this is where the program starts org code lds #$01ff stack ldd #$3cff unused inputs to output staa ddrd d5 low to release tx-rx short stab ddrc all pins of portc unused clr spcr dwom off ldaa #$80 adc power on staa option ldaa #$20 midi xfer rate 31250 baud * ldaa #$30 *** test on terminal: 9600 baud staa baud ldd #$500C 2 stop bits; enable sci std sccr1 acca to sccr1; accb to sccr2 ldaa #$7e write the interrupt vector (jmp) staa toc1vec ldd #toc1int std toc1vec+1 ldaa #$80 enable oc1 interrupt staa tmsk1 ldx #varbeg varinit clr 0,x inx cpx #varend bne varinit ldx #tabbeg ldy #aux0+xvol tabinit ldaa 0,x staa 0,y inx iny cpx #tabend bne tabinit ldd #$232C bass/hihat staa ped0 1st bass ped std ped1 2nd bass ped; hihat ped cli unmask all interrupts dec pwrd loop inc scnt advance scnt ldaa pwrd power up delay elapsed? beq pwrok dec pwrd clr wptr pwrok ldaa rptr tx data available? cmpa wptr beq loop0 ldaa scsr transmitter empty? bpl loop0 rdbuf ldx #dbuf read from dbuf and increment rptr ldab rptr abx ldaa 0,x incb andb #$1F stab rptr staa scdr write to tx buf loop0 ldaa iflg synchronize with int bmi loop0 ldd #$2625 snare/rim (side stick) ldx #aux0 com dual dual trigger (weaker is suppressed) jsr ckdbl ldd #$3230 tom1/tom2 ldx #aux2 jsr ckdbl ldaa #$01 bass1 on PA0 ldx #ped0 jsr ckped ldaa #$02 bass2 on PA1 ldx #ped1 jsr ckped ldaa #$04 hihat on PA2 ldx #ped2 jsr ckped loop1 ldaa iflg synchronize with int bpl loop1 ckmod ldaa aux7+xsam check mode control wheel lsra /2 lsra /4 lsra /8 lsra /16 lsra /32 beq ckmox ckmo0 deca bne ckmo1 ldd #$3C3D bongos bra ckmoz ckmo1 deca bne ckmo2 ldd #$4344 agogos bra ckmoz ckmo2 deca bne metro ldd #$4C4D blocks bra ckmoz metro ldx mtim metronom timer elapsed? beq click dex stx mtim bra ckmox click ldd #$5040 click (mute triangle) jsr noteon ldd #$3000 calculate interval suba aux7+xsam lsrd lsrd lsrd lsrd std mtim ckmox ldd #$3331 ride cymbal/crash cymbal ckmoz ldx #aux4 jsr ckdbl ldaa ped2+ptim hihat control bne hhclos hhopen ldaa #$2E open hihat bra hhend hhclos ldaa #$2A closed hihat hhend staa aux6 ldx #aux6 jsr ckaux jmp loop *** toc1 interrupt routine [about 80 cycles] toc1int ldd toc1 addd #period initialize next oc1 interrupt std toc1 ldaa #$80 reset oc1 flag staa tflg1 com iflg bmi intodd inteven ldd adr1 save results of AN0..3 std aux0+xsam ldd adr3 std aux2+xsam ldaa #$14 start adc on ch4..7 staa adctl bra intend intodd ldd adr1 save results of AN4..7 std aux4+xsam ldd adr3 std aux6+xsam ldaa #$10 start adc on ch4..7 staa adctl intend rti *** check double trigger input note nrs in d, x index to first ckdbl pshx std xnum,x initialize note numbers jsr ckaux first trigger clr dual reset dual trigger flag pulx second trigger = first+1 inx fall through to ckaux *** check aux trigger (indx points to aux record) ckaux ldab xsam,x calculate pos delta subb xlas,x bcc cksto clrb cksto ldaa xlas,x store (last+sample)/2 adda xsam,x rora include carry staa xlas,x ldaa xtim,x already triggered? bne cktrg ldaa xsum,x pshb adjust dynamic retrigger locking ldab xloc,x mul pulb restore pos delta staa xsum,x adda #2 minimum trigger amplitude bcs ckdon sba delta > trig level? bcc ckdon ldaa xvol,x min velocity*2 bra cknex cktrg cmpa #10 end of event? beq ckend ldab dual dual trigger pad? beq ckadd cmpa #8 time to compare with 2nd trigger? bne ckadd ldaa xsum,x cmpa xsum+1,x bcc ckmut clr xtim,x mute 1st trigger rts ckmut clr xtim+1,x mute 2nd trigger ckadd ldaa xsam,x sum = sum + sample*dyn/256 ldab xdyn,x mul adda xsum,x bcc cknex saturation at 255 ldaa #255 cknex staa xsum,x inc xtim,x advance timer ckdon rts ckend clr xtim,x enable new trigger ldaa xnum,x note number ldab xsum,x velocity = sum/2 lsrb fall through to noteon *** midi note on: note in a and velocity in b noteon pshb psha ldaa #$99 * ldaa #' ' *** test on terminal jsr wdbuf pula jsr wdbuf pula fall through to wdbuf * lsra *** test on terminal * adda #'0' *** test on terminal *** write to dbuf and increment wptr wdbuf ldx #dbuf ldab wptr abx staa 0,x incb andb #$1F stab wptr rts *** check pedals (indx points to ped record) ckped anda porta switch closed? beq ckpe0 clr ptim,x ckpex rts ckpe0 ldaa ptim,x inc ptim, saturation at 128 bmi ckpe1 inc ptim,x ckpe1 cmpa #$20 bne ckpex ldaa pnum,x note number ldab #112 velocity bra noteon *** minimum volumes (twice the minimum midi velocity) tabbeg fcb 90 snare head fcb 90 snare rim fcb 90 tom1 fcb 90 tom2 fcb 90 custom1 fcb 90 custom2 fcb 90 hihat fcb 0 none (control wheel) *** dynamic (optimum around 30, depends on xvol) fcb 30 snare head fcb 30 snare rim fcb 30 tom1 fcb 30 tom2 fcb 30 custom1 fcb 30 custom2 fcb 30 hihat fcb 0 none (control wheel) *** retrigger locking: each scan lowers trig level by this factor/256 fcb 204 snare head fcb 204 snare rim fcb 204 tom1 fcb 204 tom2 fcb 204 custom1 fcb 204 custom2 fcb 255 hihat tabend equ * none (control wheel) *** gap for toc1 interrupt vector: needed if code = RAM * org toc1vec+code * nop * nop * nop