Releases: fiverecords/DMXRouter
DMXRouter 1.9.3
Fixture Check Web Interface
- Full commissioning parity with the desktop from a phone or tablet — the new Fixture Check web panel is designed mobile-first with 44 px touch targets so you can walk the rig with the tablet in hand. Every fixture in the current patch is listed with its address, type and mode; tap any fixture to open the detail panel with Home, Highlight and Release buttons plus live sliders and combos for every channel. No desktop required once the rig is loaded
- Walk the rig without going back to the list — the detail panel has Prev / Next arrows that step through fixtures in the order you see them (respecting any search or filter you have active). If Highlight is engaged on the current fixture, Prev / Next automatically releases it and highlights the next one — the classic "select, highlight, next, next, next" commissioning flow, one-handed on a tablet
- Live two-way sync with the desktop — slide a slider on the desktop, the tablet's slider moves in lock step; tap Highlight on the tablet, the desktop's Fixture Check panel catches up too. Overridden fixtures show their live values directly on the list rows ("Dim 180 · Pan 32000" or a count badge when more than three attributes are active), with a green tint so you can spot what's driven at a glance
- Semantic controls per fixture type — resolved fixtures get labelled sliders for Dim, Pan, Tilt, R, G, B and every other GDTF attribute, with 16-bit precision where declared. Channels with named ranges (gobo wheels, colour macros, strobe modes) render as dropdown combos showing the range names — pick "Glass 3" or "Shake Slow" instead of hunting for the right DMX value. Placeholder fixtures fall back to numbered Ch1..ChN sliders
- Search and filter — the search bar matches against FID, name, manufacturer / model and address. Two chip filters cover the common rig-check needs: "Overridden only" to isolate what's being driven and "Show cells" to expand LED bars and pixel matrices so individual cells can be driven
- Collapsible groups by MVR layer — the fixture list is grouped by the layer name from the original MVR import (the same grouping the desktop's Fixture Patch dock uses). Sticky headers show each layer's name, fixture count, and a green dot if any fixture in the group is currently overridden. Tap a header to collapse or expand. State survives reloads and accidental F5s — if you've collapsed everything except "Movers" for a focus call, it stays that way next time you open the page. An active search auto-expands every group that has matches so you don't have to hunt
- Release All — true panic button — a red button right next to Check RDM in the patch header clears every active override across every fixture with no confirmation modal. The whole point of a panic button is that it works the moment you tap it; Show Mode on the desktop is the safety net for live shows. A red pulsing floating button also stays visible in the bottom-right while any override is live, for when you've drilled deep into a fixture's detail panel and don't want to scroll back up
- Check against RDM — a Check RDM button in the patch header opens a full-screen cross-reference report comparing every patched fixture with the discovered RDM devices. Counters at the top show OK / Missing / Wrong Type / Wrong Personality / Via Cells / Unknown at a glance, with coloured dots per row; the Issues filter is selected by default so problems come up first. Tap any row to jump straight to that fixture in the patch list with its detail pre-opened. An Extras section lists RDM devices discovered on the wire that aren't in the patch, helpful for finding fixtures that need to be added
- Tablet split view — at 900 px and wider the fixture list and detail sit side by side so you can step through without navigation ping-pong. Below that the list collapses to full-width and the detail slides in on tap
- Authentication — all write operations inherit the existing web PIN. If a PIN is set in web settings, the tablet authenticates once and stays connected for the whole session
Stability
- Recovery from blocked socket binds at startup — on machines running endpoint-protection software (CrowdStrike, SentinelOne, Defender for Business, some corporate VPNs) the Art-Net (port 6454) and sACN (port 5568) receive sockets could be silently held by the security stack for several seconds while the freshly-launched DMXRouter executable was being scanned. The previous startup gave up on the bind retries after about 600 ms, leaving the receive pipeline permanently inert until the application was restarted — Wireshark would show no traffic, no nodes were discovered, and the only workaround was to toggle the network interface in Windows. The bind retry window is now extended to roughly 30 seconds with exponential backoff, and any subsequent network change (cable plug/unplug, WiFi toggle, VPN connect, IP change) automatically triggers a fresh attempt to bind whichever sockets are still down. The application now self-heals as soon as the security stack stops blocking, with no user action required
RDM Transaction Log
- Search box and Failures-only filter — the transaction log at the bottom of the RDM panel now has a live search box (matches against Device UID, PID name, and Detail columns case-insensitively) and a "Failures only" checkbox to isolate flaky devices in a busy log. A "Clear" button wipes the table while preserving the active search/filter so the next batch of transactions stays focused on what you're hunting
RDM Linkage
- Multi-cell fixtures now check personality on the cell aggregate — when a multi-cell container (LED bar, pixel matrix) has its single RDM responder at the parent's address, the cross-reference now compares the responder's channel count against the sum of the cells' channels rather than against the (zero) container footprint. A 16-cell × 6 ch matrix patched against a 32-channel responder is now flagged as "Wrong personality" with a detail line spelling out the arithmetic ("16 cells × 6 ch = 96 channels total, but the RDM responder reports 32 channels"), instead of silently passing as Ok. Heterogeneous containers with mixed cell modes get the totals without the per-cell breakdown
- Manufacturer comparison tolerates corporate suffixes — RDM responders often report the legal entity ("Robe Lighting", "Chauvet Professional", "Acme Lighting GmbH") while GDTF files use the brand name ("Robe", "Chauvet", "Acme"). The cross-reference now matches these correctly through a tiered comparison: exact match first, then suffix-stripping (Lighting, Professional, Inc, GmbH, Ltd, Corp, Industries, etc.), then a token-prefix fallback for cases where the suffix is concatenated without a space ("Robe" matches "Robelighting"). Fixtures previously flagged as "Wrong fixture type" purely because of the corporate-name difference now match cleanly. Model name comparison stays strict — only the manufacturer column is treated as having interchangeable forms
- Export the cross-reference report — right-click anywhere in the Patch ↔ RDM dialog for "Export as CSV…" and "Copy to clipboard". The CSV file is RFC 4180 compliant with a UTF-8 BOM so Excel on Windows opens it correctly with accented fixture names intact, and the default filename combines the show name with a timestamp so successive exports don't overwrite each other. The clipboard copy is tab-separated for direct paste into Excel, Google Sheets or a Slack code block. Both formats include 13 columns: status, FID, name, patched type/mode/footprint, universe, address, RDM UID, RDM type/footprint/personality, and the diagnostic detail line — enough to triage the rig from a phone or hand the report to a collaborator
DMXRouter v1.9.3 — Built for the stage.
DMXRouter 1.9.2
Fixture Patch
- Add fixtures by hand — new "Add Fixture Manually…" entry on the Fixture Patch dock opens a dialog where you pick a manufacturer, model and mode from the local GDTF library, set universe and DMX start address, and (optionally) create several consecutive copies in one shot. Useful for ad-hoc commissioning when there's no MVR file to import. A live preview of the address range updates as you tweak the inputs, a starting FID can be assigned so the new entries number consecutively, and multi-cell GDTFs (LED bars, pixel matrices) are expanded into proper container + cell hierarchies. Manually-added fixtures are tagged
[Manual]in the patch tree (alongside[RDM]for RDM-sourced entries) and grouped under their own "Manual" heading, so you can always tell at a glance where each entry came from. They persist in the patch across save/load like any MVR-imported fixture - Spill to next universe when full — optional checkbox in the Add Fixture dialog. With it on, fixtures that don't fit in the remainder of the current universe continue into the next universe starting at channel 1 — the same behaviour as a lighting console's "patch N fixtures from U2/400" command. The live preview shows the real address range including the spill ("20 fixtures · U2/400 → U3/88, spills across 2 universes"), and the checkbox state is remembered between sessions
- Browse GDTF Share without leaving Add Fixture — the Add Fixture dialog has a "Browse Share…" button that opens the GDTF Share catalog inline. After downloading, the dialog automatically refreshes its manufacturer / model / mode lists so you can pick the freshly-downloaded GDTF and continue. An empty library no longer blocks the dialog — it opens anyway with a message pointing to the Browse Share button, so a clean install can patch its first fixture without a detour through the File menu
- Browse GDTF Share from the toolbar — the Add ▾ menu gained a "Browse GDTF Share…" entry so you can explore the catalog and pre-download any GDTFs you might need later without having to start an Add Fixture workflow. Multi-select download is supported: tick as many rows as you want and "Download selected" grabs them all in one pass
- Already-downloaded rows are highlighted in green inside the GDTF Share browse dialog. Rows whose UUID is already present in your local library tint every cell green with a tooltip explaining it's already installed — no more second-guessing which profiles you've already grabbed. The checkbox stays enabled so you can re-download if a newer revision on the catalog looks interesting. Downloads-in-flight turn green automatically as soon as they land and the library re-indexes, no need to close and reopen the dialog
- Remove individual fixtures — right-click any fixture in the patch tree and choose "Remove Fixture". Works with multi-selection too — select several and the action label updates to "Remove N Fixtures". Multi-cell containers are removed together with all their cells in one pass. A confirmation dialog with the fixture count prevents misclicks from wiping a big selection silently
- Change address on existing fixtures — right-click → "Change Address…" opens a dialog where you set a new universe and start channel for the fixture. Multi-cell containers shift all their cells by the same delta so the on-wire layout stays consistent. Multi-selection is supported: right-click any fixture in a multi-selection and the dialog becomes "Change Addresses… (N)"; the right-clicked fixture anchors the new address and the other selected fixtures shift by the same delta, preserving relative spacing between them — the standard console "repatch" semantics. The whole operation is atomic: if any fixture would overflow its universe, the preview flags which one and the entire change is rejected without touching the patch
- Toolbar reorganised on the Fixture Patch dock — the six independent buttons collapsed into
[Add ▾] [Resolve ▾] [Remove All Fixtures]on the left and[Select All]on the right. The Add menu hosts Import MVR, Add Fixture Manually, Import GDTF Files and Browse GDTF Share (the latter two previously buried under the File menu only). The Resolve menu hosts Resolve with GDTF Library and Find in Share. The "Clear" button was renamed to "Remove All Fixtures" because on many lighting consoles "Clear" means "clear the current selection" — a technician used to that terminology could press it expecting to drop a multi-select and accidentally wipe the patch. Select All sits on the right side, visually separated from the patch-modifying buttons, since it touches the selection only and not the patch contents - Status bar moved to the bottom of the Fixture Patch dock, Windows-Explorer style. Long messages during MVR import or library rescan no longer squeeze the toolbar buttons mid-flow; the bar takes the full width of the dock and keeps the buttons stable
- Default column widths tuned so the patch tree fills the dock out of the box on typical configurations. Name, Type and Mode are all resizable now (Mode was previously forced-stretch which prevented manual drag), and the RDM column sits at a minimum width consistent with its single-glyph content
RDM Linkage
- New "RDM" column on the patch tree — shows a coloured dot per fixture once you've run the cross-reference. Green for a clean match between the patched fixture and a discovered RDM device, half-green when a multi-cell container matched via individual cells, amber when the personality (channel count) doesn't match, orange when the fixture type doesn't match, red when no RDM responder was found at the patched address, and grey when RDM is disabled or the address is unset. Hovering shows the full diagnostic text. The column survives patch reloads — the last cross-reference stays visible until you re-run it
- "Check against RDM…" right-click action opens a comparison dialog with sections per state (Missing, Wrong personality, Wrong fixture type, Matched via cells, Matches, Unknown) plus a section for RDM responders that exist on the rig but aren't in the patch. The most actionable sections — Missing, Wrong type, Wrong personality, Matches and Extras — are expanded by default; Matched via cells and Unknown start collapsed. Your expand / collapse choices are remembered across Refresh clicks and between reopens of the dialog, so the layout stays the way you left it. Available even when the patch is empty or when right-clicking empty tree area, not just on fixture rows
- Refresh button re-runs the cross-reference without dismissing the dialog, so you can iterate while fixing patch addresses or tweaking fixture personalities on the responders
- Multi-cell fixtures (LED bars, pixel matrices) check the parent container's address first since most multi-cell devices have a single RDM responder at the parent's address. If no RDM responder sits at the parent, the check falls back to scanning each cell individually and flags the container as "Matched via cells" with per-cell detail
- Manufacturer and model comparison is tolerant of casing and punctuation differences between RDM and GDTF — "Robe" matches "ROBE", "Robin LedBeam 150" matches "Robin LEDBeam 150"
DMXRouter v1.9.2 — Built for the stage.
DMXRouter 1.9.1
Stability
- DMX output stays fluid during window operations — grabbing the title bar or moving the window between monitors no longer pauses DMX output. Previously, Windows modal loops during these operations would block the receive pipeline, causing downstream visualisers and fixtures to freeze on the last frame until the window was released. DMX input, merging, and output now run on a dedicated worker thread, isolated from the main UI's modal loops. The internal monitor view will still pause its display during a grab (since it's part of the UI), but the actual DMX transmission continues uninterrupted
- Active universes refresh continuously at 44 Hz — outputs now transmit at a steady 44 Hz refresh rate even when input data stops changing, matching the behaviour of professional lighting consoles. Previously, unchanged data was sent at 850 ms intervals which was below the expectation of some downstream nodes
- Fixed a rare crash at shutdown when closing the application while multicast group joins were in progress
- Fixed occasional thread-affinity warnings logged at shutdown under specific timing conditions
Fixture Check
- Global "Release All" button next to Show Mode in the main toolbar — panic button that releases every active override from any tab, with a live count ("Release All (3)") so you know how many fixtures are under manual control without switching views. Turns orange and bold when overrides are active
- Override status badge now appears in the Fixture Patch toolbar: "● N fixture(s) overridden" in bold orange when any fixture is under manual control. Replaces the post-import message that used to stay pinned there permanently — import and parse messages now auto-clear after a few seconds so the toolbar reflects the current state
- Row-wide override highlight in the fixture tree — overridden fixtures now have a subtle green tint across every column in addition to the bold green FID, making them easy to spot from any part of the tree
- Multi-fixture selection summary now lays fixture types across multiple lines, switching to a two-column table when there are eight or more types — previously a single overly-wide line stretched the panel and still couldn't show everything
- "Select All" in the fixture tree actually selects every fixture now — previously only one row ended up marked, both visually and in the selection model
- Programmatic tree selection (from "Select All", RDM → Send to Fixture Check, or any cross-dock sync) now paints the highlight immediately instead of requiring a window focus change to appear
- "Clear manual GDTF assignment" from the right-click menu now works immediately. Previously clearing only dropped the mapping but left the upgraded fixture pointing at the real GDTF, so you had to re-import the MVR to see any effect — the fixture now reverts to a proper placeholder right away and the auto-resolver re-runs. The action also accepts multi-selection: right-click on a mixed selection spanning several fixture types and you get "Clear manual assignments (N types)" which clears them all in one pass
- Arrow keys navigate the rig — with the fixture tree focused, the Up/Down/Left/Right arrows now step through fixtures using the Check widget's Next / Previous logic. That means the Highlight-propagation workflow ("press Highlight once, then tap arrows to walk the rig") now works from the keyboard without reaching for the Next / Prev buttons. Shift- and Ctrl-modified arrows still do their normal tree thing (extend selection, move focus) so multi-selection is unaffected. Focus returns to the tree automatically after Highlight, Next, or Previous so the walk keeps flowing without extra clicks
- Named channel combo boxes refresh with programmatic value changes — clicking Home or Highlight (or any external override change) now updates the range combo boxes for shutter, gobo, colour, prism, etc. in addition to the slider. Previously the slider would jump to the new value but the combo stayed stuck on the old range — dimmer slider at 255 alongside a shutter combo still saying "Closed", for example
GDTF Share browser
- Manual assignments reflected in the targets banner — placeholders assigned via right-click → "Assign this GDTF to placeholder" now show ● (selected) immediately and ✓ (downloaded) after download. Previously only auto-matched placeholders tracked their status, manually-pinned ones stayed marked as Pending even when the file had been correctly saved to the library
- Auto-match now triggers the mode picker when needed — when the dialog opens with a patch loaded, auto-matched catalog entries are registered as manual assignments behind the scenes. This means that if the downloaded GDTF's modes don't include the MVR's exact mode name, the resolver now pops up the Pick Mode dialog letting you choose the closest match — rather than silently leaving the fixture as a placeholder. Previously this only worked when you pinned a GDTF explicitly via right-click
- Footprint no longer shown for placeholders — Depence and Capture dummy GDTFs all embed a single synthetic 1-channel Dimmer so the file parses, which made the banner report "1 ch" for every line regardless of the real fixture. The channel count is now hidden for unresolved placeholders (misleading data is worse than no data) and only shown once the fixture is upgraded to a real GDTF
- Multiple modes of the same fixture kept separate — a patch with e.g. "Ayrton Huracan Profile" in both Basic and Extended modes now produces two banner entries so you can match each to the correct real-GDTF mode, instead of being collapsed into one
- All catalog columns are resizable — previously only the Manufacturer↔Fixture divider could be dragged; Revision and Uploader were auto-sized and could truncate long text with no way to widen them short of resizing the whole dialog
- Banner status correct for fixtures with multiple catalog revisions — models with several revisions in gdtf-share (different uploaders or versions, all sharing the same FixtureTypeID) now light up correctly in the banner regardless of which specific revision you pinned. Previously only one revision per UUID was tracked, so picking any other would leave the banner marked as Pending even though the download and placeholder binding worked
- All revisions of matched fixtures are visible and switchable — when the auto-matcher finds a model with multiple revisions in the catalog, every revision is now shown in the tree (not just the one the matcher picked). You can compare uploaders, dates, and ratings to pick a different revision if you prefer — checking an alternative revision automatically unchecks the others, so you still only download one copy
RDM
- Non-printable bytes in fixture personalities, curves, response times, modulation frequency descriptions, device labels, and software versions are now stripped before display instead of rendering as empty rectangles. Some fixtures embed decorative non-ASCII bytes in their RDM description strings; these are cleaned up while the readable text is preserved in both UTF-8 and Latin-1 encoded responses
- Inspector tables (Slots, Sensors, Personalities, PID list, Manufacturer PIDs, Status, Presets) no longer show a stray focus rectangle on the first cell after every refresh — the view now matches what was selected (or not selected) before the refresh
Fixture Database
- Active sort column shows an arrow indicator (▲ / ▼) in its header so you can see at a glance which column is the sort key
DMXRouter 1.9.0
New Features
-
RDM → Fixture Check workflow — right-click any discovered device (or a multi-selection) in the RDM panel and choose "Send to Fixture Check". DMXRouter resolves the device through a four-stage pipeline: (1) match an existing patch entry at the same universe + start address (so MVR-imported fixtures get reused, no duplicates), (2) look up a real GDTF in the local library by manufacturer + model, (3) synthesize a FixtureType from RDM slot labels (E1.20 SLOT_INFO / SLOT_DESCRIPTION) with proper semantic attributes for Pan/Tilt/Dim/Color/Gobo/Iris/Zoom/Frost/Prism/Shutter/CTC/RGB/CMY/W/A/UV, or (4) fall back to generic Ch1..ChN channels. Works without any MVR loaded — perfect for when you arrive at a venue and just want to check the rig live over RDM. Injected fixtures are tagged
[RDM]in the Patch tree so they're visually distinguishable from MVR-imported ones, andFile → Remove RDM-discovered Fixturesclears them in one click when you're done -
MVR Import (My Virtual Rig) — import
.mvrfiles exported from Capture, MA3, Vectorworks, WYSIWYG, Depence and other MVR-compatible lighting design applications to bring the entire fixture patch into DMXRouter. The new Fixture Check dock shows all imported fixtures grouped by MVR layer, with fixture ID, name, type, universe/address, and mode. Supports MVR spec versions 1.0 through 1.6 and reads embedded GDTF fixture definitions. Generic placeholder GDTFs are detected automatically through exporter-specific fingerprints — Capture's marker comment, WYSIWYG's "Dummy" attribute pattern, and Depence's "Dimmer-only attribute with no ChannelSet ranges" pattern — and shown in italic so you know which fixtures carry only channel-count information and need replacement with real manufacturer GDTFs. Import runs asynchronously so the UI stays responsive even on large shows -
Fixture Check panel — a commissioning tool for verifying fixtures on the rig. Select any fixture from the imported patch to open a dedicated control panel with one slider per channel. Output takes hard priority over any incoming desk signal — once you grab a fixture in DMXRouter, only DMXRouter drives it until you release. Useful for walking through a rig during focus, for verifying cabling after a patch change, or for setting fixtures to safe positions before physical adjustments. The dock is split with the patch tree on the left and sliders on the right, separated by a draggable divider whose position is remembered across sessions
-
Home, Highlight and Release controls — Home sends each fixture's GDTF-declared default values (typically Pan/Tilt centred, color open, gobo open, dimmer closed), not a blanket zero. Highlight sends full-output values for quick visual identification. Release returns control to the desk instantly. Fade Out crossfades the override back to the desk's current output over a configurable duration (0.5s / 1s / 2s / 5s) so the handoff is seamless in a live environment. A Release All panic button releases every overridden fixture at once
-
Next and Previous fixture navigation — walk through the fixture list one by one without leaving the Check panel. Selection stays synchronized between the Patch tree and the Check panel in both directions
-
Overridden fixture indicators — fixtures currently being driven by DMXRouter appear in bold green in the Patch tree, so you can see at a glance what you are controlling across the whole show
-
GDTF Library Resolver — upgrades generic placeholder fixtures with real semantic GDTFs from a local library at
~/Documents/DMXRouter/GDTF/, scanned asynchronously at startup. The Resolve with GDTF Library button applies a four-tier match strategy per placeholder: (1) manual override — if the user has explicitly pinned this placeholder to a specific GDTF via the right-click "Assign GDTF manually…" menu, that GDTF is used unconditionally; (2) FixtureTypeID UUID lookup; (3) normalized manufacturer + name with aggressive corporate suffix stripping so "Robe" matches "Robe Lighting", "Martin" matches "Martin Professional", etc. across every supported variant (Professional / International / Technology / Lighting / Light / GmbH / Ltd / Inc / Corp / LLC / Electronics / AG / SA / SL / BV / NV); (4) mode resolution falls back through three tiers of its own — exact name match, then same DMX footprint (only when the footprint is plausible), then keyword match on the mode name so an MVR "Standard 16bit" pairs with a real GDTF's "Mode 1 - Standard 16 bit" through shared tokens. A summary dialog reports resolved, skipped, and mode-mismatch counts with detailed per-fixture warnings -
Manual GDTF assignment — right-click any placeholder or RDM-synthesized fixture in the Patch tree to open "Assign GDTF manually…". A picker dialog opens showing the full local library with a live filter box; pick any installed GDTF and every fixture sharing the same placeholder type is upgraded. Covers the case where the MVR writes a fixture name that doesn't quite match the catalog (e.g., "Robin iForte LTX" vs "Robin iForte LTX FS") so auto-resolve can't pair them confidently. Manual assignments are persisted with the patch so they survive save/load, and can be cleared from the same context menu to revert to auto-resolve behaviour
-
GDTF Share online integration — built-in REST client for gdtf-share.com (the official ESTA fixture library) lets users search the entire public catalog and download real GDTF profiles without leaving DMXRouter. Two flows are provided:
File → Browse GDTF Share...opens a searchable list of every fixture (filter by manufacturer, model or UUID, double-click to download);File → Download Missing GDTFs from Share...(also accessible from the placeholder advisory dialog and the amber banner) reads the UUIDs of the current patch's placeholder fixtures and pre-selects matching catalog entries so the full "MVR import → all fixtures semantic" round-trip is one click. After the batch download completes DMXRouter automatically invokes Resolve with GDTF Library so the patch flips from Dimmer1..DimmerN to Pan/Tilt/Color/Gobo/... with no further user interaction. A gdtf-share.com account is required (free to create); credentials are stored locally with light obfuscation so the login prompt appears at most once per machine -
Import GDTF Files menu —
File → Import GDTF Files...copies one or more.gdtffixture definitions into the local library folder and automatically triggers a rescan. Useful when a specific fixture is not on gdtf-share.com but the manufacturer ships its own GDTF -
Multi-cell fixture support — LED walls, pixel matrices and any GDTF using
<GeometryReference>to replicate a channel template across physical positions are expanded at import time into a parent container with N individually-addressable cell sub-fixtures. In the patch tree the container is collapsible; expanding it reveals every cell. Selecting the container broadcasts slider moves and Home / Highlight / Release to every cell (quick "is the wall alive" check), while selecting a single cell controls only that cell (precision walkthrough). A typical LED wall with 100 RGB pixels becomes 101 entries in the patch: 1 container + 100 cells, each at its correct DMX offset -
On-demand output for override-only universes — taking control of a fixture on a universe with no incoming desk data now causes DMXRouter to start emitting that universe automatically. The merge engine synthesises zero-based packets at ~30 Hz so the override layer has something to stamp on, and both the network transport and the Universe Monitor see the real bytes going out. When the last override is released the emission stops — no continuous traffic when nothing is being controlled. Closes the previous silent-override gap where a user could move a slider and see no activity in the monitor because there was no desk input feeding the engine
-
Fixture patch persistence — imported MVR patches are saved as part of the DMXRouter configuration file and restored automatically on load. The crash recovery system also preserves the patch, so a walkthrough session survives an unclean shutdown without having to reimport
-
About dialog credits — zlib is now credited in the About dialog's Third-party libraries section, matching the existing Qt LGPL compliance notice
How Fixture Check Reaches the Rig
Fixture Check does not implement its own transport layer — it plugs into the existing engine pipeline at the last moment before transmission. For a slider movement to reach a physical fixture, two conditions must be met:
- The MVR must carry a valid DMX address for the fixture — shown in the Address column as
U5/357(universe 5, channel 357). Fixtures with—in the address column cannot be controlled until their address is set in the original design file and re-exported - The Engines panel must have an output configured for that universe — DMXRouter emits each universe through whichever engine outputs are configured for it, regardless of which protocol or interface they use. Without an engine for the fixture's universe, overrides are computed correctly but have no transport to ride on
Once both conditions are met the override is replicated automatically to every interface and protocol that engine is configured to serve (single universe → multiple outputs and protocols is fully supported). VLAN routing, merge priorities, sACN per-channel priority, and rate limiting all apply to overrides the same way they apply to desk output. The Fixture Check panel shows a warning banner when the currently selected fixture has no engine emitting its universe, so a missing engine is visible without leaving the dock.
When the user takes control of a fixture on a universe that has no incoming desk data, the merge engine automatically starts synthesising zero-based packets at ~30 Hz so the override layer has something to stamp on. The Universe Mon...
DMXRouter 1.8.2
New Features
- Web LLRP Discovery & Network Config — full E1.33 LLRP lifecycle from the browser. Select a network interface and start multicast discovery to find LLRP targets on the rig. The target table updates in real time via WebSocket push, showing UID, MAC address, component type, IP, and live status (Active/Seen/Stale). Selecting a target auto-fetches device info (manufacturer, model, software version, DMX footprint), current DMX address, label, personality, and identify state. Set DMX address, label, and personality directly from the browser. Fetch personality descriptions with a table showing footprint and active marker — double-click to set. Identify toggle with amber highlight. E1.37-2 network configuration panel reads current IP/mask/DHCP state and allows setting static IP, subnet mask, gateway, or enabling DHCP, with a confirmation prompt before applying. LLRP active state syncs bidirectionally between desktop and web. LLRP log panel shows timestamped protocol activity. Useful for commissioning from a tablet on the rig without needing the desktop application
Improvements
- Non-blocking receive pipeline — all network receive loops (Art-Net, sACN, LLRP, mDNS) and connection accept loops (HTTP, WebSocket) now process in capped batches, yielding the main thread between each batch. A drain guard prevents Qt's level-triggered readyRead signal from bypassing the yield. The UI stays responsive regardless of external traffic volume
- UDP socket error auto-recovery — Art-Net and sACN receiver sockets now detect runtime errors (interface down, driver reset, network reconfiguration) and automatically attempt to rebind with exponential backoff (1s, 2s, 4s... up to 30s). Previously a socket error would silently stop all input on that protocol with no log entry. sACN multicast groups are re-joined after successful rebind
- Periodic auto-save for crash recovery — the current routing configuration (engines, VLANs, cues, remote control, groups) is automatically saved every 5 minutes to an internal recovery file. On startup after an unclean shutdown, DMXRouter offers to recover the last session. The recovery file is deleted on clean exit
- DHCP state cache — checking whether a network adapter uses DHCP is now instant. The state is cached and refreshed asynchronously on startup and interface changes, eliminating multi-second UI freezes when the interface list contains many adapters
- Async network queries on Linux — connection name resolution and IGMP multicast membership elevation no longer block the main thread during startup or network changes
- Eliminated spin-wait during transport recreation — reconfiguring network interfaces no longer blocks the main thread for up to 2 seconds waiting for a background multicast join thread. The previous approach also risked reentrancy issues that could cause inconsistent state
Fixes
- Fixed application freeze ("not responding") when another Art-Net application (e.g. Resolume) shares port 6454 and generates a burst of traffic during initialization. The receive loop would block the main thread indefinitely while the external source continued sending
- Fixed error 740 "The requested operation requires elevation" when launching DMXRouter for the first time after installation
DMXRouter 1.8.1
New Features
-
Full Engine Editing from the Web — process engines can now be fully managed from the web interface, matching the desktop editor's capabilities. Create new engines with "+ New", edit any engine's mode, inputs, outputs, and control settings. The interface selector includes network adapters (with VLAN coloring), other engines in purple for internal routing (with self-loop prevention), and Play shows in green — all with the same behavior as the desktop: selecting an engine or play source auto-populates the universe and dims the field. Protocol selection enforces correct universe ranges (sACN 1–63999, Art-Net respects 0-based setting). Backup, Crossfade, and Switch modes include their specific control channel settings
-
Web Engine Group Management — create, rename, recolor, and dissolve engine groups directly from the web. The "+ Group" button opens a dialog with group name, color picker (12 named colors matching the desktop), and engine checkboxes. Each group header has Rename, Color, and Ungroup buttons. Groups sync bidirectionally with the desktop in real time via WebSocket
-
Web VLAN Management — full VLAN lifecycle from the browser. Create VLANs with the same color-coded group presets as the desktop app, custom VLAN IDs, optional IP address and subnet mask assignment. Infrastructure panel shows current status with Create/Destroy buttons and NIC selector for platforms that require it. Auto-refreshes via WebSocket when infrastructure or VLANs change
-
Web IP Editor — change the IP address of any network interface from the browser, with a dropdown of common subnet masks and a DHCP toggle that dims the static fields when enabled. Current DHCP state detected and pre-selected
-
Art-Net 0-based toggle — the Art-Net 0-based universe numbering setting is now accessible from the web System page, with bidirectional sync to the desktop app
Improvements
- Device Model ID — displayed in hexadecimal in the RDM Info tab
- sACN detection in RDM tree — ports configured as sACN display "sACN Universe X" instead of Art-Net notation, persisting across discovery refreshes
- Unified group colors — desktop and web now share the same 12-color palette (Red, Green, Cyan, Magenta, Orange, Yellow, Blue, Purple, Pink, Teal, Sky Blue, Slate) with identical hex values
- VLAN interface coloring — VLAN interfaces display their same color-coded group presets as the desktop app in the web interface list (colored dot and left border) and in the engine editor's interface selector
- Web tab names — renamed to match the desktop: Stats, Discovery, RDM, RDM Emulator, Cues. Cues moved next to Monitor. Removed legacy Back buttons from sub-pages
- Web interface panel — subnet mask shown alongside IP, DHCP indicator, Enable/Disable toggle shows current state with green (Enabled) and gray (Disabled), "Show WiFi" toggle, Hyper-V Default Switch filtered from engine editor
- Web layout — Interfaces as default tab. Monitor uses a dropdown selector and desktop-matching DMX colors. Engine DMX grid uses WebSocket push instead of HTTP polling
- Web templates — Created and Modified date columns
- Web Fixture Database — fixtures grouped by manufacturer and model with collapsible sections that persist across tab switches
- Play inputs — displayed as "Play Show X" everywhere (engine list, edit modal, Reroute dialog) instead of raw internal universe numbers
- Reroute dialog — fully rewritten to match the engine editor: colored engine/play entries with names and output info, self-loop prevention, universe auto-populate and dim for internal/play sources
- Engine output status — failsafe mode, master/limit, and startup buffer state visible in each engine's detail panel with Capture Startup and Record Failsafe buttons
- Desktop-to-web sync — routing changes made in the desktop (group colors, engine reorder, group assignments) now broadcast instantly to the web via WebSocket
Fixes
- Fixed ACK_TIMER retry sending duplicate SET commands instead of GET verification (E1.20 §5.3.2)
- Fixed Hyper-V false detection on machines where the feature was uninstalled
- Fixed dock tabs allowing re-nesting after undocking
- Fixed template "Modified" date not updating on inline parameter edits
- Fixed installer first launch running with elevated permissions on Windows
- Fixed VLAN log messages showing garbled characters on non-English Windows
- Fixed web engine edit not pre-selecting the current interface in dropdowns
- Fixed web Fixture Database losing collapsed group state when switching tabs
- Fixed web VLAN infrastructure Delete returning error 400 (route ordering conflict)
- Fixed Capture Startup and Record Failsafe not protected by Show Mode in web and backend
DMXRouter 1.8.0
New Features
- Art-Net 0-based universe numbering — a toggle in the View menu switches Art-Net absolute universe numbers between the traditional 1-based display (Art-Net 0.0.0 = Universe 1) and native 0-based display (Art-Net 0.0.0 = Universe 0). The setting applies consistently across all panels. Requested by Quphoria (#29)
- Bidirectional Station Sync — templates and fixtures synchronize in both directions between stations. New data on either side is exchanged automatically; template conflicts are detected by modification timestamp and resolved interactively via a conflict dialog (Keep Local / Accept Remote / Skip per template, with global actions). Fixture records merge automatically with the newer version winning. The source station receives local-only data back via a new
POST /api/sync/bundleendpoint - Manufacturer PIDs right-click workflow — values auto-read when a device is selected. Right-click any PID row to GET or Set Value. For numeric PIDs with a PARAMETER_DESCRIPTION, the Set dialog shows a spin box with the parameter name, range, and current value in natural units
- Smart SET in PID Browser — the SET button checks for a PARAMETER_DESCRIPTION on the selected PID. Numeric types show a value dialog with range and current value; other types fall back to hex input
- Absolute universe in RDM device tree — port items now show both Net.Sub.Uni and absolute universe number. The Gateway label in the Info tab also displays the absolute universe
Improvements
- Two-column Info layout — the RDM device Info tab now uses a two-column layout, making better use of horizontal space
- Auto-fetch all device info on selection — selecting a device automatically fetches extended and advanced info (personalities, slots, sensors, hours, boot software, language, presets, comms status). No manual "Fetch" clicks needed
- Refresh button does full re-read — basic identity, extended info, and advanced info in one click. Fetch Extended and Fetch Advanced buttons removed
- Progress bar on device selection — a progress indicator appears while device info is being loaded, both on first selection and on Refresh
- Fetch All includes advanced info — the header Fetch All button now fetches both extended and advanced info for all devices
- Reorderable tabs everywhere — main dock tabs can be reordered by dragging horizontally; drag vertically to separate as a floating window. RDM inspector sub-tabs are also reorderable. Both layouts are saved on exit and restored on startup. Use View > Reset Tab Layout to restore defaults. Floating windows cannot be re-nested into other tabs — only Reset re-docks them
- Template timestamps visible — Created and Modified date columns added to the Templates table
- Correct ACK_TIMER handling (E1.20 §5.3.2) — after a SET command receives ACK_TIMER, DMXRouter now sends GET to verify completion instead of re-sending the SET. This fixes devices like the Robert Juliat Sully that need processing time for personality changes, identify, and other SET operations — previously these would retry the SET 5 times before giving up
- Smarter queued message drain — the drain now detects persistent-status devices (E1.20 direct-read model) by tracking messageCount across iterations; stops after two requests if the count doesn't decrease. SET re-reads wait for the drain to finish before requesting the updated value
- Window position and size remembered — the application saves and restores position, size, and maximized/fullscreen state across sessions, including correct monitor placement on multi-display setups
- Stats log improvements — Pause button freezes the log view for selecting and copying text. New log entries no longer break an active text selection
- Device tree starts with no default sort — items appear in discovery order, preserving TOD convention (embedded fixture first per E1.37-7)
- Boot Software version displayed in the main Info panel; no longer shows "(0x00000000)" when the version ID is unavailable
- Fan sensor type (0x20) displayed as "Fan"
- Manufacturer PIDs "Done" status persists after auto-read completion
- Horizontal scroll position preserved in Manufacturer PIDs table during rebuild
- Templates table: Model column stretches to fill available width
- Static node removal clears the node from the discovered list immediately
- "Remove Static Node" submenu lists all configured static IPs, including offline nodes
- Sync timestamps (
createdAt/modifiedAt) on templates and fixture records with automatic legacy migration
Fixes
- Fixed ACK_TIMER retry sending duplicate SET commands instead of GET verification (E1.20 §5.3.2) — caused 5× unnecessary retries on personality changes, identify, and other SET operations
- Fixed Absolute spin in the merge editor allowing values above Art-Net's 32767 maximum
- Fixed Play (Show Cue) inputs showing the internal virtual universe number and falling back to "Any" interface when reopening the merge editor
- Fixed engine table showing raw adapter name instead of IP address when the interface has no link
- Fixed
fetchAdvancedInfosilently failing when RDM was disabled at the time of first device selection - Fixed em-dash characters rendering as garbage in progress and status text on Windows
- Fixed
QMainWindow::saveState()warning spam caused by missing objectName on the main toolbar and dock widgets
DMXRouter 1.7.11
Fixes
- Fixed engine inputs with "Any" interface producing no output — the input index optimization used exact interface matching, which never matched incoming packets (stored with the actual network adapter ID) against "Any" inputs (stored as empty). All merge modes were affected: Forward, HTP, LTP, Backup, XFade, Switch, Priority, and Custom. Inputs bound to a specific interface were not affected
- Fixed source alive detection (Backup failover timing) not finding cached data for "Any" inputs — same root cause as above
- Fixed source cache pruning incorrectly removing data entries referenced by "Any" inputs — the pruner only considered the wildcard key as referenced, not the actual interface keys where the data was stored
- Fixed LLRP network configuration requiring a valid static IP even when only enabling DHCP — the Apply button now sends only the DHCP mode command and skips static address validation when DHCP is checked
New Features
- Static node entries — add Art-Net nodes by IP address for cross-subnet discovery. DMXRouter sends ArtPoll unicast to each static node, so they appear in the Discovery tab even when they are on a different subnet and can't be reached by broadcast. Nodes persist across sessions and are not removed by the stale-node timeout. Add via the "Add Node" button or right-click in the node tree; remove via right-click. Static nodes are marked with a ◉ indicator in the tree. Note: cross-subnet discovery depends on the node responding with unicast ArtPollReply and having a gateway configured — not all nodes support this
- Web Monitor WebSocket push — the Universe Monitor in the web interface now receives DMX levels via WebSocket at 20 fps instead of HTTP polling at 2 fps. The grid updates in real time with no visible latency. Falls back to HTTP polling automatically if WebSocket is not connected
Improvements
- Uni+/- buttons now work on all engine modes — previously limited to Forward engines only. Now adjusts all input and output universes on HTP, LTP, Backup, XFade, Switch, Priority, and Custom engines. Control channel assignments (XFade position, Switch select, Backup recovery, Master/Limit) are not affected
- Group switch buttons show input labels — the "Switch All Inputs" menu in the desktop GUI and the group switch buttons in the web interface now display the user-defined input labels (e.g. "Venue Console", "Guest Console") instead of generic "Input 1" / "Input 2"
DMXRouter 1.7.9
Fixes
- Fixed ArtAddress commands causing multi-port nodes to lock up — commands now target a specific bind index instead of all binds simultaneously, and periodic polling is paused briefly after each command to avoid stressing nodes during processing
- Disconnected nodes are now removed from the Discovery tree after 10 seconds instead of 60, and the "last seen" timestamp updates in real time so the user can see the countdown before removal
Improvements
- Added target port selector in Discovery control panel — failsafe mode, cancel merge, and reset Rx flags now apply to the selected port on multi-port nodes
DMXRouter 1.7.10
Fixes
- Fixed lamp/device hours alerts not triggering on discovery — hours are now auto-fetched during initial probe when a template has a lamp or device hours limit, and the alert check runs when the hours data arrives
- Fixed device hours limit being ignored in alert checks — only lamp hours were checked, now both lamp and device hours trigger identify alerts when exceeded
- Fixed emulator instances created from the template library missing dimmer curves, display settings, lamp mode, pan/tilt, power state, and other configuration fields — the Configure dialog showed all fields as "not supported". Direct copies of instances were not affected. Existing templates need to be re-saved from a captured profile to pick up the missing data
Improvements
- Added firmware version column in the Templates tab for quick identification of the saved firmware per model
- All RDM detail panel actions (Set Address, Set Personality, Set Label, Set Fixture ID) now apply to all selected fixtures when multiple are selected in the tree
- Configure dialog (dimmer curve, lamp mode, display settings, pan/tilt, power state, etc.) now applies changes to all selected fixtures at once
- Sequential Address and Fixture ID buttons in the Config tab — "Seq" button next to the existing "Set" for both DMX Address and Fixture ID. Address sequential auto-increments by footprint, Fixture ID increments by one. Both respect selection order
- Identify multi-select — the Identify toggle in the Config tab, the tree toolbar Identify button, and the Config tab Identify Off button now apply to all selected fixtures
- Fixture Database grouping — fixtures are visually grouped by manufacturer and model with collapsible header rows showing the group name and fixture count. Click a group header to expand or collapse it. Groups are sorted alphabetically for quick navigation in large databases