DIY MIDI Controller for Ableton Live

In this article, we’ll walk you through building your own controller for music production/performance in Ableton Live!

We'll be turning an Amazon delivery cardboard box into a Hardware controller using 4 knobs, 4 buttons, and a Joystick, with the help of an Arduino Microcontroller, and Ableton’s Max for Live.

Watch this video to learn how, and follow along with the instructions written out below!

What you need

A Breadboard (69 INR)

Arduino Leonardo Microcontroller with USB Cable (749 INR)

4 Resistors (10 INR)

4 Push Button Sensors  (100 INR)

4 Rotary Potentiometers ( 130 INR)

Plastic Knobs for Potentiometers (50 INR)  

XY module (Joystick) (55 INR)  

Ableton Live Standard or Suite (9 or higher)

Arduino IDE (software) 

Du Pont Jumper Cables - Male-Female (60 INR)

Du Pont Jumper Cables - Male-Male (55 INR)

Loose Jumper cables (89 INR)

Amazon Cardboard Box 

2 L Clamps with screws [cheaper to buy from a local hardware shop] (20-30 INR)

Glue gun (170 INR)

Cutting Blade


Prerequisite Softwares on your computer

Once you have the above, we can get started! 

I'll be referring to the Arduino Leonardo MicroController as just ‘Arduino’ for the rest of the article. And One thing to note before we start as it will help with troubleshooting connection issues. 

Breadboard Logic - A breadboard is the construction base on which we lay out all our connections. 
  • For the outer +ve and -ve rows, the signal is internally shared across the pins row-wise.
  •  For the middle section (i.e - a,b,c,d,e rows and f,g,h,i,j rows) signal is internally shared column-wise. Now let's start building our controller.

Step by Step Guide:

A good place to start is by testing if all our equipment works! So we'll start by wiring our sensors while understanding how they work.

Connecting and testing the Sensors 

  • Use 2 Male-Male Du Pont Cables to connect the Arduino’s 5V and Ground (GND) pin to the Breadboard’s +ve and -ve rows as shown below.

This ensures that the power supply is distributed across the rows.

  • Connect a Potentiometer to the Arduino, via the breadboard.

Notice that the outer left & right pins of the potentiometer go the -’ve and +ve rows respectively. Don’t worry if the order is reversed. This basically powers up the Potentiometer.

  • Hook up the middle pin to any one of the six Analog Inputs (A0 to A5). This is the live pin that relays a message to the Arduino Controller, whenever we turn the potentiometer knob, clockwise or anticlockwise.
  • Connect the Push Button to Arduino via the breadboard.

We need 3 jumper wires and a resistor for every button we connect as described below.

  • Wire 1: Connect one terminal of the Button directly to +’ve row on the breadboard. Connect the other terminal.
  • Wire 2: Connect another terminal of Button to the row labelled ‘g’ on the breadboard. Make note of the column number. (here, its column 26).
  • Resistor: Connect one leg of a resistor, on an adjacent pin (row h) on the same column and connect the other leg directly to any column on the -ve row. We can use any resistor of values between 100 Ohms to 10MegaOhms.
  • Wire 3: Connect one end to another adjacent pin (row f) of the same column on breadboard. Other end goes to one of the Arduino’s digital pins - 0 to 13. (digital pin 0).

This ensures that when button is pressed, current flows across the button, and the digital pin should receive an ‘ON’ message.

  • Connect a Joystick to the Arduino, via the breadboard.

Joystick pins from left to right - Ground, 5V, X pin, Y pin, button.

We only need the first 4 pins here. The joystick can be understood as 2 potentiometers mashed up together, one in the X direction and the other in the Y direction. They share a common power supply. Thus, moving the joystick knob can vary the live readings from both X and Y pins.

  • Connect the Ground and 5V pins to the breadboard's power rails just like we did with the potentiometer. Connect the X and Y pins to any two remaining Analog Inputs (here, A1 & A2 as we used A0 for the Potentiometer)

  • Connect the Arduino to your laptop with a USB cable (micro USB to USB Cable for Arduino Leonardo)
  • Run the Arduino IDE software and open the ‘Standard Firmata Code.

  • Upload the code onto Arduino hardware by hitting the Upload button.

Once uploaded, this code will sit inside Arduino's memory. The Standard Firmata code prepares the Arduino to easily communicate with external devices and softwares; in our case we use this to pair with Ableton's Max for live device.

  • Once it is done uploading, start Ableton Live and open the installed Max Connection Kit Pack. Under Devices - Find and load ‘Arduino’ max device onto a track.

The Arduino device is part of the Max for live Connection kit. It has been deviced to communicate with the Arduino inputs and outputs via the serial usb ports, and interact with parameters within Ableton Live!

  • Test the sensors by mapping them via the max for live device!

Here, we see two tabs Analog and Digital. Analog refers to the set of 6 analog inputs on the Arduino Hardware. Digital refers to the set of 14 digital I/O pins.  In our illustration, we had connected the potentiometer to A0, and the joystick pins to A1 and A2 respectively. We connected the Button as digital input 0.

  • Click on the Map button next for the A0 pin.

  • Next, click on any device parameter that you’d like to control. If the connection is assigned successfully, you will see the parameter color greyed out.

This means we can control it with the potentiometer sensor connected to A0 on Arduino, and no longer directly move it. So try moving the potentiometer dial to verify.

  • Do the same with the pins connected to the X and Y inputs of your joystick controller and verify 

Here we used A1 and A2 to map to arpeggiators Rate and Steps respectively.

  • To test the buttons, switch to the digital tab. Click on Map for pin D0 and click a parameter that works like a 2 state button. 

In this case, we assigned it to the track on/off switch. Verify if the track stays on while the button is pressed. 

Once we've tested and understood the connections for our sensors, we can prepare the cardboard housing!   

Prepare the housing

  • Place the cardboard box as shown and cut out the top panel at the left and right edges.

  • Hot glue the lower half of the front panel to the side flaps.

  • Hook a pair of L clamps on either side of the top panel to give it stability. Start by taping the sides, to help the L clamp screws sit properly.

  • Place the L clamp on the inner edge corners and thrust the screws in from the other side. Secure the clamp screws with nuts.

  • On the Plastic takeaway cover, measure and mark positions where we have to cut holes for our sensors.

Be sure not to set them too close as every sensor needs space for wires sticking out of them. 

  • Outline a circular trace with a marker pen matching the form of the respective sensors.  You can use the washers/nuts that come along with potentiometers/buttons to help trace these.  Use a blade to cut along the circular trace and make holes.

The holes to secure the joystick may be too slim for the blade. You can use a ballpoint pen or a screw driver to force tiny openings in the marked positions.

  • Finally, test if all the sensors can actually fit into the openings meant for them. Make adjustments as necessary.

  •  Use the blade to trace against the plastic cutout and make openings in the cardboard box top panel as well. Hot glue the plastic to the top panel of the cardboard box.

  • Use double-sided tape to secure the breadboard and Arduino inside the box.

The Arduino will have to be connected to the USB cable for use, so make sure to stick it appropriately so the cable is easily accessible.

Install all sensors to the housing

  • Push the Button sensors into the top panel openings. If it's too tight try turning clockwise to use the threading and screw it in.

  • Secure them with washers/bolts.

  • Do the same for the potentiometers. Drive it in from the inner side of the top panel.

  • Lock them in from the top side using bolts.

  • Now is a good time to place some fancy knobs on to the sensors.

Before you do place them, turn the potentiometer dials fully anticlockwise, and ensure that the plastic knob’s position indicators align in the same way as you place them.

  • Faster the Joystick to the box using screws.

It helps to pull out the cap for easy access.

  • Make an opening on the front panel adjacent to the joystick. 

This is to make way for the joystick wiring.

Wiring them all up

Now that everything is in place, it's time to wire up our sensors to Arduino via the breadboard. Refer to the first set of instructions under ‘Connecting and testing the sensors’ steps as a guide. The below schematic should give you a clear reference of how all these connections should look like.

  • We start with the power connections - Arduino's ground pin and 5V pin to the breadboard as discussed.

  • Start connecting the buttons

Here we connect the 4 buttons to Arduino's digital input pins 0, 1, 2, and 3 respectively.

For every button, replicate what we did in the test connections parallelly. This means we'll need 3 wires and a resistor per button. Make sure you've cut sufficient lengths on the loose single lead jumper wires, for the 2 terminals on the button. 

  • Connect the 4 potentiometers and the joystick similarly. Here we’re connecting them to A0, A1, A2, and A3 for the potentiometer; A4 and A5 for the joystick's XY pins. 

Your fingers will be swimming in a pool of wires when you're close to finishing!

  • Tape the Joystick wiring on the top panel just to secure them in place.
Securing the connections

It's a good idea to seal the connections firmly so that there are no loose contacts when using your controller. We’d recommend soldering if you are experienced with the skill. For this exercise, using hot glue is the way to go, as it’s easy to make and break.

Unlike soldering, hot glue works with plastic! 

Use hot glue on every connection, on your buttons, potentiometers, joystick, and breadboard.  

Finally, use the USB cable to connect the Arduino to your computer. The Program that you already loaded while testing should still be active, so there's no need to run Arduino IDE software again. Open Ableton, run the Arduino (max for live) device, and start mapping all your inputs to Ableton Live's parameters as we discussed.

That’s about it! 

We hope this article helps you build and play your very own DIY midi controller! Also hope that you learned something about electronics along the way. Let us know if you have any questions or comments about making this in the comments below :)

Humanizing Drums with Greg Tomaz

Producer, DJ & Label A&R - Greg Tomaz is on the forefront of the Indian progressive house scene. His flair for deep progressive & melodic techno leaves a lasting impression which can be heard in his well crafted DJ sets and the music he produces. His production can rightly be described as deep with a definite share of the underground which has him signed on some of the top labels globally such as Juicebox Music, Particles, Soundteller, Stripped Digital, 3rd Avenue etc. to name a few. His aesthetic sense of music has also allowed him the opportunity to share stage time with some of the best artists in this space like Nick Warren, Cid Inc, Cubicolor, Roger Martinez, Dousk, Tim Engelhardt, Ben Coda and the likes.

Greg produces his music on Ableton Live and we had the pleasure to speak to him and get an insight into how he approaches his projects.

“One of the things I focus on most while producing is the groove. Especially for progressive house, this lays the foundation and strengthens the core of the entire track. You can have a killer melody but if your track's groove isn’t tight it won’t make the impact that it should.”

"I use loops as a reference to come up with groove ideas but I don’t like using the loops directly in my tracks. These loops will have some great percussive sounds and rhythm to it but it’s already heavily processed and I may have to re-process them to fit into my track better. If I do this, it will mess with the overall mix of my track. 

What I do instead is to open up another MIDI channel with Ableton’s Drum Rack or Impulse and load up one-shot samples that are similar to the one I have in my reference loop. I then program it exactly like the loop. This allows me to fine tune every sound I use and gives me more flexibility to play around with the rhythm, giving me new results and a better overall sound mix."

"It is also important to have your drums and percussions to sound organic in your arrangement. I play around with velocities and quantization of my midi notes to give it a swing and a more human feel. I also make use of polyrhythms to give it that unpredictability."

If you're not familiar with Polyrhythms, you can learn more about it here -

"Sometimes I also use the groove pool on Ableton to add swing to my percussion and drum loops. This is a super handy feature on Ableton if you don’t want to spend a lot of time adjusting your quantization or velocities manually."

"You can just drag and drop a swing preset from Ableton, preview how the swing works and if you like it, all you need to do is just hit the ‘Commit’ button under the groove settings on your clip.

This is also why I don’t use loops directly on my track as you can’t control or change the velocities, you won’t get the organic feel out of it."

"One of things that I do for percussion hits is this - I select multiple percussion one shots that I like and are in tune with my track, I load it up in Ableton’s Drum Rack. I then add a long reverb on the same channel. On my MIDI clip I start by writing 2 x single notes that fit into my existing groove and duplicate that for 4 bars. I then play the track and rearrange the hits every bar so that each time it hits, it feels like it hits randomly and is a different sound each time. This keeps things unpredictable in your arrangement."

"Another trick I use to come up with ideas for the percussion groove is to load up a lot of samples onto a drum rack and use the Arpeggiator from Ableton’s MIDI effects. This will generate a lot of different ideas, grooves etc. I also sometimes throw in the Random plugin from the Ableton’s midi effects to randomise the hits once in a while. Once I find a pattern I like, I record this into an audio track, play around with the loop till I’m happy with how it fits with the rest of my track."

"While I have all of this going on, I also tweak my Kick drum pattern for every 3 bars. I either add a double kick or remove kicks based on how my groove is going. I do this again to keep things unpredictable and reduce monotony. 

I try to imagine how a drummer would play live and accordingly try to program and sequence my drums. Apply this same concept with the velocity of each note as well and that’s what helps me keep things more organic and humanised."

"As the drums keep changing I also automate my other elements, even the smallest changes will make it feel like the track is growing. This is also something I spent a lot of time on to make sure when I automate that organic feel still stays intact even on all the other elements apart from the drums.

So even if I have a simple chord progression or melody, the track still sounds like it’s evolving with these variations and it doesn’t get monotonous."

"These are the most crucial parts of my production process and why I spend so much time on it. Because if you don’t work on programming your drums and your main elements, it will feel like there are things missing in your track and you’ll keep adding more and more things which you very likely don’t need..."


Huge thanks to Greg for taking the time to do this for us.

If you’ve liked these methods and it has helped you in your own production process, do drop a comment below.

You can follow & listen to Gregs's music on the following links:

Greg Tomaz on Instagram:

Greg Tomaz on Spotify:

Greg Tomaz on Apple Music: