build reference · usb midi control surface
A DIY USB-MIDI controller on a CDJ footprint, designed to sit on a decksaver in a booth. Every deck control is always live — no deck-switch button, no shift layers, no menu diving. Library, transport, loops, dual FX, 3-band EQ with stem-isolation switching, filter, gain and channel faders, for all four decks at once. Around $290 in parts.
Commercial controllers bank four decks onto two sets of controls, so half your rig is always invisible. This one trades portability for the opposite: every control for every deck, permanently under your hands.
Deck 3's low EQ lives in one physical place all night. In a dark booth that's worth more than any feature.
A toggle per channel flips the three EQ knobs between standard 3-band and stem isolation. Same knobs, different CC numbers.
Control surface only. Audio is a separate interface on the same hub — if one fails, you swap that one thing.
320 × 415mm, the CDJ-3000 footprint, ~45mm tall. It sits on a decksaver over a deck you aren't using.
What it deliberately doesn't do: output audio, or replace a jog wheel for scratching. The per-deck encoders are for scrubbing and needle-search, not turntablism.
Four identical vertical strips. Library across the top, then per-deck transport and loops, then FX, then the mixer section — gain, EQ, filter, fader — reading top to bottom the way a channel strip does.
Ninety-nine controls total. The count is what drives every other decision in the build — multiplexing, matrix size, microcontroller choice.
| control | type | per deck | total |
|---|---|---|---|
| Browse | encoder, push | — | 1 |
| Back / Sort | button | — | 2 |
| Load | button | 1 | 4 |
| Jog / scrub | encoder | 1 | 4 |
| Sync · Cue · Play | button | 3 | 12 |
| Loop in · out · exit · ×2 · ÷2 | button | 5 | 20 |
| FX 1 & 2 — wet/dry + param | pot | 4 | 16 |
| Gain | pot | 1 | 4 |
| EQ ↔ stems | SPDT toggle | 1 | 4 |
| High · Mid · Low (or vocals · drums · bass) | pot | 3 | 12 |
| Filter | pot | 1 | 4 |
| Channel fader | 45mm slide pot | 1 | 4 |
| total | 40 pots · 5 encoders · 38 buttons · 4 switches | 87 |
A Teensy 4.1 — chosen for native class-compliant USB MIDI and enough I/O headroom for analog multiplexing plus a button matrix.
| spec | teensy 4.1 |
|---|---|
| CPU | 600 MHz ARM Cortex-M7 |
| Digital I/O | 55 pins |
| Analog inputs | 18 pins |
| USB MIDI | native, class-compliant |
| Price | ~$27 |
In the Arduino IDE, set Tools → USB Type → "MIDI". Not "Serial + MIDI" — iOS refuses to enumerate the composite device, and you'll waste an afternoon assuming the cable is bad. Power everything through a powered USB-C hub (PD 45W+) so the Teensy and audio interface draw independently.
Three CD4067 16-channel analog multiplexers share four address lines and report into three analog inputs. Thirty-eight buttons go on a 6×7 scan matrix with a 1N4148 per switch to stop ghosting. LEDs run off two 74HC595 shift registers — sixteen outputs from three pins.
// shared address lines, three mux signal pins
S0=2 S1=3 S2=4 S3=5
muxA→A0 muxB→A1 muxC→A2
// button matrix
rows 24-29 (output, active LOW)
cols 30-36 (INPUT_PULLUP)
Use 3.3V as the analog reference throughout — not 5V. The Teensy 4.x analog pins are not 5V tolerant.
One MIDI channel per deck, identical CC numbers across all four. The same convention the software prototype uses — so a mapping built on a touchscreen drives this board unchanged.
| control | message | eq mode | stem mode |
|---|---|---|---|
| Gain | CC 7 | gain | gain |
| Knob 1 | CC 10 / 30 | EQ high | vocals |
| Knob 2 | CC 11 / 31 | EQ mid | drums |
| Knob 3 | CC 12 / 32 | EQ low | bass |
| Filter | CC 13 | HP/LP sweep, centre flat | |
| Fader | CC 14 | channel volume | |
| FX 1/2 wet + param | CC 20–23 | per FX unit | |
| Jog | CC 24 rel. | 3Fh / 41h encoding | |
| Sync · Cue · Play | Note 48 · 50 · 52 | transport | |
| Loop in/out/exit/×2/÷2 | Note 53–60 | loop section | |
The toggle doesn't change the knobs — it changes what the firmware sends. In EQ position the three knobs emit CC 10/11/12; flipped, the same knobs emit CC 30/31/32. Your DJ software learns both sets once, and one physical switch swaps a whole channel strip between tone control and stem isolation.
Jog and browse send 65 (0x41) for clockwise and 63 (0x3F) for counter-clockwise, not absolute positions. Absolute encoders on an endless control feel wrong immediately and mislead every judgement you make about the layout.
Roughly $290 all in. Knobs and pots are over a third of it — buy those last, once the layout is settled.
| category | notable parts | cost |
|---|---|---|
| Microcontroller & mux | Teensy 4.1, 3× CD4067, 2× 74HC595 | $46.55 |
| Pots, faders & knobs | 36× B10K, 4× 45mm slide, caps | $95.20 |
| Encoders & knobs | 5× PEC11R with push | $27.50 |
| Switches & buttons | 38× tactile, 4× SPDT, 42× 1N4148 | $12.96 |
| LEDs | 16× 3mm + resistors | $2.08 |
| Enclosure | PETG tray, 3mm acrylic panel, standoffs | $71.00 |
| Wiring & misc | 22 AWG, headers, perfboard, heatshrink | $35.00 |
| total | ~$290 |
Teensy 4.1, one CD4067 with breakout, two encoders, four pots, eight tactile buttons, breadboard and wire. Enough to prove mux reads, matrix scanning, and that your DJ software sees the device — before you commit to 36 more knobs.
3D-printed PETG base tray holding the boards, with a laser-cut 3mm acrylic top panel on M3 brass standoffs, screwed from underneath. Rear-facing recessed USB cutout. Large adhesive rubber feet so it doesn't slide on the decksaver. Label by laser-engraving the acrylic, or a vinyl overlay in gold to match.
Four phases, each one answering a question before the next spends money on it.
| phase | what | question it answers |
|---|---|---|
| 01 · breadboard | Teensy + 1 mux + 2 encoders + 4 pots + 8 buttons | Does the host see it, and do mux reads and matrix scanning work? |
| 02 · full build | All 40 pots, 38 buttons, 5 encoders, 4 switches on perfboard | Does it hold up as one circuit, at full I/O count? |
| 03 · mapping | MIDI-learn every control; both EQ and stem modes | Is the map complete and exportable? |
| 04 · gig-ready | Two-hour stress test, pot curves, labels, timed setup | Can you set it up in under five minutes, in the dark? |
The mapping is the slowest phase and it doesn't need the board. Emit the same channels and CC numbers from a touchscreen surface and the mapping is finished before phase 01 starts. How that works →
enharmonic · lab
A design, not a finished object — specced to the point where the next step is ordering parts. Published in the state it's actually in, gaps included.