Skip to content

Releases: fiverecords/DMXRouter

DMXRouter 1.5.6

17 Mar 23:47
13f09c0

Choose a tag to compare

🍎 macOS Installation Note
If you see a message stating that "DMXRouter is damaged and can’t be opened", this is a security restriction from macOS Gatekeeper on non-notarized apps. To fix this, move the app to your /Applications folder and run these two commands in your Terminal:

  • Remove the quarantine flag:
    sudo xattr -rd com.apple.quarantine /Applications/DMXRouter.app
  • Re-sign the app locally:
    sudo codesign --force --deep --sign - /Applications/DMXRouter.app

Note: These steps are required because DMXRouter now uses the native SystemConfiguration framework to manage IPs and VLANs. macOS requires a local signature to grant the app permission to interact with these system-level network APIs.

macOS — Native Network Stack

All network management on macOS has been migrated from command-line tools (networksetup) to Apple's native SystemConfiguration framework — the same API used by System Settings → Network

Interface names throughout the application (Interfaces tab, engine dropdowns, Show Cue selectors, VLAN Manager) now resolve correctly for all interface types — physical adapters, VLANs, bridges, and bonds. The "Physical NIC" dropdown in the VLAN Manager shows friendly names like Thunderbolt Ethernet (en4) instead of raw device names.

Set IP and Set DHCP on VLAN interfaces now work reliably. The previous shell-based approach failed silently on VLANs because macOS could not resolve the service name. The new implementation writes directly to the system network preferences via SCPreferencesCreateWithAuthorization, the same mechanism used by System Settings. Write operations (Set IP, Set DHCP) still prompt for your administrator password; read operations (checking DHCP state) require no elevation.

Interface type detection now uses SCNetworkInterfaceGetInterfaceType() to filter WiFi, Bluetooth, modem, and mobile data adapters. This replaces QNetworkInterface::type(), which incorrectly reports AirPort adapters as Ethernet on some macOS versions.

Windows and Linux are unaffected by these changes — they continue using their existing PowerShell / nmcli paths.

macOS — Performance

App Nap prevention. DMXRouter now holds a runtime activity token (NSActivityLatencyCritical) that prevents macOS from throttling timers and network I/O when the window is in the background or occluded. The NSAppSleepDisabled Info.plist key was already present but can be overridden by the system; the runtime token is the authoritative mechanism used by professional audio and lighting applications. The display is still allowed to sleep when idle. You can verify the protection in Activity Monitor → App Nap column: DMXRouter should always show "No".

Ad-hoc code signing. The macOS build now includes automatic ad-hoc code signing as a post-build step, giving the app a stable identity so the firewall only prompts once on first launch instead of on every run.

Firewall warning. When the macOS Application Layer Firewall (ALF) is enabled, DMXRouter now shows a warning at startup recommending to disable it. This is a known macOS limitation that affects all high-packet-rate UDP applications — lighting control, professional audio, amateur radio, and network capture tools like Wireshark all suffer from it. Even with an app explicitly allowed as an exception (and even with a full Apple Developer ID signature), the kernel-level socket filter (com.apple.nke.applicationfirewall) inspects every incoming UDP packet, adding latency and CPU overhead that is incompatible with real-time DMX control at 44 packets/second per universe.

There is no workaround within the ALF — neither ad-hoc signing, Developer ID signing, nor firewall exception rules eliminate the per-packet inspection overhead. Two options are available:

Option 1 — Disable ALF (recommended for dedicated lighting machines on isolated production networks):

System Settings → Network → Firewall → switch OFF.

Option 2 — Replace ALF with PF (for machines on shared or internet-connected networks that need firewall protection):

Disable ALF as above, then enable macOS's built-in Packet Filter (pfctl), which operates at network level (like iptables/nftables on Linux) without per-socket overhead. Example PF rules for a lighting machine:

# /etc/pf.conf — allow Art-Net and sACN, block everything else inbound
pass in proto udp from any to any port {6454, 5568}
pass in proto udp from any to any port 5569:5668
block in all

Enable with: sudo pfctl -e -f /etc/pf.conf

PF provides proper firewall protection without the performance penalty of ALF's application-layer socket filter.

The startup warning can be dismissed permanently.

Network Interface Hotplug Detection

DMXRouter now detects network changes in real time on all three platforms. Plugging in a USB-Ethernet adapter, disconnecting a cable, changing an IP from the OS network settings, or creating a VLAN from an external tool will automatically update the interface list — no need to click Refresh.

Each platform uses its native push-notification mechanism:

  • Linux — netlink socket subscribed to link and IPv4 address events, integrated into Qt's event loop.
  • macOSSCDynamicStore monitoring all network interface and IPv4 state changes.
  • WindowsNotifyAddrChange on a dedicated worker thread with clean shutdown support.

Events arrive in bursts (link down → IP removed → link up → DHCP assigned), so a 500ms debounce timer collapses them into a single interface refresh.

RDM Emulator

Device Hours and Power Cycles are now editable in the detail panel and in the Create/Edit Profile dialog.

Extended PID support. The emulator now responds to GET and SET for all standard RDM configuration parameters, allowing you to test template apply workflows end-to-end against emulated devices:

  • DisplayDISPLAY_INVERT (0x0500), DISPLAY_LEVEL (0x0501)
  • LampLAMP_STATE (0x0403), LAMP_ON_MODE (0x0404)
  • Pan/TiltPAN_INVERT (0x0600), TILT_INVERT (0x0601), PAN_TILT_SWAP (0x0602)
  • PowerPOWER_STATE (0x1010)
  • Dimmer (E1.37-1)CURVE (0x0343), OUTPUT_RESPONSE_TIME (0x0345), MODULATION_FREQUENCY (0x0347), MINIMUM_LEVEL (0x0341), MAXIMUM_LEVEL (0x0342)
  • DMX behaviorDMX_FAIL_MODE (0x0141), DMX_STARTUP_MODE (0x0142)

All PIDs are advertised in SUPPORTED_PARAMETERS, persisted to JSON, and initialized with sensible defaults (e.g., 4 dimmer curves, 3 response time settings, 3 modulation frequencies). SET operations validate range and return NR_DATA_OUT_OF_RANGE for invalid values.

RDM Templates — Extended Settings

The template system now supports all standard RDM SET parameters. Clicking the "N params ▸" button in the Settings column opens a dialog with grouped controls:

  • Display — Display Invert (Off / On / Auto), Display Level (0–255)
  • Lamp — Lamp On Mode (Off / DMX / On / After-Cal), Lamp State (Off / On / Strike / Standby)
  • Pan / Tilt — Pan Invert, Tilt Invert, Pan/Tilt Swap
  • Power — Power State (Full On / Shutdown / Standby / Normal)
  • Dimmer (E1.37-1) — Curve index, Output Response Time index, Modulation Frequency index, Minimum Level, Maximum Level. When a matching device has been discovered, the spin boxes show the device's supported range and current value in the tooltip. Minimum Level prevents LED flicker at low intensities; Maximum Level caps output for audience safety or power control.
  • DMX Behavior (E1.37-1) — DMX Fail Mode (Hold Last Look / Full Off), DMX Startup Mode (Hold Last Look / Full Off). Controls what the fixture does when it loses DMX signal and what it does on power-up before DMX arrives — critical for safety in permanent installations.

All settings use the standard "— (not set)" convention — only parameters you explicitly configure are sent to the device. Templates are applied via the existing "Apply to Selected" button or automatically on discovery when auto-apply is enabled.

RDM Alert Identify

A new "Identify fixtures on alert" toggle in the Templates tab enables automatic RDM Identify for fixtures that have a problem. When enabled, DMXRouter sends IDENTIFY_DEVICE ON to any fixture that meets either of these conditions:

  • Firmware mismatch — the fixture's software version doesn't match the version stored in its template
  • Lamp hours exceeded — the fixture's lamp hours exceed the limit defined in its template

The fixture flashes on the rig, letting the technician spot it without looking at the screen. This is especially useful during pre-show checks in large rigs where visually scanning for problems on a monitor isn't practical.

When a template has a lamp hours limit configured, DMXRouter now automatically fetches hours PIDs (Device Hours, Lamp Hours, Lamp Strikes, Power Cycles) immediately after the basic probe completes. Previously, lamp hours were only available after a manual extended fetch (double-click or button), which meant the alert system was effectively inactive unless the user intervened. The auto-fetch adds only 4 lightweight RDM requests (~200ms of bus time) per fixture — not the full extended fetch which includes personalities, slots, and sensors.

Identify is sent once per device per session — toggling RDM off and on, or clearing the device list, resets the tracking so alerts are re-evaluated on the next probe. The identify stays on until the technician turns it off manually (right-click → Identify Off, or via the Info tab). The setting persists across sessions.

The feature can also be toggled from the DMX Remote Control main channel: value 64–71 enables alert identify, value 72–79 disables it. This allows a technician to activate pre-show fixture checks from the desk without touching the DMXRouter interface. The checkbox in the Templates tab s...

Read more

DMXRouter 1.5.5

16 Mar 19:53
82a14ba

Choose a tag to compare

Show Cue — Undo

An Undo button now appears at the right end of the cue toolbar, with full Ctrl+Z (Cmd+Z on macOS) keyboard shortcut support. It restores the previous state after any destructive or editing operation on cues, with a stack depth of 20 levels.

Covered operations:

  • Delete — undoing a delete re-inserts the cue(s) at their original positions with all data intact, including sequence frames.
  • Edit — undoing an inline edit (name, fade time, hold, curve, loop mode, repeat count) restores the previous value.
  • Renumber — undoing a renumber (single or batch) restores the original cue numbers.

The undo button tooltip shows what will be undone (e.g. "Undo: Delete cue 3"). The stack is cleared when switching between shows, since undo entries are bound to a specific show.

VLAN — Set DHCP

The "Set IP" dialog now includes a Set DHCP toggle — in both the VLAN Manager and the Interfaces tab. When enabled, the IP Address and Subnet Mask fields are locked — pressing Apply switches the adapter back to automatic IP assignment (DHCP). When reopening the dialog on an adapter that's already using DHCP, the toggle is pre-activated so the current state is always visible. The IP and mask fields still show the current DHCP-assigned values for reference — if you deactivate DHCP, they're ready to use as a starting point.

VLAN — Physical NIC Persistence

The "Physical NIC" dropdown now correctly shows the parent adapter when restarting DMXRouter with existing VLAN infrastructure. Previously, on a machine with multiple Ethernet adapters, the combo could show a different NIC than the one actually hosting the VLANs — which was confusing even though the combo was disabled. The parent NIC is now detected from the OS during the capability check on each platform:

  • Windows — queried from the Hyper-V Virtual Switch's bound adapter
  • Linux — queried from the first existing DMXRouter VLAN's vlan.parent via nmcli
  • macOS — queried from ifconfig vlanX parent interface field

The adapter list is also now populated automatically on startup instead of requiring a manual refresh click.

VLAN — Table Improvements

  • Subnet Mask column. The VLAN table now shows a "Mask" column between IP Address and Status, so the full network configuration is visible at a glance. IP Address and Mask columns use ResizeToContents so they only take the space they need.
  • Set IP dialog pre-fills subnet mask. When opening "Set IP" from the VLAN Manager, the subnet mask is now resolved from the adapter's current configuration instead of defaulting to 255.255.0.0. If the adapter has no IP yet, the default is 255.255.255.0.
  • Auto-refresh after interface changes. The VLAN table now updates its IP/Mask columns whenever the interface list changes — including when clicking Refresh in the Interfaces tab or after creating a new VLAN. Previously the table only updated after creating a second VLAN or reopening the tab.

macOS & Linux — Friendly Interface Names

Network interfaces on macOS and Linux now display their user-friendly names instead of kernel device names:

  • macOS — "vlan0" becomes "DMXRouter_VLAN200", "en0" becomes "Thunderbolt Ethernet", matching what appears in System Settings → Network.
  • Linux — "enp3s0" becomes "Wired connection 1", "DMXRouter_VLAN200" stays as-is, matching what NetworkManager shows in nmcli or the GNOME/KDE network settings.

This applies everywhere interfaces appear: the Interfaces tab, interface dropdowns in RDM/sACN/Art-Net configuration, and Show Cue control source selectors. Windows was already showing friendly names via QNetworkInterface::humanReadableName() and is unaffected.

Routing — Faster Engine Enable/Disable

Toggling a process engine on or off in the routing table is now effectively instant. Previously, each checkbox toggle ran the full config-update pipeline: rebuilding the input index, pruning unreferenced source caches, recalculating play-input slot assignments, updating sACN multicast group memberships (kernel IGMP calls), and refreshing the Show Cue panel. None of that work is needed for a simple enable/disable — the routing topology hasn't changed, just whether the engine is being evaluated. The toggle now flips a single flag and refreshes the table.

Network & Performance

Larger Socket Buffers

Socket receive buffers increased from 512KB to 8MB (clamped by each OS to its maximum). This prevents packet loss during brief GUI stalls — at 1000 universes, the previous buffer could only hold ~18ms of traffic before dropping packets. The new buffer provides over 150ms of headroom, enough to absorb any normal application activity without data loss. Larger buffers do not add latency: packets are still processed immediately as they arrive; the extra space only matters as a safety net when the application is momentarily busy.

Send buffers also increased from 512KB to 2MB, preventing dropped output packets when a show cue triggers all universes simultaneously.

On Linux and macOS, the OS may limit buffer sizes below what DMXRouter requests. A warning appears in the log at startup with the command to fix it:

  • Linux: sudo sysctl -w net.core.rmem_max=8388608
  • macOS: sudo sysctl -w net.inet.udp.recvspace=8388608

Internal Processing

The per-packet processing path has been optimized to reduce CPU overhead at high universe counts. Interface lookups, statistics recording, and monitor updates now use cached data instead of recalculating on every packet. At 1000 universes these changes significantly reduce CPU usage, making DMXRouter suitable for large-scale productions on standard hardware.

Atomic Config Saves

Show configuration files are now written atomically. If the application crashes or power fails during a save, the previous config file remains intact — protecting hours of show programming from corruption.

Windows — VLAN Adapter Isolation on Creation

When Hyper-V creates a new ManagementOS adapter (Add-VMNetworkAdapter), Windows starts the DHCP client on it immediately — before the VLAN tag is applied by Set-VMNetworkAdapterVlan. During this brief window, the adapter operates in untagged mode and can pick up DHCP leases from the untagged network. Once the VLAN tag is applied, broadcast isolation works correctly (Access mode drops traffic that doesn't match the VLAN ID), but the stale DHCP lease persists.

DMXRouter now prevents this race condition:

  • DHCP disabled at creation time. After creating a VLAN adapter and applying the VLAN tag, the DHCP client is immediately disabled (Set-NetIPInterface -Dhcp Disabled) with a brief delay to ensure Windows has registered the interface. This prevents the adapter from acquiring a lease before the operator assigns a static IP.
  • DHCP also disabled when assigning a static IP. The Set IP command now explicitly disables DHCP before adding the address, in case the adapter was created by a previous version.
  • Strict subnet matching for Art-Net. As an additional safety layer, Art-Net DMX data packets are now matched exclusively by subnet: a broadcast from 192.168.1.x can only reach an interface with a 192.168.1.x address, never a 2.x.x.x VLAN interface. Previously, a cross-subnet fallback silently routed unmatched packets to all active interfaces. Discovery and RDM packets (ArtPollReply, ArtTodData, ArtRdm) bypass this filter so that nodes on a different subnet — a common field scenario with factory-default IPs or misconfigurations — still appear in the device tree. sACN is unaffected — it uses multicast, where the group join is the isolation mechanism.

Windows & Linux — Static IP Routing Metric

When assigning a static IP via "Set IP", DMXRouter now sets a high routing metric (9999) on the adapter and removes any default gateway. This prevents static Art-Net/sACN adapters from competing with the DHCP interface for internet routing — a common issue on Windows with Hyper-V when multiple virtual adapters share the same physical NIC and get equal automatic metrics.

When switching back to DHCP via "Set DHCP", the metric is restored to automatic so the adapter's gateway gets normal priority.

  • WindowsInterfaceMetric 9999 on static, AutomaticMetric Enabled on DHCP. Default route removed on static.
  • Linuxipv4.route-metric 9999 on static, reset to default on DHCP. Gateway cleared on static.
  • macOS — No change needed: networksetup -setmanual doesn't add a default gateway, and macOS uses service ordering for routing priority.

VLAN — macOS IP Assignment Fix

  • "Set IP" now works reliably for VLAN interfaces on macOS. The previous implementation cleared the adapter to DHCP before assigning the new static IP. On VLAN interfaces, macOS's configd was still processing the DHCP switch when the manual IP command arrived, silently ignoring it and leaving the adapter stuck in DHCP mode. The assignment is now a single atomic operation — networksetup -setmanual already replaces whatever configuration was active (DHCP or previous manual IP), so the preliminary clear was unnecessary and counterproductive.

VLAN — Set DHCP Fixes (All Platforms)

While implementing the Set DHCP feature, the underlying "clear IP" commands were reviewed and corrected on all three platforms:

  • Windows — Previously only removed manual IP addresses without re-enabling the DHCP client. Now enables DHCP, restores automatic interface metric, and runs ipconfig /renew to force a DHCP lease request.
  • Linux — Previously set ipv4.method disabled, which turned off IPv4 entirely on the adapter. Now correctly sets ipv4.method auto to enable DHCP, and resets gateway and route metric to defaults.
  • macOS — Already correct (networksetup -setdhcp), no change needed.

Platform Availability

Windows

Download and run `DMXRouter-S...

Read more

DMXRouter 1.5.4

15 Mar 14:44
80f3703

Choose a tag to compare

RDM — Fixture ID (E1.37-5: DEVICE_UNIT_NUMBER)

Support for PID 0x0656 DEVICE_UNIT_NUMBER from ANSI E1.37-5. This PID — commonly known as Fixture ID — is designed to give each fixture a unique numeric identifier independent of its DMX address, making it possible to track individual units across different shows, venues, and address schemes.

  • Fixture ID column in the device tree. A new "FID" column appears between DMX and Personality, showing the fixture ID of each discovered device. Robert Juliat and other manufacturers implementing this PID consider it "as important as the DMX address" — the tree reflects this by placing them side by side.
  • Fixture ID in the Info tab. Displayed below Sub-Devices, immediately visible without needing "Fetch Advanced".
  • Fixture ID in the Config tab. A spin box (0–65534) with a Set button lets you assign a fixture ID from DMXRouter, just like setting a DMX address. The value is sent via SET DEVICE_UNIT_NUMBER and confirmed with a re-read.
  • Fetched automatically as part of "Fetch Advanced" alongside all other E1.37 PIDs.
  • RDM Emulator support. Emulated devices respond to GET and SET DEVICE_UNIT_NUMBER. The value is persisted to disk, captured when snapshotting a real device, and advertised in SUPPORTED_PARAMETERS.

RDM — Automatic Status Message Drain (E1.20 §5.3.3)

E1.20 specifies that when a device has queued messages, it sets messageCount > 0 in the response header of any RDM transaction. The controller should then drain those messages by sending GET QUEUED_MESSAGE. DMXRouter now does this automatically.

  • Auto-drain on every RDM response. When any successful RDM response arrives with messageCount > 0, DMXRouter begins draining the device's output queue by sending GET QUEUED_MESSAGE in a loop (50ms spacing) until messageCount reaches 0. This happens transparently in the background — no user action required.
  • Status messages are accumulated per device. Drained STATUS_MESSAGES responses are decoded and stored in the device's data structure, persisting as long as the device remains discovered. Other queued PID responses (non-status) are logged for diagnostics.
  • Concurrency protection. Only one drain loop runs per device at a time. A depth limit of 20 messages per burst prevents runaway loops from misbehaving responders.

This is particularly important for fixtures that use status messages to report selftest results, sensor alerts, or configuration changes made via their own web interface — the controller now picks these up automatically instead of requiring the operator to manually poll.

RDM — Status Message Indicators in the Device Tree

Status messages are now visible at a glance in the device tree, without needing to open the Status tab:

  • The Status column now reflects accumulated status messages. After probe completion (✔), the indicator changes if the device has reported status messages:
    • ⚠ red — one or more errors (STATUS_ERROR / STATUS_ERROR_CLEARED)
    • ⚠ orange — warnings present, no errors (STATUS_WARNING / STATUS_WARNING_CLEARED)
    • ℹ green — advisories only (STATUS_ADVISORY / STATUS_ADVISORY_CLEARED)
    • ✔ green — probe complete, no status messages
  • Tooltip on the Status column summarises the message counts (e.g. "2 errors, 1 warning — select device and open Status tab for details").

This means that when a fixture sends a status message after a selftest, a sensor alert, or a configuration change, the operator sees it immediately in the tree — exactly what professional workflows need.

RDM — Status Tab Improvements

  • Status tab auto-populates when selecting a device. Previously the table was always empty until you clicked "Fetch Status". Now, if the device has accumulated status messages (from auto-drain or previous manual fetches), they appear immediately when you select the device.
  • Manual "Fetch Status" and "GET Queued" also feed the device accumulator. Messages fetched manually are stored alongside auto-drained messages, so the tree indicator updates in real time.
  • "Clear Status" clears both the table and the device accumulator. After sending SET CLEAR_STATUS_ID to the device, the accumulated messages are removed from memory, the tree indicator reverts to ✔, and the table is emptied.
  • Live update during auto-drain. If a device is currently selected and status messages arrive via auto-drain, the Status tab updates immediately with an "(auto-drained)" label in the message count.

RDM — Probe Progress Bar Cleanup

  • The probe progress bar and its status label now hide entirely when discovery finishes, instead of remaining visible as a centered "Idle" / "N devices — ready" label occupying a full-width row. Device count is already shown in the header — the progress bar only appears while probing is actively in progress.

RDM Templates — Lamp Hours Warning

  • Lamp hours limit per model. A new "Lamp Limit" column in the Templates table lets you set a warning threshold in hours (e.g. 2000h for a specific fixture model). The value is stored in the template and persisted to disk.
  • Warning in the device tree. When a discovered device's lamp hours exceed its model's template limit, the device name turns orange and a tooltip shows "Lamp hours: 2150 (limit: 2000h)".
  • Warning in the Info tab. The Lamp Hours row turns red and shows "2150 ⚠ exceeds 2000h limit" when the threshold is exceeded.
  • Set the limit to 0 (shown as "—") to disable the warning for a model.

RDM Templates — Firmware Mismatch Warning

  • Templates now capture the device's firmware version (SOFTWARE_VERSION_LABEL) at save time.
  • Warning on manual apply: when applying a template to a device running a different firmware than the one the template was saved from, a warning dialog explains that personalities, channels, or behavior may have changed, and asks for confirmation before proceeding.
  • Warning on auto-apply: during automatic template application on discovery, firmware mismatches are logged in the RDM transaction log so the operator can review them after probing completes.
  • Visual indicator in the Templates table: the Model column shows an orange text when a discovered device of the same model has a different firmware than the template. Hover the Model cell to see both versions.

UI Polish

  • Improved table layouts across the application. Columns that contain variable-length text (device name, model, label, description) now stretch to use available space, while fixed-width columns (status indicators, timestamps, IDs) no longer waste space. This applies to the RDM device tree, Node Config tree, Fixture DB, PID Browser, Slots, personality tables (RDM, LLRP, RDMNet), and the Show Cue table.
  • RDM device tree Status column now shows ✔ (checkmark) on all platforms instead of 💾 (floppy disk emoji) which had no obvious meaning.
  • RDM and Node Config splitter proportions adjusted so the device tree gets enough room for all columns by default.
  • Show Cue Curve/Loop dropdowns no longer clip on macOS — columns and combo boxes widened to accommodate the dropdown arrow.
  • Interfaces tab font sizes reduced to match the rest of the application. Previously the tab appeared noticeably larger than other tabs, especially on macOS.

macOS — VLAN IP Assignment Fix

  • "Set IP" now works for VLAN interfaces on macOS. Previously, assigning an IP to a VLAN adapter failed with "SERVICE_NOT_FOUND" because the BSD device name (vlan0) was only looked up in hardware ports, where VLANs don't appear. A third lookup path via networksetup -listVLANs now resolves the correct network service name. Physical interfaces (en0) continue to work as before via the hardware ports path.

Platform Availability

Windows

Download and run DMXRouter-Setup.exe. All dependencies included.

VLAN management requires Windows Pro/Enterprise with Hyper-V enabled.

Linux

Download the binary for your architecture:

  • DMXRouter-v1.5.4-linux-x86_64.zip — standard PCs and servers
  • DMXRouter-v1.5.4-linux-arm64.zip — Raspberry Pi 4/5, Orange Pi, ARM64 boards

Qt6 runtime required:

# Ubuntu / Debian / Raspberry Pi OS
sudo apt install libqt6core6 libqt6gui6 libqt6widgets6 libqt6network6

# Fedora
sudo dnf install qt6-qtbase

# Arch
sudo pacman -S qt6-base

Then: chmod +x DMXRouter && ./DMXRouter

VLAN management requires NetworkManager (sudo apt install network-manager if not present). No need to run as root — the app prompts for your password when needed. VLANs persist across reboots.

macOS

Download the .app bundle (Qt6 frameworks bundled). Requires macOS 13.0 (Ventura) or later. On first launch, allow it in System Settings → Privacy & Security.

No need to run with sudo — the app prompts for your password when needed. VLANs appear in System Settings → Network and persist across reboots.

DMXRouter 1.5.3

14 Mar 15:39
f6f4fcc

Choose a tag to compare

RDM Emulator — Multi-Selection & Batch Operations

  • Multi-selection in the device profile table. Ctrl+Click, Shift+Click, and drag-select now work. When multiple profiles are selected, the detail panel switches to a batch summary showing all selected devices with their status, UID, and model name.
  • Batch operations: Activate All, Deactivate All, Duplicate All, Export All, and Remove All — available both from the batch panel buttons and from the right-click context menu. The context menu adapts its entries based on whether one or multiple profiles are selected.
  • Multi-profile export produces a single .dmxrprofile file containing all selected profiles. Import recognises this format automatically alongside single-profile files.

RDM Emulator — Template Library

  • New "Template Library" tab alongside the Devices tab. Templates are reusable fixture definitions — they contain the manufacturer, model, personalities, channel map, and supported PIDs, but no instance data (UID, port, DMX address, active state).
  • Save as Template: right-click any device (or multiple devices) and choose "Save as Template…" to add it to the library. For single selection, a dialog asks for the template name.
  • Create from Template: the "From Template…" button in the Devices tab opens a picker dialog, then asks how many instances to create (1–100) with a personality selector. Each instance gets a unique virtual UID.
  • Personality selector in the "Create Instances" dialog — a dropdown listing all personalities with their channel count. A live label shows the DMX footprint of the selected personality. Templates with a single personality show the combo disabled.
  • Template file format (.dmxrtemplate): export and import templates independently from device profiles. Single-template and multi-template files are both supported.
  • Templates are persisted automatically to rdm_emulator_templates.json in the data directory.

RDM — Complete E1.20 PID Support

DMXRouter now handles every standard PID defined in ANSI E1.20-2010:

  • STATUS_MESSAGES / STATUS_ID_DESCRIPTION / CLEAR_STATUS_ID / QUEUED_MESSAGE: new "Status" tab in the RDM inspector. Query device status messages filtered by severity (Advisory / Warning / Error). Messages are color-coded. Click a row to fetch the human-readable description for that status ID. "GET Queued" drains the device output queue one message at a time, showing the messageCount from each response. "Clear" sends SET CLEAR_STATUS_ID.
  • PARAMETER_DESCRIPTION: when "Fetch Advanced" retrieves a device's supported PID list and finds manufacturer-specific PIDs (0x8000–0xFFDF), it automatically queries PARAMETER_DESCRIPTION for each one. The PID Browser then shows the manufacturer's own name, data type, access mode (GET/SET), unit, and valid range for these PIDs — instead of just "Unknown PID".
  • COMMS_STATUS: displayed in the Info tab (short message count, length mismatch, checksum failures). "Clear Comms" button in the Config tab resets the counters.
  • PRODUCT_DETAIL_ID_LIST: displayed in the Info tab with human-readable names.
  • BOOT_SOFTWARE_VERSION_ID / BOOT_SOFTWARE_VERSION_LABEL: displayed in the Info tab.
  • FACTORY_DEFAULTS: GET displayed in Info tab, SET via "Factory Reset" button (with confirmation dialog).
  • LANGUAGE / LANGUAGE_CAPABILITIES: displayed in Info tab (current language + number of available languages).
  • DEFAULT_SLOT_VALUE: cached per device for reference.
  • PROXIED_DEVICES / PROXIED_DEVICE_COUNT: displayed in Info tab for gateways that act as RDM proxies.
  • REAL_TIME_CLOCK: displayed in Info tab. "Sync Clock" button sets the device clock to the current system time.
  • POWER_ON_SELF_TEST / PERFORM_SELFTEST / SELF_TEST_DESCRIPTION: power-on self-test status shown in Info tab.
  • RECORD_SENSORS: "Record All" button in the Sensors tab captures the current sensor values as reference.
  • SUB_DEVICE_STATUS_REPORT_THRESHOLD: GET/SET supported.
  • RESET_DEVICE: "Warm Reset" and "Cold Reset" buttons in Config tab (with confirmation dialogs).
  • PRESET_PLAYBACK / PRESET_MERGEMODE / PRESET_INFO / PRESET_STATUS / CAPTURE_PRESET: preset state displayed in Info tab. All SET commands implemented.

RDM — E1.37-1 Dimmer Message Set

Full support for the dimmer-specific PIDs defined in ANSI E1.37-1:

  • CURVE / CURVE_DESCRIPTION: current dimming curve displayed in Info tab. SET supported.
  • OUTPUT_RESPONSE_TIME / OUTPUT_RESPONSE_TIME_DESCRIPTION: GET/SET supported.
  • MODULATION_FREQUENCY / MODULATION_FREQUENCY_DESCRIPTION: GET/SET supported.
  • MINIMUM_LEVEL / MAXIMUM_LEVEL: displayed in Info tab (increasing/decreasing values).
  • BURN_IN: GET/SET supported.
  • LOCK_STATE / LOCK_STATE_DESCRIPTION / LOCK_PIN: lock state displayed.
  • DMX_FAIL_MODE / DMX_STARTUP_MODE: displayed in Info tab (scene, delay, hold). SET supported.
  • DIMMER_INFO: full dimmer configuration summary in Info tab.

All dimmer PIDs are automatically queried when clicking "Fetch Advanced".

RDM — "Fetch Advanced" Button

New button in the Config tab that queries all E1.20 advanced PIDs and E1.37-1 dimmer PIDs in a single staggered burst (50ms spacing per PID to respect half-duplex gateways). This populates the Info tab's Advanced section, the Status tab, and the PID Browser's manufacturer PID metadata. Devices that don't support a PID simply NACK and the field shows "—".

LLRP — Identify Fixes

  • Identify button is now a toggle — pressing it sends IDENTIFY ON; pressing again sends IDENTIFY OFF. The button highlights orange when active, matching the RDM panel behavior.
  • Identify state is now fetched from the target (GET IDENTIFY_DEVICE) when selecting a device or clicking "Get Info".
  • Context menu Identify ON/OFF now syncs the toggle button state.
  • SET ACK for IDENTIFY triggers a re-read to confirm the device state.

Cross-Platform UI — Conditional Icons

  • Emoji restored on macOS and Windows — all 22 UI icons (💡🔍🔄📋📥📤🤖💾📸📊🎬📈🔧🌐📡📂🔢 etc.) now render as their original colorful emoji on macOS and Windows, restoring the visual personality of the interface.
  • BMP fallbacks on Linux only — Linux builds use safe BMP Unicode symbols (☀⌕↻☰⤓⤒⚙✔⊚▦▶↗☷№✕) that render reliably across all Linux font configurations.
  • AppStyle::Icons namespace — all icon constants are defined in a single place with #ifdef Q_OS_LINUX conditional. GUI files use IC::Identify, IC::Search, etc. via a namespace alias, making it trivial to adjust icons per platform.

Config Tab — Device Control

New "Device Control" section at the bottom of the Config tab with one-click actions:

  • Warm Reset — software restart (RESET_DEVICE warm)
  • Cold Reset — full hardware restart (RESET_DEVICE cold)
  • Factory Reset — restore factory defaults (SET FACTORY_DEFAULTS)
  • Clear Comms — reset communication error counters (SET COMMS_STATUS)
  • Sync Clock — set device clock to system time (SET REAL_TIME_CLOCK)

All destructive operations require confirmation.

RDM — Remove Lost Devices

  • "Remove Lost" button in the RDM panel header — removes all devices that haven't responded in over 30 seconds, instead of waiting for the default 5-minute timeout. Useful after disconnecting fixtures or reconfiguring a rig.
  • "Remove Device" in the right-click context menu — immediately removes a single device from the discovered list.
  • "Remove Lost Devices (not seen >30s)" in the context menu — same as the header button.
  • "Last seen" indicator in the context menu shows how long ago the device last responded, helping identify lost fixtures before removing them.

RDM Templates — Export & Import

  • "↑ Export…" button in the Templates tab — exports all RDM configuration templates to a JSON file for sharing or backup.
  • "↓ Import…" button — imports templates from a previously exported file. Supports multiple formats: the export wrapper, the internal DMXRouter storage format, and raw JSON arrays. Existing templates with the same model key are updated.

RDM Templates — Personality Dropdown

  • The Personality column in the Templates table is now a dropdown menu instead of a static text field. When a device of the same model has been discovered, the combo lists all available personalities with their description and channel count (e.g. "1 — 8-bit Mode (4 ch)"). Selecting a personality immediately updates the template. The first entry "—" clears the personality setting.

RDM — Probe Progress Feedback

  • Progress bar below the header — shows a green progress bar during device probing with "12 / 58 devices" format. Hidden when all devices are probed.
  • Status label next to the progress bar — shows "Probing 12/58 devices…" in orange during probing, switches to "58 devices — ready" in green when complete.
  • Discover button flashes orange while probing is in progress, providing a visual heartbeat that RDM activity is happening.
  • "Status" column in the device tree — shows per-device probe progress: "…" (waiting), "3/6" (receiving PIDs), or "✔" (complete). The indicator is orange while probing and green when complete, making it easy to spot which fixtures have been fully queried.

Show Cue — Playback Time & Repeat Feedback

  • Fade time countdown in the status label — during crossfading, the status now shows elapsed and total time (e.g. "FADING Show 1 · Cue 3 · 1.2s / 5.0s") instead of just a percentage, so you know exactly how long remains.
  • Sequence playback timing — for sequence cues (recorded timelines), the status shows elapsed and total duration (e.g. "▶ PLAYING Show 1 · Cue 5 · 12.3s / 45.0s"). The progress bar also fills during sequence playback, not just during crossfades.
  • Repeat counter in the status label — when autopilot is active and the current cue has mul...
Read more

DMXRouter 1.5.2

09 Mar 06:31
348d826

Choose a tag to compare

Show Cue Playback — Sequential Slot Mapping

  • Show playback no longer requires matching engine indices. Previously, a recorded show would only output correctly if the subscribing engines had the same indices as the engines that were active during recording. In practice this meant you had to delete input-only engines to make outputs work, or set up engines in the exact same order as when the show was recorded.
  • Now, when an engine selects a show as its input source, it is automatically assigned the next available slot in recording order. The first engine to subscribe to Show 1 gets the first recorded PE's data, the second gets the second, and so on — regardless of their engine index. Disabled engines do not consume a slot.
  • Recorded PE indices are sorted into a canonical order per show, so the mapping is consistent across cues, crossfades, sequence playback, blackouts, and keep-alive frames.
  • Recording feedback loop protection: engines that have a play input subscribed to the show being recorded are automatically excluded from capture. This prevents the show's own playback data from being re-recorded into itself.
  • Show removal during recording: removing a show that is being sequence-recorded now stops the recording first. Removing a show before the recording target adjusts the index correctly.

Show Cue — UI Redesign

  • "⏺ REC" → "◉ Take" — the snapshot capture button is now called "Take" to clearly convey it captures a single instant, not a time-based recording.
  • "⏺ SEQ" → "⏺ Rec" — the sequence recording button is now "Rec", which is the intuitive label for time-based recording. During recording it shows "⏹ Stop Rec".
  • DMX remote trigger for sequence recording — the Record Trigger channel now accepts values 141–180 to start/stop sequence recording for shows 1–40 (in addition to 101–140 for snapshot takes). Sending the value again while recording stops it. If recording a different show, the current recording is stopped first.
  • Collapsible trigger config — the Play Control and Take/Rec Trigger configuration panels are now behind a "▸ DMX Trigger Config" toggle at the bottom, collapsed by default. The cue table gets the full height when triggers are already configured.
  • Compact address fields — Net, Subnet, Universe, and Absolute are now on a single row instead of four separate rows. Protocol and Channel share a row. Switching to sACN collapses the Art-Net fields cleanly. Universe and Absolute spins have a minimum width of 75 px to fit 5-digit sACN values.
  • Save/Load moved to top bar — Save… and Load… buttons are now in the show toolbar next to +/− instead of buried in the config panel.
  • Status label moved to transport bar — the playback status (STOPPED / PLAYING / Recording…) is now next to the Autopilot button where it has more space, instead of competing with Save/Load.
  • Top bar layout — show controls are left-aligned, default cue settings are right-aligned, with a stretch separator between them.

Show Cue Table Improvements

  • Cue type "Snap" renamed to "Snapshot" — the Type column now shows "Snapshot" instead of "Snap" to clearly distinguish it from the "Snap" fade curve, which remains unchanged.
  • Column header tooltips — all 10 columns now have descriptive tooltips explaining their purpose: Reps (repeat count for autopilot), PEs (number of Process Engines in the cue), Hold (auto-advance delay), Curve (fade shape), Loop (sequence play mode), and others.
  • Row height increased — from the default to 34 px so the embedded Curve and Loop combo boxes are fully visible instead of being clipped.
  • Hover selection fixed — moving the mouse over the cue table no longer auto-selects rows, matching the fix applied to other tables with embedded widgets.
  • Hold column: spin box instead of text — the Hold column now uses a numeric spin box with "Manual" displayed at value 0, instead of requiring the user to type "Manual" as text. Arrows and direct input both work.
  • Double-click GO on editable columns — double-clicking the Name, Fade, Hold, Curve, Loop, or Reps column no longer fires the cue. GO is only triggered on read-only columns (Number, Type, PEs, Recorded).
  • Disabled cell shading — Hold is shaded for Sequence cues, Loop and Reps are shaded for Snapshot cues, making it visually clear which fields don't apply to which cue type. Playback highlighting overrides the shading and restores it when the cue is no longer active.

Engine Editor Improvements

  • Input fields shaded when source is internal/play — Protocol, Net, Subnet, Universe, Absolute, and Source IP fields are now visually dimmed when the input source is an engine or a show, since these fields don't apply to internal routing.
  • Output Tx Mode column widened — from 95 to 110 px so "Broadcast" is no longer clipped.

Keyboard Shortcuts

  • Alt+8 now opens the RDM Emulator panel (previously had no shortcut).
  • Broker moved to Alt+9, LLRP to Alt+0. Remote Control no longer has a shortcut.

Template Table Fixes

  • Row height: the editable DMX Address spin box was clipped inside the 22-pixel default row height. Increased to 34 px.
  • Column widths: "DMX Addr" widened to 95 px, "Settings" widened to 120 px to prevent text truncation.
  • Hover selection: moving the mouse over the template table no longer auto-selects rows.
  • Settings count: the DMX address is only counted as an active parameter when the global "Apply DMX address" toggle is on. Toggling the checkbox updates the count immediately.

RDM Emulator Fixes

  • Protocol toggle Art-Net ↔ sACN addressing: the emulator was using sACN universe = PA (Port-Address) while the rest of the application uses sACN universe = PA+1 (matching Art-Net Absolute). This caused the universe number to drop by 1 every time the protocol was toggled, and PA=0 (Art-Net Absolute 1) produced an invalid sACN universe of 0. All four display and save paths now use the PA+1 convention.
  • Create/Edit dialog table rows: row height increased to 38 px so descender letters like "p" and "g" are no longer clipped.
  • DEVICE_HOURS and DEVICE_POWER_CYCLES: emulated devices now respond to these PIDs. Values are captured from real devices and default to 0 for manually created profiles.

DMXRouter 1.5.1

08 Mar 02:40
2e0362e

Choose a tag to compare

RDM Templates: DMX Address per Model

Templates now store a DMX start address for each model. In the Templates tab, the new DMX Addr column lets you assign a fixed address per fixture type directly in the table (set to 0 to skip).

A global checkbox — Apply DMX address when using templates — controls whether the address is actually sent to the device when a template is applied (manually or via auto-apply). This makes it easy to keep addresses configured in your template library and only activate them when you need them, for example in a warehouse or testing workflow where every fixture of a given model should start on the same channel.

When saving a template from a selected device, the device's current DMX address is captured automatically.


RDM Emulator: Create Profiles from Scratch

The emulator now has a + Create New button alongside the existing "Capture from RDM" workflow. This opens a dialog where you can define a virtual fixture without needing a physical device on the network:

  • Manufacturer and Model name
  • Device Label — independent from the model name, for identifying individual units
  • Software Version — reported to controllers via RDM (defaults to "1.0")
  • Product category (Fixture, Moving Yoke, Dimmer, Fog, Projector, and more)
  • Personalities — add as many as you need, each with a channel count and description
  • Slots / Channels — define what each DMX channel does (Intensity, Red, Green, Blue, Pan, Tilt, etc.) using standard E1.20 slot labels. The slot table auto-resizes to match Personality 1's footprint and preserves your descriptions when you change the channel count

The resulting profile behaves identically to a captured one: assign it to a virtual port, activate it, and controllers will discover it via RDM.


Bug Fixes

  • Inspector fields overwritten while editing: the DMX address, personality, and device label fields in the RDM inspector were being reset by incoming device updates while the user was typing. All editable fields across the application — RDM, RDMNet, LLRP, and Node Config — now skip updates when they have keyboard focus.
  • Node Config port table rebuilt during editing: the entire port configuration table in Node Config was being destroyed and recreated on every ArtPollReply (~2.5 s), losing any in-progress edits. The table rebuild is now skipped while the user is editing any cell.
  • Emulator protocol toggle reset universe: switching between Art-Net and sACN display in the emulator detail panel could reset the universe back to 1. The protocol toggle now only changes the display format without modifying the stored port address.

DMXRouter 1.5

06 Mar 18:36
f1ae93a

Choose a tag to compare

RDM Device Emulator

DMXRouter can now impersonate RDM fixtures on the network — useful for pre-programming shows before hardware arrives, testing RDM controllers, or keeping console configurations stable when swapping equipment.

How it works

Open the 🤖 Emulator tab. Click + Capture from RDM and right-click any discovered device in the RDM tab to save its full profile: manufacturer, model, label, DMX footprint, personalities, slot map, and all supported parameters.

Back in the Emulator tab, set the Virtual Net and Virtual SubUni where the device should appear on the network, then click ⬤ INACTIVE to activate it. From that moment, DMXRouter announces the device via Art-Net TOD and responds to any RDM queries from connected controllers exactly as the original fixture would.

What controllers see

  • Device appears in RDM discovery immediately — no manual TOD flush needed
  • Responds to GET/SET for all standard PIDs: DEVICE_INFO, MANUFACTURER_LABEL, DEVICE_MODEL_DESCRIPTION, DEVICE_LABEL, SOFTWARE_VERSION_LABEL, SUPPORTED_PARAMETERS, DMX_START_ADDRESS, DMX_PERSONALITY, slot descriptions, and more
  • NACK with the correct reason code for unsupported PIDs
  • Identify state can be toggled from the Emulator panel and is reflected in RDM responses
  • DMX start address and personality changes made via RDM are applied immediately and persist

Managing profiles

  • Duplicate — clone a profile and assign it a new UID, useful for emulating multiple units of the same fixture type
  • Export / Import — save profiles as .dmxrprofile files to share between installations or build a library offline
  • Each profile shows when it was captured, an optional user note, and the full personality and slot breakdown

Compatibility notes

Works with any Art-Net 4 controller. Tested against DMXRouter's own RDM controller, dummyRDM, and real hardware gateways. Two instances of DMXRouter on the same machine — emulator in one, controller in the other — work correctly.


Sequence Cues — Time-Based DMX Recording

Show Cues now support a second cue type alongside snapshots: sequences. A sequence records live DMX data over time and plays it back as a looping timeline — similar to a standalone DMX recorder, but integrated into the show system.

Recording a sequence

Click ⏺ SEQ in the transport bar while DMX is flowing. DMXRouter captures a frame from every active process engine at 40 fps (25 ms intervals, matching DMX refresh rate). Click ⏺ SEQ again to stop. The resulting cue appears in the cue list as type "Seq" with its duration shown automatically.

Playback modes

Each sequence cue has a Loop setting:

  • Once — plays through the timeline once, then holds the last frame
  • Loop — restarts from the beginning when it reaches the end
  • Ping-Pong — reverses direction at each end, creating a back-and-forth effect

Crossfading into or out of a sequence works correctly: when a fade starts from a playing sequence, DMXRouter snapshots the current frame and uses it as the fade source instead of rewinding.


Fade Curves

Every cue — snapshot or sequence — now has a Curve setting that shapes how the crossfade progresses between the outgoing and incoming cue:

  • Linear — constant rate (default, same as previous versions)
  • S-Curve — smooth acceleration and deceleration (3t²−2t³)
  • Ease In — starts slow, finishes fast
  • Ease Out — starts fast, finishes slow
  • Snap — instant jump at the midpoint of the fade time

The curve selector appears per-cue in the cue table and as a default for new recordings.


Autopilot

A new ✈ Auto button in the transport bar enables automatic cue advancement. When autopilot is on:

  • After a cue finishes playing (including any hold time), the engine automatically fires GO to the next cue
  • Sequence cues respect the Reps column — the sequence plays the specified number of complete cycles before the engine advances
  • At the end of the cue list, playback stops

Combine autopilot with sequences and loop modes to build self-running shows that cycle through complex lighting scenes unattended.


Cue Management

  • Copy — copy one or more selected cues to the same show or a different one
  • Reorder — move cues up or down in the list with dedicated buttons

Reroute: Bulk Interface Replacement

When a network interface changes IP address (new switch, new VLAN, reconfigured adapter), you no longer need to edit each process engine one by one.

Multi-selection (2+ engines): select the affected engines, click Reroute, and a simple From → To dialog lets you swap one interface for another across all selected engines at once — inputs, outputs, and control channel sources. A live counter shows how many slots will be updated before you confirm. Choosing "any interface" as source replaces every interface on every slot; a safety prompt prevents accidental bulk changes.

Single selection: the Reroute dialog now also shows a detailed per-slot view with both universe and interface for each input and output, so you can fine-tune individual slots without opening the full editor.


Absolute Universe Field

All control source panels — Remote Control, Show Cue playback, Show Cue record trigger, and every merge control channel in the editor — now include an Absolute field showing the Art-Net Port Address + 1 (1–32768). Editing Absolute automatically updates Net, Subnet and Universe, and vice versa, so you can work with whichever addressing style you prefer. When switching between Art-Net and sACN, the universe address is preserved and converted instead of being reset.


Rename with Auto-Increment

Select several process engines, click Rename, and enter a base name ending in a number — for example "Stage 1". The engines will be named Stage 1, Stage 2, Stage 3, and so on, following selection order.


Update Notifications

When a new version is available, a persistent orange button appears in the status bar instead of a one-time popup that was easy to miss. Clicking it opens a dialog where you can download the update, dismiss it for later, or ignore that specific version permanently.


Bug Fixes

  • sACN universe off-by-one: outgoing sACN streams were sending on universe N−1 relative to what the routing table showed. Fixed.
  • Art-Net addressing display: Net, Subnet and Universe values in Remote Control and Show Cues were not decomposed correctly from the internal address — they now always show the right breakdown.
  • Custom Policy table: row height was too small for the embedded controls, making text hard to read. Column headers were also clipped. Both fixed, along with an issue where hovering the mouse over the table could unintentionally change the selected row.
  • Protocol switch stability: switching between Art-Net and sACN in any control source panel could briefly send an incorrect universe address to the engine before the conversion completed. Fixed across all affected panels.
  • Mode column width: slightly wider to avoid truncating mode names in the process engine table.

DMXRouter 1.4.2

02 Mar 15:45
e314119

Choose a tag to compare

New tab: 🎛 Remote (Alt+0) — trigger application actions remotely via DMX control channels, without touching the GUI.

Configure a single DMX source (protocol, universe, interface, optional IP filter) and assign up to three independent control channels. Values 0–7 arm the channel; transitioning into an action range fires once and disarms, preventing repeated triggers while the value is held. The same debounce pattern used by the Show Cue playback engine.

Main Channel — Global Actions

Value Action
0–7 Arm (idle)
8–15 RDM Discovery — trigger a TOD scan on all interfaces
16–23 RDM Enable
24–31 RDM Disable
32–39 Blackout All — disable every process engine
40–47 Release Blackout — re-enable all process engines
48–55 Capture Startup Buffers — snapshot all PEs
56–63 All Identify Off — send IDENTIFY OFF to every discovered RDM fixture

PE Channel — Per-Engine Control

Value Action
0–7 Arm (idle)
8–71 Enable PE (value − 8 = PE index 0–63)
72–135 Disable PE (value − 72 = PE index 0–63)
136–199 Toggle PE (value − 136 = PE index 0–63)

Profile Channel — Configuration Recall

Value Action
0–7 Arm (idle)
8–47 Recall Profile (value − 8 = profile index 0–39, alphabetically sorted)

Profile recall loads the full configuration: process engines, merge settings, VLANs, show cues, and remote control config itself.

Remote Tab UI

The tab is divided into two side-by-side panels at the top — Control Source (protocol, universe, interface, IP filter) and Channel Assignments (main, PE, profile, each 0=Off or 1–512) — followed by a Value Reference card with all three channel maps, and an Action Log showing timestamped entries of every triggered action.

All remote control settings are saved and restored with profiles, session autosave, and configuration files.


UI Improvements

Window Size

Default window width increased from 1280 to 1440 pixels so all 10 tabs are visible without scrolling.

Status Bar Size Grip Removed

The three-dot resize grip in the bottom-right corner of the status bar has been removed. The window already resizes from any edge; the grip served no purpose and was confusing when hovered.


Bug Fixes

Show Cue Widget Not Refreshing on Profile/Config Load

When loading a profile or configuration file that contained show cue data, the Cues tab did not refresh its UI — the old show list, cue names, and playback state remained visible until the user interacted with the tab. Fixed in all four load paths: Load Config, Load Profile, session restore (startup profile), and session restore (session file).


DMXRouter 1.4.1

26 Feb 20:30
bb6193d

Choose a tag to compare

Bug Fixes

  • Routing table display — Fixed a rare crash that could occur when reading the status column in the routing table.
  • Failsafe in cascaded configurations — When using Full or Scene failsafe mode with chained process engines (PE1 → PE2), the failsafe data now reaches downstream engines immediately. Previously, this could cause a brief black flash of up to 100 ms.
  • Show Cue recording — Fixed an issue where recording a cue with more than 64 active process engines could cause universe collisions between shows during playback.
  • sACN Universe Discovery — Improved performance when advertising a large number of universes across multiple discovery pages.

Port Configuration: Protocol Switching

Major improvements to how universes are handled when switching between Art-Net and sACN.

Universe Preservation

Switching a port between Art-Net and sACN now preserves the displayed universe number. Previously, changing from Art-Net (Absolute 9) to sACN would show sACN 8, and switching back could reset to universe 1. This now works consistently in both Node Config and Merge Engine.

Editable Absolute Column

The Absolute column in Node Config and Merge Engine is now fully editable for both protocols:

  • Art-Net: Editing Absolute auto-updates Net, Subnet, and Universe (and vice versa).
  • sACN: Editing Absolute syncs directly with the Universe field.

Net / Subnet Fields

Net and Subnet fields are now properly greyed out when a port is set to sACN, and re-enabled when switching back to Art-Net.

sACN Universe Limit in Node Config

The sACN universe range in Node Config is now capped at 32,767 to match the Art-Net Port-Address limit. The Merge Engine retains the full 1–63,999 sACN range since it handles addressing internally.


sACN Port-Address Fix

Fixed a bug where configuring an sACN universe via Port Config sent the wrong universe to the node — setting sACN universe 2 resulted in the node receiving universe 1.


Discovery: Protocol Display

  • Ports using Art-Net now correctly display "Art-Net" instead of "DMX512" in the node tree and Port Status table.
  • sACN detection improvement — Many nodes don't advertise sACN capability in their ArtPollReply. DMXRouter now remembers the protocol selection after Apply, so the display stays correct even if the node doesn't report it.

RDM Identify Management

  • Visual feedback — Clicking Identify now immediately shows a 💡 icon and amber highlight on the device in the tree, without waiting for a response from the fixture.
  • Identify Off button — New dedicated stop button next to the Identify toggle in the Config tab.
  • Context menu — Right-click any device → Identify On / Identify Off.
  • All Identify Off — New safety button in the RDM header bar. Sends Identify Off to every discovered fixture. Red hover styling signals its "panic stop" nature.

macOS Font Fixes

Fixes all font rendering inconsistencies on macOS introduced in v1.4.0.

  • Runtime scaling — Several widgets (Channel History, Show Cue, Universe Monitor, Channel Patch Editor) would revert to incorrect font sizes after interacting with them (clicking buttons, transitioning cues, toggling filters). All now scale correctly at all times.
  • About dialog — No longer overflows on macOS due to larger system fonts.
  • Monospace font — All technical readouts now use the correct system monospace font on each platform (Menlo on macOS, Consolas on Windows, DejaVu Sans Mono on Linux) instead of falling back to a proportional font.

DMXRouter 1.4

25 Feb 23:13
8f944c9

Choose a tag to compare

sACN Per-Channel Priority Monitor (0xDD)

  • New Priority view in the Universe Monitor — toggle between DMX levels and sACN per-channel priority data. Instantly see which source is winning each channel and why.
  • Color-coded display: blue (low priority) → green (default 100) → orange/red (high/max 200). Hover over any channel to see the exact priority value.
  • Universe list entries that carry priority data show a [P] tag. When multiple sources disagree on priority, you'll see both values (e.g., pri:100/150).

Dockable Panel Interface

  • All 9 panels (Interfaces, Engines, Monitor, Cues, Stats, Discovery, RDM, Broker, LLRP) can now be detached into floating windows — double-click any tab or drag it out. Ideal for multi-monitor setups: put the Monitor on your FOH screen, Engines on the tech desk, RDM on a tablet.
  • Closing a floating panel snaps it back into the main window — panels are never lost. Keyboard shortcuts (Alt+1–9) work regardless of docked or floating state.

Event Log Pop-Out

  • New "⬗ Pop Out" button in the Stats panel detaches the Event Log into its own window. Filters, auto-scroll, and live entries keep working while floating. Click "⬙ Dock" or close the window to snap it back.

Protocol-Aware Port Configuration

  • The Port Config table in Discovery now adapts when you switch a port between Art-Net and sACN. sACN: Net/Subnet fields disappear, Universe goes to 1–63999. Art-Net: traditional Net / Subnet / Universe fields. Switching converts the address automatically — no manual recalculation needed.

Cross-Platform Visual Consistency

  • The interface now looks identical on Windows, macOS, and Linux — same font (Inter), same colors, same spacing. No more macOS native widgets ignoring the dark theme.
  • Windows: FreeType font engine eliminates the colored fringing that ClearType caused on the dark background.
  • macOS: text size and stylesheet properly scaled for Retina displays.

RDM — Large Installation Support

  • Works smoothly with 100+ fixtures — activating RDM on a big rig no longer freezes the interface. The device tree updates efficiently in the background while you keep working.
  • Personality column — new "Pers" column in the device list shows the current mode of each fixture (e.g., 3/12) right away, without clicking anything. Spot a fixture set to the wrong personality at a glance.
  • DMX address overlap warning — if two fixtures on the same port step on each other's channels, the DMX column turns red with a tooltip explaining the conflict. Covers overlapping ranges, identical addresses, and fixtures contained inside another's footprint. The warning clears as soon as you fix the address.
  • Stale indicator tuned for scale — devices no longer grey out after just 30 seconds. With 100 fixtures on the bus, the keepalive cycle takes over a minute, so the threshold is now 3 minutes — long enough that healthy fixtures stay white, short enough to catch real disconnects.

RDM — Protocol Compatibility

  • Sequential probing — fixtures are queried one at a time with 50ms spacing between requests. Cheap gateways (Kingshow, generic Art-Net nodes) that could only handle 1-2 transactions at once no longer drop half the probe, cutting probe time from 9+ seconds back to ~1.5s.
  • ACK_TIMER — fixtures that need extra time to process a command (factory reset, firmware operations) are handled correctly. The request is retried after the fixture's requested delay, whether it was a GET or a SET.
  • ACK_OVERFLOW — fixtures with extensive feature sets (115+ supported PIDs) that split their response across multiple packets are now reassembled transparently.
  • Full UTF-8 support — all text fields from the fixture (manufacturer, model, label, software version, personality names, slot names, sensor names) display correctly in Chinese, Korean, and other non-Latin languages.
  • Automatic retry — a single dropped packet no longer means a permanent timeout. Every transaction retries up to 2 times before giving up.
  • Hours tracking — LED fixtures that don't support lamp hours no longer show misleading "0 hours" entries in the Fixture DB.

Session Management

  • Saved profiles now include the app version for future compatibility.

Networking Fixes

  • Art-Net on dual-NIC setups — broadcast packets now go out on the correct interface instead of always using the system's default route. Critical for Art-Net installations with dedicated lighting networks.
  • sACN loopback disabled — the sACN transmit socket no longer loops packets back to itself, reducing unnecessary CPU load on busy systems (40+ universes).
  • LLRP duplicate packets — on dual-NIC Linux systems, LLRP and mDNS multicast groups were joined twice, causing every packet to arrive duplicated. Fixed.

macOS Fixes

  • File dialogs work on Sequoia — Save/Load dialogs were broken by the Fusion style override. Native macOS file dialogs are now restored.
  • App Nap no longer kills DMX output — when the window loses focus, macOS used to throttle timers and network I/O. DMXRouter now stays fully active in the background.
  • Runs on macOS 12+ (Monterey) — previous builds required macOS 15 even though no Sequoia APIs were used. Sonoma, Ventura, and Monterey users can now run DMXRouter.

Windows / Linux Fixes

  • Combo box arrows visible — replaced SVG arrows with PNG to avoid dependency on the optional Qt SVG plugin.
  • WiFi and virtual interfaces filtered — WiFi adapters, VPN tunnels, Docker bridges, and other non-Ethernet interfaces no longer clutter the interface list.

UI Polish

  • Universe Monitor: filter bar no longer overflows at narrow widths, interface combo cleaned up, header clicks no longer select random rows.
  • Tab scroll buttons work correctly in the main window.
  • Column headers no longer clipped in Port Config, Port Status, and personality tables.

Platform Availability

Windows

Download and run DMXRouter-Setup.exe. All dependencies included.

Linux

Download the binary for your architecture:

  • DMXRouter-v1.4.0-linux-x86_64.zip — standard PCs and servers
  • DMXRouter-v1.4.0-linux-arm64.zip — Raspberry Pi 4/5, Orange Pi, ARM64 boards

Qt6 runtime required:

# Ubuntu / Debian / Raspberry Pi OS
sudo apt install libqt6core6 libqt6gui6 libqt6widgets6 libqt6network6

# Fedora
sudo dnf install qt6-qtbase

# Arch
sudo pacman -S qt6-base

Then: chmod +x DMXRouter && ./DMXRouter

VLAN management requires root (sudo ./DMXRouter) and the vlan kernel module (sudo modprobe 8021q).

macOS

Download the .app bundle (Qt6 frameworks bundled). Requires macOS 12.0 (Monterey) or later. On first launch, allow it in System Settings → Privacy & Security.

Technical Summary

  • ~37,000 lines of C++17 across 91 source files
  • Zero compiler warnings (-Wall -Wextra -Wpedantic / /W4)
  • Qt 6.5+ (LGPL v3)
  • Windows 10+, Linux x86-64, Linux ARM64, macOS 12+