Organ MIDI Project Summary Outline of the Project I have a mid-60’s vintage Rodgers “Trilogy,” model 325: three manual, 32-note semi-AGO (slightly less concave than AGO spec) pedalboard, solid-state discrete component, intended for church use. Like any Rodgers, it was built to last; the analog organ is entirely functional and has needed only a few minor repairs. The guts are getting slightly noisy due to aging capacitors, but otherwise it still sounds good. After obtaining it in 1995, I added a great-to-pedal reversible toe piston (using a flip-flop and SIP relay) and an LM386 headphone amplifier (the console contains only a preamp). Subsequently, a dual 25W amp was added to drive speakers (two very nice Panasonic 3-ways that I got at a thrift store for $19/pair.) Several years ago, I added eight ranks of pipes, with MIDI control, from a disused organ to the toaster at the church where I subbed. The 1976 Allen, a firstgeneration digital organ, was already deteriorating. I suggested the then-popular “Ranks in a Box” to bring it up to date, but that project never happened. That’s where I got the ideas for this project. Last summer, I pulled this project off the back burner and decided to approach it in two phases: MIDIfying the console, and adding the computer. Due to tight funds, I decided – after much vacillating – to keep the analog organ fully functional while adding the MIDI goodies. This resulted in some challenges that could have been avoided had I simply gutted the console, but it also made for a great project. I have a Yamaha DGX300 keyboard which, fortunately, has MIDI support for multitimbral (i.e. each channel can be set independently with patch, bank, volume, effects, etc) input. The initial, and so far only, plan was to use it for set up and testing. It has turned out to be a delight for adding voices to the Rodgers. The long-range plan, on hold for budgetary reasons, is to add Hauptwerk, or more likely MyOrgan, support. Getting it off the Ground I looked at three commercially made keying systems before checking with the members of analogorgans@freelists.org. One of the members (don’t want to mention your name without your consent, but thanks, Ed) strongly recommended that I look at Pete Stark’s “MD1” design. I’ve been a radio amateur since 1970 and was a programmer in a prior lifetime, but the prospect of gathering up parts from various sources and ordering custom-made PCB’s looked a bit daunting. In a moment of temporary insanity (I’m a high school math teacher, so those happen fairly often), I decided to go for it. The cost appeared to be about half that of the most likely commercial system, plus I could customize the programming to fit my project. The PCB’s I’ve built a zillion HeathKits over the years, but have never made my own PCB’s. Using Pete’s “Gerber” files and almost no idea of what I was doing, I ordered them from BareBonesPCBs, fully expecting to receive five pricey but very sturdy bookmarks. Surprise – they were perfect and of very good quality. Per Pete’s recommendation, most of the parts were ordered from Jameco and BGMicro – good service from both, but some came from my old favorite, Mouser. The pots and shaft hardware came from RadioDaze – also good service. I usually use “chisel” tips in my trusty 23W Weller Marksman, but I found that I needed conical tips for the tiny traces on the PCB’s – and .031 solder instead of my more usual .062. I think I went through five tips over the project. Fortunately, R&L Electronics, the world’s best amateur radio store, is located about 15 minutes from where I live, so tips were readily available. Keying The Rodgers keys with -12V. Yes, negative 12V. Fortunately, the diode keyers are reverse biased with the +5V of the TTL logic, so they cooperated nicely. Adding a 2.4k resistor to the 1k pull-up on the shift register gates forms a voltage divider that keep the gate at +5V key-up and very close to 0V key-down. A minor program change was needed for the reversed polarity. I tried drawing the +5V (+2V for the 3TR’s) from the Rodgers power supply. No luck. Drawing from the +12V oscillator supply, playing a chord caused the regulator in the Rodgers power supply to temporarily sag so much that it sounded like an under-winded pipe organ. Drawing from the +28V accessory supply resulted in some toasty – but within limits – 10W resistors and wide voltage swings due to keys and stop tabs being pressed. An 8V, 1.6A transformer from BGMicro ($2.95) did the job with a full-wave bridge of 1N4001’s. Of course, it has two 4700 uF filters from my junk box decoupled by a 5-ohm resistor to keep hum down, but it works like a champ. Typical voltage to the 3TR’s is 8.75-9.5V. Wiring I used 10-conductor ribbon cable since it was easier to route through the organ than the wide stuff. (The Trilogy has three swing-out PCB frames that fill the cabinet almost entirely.) The connections are made to the key side of the keyers rather than to the keyboards; much easier to wire. The MD1 boards are mounted on the back of the outermost frame, which – fortuitously, has the keyers on it. (The inner two boards hold the 158, 85 + 73, variable-inductance oscillators, trems. chiff, etc.) For testing, I built a “smash” consisting of five opto-isolators and a five-input NOR gate that simply jams the MIDI signals together. As expected, the contention was too great and I eventually broke down and bought a MidiSolutions quadra-merge. The smash still functions to combine the pedal and stop/expression outputs. I refused to pay $200 for an octa-merge, considering that the channel traffic for the pedal and stops are both small. A minor problem occurred here, but it’s described below. Keyboard Program I started out with Pete’s original code, but having been an assembler programmer (IBM 360/370) for about 14 years, I couldn’t resist the urge to modify it. He has it set up to allow the bottom 16 key on the keyboards to be used to set the patch, and the top 16 to set the channel. In the original design, the high C was used to switch the code to “patch/channel” mode. I mounted a separate pushbutton on the console to take the place of the high C, called “note 62,” which affects all five boards in various ways. I also programmed the next 16 keys to set the LSB of the “bank” (MSB set to zero) and the remaining 13 keys to set the note-on velocity. Also, selecting channel 16 results in muting the output from that division. “Special key” code: NOTEON LDAA NOTE * CMPA #96 TOP C? CMPA #97 NOTE '62' ? BNE NTON1 NO STAA CPFLAG YES, SET FLAG CLR PATCH CLEAR PATCH MEMORY CLR BANK CLEAR BANK MEMORY BRA ALLOFF ALL NOTES OFF & EXIT NTON1 TST CPFLAG CHECK THE FLAG BEQ NOTEOK NORMAL NOTE ON IF CLEAR * * SUBA #80 CHECK IF CHANNEL CHANGE BHS SWCHAN >=80 WAS YES SUBA #81 CHECK IF CHANNEL CHANGE BHS SWCHAN >=81 WAS YES LDAA NOTE ** ORIGINAL LINE 250 SUBA #LOWNOT CMPA #$F PATCH CHANGE? BLS CHGPAT CMPA #32 VELOCITY CHANGE? BHS CHGVEL CHGBNK SUBA #16 ZERO-BASE THE BANK NUMBER DIGIT LDAB BANK LSLB LSLB LSLB MOVE INTO LEFT NIBBLE LSLB ANDB #$70 ONLY 7 BITS ABA COMBINE W PREV DIGIT STAA BANK LDAA #$B0 CONTROLLER CHANGE CODE ADDA CHANNL BSR OUTEEE CLRA CONTROLLER 0 (MSB) BSR OUTEEE CLRA VALUE = 0 BSR OUTEEE LDAA #$B0 CONTROLLER CHANGE CODE ADDA CHANNL BSR OUTEEE LDAA #32 CONTROLLER 32 (LSB) BSR OUTEEE LDAA BANK BANK NUMBER BRA OUTEEE CHGVEL SUBA #29 CREATE VELOCITY CODE FROM NOTE (32-44) LSLA MULTIPLY BY 8 LSLA LSLA STAA VELOCT NEW VELOCITY RANGES FROM 24 T0 120 RTS SWCHAN STAA CHANNL CHANGE CHANNEL RTS AND QUIT CHGPAT LDAB PATCH LSLB LSLB LSLB MOVE INTO LEFT NIBBLE LSLB ANDB #$70 ONLY 7 BITS ABA COMBINE W PREV DIGIT STAA PATCH LDAA #$C0 ADDA CHANNL BSR OUTEEE PROG CHGE CODE LDAA PATCH BRA OUTEEE AND PATCH NUMBER NOTEOK LDAA #$90 NOTEON CODE ADDA CHANNL BSR OUTEEE NOTEON + CHANNEL LDAA NOTE BSR OUTEEE NOTE NUMBER LDAA VELOCT BRA OUTEEE VELOCITY Muting Code: *OUTEEE LDAB SCSR READ STATUS OUTEEE LDAB CHANNL CHECK FOR CHANNEL 16 CMPB #$0F IF SO, SKIP OUTPUT BEQ OUTSKP OUTLUP LDAB SCSR READ STATUS BITB #$80 * BEQ OUTEEE LOOP UNTIL TDRE=1 BEQ OUTLUP LOOP UNTIL TDRE=1 STAA SCDAT OUTSKP RTS SEND CHARACTER Pedalboard Program Almost identical to the keyboard program except that, since there are only 32 pedals, only the patch and channel change functions are implemented; bank and velocity are not. A problem arose with the smash. As noted below, it outputs a string of stuff with swell pedal changes. This sometimes resulted in pedal note-off’s being lost. To avoid this, an additional array was added that causes additional note-off’s to be sent both four and eight keyboard loops after the original note-off. I’ve had no problem with it since. [In case of a problem, I could always push the “note 62” button, which causes “all notes off” commands being sent.] Redundant note-off code: DATCLR RMB 64 DELAYED NOTE-OFF ARRAY - MUST FOLLOW 'DATA' LDAB #64 ERASE THE DATA ARRAY LDX #DATA LOOP1 CLR 0,X ZERO THE DATA ARRAY CLR 64,X ZERO THE DELAYED NOTEOFF ARRAY SILEUP LDAA 0,X GET THE BYTE LSLA SHIFTIT LEFT ANDA #$7F CLEAR BIT 7 STAA 0,X BNE SHIFTIT THERE ARE BITS STILL ON ** REPEATED/DELAYED NOTEOFF ROUTINE LDAA 64,X PICK UP NOTEOFF ARRAY BYTE BEQ SHIFTIT IT'S ALL ZEROES BITA #$80 IS LEFT BIT ON? BEQ CLRSKP NO BSR NOTEOFF TURN NOTE OFF AGAIN LDAA 64,X RELOAD BYTE CLRSKP LSLA SHIFT ONE LEFT STAA 64,X STORE IN ARRAY BRA SHIFTIT SHIFT REGISTER AND REPEAT SHUTOFF STAA 0,X STORE IT LDAA #%00010001 NOTEOFF ON 4TH AND 8TH PASSES STAA 64,X STORE IT BSR NOTEOFF NOTEOK CLR 64,X CLEAR THE NOTEOFF BYTE LDAA #$90 NOTEON CODE Expression/stop tab program This program started out from the MD1 keyboard program and has been heavily modified. First, the code for patch and channel changes with removed. The stop tabs pull the stop to ground from heaven-knows-what negative voltages. So, instead of the 2.4k voltage divider resistor, each shift register input has a 1N914 diode to ground in case the contact bar on the stop tab hits the negative line before touching the ground. [The shift register IC’s do have a clamp on the inputs, but this is just a safety.] “Note 62” both sends an “all notes off” command and clears the DATA array. Each stop tab generates note-on and note-off commands to channel 12. The velocity is set to 001 so it makes no sound on the Yamaha, and is also not recognized as a note-off (velocity zero). Most of the stop tabs are also recognized to set a patch and bank on their respective channel. Patch/bank code and part of the table: ******** * LOOKUP AND OUTPUT BANK AND PATCH ******** BANDP LDAB NOTE SUBB #LOWNOT BLO BPEXIT SHOULDN'T HAPPEN CMPB #47 IS NOTE IN TABLE? BHS BPEXIT NOPE - TOO HIGH CLRA CLEAR HIGH BYTE OF REG D LSLB MULTIPLY BY TWO ADDD #NOTE01 ADD ADRESS OF TABLE XGDY PUT OFFSET INTO INDEX REGISTER LDD 0,Y PICK UP ENTRY FOR THIS KEY BEQ BPEXIT SKIP IF ENTRY ZERO LSRB LSRB SHIFT CH TO RIGHT NIB OF B LSRB LSRB LDAA #$B0 CONTROLLER CODE ABA ADD CHANNEL BSR OUTEEE CLRA CONTROLLER 0 (MSB) BSR OUTEEE CLRA MSB = 0 BSR OUTEEE LDAA #$B0 CONTROLLER CODE ABA ADD CHANNEL BSR OUTEEE LDAA #32 CONTROLLER 32 (LSB) BSR OUTEEE LDAA 1,Y GET CHANNEL/BANK ANDA #$0F CLEAR CHANNEL BEQ BNKZRO IF BANK = 0, DON'T ADD ADDA #110 ADD OFFSET BNKZRO BSR OUTEEE LDAA #$C0 PATCH CHANGE ABA ADD CHANNEL BSR OUTEEE LDAA 0,Y PICK UP PATCH # BSR OUTEEE BPEXIT RTS * HI BYTE = PATCH; LOW BYTE: HN = CHANNEL, LN = BANK(-110) NOTE01 FDB $1830 CH PICC 2 (NYL GUIT 230) NOTE02 FDB $0000 GT FULL CHR NOTE03 FDB $0C32 NOTE04 FDB $0000 NOTE05 FDB $5933 NOTE06 FDB $0A12 NOTE07 FDB $1933 NOTE08 FDB $0312 NOTE09 FDB $1333 NOTE10 FDB $3413 NOTE11 FDB $3E12 NOTE12 FDB $0000 NOTE13 FDB $1014 NOTE14 FDB $4422 . . . (through note 45) CH NAZ 2-2/3 (MARIMBA 106) GT SW-TO-GT CH FLUTE 4 (DARK MOON 104) GT MIX II (MUSIC BOX 112) CH DULC 8 (12 STRING 033) GT SUPER 2 (HONKY TONK 004) CH GED 8 (CHPL ORGN 025) GT FLUTE 4 (VOCAL ENSMBL 062) GT OCT 4 (SYNTH BRASS 084) SW TREM GT BRDN 8 (THTR ORGN 023) SW OBOE 8 (OBOE 071) Also implemented is expression control using the analog-to-digital converter on the 68HC11 (port E). An additional 10k pot was added to the swell pedal shaft, which only turns through 90 degrees, through a 1k resistor to PE1. This generates controller 1 commands on channel 12 for HW & MyOrgan, as well as controller 7 commands on channels 1-4. The 8-bit DIP switch is used to set the minimum velocity. Expression code: ADCCTL EQU $1030 ADCAD2 EQU $1032 ADCOPT EQU $1039 * ADC CONTROL REGISTER ADC INPUT REGISTER 2 ADC OPTION REGISTER LDAA #%10000000 USE E-CLOCK FOR ADC LDAA #%11000000 USE R/C CLOCK FOR ADC STAA ADCOPT POWER UP ADC LDAA PORTC MIN VEL IS SET BY 8-DIP SWITCH STAA VELMIN HOLD AS VELOCITY ADJUSTMENT STAA VELOCT HOLD AS STARTING VELOCITY JSR CLRDAT CLEAR DATA ARRAY NOVELO LDAA #$01 STAA PORTB LOAD SHIFT REGISTER CLR PORTB TURN OFF LOAD LDX #DATA+64 POINT PAST DATA ARRAY LDAA #LOWNOT ADDA #64 STAA NOTE CURRENT NOTE BEING WORKED ON+1 * START CODE TO READ ADC SWELL LEVEL LDAA #$01 SINGLE CHANNEL, SINGLE READ STAA ADCCTL READ PE1 LDY #ADCCTL ADDRESS OF ADC CONTROL REGISTER ADCWAT BRCLR 0,Y,#$80,ADCWAT WAIT FOR COMPLETION LDAA ADCAD2 GET RESULT ANDA #$7C CLEAR LOW 2 BITS - DEBOUNCE & BIGGER STEPS CMPA VELMIN COMPARE TO MIN VELOCITY BHS VELOK IT'S OK LDAA VELMIN FORCE TO MIN VELOK CMPA VELOCT DID VEL CHANGE FROM LAST TIME? BEQ INLOOP NO STAA VELOCT HOLD NEW VELOCITY ** OUTPUT VELOCITY VIA CONTROLLER 1 LDAA #$B0 MIDI CONTROLLER MESSAG ADDA CHANNL ADD CHANNEL JSR OUTEEE OUTPUT IT LDAA #$01 CONTROLLER 1 (USED BY HW FOR SWELLS) JSR OUTEEE OUTPUT IT LDAA VELOCT VELOCITY JSR OUTEEE OUTPUT IT ** OUTPUT VELOCITY VIA CHANNEL CONTROLLER 7 LDAB #$04 REG B HAS CHANNEL NUMBER VLCHLP DECB DO CHANNELS 4-1 (X03-X00) LDAA #$B0 CONTROLLER CODE ABA ADD CHANNEL NUMBER JSR OUTEEE LDAA #$07 CONTROLLER 7 (CHANNEL VOLUME) JSR OUTEEE LDAA VELOCT JSR OUTEEE VELOCITY CMPB #$00 LAST CHANNEL DONE? BNE VLCHLP And so on… It seems to be working, and I’m tired of tinkering with it – I'd rather be playing the organ. Maybe get around to adding HW/MyOrgan someday. Questions? I’ll be glad to share details, obstacles, solutions, as well as the program code. Just send me an email: mathbob3@fuse.net Bob P.S. Some later thoughts: Organ MIDI Project Miscellany These are just some notes about the operation of this stuff, some features were planned and some just turned out to be handy. The stop tab selection of patch/bank immediately sends the appropriate commands to the Yamaha keyboard, so the last tab drawn on a division is the one that “sticks.” In fact, the tab only needs to be flicked on and off; it doesn’t need to stay on since the patch/bank for that channel will stay set until it is changed again. While the whole organ is expressive, it is possible to keep a solo stop at a constant volume level. The expression (via controller 7) is set only for channels 1-4. Simply set a division for a channel > 4, and not = 12 (stop/expression control for HW or MyOrgan) or = 16 (channel tacit); its patch/bank and velocity can be set from the keyboard. Once set, changing the channel for that division could toggle the division between any of several solo settings. [I’ve considered using the GT-to-PD reversible toe piston as a toggle for this, but I’m out of room in the swell/stops MD1 EEPROM.] Possible project: super-octave couplers for the divisions. [This is something that HW or MyOrgan would provide anyway.] [Pete: Project for you – it would be neat if the boards could communicate with each other maybe like a token ring. I thought about this at the start of the project, actually – for one thing, they could coordinate MIDI sends, eliminating the need for a merge box. Or implement inter-division couplers.]