Bob Kinner - Cloud 9 Internet

advertisement
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.]
Download