A compact, open-source MIDI controller with 8 potentiometers, each with fully assignable MIDI CCs, built for Arduino NANO R3/R4 (Rev1) or the Pro Micro (Rev2).
- 8x Potentiometers with smooth analog control via 16-channel MUX
- Arduino NANO / Pro Micro (Rev2) Compatible – Easy to source and program
- SSD1306 I2C OLED (128x64) for the UI
- Per-Pot CC Assignment – Full MIDI CC customization
- 4x Tactile Switches for UI navigation/configuration
- Standalone Operation – No computer needed after setup
- EEPROM Settings Storage – Retains configurations after power-off
- Temporary Override Mode – Make temporary adjustments that snap back
- MIDI over USB (Pro Micro Rev ONLY) – Class-compliant, plug-and-play
- Open-Source Firmware (Arduino IDE-compatible)
| Component | Qty | Notes | Links / Part Numbers |
|---|---|---|---|
| Arduino NANO / Pro Micro | 1 | Main microcontroller | Arduino NANO R3 / Pro Micro |
| 16-Channel MUX (74HC4067) | 1 | For reading 8 potentiometers | AliExpress / CD74HC4067M96 (JLCPCB) |
| SSD1306 OLED (128×64) | 1 | I²C interface | AliExpress |
| B100K Potentiometers | 8 | Linear taper | AliExpress |
| Tactile Switches | 4 | For menu navigation (ASSIGN, ENTER, PREV, NEXT) | K2-6639DP-B4SW-04 (JLCPCB) |
| 10k Resistors (SMD) | 7 | Pull-up for buttons and misc | 0603WAF1002T5E (JLCPCB) |
| 100nF SMD Capacitor | 1 | Power rail stabilisation | 1206B104K101CT (JLCPCB) |
| 10nF SMD Capacitors | 8 | Potentiometer filtering | 1206B103K500NT (JLCPCB) |
| 220Ω SMD Resistors | 2 | For MIDI circuitry | 0603WAF2200T5E (JLCPCB) |
| PJ307 Stereo Headphone Socket | 1 | 3.5mm MIDI TRS Out (Type A) | — |
| Reset Button (SMD) | 1 | Rev2 only - Reset button | KMR221GLFS (JLCPCB) |
| 0.1" Header Pins | 1 | For connecting components | — |
| PCB | 1 | Custom design | — |
| Potentiometer Knobs | 8 | For B100K potentiometers | — |
DIY Kits - Only NANO version (rev1) available → Purchase from my Tindie store
- Install Arduino IDE
- Install required libraries (see Building from Source section)
- Open the
.inofile in Arduino IDE | There are two files - one for NANO and one for Pro Micro - Select your board (Arduino NANO R3/R4 or ProMicro)
- Upload the firmware
- Refer to the Build Guide (coming soon)
- Power via USB on the Arduino NANO
- Use the OLED menu to assign CCs
| Button | Primary Function |
|---|---|
| ASSIGN | Enter/exit MIDI assignment menu |
| ENTER | Enter temporary override mode (hold), confirm selections |
| PREV | Decrease values, navigate up |
| NEXT | Increase values, navigate down |
| PREV + NEXT (hold 2 sec) | Factory reset |
The interface is organized into two main screens:
MAIN SCREEN → ASSIGN SCREEN → parameter editing
This is your default operating view. The screen displays:
- Current selected pot number (1-8)
- A horizontal bar graph showing the current MIDI value (0-127)
- The numeric MIDI value centered on screen
From the main screen:
- Press ASSIGN to enter the assign menu
- Press and hold ENTER to activate temporary override mode
When you press and hold ENTER on the main screen, the controller enters temporary override mode:
- The display inverts as visual feedback
- All potentiometer adjustments override the stored values
- When you release ENTER, the controller:
- Returns to the stored MIDI values
- Activates catch-up mode
- The display returns to normal
After exiting temporary override mode, catch-up mode is activated:
- Potentiometers must pass through their stored position before taking control
- This prevents abrupt jumps in your MIDI parameters
- Once all pots have caught up, normal operation resumes
Press ASSIGN from the main screen to enter the configuration menu. Use PREV/NEXT to navigate through edit modes:
Navigation flow:
- SELECT POT – Choose which pot (1-8) to configure
- EDIT CHANNEL – Set MIDI channel (1-16) or OMNI
- EDIT CC – Set Control Change number (0-127)
- EDIT MIN – Minimum output value (0-127)
- EDIT MAX – Maximum output value (0-127)
- EDIT DIR – Normal (0-127) or Inverted (127-0)
Editing values:
- PREV/NEXT – Adjust values incrementally
- Potentiometer 8 – Smooth continuous adjustment across full range - faster when selecting MIDI CC's and custom ranges
- ENTER – Cycle through edit modes
- ASSIGN – Save settings and return to main screen
From the main screen, press and hold PREV + NEXT for 2 seconds:
- All settings reset to defaults
- Device confirms reset on screen
- Resets to:
- Channel 1-8 (one per pot)
- CC 7 for all pots
- Min 0, Max 127
- Normal direction
- USB MIDI – Class-compliant in rev2, no drivers needed
- Per-Pot Configuration – Each pot has independent:
- MIDI Channel (1-16 or OMNI)
- CC Number (0-127)
- Value Range (min/max 0-127)
- Direction (Normal/Inverted)
- EEPROM Storage – Settings persist after power-off
- Requires Arduino IDE
- Libraries:
Adafruit_SSD1306– OLED display driverAdafruit_GFX– Graphics library for UIMIDI– MIDI protocol handlingEEPROM– Settings storage (built-in)
| Component | Arduino NANO Pins |
|---|---|
| MUX SIG | A0 |
| MUX S0 | D8 |
| MUX S1 | D9 |
| MUX S2 | D10 |
| MUX S3 | D16 |
| ASSIGN Button | D4 (INPUT_PULLUP) |
| ENTER Button | D5 (INPUT_PULLUP) |
| PREV Button | D6 (INPUT_PULLUP) |
| NEXT Button | D7 (INPUT_PULLUP) |
| OLED SDA | D2 (SDA) |
| OLED SCL | D3 (SCL) |
| Pot 1-8 | MUX Channels 0-7 |
| Feature | MC8P (Teensy 4.0) | MC8P mini (Arduino) |
|---|---|---|
| Microcontroller | Teensy 4.0 | Arduino NANO / Pro Micro |
| MIDI Output | USB + TRS 3.5mm | Rev1 TRS Only / Rev2 USB + TRS 3.5mm |
| Max CCs per Pot | Up to 10 | 1 |
| EEPROM | Yes | Yes |
| Catch-up Mode | Yes | Yes |
| Temp Override | Yes | Yes |
MIT License – Open-source for personal & commercial use
- Issues: Open a GitHub ticket
- Custom Requests: Start a thread in the discussions page or email: axs.instruments@gmail.com
- Want to improve it? PRs welcome!
- v1.0 – Initial release
- 8-pot control via 74HC4067 MUX
- Full MIDI CC assignment per pot
- OLED UI with assign menu
- EEPROM settings storage
- Temporary override and catch-up modes
- Factory reset function
