- PlatformIO installed
- ESP32 hardware (AtomS3, M5Core, or generic ESP32)
- SK6812 RGBW LED strips
- MIDI controller (USB or Serial)
- USB cables for programming and power
Both projects require these libraries (auto-installed by PlatformIO):
- ESPNowDMX: https://github.com/Hemisphere-Project/ESPNowDMX
- ESPNowMeshClock: https://github.com/Hemisphere-Project/ESPNowMeshClock
- FastLED (receiver only)
- M5Unified (M5 platforms only)
- Fork
https://github.com/Hemisphere-Project/ESPNowDMXand clone your fork next to this repo (e.g.,../shared_libs/ESPNowDMX). - Create a feature branch, make changes, and keep that folder checked into its git repo only (do not re-add it to this project).
- From
Midi2DMXnoworDMXnow2Strip, delete.pio/libdeps/<env>/ESPNowDMXto force PlatformIO to pick up the local fork via the existinglib_extra_dirs = ../shared_libsentry. - Run the usual builds (
pio run -e m5stack_atoms3,pio run -e m5core,pio run -e atom_lite, etc.) until they succeed. - Push the branch to your fork, open a PR against Hemisphere-Project/ESPNowDMX, and once merged, remove the temporary local folder so future builds use the upstream commit again.
cd Midi2DMXnow
# For AtomS3 (USB MIDI)
pio run -e m5stack_atoms3 -t upload
# For M5Core (Serial MIDI)
pio run -e m5core -t upload- Build successful
- Flash successful
- Device boots and shows "Midi2DMXnow" on display
cd DMXnow2Strip
# For AtomS3
pio run -e m5stack_atoms3 -t upload
# For M5Core
pio run -e m5core -t upload
# For custom ESP32
pio run -e esp32_custom -t uploadRepeat for each receiver device:
- Receiver #1: Build/flash successful
- Receiver #2: Build/flash successful
- Receiver #N: Build/flash successful
- USB power connected
- MIDI controller connected (USB or Serial)
- Device displays "Ready for MIDI"
- LED strip data pin connected:
- AtomS3: GPIO2
- M5Core: GPIO26
- Custom: As configured
- LED strip power supply connected (separate 5V)
- LED strip ground connected to ESP32 ground
- Device displays "Waiting for DMX"
- Power on all receivers first
- Power on sender last
- Confirm each device plays the fast RGBW boot sweep before entering "Waiting" state
- All receivers show "Clock: Slave" status
- Send MIDI CC1 (Master Brightness): LEDs respond
- Send MIDI CC8 (Animation Mode): Animation changes
- Send MIDI CC2 (Speed): Animation speed changes
- Send MIDI CC20 (Color A Hue): Color changes
- All receivers show same color
- All receivers show same animation
- Animation moves in perfect sync across all strips
- No visible timing differences
- Hold CC127 > 0 (Scene Save Mode)
- Press Note 36: Saves current state as Scene 1
- Change settings
- Press Note 36 again: Recalls Scene 1
- Verify all receivers change together
- Move receivers apart
- Verify DMX reception at 5m
- Verify DMX reception at 10m
- Verify DMX reception at 20m
- Note maximum working distance: _____m
- From repo root run
./controller/run.shon macOS/Linux (oruv pip install -r requirements.txt+python controller.pymanually) - Ensure the virtual MIDI input named "LeslieCTRLs" appears inside the DAW
- Verify GUI sliders move when turning DAW knobs and that CC values forward to the selected hardware port
- Confirm the app auto-selects a Midi2DMXnow USB or "USB Single Serial" port when available
- Check MIDI device is recognized (USB MIDI)
- Check baud rate 115200 (Serial MIDI)
- Check Serial TX/RX connections (M5Core)
- Monitor serial output for MIDI messages
- Check ESP-NOW initialized (serial debug)
- Verify sender is broadcasting (LED blinks)
- Check receivers show "DMX: Waiting" status
- Verify WiFi channel compatibility
- Verify MeshClock master/slave status
- Check clock sync in serial output
- Restart all devices (receivers first, then sender)
- Verify all on same WiFi channel
- Check LED strip power supply (5V, adequate amps)
- Verify data pin connection (GPIO correct)
- Check LED strip ground to ESP32
- Test with simple animation (solid color)
- Verify LED_COUNT matches actual strip length
=== Midi2DMXnow Starting ===
Platform: AtomS3
MIDI Mode: USB MIDI
Setup complete - Ready for MIDI
Broadcasting DMX over ESP-NOW
MeshClock master mode enabled
MIDI CC - Ch:1 CC:1 Val:64
Sent 100 DMX frames, Clock: 3456 ms
=== DMXnow2Strip Starting ===
Platform: AtomS3
LED Count: 120
LED_DATA_PIN: GPIO 2
Setup complete
Waiting for DMX over ESP-NOW
MeshClock slave mode enabled
DMX: Connected, Clock: 3456 ms, FPS: 60
✓ Sender receives MIDI and displays messages
✓ Sender broadcasts DMX at ~30 Hz
✓ All receivers connect and sync clock
✓ All receivers display identical animations
✓ Animations stay synchronized over time
✓ Scene presets work across all receivers
✓ Range meets project requirements
- ESP-NOW has a limit of ~20 paired devices (not applicable in broadcast mode)
- Broadcast mode has no pairing required, unlimited receivers
- Clock sync accuracy improves after ~10 seconds of runtime
- LED strips require adequate power (120 SK6812 RGBW LEDs ≈ 7A @ full white)
- Use separate power supply for LED strips, not ESP32 power
- DMX frame rate: 30 Hz (33ms interval)
- LED refresh rate: 60 FPS
- Clock sync accuracy: <5ms
- Radio latency: <20ms typical
- Maximum receivers: Unlimited (broadcast mode)