A Different Looking MIDI Controller

In this guide, I'll show you how I built this strange looking MIDI controller. It doesn't look like your typical drumpad or keyboard, but it does have similar functionality just like any standard MIDI controller. It features six capacitive touch pads that trigger MIDI notes. Tap one of the pads, and it plays a note. It also features a step sequencer so you can record and playback a pattern. The 16 NeoPixel ring displays a glowing dot for each step which also follows the beat of a given tempo. It can also change settings, such as pitch, tempo, shuffle, length, velocity and even MIDI channel.

BLE MIDI Drum Machine

This project is based off of Todd Treece's Capacitive Touch Drum Machine. Todd's project uses an Arduino, MPR121 touch capacitive sensor and a strip of 16 NeoPixel LEDs to make a simple drum machine that you can use to control MIDI devices and virtual instruments. This project is built on top of that sketch and adds BLE connectivity. The future is here!

How Does It Work?

The Feather 32u4 Bluefruit LE features the NRF51 chipset which supports Bluetooth low-energy. This means it can act like a HID keyboard, or in our case, send and receive MIDI notes over BLE. The MPR121 capacitive touch sensor features touch detection, so we can connect conductive materials to it. The Feather listens for any touches from the capacitive touch sensor and sends MIDI notes whenever a pin is pulled low or high. 

Capacitive Touch Pads

3D Printed or CNC Milled? If you want to build this project, you have the option of 3D printing the capacitive touch pads using conductive PLA or CNC mill them out of conductive material like 6061 aluminum. The choice is yours! I tried both, and I really like the look and feel of aluminum capative touch pads.

DIY: Make It Your Own

If you don't like the look of this project, but you still like the idea of building your own MIDI controller, you can re-use the code, components and circuit diagram to base your own MIDI controller from. Instead of using a NeoPixel ring, go for a strip. Or fabricate your own.  Don't like the shape or material of the pads? Make your own! Use copper foil tape, bare conductive paint or any electrically conductive material (how about fruits?).

Prerequisite Guides

If you want to build this project, I suggest you walk through the following guides below to get a better understanding of the components and libraries.

Tools & Supplies

You'll need the following tools and supplise to build this project.

Connections

The circuit diagram above shows how the components will be wired together. This won't be 100% exact in the actual circuit but it's a very close approximation. Please note the buttons connected to the capacitive touch sensor do not have to be buttons. They can be any piece of electrically conductive material.

  • Slide Switch to GND and EN pins on Adafruit Feather 32u4 Bluefruit LE
  • VCC from NeoPixel to 3V on Adafruit Feather 32u4 Bluefruit LE
  • GND from NeoPixel to GND on Adafruit Feather 32u4 Bluefruit LE
  • Data In from NeoPixel to #6 on Adafruit Feather 32u4 Bluefruit LE
  • SCL from MPR121 to SCL on Adafruit Feather 32u4 Bluefruit LE
  • SDA from MPR121 to SDA on Adafruit Feather 32u4 Bluefruit LE
  • IRQ from MPR121 to A4 on Adafruit Feather 32u4 Bluefruit LE
  • GND from MPR121 to GND on Adafruit Feather 32u4 Bluefruit LE
  • VIN from MPR121 to 3V on Adafruit Feather 32u4 Bluefruit LE
  • 0-5 on MPR121 to Touch Pads

Battery Power

The circuit will be powered by a 3.7V 2500mAh Lithium ion battery via JST connection. The battery plugs directly into the Adafruit Feather 32u4 Bluefruit LE, which allows had a built-in charging circuit so you can recharge the lipo battery over the microUSB port.

Get Arduino IDE

For this project you will need version 1.6.X of the Arduino IDE with the Adafruit Arduino Board Manager proxy added to your Arduino preferences. If you haven't configured the proxy yet, check out our guide on setting up your Arduino IDE to use the proxy.

Install Libraries

You will need to install a few things using the new Arduino Library and Board Managers. First, open up the Arduino Library Manager under the Sketch->Include Library menu. Select the Manage Libraries... item from the menu.

 

You will need to use the search box to find and install these three libraries:

  • FifteenStep
  • Adafruit NeoPixel
  • Adafruit MPR121
  • Adafruit BluefruitLE nRF51

Install Adafruit AVR Boards

You'll need to installthe Adafruit AVR boards to add support for the Adafruit Feather 32u4 Bluefruit LE. Open the Arduino Boards Manager under the Tools->Board->Boards Manager... menu item. 

Use the search box to find and install the Adafruit AVR boards.

Select Feather Board

Next, select the Adafruit Feather 32u4 board in the Tools>Board menu. Then, under the Tools->Port->Serial ports menu, select /dev/cu.usbmodem (Adafruit Feather 32u4).

Run Example Sketch

OK, now it's time to open the example sketch and upload the code to the Adafruit Feather board. Select nble_neopixel_mpr121 under the File->Examples->FifteenStep menu. Then, click the upload button 

If everything goes as expected, you will see a Done Uploading message at the bottom of the window.

3D Printing Enclosures

I drew up an enclosure in Autodesk Fusion 360 and designed each component so that I could design friction fit mounting points. I 3D printed the enclosure on several 3D printers to test tolerances (Printrbot Play, Flashforge Creator Pro, and Micro M3D).

If you don’t have access to a 3D printer, you could use a service like 3D Hubs to make it for you. I used PLA material to 3D print the parts, and they didn’t require any support material.

The enclosure was 3D printed with Proto-Pasta Aromatic CoffeePLA filament.

Slice Settings

Depending on your 3D printer, you may need to adjust the slice settings. I sliced the parts using Simplify 3D. They do not require any support material and are oriented to print "as is".

  • Nozzle: 0.4mm
  • Extrusion Multiplier: 1.0
  • Extrusion Width: 0.48mm
  • Layer Height: 0.2mm
  • Nozzle Temperature: 220c

3D Printing with Conductive Filament!?

Yes, you can 3D print the pads using conductivePLA, which is a special blend of PLA with conductive particles. Proto-Pasta Conductive PLA filament is relatively easy to print with, and it's electrically conductive :-)

3D Printed Capacitive Touch Pads

If you're 3D printing the touch pads, I suggest you use a 100% infill to increase the conductivity.

Pick Your Tool & Materials

In this project, I used the Othermill Pro desktop CNC from Othermachine to mill the pads out of 6061 1/8" (3.17mm) thick aluminum bar.

If you have access to a different CNC machine, you'll need to generate your own GCODE for milling the touch pads. You can download the Fusion 360 source file and program your own tool paths via the CAM workspace.

If you do have access to an Othermill, you can use my GCODE file in Otherplan and cut them out as is. As long as you have aluminum stock that's about 3.1mm thick, you should be able to cut them out without any issues.

Othermill & Otherplan

I'm going to assume you know how to use the Othermill and Otherplan. So I won't cover that in this tutorial. I will however show you how to setup multiple jobs in Otherplan so you can cut all six pads on a 4" x 4" piece of aluminum. 

Set Material

First, choose "Generic" from the materials dropdown and set your material size. Click on the "Open Files" button to browse for the pad-1-8-alum.nc GCODE file and select it. Click on the dropdown near the file and choose the 1/8in Flat End Mill. Then, click the dropdown near "Placement" and set the Z to "-3.1mm" so the gcode gets positioned on the spoilboard. You can leave the X and Y at zero.

Duplicate Copies

You can add additional jobs to Otherplan to make duplicate copies. It's more efficent to mill several copies instead of milling one at a time. Click open file and select the same pad-1-8-alum.nc gcode. Then, click the dropdown and select the 1/8in Flat End Mill. Click the "Placement" dropdown and make Z "-3.1mm" and X "46mm". Leave Y Zero. 

 

You can repeat this process for the rest of the pads. Make sure to change the position for each gcode file. You can use the screenshot to reference the positions for the other pads.

Secure Material to Spoilboard

I used pieces of Nitto (Permacel) P-02 Double-Coated Kraft Paper Tape to secure the material to the spoilboard. The material should be position square with the lower bottom of the left side of the spoilboard.

Start Milling!

Once the 1/8th aluminum bar stock is secured to the spoilerbed, you can start milling!

Vacuum Swarf!

When the milling is complete, you'll be left with a lot of swarf (material dust).  Use a vacuum to clean up the workarea.

Remove Stock

You can use alcohol to soften the adhesive from the tape. Then, pry the material off of the spoilboard using a spatula. 

Remove Parts from Stock

You'll need to break the parts away from the stock. If there's any burrs or scratchs on the parts, you can buff them out using a polishing wheel and rotary tool.

Milled Parts

And here are the parts!

Test Fit Touch Pads

It's a good idea to do a test fit before wiring anything. If the tolerances are too tight, you can use a filing tool to loosen up those edges on the 3D printed cover. If the tolerances are loose, you can use adhesive, tape or mounting tack to keep the pads in place. 

Parts & Tools

In this portion of the guide, we'll connect the components together. Before we start, be sure to get our workspace cleaned up. Gather up ours tools and heat up the soldering iron. Are you ready? Let's GO!!

Slide Switch

I like to start every project by wiring up the slide switch. We'll need two pieces of wire to connect it to the Adafruit Feather. The length of them should be about the same length of the enclosure (3in or 10cm). It's OK if they're longer because you can trim them short later.

Switch Wired

Before we connect the wires to the switch, it's a good idea to "tin" them. First, remove a bit of insulation from the tips of each wire using wire strippers. To tin a wire, apply the tip of your soldering iron to the wire for a second or two, then apply the solder to the wire. The solder should flow freely onto the wire and coat it. This helps prevent the strands of wire from fraying. Pro Tip: Secure the wires to the grabber of a pair of helping third hands to tin the four tip, one after the other.

Connect Wires to Switch

Now we need to solder the wires to the pins on the slide switch. We only need two of the three pins, so remove either the far left or far right pin (but not the middle pin). Then, tin the remaining two pins with solder. Next, attach the wires to the pins. Apply the tip of your soldering iron to the pin for a second or two, then touch the tip of the wire to the pin. Hold it in place for a second or two to allow the solder to solidify. Repeat this process for the second wire.

Switch for Feather

We'll be connecting the slide switch to the Feather board, but first we need to expand the voltage and ground pins. If we were to connect it now, we'd use up the only ground pin on the Feather. We have several components that need to connect to the voltage and ground pins, so we'll "expand" them by attaching some pieces of Flex PCB.

Flex PCB

This Flex PCB is great for expanding pins. It's basically a thin half-sized breadboard. You can easily cut pieces using a pair of scissors. We'll only need two pieces, each with four available pins. Save the rest for future projects. 

Tin Flex PCB

Tinning the pins on the flex PCB make it a bit easier to attach wires. Handling the flex PCB can be a bit of a hassle. I found using tweezers to hold it and then securing the tweezers to a set of third helping hands works nicely. This way the flex PCB is secured in place while you can solder up the pins. 

Expand Power and Ground

Next, we can attach the pieces of flex PCB to the voltage and ground pins on the Feather. First, cut the pieces in two so they're separated. Tin the 3V and GND labled pins on the Feather. Then, set a piece of PCB over the pin. I recommend handling it with the tweezers. Now apply the tip of your soldering iron to the pin. Once it melts the solder, move the tip away and hold the flex PCB in place until the solder solidifies. Repeat this process for the second pin.

Connect Switch to Feather

Now we can connect the slide switch to the Feather. Solder one wire from the switch to the flex PCB connected to the GND labeled pin the Faether. The second wire from the switch needs to connect to the EN (enable) labeled pin. Once they're connect, we should be able to power the board on and off.

Test Switch & Battery

How about we test out the switch. Grab the battery and plug it into the Feather board. If the board turns on (red LED turns on), try flipping the switch to turn it off and vice versa. If the board stays off or on, the slide switch might be damanged or there's not enough solder. Once we're done testing the switch, disconnect the battery from the Feather board.

Wires for Cap Sensor

Next up, we'll make some wires for connecting the capacitive sensor to the Feather. These wires can be the same length of the enclosure (or same length as the switch wires). We'll need five wires in total. I used different colored wires to help tell them apart, but you don't have too.  

Tin Wires

Once our five wires are cut, it's time to strip and tin them! I managed to secure all five to a grabber on the third helping hands. This saves time from having to secure each wire to the grabber, one by one. Careful not to solder the wires together, though! 

Heat Shrink Tubing

Managing a bunch of wires can be messy. I like to use heat shrink tubing to keep them bundled together. When heat is applied to it, it actually shrinks. Cut a piece of tubing and slip the wires through. Then, use the heating element (NOT THE TIP!!) from your soldering iron to apply heat. The tubing shrinks and tightly holds the wires together. Pretty neat, huh? You can do this for most of the wires in this project.

Wire Cap Sensor

Now we can connect the wires to the capacitive touch breakout board. I secured the PCB to a Panavise Jr to keep it sturdy while soldering in the wires. It's a good idea to tin the pins first. We'll need to connect the wires to VIN, GND, SDA, SCL, and IRQ labeled pins on the board. Doesn't matter which color goes where but I tend to keep them consistent (red for voltage/power and blue for ground).

Connect Cap Sensor To Feather

Next, we'll need to connect the wires from the cap sensor to the Feather board. I kept the cap sensor secured to the panavise and secured the feather to the third helping hands. You can follow the circuit diagram for reference. We'll connect the following things together.

 

  • SCL from MPR121 to SCL on Feather
  • SDA from MPR121 to SDA on Feather
  • IRQ from MPR121 to A4 on Feather
  • GND from MPR121 to GND on Feather
  • VIN from MPR121 to 3V on Feather

NeoPixel to Feather

OK, now we have the cap sensor connected to the Feather. Awesome! Next, let's get that NeoPixel ring connected to the Feather.

NeoPixel Wires

We'll need three wires to connect the NeoPixel ring to the Feather board. They can be the same length as the before (length of the enclosure). Repeat the same process as before, measure, cut, strip and tin all three wires.

Solder Wires to NeoPixel

Next, tin the data-in, 5v power and ground pins on the NeoPixel ring. Then, solder in the three wires.

Connect NeoPixel to Feather

With our NeoPixel wired up, we can now connect it to the Feather board. Make the following connections.

 

  • Data-In from NeoPixel to Pin #6 on Feather
  • 5V Power from NeoPixel to 3V on Feather
  • Ground from NeoPixel to Ground on Feather

Copper Tape

In order to connect the capacitive touch sensor to our "touch pads", we need a way to connect wires to them. I found using copper tape was the most reliable way to do this. This copper tape has a sticky adhesive backing that is conductive, so we can stick it to our touch pads. Cut five short pieces using scissors.

Stick Copper Tape to Touch Pads (CNC Milled Only!)

OK, this next part is specifically for CNC milled touch pads. Since I milled my pads out of aluminum, I can stick the pieces of copper foil to them right away. If you've 3D printed the pads using conductive PLA, DO NOT DO THIS YET! You'll need to connect wires to the copper foil tape first, and then stick them to the plastic pads. I haven't tried, but I'm sure they'd melt if one were to tin the copper with them attached to the plastic pads. Either way, take note of which side the copper tape sticks too. It's the side with the noticeable lip.

Touch Pad Wires

Now it's time to make some wires for connecting the touch pads to the capacitive touch sensor. We have six pads, so we'll need six wires. Again, they can be the same length as before (length of the enclosure). Measure, cut, strip and tin the wires.

Connect Wires to Copper Tape

With our wires made, we can now solder them to the pieces of copper foil tape. I recommend tinning the copper foil first, and then solder the wires to them. If you've 3D printed the touch pads, you'll need to solder the wires to the stand-alone pieces of copper foil tape.

Wired Touch Pads

And now we have wires connected to the pieces of copper tape, yay! If you've 3D printed the pads, now's a good time to stick the pieces of copper foil tape to them. Remember to stick them to the side with the visable lip. Not the side with a flush surface!

Connect Pads to Cap Sensor

Now it's time to connect the wires from the touch pads to the capacitive touch sensor. It doesn't matter which pad goes where, as long as they connect from pins 0-5. If we get them mixed up, we can use a multimeter to determine which pad is connected to pin number 0, 1, 2 and so on.

Final Circuit

And now we have completed our circuit! You can plug in the battery again to see if everything turns on. Though, I wouldn't test out the MIDI functionality yet because the touch pads might be touching (randomly triggering MIDI notes). So let's work on mounting the components to the encosure. On to the next page!

Machine Screws

We'll use machine screws to secure the Feather and capactive touch sensor to the 3D printed enclosure. They can be 4-40 3/8 or M3 sized machine screws. 

Mount Cap Sensor

Let's mount the capacitive touch sensor to the enclosure. First, I suggest tapping the holes on the enclosure using the machine screws. That way we can create threads in the standoffs. This will make it easier to fasten the screws through the enclosure and PCBs.

 

Fasten two screws into the enclosure about half way, until the tip pokes through the standoffs. Then, grab the cap sensor PCB and lay it over the standoffs so the screws are lined up with the mounting holes. Hold the PCB in place while fastening the two screws until their flush with the surface of the enclosure.

Mount Feather

Now we can mount the Feather board to the enclosure. We're basically going to repeat that process for the Feather. The microUSB port from the Feather should be pointing towards the cutout on the enclosure.

Mount Switch

Next up, let's mount the switch to the enclosure. No screws necessary. There's a little spot dedicated for the slide switch. Insert the switch in between the walls at an angle and press in to snap into place. The body of the switch should have a friction fit in between the walls. There's also a third "wall" that keeps the body of the switch in place. The actuator from the switch will protrude from the cutout. 

Connect Battery

Now is a good time to plug in the battery to the Feather board.

Install NeoPixel to Cover

The NeoPixel ring will be mounted to the cover of the enclosure. Two circular rings will hold the PCB. Place the NeoPixel ring into the circular holder and press it in. The PCB will have a semi-snug fit. We can secure it in place using a number of methods. Glue or tape is probably fine but I ended up using mounting tack. 

Install Touch Pads to Cover

OK, now we can work on installing the touch pads into the cover. To do this, start by inserting one pad through the cutout on the cover from the bottom. Then, orient the pad so the lip (or the side with the flush surface) rests on top of the cover. This way, when you press down on the pad, it doesn't pop out of the cover. It may or may not have a tight fit. Some of the tolerances differ due to the nature of 3D printing. Repeat this process for all six pads. 

Matching Pads with Pin Numbers

It's a good idea to match the pad with the pin numbers on the capacitive touch sensor. Pad 1 should be with Pin #0, pad 2 with pin #1, and so on and so fourth. The goal here is to order the pads so they're chronological with the pin numbers on the capacitive touch sensor.

If we can't determin which pad is connected to which wire, we can use a multimeter to find out. Use the continuity mode on the multimeter. Then, stick one probe to a pin number, and the other to one of the pads – you'll hear an audible "beep" when there's an electrical connection.

Installed Touch Pads

OK, now we should have all six touch pads installed into the cover. Now is a good time to double check the order of the pads. Make sure they're consistent, chronological, all that jazz.

Secure Pads and NeoPixel

Now that we have our NeoPixel ring and six touch pads installed into the cover, it's a good idea to secure them in place. Again, theres more than one way to skin a... never mind! So you could do this with hot glue, E6000 or tape. Whatever you have on hand. I personally used mounting tack. I like it because I can always remove it later without leaving behind a mess. But the goal here is to keep the components from coming out of their spots. Since 3D printing tends to have variable tolerances, the parts might pop out of place unless there's something holding it in place.  

Install Battery

Let's go ahead and place the battery into the enclosure. It can rest on top of the components. You might think this might damage the components or wiring but, honestly I haven't experienced any issues. As long as you don't shake the enclosure ferociously, I think it'll be OK. There's also plent of room in the enclosure for some sort of cushioning, like papper or cotton? If you're worried about puncturing the lipo battery, you can wrap it in gaffers tape for extra protection. Or maybe use a AAA battery pack? Not sure that would fit. Options!

Install Cover

OK now for the last step. Let's fit the cover over the enclosure. The indentations on the lip of the cover snap fit into the nubs on the inside edge of the enclosure. You'll need to apply some press to get them to snap together. Fitting the cover at an angle might be helpful. Once you get all six edges shut, you should have a really tight fitting. That cover is never coming out now! JK, you should be able to pry it open with your finger nails or spatula if you ever need to open it back up.

Finished Build!

Welp, thats all folks! Our assembly is complete. We can try it out now. Turn it on and connect your new MIDI controller to your preferred DAW. Check out the next page for connectivity options.

User Interface

So how does this thing work? You'll definitely want to read Todd's guide on how the interface works. There's several commands and settings you can adjust by tapping on multiple pads. Change the tempo, pitch, velocity or even MIDI channel. Click the green button below to automatically teleport to Todd's guide. 

Connecting BLE MIDI Devices

OK, so how do we connect BLE MIDI devices to our computer (or mobile device)? On a mac, you can use the Audio MIDI Setup utility. Open the MIDI studio window. Then, double click on the Bluetooth icon to open the Bluetooth Configuration window. From here, you'll see the MIDI device, "Adafruit Bluefruit LE". Click on the connect button to connect your computer to the device. Then, you should be able to use audio software like Ableton, Logic, GarageBand, etc. This guide won't cover how to connect MIDI devices to a particular piece of software. There's tons of other great resources for that! 

This guide was first published on Feb 15, 2017. It was last updated on Mar 08, 2024.