A Framework For Making Affordable & Stylish Modular Controllers (USB to MIDI, HID, or Serial)

FeaturedContest Winner
Picture of A Framework For Making Affordable & Stylish Modular Controllers (USB to MIDI, HID, or Serial)




I have designed a framework for making affordable and stylish modular controllers. You can use the content of this Instructable to make a wide range of controllers for a wide range of applications relevant to artists, DJs, VJs, gamers, producers, and the like. The DJ controllers I showcase in this document serve only as examples of (more conventional) interfaces you can create within the framework.

I focused on making this project affordable, stylish, and most important, builder friendly. The controllers can be re-programmed to send serial, MIDI, or HID messages. The modular design allows you to plug the controllers into one another, thus requiring only one USB port on your computer. Each module can have approximately 28 digital inputs/outputs, 23 analog inputs, and 4 rotary encoders. Those more savvy could add components such as touchscreens, sensors, pressure pads, etc., to the controllers using this framework. No special tools or equipment are required to build these controllers beyond a basic soldering iron and wire stripper. Also, very little coding is necessary. Editing the code is more like filling in the blanks.


More info here.

Some hype at engadget.

**Remember to read this entire Instructable before beginning any of the constituent steps**

Remove these adsRemove these ads by Signing Up
1-40 of 257Next »
DougB26 months ago

Very interesting tutorial. I thought the wood enclosures on your controllers were epic.! I made a tutorial on how to make a midi controller as well. My tutorial explains how to make a very simple and easy midi controller. You can find it here if you are interested:

rodrigounda8 months ago

this would be nice for photoshop!

ivmilicevic9 months ago
When will teensy monster be available?
omega9o11 months ago

Would it be possible to add velocity sensative pads?

Fuzzy-Wobble (author)  omega9o11 months ago

Send me the part specs and I can let you know.

s00500 made it!11 months ago

Thanks for your Inspiration!
I've built a single piece controller quite some time ago. I finnaly ducumented it on my website! Check it out!


Bad Ass!

kirkwoodwest11 months ago

How did you get that VU meter to work? what are you using to drive it?

pixel511 months ago
Thank you so much for probably the best tutorial in the world! Great stuff! Lots of info and all. I do have a couple of questions tho: I am planning on attaching an XLR mic to the controller itself (like on pioneer cdj mixer) and found a thing which you can attach the lead to. Im stuck here. Im not sure how to connect the wires and in what way from that into the teensy board to connect it to the pc to use it as a live mic. If anyone could help me out here i would be incredibly thankful! Also I am planning kn attaching an LCD touch screen on an extension on each deck. I found relaively cheap 3.5 LCD touch monitors which should be okay with teensy (i can use arduino if required) in order to either see the wave forms in Traktor DJ (like on Pioneer CDJ). I do not know how I can do this, but I though whether its possible to use that screen to show a part of my pc screen so i can adjust it to show these things. Sounds complicated, but I basically want to use these screens to see whats going on in my DJ software without having to look at my computer. Also another quick question, is it possible to màke a headphone port so I can attach my headphones to it and use these as a pre cue (again like on the pioneer CDJ). All help and comments will be incredibly usefull as I am a complete beginner to this and I am trying to do everything as slowly but as well as possible.
pixel5 pixel511 months ago
Apologies for poor spelling
nbarman11 months ago

Can i use teensy 2 or teensy 3.1 ?

For 14 rotary pot

and 2 encoders

and 18 push button

lenny961 year ago

Hey Fuzzy, my friend and i made a controller but there are some problems: sometimes the jitter extremely and sometimes they are all just on 127. we tested many different things, but we couldnt find the problem. we even tried to make a ground shield against interferences but somehow it only worked for a short period and then it went back like it was before. do you know what the mistake/ problem could be? thanks in advance
btw: your instructable is awesome!
orell and lenny

_1170225.JPG_1170219.JPG_1170166.JPG_1170228.JPGFoto am 15.01.14 um 21.00 #2.jpg
Fuzzy-Wobble (author)  lenny961 year ago
Wow awesome! Nice work.
Others have complained about jitter too. Unfortunately it was an issue I could never replicate. I can probably show you a hack for the code that will help, but best look at your circuit first. Make sure you have a solid ground (laptop power plugged in). Are you running your analog ins through Teensy or the analog mux?

Thank you. Yes we grounded it and even try to make a little shield to prevent interferences. I looked for short circuits or slack joints but i havent found anything. I used quite a lot analog inputs, so we had to use the demultiplexer and all analog inputs. I mostly solved the jittering problem by changing the analogThreshold of the teensy and the mux, but now most of the potentiometers don't work anymore while all digital inputs still work. the analog ins sometime spit out random values and sometimes many inputs appear to have the exact same signal(like they were connected). it appears to be a slack joint or something alike but i tested all connections and they were fine. Do you know what the source of this issue could be?

(and sorry for any writing mistakes, im not a native english speaker)

Fuzzy-Wobble (author)  lenny961 year ago
TeensyMonster is coming out this month:

I will be updating all the documentation and code so everything is super easy to follow and reliable.

If your controller still has issues I suggest switching to the TeensyMonster framework!

still coming out this month? I am in the midst of building my controller and hoping to use this for my project.

The jittering in my controller was due to code issues. These are solutions that helped for me and might help with your problem.

(1) The original version of the code has a mistake with the analog teensy pins. See highlighted part in attached pic. It should be 38,39,40 etc.

(2) It's very important to set the analog pin values to 0 if there's no pots connected to those pins. This should be done for the teensy analogs and the mux analogs.

(3) I deleted the sample LED code. That also caused jitter issues with my controller. If you running your LED's from the Teensy, you can comment out the LED code and check for jitter again.

I'm no pro and this could be some basics that you've checked already, but maybe 1 of these can help.


Here's a few pics of my Virtual DJ based controller. 3 Of my pots on teensy analog pins 0-2 is not working properly. It's giving the same output as pins 0-2 in the mux eg. analog 1 for both pot 2 on the teensy and pot 2 on the mux in the serial monitor. I've got 19 pots - 16 on the mux and 3 on the teensy. Please see my previous post.


I managed to find a solution to my issue. I don't think it's the most efficient solution but it works. I told the teensy that there's 24 analog pins and gave dummy pin values to the first 16 pins. This allowed it to assign values above 15 to the teensy analogs. The mux is using analog 0-15 and the teensy 16-23. See pic.


Please help!!!!!!!!! I'm not to familiar with coding. I have a problem with mapping my analog inputs in Virtual DJ. When I map the Teensy analogs, it gives me CTRL 0 to CTRL 6 and when I map the Mux Inputs, it's CTRL 0 to CTRL15. So the first 7 inputs of the mux and teensy have the same name in the mapping. That means if I turn 1 of the 2 knobs and both is maybe CTRL 3 for teensy and mux analog, it changes 2 controls on VDJ. Is there possibly a way to give the teensy or mux analogs other names or different signals?

commrace1 year ago

great work Mr. Fuzzy. i managed to modify your code for teensy 3.0 but i cannot map encoders in traktor to browse trough list for example.... can you help me please? thank you!!!

AmpOwl1 year ago

How difficult would it be to adapt the code for an Arduino UNO?

Fuzzy-Wobble (author)  AmpOwl1 year ago
very do-able but i would recommend teensy
hilukasz1 year ago

SO sick. thanks for sharing.

Awesome instructable. Started prototyping with an arduino and it only worked once. I've ordered my teensy++ (after stumbling across this instructable) and as you can imagine is very expensive in South Africa. But oh man, this is the best controller for midi projects and easy to setup via arduino IDE. I'm not a DJ, only an electronic enthusiast that accidentally saw an arduino project on youtube 3 months ago. Since then I've ordered a few arduinos to play with. Man, this is so much more interesting than fixing old car radios for friends. I've battled a bit with the jogwheel and browser wheel as this was my first time working with encoders. It was actually working and my issue was in the mapping of the dj software. That was because I did not follow step 4 to check if everything is working. What a waste of time. Nevertheless, I just wanted to know if I can add a 74HC595 shift register for more inputs. I'm about 4 inputs short and would rather do without it, than sell my other kidney to buy another teensy. Also I'm no coder and that is my problem. I can do minor tweeks in the code but would not be able to add the shift register in the code. Anybody please help.
Hallo again Mr.Fuzzy,
now I am really looking forward to some code-updates. I would especially be interested in how the teensy can not only send, but also receive MIDI-signals from Tractor. Example: an LED which lights up, when a Deck is playing. Tracktor can send MIDI-Out-Singnals, but which code do I have to insert where to make the teensy receive this signals? Do you have any experience with it, or do you know where to find soltions? Thanks for your help!
im not into arduino really, but this is a big instructable, thunbs up
jaxter1841 year ago
So my I2C connections aren't working. The master module works in the midi sniffer, but the other ones don't. Here is a picture of the first few lines of the code in each one.

I checked the hardware multiple times, and it turns out I accidentally had the resistors set up to the ground, but it turns out that wasn't the problem.
Was waiting for this tutorial.
Can you please upload the schematic for better understanding?
And waiting for a DJ Vinyl Scratcher Tutorial
Could you point me in the right direction for programing button combinations that trigger separate actions for push buttons?
sunpialia1 year ago
more high quality LED lights at the site
hello again. So i didnt get a bread board. how would you suggest testing my components? All i ordered is the teensy. not the other larger pcb. I am planning on soldering directly to the teensy so I am kind of hesitant to just solder everything then do the coding even though the only buttons im using now are arcade buttons, so simple on/off switches. I plan to use only 0-16 I/O's on the teensy then chaining all the grounds.
Fuzzy-Wobble (author)  nocturnalambition2 years ago
you must have a breadboard for prototyping.

do not solder directly to the teensy unless you are pro and enjoy spending hours de-soldering.

thank you so much for posting this.

So, I have a question regarding the LED Situation. I was wanting color changing LEDs under some clear rim Sanwa buttons. I'm sure that I could get them to light up but I want complete control over every buttons color. for example when I play one song I want this color scheme/template and a different one for a different song. I am basicly just making a midi fighter/mixer. below is what I have been thinking:

8x8 arcade buttons(color changing led on button rims)
8 faders
solo and mute buttons on each fader(leds under each)
2 bus/eq knobs for each fader
8x8 fx knobs
spring loaded mod wheel

what kind of pcb would i need for this? It needs to be mac compatible and plug and play. I guess i'm willing to shell out if i have to considering that this is like 3 controllers in one. Please point me in the right direction master.
Fuzzy-Wobble (author)  nocturnalambition2 years ago
64 arcade buttons? That is a lot. This framework will not support that many inputs. You need to get some i2c i/o expanders (mcp23017) or some shift-registers. Basically that will require lots of custom circuitry and coding.
drsalty2 years ago
Hi there Fuzzy-Wobble!
First off this is a fantastic instructable. I have built a controller and done the coding, but I have one major problem left: how to use it with Ableton live. I haven't been able to work out how to map/script it, so sadly it has sat in the corner for the last few months. I tried a midi sniffer and the messages seem fine. If anyone could help me or point me to a tutorial that would be very much appreciated!
Ps. It's really nice to see that even so long after you released this instructable you still reply to comments.
Fuzzy-Wobble (author)  drsalty2 years ago
Looks like djerk may have the solution you are looking for. I have never mapped to Ableton but I know it is possible. I have seen it done many times.
djerk2 years ago
drsalty, you could try adding the controller manually if ableton's not picking it up.

1. Go to the following directory on your computer: Mac: [Your home folder]/Library/Preferences/Ableton/[your version]/User Remote Scripts/ Windows: [Windows boot drive]/Users/ [your Username]/AppData/Roaming/Ableton/[your version]/Preferences/User Remote Scripts/

2. You should see a UserConfiguration.txt file in this directory. This is the template that you will use to create custom controller mappings for Ableton.

3. Create a new directory under "User Remote Scripts" and name it what you want your controller named in Ableton.

4. Copy the UserConfiguration.txt file in to the new directory for your controller. (make sure to copy and not move, as you may need a clean template later.)

5. Open the UserConfiguration.txt you just copied in to the new controller directory and follow the template to specify what you want each knob/button/slider to control (You will need the MIDI CC data from each control on your controller to configure this file.) *note* defining Macro 1 - 8 is very powerful as you can place your soft synths in instrument racks and define macros for commonly used controls. (controls like: Cutoff, Resonance, Osc Pitch, modulation, Envelope settings, AMP Volume, etc.)

6. Save UserConfiguration.txt Now open Ableton and go back to the MIDI tab in preferences. If you've done everything correctly, you will now notice your custom controller name in the 6 pull downs for Instant Mappings.

Source :
Hi Fuzzy-Wobble,

I'm so glad I've found your instructable, it has been really informative.

I'm currently at University in England, studying a degree in Music Technology. I'm basing my Final Year Project on the creation of a MIDI controller.

So far, I have added a MIDI output to an Arduino Uno (which seems a bad move now, looking at your instructable!) which is then connected to my computer via a MIDI to USB cable. The arduino is programmed to play MIDI notes.

I really like this instructable as I'm no coder. Is it going to be really difficult for me to follow this instructable with an Arduino? I understand your reasonining for not choosing one, but I've overcome the main issue of USB/MIDI now. Do you have any pointers to help me along?

Many thanks again, this instructable and your final products have reinspired me again :)
Fuzzy-Wobble (author)  GirlNamedGoo2 years ago
Heya. You will have to revise the code quite a bit so it works with Arduino. The code is made only for Teensy++ at the moment.

The first controller I made ( was with Arduino and a MIDI shield.
1-40 of 257Next »