dome-rs is a Rust lighting control server for the MindShark dome. It ports the active parts of Spectrum into a headless runtime with a browser control surface, a dome simulator, Spectrum-compatible OPC encoding, TOML configuration, and input support for MIDI, audio, orientation, tap tempo, and Madmom beat protocol handling.
- Browser control page served by the Rust binary at
/. - Dedicated simulator page served at
/simulator. - Runtime controls for engine start/stop, active dome visualizer, flash speed, active palette slot, and full palette colors/gradients.
- Inputs drawer for tap tempo controls, MIDI log, and orientation calibration.
- Debug Visuals drawer for dome, bar, and stage hardware-check patterns.
- Live Preview drawer that mirrors the runtime frame stream used for hardware output.
- Independent
/simulatorsandbox with local controls that do not change runtime config or hardware output. - Dome simulator canvas streamed over WebSocket from engine frame data.
- Spectrum-compatible dome topology and projection data for the full 7,580-LED dome layout.
- Spectrum-compatible OPC packet encoding.
- Native TOML configuration with a Spectrum XML import command and shared-entry palette format.
- Core input support for MIDI/audio UDP adapters, optional macOS/Linux native capture, orientation datagram ingestion, tap tempo, and Madmom
BEAT:{seconds}protocol parsing. - Managed Madmom sidecar lifecycle using
DBNBeatTracker --host_api --audio_input=<index> online. - DJ Link / Carabiner-compatible sidecar tempo sync and Spectrum ADSR MIDI level drivers.
- Automated Spectrum visualizer parity: 17/17 first-frame and 11/11 multi-frame C# golden hashes (see parity closure).
Install/check local development dependencies:
tools/install_dev_deps.shUse tools/install_dev_deps.sh --check to verify Rust, Python, ALSA/PortAudio,
and the sibling Spectrum Madmom checkout without changing anything. On Linux the
installer uses sudo apt-get for system headers and python3 -m pip --user for
Madmom Python packages. Set SPECTRUM_REPO=/path/to/spectrum if the Spectrum
checkout is not next to domers.
Start the operator server with the checked example config:
make runOpen http://127.0.0.1:3000 and use MindShark Dome Control Panel.
examples/domers.toml is generated from the dome's Spectrum XML, but its OPC hosts are set to 127.0.0.1 so local loopback services can stand in for ledscape during development. To connect to physical controllers, copy the config and set the enabled hardware targets to the show network addresses:
[dome]
enabled = true
opc_address = "192.168.1.69:7890"
[stage]
enabled = true
opc_address = "192.168.1.70:7890"Check config, bind address, OPC address syntax, and Madmom command availability before starting output:
make doctor CONFIG=domers.tomlThen start with the same config, click Start, and check the fixed Runtime Status footer on the controls page. It shows each configured target address, enabled state, TCP connection state, successful frame count, input adapter status, MIDI level-driver values, orientation devices, and the last connection/write error.
Copy the starter config:
cp examples/domers.toml domers.tomlImport an existing Spectrum XML config:
make import SPECTRUM_XML=fixtures/config/spectrum_default_config.xml OUTPUT_CONFIG=domers.tomlSee docs/configuration.md for the TOML schema, palette format, and import behavior.
GET /: browser controlsGET /simulator: full simulator viewGET /api/health: health JSONGET /api/state: current runtime state, config, metrics, simulator inputs, hardware status, and input statusPOST /api/start: start the engine loopPOST /api/stop: stop the engine loopPATCH /api/config/dome: update dome runtime controlsPATCH /api/config/diagnostics: update dome, bar, and stage diagnostic/test-pattern controlsPATCH /api/config/palette: update one runtime palette entry, including gradientsPOST /api/input/tap: record one tap-tempo inputGET /api/dome/geometry: dome projection geometryGET /api/dome/mapping: dome strut and LED mappingPATCH /api/simulator: update shared simulator input state used by runtime preview renderingGET /api/simulator/frame: render one runtime preview framePOST /api/simulator/sandbox-frame: render a simulator page frame without changing runtime stateGET /ws/simulator: stream simulator frames and metrics
make deps-check
make build
make test
make lintRun make help for all build, run, test, lint, import, and release targets.
domers-core: shared config, color, beat, and migration domain types.domers-engine: deterministic operator scheduling rules.domers-inputs: fakeable audio, MIDI, Madmom, and orientation input helpers.domers-outputs: output commands, simulator sinks, topology helpers, and OPC transport.domers-server: runtime state, HTTP/WebSocket API, input tasks, simulator frames, and hardware output.domers-visualizers: dome/bar/stage visualizer and diagnostic renderers.domers-test-support: shared test helpers and fixture smoke checks.