Back to the resultsSource: night-2026-10-11/BENCHMARK.md

LightDesk vs the best busking desks (2026-10-11)

Scope: one operator busking a live, improvised show on the Tiny Room rig. /api/rig counts 41 fixtures: 6 spots, 4 washes, 12 pars (7 par + 5 truss), 6 bars, 3 blinders, 8 profiles (6 leko + 2 FOH), 1 strip and 1 hazer (unstable/data/rig.json). Code read: /Users/gregspero/trc-lighting/unstable on branch two-screen. All file:line references are relative to that folder unless they start with audit-. Web sources were fetched or seen as search excerpts on 2026-10-11. Exa was not available in the research seats, so the research used WebSearch and WebFetch. [snip] marks a claim taken from a search excerpt of that exact URL whose page was not opened (moderate confidence). Everything else was read. No Reddit threads came up in any search. Every complaint below comes from a vendor forum, the Blue Room, ControlBooth or a review site.

1. What our desk already does well

Pattern Our implementation Evidence
Look snapshot with a photo S key or the SAVE slab captures live looks, programmer lines, master and a camera frame; recall fades. ONYX users cannot even Load from overrides wwwroot/v2/desk.js:771, API.md My scenes, wwwroot/v2/save.js; https://forum.obsidiancontrol.com/t/load-from-overrides/7565
Multi-step undo 10-deep ring covers looks, hits, faders, colour, master, say, blackout. Esc is undo. Undo is wider than Eos (no playback undo) or ONYX (programmer only) Program.cs:161-175, :993; desk.js:770; Eos [snip] .../%5BUndo%5D.htm; https://support.obsidiancontrol.com/Content/Onyx_Manual/Programming/Manipulating_Fixtures/Undo.htm
Guarded blackout Hold B for 0.7 s; a short press does nothing desk.js:144-159
Global fade time Snap/1/2/4/8 s, [ and ] keys, shared by both screens. Same job as the MagicQ Busking Master desk.js:643-645; https://docs.chamsys.co.uk/magicq/1.9.9.x/manual/busking.html
Hit pads 24 hits on 1 to = with Shift, hold = flash, tap = latch, play on picked heads desk.js:655-656, data/hits.json
Per-fixture release ("back to the look") /api/release frees the picked heads from the programmer and leaves the rest Program.cs:1123
Two screens with a shared selection over SSE Similar to MA3 and Titan workspaces Program.cs:1549-1620, wwwroot/v2/sync.js
Output rate 40 Hz sACN/Art-Net render loop. MA3 DMX ports run at 30 Hz Dmx/Engine.cs:62, :878; https://help.malighting.com/grandMA3/2.3/HTML/dmx.html
Haze as its own control Cycle, burst and off are the only paths to the hazer, with a guard on every line Program.cs:784, RigState.cs:412, desk.js:404-405
Timecode chase POST /api/show/tc; seeks on jumps over 2 s Program.cs:882

2. Ranked gap table

Value is for one busker in this room (1 to 5). Effort: S under 2 h, M 2 to 6 h, L more than a night. Every proof runs on the muted v2 preview, port 7075 (OPEN LIGHTDESK V2 PREVIEW (no lights).cmd). It reads the frame with GET /api/dmx/frame?u=1&from=..&to=.. and GET /api/dmx/state. In a dry run both render on request.

# Pattern Who does it best, and how Our status Effort Value Proof with the lights off
1 Global BPM / speed master with tap, ½× and 2× MA3: 16 Speed Masters at 0 to 225 BPM with Learn, plus DoubleSpeed/HalfSpeed buttons (https://help.malighting.com/grandMA3/2.4/HTML/masters_speed.html). MagicQ: Speed Master macros for BPM, Tap and Divisor/Multiplier; CTRL+FLASH resyncs (https://docs.chamsys.co.uk/magicq/1.9.9.x/manual/shortcuts.html, .../busking.html). Lightkey: one-click re-sync and halve/double (https://lightkeyapp.com/en/specs) Missing in v2. The v1 TAP button exists but is hidden (wwwroot/index.html:732-745). Hit steps are fixed milliseconds, e.g. STROBE at 70 ms (data/hits.json selstrobe). The motion period is fixed when the move starts (Program.cs:900-903) M 5 Tap T four times at 120 BPM, then sample /api/dmx/frame for a strobe hit's dimmer channel every 25 ms. The on/off edges should sit 500 ms apart ±25 ms. Press 2× and they should sit 250 ms apart
2 DBO that keeps the state (a master to zero that does not clear) MagicQ: DBO zeroes HTP channels and leaves LTP alone (https://docs.chamsys.co.uk/magicq/1.9.9.x/manual/playback.html). Eos: blackout plus {GM Exempt} [snip] (https://www.etcconnect.com/WebDocs/Controls/EosFamilyOnlineHelp/en/Content/13_Cue_Playback/01_Playback_Fader_Controls/Blackout_and_Grandmaster.htm) Partial. Blackout is destructive: ClearAll, Off Sequence Thru, hazer off and master reset (Program.cs:229-234). Getting the stage back needs Undo. The BLACKOUT HIT pad dips only the picked heads (data/hits.json seldip) S 5 Play a look, press DBO, and check that every dimmer channel is 0 while /api/dmx/state live[] and pan/tilt are unchanged. Release DBO: the dimmers return to their old values within one frame and nothing moves
3 Engine-side effects (phasers / shapes) rendered every frame with live rate, size and phase spread Titan Shape Generator: wheels for speed, size and spread, with selection order driving the phase (https://manual.avolites.de/docs/en/effects/shape-generator/ [snip]). MagicQ FX: X speed, Y crossfade, D size up to 800 %, Spread (https://docs.chamsys.co.uk/magicq/1.9.9.x/manual/FX_engine.html). MA3 Phasers (https://help.malighting.com/grandMA3/2.3/HTML/phaser.html) Partial. MotionRunner sends command-line cues every 0.5 s, each with a fade (Program.cs:1740-1790). Stagger is hard-coded per shape (Program.cs:1764-1768). Nothing changes rate or size after the start. There are no dimmer or colour waveforms, only hit step lists L (M for dimmer + colour waveforms only) 5 Start a sine dimmer on the 12 pars with spread 100 %. Sample one frame and check the 12 values are evenly phase-offset. Move the rate fader and check the period in frame samples changes with no jump
4 Live rate and size faders for whatever is running Eos Global Effects Fader: Effect Rate and Size 0 to 200 (https://www.etcconnect.com/WebDocs/Controls/EosFamilyOnlineHelp/en/Content/14_Effects/02_Effects_on_Faders/Global_Effects_Fader.htm). Titan Rate Grand Master and Size Masters (https://manual.avolites.com/docs/running-the-show/playback-controls/). Daslight: Dimmer, Speed, Phase and Size on every scene (https://www.daslight.com/daslight5) Missing. The motion API takes period and size only at start (Program.cs:900) S once #1 and #3 exist 5 Same frame sampling: the amplitude halves when size goes from 100 to 50
5 Highlight / lowlight / solo on the picked heads MagicQ: HIGHLIGHT, SHIFT for lowlight, CTRL for solo (https://docs.chamsys.co.uk/magicq/1.9.9.x/manual/shortcuts.html). Eos: [High] with Next/Last to step through [snip]. ONYX: Highlight = open white 100 %, editable (https://support.obsidiancontrol.com/Content/Onyx_Manual/Programming/Manipulating_Fixtures/Programmer_Modes.htm) Missing. The only "highlight" is the assist mode that dresses the stage around a point (Program.cs:443-478) S 4 Pick 1201 and press H: its dim is 100 and its colour white in /api/dmx/state. Press H again: its values are back byte for byte
6 Selection tools: odd/even, halves, reverse, step Next/Prev, selection order kept MA3 MAtricks: Block, Group, Wings, Width, Next/Prev (https://help.malighting.com/grandMA3/2.3/HTML/matricks.html). ONYX Grouping Tools: Every, Block, Divide, Mirror, Next/Last (https://support.obsidiancontrol.com/Content/Onyx_Manual/Programming/Fixtures_and_Groups/Groups/Using_the_Grouping_Tools/Using_the_Grouping_Tools.htm). MagicQ Linked Groups (https://docs.chamsys.co.uk/magicq/1.9.9.x/manual/selecting.html) Partial. There are kind groups (Spots, Washes, Pars and so on, desk.js:50-56) plus shift-add and toggle picks (desk.js:432-468). There is no odd/even/halves/next, and pick order is not shown S 4 Pick Pars, press ODD: /api/ui/selection picked holds every second fid in rig order. Press NEXT: one head at a time, wrapping
7 Fan across the selection (level, pan, colour) Eos: every [Thru] level or time command fans, with Center, Mirror and Random styles [snip] (.../08_Manual_Control/03_Fan/Fan_Styles.htm). MagicQ: 3 * fans palette timing, with /, +, - and . variants (https://docs.chamsys.co.uk/magicq/1.9.9.x/manual/shortcuts.html) Missing. The inspector shows "mixed" and the spread between heads but cannot write one (wwwroot/v2/inspector.js:527, :568) M 3 Fan pan -30 to +30 across the 6 spots: /api/dmx/state pans are evenly spaced. Fan time 0 to 2 s: the frame timestamps show the stagger
8 Palette recall onto the picked heads (colour, position, beam/gobo) as live buttons MA3 Presets (Selective, Global, Universal; Recipes) [snip] (https://help.malighting.com/grandMA3/2.2/HTML/presets.html). Eos palettes are referenced, so editing one updates every cue that uses it [snip]. Titan timed palette recall [snip] Partial. Colour presets (At Preset 4.) and 9 AIM zones exist (API.md Aiming). The colour pop-up acts on fader groups, not the pick (desk.js:364-371). Beam/gobo palettes do not exist; gobos are raw Decimal8 in beam looks (Program.cs:555-569) M 4 Pick 2 spots and tap BLUE: only those two fids change in /api/dmx/state. Tap GOBO 3: Gobo1 reads slot value 45 on those two only
9 Hardware faders and pads over MIDI with feedback Lightkey: MIDI Learn, 14-bit, LED and motor-fader feedback, Shift layer (https://lightkeyapp.com/en/specs). Daslight: an app-wide mapping mode for MIDI, OSC, keyboard and DMX (https://www.daslight.com/daslight5). Resolume: per-surface shortcut edit modes (https://resolume.com/support/en/shortcuts) Missing. The only OSC is the client link to MA3 (Program.cs:1628-1633). The browser has no MIDI input M (Web MIDI in the page) 4 Use a virtual MIDI port (loopMIDI on the PC) to send CC 7 = 64 on channel 1: the master fader and /api/status master both read 50. Note 36 on/off holds and releases hit 1
10 Flash master / swop (solo) on hits and looks Titan: Flash adds, Swop solos, Timed Flash, and handles lock across pages (https://manual.avolites.com/docs/running-the-show/playback-controls/). ONYX Flashmaster caps every flash (https://support.obsidiancontrol.com/Content/Getting_Started/General_Concepts.htm) Partial. Hits hold or latch (desk.js:655). A look recall solos by default, and /api/scene/{id}/on stacks (Program.cs:807-819). There is no swop on a hit and no flash level cap S 3 Swop-hold STROBE: the dimmers of fixtures outside the hit read 0 in the frame while held, and come back on release
11 Haze exempt from blackout and master Eos {GM Exempt} [snip]; MagicQ "Ignore Masters" for "house lights, smoke machines" (https://docs.chamsys.co.uk/magicq/1.9.9.x/manual/playback.html) Inverse. Blackout sends Go+ Macro 954, which turns haze off (Program.cs:234). Haze has to be re-armed after every blackout S 3 Haze cycle on, then DBO: /api/dmx/status haze still reads cycle, and fixture 921's channels still change at the cycle times
12 Autosave and versioned backups of looks, hits, timelines and my scenes MagicQ Auto Backup: On Changes, or Always every 60 s, plus a Backup Archive (https://docs.chamsys.co.uk/magicq/1.9.9.x/manual/settings.html). MA3: 10 timestamped backups per show (https://help.malighting.com/grandMA3/2.0/HTML/sfh_backup.html). Eos archives every save [snip] Partial. The only backups are hand-made dated copies (data/*.backup-2026-09-1x.json, scenes.backup-2026-10-10.json). rigstate.json is saved 800 ms after a change (RigState.cs:107-111), but data/rigstate.json is 0 bytes in this checkout S 3 Edit a user scene: a new data/backups/user-scenes-<stamp>.json appears, rotating at N=20. Corrupt user-scenes.json: the desk boots from the newest backup
13 Busking cue stacks with Go/Back per pad MagicQ: S steps, SHIFT+> steps back, S 2 ENTER jumps (https://docs.chamsys.co.uk/magicq/1.9.9.x/manual/shortcuts.html). ONYX: Button 1 Go, Button 2 Pause/Back (https://support.obsidiancontrol.com/Content/Onyx_Manual/Playback/Cues_and_Cuelists/Cuelist_Options/Function_Assignments.htm) Partial. Only timelines have next/prev (Program.cs:877-878). Hits are flat step loops (Program.cs:656-743) M 3 Bind a 3-cue stack to a pad: Go, Go, Back. /api/dmx/state shows cues 1, 2 and 1 in order
14 Priority levels (a shape survives a strobe swop) Titan: priority Low to Very High; the manual's busking example keeps a High position shape through a Swop [snip] (https://manual.avolites.de/docs/en/cues/playback-options/). Eos: priority 1 to 10 plus Assert [snip]. MA3 Super/Swap/HTP/... (https://help.malighting.com/grandMA3/2.2/HTML/cue_sequence_settings.html [snip]) Partial. The layers are looks in arrival order, then the programmer (LTP), then parks (Dmx/Engine.cs:13-16). There are no levels and no HTP intensity option M 3 Run a motion, fire a hit that names pan: pan still follows the motion when the motion is set High
15 Live audio follow (beat or band triggers from the room mic) MA3 Sound Viewer: 22 bands and BPM, beat lock [snip] (https://help.malighting.com/grandMA3/2.3/HTML/fs_connect_audio_in.html). MagicQ Audio Input BPM and 7 bands (https://docs.chamsys.co.uk/magicq/1.9.9.x/manual/audio.html). Titan: 7 bands, but needs console audio hardware (https://manual.avolites.com/docs/running-the-show/midi-dmx-or-audio-triggering/) Missing live. There is offline file analysis only (tools/audio-analyze, API.md Audio analysis). The song-sync builder plays a file (API.md two-page desk) L 3 Play a 120 BPM click from a WAV into the input: the BPM readout locks to 120 ±1 within 8 beats
16 Phone or tablet remote with the pads MA3 Web Remote, port 8080, 5 sessions on onPC (https://help.malighting.com/grandMA3/2.2/HTML/network_webremote.html). MagicQ: the Execute Window appears in the Remote apps (https://docs.chamsys.co.uk/magicq/1.9.9.x/manual/execute.html). ONYX Remote is iOS only with no cuelist status (https://support.obsidiancontrol.com/Content/Onyx_Manual/Networking/Onyx_Remote.htm) Partial. The phone menu shows the LAN URLs (desk.js:190-192). The v1 page stacks under 900 px (audit-2026-10-10/AUDIT.md section 2.14). There is no v2 phone layout M 3 Load a 390 px viewport headless: 12 pads, blackout and master are all visible with targets of 44 px or more. A pad press shows up in /api/dmx/state
17 Blind / preview programmer MA3 Preview: a separate programmer shown with red borders [snip] (https://help.malighting.com/grandMA3/2.2/HTML/keyword_preview.html). Eos Staging Mode [snip]. Lightkey Blind and Freeze (https://lightkeyapp.com/en/specs) Missing. Dry run mutes the whole desk only (API.md dry run) L 2 Turn Blind on, change a level: the frame is unchanged while /api/dmx/state shows the pending value
18 Lamp / reset / identify per fixture Eos Lamp Controls with confirmation [snip]. MagicQ SHIFT+LOCATE for lamp on, CTRL+LOCATE for reset (https://docs.chamsys.co.uk/magicq/1.9.9.x/manual/shortcuts.html) Missing. There is no reset channel path; raw Decimal8 exists (API.md engine lines) S 2 Reset on a spot: its control channel reads the profile's reset value for 3 s, then default
19 Pixel mapping on the strip ONYX DyLOS merges into the DMX output (https://www.obsidiancontrol.com/pages/dylos). MA3 Bitmap [snip]. Resolume Lumiverse (https://resolume.com/support/en/dmx) Missing. The strip is fixture 9001, driven as one unit (desk.js:43, :55) L 2 A chase across the pixels: frame channels for 9001 show a moving peak
20 Park MA3 Park/Unpark [snip]; ONYX Park per parameter since 4.10 (https://forum.obsidiancontrol.com/t/onyx-4-10-release/7869) Ignored in standalone on purpose (Dmx/Engine.cs:409, :439-441) S 1 n/a
21 Redo Lightkey unlimited undo and redo (https://lightkeyapp.com/en/specs); Titan Avo+Undo (https://manual.avolites.com/docs/titan-reference/button-reference/) Missing. The ring only pops (Program.cs:993-1000) S 2 Undo then Redo: /api/dmx/state matches the pre-undo snapshot

3. Top 12 to build tonight, in order

  1. DBO that keeps state (#2, S). Hold B stays the destructive blackout. Add a momentary DBO on the Grand Master that is exempt for the hazer (#11).
  2. Haze exempt from DBO and master (#11, S). One branch in the master scaling for fixture 921.
  3. Global BPM clock with tap, ½×, 2× and resync (#1, M), on keys T, comma and period. Server-held BPM in /api/status and pushed over SSE.
  4. Hit steps in beats (#1 continued). ms becomes optional beats, and STROBE, PULSE, CHASE and HEARTBEAT follow the clock.
  5. Engine waveform layer for dimmer and colour (#3, M slice). Sine, saw, square and random, with spread across the selection order, rendered inside Engine.Render at 40 Hz instead of 0.5 s command cues.
  6. Live Rate and Size faders (#4, S) for the waveform layer and the MotionRunner. Motion period follows BPM when synced.
  7. Highlight / solo key H (#5, S). Snapshot the picked heads' programmer values, then restore them byte for byte.
  8. Selection tools (#6, S): ODD, EVEN, HALF L, HALF R, REVERSE, NEXT, PREV. Show the pick order as small numbers on the light map.
  9. Palette buttons on the pick (#8, M): colour, the 9 AIM zones and the 7 gobo slots, applied to the picked heads only.
  10. Swop on hits plus a flash cap (#10, S).
  11. Web MIDI mapping with learn (#9, M). Master, group faders, the 24 hits, DBO and tap, stored in data/midi-map.json.
  12. Autosave with rotating backups for user-scenes, hits, timelines and scenes (#12, S), plus fixing the 0-byte rigstate.json (#12) and adding Redo (#21) on the same ring.

Deferred, because each is more than a night: priority levels (#14), live audio follow (#15), the v2 phone layout (#16), blind (#17), pixel mapping (#19), and the full shape generator for pan/tilt with live phase (#3 L part).

4. Traps to avoid (user complaints)

Product Complaint Lesson for us Source
grandMA3 Selective absolute phasers are "a nightmare" to create and manage when busking; Stomp is unreliable with relative values Effects must apply to whatever is picked, relative by default https://forum.malighting.com/forum/thread/69014-my-suggestions-for-a-phaser-overhaul/
grandMA3 A playback master under 100 % bends dimmer phasers (50 % gives 25 to 75 %) Master scaling goes after the waveform, never into its offset https://forum.malighting.com/forum/thread/69526-playback-masters-under-100-seemingly-behaving-wierdly-with-dimmer-phasers/
grandMA3 Speed masters stored in presets act selectively, so live speed control is awkward One global BPM; per-effect multipliers only https://forum.malighting.com/forum/thread/8789-how-control-speed-for-busking/
grandMA3 Absolute colour phasers overwrite the base colour once stored [snip] A waveform layer modulates and never writes the base look https://forum.malighting.com/forum/thread/68881-absolute-color-phasers-questions-suggestions/
Eos Busking means you "trick the console"; there is no executor grid [snip] Keep pads and faders first-class, never behind a command line https://www.controlbooth.com/threads/need-some-advice-on-new-console-used-for-concert-busking.33005/
Eos Tap-to-BPM works only once the effect is running [snip] Tap sets the global clock even with nothing running https://community.etcconnect.com/control_consoles/eos-family-consoles/f/eos-family/33713/how-does-bpm-interact-with-rate
Eos v3.1 Undo stopped restoring effects and broke a busking macro [snip] Undo snapshots must include running effects and motion https://community.etcconnect.com/control_consoles/eos-family-consoles/f/eos-family/40231/busking-macro---stop-then-restart-effects
Titan Tapping the Rate Grand Master syncs chases but not shapes [snip] One clock drives hits, waveforms and motion alike https://forum.avolites.com/viewtopic.php?t=4704
Titan Keyframe shapes start mid-cycle when fired [snip] Effects start at phase 0 on the next beat, or immediately, chosen explicitly https://forum.avolites.com/viewtopic.php?t=7383
Titan Fixtures visibly move into position before a shape unless Preload is used Move dark: pre-position with dimmer 0, then fade up https://forum.avolites.com/viewtopic.php?t=4280
Titan Sound-to-light does not work from a PC audio input Any live audio follow must use a normal Windows input http://forum.avolites.com/viewtopic.php?t=7275
MagicQ No clean "stop all FX"; releasing one playback revives FX that ran before [snip] One STOP EFFECTS control that clears the whole effect layer https://www.blue-room.org.uk/topic/79692-magicq-advice-busking-execute-window-soft-pallets/
MagicQ Recorded FX speeds got corrupted when Tap to Time buttons were set to GO [snip] Tap never writes into stored hits or looks https://www.blue-room.org.uk/topic/64808-magicq-forgetting-fx-speed/
ONYX Changing BPM live makes output jump: "can't use this for busking"; crash with global rate below 100 % BPM changes keep the current phase; the clock is tested at the extremes https://forum.obsidiancontrol.com/t/onyx-rc-4-9-1259/7725
ONYX FX speed was not BPM-linked natively and needed a formula workaround Rates are stored in beats, shown in BPM https://forum.obsidiancontrol.com/t/bpm-fx-speed-and-the-magic-formula-sqrt-bpm-3276-8/6218
ONYX 4.32 crashes the day before a show, traced to the external MIDI helper Keep MIDI in the page (Web MIDI), so a MIDI fault cannot take down the engine https://forum.obsidiancontrol.com/t/onyx-crashing-regardless-of-show-file-or-pc/8511
Lightkey Hard to navigate past about 20 lights Groups and selection tools before more tiles https://articles.aboveavl.com/post/lightkey-is-it-the-right-lighting-software-for-me-interface-guide
Lightkey No per-fixture pan offset for heads hung inconsistently Ours exists (Dmx/Engine.cs:210, :327); keep it https://www.macupdate.com/app/mac/53710/lightkey
Daslight Crashed "in the middle of my set" at every show Server crash recovery must restore the last look (rigstate) within seconds https://forum.daslight.com/viewtopic.php?t=8881
Daslight Speed in Touch mode does not work as expected Test every speed control from every surface https://forum.daslight.com/viewtopic.php?f=25&p=23452
QLC+ A whole solo frame deleted with no undo Library edits (delete hit, delete scene) go through undo or backups https://www.qlcplus.org/forum/viewtopic.php?t=17945
QLC+ A busker had to put everything in one solo frame and wants MA-style executors Stack and solo must both be one tap https://www.qlcplus.org/forum/viewtopic.php?t=13413
QLC+ Fades step visibly while a tap button is on screen UI timers must never share a thread with frame rendering https://www.qlcplus.org/forum/viewtopic.php?t=12379
Resolume Arena 7 lag caused missed taps and BPM jumps to 500 Clamp tap BPM to 40 to 240 and ignore taps over 2× apart https://resolume.com/forum/viewtopic.php?t=15064
Resolume Moving heads are not really supported A pixel/media tool is no model for movers; use console patterns https://resolume.com/forum/viewtopic.php?t=31648

5. Could not establish