Introduction: PICO MIDI SysEx Patcher

About: I like tinkering sooo much people! :)

I have a soft spot for vintage synthesizers. The current music production scene is exciting, don't get me wrong, but I find myself playing with "obsolete" keyboards the most.

One drawback with instruments from the mid 80's is sometimes the lack of programmability. Programming some of them can be tedious, and the fact that third party softwares often do not support SysEx protocol doesn't help.

There are two approaches to face this problem anyway: software (who said Ctrlr?) and hardware.

Needless to say, we are dealing with a hardware solution here.

I have (I think) already boosted the programmability of some iconic instruments from the golden era like Roland a-Juno, Oberheim Matrix 6, Korg DW8000, SCI Multitrack and others with a combi SysEx programmer and sequencer based on arduino MEGA. My recent addiction to the Raspberry Pi Pico microcontroller board made me think back at how to solve the issue.

Raspberry Pi Pico is a cheap and powerful microcontroller and it's my favourite choice, lately. I am adopting it for new projects, but also to revisit some old project of mine.

With IC's memory limits gone (but a limited number of GPIOs) I ended up with something with a very different interface and workflow with respect to the previous project.

Better? Worse? You decide :)

Supplies

Follows the Bill of Materials (BOM):

Microcontrollers, ICs, Display

1x Raspberry Pi Pico (30 GPIO clone)

1x 6N138 optocoupler

1x 1602A LED display

Capacitors, Resistors, and trimmers

3x 220 ohm resistor

1x 330 ohm resistor

1x 10K ohm resistor

2x 1000 ohm trimmers

1x 100nF non polarized capacitor

Diodes and encoders

1x 1N4148 diode

1x 1N4004 diode

2x incremental rotary encoders

Others

2x pot knobs (optional)

1x DC barrel

1x B3F 4050 Omron momentary push button

2x MIDI (DIN 5) connectors

Step 1: Programmer Features

PICO MIDI SysEx programmer main functions are:

  • Built-in LED display
  • Simple operation with only two rotary encoders and a push button
  • MIDI input, for serial operation
  • Open Firmware

Yes, technically those rotary encoders have a built-in push button and actually are-in-use, so the button count is "three", not "one".

The programmer should be placed in between your master controller and the synthesizer you want to create a patch for. This makes possible real time modifications of parameters while playing a sequence and the transfer of any other MIDI message you want to deliver from the master controller to the target synth.

Currently supported synths are:

  • Roland Alpha Juno (1/2)
  • Korg DW8000/EX8000
  • Oberheim Matrix 6/6R (> 2.14 firmware)

As more verbosely described in the next few Steps, the display and the grouping of parameters at software level play a major role in this project. Continue reading for more details :)

Step 2: Hardware Description

Interface

In this programmer I wanted to adopt an opposite approach with respect to the previous project: The interface elements are here kept at a minimum, with only two rotative incremental encoders and a menu button (ok: three buttons).

It may seem a step backward reducing the number of knobs in a programmer born to face the lack of programmability of mid '80s synths. It's not if you consider the sinergy with a firmware where all parameters are reasonably cathegorized (see next Step) and a LED display showing in real time the patch parameter cathegory, name and value.

LED Display

A reasonably sized LED display makes the patching more pleasant, especially if you want to spend time on it. My previous hardware programmer project is equipped with a tiny OLED display. It is enought for that hardware because information displayed are limited to the sequence properties, but in this case all patch parameters names are visible, without the need for a comparison sheet.

Microcontroller

As said, the microcontroller in use is the Raspberry Pi Pico. This microcontroller is powerful both in terms of computational power (up to 133Mhz, dual core) and memory storage (up to 16Mb). That huge - as per today standards - memory allows to include verbose strings in the firmware, makeing the new approach adoptable.

The Raspberry Pi Pico is also cheap, at the moment, soo...

MIDI

Both MIDI IN and MIDI OUT circuits are built-in.

MIDI OUT is mandatory to be able to send MIDI messages and in no way could be left out.

MIDI IN is necessary too, because the synth could not otherwise receive messages from any other instrument (i.e. master keyboard or DAW) when the programmer is connected. This means that patching and sequencing phases would be necessarily separated/distinct. With a built-in MIDI IN circuit you can have both a sequence running and the possibility to modifiy the patch at the same time (i.e. you could send a nice filter sweep in real time).

The MIDI IN circuit is an opto-isolated circuit respecting the MIDI association specifications. Nothing new under the sun.

Power Supply

The SysEx programmer can be powered in two different ways: directly from the USB-C connector of the microcontroller board, or by using the PCB mounted DC barrel. Both are legit, but I woud prefer the latest because:

1- the DC barrel is more robust

2- DC barrel input is directly connected with the PICO's +5V line (the so called "Vsys" pin) which bypasses an internal diode protection in series.

A center positive PSU must be used. Even if a inverse polarity protection diode is there, you don't want to apply inverted polarity because it could damage your PSU (not the programmer because of the diode protection shorting GND and +5V in such situation).

Microcontroller Board

I have already sung the praises of Raspberry Pi Pico microcontroller board. Here I want just add a warning. There exist two versions of this microcontroller board (if we neglect the fact that you can buy it with memory ranging from 2Mb to 16Mb). Here I have been using the 30 pins clone, which has a different pinout with respect to the official Pico. At the moment, the 2Mb version is sufficient.

Step 3: Programmer Parameters Cathegorizations

Scrolling through 30+ parameters in a sequential way (one after the other) is not practical. Nonetheless, this Programmer claims the simplification of the "single data slider" interface of supported synthesizers. How is that?

A possible solution to sight the target was, for me, grouping parameters within cathegories. Cathegorization makes parameters more accessible by reducing their number, and makes it easier to actually locate them.

Cathegorization followed the same principle for all the supported synthesizers and, in my intentions, resembles the typical phisical block structure of our beloved analog synthesizers: oscillators -> voltage controlled filters -> voltage controlled amplifiers. Modulation sources and effects are next (more details in the followings).

Korg DW8000

DW8000 (and EX8000) patch parameters where already layed down well by Korg, so the Programmer cathegorization follows slavishly the front panel grouping.

Parameters are grouped in 8 cathegories:

  • Oscillator 1
  • Oscillator 2
  • Voltage Controlled Filter
  • Voltage Controlled Amplifier
  • Low Frequency Oscillator
  • Wheel
  • Digital Delay
  • Others (portamento)

See Step header sheet for details about subcathegories.

Filter and amplifier have one dedicated envelope each. In this case, envelopes paramenters are grouped withing the voltage controlled element of destination.

All DW8000 parameters are supported, with the exception of MIDI modes/channel.

Roland a-JUNO

Even if the Roland a-Juno has a limited number of patch parameters, their sequence in the MIDI implementation is the most confusing between the supported synthesizer. It took me some time to group the MIDI implementation in a similar way to the front panel sequence (even if not the same).

Mission accomplished, though:

  • Oscillator
  • Voltage Controlled Filter
  • Voltage Controlled Amplifier
  • Envelope
  • LFO
  • Chorus and bending

See Step header sheet for details about subcathegories.

All 36 Roland a-Juno parmeters are supported by the Programmer. The single (assignable) envelope parameters are grouped under a dedicated group.

Oberheim Matrix 6

The Oberheim M6/M6r is the most advanced synthesizer of the lot and features an incredible routing complexity even compared with nowadays instruments.

The time tought us that "complexity" can be a two blades knife in the musical production world, and the absence of direct parameters manipulation possibilities makes the Matrix 6 one of the most underrated "sounds factory" out there in terms of sound engineering.

Of the 99 parameters the synth supports, "only" 52 have been included in the Programmer firmware. I cathegorized them into 9 groups:

  • Oscillator 1
  • Oscillator 2
  • Voltage Controlled Filter
  • Voltage Controlled Amplifier
  • Ramps
  • Envelope 1
  • Envelope 2
  • LFO 1
  • LFO 2

See Step header sheet for details about subcathegories.

I tried to limit parameters to a reasonable number by leaving out of the equation the third envelope, track points, clicks, etc. It would be possible to handle them all, anyway, thanks to the Raspberry Pi Pico memory size.

Parameters not handled by the Programmer are not "disabled", but accessible through the synth panel, anyway!

The Matrix Modulation was too complex to be included, so it was left out.

Step 4: How to Use

At first power on, the synth selection and MIDI channel menu page is displayed.

  • Rotate the LEFT knob (PARAMETER knob) to select which MIDI channel the target synth is listening to.
  • Rotate the RIGHT knob (VALUE knob) to select the synthesizer you want to send your MIDI messages to.

You will need to do this operation any time you reset the Programmer. It is very simple to have the two variables defining the starting synth and MIDI channel permanently changed thanks to the open source nature of the firmware.

Now we can exit menu mode by pressing the "Menu" button. To Change any supported patch parameter:

  • Rotate the left hand rotary encoder (PARAMETER knob) to select the parameter's cathegory of interest (names in the upper part of the LED display)
  • Pess the left hand rotary encoder push button to switch to the actual parameter selection (names in the lower part of the LED display)
  • Select the actual parameter you want to modify by rotating the left hand encoder (PARAMETER knob)
  • Rotate the right hand rotary encoder to the desired parameter value. You can advance parameter values 10-by-10 by pressing the right hand rotary encoder push button

Patch parameter values are MIDI transmitted as soon as the value is changed for "real-time" patching.

Repeat the procedure for any parameter of your interest.

If you want to return to menu screen, simply press the menu button.

Please notice that:

  • Programmer's parameters are all initialized to a value of "zero" when the Programmer is first turned on after a shut down or when you select a different synthesizer in the menu.
  • When a parameter value is changed, that value is kept in memory as long as the Programmer has not been reset or turned off.
  • If you change a parameter value from the synthesizer front panel, the Programmer parameter is not updated (they are not in sync).

>>HERE<< is the sketch repository (Github) with the latest version. Being open source, you are welcome to modify the sketch at your will and fix the bugs (see next Step) ;)

My projects are free and for everybody. You are anyway welcome if you want to donate some change to help me cover components costs and encourage the development of new projects.

>>HERE<< is my paypal donation page, just in case you want to push the development of new projects ;)

Step 5: Sketch Limits/bugs

There is room for major improvements in the current, preliminary, sketch.

In example, we could add a function to save the midi channel and synthesizer instead of having to select it on startup every time the Programmer is turned on. Given the amount of memory still free it would also be nice to support some other synthesizers. It would also be nice to get and store the current patch parameters and have Programmer and synthesizer synced.

I have to report also a couple of annoying bugs in this first iteration of the code. The first time you turn one of the two rotary encoders, a library (I suppose it's the LCD library, but I am not sure) initializes and makes the Programmer unresponsive for some (two or three) seconds. Not a big deal, but annoying.

Another bug is the loss of some SysEx send: every single rotary encoder turn is recorded, but sometimes nothing is transferred to the MIDI out. This is definitely something to fix.


EDIT: Both bugs have now been fixed. Get the latest firmware/sketch >>HERE<< (Github)

Step 6: Acknowledgments

The PCB pictured in this Instructable was sponsored by JLCPCB, a high-tech manufacturer specialized in the production of high-reliable and cost-effective PCBs.

They offer a flexible PCB assembly service with a huge library of more than 350.000 components in stock. 3D printing has "recently" been added to their portfolio of services so one can create a full finished product all in one place!

Their customer service is responsive and helpful and PCBs a great value for the money.

Their contribution in the realization of this project was essential sooo... many thanks! :)

By registering at JLCPCB site via THIS LINK (affiliated link) you will receive a series of coupons for your orders. Registering costs nothing, so it could be a nice opportunity to give their service a try ;)