This guide/code is for creating a midi controller to digitize an organ, with a guide on how it was installed into a Conn 650 theater organ. The code relies on Circuitpython 8 (tested with 8.0.4), which can be downloaded here, and uses additional libraries downloadable here.
It is assumed that you have some basic knowledge of these chips, if you are unfamiliar with mcp23017, there is plenty of documentation online explaining the wiring, see here
The following parts are needed to build the controller:
Pi Pico
3 full sized breadboards
2 half sized breadboards
14 mcp23017 chips (these can be found cheaper on ebay)
between 6-700 feet of wire (6-700 feet of the wire linked which is two wires wrapped together), I used 20 gauge doorbell wire
buttons for the pedals, I used 7mm tactile buttons
4 2.2k resistors, one attached to sda and scl of the first mcp chip of each i2c lane.
1/16" wood like these
The breadboard layout is pretty simple. the first board should have the pi pico and 3 mcp23017 chips: sda/scl on the first chip should be connected to pins 1, 2 respectively on the pico as shown in the diagram, 13, 12 respectively on the mcp23017. (second from the top left for sda, 3rd for scl as laid out in the diagram)
The second and third boards each have 4 mcp23017 chips:
On the third board, chip 2 starts the new i2c line, sda/scl need to be connected to pins 4, 5 respectively on the pico, 13, 12 respectively on the mcp23017. (second from the top left for sda, 3rd for scl as laid out in the diagram). This wiring was not in the all boards diagram.
The fourth board should be one mcp23017 but itself:
The final 5th board has 2 mcp23017 chips, and was placed behind the expression shoes to lessen the wire lengths running the length of the organ:
The boards will need power/ground as well as i2c lines run between them as shown below:
Hold the bootsel button on the pico and plug it into your computer. drag the circuitpython.uf2 file to the removable drive that shows up. It will disappear, then reappear once the install is done. There should be a folder named lib. From the .zip bundle of libraries copy the folders
adafruit_mcp230xx.mpy
adafruit_bus_device
adafruit_midi
to this folder. Using an editor like Mu that will write files completely on saving, copy the code.py file from this repository to the root of the drive as code.py
some computers may have issues booting with the controller plugged in due to it showing up as a storage device. It slowed the computer I'm using down by quite a bit. Put the following code in a file name boot.py on the root of the controller's drive to disable the usb storage from showing up, once you are sure you won't need to access it again:
import storage
storage.disable_usb_drive()
At this point you can move to wiring the organ
Note there are other ways to do this. Other guides available online show to solder wires to the underside of each keyboard. This could be done by soldering a ground wire to one of the contact rails, and positive wires to the back of one of the thin metal wires that will contact the grounded rail when a key is depressed. The route shown in this guide was picked in order to minimize the amount of time needed to do this install, it is not necessarily the best way to do this by any stretch of the imagination.
It is likely best to start with the bottom manual and work your way up. There is space to stick the breadboards down behind the top manual if you remove a few of the original cards inside the organ.
This project will also use the buttons on each keyboard for presets/cancel and set, and mem+/mem- to change memory levels. Lift up all three keyboards so you can see underneath the keyboard. On the bottom manual, trace the wire bundle that runs off to the right up to the top of the console and underneath the breadboards. Note the wiring color coming from each of the buttons, I've kept notes on color but can't guarantee that all 650s have the same color coding. On our organ the colors were as follows running from 0-5:
brown: 11
red: 12
orange: 14
yellow: 15
green: 16
blue: 17
black: ground on breadboard
Connect these to the pins (actuall pin #s listed see here for the picos pinout.
Then place the manual down and remove all the keys by removing the springs from the back, pressing down on the key and pulling it out.
With the keys removed, look on the bottom of one of the keys and note the rearmost bent metal piece protruding down. You will need this to mark where the wire should be placed to make contact to complete the circuit. place the wood down with some glue (we used super glue), and then mark where the wires should go. Using glue, glue down the wire with a longer stripped end to the board where marked, then run it up to the mcp23017 pins. starting with board four if starting with the lowest manual, look at the top of the rightmost chip and use the bottom second to last (from the right) pin (start at the top key of the manual). Then work leftwards to the end of the chip for the first 7 wires. On the next chip and all others, start 8 in from the right on the top of the chip and work rightwards to the end, then 8 pins right to left on the bottom. You should be getting closer to the pi pico as you complete the pins on each of the mcp23017 units.
Once completed take one of the springs and tie some stripped wire to the end, then use some heat shrink tube to secure it down. Connect this wire to ground on one of the breadboards.
Then reattach the keys and springs. Depress each key and make sure it contacts the exposed wire. If it doesn't reach use a pair of needle nose pliers to push the spring/depressed piece of metal down a bit and recheck.
Repeat for the second manual. To the right of the presets (0-5 buttons), there is a group of three buttons. We used the first two as memory - and +. Colors/pins for these on our console were:
Violet: 9
Grey: 10
Repeat the keys as above, continuing to place wires from where you left off on the mcp23017 chips.
The third manual we used C and S buttons for cancel/set. we cut the wires underneath and spliced as it was much harder to get the wires traced. Pins for these are:
Cancel: 6
set: 7
black wire from each: to ground on breadboard.
Repeat steps as shown for the bottom manual. At this point, run power/ground and SDA/SCL down to the pedalboard. We soldered and heat shrink tubed the buttons for the pedals, and then glued them under the pedal contact on the rear of the organ as shown below: These are wired up in the reverse order of the manuals. Working left to right, insert one wire from each button to the bottom eight, then right to left the top eight of each mcp chip. The other wire goes to ground on the breadboard.
Finally the expression pedals. Remove these from the organ and cut out the wire used. Connect (solder) onto these a positive, output, and ground. On our pedals these were as follows:
ground: second from the top pin
output: third from the top pin
Do this to one of the potentiometers on each pedal, and run the output wire from each back up to the pico. One of these will go in pin 31, the other in pin 32 (the one in pin 31 will be midi controller 1, the other 2 both on channel 16 when setting this up in vpo software).
I reused a computer for this, what's most important is the amount of ram. 2 channel organs often use over 16GB of ram. I have an example build for a new computer and touchschreen on newegg.
I used GrandOrgue though this should be similar to Hauptwerk for setup. For a sample set Freisach was used.
swell manual: midi channel 1 9x note velocity 1-127, notes 36-127
great manual: midi channel 2 9x note velocity 1-127, notes 36-127
choir manual: midi channel 3 9x note velocity 1-127, notes 36-127
pedals: midi channel 4 9x note velocity 1-127, notes 36-127
cancel: midi channel 16, 9xnote value: 60
set: midi channel 16, 9x note value: 61
memory minus: midi channel 16 9x note value: 62
memory plus: midi channel 16 9x note value: 63
presets (all 12 in ascending order 0-5, 0-5): midi channel 16 9x note value: 64-76
expression shoes: midi channel 16 bx controller, controller 1/2, range 127-1
As a note, Grandorgue comes with safe but not ideal defaults. In audio settings you should click on your sound card, then properties, and request a smaller latency. Then you should change buffers per sample to something as low as you can get without audio glitches. Mine is set up for 64 buffers for sample, and a desired latency of 2 (I am using a M-audio usb audio interface. closest made now is this).
This should be all you need to start playing!
You can view the before/after here
CircuitPython and its library bundle are licensed under the MIT License, as is this project. Please the LICENSE file for the full license.
This repo should stay stable for quite a while, but if you find bugs open an issue here on Github so it can be addressed. If you add features that you think are worth adding to the repo please fork the project and issue a pull request. I will look at any requests that come through!