Introduction: Arcade MIDI Controller

Picture of Arcade MIDI Controller

I'm sure that you have seen those cool videos of people jamming on a box with a bunch of buttons on it. Well, today, I will be showing you how you too can make a box with which you can make jams. 《 Inspired by the MIDI Fighter Classic

Step 1: The Hard Stuff

Picture of The Hard Stuff


16 || 24mm arcade buttons

You may choose the Sanwa variety for quality or the not-Sanwa variety if you're cheap like me and don't mind waiting a month to receive the buttons

6 || 24mm arcade buttons

Of a complimentary colour to match the 〖 a e s t h e t i c s 〗of the other 16 buttons

16 || 2mm LED

I honestly don't know why I picked 2mm LED, the 3mm variety is much more common and don't come in intervals of 100s

4 || 220Ω Resistors (aka computer wire with beads)

For current limiting the LEDs so they don't blow up

1 || Teensy 2.0 microcontroller

Does the buttons to MIDI stuff, you can find them at most electronic stores

1 || 74HC595

Used to control the LEDs

1 || arcrylic enclosure

Feel free to laser cut one out of any 3mm thick material using the provided EPS files, or just get it precut from Ponoko

A Lot || Shrink Tubing aka shrinkydink wrap

The assorted kind is the best.


1 || soldering station

A soldering iron is a inferior, but alternative choice

Some || solder

and flux if you're feeling like it's one of those days

1 || heat gun

For the shrinkydink wrap

Some || glue

acrylic cement, super, gorilla, epoxy, glue gun, or that sorts


1 || multimeter

Used to check if your buttons are working like buttons and other electrical stuff

Some || ribbon cable

Makes connecting the buttons to the Teensy somewhat easier and neater

44 || vinyl double crimps

Makes it a lot easier to attach the ribbon cable to the button leads. I just couldn't find any that was the correct size at Fry's

Step 2: Test the Buttons

Picture of Test the Buttons

As simple as buttons go, it's a good idea to test them to see if they all work.

This is how you can do that:

  1. Set your multimeter to the signal option.
  2. Put each of the multimeter leads to one of the two leads on the buttons.
  3. Press the button.
    1. If beep, your button is indeed a button. Proceed to do this with the rest of your buttons
    2. If no beep, check if your leads are making a good connection
    3. If still no beep, then your button is not a button. Find a replacement button for said not-button.

Step 3: Test the LEDs

Picture of Test the LEDs

Rather be safe than sorry; at least with the buttons, they're relatively easy to replace, but with the LEDs, if you solder them into the matrix and realize one doesn't work, then it'll be sad times.

Step 4: Add the Blinky Things

Picture of Add the Blinky Things

You might have noticed there are little holes next to each of bigger button holes. As you might have guess, they are for LEDs. The original design were intended to for 2mm holes, but if you would like to use 3mm LEDs, feel free to edit the designs so that they'll fit.

  1. Bend the LED as per the picture, the longer lead inline with the LED body and the shorter lead perpendicular to the LED body (with respect to the long side of the LED).
  2. Snip off most of the shorter lead, and solder a resistor to it. Aside from the fact that you need a resistor to limit the current on the LEDs, I also dun goofed and the LED leads are actually 2 mm to short of being able to solder together into a matrix. This is why I used 16 resistors to extend the lead just long enough to solder it to the adjacent LED to form the matrix.
  3. Lay out the LED resistor combo into the holes to form the matrix. Bear in mind, the lead that stick out should be facing the side with more space. I rotated it 90 degrees, which made some of the leads stick out because I can't geometry.
  4. Solder all the resistor rows together.
  5. Slide on shrinkydink wrap on the non-resistor columns.
  6. Solder the non-resistor columns together and heat gun the shrinkydink.

Step 5: Manual Button Insertion

Picture of Manual Button Insertion

After you have assembled all the required parts, it's time to put all the stuff together!

  1. Insert the buttons with the two retention chips are vertical, as per the first picture.
  2. The leads on the back should look like the second picture.
  3. Insert a button in ever other hole. YOU MUST DO IT THIS THIS ORDER!
  4. Fill in the the rest of the holes with the remaining buttons
  5. Make sure all the leads are lined up.
  6. Don't forget to do the side panels too.

Step 6: Button Hookup

Picture of Button Hookup

I'll assume that you are using ribbon cable for this soldering exercise. If you're just using normal gauge wire, just solder a wire to one of the leads on each button, which will go into the Teensy and connect the remaining lead on the buttons together however you like, which will go to the ground on the Teensy.

If you are indeed using a ribbon cable, it is pretty much the same concept, but requires a bit of cable management skills.

  1. Solder one of the pins of each buttons in order of the Teensy pins, skipping over pin 1, 2, and 8 (these will be used for the 74HC595).
  2. Keep track of which button is attached to which pin. It doesn't really matter, so long as long as you write it down somewhere and remember what went where.
  3. Solder all of the second pins of each button together however you like. I chose to wire them out individually and solder blob the ends together. You may choose to do the same, or select a different way to connect them all together.
  4. Take that giant blob and connect it to the ground pin on the Teensy. I used the on programming pin because the other ground pin was underneath one of the panels.

I probably should of taken more pictures for this step.

Step 7: LED Hookup

Picture of LED Hookup

Remember how I told you to save pins 1, 2, and 8 on the Teensy. Well, this is where you find out why.

  1. Hook up pin 1 of the Teensy to pin 11 of the 74HC595. This is the clock line.
  2. Hook up pin 2 of the Teensy to pin 14 of the 74HC595. This is the data line.
  3. Hook up pin 8 of the Teensy to pin 12 of the 74HC595. This is the latch line.
  4. Pretty much follow this Instructable.

You might wanna test the LED Matrix before you solder anything onto it. I didn't do this and I found out one of the LEDs blew...

Step 8: Close the Box

Picture of Close the Box

This is the part where you have to think inside the box, more specifically, it's where the box is put together.

  1. Glue all the sides together.
  2. Glue the Teensy to the bottom panel.
  3. Pop the bottom panel on. You can glue this or just let the tolerance hold it in place. I chose the latter.

Step 9: The Soft Stuff

This is the part where I got kind of lazy (not really, I just have been too busy with other stuff) to write a proper firmware for the MIDI controller. Buttons.ino will allow the controller to be recognized as a MIDI device and you can set it up to work with Ableton or other DAWs. I will update this section with code that animates the LEDs. Sorry...

Step 10: Conclusion

There you have it! You own box of buttons! You can also use it as a keyboard or game controller if you'd like. Maybe for my next project, I'll make one where the buttons light up. Or maybe a unicycle. Who knows? UmamiFish out.


TimG62 made it! (author)2017-04-07

Success :) Made it in clear acryl and also using a teensy++ 2.0 (so no need for a shift register since there are enough GPIO pins for all button and leds)

UmamiFish (author)TimG622017-08-28

This looks great! Nice touch with the teensy++, makes things a lot easier :D

gkal made it! (author)2017-07-18

Great job. I used a leonardo micro and ttapa's MIDI controller library v2.0

UmamiFish (author)gkal2017-08-28

This looks amazing! Nice touch with the wood.

TimG62 (author)2017-04-02

Any tips on how to get the LEDs working with as less code as possible? All pointers appreciated, Thanks!

TimG62 (author)TimG622017-04-07

For anyone else wondering, I used a teensy++ 2.0 (since that has enough pins to handle all buttons and leds), then the following code works (if you respect the pin numbers or change them of course):

#include <Bounce.h>

boolean debugging=false;

int midiChannel=3;

int buttons[16]= {

26, 22, 5, 27,

25, 21, 2, 0,

24, 20, 7, 3,

23, 19, 9, 4


int leds[16] = {






// variables to store values

Bounce *buttonState[16];

// the setup routine runs once when you press reset:

void setup() {

//arcade buttons

for (int i=0;i<16;i++) {

pinMode(buttons[i], INPUT_PULLUP);

buttonState[i]= new Bounce(buttons[i], 5);

pinMode(leds[i], OUTPUT);



// the loop routine runs over and over again forever:

void loop() {

//read buttons

for (int i=0;i<16;i++) {

if (buttonState[i]->update()) {//state changed

if (buttonState[i]->read()==LOW) {//is pressed

midiNoteOnOff(true, i+26*16 + 4);

digitalWrite(leds[i], HIGH);


else {

midiNoteOnOff(false, i+26*16 + 4);

digitalWrite(leds[i], LOW);



}//end loop


// function to handle noteon outgoing messages

void midiNoteOnOff(boolean s, int n) {

if (s) {

if (debugging) {//debbuging enabled

Serial.print("Button ");


Serial.println(" pressed.");


else {

usbMIDI.sendNoteOn(n, 127, midiChannel);



else {

if (debugging) {//debbuging enabled

Serial.print("Button ");


Serial.println(" released.");


else {

usbMIDI.sendNoteOff(n, 0, midiChannel);




gkal (author)TimG622017-07-14

Very elegant code indeed.

If i wanted to create a bank with a pushbutton, press it an release it to go to bank1 and again press it and release to go to bank0 how would you suggest to implement this having a led to view bank0 or bank1?

I am thinking to add an if statement before ..... midiNoteOnOff(true, i+26*16 + 4); and check if i switched to bank1 then send different numbers?

Thank you.

gkal (author)2017-07-07

Great project. Do you think it is possible to use Leonardo pro micro clone instead of teensy?

JohannM12 (author)2017-05-22

it is possible to add 2 faders and 4 knobs?

UmamiFish (author)JohannM122017-05-24

It is possible as long as you have enough inputs on the micro controller. You'd also need to add some code to get that to work. :)

JoshM244 (author)2017-05-18

Does anyone know if this would work with multiple button and led colors? I'm kinda new to things like this. Also, what do the side buttons do? (I don't really know :p)

TimG62 (author)2017-03-21

Awesome work, plan on making this but would need the enclosure plans in a format that works with Inkscape, any chance you can convert? Thanks :)

UmamiFish (author)TimG622017-03-21

I included pdfs now. I hope that works. :)

TimG62 (author)UmamiFish2017-03-21

Thanks :)

mandu0731 (author)2017-01-06

i'm trying a 64 button design, any ideas?

UmamiFish (author)mandu07312017-02-09

You can get an I/O expander or a build a matrix using diodes to accommodate for the extra buttons. In terms of LEDs, you might want to look more reliable ways of driving 64 LEDs. You can also buy chainable LEDs which might make your life a little bit easier.

You can also read the instructions four times :D

PatrickW143 (author)2016-12-26

what should be changed if i replaced teensy with arduino?

UmamiFish (author)PatrickW1432017-02-09

You will probably need some sort of I/O mux or expander (depending on which version of the Arduino you have). You can also look into making a matrix with diodes, which can also solve the issue of not having enough GPIOs.

Lomme (author)2016-06-14

How did you get 16 buttons to work. doesn't it only have 25 I/Os?

UmamiFish (author)Lomme2016-06-14

There's actually 22 buttons on the controller. There just so happens to be enough pins on the Teensy to have each button on an GPIO.

YesItsMeJimmy (author)UmamiFish2016-07-06

How many buttons can be mapped if you don't use the LEDs? I've been researching this like crazy because I'm looking to make a foot pedal midi board. Awesome work btw

UmamiFish (author)YesItsMeJimmy2016-07-10

You could probably fit like 24ish...

Lomme (author)UmamiFish2016-06-14

Why do you have to put the buttons in this order. and what program do you use

UmamiFish (author)Lomme2016-06-14

You don't necessarily have to put the buttons in the order that I did; so long as you keep track of which button is hooked up with which GPIO, you can always just remap the buttons in the code. The code was writing in the Arduino IDE. Any DAW or software that can take in MIDI should work.

Lomme (author)UmamiFish2016-06-14

Ok thanks!

bratan (author)2016-06-18

Great instructable!

I wanted to mention that you really really don't want Sanwa knockoff buttons! Original OBSF-24 buttons have very smooth action and they DON'T CLICK! Cheaper non-sanwa buttons harder to press and they physically click. It's very important for midi controller, as you'll feel difference immediately. I know because I used both and build a larger version controller...

UmamiFish (author)bratan2016-06-18

Thanks! I'm glad you liked it.

Yea, I definitely agree! Santa buttons are definitely the way to go... Similar to mechanical keys used in keyboards, there's definitely a noticeable difference. I mainly used the non-Sanwa buttons because I was cheap and also I was more leaning toward a proof of concept rather than building a solid controller, although I guess the end result was a little more polished than I originally intended it to be.

ReachK (author)2016-06-16

Do you have the updated code for the LEDs yet? I am planning to make the project in the next few weeks. I would like to appreciate you for the work :) and can you tell me how yo upload the code for it to work on the Teensy too? Thanks :)

UmamiFish (author)ReachK2016-06-16

I haven't had time, nor do I think I will have time in the next little bit to update the code for the LEDs, although if you google 74HC595 LED matrix, there's a couple tutorials that are very similar to what I did and should be relatively easy to adapt for this project. As for uploading code to the Teensy, all you need is the Arduino IDE, along with the Teensy Arduino add-on found:

I'll try to update the code as soon as I can :D

ReachK (author)UmamiFish2016-06-16

Ohh and also... is it really necessary for me to change the bounce code? Because i kind of don't get by what you mean. Can you help me with that? Sorry i am kinda new to Teensy :)

UmamiFish (author)ReachK2016-06-17

Here's a good link to what debouncing is:

Although you probably don't need to change the code in this case!

ReachK (author)UmamiFish2016-06-16

Thanks for the reply, much appreciations :D

ed.darby (author)2016-05-21

Nice work! :)

UmamiFish (author)ed.darby2016-05-24


Masterartwork (author)2016-05-19

Thanks for sharing!!

Nice job :)

UmamiFish (author)Masterartwork2016-05-19

Thank you for reading!!

hawk090535 (author)2016-05-17

the top is to use the translucent arcade buttons, so you can put the led inside the box for a better look....good job ;-)

UmamiFish (author)hawk0905352016-05-17

That's definitely an option! The only modification you would need to do is to add light barriers between each button to prevent light leakage between the buttons :D

cradle_n (author)2016-05-16

thanks you edirck

About This Instructable




More by UmamiFish:Arcade MIDI Controller
Add instructable to: