A custom-built MIDI DJ controller using an Arduino Uno and repurposed hard disk drive (HDD) components. Physical inputs — buttons, potentiometers, and a scratch mechanism — are converted into MIDI signals that control a DAW in real time.
Built as a group academic project during B.Sc. Electronics at Christ University.
- 3 push buttons send MIDI Note ON/OFF messages — mapped to cue points or pads in Ableton Live
- 2 potentiometers/sliders send MIDI Control Change (CC) messages — mapped to volume, pitch, or effects
- An HDD platter mechanism simulates vinyl scratching using repurposed disk components
- All inputs are debounced and noise-filtered for stable, reliable MIDI output
| Component | Purpose |
|---|---|
| Arduino Uno (ATmega328) | Microcontroller — reads inputs and sends MIDI |
| 3x Push buttons | Trigger MIDI notes (cue points, pads) |
| 2x Potentiometers / sliders | Send MIDI CC for faders and knobs |
| HDD platter + arm | Scratch mechanism — simulates vinyl |
| Resistors | Pull-up/pull-down for button circuits |
- Arduino IDE
- Hairless MIDI — bridges Arduino serial to MIDI
- loopMIDI — virtual MIDI port on Windows
- Ableton Live 11 — DAW used for mapping and performance
- MIDI.h — Arduino MIDI library
- ResponsiveAnalogRead — smooths potentiometer noise
Physical input
│
▼
Arduino reads pin (digital or analog)
│
├── Button pressed? → Send MIDI Note ON (velocity 127)
│ Button released? → Send MIDI Note OFF (velocity 0)
│
└── Pot moved? → Map raw value (0–1023) to MIDI (0–127)
Send MIDI Control Change (CC)
│
▼
Serial → Hairless MIDI → loopMIDI → Ableton Live
Potentiometers are smoothed using ResponsiveAnalogRead to eliminate jitter. A movement threshold (varThreshold = 20) and a timeout window (TIMEOUT = 300ms) ensure CC messages are only sent when the pot is genuinely being moved.
| Pin | Component | MIDI message |
|---|---|---|
| D2 | Button 1 | Note 36 (C2) ON/OFF |
| D3 | Button 2 | Note 37 (C#2) ON/OFF |
| D4 | Button 3 | Note 38 (D2) ON/OFF |
| A0 | Potentiometer 1 | CC 1 (0–127) |
| A1 | Potentiometer 2 | CC 2 (0–127) |
- Install the Arduino IDE and required libraries (MIDI.h, ResponsiveAnalogRead)
- Open
midify.inoand set#define ATMEGA328at the top to target Arduino Uno - Upload the sketch to your Arduino Uno
- Open Hairless MIDI — select your Arduino's COM port as the serial input
- Open loopMIDI — create a virtual MIDI port
- In Hairless MIDI, route output to the loopMIDI port
- Open Ableton Live → go to Preferences → MIDI → enable the loopMIDI port
- Use MIDI Map mode in Ableton to assign buttons and pots to controls
- Play
- Change
note = 36to shift which MIDI notes the buttons trigger - Change
cc = 1to shift which CC numbers the pots control - Adjust
debounceDelayif buttons feel unresponsive or double-trigger - Adjust
varThresholdandsnapMultiplierto tune pot sensitivity
Built as part of a B.Sc. Electronics group project at Christ University (2023–2024). The goal was to demonstrate hardware-software integration — combining circuit design, microcontroller programming, and real-world MIDI protocol to build a functional musical instrument.
Arduino C++ Embedded Systems MIDI Protocol Analog Signal Processing Hardware-Software Integration Circuit Design Ableton Live