4 years ago, I was quite unhappy with my M-Audio X-Session pro MIDI controller, so I decided, heck, I'll build my own! The project was called OpenDeck and it's goal was to be full-featured open-sourced MIDI controller with a nice design. At the time I didn't even know what microcontroller or MIDI actually are, but eventually, I figured my way around.
Fast forward to about 2 months ago. I realized I'm not going to finish that project it any time soon, due to lack of money. I wanted to have everything on PCBs and that would cost me a lot. It was a project with 46 buttons, 27 LEDs, 31 potentiometer, 3 faders and 2 rotary encoders. I decided I'm finally going to build fully-working MIDI controller using the code and parts I already had. The result is Tannin, simple 16 pot, 19 buttons and 4 LEDs controller. It fully supports MIDI Note On/Off and CC messages, including the MIDI In (I'm using that feature in Traktor to control LEDs and set modifiers). It even features experimental MIDI Clock In support. I've set it in a way that LEDs blink in sync with that clock, but there's more work to be done to make it fully work. The buttons also have built-in feature of long press, that is, if you press button for half second (that can easily be defined) it will send another MIDI Note On on another channel (2, regular presses are sent on channel 1). The pots as well send MIDI Note On/Off messages, 6 per pot, depending on their position, with CC messages, of course. So for MIDI control freaks out there, there are a lot of mapping possibilities. Original design is made by me, even tho I drew some inspiration from other controllers out there, like MIDI Fighter, or Traktor Kontrol X1.
The biggest issue that I had was getting the MIDI output from Arduino, that is, I wanted my software (Traktor Pro) to recognize the messages coming from Arduino. Unfortunately, I found out that Arduino doesn't support MIDI directly and that I had to somehow mimick it. It turned out that there is actually a way, and it works really great. There are two steps to it:
1) First you have to somehow translate serial messages coming from Arduino into MIDI messages. There is
2) After translating the messages, you have to route them somewhere using virtual MIDI cable software. I'm using Windows and for the task I've selected loopBe30 software. When you match your virtual port in hairless-midi software, the once-serial messages from Arduino will become MIDI messages routed over virtual MIDI cable. After that you can easily map your controller to any software which supports MIDI learn.
It would be much nicer when Arduino would support all that out-of-the-box (like Teensy boards), but this way works as well.
The faceplate is some kind of special plastic board, 1.5mm thick glued to 3mm plexiglas. That 1.5mm plastic has black layer on it which is specially designed for CNC laser cutting. It looks great! Also, it's matte black, so fingerprints are not an issue. Deisgn is made in CorelDraw software.
Project has 3 PCBs inside, designed in EAGLE. 2 for 2 groups of potentiometers to get really stable values (I used to connect the pots with wires which often resulted in gibberishvalues), and they both use ground planes on both sides. Main PCB has Arduino on it with connectors for 2 PCBs for pots. Each pot PCB has 4051 chip on it to read potentiometers. Buttons/LEDs are connected in a matrix with shared columns.