Pipe Organ Stop Selection Using MIDI
Here is a list of the schemes I have seen for stop selection on MIDI-controlled organs (pipe and toaster). If the terms and concepts involving MIDI are unfamiliar, I highly recommend the information at Jeff Glatt's site.
1. Note outputs
Soon after someone (was it in the early Mesazoic?) first connected a keyboard scanner to an organ manual and a driver to a rank of pipes, he probably decided to do the same for the stop tabs. Why not? When a keyswitch closes, the scanner sends out the MIDI note-on message "9x vv", where "x" is the channel and "vv" is the velocity (non-zero). When the switch opens, the scanner sends a note-off message "8x 00". (Actually many scanners will send a note-on message with zero velocity "9x 00".) One message for "on", one message for "off", neat, eh?
Until someone decides it would be nice to record note-driven stop changes in a MIDI file. MIDI notes are stored as a note value and a time difference (delta) from the previous MIDI event on the same track. The rub is that delta is stored as a 16 bit integral number of "ticks". Depending how the MIDI file is set up, the maximum length of a note is often less than the length of a song. The effect on playback is all of the stops turn on properly at the beginning of a piece, but drop out before the end.
Furthermore, if you are editing a piece and stop it in the middle, all of the notes will be shut off (including your stop control) and they will not turn back on when you re-start the music. Registration changes require lengthening and shortening the stop-change notes needing bizzare calculations of measures, beats, and ticks. A time signature change in the middle of a piece of music makes such calculations nearly impossible.
The only example of notes-for-stop-changes on the web is at the Classical MIDI Organ Stop. He has a number of hymn tunes and Christmas carols recorded from a 2-manual church organ. I have written a CAL program to convert these stop change notes to the control 80,81 format.
2. Program changes
MIDI sound sources (synthesizers) are normally controlled by Program Changes, a 2 byte sequence of the form "Cx yy", where "Cx" and "yy" are hex numbers. The first bytes, Cx, indicates a Program Change on MIDI channel x. The second byte, yy, is a 7-bit voice number, 0-127. A MIDI Program Change causes a sound generator to begin playing one of 128 voices on one channel. Sending a different Program Change ceases playing the first sound, and starts the second.
Pipe organs are philosophically different, turning on more than one "voice" (stop) on one "channel" (manual) is the normal way of doing things. Those pipe organ interfaces using Program Changes add stops as more changes are sent.
A pipe-organ synthesizer from England. Wyvern uses Program Changes to select stops. Sending a Program Change once turns a stop on, sending it a second time turns the stop off. This is basically the scheme used by Aeolian with its Duo-Art organ player in the 1920's. The worst deficiency of the Wyvern implementation is the lack of a General Cancel. Without human intervention, it is not possible to know at the beginning of a piece whether any stops are already drawn.
Each Wyvern installation is individually programmed, so they seem to have no standard Program Change assignment to stop names.
Vicount built a pipe synthesizer module of one manual which used Program Changes to control stops. Program changes 1-16 added individual stops (or combinations of stops) and 17 was General cancel. Viscount now uses a different scheme for its offerings.
3. MIDI Controllers
MIDI Controller messages have the form "Bx yy zz", where "x" is the channel, "yy" is the controller number, and "zz" is the controller value. "yy" and "zz" are 7-bit numbers with values of 0-127. See Jeff Glatt's controller list. Some controller numbers, such as Volume control(7), Pan(10), or Mod wheel(1), are implemented on most synthesizer modules. I suspect many other controllers have never been implemented by any manufacturer.
Several companies have used various controllers to select organ stops. These include Devtronix, Z-tronics, YAPPI, Ahlborn-Galanti, Syndyne, and Allen.
The controllers numbered 102-119 have, apparantly, never been officially assigned any function. Devtronix chose to use these to implement stop changes in their interface. A Devtronix sequence is "Bx nn yz", where "x" is the channel, "nn" is 102 (decimal) + (stop number+36)/8, "y" is the remainder of (stop number+36)/8, and "z" is 0xF (decimal 15) for stop on and 0 for stop off. Devtronix stop change messages are sent to a non-note MIDI channel, so turning on the first stop in the Devtronix sequence might use the message: "B8 6A 4F". Turning it off uses the sequence "B8 6A 40" (stops on channel 9). Stops for Swell, Great, and Pedal are on channel 7 and stops for the Choir stops and couplers are on channel 8. He has some great organ sequences.
Z-tronics originally also used the same scheme as Devtronix, but soon changed to the use of controllers 80,81. Sending the sequence "B8 81 zz" turns on stop "zz" and sending "B8 80 zz" turns off stop "zz". The controllers 80-83 are called "General Purpose Buttons" in the MIDI spec, but are probably not used in any synthesizer. Thus they are a good candidate for stop controls. Since the stop number occupies its own byte, it is easy to recognize when editing a MIDI sequence to change stop registration. Z-tronics allocates channels 1-8 to manuals (numbered bottom keybord to top keyboard), channels 9-12 are reserved for stops, swell controls, etc.
If imitation is the most sincere form of flattery, the YAPPI scheme sincerely flatters Z-tronics by adopting it as well. Two differences are 1) Using 80-81 and 82-83 code pairs to implement 256 stops (including General cancels) and 2) Allowing stop changes to be sent to any MIDI channel. Sending a stop change to channel "x" means a stop will thereafter play notes on channel "x". Any stop may play independently on any channel.
Ahlborn-Galanti has a line of organ sound generator boxes used to supplement pipe organ voices. Ahlborn-Galanti uses Control Code 73 to turn stops on and 74 to turn them off. These are defined in the MIDI spec as "Sound attack time" and "Sound brightness". Ahlborn-Galanti also uses Control Code 92 (Reverb) to control the Tremulant. A value of 0 turns tremulant off, "FF" (127) turns it on. Ahlborn-Galanti seems not to have a General Cancel function.
Syndyne Corporation also sells pipe organ MIDI interface components. They also use Control Code 73 to turn stops on and 74 to turn them off. Using any of the control codes in the range 70 to 89 is probably a safe bet, since they are rarely (if ever) used in real synthesizers.
Classic Organ Works
Classic Organ Works has a MIDI interface which can use control-80,81 codes to turn stops on and off. This is an option selected on the controller and which makes playing files on these organs quite easy. They also have an option to use SYSex messages, which is much more difficult.
Allen Organ Company
MIDI Controllers 98 and 99 are defined as "Non-registered parameters" ("coarse" and "fine"). The terms "coarse" and "fine" simply mean the two control messages are used together to form the halves of a larger number. The Allen Organ Company uses these controllers (plus Control Code 6 [Data Entry]) to control stops on its line of electronic organs.
The Allen stop number gets split into two parts, transmitted in messages 98 and 99. The value with Control Code 98 is (stop number/128) and the value with Control Code 99 is (stop number modulo 128). Allen then sends Control Code 6 with a value of 127 to turn the stop on and 0 to turn it off. Stop numbers come from a Univeral stop list, where a given stop number designates the same sort of stop in each division. Thus stop number 31 in the Great would be "1st Diapason 8'" and 31 in the Pedal would be "Octave 8'"
The sequence to turn on the Great 1st Diapason on an Allen "Classic" organ would be "B1 62 00 B1 63 1F B1 06 7F". "B1" is a control code for channel 2, "62" is the hex value of 98, "1F" is the hex value of 31. Sending this same sequence to channel 3 ("B2") would turn on the Octave 8' in the Pedal.
Allen MIDI channel assignments
1. Swell [Great (3m) Solo (2m)]
2. Great [Accomp]
3. Pedal [Pedal]
4. Choir [Solo (3m)]
5. Solo (4th) [Accomp 2nd touch]
6. 5th Manual [----]
7. ---- [----]
8. General Pistons [General Pistons]
4. SysEx Messages
SysEx (or System Exclusive) messages are a MIDI feature to allow synthesizer manufacturers to create their own control messages of unlimited length and function. Here is a further explanation of SysEx. They were originally intended for memory loads and dumps, but have been used for all manner of control and programming functions. SysEx messages start with "F0" and end with "F7". The second byte in the message is the ID of the "owner" of the SysEx message. A synthesizer maker may register with the MIDI Manufacturers Association to be assigned an ID. This allows a company the right to define exactly the meaning and use of a sequence of MIDI control bytes.
Since MIDI data bytes may only have values from 0-127, and since there are more than 127 makers of synthesizers, a value of 0 in the ID byte indicates two more bytes will follow. The sequence F0 00 00 57 ....F7 indicates the message is defined by Peterson, one of the users of SysEx for changing organ stops.
Peterson Electro-Musical Products, Inc
A complete explanation of the Peterson format may be found on their website
The basic idea is using groups of 4 data bytes (each one having 7 data bits) to represent the status of 28 stops. The pattern of the bits is like a row of 4 groups of 7 stop tabs, where 1's indicate stops on and 0's indicate stops off. Sending out a pattern like "0010001 0100000 0000000 0000000" would turn on 3 stops (and turn the other 25 off). Each group of stop bits is preceded by another byte of seven data bits "0ssssmmm". The lower three bits, "mmm", is the MIDI channel (minus one) to which this set of stop bits applies. The other four bits "ssss" allows 16 different sets of 28 stop bits. Imagine 16 rows of 28 stop tabs each. Then replicate this for each organ division.
Channel assignments for Peterson are:
1. Swell (Solo)
2. Great (Great)
3. Choir (Accomp.)
4. Pedal (Pd/Pd 2)
5. Solo (Bombard)
6. Antiphonal (Accomp 2)
7. Echo (Great 2)
Remember, the "channel" field in the Peterson SysEx message is three bits, taking on the values 0-7, so subtract 1 from the channel number shown above to find the value for the three bits.
Peterson pre-assigns each stop bit to a particular name from its "Universal stop list". The catalog example is: "7. 0.07 4' Octave (Principal)". The first "7." says this is the seventh stop in the Universal list. The next "0." is the value of "ssss" (the so-called "subgroup"). The "07" designates the seventh bit in the group of 28 bits (counting from the left). The remainder is the pitch, name and alternate name(s). Turning on the 4' Octave on the Great requires the following transmission (spread over two lines for clarity):
F0 00 00 57 01 (SysEx start, Mfg ID, "device id"=01)
01 01 00 00 00 F7 (Subgroup 0 + manual 2, bit 7 on, 0,0,0, end of SysEX)
Rodgers Organ Company
Rodgers also uses SysEx messages to change stops, with each bit in the body of the message controlling one stop. Again, think of the message as representing the tab positions of a row of stop tabs. In this case, image a row of stop tabs of 40 groups of 7 stop tabs (40 bytes of 7 bits). A complete message might look like:
F0 41 00 30 12 01 00 10 20 00 00 00 04 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00
00 00 00 00 00 00 3B F7
This message will turn on Diapason 8', Octave 4', and Fifeteenth on the Great and Subbass 16' on the pedal of a Rodgers 790C. These messages are complex enough that people have written programs just to code them.
Classic Organ Works
Classic Organ Workscan optionall use SysEx messages to record the setting of all stops.
It seems the greatest drawbacks of the SysEx schemes are they are obscure and verbose. While you may argue that one SysEx message can change every stop in an organ at once, that same message might be required to only change only one stop. Editing the registration for such a piece of music is not a task I would care for.