Everything you need to drive LeslieLEDs directly from a DAW, hardware controller, or the included desktop app.
| Scenario | How to connect | Notes |
|---|---|---|
| DAW on macOS/Windows | Plug Midi2DMXnow (AtomS3) over USB-C. It enumerates as Midi2DMXnow on channel 1. |
Best latency, powers the onboard preview strip. |
| DIN/Serial gear | Use the M5Core build with USE_SERIAL_MIDI and feed 5 V tolerant UART at 115200 baud (TX→RX0, RX→TX0). |
Requires common ground; ideal for synth rigs. |
| No DAW, just a laptop | Launch ./controller/run.sh. Choose the hardware port or use the virtual input LeslieCTRLs inside any DAW to bridge. |
GUI sliders mirror inbound CCs so you can see what the DAW is doing. |
All transports expect MIDI channel 1. If your controller only transmits on another channel, remap in the DAW or transpose with a MIDI utility.
- Connect Midi2DMXnow via USB.
- In Preferences → Link/MIDI, enable Track output for
Midi2DMXnow(and optionallyLeslieCTRLsif you run the controller app). - Create a new MIDI track, set MIDI To to
Midi2DMXnow, Channel 1. - Add an empty MIDI clip, open the Envelope box, and choose
MIDI Ctrl→ the CC you need (e.g.,1 Modulationfor brightness). - Draw automation; as the clip plays, every receiver mirrors the preview strip.
- Plug in Midi2DMXnow, open Project Settings → MIDI → Sync and make sure it is enabled as a destination.
- Insert an External MIDI track targeting
Midi2DMXnowchannel 1. - Use Smart Controls or the MIDI Draw lane to automate CCs listed below.
- Optional: run the controller app so the
LeslieCTRLsvirtual input shows up; point Logic at that port if you want to see the GUI follow your moves.
- Start the controller (
./controller/run.sh). Reaper now sees two outputs:LeslieCTRLs(virtual) and the physical Midi2DMXnow port. - Send automation to
LeslieCTRLs. The controller forwards everything to whichever hardware port you selected, and the GUI stays in sync. - Flip to Serial mode in the GUI when you want to talk to an M5Core device connected over USB-to-serial.
| CC | DMX channel | Description | Range | Notes |
|---|---|---|---|---|
| 1 | 0 | Master brightness | 0–127 (scaled to 0–255) | Keep under 100 for headroom. |
| 2 | 2 | Animation speed | 0–127 | Higher = faster motion. |
| 3 | 3 | Animation control | 0–127 | Mode-dependent (segment size, waveform select, etc.). |
| 4 | 4 | Strobe rate | 0 = off, >0 = faster | Use sparingly; synced strobe shares the MeshClock. |
| 5 | 5 | Blend mode | 0–127 | 0 = hard split, 127 = smooth gradient. |
| 6 | 6 | Mirror mode | 0 None, 38 Full, 63 Split2, 88 Split3, 114 Split4 | Matches GUI dropdown. |
| 7 | 7 | Direction | 12 Forward, 38 Backward, 63 PingPong, 88 Random | Map to switches for live play. |
| 8 | 1 | Animation mode | Groups of 10 values pick each of the 8 modes (0–9 Solid, 10–19 Dual, …). | |
| 20 | 8 | Color A Hue | 0–127 | Wraps full spectrum. |
| 21 | 9 | Color A Saturation | 0–127 | 0 = white, 127 = vivid. |
| 22 | 10 | Color A Value | 0–127 | Works alongside master brightness. |
| 23 | 11 | Color A White | 0–127 | Blends additional W channel. |
| 30 | 12 | Color B Hue | 0–127 | Secondary color for blends/dashes. |
| 31 | 13 | Color B Saturation | 0–127 | — |
| 32 | 14 | Color B Value | 0–127 | — |
| 33 | 15 | Color B White | 0–127 | — |
| 127 | 31 | Scene save mode | 0 = recall, ≥64 = arm save | Hold ≥64, press note to overwrite that slot. |
Tip: Because MIDI tops out at 127, the firmware scales brightness to the LED engine’s 0–255 domain automatically. Set your controller faders to 0–127 so the GUI and hardware stay aligned.
| Note (C=36) | Function |
|---|---|
| 36 (C2) | Scene 1 load/save |
| 37 (C#2) | Scene 2 |
| 38 (D2) | Scene 3 |
| 39 (D#2) | Scene 4 |
| 40 (E2) | Scene 5 |
| 41 (F2) | Scene 6 |
| 42 (F#2) | Scene 7 |
| 43 (G2) | Scene 8 |
| 44 (G#2) | Scene 9 |
| 45 (A2) | Scene 10 |
| 48 (C3) | Blackout (momentary, 127 velocity recommended) |
Workflow:
- Set up a look, raise CC127 above 64.
- Hit the scene note you want to store. The sender’s display and the controller app both flash a save banner.
- Drop CC127 back to 0 to go back to recall mode.
- Launch from repo root:
./controller/run.sh(usesuvto create.venvif missing). - The Output Port combo lists USB MIDI devices plus any
/dev/tty.*serial adapters:- Labels containing
LeslieLEDs,M5Stack, orUSB Single Serialauto-select on refresh. - Switch between USB and serial instantly; the app forwards the virtual MIDI port to whichever path is active.
- Labels containing
- The virtual input is always named LeslieCTRLs. Route your DAW track to that port to keep the GUI in sync with automation while still hitting the hardware.
- Incoming CCs update the matching slider (tagged
cc_<number>_slider), so you always see the latest value even if it was programmed in a clip. - Combo boxes (animation, mirror, direction) currently send but do not auto-update from DAW CCs; keep the GUI as the master when changing those parameters manually.
- Order of operations – Power receivers first, then Midi2DMXnow. Look for the RGBW sweep before assuming DMX is live.
- Velocity and scaling – Keep CC automation between 0–120 to leave a little headroom for smoothing; the firmware clamps values anyway, but this prevents hard edges when mapping faders.
- Scenes per song – Dedicate one MIDI clip lane per song section with the desired scene number plus any CC sweeps.
- Latency compensation – ESP-NOW adds under 20 ms; if your DAW lets you offset a track by -20 ms you can align cues with audio transients perfectly.
- Failover – If the receivers miss frames for more than 3 seconds they freeze on the last state. Send any CC to refresh once the link is back.
| Symptom | Fix |
|---|---|
| No response from Midi2DMXnow | Confirm the correct transport build (USE_USB_MIDI vs USE_SERIAL_MIDI), reseat USB, check that the preview strip ran the RGBW test. |
DAW sees LeslieCTRLs but nothing happens |
Make sure the controller app output port is set to the hardware you expect (USB or serial). |
| GUI sliders move but LEDs do not | Check MeshClock status on the sender display; if it says Waiting, receivers might not be powered or are out of range. |
| Scenes overwrite unexpectedly | Ensure CC127 returns to 0 after saving; automate a ramp down inside your DAW clip. |
| Colors look dull | Raise CC21/31 (saturation) and CC22/32 (value) together; also keep master brightness (CC1) below 110 to retain contrast. |
Still stuck? Run pio device monitor on the sender for live MIDI logs, or open an issue describing your DAW routing plus the CC/Note data that fails.