(almost) Universal MIDI SysEx CC Programmer (and Sequencer...)




Introduction: (almost) Universal MIDI SysEx CC Programmer (and Sequencer...)

About: I am an arcade, music and arduino enthusiast that love to merge these three hobbies toghether... :D

In the mid eighties synths manufaturers started a "less is better" process that led to barebones synths. This allowed the reduction of costs on the manufaturer side, but made the patching process tediuos if not impossible for the final user.

Manufacturers themselfs and third party companies realized optional boxes full of knobs and/or sliders to let you actually "play" with your synths tones, but these are silly overpriced nowadays and, as always, we are forced to find cheap solutions by ourself ;)

This project came from my need to easily program patches on some of my latest synths buy: a Roland Alpha Juno 2 and JX8P. It started as a simple SysEx controller, then it grow up on me and became something more complex, with other synths supported on the way (Korg DW8000, Oberheim Matrix 6/6R, SCI MAX) and a built-in sequencer.

In this instructable I will show you how to realize your own controller: a cheap tool that emulates those highly priced parameter control boxes... and more (continue reading for details...).

Step 1: What Exactly This Thing Is (and What Is Not...)

The MIDI SysEx and Control Change controller here is essentially a 16 knobs (potentiometers) and 4 buttons MIDI controller. The default sketch handles three "pages", for a total of 48 synth tone parameters.

I made the controller compatible with control change MIDI messages (a simple and "global" type of MIDI message widespreadly used by synth manufacturers especially from the 90's) and SysEx messages (another type of MIDI message, way less general and highly synth-specific heavily used in the 80's).

In particular, the controller by default is compatible with:

- Roland Alpha Juno (1/2)

- Roland JX8P

- Korg DW8000

- Oberheim Matrix 6/6R (> 2.14 firmware)

- Sequential circuits MAX/SixTrak.

You can eventually enable the controller to act on any synth that can receive MIDI control change (CC) messages, but it's disabled by default.

Being the open source nature of the project, it's very easy to support any other synth of your choice (see the code step for details).

The tone parameters layout with all those number could be confusing at first, but it's not "random" as it could look like: it follows the order of the manufacturer MIDI implementation chart. This was a design choice to keep the code simple and "universal".

You can download picture sheets with the 4x4 "layout" I realized for Alpha-Junos, JX8P, DW8000, Matrix 6 and MAX/SixTrak on this page: blue parameters are those you can tweak while on page 1, black those on page 2 and orange those on page 3.

Even if the controller has no screen, toying with synths that show you what parameter is being tuned in real time makes the process of creating a patch a joy. The JX8P and Matrix 6, in example, are capable of this; the Alpha Juno, instead, do not show you the parameter being changed and makes things a little bit harder (but creating awesome patches is definitely doable and easyer than by using the built-in knobless interface); DW8000 has only numeric displays, but you can see your tweakins in real time so it places in between on this.

What about those buttons there?

Well, the first one (upper left in my layout) is for page surfing: jump to the next parameter's page at each press of the button. LEDs will indicate which page you are in.

The second when pressed send the patch you where working on back to the synth (figure it: you made the patch of your life, then touched a program button on the synth surface and the button-specific patch was loaded... all your work have gone!). With this button you can send all the values the programmer had memorized during the last patching process. This patch recall process does not work if you press the randomizer again (randomization process overwrite all the parameters in memory) and it's only effective on parameters you edited at least once. The latest patch is not kept in memory after shutdown.

The third is for a secondary function: the randomizer/patcher! Turn full anticlockwise the knobs you want the parameter they act on to lock to minimum value (i.e. oscillator LFO, oscillator envelope, etc.) or turn fully clockwise to maximise the value (i.e. oscillator mix volume, VCA volume, etc.) and press the button to start he randomization process for all other parameters.

The fourth button is there to activate an easter egg (sort of...) I placed in the code after noticing that the layout was perfect for... a 16 steps MIDI sequencer! Exactly: press the fourth button (MODE button), the controller will enter the "sequencer mode" and you will be allowed to trigger notes in a similar way those old analog sequencer did. Nice uh!

Press the MODE button again to go back to controller/patcher mode.

What about those LEDs?

There are 4 LEDs in corrispondence to each button (on the right of each button in my layout) ; these LEDs have multiple pourpouses:

1) they tell you wich parameters page you are in (upper LED is lit when you are in page 1, LED underneath is lit when page 2 is active, LED 3 is lit... you figured it yourself). We are limited to 3 pages ATM, but the code can be easily tuned to handle more pages;

2) the second LED indicate parameters page 2 AND is lit when the microcontroller is sending the previous patch (patch recall);

3) the third LED indicate parameters page 3 AND is lit during the randomization process.

The fourth LED do nothing in MIDI controller mode and is used for global MODE change.

All these functions are transmitted as MIDI messages, so in order to be effective, your synth must be capable/enabled of receiving and interpret this sort of messages!

Step 2: The "Hidden" 16 Steps Sequencer!

As said, while testing the controller I realized that it would be great to let a sequence of notes run so that I could tweak synth parameters and have a better idea of the final effect on the tone. I have a software sequencer (I like seq24 so much!), but this hardware is an almost PERFECT 16-steps sequencer! Then it was only a matter of code to implement it.

You can toggle between controller mode and sequencer mode by pressing button #4 (MODE button).

While in sequencer mode buttons work differently and LEDs give you new informations:

- the first button (SHIFT button) when pressed allows for tempo, note lenght, channels and octave modification; the tempo value is given by the position of the first potentiometer, the note lenght is computed from the second potentiometer position, MIDI channels from the third and fourth potentiometer positions and octave (-1 o up to +2) from the fifth pot. You can control tempo from 40 BPM (turn potentiometer #1 full counterclockwise while keeping button #1 pressed) to nearly 240 BPM (turn potentiometer #1 full clockwise while keeping button #1 pressed). You can set notes lenght to halfs note, quarter note, eights note, sixteents note by turning pot #2 while keeping the SHIFT button pressed. You can set MIDI channels (primary channel and secondary channel) from 1 to 16. The base notes range (from C2 to F#4) can be lowered of one octave or increased by one or two octaves.

By default tempo is set to 120 BPM and note lenght to quarter notes.

- the second button start and stop the notes sequence. As said, if you change mode by pressing the button #4 (MODE) while running the sequence you will enter controller mode but the sequence will continue to run.

- the third button is a PANIC! By depressing it all notes will be shut off.

- the fourth is used to toggle between global modes (pather or sequencer) when button #1 is not pressed, or between sequence modes (see in the folowing) when #1 is depressed.

In sequencer mode if you press the mode select button while keeping button #1 (SHIFT) pressed you can toggle between 3 different sequence modes:

1 - 16 steps mono sequence

2 - 16 steps poly sequence: notes one octave lower than those defined by pots are triggered too (this drains 2 voices per beat)

3 - 8 steps poly sequence, dual channel: two parallel 8 steps sequencies are sent to two different channels (CH1 and CH2 by default); by setting the same channel value both on the primary and seconday channels you can have two parallel 8-steps sequencies played by the same (polyphonic) synthesizer.

About LEDs: as soon as you enter sequencer mode, all four lights will light up. When you start the sequence, LEDs will follow the sequence (or the sequencies). I placed one LED every four potentiometers and is good enought for me. It would be simple to modify the sketch to handle 16 LEDs, one for each step thou.

The step sequencer miss features someone could find necessary: MIDI sync IN, steps hold (you can only shut a step off), CV out.

I have implemented clock OUT, but is someway buggy. I tried two approaches for this (one with and one without timer interrupts), but they both where imperfect (or a total fail). MIDI clock must be strict-perfect to work on the long term. A clock signal is sent anyway and you can disable it directly on the sketch (see later for details).

Notice that this step sequencer is MIDI, or digital if you prefer, so in order to work must be connected to a synth enabled to receive and interpret these kind of messages!

Step 3: Hardware Needed and Building

After all these words, let have some fun!

We are going the common Arduino way. I used an Arduino MEGA because of the high amount of analog inputs (we want a box full of knobby knobs, won't we?! :) ).

In particular, Arduino MEGA can handle 16 analog inputs (with some hardware tweaking, i.e. by muxing, you can increase this but we are not going this route here), so we are going to send the 48 MIDI messages via 16 potentiometrs. Each potentiometer will then control three parameters, one for each "page"; pages are selected by a switch button.

Hardware list:

- 1x Arduino MEGA

- 16x linear, single turn 10 K ohm potentiometers

- 16x pot knobs

- 4x momentary push buttons

- 4x LED

- 6x 220 ohm resistor

- 1x MIDI connector

- 1x ABS projects box

Some cable, solder wire and six - eight hours of spare time.

I used a perfboard and some pin headers to realize a sort of shield I soldered the resistors on and directed the cables. This has the advantage of letting you take out your Arduino and use it for other projects (we all run low on Arduino boards at some point!). It's not mandatory anyway and another good approach could be to desolder the arduino MEGA pinheaders and solder cables directly in place.

I used 200 ohm resistors in place of 220 ohm resistors and they work perfect anyway; i would bet even 150 ohm resistors would work great (for both MIDI communication and LEDs).

To shape the box, I first applied some adesive paper on the box surface, measured whrere the holes should be drilled (I had 3 cm from hole to hole to let all the pots to fit) made the guide holes and then enlarged to the right size to let pots thread or buttons thread to pass with a mini drill. I spent more or less 2 hours to finish the box. I realized little holes too, and glued LEDs in place.

I also drilled a hole for the MIDI OUT connector and another for the arduino power connector (I used directly the built-in USB power connector and firmly locked the arduino MEGA in place).

WARNING: always ALWAYS wear eyes and hands protections while drilling, whatever material you are working on (plastic, wood, metals, composites... it doesn't matter: you are at risk both with respect to power tools and chips of material eroded/fired from the moving tool).

Then, I placed all the pots and buttons and soldered the components as per attached picture. An effective way to reduce the weight of the final object (and lenght of cables) is to daisy chain all the pots both on the 5V line and GND line.

And before anyone asks: I know, that box I used is ugly! But it was free and nothing beats free :)

Step 4: Wiring

Wiring things up is easy as wiring a potentiometer (x16), a push button (x4) and LED (x4) to an Arduino microcontroller board. All the Arduino basics are covered here :)

Attached is the wiring. Notice that:

- All analog pins are used (from A0 to A15), one for each potentiometer;

- 4 digital pins (inputs) are used (from D51, D49, D47, D45), one for each button;

- other 4 digital pins (outputs) are used for LEDs (D43, D41, D39, D37);

- MIDI out connection is very simple and asks for two 220 ohm resistors (but down to 150 ohm will work)

- Buttons do not ask for pulldown resistors being that the sketch activates the internal Arduino's pullup resistors.

- Each LED asks for a curent limiting resistor (200-220 ohm are ok for green LEDs).

I used the listed digital pins for comodity, but they are not "special" pins (we are not using the pwm capability of some pins here or some other pin-specific feature): you can set your favourite digital pins, but remember to modify the code accordingly or your buttons/LEDs will not work!

Please, notice that the MIDI OUT connection in picture is FRONT view (not rear view).

Step 5: Software - Some Link to Theory

I am not going to explain the full theory behind System Exclusive or Control Change messages because there are plenty of good articles out there and it is silly to rewrite what has already been written.

Just some quick link for Roland SysEx implementation :

- http://erha.se/~ronny/juno2/Roland%20Juno%20MIDI%2... (ENGLISH)

- http://www.2writers.com/eddie/tutsysex.htm (ENGLISH)

- http://www.chromakinetics.com/handsonic/rolSysEx.h... (ENGLISH)

- http://www.audiocentralmagazine.com/system-exclusi... (ITALIANO)

and some link for MIDI in general:

- http://www.music.mcgill.ca/~ich/classes/mumt306/St...

- http://www.music-software-development.com/midi-tut...

Step 6: Software - the Sketch

Here attached is the sketch you should upload to your Arduino Mega.

I tried to keep the programmer as "universal" as possible, meaning that i tried to reduce synth-specific pieces of code.
I tried to keep the code as simple as possible. Adding the step sequencer made things more complex and the code more messy, anyway it was worth it for me. Keeping the code "universal" is why the controller layout is so "random": it follows the parameter order of the MIDI implementation the synth Manufacturer defined in the manual. It could be confusing at first, but you will be used to it very fast.

The default code/sketch/firmware supports "only" 48 parameters (three pages of 16 knobs each) so it could not be possible to control all the MIDI messages supported by your synth (think at an Access Virus or Novation Supernova: they accept more or less 110 MIDI compliant parameters). You can easily change the sketch to support more messages, if needed.

Actually SysEx messages compatible with Roland Alpha-Juno, JX8P, Korg DW8000 and Oberheim Matrix 6 are supported. I left the code for Juno 106 compatible messages in case you are in the need for that.

For Matrix 6, I had to select the parameters to control. I left out the third envelope, the second ramp and something else. The matrix cannot be controlled via MIDI anyway, so it's out too. You need the updated firmware (ver. 2.14 or up) and you should set the "Master -> Sysex Enable" parameter to "3".

Clock out is someway buggy (clock must be strict-perfect to work as it should and probably the two approaches I adopted where not effective). By default it is disabled.

The code includes comments, so there's no need to further comment here.

As always: remember that I am not a coder in real life and for sure there are better ways to code what we are in the need for here. If you are a coder and have suggestion, you are welcome! Please send me any variation that can increase the code's efficiency/effectiveness and I will include it to the main sketch (citing the Contributor obviously!).

I always learn something new by reading some good coder's code ;)

Step 7: Related Projects

As far as I know, there's not a MIDI parameter controller and sequencer out there (maybe the old Behringer BCR2000 with a modified firmware?)

anyway, if you are not prone to realize a box like this but very interested in cheap solutions to control your synth parameters remotely, consider these other alternatives:

- CTRL MIDI editor: this is a brilliant, free open source program running on win/Linux/mac that can turn your PC into a full controller for SysEx synths

- David Konsumer's "junosex" CC converter: this project asks for minor hardware work on your side and the idea is great - an arduino based CC to SysEx converter that let's you use a common non-SysEx MIDI controller (i.e. an AKAI MPK master keyboard) to speak with your SysEx-ready synth

Be the First to Share


    • Pi Day Speed Challenge

      Pi Day Speed Challenge
    • Trash to Treasure Contest

      Trash to Treasure Contest
    • Microcontroller Contest

      Microcontroller Contest



    Question 5 months ago

    Hey nice project! I was wondering how do we combine the midi Cc messages from an external sequencer/midi controller with the messages sent from this controller? Like in terms of wiring? As a synth has only 1 midi in. Was trying to compare this to stereoping and their controllers have midi in and out to pass through the midi messages from the external sequencer.
    Thanks in advance


    Answer 6 weeks ago

    Hello and sorry for the late reply. MIDI IN messages are supported by the firmware, so it is possible to have external MIDI messages entering the box and then reaching the synth. The MIDI IN circuit is documented in other instructables of mine

    Funky Koval
    Funky Koval

    3 months ago

    Hi, after when I found and reading Your idea, this inspire me this for action.
    In yours tutorial was must have be very huge energy, whitch bend me to action, but I'm ultra lazy creature.
    So! This is my version. But right now, i was do only entire structure with hardware inside, without software, rest is work in progress. Will see. Cheers!.


    Reply 3 months ago

    Nice indeed. If you manage to implement SY77 support to the firmware, please share with us so anyone will take advantage of your efforts (as you did with mine, and I did with those of other people before me)

    Funky Koval
    Funky Koval

    Question 3 months ago

    ... and one more thing, is it possible to program your hardware to working as an arpeggiator too?


    Answer 3 months ago

    It could, yes, but it's not implemented in the current firmware. Being the firmware open, in principle you could let it do whatever you want

    Funky Koval
    Funky Koval

    Question 3 months ago

    I am so glad you did this tutorial and thank you very much for it! I have a question, is it possible with this equipment to control in REAL TIME all the synthesis parameters in my YAMAHA SY77?


    Answer 3 months ago

    Hello, Yamaha SY77 is not supported by the current software because unfortunately I don't own a SY77. Anyway, if the synth can receive sysex midi messages (and I know it can) and is capable of real time parameters modifications (not sure about this), the sketch could be modified to support it.


    6 months ago

    First off, thanks so much for this project. I am super happy with this!!
    I was just wondering, I would actually love to implement more controls, in fact I would like to add a pot meter for each control if possible. I know the Adruino MEGA has a limited amount of analog inputs. Would this project work by using a multiplexer to increase the analog inputs?
    Unfortunately I am a noob when it comes to Arduino programming so I do know really know what the code would look like but I am kind of curious to see if this would work in theory?


    Reply 6 months ago

    Glad you found the project useful. Unfortunately, like you have argued, adding inputs calls for multiplexing which asks for a different programming and hardware modification.
    I am sorry


    Reply 6 months ago

    No need to be sorry! Thanks for your reply.

    I am going to try to get this to work with multiplexer(s) and if I can get it to work I will post it if that's ok?


    Reply 6 months ago

    Sure, share your code if you manage to get it working!


    11 months ago on Step 4

    thanks for sharing this, I'm looking forward to building my own! What would be needed to be able to use this with an external sequencer? Would code need to be modded to add midi in?


    Reply 11 months ago

    Hello, MIDI input is still supported by the sketch (incoming note on, note off, control change and pitch bend MIDI messages are passed throught the MIDI out), but you would need additional hardware (the MIDI IN circuit). You can refer to the schematics I have uploaded in another instructables of mine -> https://www.instructables.com/id/Another-MIDI-to-CV-Box-/


    Reply 11 months ago

    for the life of me I cant get the midi in to work. I noticed that there was a "DISABLE_THRU" which I commented and I used RX as my input. Am I missing something?

    Reply 11 months ago

    MIDI in is tested and confirmed working on my prototype so the only thing I can suggest you is to triple check your circuit. Try to swap the two wires coming from the MIDI IN din socket: that's a common error.
    I am sorry I cannot be of more help


    Reply 11 months ago

    Thank you for quick replies. There is nothing wrong with your code, it turns out I had a shorted connection. Thank you again for making such a cool instructable!


    Reply 11 months ago

    Leave DISABLE_THRU uncommented since it disables the library throu and leaves my filter throu active. Be sure che MIDI in channel of incoming messages is the same you defined in the sketch. Write, as an extrema ratio, a simpler sketch that, in example, lights one of the leds if any midi message is received. If you don't know how to do it, I will write it for you next week ;)


    1 year ago

    oh, here's some pics of my build. waiting for the caps still and I need to label stuff but works perfectly!


    Reply 1 year ago

    Nice! It will be even nicer with some old school "analog-like" knobs ;)

    Glad you had it working