Does this project spark your interest?

Become a member to follow this project and don't miss any updates

DIY USB MIDI controller MPC style

An MPC style MIDI controller featuring a 4x4 FSR matrix and based on Teensy 3.0

0 14 11
Enjoy this project?
Share on twitter   Share on Facebook

This project was created on 06/25/2014 and last updated a day ago.

The purpose of this project is to build an MPC style USB MIDI controller using home made Force Sensing Resistors (FSRs) arranged in a 4x4 matrix fashion; the FSRs will be used to sense the pressure applied to the button, a value that can be used for a variety of things (velocity of a note, control change value etc).

I'm a musician and I needed a simple and effective instrument to create drum beats without having to manually write them note by note. I also wanted something fairly small, that could easily sit on my desktop while embracing my guitar and that could be used even at late night without making too much drumming noise. An MPC style MIDI controller perfectly suits my needs.

There are a lot of DIY MIDI controllers of this kind around, but most of them use simple on/off tactile buttons, which is not enough for me. I want to have a fairly reliable velocity control because I will mainly use this with real-life drums simulation. Therefore the only reliable approach is to use Force Sensing Resistors as tactile sensors; the thing is, commercial FSRs are NOT CHEAP! Really, 8 bucks a piece is way too much for me, considering that I want a 4x4 matrix that's more than 120 bucks, which is more than the price of a ready-made MPC style MIDI controller. No deal.

Thankfully, I found out that these FSRs are usually made of a thin film of a material that varies its resistivity when under pressure, called Velostat, and this film is sandwiched between two copper contacts; alternatively, they can be made using a layer of two intricated copper traces and a velostat layer spaced from the first one (just like te PCB button pads found in any game controller).

To connect the FSRs to the microcontroller I use a 16 channels multiplexer to scan through all the FSRs and which puts each FSR as the first resistor of a voltage divider; the FSR decreases its impedance with pressure, therefore I read the voltage drop across a fixed resistor which is high when fully pressed and low when barely pressed.

Finally, I keep track of the current status of each FSR which can be on or off to trigger a MIDI note on/off signal via USB.

Stay in touch for more details ;)

  • 1 × Teensy 3.0 USB development board based on ARM Cortex M4 32 bit microcontroller
  • 16 × Home made FSRs Force sensing resistors made with copper tape, acetate sheets, and velostat
  • 1 × 10K resistor Used to create a voltage divider along with the FSR
  • 1 × HCF4067 16 channels analog mux/demux Used to multiplex all the FSRs and to output their value on a single analog input pin on the Teensy

Project logs
  • The pads have arrived! + more photos

    2 days ago • 0 comments

    Hello there,

    The used Akai MPC 2000 pads arrived this morning, yay!

    I took the opportunity to share with you actual dimensions of the pads, as well as some photos of the inner guts of this prototype; let's start with the description of the electronics photos:

    16 channel mux breakout board pin connector

    This is the mux breakout board connector; beside the blue wires mess, which is composed of the FSRs leads, you can see in order from left to right, and color coded:

    Vss (ground)- Vdd (5 V) - A - B - C - D - Common Out - Inhibit 

    This board is plugged in a breadboard and connected to the Teensy using some jumpers:

    Inside the prototype 2

    You can see that apart from the red jumper for the ground connection, everything follows the same color coding as on the breakout board:

    RED for Power - YELLOW for A-B-C-D - GREEN for Common Out - WHITE for Inhibit

    A-B-C-D are connected to pins 9-10-11-12, Inhibit to pin 8, Common Out to A0-pin 14 and grounded through a 10 Kohm resistor. You can see that the electronics and the connections are really straightforward.

    Now for the dimensions:

    - Top layer: 

    . Pad width : 1,1875 inches

    . Spacer between pads : 0,1875 inches

    These could be approximated to 1,25 inches and 0.125 inches and will be useful later when designing the final enclosure (e.g. to cut an acrylic sheet with some holes to be put on top of the pads to keep them together with the structure, which will also make the thing look sleek ;D )

    - Bottom layer:

    . Pad width : 1,25 inches

    . Spacer between pads : 0,25 inches

    . "Pressure" circle diameter : 1 inches

    For "pressure" circle I mean the little convex circles under each pad, which will be covered with Velostat;

    The width and the spacer reflects the approximated top pad dimensions; these are necessary to design the PCB pads.

    I made some math, and the first thing that comes out is that I cannot fit 16 pads in a single PCB, at least not in Eagle CAD; the maximum available area in the free version is 100 mm * 80 mm ( 4 inches * 3,2 inches ), therefore I have to either stick with 4 boards with 2x2 pads each ( 3 * 3 inches ), or design these with another tool.

    You can find more pictures in the Google Drive shared project folder link.

    See you next time with the PCB layout of the pads, and who knows what else! 

    Stay tuned,


  • Source code available! + quick update

    3 days ago • 0 comments

    Hey guys, 

    Today I had the time to sit down a few minutes on the project and I got the first revision of the code finally available, after more than two months have passed since I did it. 

    Code available here:

    Soon it will also be available on GitHub

    How to use it:

    -Take your Teensy and program it

    -As soon as the code starts (e.g. you see the Teensy MIDI device connected to the PC) keep the first button pressed down for at least 5 seconds; this is used to initialize the maximum value that the analog pin can read, so to map the analogRead values in the range [0,maximum] instead of [0,1023]

    -Leave the button and enjoy! Notes are mapped from note 36 to note 36+i where i is the index of the pad which goes from 0 to 15. I chose this notes because every digital drum inside Reason (Redrum, Kong) as well as sample players (Dr.Rex) are mapped to default to this range of notes.

    You may want to keep your Serial Monitor opened in another window while using it as it shows some messages in the initialization process as well as during normal use and misuse.

    Anyway, the rubber pads have not arrived yet, they should arrive tomorrow; as soon as I have them I will lay down a PCB according to their dimensions and I will also design a little wooden chassis to keep everything together.

    As always, stay tuned!


  • Test video + project update

    5 days ago • 0 comments

    Hello there,

    In this log I'd like to share with you a few more photos of the construction process of the first revision of this MIDI controller as well as a video which shows the very basic functionality of it. In the video you can see me mashing on a few pads with Reason opened on my PC and interpreting MIDI signals into actual samples. Sorry for my lack of my abilities, but playing with one hand and with a phone in the other is no easy task :)

    Here's the link:

    In between the photos you shall find two photos of the new pads I've ordered, which are took from an used Akai MPC and which will be used in the second revision of the controller; this is due to a few issues I have found in the construction:

    - The pads are not reliable; the mouse pad is not a very good pad surface, not very playable, and the copper stripes that compose the sensors are too big and spaced, so if you move the finger on a pad while holding it pressed it gives false triggers

    - The sensor sensitivity is somewhat bad, because cardboard is too light and gives zero support to the sensors; therefore most of the pressure applied on the sensor is consumed in flexing the cardboard rather than transferred to the sensor

    - The electronics are faulty, mainly because I messed up some pad wiring, the mux board does not plug very well on the breadboard which hosts the Teensy and keeps disconnecting when playing, and the cheap oscilloscope probe I'm using adds up to this mess

    So I am thinking of some major mods, which are the following:

    - Printing the pads on PCB(s), to have more dense copper stripes which means increased sensitivity

    - Fixing the pads on a somewhat thick wooden surface, to give it the necessary support so that most of the pressure applied will transfer to the pads

    - Using rubber molded pads to further increase reliability; these pads will be provided with velostat pieces under each pad so to provide ffunctionality as it is now with the mouse pad

    - Using another PCB to host the mux, the Teensy and other complementary stuff, which will of course connect in some fancy way to the separate sensor board(s)

    - Leaving some space for some control goodness like potentiometers which are mandatory in every respectable MIDI controller

    On the software side, right now there is not much happening, MIDI notes are sent for each pad starting from C1 which is note 24 and adding the index of the pad, which are logically organized as a row, so adding up from 0 (upper leftmost corner pad) to 15(lower rightmost corner pad). The thing that I found frustrating is to have to reprogram the pads each time I want to change notes, moreover having to write conditional code if I wanted one specific pad to send a note which is not the standard one; also, I'd like to have more advanced functionality like auto retrigger of a note while holding it; so there are the mods I will implement on the software side:

    - Setting notes on the run using a PC software which will use serial communication, probably written in Java and using javarxtx-lib; this will also be used to set other parameters, such as selecting digital or analog behaviour for each pad.

    - Implementing the above stuff in firmware, of course! That is to say, implementing a serial based communication protocol with a command set, and implementing the various controllable functions

    - Adding an internal metronome

    - Adding retrigger functionality which will rely on the above metronome

     Right now the code is still not available as it is quite bugged because I tried with little success to implement the serial comm with the PC. I will clean it up and pass it on to the masses ;)

    Stay tuned!


View all 4 project logs