When teaching DIY MIDI controller development I usually recommend using the Arduino platform due to its large user community and the extensive amount of learning resources. However there is a similar hardware platform that is actually better suited and easier to use for building USB-MIDI controllers, which is also more powerful at a cheaper price; the Teensy platform. The only downside of using Teensy compared to Arduino is that there just aren’t as many examples or tutorials in regards to MIDI controller development, therefore I’ve written this tutorial to help overcome this shortcoming and aid in highlighting Teensy as a great hardware platform for the audio/MIDI maker community.
In this tutorial I’m going to show you how to build a simple MIDI controller that consists of 8 retro arcade push buttons for sending MIDI message, as well as a toggle switch for choosing whether the arcade buttons send note message or CC messages. It may seem like this controller has limited functionality compared to commercial MIDI controllers, however this project will serve as a good introduction for developing more complex controllers but without throwing you in at the deep end. Here is a video example of what you’ll be building:
A Teensy-based DIY USB-MIDI controller demo. First the buttons are sending note messages to trigger drums samples, and then the toggle switch is used to set the buttons to send CC messages to trigger effects. This demo uses Ableton Live and the Sugar Bytes Turnado plugin.
Parts list
- A Teensy board. If you’re on a budget get the Teensy LC, else if you think you may want to do more complex Teensy projects in the future I recommend the more powerful Teeny 3.2. Make sure you get a Teensy with pins, unless you fancy soldering them on yourself.
- 8 arcade push buttons (though any large push buttons will work).
- 1 SPST toggle switch
- A solderless breadboard
- An enclosure. This could be any small sturdy box around the house, or a multipurpose project box.
- Hookup wire. Stranded 7/0.2mm would be best, though solid core 1/0.6mm or something of a similar size would also work. Preferably of different colours, but not essential.
- USB Micro-B cable
- Led-free solder (optional)
- 28 pin 0.6” IC socket (optional)
- Stripboard (optional)
Tool list
- Wire cutters
- Wire strippers or scissors
- A tool for making holes in the enclosure. Scissors/craft knife will be fine for cardboard enclosures, however you’ll probably need a Dremel (or something similar) for plastic or wood enclosures.
- Soldering iron (optional)
- Safety glasses (optional)
- Stripboard cutter (optional)
Step 1—Connecting Wire to the Buttons and Switch
First you need to cut 18 pieces of wire; each of a length that will allows buttons inserted into the top of your enclosure to be connected to a place in the bottom of the enclosure, but with a lot of slack so that the inside of the enclosure can be accessed without the buttons being disconnected. It would be preferable for half of the wires to be black and the other half to be of various other colours to make wiring the circuit less confusing, however this is not essential. Then strip about 1-2 cm of plastic off each end of each wire; wire strippers are best to use here however it can also be done with scissors. If you are using stranded wire twist the ends to stop them from fraying.
Next you need to connect a pair of wires to each button and switch so that they can be connected to the Teensy. Each button/switch should have two pins/connectors on the bottom, and this is where the wires need to be connected. If your switch has three pins just ignore one of the side pins. You want to connect one black wire and one coloured wire to each button/switch; the orientation doesn’t matter. To connect them simply twist the metal wire securely around the pin, threading it through the hole if there is one.
Finally I strongly recommend that you solder these wires into place. If you are unable to get hold of a soldering iron and the wires are firmly twisted and connected you may be able to skip this part, however the only way to ensure that the connections won’t become disconnected throughout this project is to solder them. If you’re new to soldering I recommend watching this video to learn how to solder, however it is fairly simple and main involves the following process:
- Add a small amount of solder to the iron tip
- Place and hold the iron tip on the connection/joint you want to solder (in this case the button/switch pin and the wire)
- Touch the end of the solder reel onto the joint, but not the iron tip.
- When the joint is hot enough the solder will melt onto it.
- Lift the solder reel and iron off of the joint a give it a few seconds to dry
Please solder in a well-ventilated area and use safety glasses!
Step 2—Building the Circuit
First lay your breadboard horizontally and place the Teensy on either side but with the USB port facing outwards. Make sure the Teensy is over the middle divider of the breadboard. Next cut and strip a short bit of black wire that is long enough to reach from the Teensy to the blue/black/negative strip along the side of the breadboard. Connect this wire from anywhere on the negative strip to the terminal strip connected to the ground pin on the Teensy—this is the bottom far-left pin if the USB port is on the left, or the top far-right pin if on the right (labeled ‘G’ on the Teensy LC).
Lastly you need to connect all the push buttons and the switch to the Teensy. The toggle switch needs to be connected to digital pin 0 which is next to the ground pin, and then the push buttons to digital pins 1 to 8 that are the following pins on the same side. Connect the coloured wires to the breadboard terminals connected to these pins, and then connect all the black wires to the breadboards negative strip (see below photos).
And that’s the circuit complete. Simple, huh? If you’ve done some electronics before you may have expected that we would need a resistor between each button/switch and the microcontroller, however Teensy boards have built-in pullup resistors on each pin which means no external resistors are needed. This makes circuit building simpler, and is one of the lesser-known advantages of Teensy over Arduino.
Step 4—Writing, Compiling and Testing Code
Now the circuit is complete, it’s time to get the software-side working. To develop for Teensy you need to download and install two pieces of software:
Once both bits of software have been installed complete the following steps:
- Connect the Teensy board to your computer via the USB cable. If it is a brand new Teensy the onboard LED may now be flashing.
- Launch the Arduino application
- Go to File -> New to open a new Arduino project
- Replace all the text in Arduinos text editor with this code
- Go to Tools -> Board and select the specific Teensy board you are using. If you cannot see the Teensy board section go back and make sure you correctly installed Teensyduino.
- Go to Tools -> USB Type and selected ‘MIDI’.
- Go to Sketch -> Verify/Compile, or instead just click on the tick icon on Arduinos toolbar.
- If no errors appear in the console pane at the bottom, the Teensy software window should pop up. If this did not happen and errors appeared, go back to point 1 and carefully follow the instructions again.
- As stated in the Teensy software window, press the button on the Teensy board to put it into Program mode. The LED should no longer be flashing.
- In the Arduino software go to Sketch -> Upload, or instead just click on the arrow icon on Arduinos toolbar.
- If the upload was successful the Teensy software would have shown a progress bar followed by ‘Reboot OK’, and no errors would have appeared in the Arduino console pane.
If you are having trouble getting things working, see the official Teensy ‘getting started’ guide. Also note that when re-uploading code to the Teensy you can skip point 9.
You are now ready to test the circuit. Open up your DAW/MIDI software of choice, connect to the MIDI device called ‘Teensy MIDI’ (or something similar), and start pressing the arcade buttons. Each button should send a different MIDI note or CC message, and when you flip the toggle switch they should start sending the opposite type of message. If some or none of the buttons are working go back over the circuit and make sure all the connections are correct, as well as checking that the wires are securely connected to the buttons.
Step 5—Inserting Electronics into Enclosure
Congratulations! You have just built a working DIY MIDI controller! However right now it is probably a sprawling mess of wires over your desk making it not very playable. To fix this you need to move the circuit into an enclosure and insert the buttons/switch into the top of it.
First you need to make 9 holes in the top of your enclosure to hold the arcade buttons and switch. Arrange the holes for the arcade buttons in two horizontal lines of four with the toggle switch on either side of this. You also need to make a small hole on either side for the USB port.
Next you need to remove the buttons/switch from the breadboard (but remember where they connect to) and insert them into the holes. Your particular arcade buttons will either have a nut or two springy tabs to fasten them to the enclosure, though your switch will most probably have a nut and washer.
Finally you need to insert the breadboard into the enclosure and reconnected the buttons and switch. From left to right and looking at the top of the enclosure, connect the top row of buttons to digital inputs 1–4 and the bottom row to 5–8.
Now close up your enclosure, making sure no wires become disconnected in the process, and your DIY MIDI controller is finished!
Step 6—Moving to Stripboard (optional)
If your new controller is just going to stay on your desk it will be fine to leave it how it is. However, if you plan to take it on the road with you, you may find wires will start becoming disconnected from the breadboard. To prevent this from happening you will need to replace the breadboard with a piece of stripboard that requires all connections to be soldered. See this guide on how to use stripboard. I recommend connecting the Teensy board to the stripboard via an IC socket (28 pin, 0.6” wide) so that the Teensy can be easily removed from the circuit, which allows you to easily replace it if it breaks or remove it for another project if needed.
Conclusion
So that’s how you can make a simple DIY USB-MIDI controller with Teensy and a really simple circuit. With Teensy you can connect a large number of different controls and sensors and create highly complex and customizable MIDI controllers—just take a look at the Teensy projects page to see all the amazing Teensy-based audio and MIDI devices that people have made.
Discussion
Can a dual color LED be hooked up so you know what mode you are in (CC or Note) or can a small LCD display be hooked up to do the same thing?
You'll then need to change the NUM_OF_BUTTONS value in the code as well as other places that this value is used.
The simplest way to use an LED would be to use a single colour LED where 'off' is one mode and 'on' is another, where only 1 digital pin would be needed. A bi-colour or RGB LED could also be used, but involves a more complicated circuit. An LCD display could also be used - see https://www.pjrc.com/teensy/td_libs_LiquidCrystal.html.
Great article. I have created a smaller version of this to control vMix software on my Windows 10 laptop. The buttons work great but I would like to have the LEDs light up using the Tally light outputs in the software. Is it possible to modify this code to receive the tally signals? I am a total newbie when it comes to coding for midi control so any help with code would be awesome....
Thanks in advance.
First of all thank you very much for this awesome tutorial and sorry for my English. I´ve built a 16 arcade button controller and I have upload the code in to my Teensy++ 2.0 but I have a problem. I´m using FL Studio but I´m not getting any sound I don´t know what´s wrong. The programme recognizes the "Teensy MIDI" but it hasn´t any port asigned. I really need some help because I´m a total noob whith DAW programmes.
Again, thank you for the tutorial and for your time.
Thank you for this tutorial.
What I want to do is only two button midi controller.
Scenario:
Talkback controller (SPL 2381) & Logic Pro X.
When I switch ON the Mix button on the SPL, it would enable the certain plugin in Logic and when the Mix button is OFF, it would bypass the plugin. The same goes for 2Tr A button on the SPL controller.
I tested it with other midi controller and it works as expected.
Is Teensy LC enough for my project?
I would also like to know if it is possible to switch between MOMENTARY and TOGGLE mode, or is it Momentary only? (this mode is what I need for my project)
Thank you
Regards,
Roger
A Teensy LC will be more than powerful enough to build a two-button MIDI controller.
As long as you use push buttons (as opposed to toggle switches), the buttons can behave as both momentary and toggling - see https://www.arduino.cc/en/tutorial/switch for an example of how you could implement this in code.
Thank you for explanation.
What is the maximum capacity for buttons on Teensy (In case I will change my mind and also connect other buttons)?
Can't wait to assamble my first micro controller project, though still waiting for Teensy.
Regards,
Roger
The Teensy LC has 27 Digital I/O pins, meaning you can directly connect up to 27 buttons, however there are methods (e.g. multiplexing) of connecting more buttons if needed. Most of the other Teensys contain more pins - see https://www.pjrc.com/teensy/techspecs.html for more information.
Great!
27 buttons will be more than enough.
Thnx.
Cheers
Erin
As Teensy is an Arduino-compatible platform, do a Google search for "Arduino LDR" and you'll find plenty of existing tutorials and examples that will show you how to do this. The main difference from this project is that you'll need to use analog pins to read the LDR inputs.
Hope that helps!
I'm working on my master's thesis right now and part of it is creating a MIDI controller for a software guitar looper made in Pure Data. My concern is that I want it as cheap as possible, so I'm thinking about buying Teensy LC. Question I want to ask is. I want to have 12 buttons that will have basically the same functionality as yours (sending a MIDI value of a note), that would be OK, but also with this I want to have 4 extra rotary potentiometers for adjusting volume. That makes a total of 17 inputs. I read that Teensy LC has 13 analog inputs and plenty of other digital I/O pins (in total around 27 I guess). So fimally my question is. Will Teensy LC be enough for this project or do I need Teensy 3.2 which has 21 analog inputs? I'm new to this and would appreciate any comments on this. Thanks a lot!
Honza.
You'll be able to use a Teensy LC for your project.
If you have a look at the LC pinout diagram at https://www.pjrc.com/teensy/card6a_rev2.pdf, you could use pins 0-11 for your buttons and pins 14-17 (referred to as pins A0-A3 when using them as analog pins) for your pots.
Hope that helps!
I've been trying by my own to make à similar controller.
I just have a problem, once I program the teensy, if I unplug and replug the teensy, impossible to get thé midi messages fromage the teensy.
Have you a solution to solve it?
This project is fantastic. I followed the instructions, and all worked beautifully right away! I know nothing about code, but what you provided was great.
I built a single button version with the toggle switch. I’m using this to control a Leslie speaker effect in my music software.
To expand upon this project, can one use a 3-way blade switch instead of the arcade push button? This type of switch simply connects different circuits together, I think. These are found on electric guitars to switch between the various pickups. Just wondering...
Thanks again.
Bill Congdon
Glad to hear the tutorial was useful to you!
It would be possible to replace the arcade button with a 3-way switch, however the type of switch you use will affect how you need to change the circuit and code. The most common method would be to instead use an analogue input/pin (instead of a digital one) on the Teensy where each switch position creates a different analogue value - do an online search for '3-way switch and Arduino' to see how this can be done with Teensy.
I hope this helps!
Thanx for your good work..
I really need your help,
i’m using Teensy LC for Midi Controller, i uploaded the Sketch, and do = Tool USB > MIDI
And when I’m using MIDI Monitor, looks good, work well,
But when I’m hooking it to a Device (USB or MIDI pin), it’s not working, i mean I think the device doesn’t recognize the Teensy as a Midi controller
What did i do wrong, and what should i do?
Thanx
And if yes, how?
I'm obviously missing some basics here....
Many thanks for a great tutorial - you've given me the confidence to try something similar!
Is it possible to use the toggle switch to change the set of MIDI CC messages rather than switching between CC & note messages? How would I alter your code to achieve this please?
Many thanks!
karinathill
CrackCut.com
Want to join the discussion?
Create an account or login to get started!