Skip to content

DMX Monitor

towneh edited this page Oct 16, 2026 · 8 revisions

DMX Monitor

A live view of every channel in a universe, shaded by value, read from whichever DMX source is actually driving the scene.

VRSL → URP → DMX Config → DMX Monitor. It opens as an ordinary editor window, so it docks beside the Inspector or tears off to float, whichever suits.

What it is for

A lit scene hides most DMX faults. A patch off by one lights every fixture and moves every head, just reading its neighbour's values, and that reads as a lighting design decision rather than a fault. A universe that stopped arriving keeps its last values on screen, so a static look and a dead feed are the same picture in any view of the values alone. And a channel source that registered but never heard anything looks exactly like no source at all.

The monitor separates those. It shows the values themselves, where they came from, and how long ago each universe was last heard from.

It only reads. Nothing in it writes a channel.

Play mode only

Neither light manager has [ExecuteAlways], so no channel buffer is uploaded and no CRT chain runs while the scene is stopped. The window says so rather than presenting an empty grid as a finding.

Reading the header

The top box names the path the fixtures are really reading:

Header Means
Stream data — <source type> DMX Input is Stream data, and a source is publishing bytes the fixtures read. A Truss source that has decoded no record yet says so underneath.
Video grid — <layout> A grid input. The pixel grid drives the fixtures; a source in the scene shows as (<source type> on standby).
Stream data — nothing is sending it, lights dark Stream data is chosen and nothing is publishing: no source, or one publishing no universes. The fixtures are dark.

From the lights, that last one looks like a show with every channel at zero.

The views

Fixture: 13 wide by 40 rows, VRSL's own packing. One row is one 13-channel fixture, so a patch off by one shears diagonally across the whole page and is obvious at a glance.

Desk: 32 wide by 16 rows. Channel numbers land on round boundaries, which makes a specific channel findable by eye.

Overview: every universe at once, one row each. Use it to see which universes are live before picking one to look at.

The last eight addresses of each universe are padding: the decode grid is 13 wide, 512 does not divide by 13, so each universe is rounded up to 40 whole rows and the next one starts on a fresh row. No desk can address those and nothing reads them. They are drawn in a distinct colour so a zero there is not mistaken for a dark fixture.

The ramps

Heat is monotonic in lightness, so the colours read as an ordering rather than as categories, and zero sits obviously dark.

Grey maps the byte straight to a grey level. Use it when comparing against a desk.

Change shades each cell by how much it moved since the last sample rather than by its value. It detects channel movement, not arrival: a source republishing the same values every frame is dark here, exactly like one that has stopped sending. For liveness read the last heard N s ago figure in the status bar instead, which is driven by each universe's own latch time and keeps climbing whether or not the values move.

Hovering a cell

The status bar names the universe and channel, the flat VRSL address, the value as both a byte and a normalised float, and, when a fixture is patched there, that fixture and what the channel does for it. The role comes from the fixture's own layout, so a 5-channel static reports dimmer / red / green / blue / strobe and a 13-channel fixture reports the full pan / tilt / zoom / dimmer / strobe / RGB / gobo / smoothing set.

Both VRSLDMXRealtimeLight and VRSLDMXStatic are scanned. The list is rebuilt when the hierarchy changes, not per frame.

Verify

On the buffer path only, Verify additionally reads the channels back through the compute shader and compares them against what the source published. It catches a packing or indexing fault against live data, where VRSL → URP → DMX Config → Validate DMX Channel Buffer only checks against the synthetic source's Ramp pattern.

It costs a dispatch and a readback per sample, so it is off by default.

A constant offset in the reported channel is an indexing fault. A value that looks like a neighbouring byte is a packing fault.

Cost

Nothing runs while the window is shut.

While it is open, values are sampled at 30 Hz. On the buffer path with Verify off that is a read of an array the manager already keeps, with no GPU work at all; Verify adds one compute dispatch and one asynchronous readback per sample, which is why it is opt-in. On the video path it is always one dispatch of the same accessor the fixtures use, read back asynchronously.

A window docked behind another tab parks itself: it only asks to be repainted while it is being drawn, and switching back to the tab draws it once unprompted, which restarts it.

Limitation on the video path

Channel values are read back through the compute shader's decode, in the manager's grid layout, which is the same accessor the render-pass lights use. A Legacy grid holds one universe, and the window shows one. That path does not implement nine-universe mode, so a grid authored that way will not read correctly in the monitor. The window says so under the header whenever it is on the video path.

The buffer path has no such limitation: the bytes are read directly.

Clone this wiki locally