Programmable MIDI Foot Controller for the Korg KP3+

MIDI Foot Controller

The Korg KAOSS PAD KP3+ is a powerful beast. It’s great for realtime processing and sampling, but it’s not the best choice as a loop pedal. For one, the loop record length choices only include 1, 2, 4, 8, and 16 beats. You can adjust that after recording, but not on the way in. One shot samples can be any length, but they need to be triggered manually or via a sequencer. Furthermore, it’s not a pedal. If you want to trigger or record samples with your feet you’ll need a MIDI foot controller to do that. And not just any controller. It will need to be programmable so that you can send specific note values to the KP3+ that trigger each of the sample buttons.

This is the issue I decided to resolve for my continuously evolving live setup. More often than not I use a Rhodes electric piano with the KP3+ alongside a modest family of other gear. Playing two-handed while capturing Rhodes loops without audible gaps is impossible if you have to use a “spare” hand to do it. There are a number of programmable MIDI foot controllers on the market. Unfortunately, most of them are not fully programmable and are designed for changing patches versus triggering MIDI notes. An exception to this is the Behringer FCB1010, however, it’s quite large with twelve switches and two expression pedals. I only need four switches and can’t afford the space the FCB1010 would take up.

Highly Liquid MIDI CPU

People are making all sorts of custom MIDI controllers and there’s tons of microcontrollers that can be used for this purpose. I won’t get into all the options, but a few examples include Arduino (perhaps with a SparkFun MIDI shield), Teensy, Livid Brain V2 or Brain Jr, and Highly Liquid’s MIDI CPU. It just so happened that I had a Highly Liquid MIDI CPU on hand that I was sent to me as a sample years ago. I had used it for a few experiments, but nothing on a permanent scale.

Following instructions on the Highly Liquid website I was easily able to reprogram the MIDI CPU via sysex and start testing it with the KP3+. In minutes I had a prototype working that was triggering the sample buttons properly. With that piece confirmed I ordered four momentary foot switches and a sturdy aluminum enclosure. I measured and drilled all the holes for the four switches, DC power, MIDI in, and MIDI out. I soldered it all together and started using it immediately. I’m very pleased with the results and hope to use the foot switch for years to come. To an extent it is future proof because at anytime I can reprogram it via sysex through the MIDI input. A second reason the MIDI in is useful is because I can still send the connect device MIDI from another source (MIDI clock for example). This works because the MIDI CPU can be configured to mirror the MIDI in to the MIDI out while merging messages that originate from the circuit board. Handy!

This was an inexpensive, easy, and elegant solution to a frustrating problem. Custom MIDI controllers are getting easier and cheaper to build all the time. I’d love to hear about your DIY MIDI controller projects in the comments below. Thanks for reading!

Noises from the Arduino

The Arduino is a little programmable doo-hickie that can be used for lots of things. I was playing with mine recently and hooked the digital outs up to an analog sound board. This is a common thing to do with the Arduino. You can coax the thing into making analog-like sounds through the digital output. Since it is digital, everything is a square wave.

All of these sounds were made with a little routine I got from the sample code for making a sound:

void playTone(int tone, int duration) {
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    digitalWrite(speakerPin, LOW);

Here are a few little audio samples that I made tonight whilst fooling around. The first one is just random frequencies:

long i = 0;
i= random(5, 100);
playTone( i*i, 100 );


Arduino Random

The rest are just a sweep using different durations:

for(int i = 5; i < 100; ++i ) {
    playTone( i*i, 50 );
for(int i = 100; i >= 5; --i ) {
    playTone( i*i, 50 );

Arduino Sweep Slow

Arduino Sweep Medium

Arduino Sweep Fast

Arduino Sweep Very Fast

It has digital and analog inputs as well, so my next goal is to use some sort of control voltage to make noises. More to come!