Turn the 8 RGB pads on an Arturia MiniLab 3 into an animated light show. A small Python script paints the pad LEDs at ~25 fps over MIDI SysEx — purely as lighting. It never sends notes or CCs, so it runs happily alongside Logic Pro without touching what you play or record. Six of the modes listen to live audio and follow whatever the DAW is actually playing.
The MiniLab 3 ships with eight velocity pads that light up — and nothing interesting to do with those lights. Arturia never documented the protocol, but the community reverse-engineered the SysEx command from Arturia's own DAW integration scripts. That is the whole hook this project hangs on: one message per LED, sent fast enough to animate.
The result is a command-line light show. Pick a mode, pick a tempo or a brightness, and the pads run an animation until you stop it. The design constraint that shaped everything: the script must be invisible to the DAW. It writes to LEDs only — never notes, never CCs — so the keyboard keeps playing into Logic Pro normally while the show runs on top.
Ctrl+C restores every pad to its default grey on the way out.
The pads, mid-show. Filmed on the actual hardware — no post-processing on the lights. Watch on Instagram ↗
Pure functions of time. Smooth hue waves, chunky 8-bit marquees, neon glitch storms — each one is a small function that takes elapsed seconds and returns eight colors.
Driven by a beat clock at whatever BPM you pass in. The sequencer maps the eight pads to one 4/4 bar of eighth notes; pulse flashes the whole row on the beat and hits harder on the downbeat.
Listening to real sound instead of a number you typed. Spectrum analyzers, VU meters, transient flashes, and rings of light that expand from the centre on every hit.
Each pad LED is set by a single SysEx message. Colors are 7-bit per channel — 0x00 to 0x7F, not 0–255 — which is its own small design constraint when you are mixing gradients.
The render loop auto-detects the Minilab3 MIDI port, renders each frame as eight RGB
tuples, and pushes them to both pad banks so the show is visible whichever bank is
active on the device. On exit it restores the default grey.
Logic's own MiniLab integration occasionally repaints the pads when you switch tracks. At ~25 frames a second the animation paints straight over it — worst case you see a single frame flicker.
On macOS the audio modes capture system output through the free BlackHole loopback driver, so they hear the DAW rather than the room. Capture runs at 44.1 kHz in 512-sample blocks; each frame takes the newest 1024 samples, applies a Hann window and an FFT, and folds the result into 8 log-spaced bands from 40 Hz to 16 kHz — log spacing so the bass gets pads of its own instead of crowding into one.
Two bits of conditioning do most of the work in making it look right:
The transient modes detect hits with spectral flux against an adaptive threshold, plus a 120 ms refractory period so one kick doesn't fire three times. End-to-end latency lands around 50–75 ms — comfortably below the point where light lag starts to look wrong.
A new theme is one function and one dict entry. Take elapsed time, brightness and beat position;
return eight (r, g, b) tuples. Audio modes read a shared analyzer object instead of
taking extra arguments, so the signature never changes. NumPy and sounddevice stay lazily imported,
which keeps every non-audio mode running on mido alone.
Follow the DAW's clock and transport so the tempo-synced modes phase-lock to the project instead of free-running from the moment you hit enter.
A WebMIDI version with a theme picker, tap tempo and live pad preview, plus device profiles for other controllers. There is currently no device-agnostic pad light show app out there — the niche is open.
SysEx protocol reverse-engineered by the community from Arturia's Bitwig integration scripts — thanks to @Janiczek's gist and the Arturia forum threads on pad LED control. Not affiliated with or endorsed by Arturia. Released under the MIT license.
Built with Claude Code: Claude wrote most of the Python, I set the direction — which modes to build, how each one should look, and the calls on color and motion that only someone watching the actual pads could make.