Homemade CDJ-style DJ controller with a 3D-printed enclosure, hand-built electronics, and custom firmware.
This repository documents:
- the current stable Mixxx prototype
- the firmware and Mixxx mapping that make it work
- the next hardware direction for a cleaner v2 build
- open-source hardware, firmware, and documentation for builders who want to contribute
v1is the stable Mixxx-focused version- the controller has been built, flashed, and used successfully as a working prototype
- Rekordbox was tested, but the jog wheels never became usable enough for a real workflow
- because of that, Rekordbox is not a supported target for this hardware revision
MCU: SparkFun Pro Micro / ATmega32U4Firmware: PlatformIO + Arduino +MIDIUSBInputs:PCF8575for buttons,74HC4067for analog controls, 3 rotary encodersMechanical: custom 3D-printed enclosure designed in Fusion 360Software target: Mixxx
The current prototype includes:
- two-deck transport and loop control
- EQ, filter, gain, volume, tempo, and crossfader control
- jog wheels
- music browsing and load controls
MCU: SparkFun Pro Micro / ATmega32U4Button expander:PCF8575for 16 buttonsAnalog mux:74HC4067for 15 potentiometersEncoders: 3 total- 1 browse encoder
- 2 jog wheel encoders
Encoder model: AlpsEC11Evertical rotary encoder,H20mmButton model: OmronB3F-40xx, 12x12 mm THT tactile switchDirect buttons on MCU:A1,A2,A3Potentiometers: 15 totalLinear model:B10375 mm linear slide potentiometer, 10 kOhmRotary model: TT ElectronicsP0915Nvertical rotary potentiometer
This is the practical parts list for rebuilding the current working v1 prototype.
| Qty | Material | Notes |
|---|---|---|
| 1 | SparkFun Pro Micro / ATmega32U4 board | The KiCad v1 schematic uses a USB-C Pro Micro clone footprint. Use the matching USB cable for the board you build with. |
| 1 | PCF8575 / HW-331 16-bit I2C IO expander module |
Handles the 16 deck buttons. |
| 1 | CD74HC4067 / 74HC4067 16-channel analog multiplexer module |
Handles the 15 analog controls. |
| 18 | Omron B3F-40xx 12x12 mm THT tactile switches |
16 deck buttons plus 2 direct music-selection buttons. |
| 3 | Alps EC11E vertical rotary encoders, H20mm |
1 browse encoder plus 2 jog wheel encoders. |
| 10 | TT Electronics P0915N vertical rotary potentiometers |
Gain, EQ, filter, and other rotary controls. |
| 5 | B103 75 mm linear slide potentiometers, 10 kOhm |
Deck volume, tempo, and crossfader controls. |
| 1 | 3D-printed enclosure body | 3D models/DIY_CDJ_body.stl. |
| 1 | 3D-printed enclosure lid | 3D models/DIY_CDJ_lid.stl. |
| 1 each | 3D-printed caps and control parts | crossfader.stl, cue.stl, encoder.stl, joggingWheel.stl, knob.stl, performance-pad.stl, and play-pause.stl. |
| As needed | Hookup wire, solder, and 2.54 mm headers | The stable v1 prototype is hand-wired, not PCB-based. |
The firmware currently defines 3 direct music-selection inputs on A1, A2, and A3, but the KiCad v1 schematic places 18 tactile switches total. Add one extra switch if you wire all 3 direct inputs. The schematic also contains 16 resistor placeholders with no values or footprints assigned yet, so treat those as schematic TODOs rather than an order-ready BOM line.
These are the important firmware-defined connections for the current working Mixxx version.
SDA-> pin2SCL-> pin3PCF8575address is auto-detected on boot in the0x20to0x27range
MUX signal->A0S0-> pin15S1-> pin14S2-> pin16S3-> pin10
Browse encoder-> pins4and5Jog wheel 1-> pins8and9Jog wheel 2-> pins6and7
A3-> note76A2-> note77A1-> note78
Button 0-> Deck 1 Loop OutButton 1-> Deck 1 Loop InButton 2-> Deck 1 Hotcue 3Button 3-> Deck 1 Hotcue 4Button 4-> Deck 1 Hotcue 1Button 5-> Deck 1 Hotcue 2Button 6-> Deck 1 CueButton 7-> Deck 1 Play/PauseButton 8-> Deck 2 Hotcue 4Button 9-> Deck 2 Hotcue 3Button 10-> Deck 2 Hotcue 1Button 11-> Deck 2 Hotcue 2Button 12-> Deck 2 CueButton 13-> Deck 2 Play/PauseButton 14-> Deck 2 Loop InButton 15-> Deck 2 Loop Out
Pot 0 / CC 10-> Deck 1 GainPot 1 / CC 11-> Deck 2 GainPot 2 / CC 12-> Deck 1 High EQPot 3 / CC 13-> Deck 2 High EQPot 4 / CC 14-> Deck 1 Mid EQPot 5 / CC 15-> Deck 2 Mid EQPot 6 / CC 16-> Deck 1 Low EQPot 7 / CC 17-> Deck 2 Low EQPot 8 / CC 18-> Deck 1 FilterPot 9 / CC 19-> Deck 2 FilterPot 10 / CC 20-> Deck 2 VolumePot 11 / CC 21-> Deck 2 TempoPot 12 / CC 22-> Deck 1 VolumePot 13 / CC 23-> CrossfaderPot 14 / CC 24-> Deck 1 Tempo
Browse encoder / CC 25-> library scrollA1 / note 78-> Load selected track to Deck 1A2 / note 77-> Load selected track to Deck 2A3 / note 76-> Enter or expand selected folderJog wheel on pins 8/9 / CC 26-> currently mapped to Deck 2Jog wheel on pins 6/7 / CC 27-> currently mapped to Deck 1
The current firmware lives in CDJ_firmware/src/main.cpp.
- auto-detects the
PCF8575on boot - configures the expander pins as input pull-high
- reads 16 buttons through the
PCF8575 - reads 15 analog controls through the
74HC4067 - reads 3 rotary encoders
- reads direct top buttons on
A1,A2, andA3 - sends MIDI note and CC messages through
MIDIUSB - uses an additional filter on the browse encoder to reduce event spam in Mixxx
CDJ_firmware/platformio.ini currently targets:
[env:sparkfun_promicro16]
platform = atmelavr
board = sparkfun_promicro16
framework = arduino
lib_deps =
arduino-libraries/MIDIUSB @ ^1.0.5CDJ_firmware/- firmware source and PlatformIO configcontrollers/mixx_Mapping/- Mixxx XML and JS mappingcontrollers/rekordbox/- Rekordbox mapping reference and notespics/- renders and prototype photosreference circuits/- circuit reference imagesPCB/- KiCad schematic, PCB, and custom symbols/footprints3D models/- printable parts and Fusion 360 source archiveCONTRIBUTING.md- contribution guide.github/- issue templates, pull request template, and CI workflow
Firmware:CDJ_firmware/src/main.cppMixxx XML mapping:controllers/mixx_Mapping/DJC-DIY.midi.xmlMixxx JS mapping:controllers/mixx_Mapping/DJC-DIY-scripts.js
For exact control behavior, use those files instead of this README.
Contributions are welcome. The most useful contributions right now are practical build reports, Mixxx mapping fixes, firmware cleanup, PCB review, parts substitutions, enclosure fit notes, and documentation improvements.
Before starting a large hardware or firmware change, open an issue so the direction can be discussed. Small documentation fixes can go straight to a pull request.
Useful starter work:
- test the current Mixxx mapping on another OS or Mixxx version
- document compatible Pro Micro clones, encoders, buttons, and potentiometers
- improve wiring photos or assembly notes
- review the KiCad v1 schematic and PCB TODOs
- add real build notes for 3D-print settings and fit adjustments
See CONTRIBUTING.md for the full workflow and pull request checklist.
- Install PlatformIO in VS Code.
- Open
CDJ_firmware/. - Connect the SparkFun Pro Micro by USB.
- Build or upload:
pio run
pio run --target uploadCopy these files into your Mixxx controller mapping folder:
controllers/mixx_Mapping/DJC-DIY.midi.xmlcontrollers/mixx_Mapping/DJC-DIY-scripts.js
Then enable the mapping in Mixxx.
- The stable path for this project is Mixxx, not Rekordbox.
- The prototype is still hand-wired and not PCB-based yet.
- The current jog wheel assignment is swapped between physical control and deck mapping.
- Rekordbox support should be treated as future hardware research, not a feature of this version.
V2 is a hardware redesign focused on one goal: keep a single USB-C cable to the computer and add a built-in 3.5 mm headphone cue output.
Masterstays on the computer side- the controller provides only
Headphones / Cue - the project stays Mixxx-first
Prototype MCU:SparkFun Thing Plus ESP32-S3Custom PCB MCU:ESP32-S3-WROOM-1Headphone audio:Adafruit TLV320DAC3100or equivalent small I2S headphone DAC/codecExternal ports: oneUSB-C, one3.5 mm TRSheadphone jackExisting controls to keep initially:PCF8575,74HC4067, jog encoders, browse encoder, buttons, and potentiometers
USB-C->ESP32-S3ESP32-S3 I2S->TLV320DAC3100audio dataESP32-S3 I2C->TLV320DAC3100configurationTLV320DAC3100->3.5 mm TRSheadphone jackESP32-S3-> existing control hardware
- port the controller logic from
ATmega32U4toESP32-S3 - expose one composite USB device with
MIDI + audio - keep the current control behavior as close to
v1as possible - send Mixxx cue audio to the headphone DAC
ESP32-S3 is a much better platform for future USB experiments, but it does not guarantee Rekordbox compatibility or working jog wheels. V2 should still be treated as a Mixxx-first design.
This project uses separate licenses by file type:
| Files | License |
|---|---|
| Firmware and controller mappings | GNU General Public License v3.0 only (GPL-3.0-only) |
| PCB, wiring, CAD, and 3D hardware design files | CERN Open Hardware Licence Version 2 - Strongly Reciprocal (CERN-OHL-S-2.0) |
| Documentation, photos, videos, and other media | Creative Commons Attribution 4.0 International (CC-BY-4.0) |
See LICENSE.md, LICENSE-SOFTWARE.txt, LICENSE-HARDWARE.txt, and LICENSE-DOCS.txt for details.
This project was inspired by my friend @mandiclab and the djc-diy project.






