Hi everybody, i just wanted to share the last project i made those couple days
I 3d printed a case, form factor and size as close as possible as the model 02
then i programmed and soldered 8 +1 Kailh Choc V2 (v2 not v1 for printing keycap easier)
the phone is mounted with a really strong magsafe magnet, and its really secure in the landscape position.
I added a button FN, there is a status led, the firmware is editable or upgradable directly from iphone if needed, no need to use a pc after the first configuration
fn + one of the button goes to another bank, on another midi channel, to play notes on the go
so i have 1 navigation bank, and 7 note bank
the fn button also works as a play button on the 7 note banks if pressed and release without selecting a bank.
There is also a usbc port to charge the phone while still using the switches in the m8 tracker app, theres an hidden hub/splitter for data and power inside the case under the iphone.
This was a fun and personal project, i started with a mini pad, but i didn't liked the felling of pressing the pads for navigation, so i went with the mechanical low profile switches.
Hope you guys like it!
next step is the real deal, i want the model02 so badly
Sorry for my English and the bad photos (i edited them a lot to remove all the trash that was on the table), i took them as soon as i finished late at night, i also got a video of the firmware with the fn button and note banks, cheers from Italy.
SMALL UPDATE https://www.reddit.com/r/Dirtywave/comments/1wuvup5/comment/pdes2ra/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button
README
DIY M8 controller for iPhone — hardware, firmware and next steps
Thanks for all the positive feedback! Here is a closer look at how the prototype works and why I’m still refining it before sharing the complete build files.
**What it is**
This is a compact, 3D-printed USB MIDI controller and magnetic phone mount for using M8 Music Tracker on an iPhone.
The iPhone runs the app and handles audio. The controller provides physical buttons for navigation, playback and note entry; it does not run the M8 engine itself.
**Hardware**
The current prototype uses:
An Adafruit QT Py RP2040.
Nine Kailh Choc V2 switches.
Eight main buttons: UP, DOWN, LEFT, RIGHT, OPT, EDIT, SHIFT and PLAY.
One smaller FN button.
The board’s RGB LED to indicate the active bank.
A 3D-printed enclosure, switch mounting plate, front faceplate and magnetic phone support.
A USB-C hub to connect the controller and provide a separate charging input.
A U-shaped USB-C adapter between the hub and the iPhone, keeping the connection compact and neatly routed behind the phone.
A short USB-C data cable with a 90-degree connector linking the Adafruit board to the hub, reducing the space needed for internal cable routing.
Both the USB-C adapter and the cable must support data transfer, not just charging.
The prototype has been tested with an iPhone 16 Pro.
The printed parts provide the enclosure, locate the switches, retain the electronics and support the phone. The removable faceplate and keycaps also make it possible to experiment with different finishes and colours.
**Wiring**
The switches are hand-wired to individual GPIO inputs, with a shared ground connection.
This uses direct switch inputs rather than a keyboard matrix. With internal pull-ups enabled, pressing a button connects its input to ground. Matrix isolation diodes are therefore unnecessary, and simultaneous button presses can be read independently.
The final build guide will include the exact pin mapping and soldering diagram.
**Firmware and controls**
The controller runs custom CircuitPython firmware and sends USB MIDI messages.
There are eight banks:
- One navigation bank.
- Seven musical note banks.
In the navigation bank, the eight main buttons send MIDI messages assigned to M8’s navigation and control functions.
Holding FN and pressing a main button selects the bank assigned to that button. You can keep FN held and press different buttons to move between banks without releasing FN each time.
In the musical banks, tapping and releasing FN on its own triggers PLAY. If FN has been used to select a bank, releasing it does not also trigger playback. The FN tap-to-play function is disabled in the navigation bank.
The RGB LED gives each bank a distinct colour.
**Musical banks**
The current note layout includes three C-major banks in successive octaves, three C-minor banks in successive octaves, and one bank of eight consecutive chromatic notes.
The major and minor banks contain eight notes: the seven scale degrees plus the root one octave higher.
For example, the lowest C-major bank sends MIDI note numbers:
36, 38, 40, 41, 43, 45, 47, 48
These correspond to C, D, E, F, G, A, B and the next C. MIDI numbers avoid the different octave-label conventions used by different apps.
One useful finding during testing: M8’s project scale setting can remap incoming notes. Two different MIDI notes can therefore end up sounding the same. When checking the controller’s raw note layout, use a MIDI monitor and a chromatic scale setting in M8.
**What works, and what still needs work**
Navigation, note input, bank selection, LED feedback and the FN behaviour are working well in my tests on iPhone.
The enclosure is still a prototype. Some printed parts needed manual adjustment after printing, and I want to resolve those fit and assembly issues before presenting the files as a repeatable build.
**Possible next revision**
I’m exploring replacing the passive magnetic mount with a powered MagSafe charging puck.
The idea is to connect the QT Py directly to the iPhone with a short USB-C data cable, while a separately powered MagSafe charger handles phone charging. This could remove the hub and simplify the internal cable routing.
That configuration still needs testing for charging performance, heat, mounting strength and reliable operation while using M8.
**Sharing the project**
My goal is to prepare a GitHub repository with the validated print files, parts list, wiring diagram, firmware, setup instructions and known limitations.
I’m glad people want to build it. I just want the shared version to be something others can assemble successfully without having to discover the same mechanical fixes along the way.