This is a little new, in that it is using the USB interface, and a Teensy board. It also compiles just fine on a Arduino Pro Micro.

This sends a generic CC message to your DAW. It shows up as a class compliant MIDI controller, and you can use it for whatever.

It is a little more expensive in parts… that is mostly because it is big. But theĀ switchcraft EHUSBBAX I used for USB was really NICE. it is super heavy duty and will never fail. There are plastic ones for cheaper.

Teensy LC $15.95 Teensy LC
Enclosure $10.99
Switches 8 x $1.97 is $15.76
LED $1.80
power jack $0.00
Usb Jack $11.38
switchcraft EHUSBBAX
Total $55.88


So the build was straightforward.

These are the tools I used. As always, nothing special other than the STEP BITS, which were $15 and are solid gold.

I used an unfinished enclosure cuz I couldn’t find a finished one anywhere… but I LIKED IT.

These are standard NORMALLY OPEN (NO) Momentary switches.

I should have put it in the LONG end.. cuz it was a little too tight once installed:

Straightforward wiring. The Teensy was not my favorite for actual soldering. The NANO EVERY has, like, side-access to the metal of the holes, so i is more pleasant. But this was fine.


Big case. Plenty of room for mounting:


And that’s that!


Now the code was VERY straightforward, using PieterP’s Control_Surface Library. And it can do many, many things. But for this:


// midi.controller  for 8 switch DAW control
// by Cameron @the.nw.enterprise,
// Library Source
// Dependency library should also be installed: 
// Written for TEENSY LC

#include <Control_Surface.h> // Include the library 

// Instantiate a MIDI interface
//USBDebugMIDI_Interface usbmidi(115200); // uncomment this for serial monitor in ide
//HardwareSerialMIDI_Interface serialmidi = {Serial, MIDI_BAUD}; //uncomment this for 5-pin operation- this sends on TX
USBMIDI_Interface midi; // uncomment for native MIDI over USB
//HairlessMIDI_Interface hair (); // uncomment this for Hairless

/*Instantiate CCbuttons
Will fire 127 on press and 0 on release. Use a momentary switch, like the others.
Assign CC number from here:

CCButton button2 = {2, {MIDI_CC::Sound_Controller_1, CHANNEL_1},};  //switch  CC#70
CCButton button3 = {3, {MIDI_CC::Sound_Controller_2, CHANNEL_1},};  //switch  CC#71
CCButton button4 = {4, {MIDI_CC::Sound_Controller_3, CHANNEL_1},};  //switch  CC#72
CCButton button5 = {5, {MIDI_CC::Sound_Controller_4, CHANNEL_1},};  //switch  CC#73
CCButton button6 = {6, {MIDI_CC::Sound_Controller_5, CHANNEL_1},};  //switch  CC#74
CCButton button7 = {7, {MIDI_CC::Sound_Controller_6, CHANNEL_1},};  //switch  CC#75
CCButton button8 = {8, {MIDI_CC::Sound_Controller_7, CHANNEL_1},};  //switch  CC#76
CCButton button9 = {9, {MIDI_CC::Sound_Controller_8, CHANNEL_1},};  //switch  CC#77

void setup() {
Control_Surface.begin(); // Initialize Control Surface

void loop() {
Control_Surface.loop(); // Update the Control Surface