LUMI Bridge is a small native helper for ROLI LUMI Keys BLOCK devices. It exposes virtual MIDI ports for apps that want normal note input and per-key light output, while handling the LUMI-specific BLOCKS protocol internally.
- Creates
LUMI Keysas a virtual MIDI source for key input. - Creates
LUMI Lightsas a virtual MIDI destination for light output. - Connects to the physical
LUMI Keys BLOCKMIDI input/output pair. - Detects one or more LUMI Keys BLOCKs through BLOCKS topology messages.
- Starts and maintains BLOCKS API mode.
- Loads bundled Littlefoot bytecode into each LUMI heap.
- Runs a multi-color startup scan across connected blocks.
- Maps each connected LUMI to its own note range.
- Can light physically pressed keys locally while forwarding MIDI input.
- Converts app MIDI note events into per-key RGB565 light frames.
- Blinks repeated note-on events so repeated notes are visible.
cargo build --releaseThe binary is created at:
target/release/lumi-bridgetarget/release/lumi-bridgeBy default the bridge is quiet, terminates another running lumi-bridge
instance before opening MIDI ports, and leaves physical key lighting to the
app connected to LUMI Lights.
Useful options:
target/release/lumi-bridge --local-light
target/release/lumi-bridge --verbose
target/release/lumi-bridge --no-scan
target/release/lumi-bridge --no-killThen select these ports in your MIDI app:
- Input:
LUMI Keys - Light/output destination:
LUMI Lights
On first run, the bridge writes a settings file:
- macOS:
~/Library/Application Support/LUMI Bridge/settings.json - Linux:
$XDG_CONFIG_HOME/lumi-bridge/settings.jsonor~/.config/lumi-bridge/settings.json - Windows:
%APPDATA%/LUMI Bridge/settings.json
You can also choose a config path explicitly:
LUMI_BRIDGE_SETTINGS=/path/to/settings.json target/release/lumi-bridgeExample:
{
"lumi_port": "LUMI Keys BLOCK",
"input_port": "LUMI Keys",
"lights_port": "LUMI Lights",
"base_note": 36,
"key_count": 24,
"block_span": 24,
"serial_order": []
}For two LUMIs, set serial_order to control left-to-right block assignment. The first serial gets base_note; the second gets base_note + block_span.
cargo test