Skip to content

ArtNet & DMX ​

Exaplay 3 speaks DMX over the network in both directions: it transmits DMX512 lighting values over Art-Net from timeline-animated Data Tracks (direct control of fixtures, dimmers, moving lights — the first part of this page), and it receives DMX from a lighting console over Art-Net or sACN (E1.31) so the desk can drive playback — see DMX input below.

ArtNet output settings with live DMX channel preview

Overview ​

Art-Net is an Ethernet-based protocol that encapsulates DMX512 (the industry-standard lighting control protocol). Any Art-Net-capable lighting console, fixture, or media server on the same network can receive values from Exaplay.

ArtNet Signal Flow

Prerequisites ​

  • A network connection between the Exaplay machine and the Art-Net device
  • The Art-Net device configured to receive on the correct universe
  • Both devices on the same subnet (or a network that passes Art-Net UDP broadcasts)

Setting Up a Data Track with ArtNet Output ​

Step 1 — Create the Data Track ​

  1. In the Timeline, click the caret (▾) next to the + under the track list and choose + Data Track (or right-click the Timeline and choose Add Data Track).
  2. In the Inspector, set Output › Format to ArtNet.

For a whole fixture — one track per channel, already addressed — use the Fixture library instead.

Step 2 — Configure ArtNet ​

FieldDescriptionValid range
AddressTarget Art-Net device IP, a broadcast address such as 255.255.255.255, or a named route such as $NodeAny IPv4
PortThe Art-Net port, 6454. A new Data Track starts on port 9000 (the OSC default); switching the Format to ArtNet moves it to 6454 while it is still 9000. A port you typed yourself is kept1–65535
UniverseArt-Net universe (the 15-bit Port-Address, sent as is)0–32767
ChannelDMX channel within the universe1–512
Rate (Hz)How often the track sends a packet while playing (default 120; the Fixture library uses 44)1–120

Values outside those ranges are clamped to them. Status shows sending to <address>:<port> once the composition plays (on a multiclient client: client — master sends (nothing sent from this machine)).

Tip: Most lighting fixtures start on Universe 0. Check your fixture's DMX address map.

Step 3 — Add Keyframes ​

Set keyframe values between the track's Min and Max range. Exaplay scales that range onto one DMX byte, rounding down:

Track value 0.0  →  DMX 0    (off)
Track value 0.5  →  DMX 127  (50 %)
Track value 1.0  →  DMX 255  (full)

A curve drawn on 0–255 (Min 0, Max 255) sends its values one to one. The Inspector's Live value shows the DMX byte the track is sending.

Step 4 — Play ​

Press Play. While the composition plays, Exaplay reads the curve at the playhead and sends an Art-Net OpDmx packet up to Rate times a second — continuously, whether the value changed or not. On pause or stop the packets stop, and the fixture keeps the last value it received (or does whatever its own signal-loss setting says). Nothing is sent while the composition is stopped, even if you move the playhead.

On a multiclient rig only the master (or a standalone machine) sends Art-Net; the clients play the same track but send nothing, so a node receives each packet once — see When a Data Track sends.

Art-Net Packet Format ​

Exaplay sends standard Art-Net 4 OpDmx packets:

Bytes  0–7   "Art-Net\0"  (8 bytes, ASCII + null)
Bytes  8–9   OpCode 0x5000  (OpDmx, little-endian)
Bytes 10–11  Protocol version 14  (big-endian)
Byte   12    Sequence  (always 0 — sequencing off)
Byte   13    Physical port  (0)
Bytes 14–15  Universe (little-endian)
Bytes 16–17  DMX data length (big-endian, even, 2–512)
Bytes 18+    DMX data

The data runs from channel 1 up to the highest channel anything has written on that universe (rounded up to an even count), not always to 512.

Multi-Universe and Multi-Channel ​

You can have multiple Data Tracks, each targeting a different universe/channel combination. All tracks run simultaneously:

Data Track "Dimmer 1"    → Universe 0, Channel 1
Data Track "Red"         → Universe 0, Channel 2
Data Track "Green"       → Universe 0, Channel 3
Data Track "Blue"        → Universe 0, Channel 4
Data Track "Moving Head" → Universe 1, Channel 1

Tracks that send to the same address, port and universe share one DMX frame: each packet carries every channel's latest value, so Red on channel 2 does not zero Dimmer 1 on channel 1. Cue ARTNET> lines to the same destination write into the same frame. A channel keeps its last value in that frame until something writes it again — also across stop and play. Every track still sends its own packet, so four tracks on one universe at 120 Hz are 480 packets a second; lower Rate on large patches.

Broadcast vs Unicast ​

ModeDestination IPUse when
Broadcast255.255.255.255 (or a subnet broadcast such as 2.255.255.255)Quick setup; all Art-Net devices on the subnet receive the packet
UnicastSpecific IP (e.g. 192.168.1.50)Reduces network load; targets one specific device

For shows with many DMX universes, use unicast to avoid flooding the network.

Value Clamping ​

Values outside the track's Min–Max range are clamped before scaling:

  • A value below Min is treated as Min (DMX 0)
  • A value above Max is treated as Max (DMX 255)

The byte is rounded down, so DMX 255 needs the curve to reach Max exactly.

Combining with OSC and UDP ​

A single Data Track outputs to one protocol. To drive both a lighting console via Art-Net and a media server via OSC with the same keyframe animation:

  1. Right-click the ArtNet track and choose Duplicate Data Track.
  2. Set the copy's Format to OSC (and its Address, Port and OSC Path).
  3. Both transmit in sync during playback. OSC sends the curve value as drawn, not the DMX byte.

Troubleshooting ​

ProblemSolution
Fixture does not respondCheck Port is 6454 (a port typed before switching to ArtNet is kept); verify universe and channel match the fixture's DMX address
Intermittent controlSwitch from broadcast to unicast; reduce network congestion; lower Rate
Values too high/lowCheck Min/Max track range vs expected DMX scaling; read Live value
No packets transmittedConfirm the Data Track is visible, has keyframes and is on a playing composition; read Status (an unknown $variable sends nothing; on a multiclient client the master sends); verify the destination IP is reachable
What is being sent?The Monitor shows one ArtNet OUT row when a track starts sending to a destination, one when it stops, and a stop plus a start when its address, port, universe or channel changes — not a row per packet. The value itself is in the track's Live value row; for the packets, use a network sniffer or the node's own input indicator

Fixture profiles and library ​

Patch a fixture ​

  1. Add or select a Data Track in the Timeline and set Output → Format to ArtNet.
  2. Select Fixture library…, next to the ArtNet universe/channel controls.
  3. Choose a profile and mode, an Art-Net universe (0–32767), a one-based starting DMX address (1–512), and the Destination IP (default 255.255.255.255, broadcast).
  4. Review the footprint and parameter-to-channel preview. Exaplay rejects patches that cross channel 512 and warns when an existing ArtNet Data Track already uses a channel in the footprint.
  5. Select Patch fixture. The new tracks are added at the bottom of the Timeline, one per parameter, named after it, each sending to port 6454 at 44 Hz with one keyframe at 0 s holding the parameter's default. A message reports how many tracks were created and how many reused.

Name binding is off by default. Tick Named tracks — Reuse existing ArtNet tracks whose names match this profile to reuse Data Tracks you already authored: a track whose name matches a profile parameter (case-insensitively) is re-pointed at that parameter's channel instead of a new track being created. The modal lists every track that will be rewritten before you confirm, so you can see what binding is about to touch.

Binding only ever considers tracks that are already ArtNet output, or that have no output format set at all. A track sending OSC, TCP, UDP, or driving an Exaplay value is never converted, even when its name matches — a Dimmer on another protocol is a different thing that happens to share a name. Tracks outside the match set are neither deleted nor modified.

An overlap warning is intentionally not an automatic overwrite: it lets operators decide whether two tracks should share a channel.

Every generated track receives the profile parameter's physical range and default keyframe. Art-Net scales that range to one DMX byte. Fine channels in a 16-bit parameter are represented by a separate named Data Track and retain their coarse/fine relationship as profile metadata; operators can animate the fine track independently.

If a patch fails part way through — an engine round-trip is refused, say — the tracks created before the failure remain and the error names the parameter that stopped it. Re-running the patch with binding enabled picks up where it left off rather than duplicating what already exists.

Native profile format ​

Native profiles are small JSON objects (or arrays of objects), in the shape of the example below. Offsets are zero-based relative to the fixture's one-based starting address, and must be real JSON numbers — a quoted "offset": "3" is rejected rather than silently patched to the wrong channel.

json
{
  "id": "my-device-2ch",
  "manufacturer": "My organisation",
  "model": "Custom device",
  "mode": "2 channel",
  "channelCount": 2,
  "parameters": [
    {
      "name": "Dimmer",
      "offset": 0,
      "range": { "min": 0, "max": 100 },
      "default": 0,
      "unit": "%"
    },
    {
      "name": "Dimmer Fine",
      "offset": 1,
      "range": { "min": 0, "max": 255 },
      "default": 0,
      "unit": "DMX",
      "resolution": "fine",
      "coarseParameter": "Dimmer"
    }
  ]
}

Use Import native JSON / GDTF XML… in the fixture dialog. Validation requires manufacturer, model, mode, channel count, unique parameter names, numeric offsets within the footprint, numeric ranges/defaults, units, and valid coarse/fine references. Keep the native format for custom hardware and for semantics that cannot be mapped reliably from GDTF.

GDTF import ​

GDTF packages are ZIP archives. The browser build deliberately adds no general ZIP dependency: extract Description.xml from a trusted .gdtf file and import that XML. The practical importer creates a profile for each straightforward DMXMode, maps DMXChannel Offset values, and creates separate fine tracks for multi-byte offsets. Where two channels in one mode carry the same GDTF attribute, the imported parameter names are disambiguated by their DMX offset rather than the mode being discarded.

A mode that still cannot be represented is reported by name with the reason it was rejected, so an import that yields nothing tells you why instead of failing silently.

GDTF can express channel functions, geometry, switching channels, relations, and physical conversions that do not reduce safely to a single Data Track. Review imported names, defaults, and channel preview before patching; use a native profile when the mapping is incomplete. Media and geometry in a GDTF archive are not imported.

Included profiles and licensing ​

The bundled entries are clearly labelled Generic test profile: a one-channel dimmer, a five-channel RGB/dimmer/strobe device, and a seven-channel 16-bit moving-head example. They are synthetic test layouts, not manufacturer definitions. Four Generic DMX-to-DALI gateway layouts (broadcast, 16 groups, 64 short addresses, scene recall) drive DALI lighting through a gateway; see DALI Lighting. Exaplay does not redistribute third-party fixture definitions unless their licensing has been confirmed; import a properly licensed GDTF or author a native JSON profile for production fixtures.

Addressing notes ​

  • Art-Net universes are numbered 0–32767; DMX channels are numbered 1–512 in the UI.
  • A fixture must fit completely in one universe. Split it into explicit profiles if custom hardware spans universes.
  • Multiple Data Tracks may intentionally drive the same channel. Exaplay reports the overlap but does not silently delete the older track.
  • Generated tracks default to 44 Hz and port 6454. Raw tracks retain their previously authored rate, address, universe, and channel.

Art-Net DMX input — console drives Exaplay ​

Everything above is output: Exaplay driving lighting fixtures. The reverse direction is available too: patch Exaplay on the lighting console as a DMX fixture, and its faders and buttons play, stop, cue and seek the show.

See it done

Open ☰ menu → Walkthroughs → Inputs & show control → A lighting desk drives the show — Art-Net.

Enable the input ​

  1. Open Menu → Settings → Communication.
  2. Switch on the protocol the console speaks — both may be on at once:
    • Art-Net Input with Art-Net Port (6454 by default — the standard port; change it only when another Art-Net node runs on the same machine).
    • sACN (E1.31) Input with sACN Port (5568). Exaplay joins the multicast group of every universe your sACN mappings name (239.255.<hi>.<lo>), so a desk transmitting multicast is heard without any address setup; unicast to this machine works too. On a machine with several network adapters the multicast join lands on the default one — use unicast there.
  3. Save. The listener starts immediately, no engine restart is needed.
  4. The mappings are in Control → Inputs → Lighting desk (DMX) → Edit mappings… (the Receiver settings… button there leads back to this tab). The status line above the mapping table reports what each protocol sees: Art-Net: listening on UDP 6454, no DMX yet · sACN: listening on UDP 5568, 2 multicast groups joined, no DMX yet → Art-Net: receiving DMX from 10.0.0.20 U0 (Art-Net) · 1 source.

The switches and ports are per machine (config.comm). The mappings below are part of the show (.vpp): they name compositions, which are the same on every machine of a multiclient rig.

Multiclient

Patch the console to the master. A client-role machine listens but never acts on DMX — the master's playback stream already drives it — and the panel says so.

Map channels to actions ​

Each row of the DMX input mappings table (Control → Inputs → Lighting desk (DMX) → Edit mappings…) reads one DMX channel and runs one action. The columns:

ColumnFields
OnSwitches the row on or off without deleting it.
Name / Source / Universe / ChannelA Name for the row; the protocol (Art-Net or sACN (E1.31) — rows saved before sACN existed are Art-Net); the sender IP to accept (empty = Any source); the protocol's own universe numbering — Art-Net Port-Address 0–32767 (zero-based, exactly as the console patches it), sACN universe 1–63999 — and DMX channel 1–512. An optional fine channel makes a 16-bit control (coarse, then fine). Learn fills these from the console (below).
Mode / edge / thresholdmomentary — fires once per press when the value crosses the threshold on the chosen edge (Rising or Falling). toggle — every press flips between the output minimum and maximum. range / continuous — the scaled value is sent whenever it moves. The threshold is 0–1 of the channel's range; a momentary button must send 0 released / 255 pressed.
Scale / lossInput range → output range, with Invert; 0–1 → 0–1 passes the fader through. For continuous, what happens when the console stops transmitting: Loss: hold last or Loss: restore default (the output minimum).
Action / targetWhat to run, and on which composition (a property path for Numeric property). The Live: readout shows the value the engine is currently reading for this row, ● while it is above the threshold.

Actions:

ActionSendsNotes
Play / Pause / Stop / Next / Previousthe transport verbone press = one command
Cue Gocue.go=<selected>fires the cue last chosen with Cue select on the same composition — a desk's "select, then GO". Before any Cue select it does nothing (the log says so)
Cue selectcue.go=<value>the scaled value is the cue number — with the fixture's 1–256 range, DMX 0 is cue 1. Fires that cue and remembers it for Cue Go
Show Moderig-wide show mode on/offneeds no composition
Seekset:time=<value × duration>the value is a fraction of the composition's duration (0–1); a composition without a known duration is not seeked
Numeric propertyset:<path>=<value>any numeric property, e.g. audio.volume with an output range of 0–100

Learn on a row arms the engine: move exactly one control on the console and the row takes that source, universe and channel. Small jitter (below 8 DMX steps) is ignored, so a wobbling fader does not get learned by accident.

Patch it as one fixture ​

Patch Exaplay Control fixture… adds the whole 12-channel Exaplay Control layout on the protocol, universe and start address of your choice, all rows on the chosen composition:

ChannelFunctionMode
1Playmomentary
2Pausemomentary
3Stopmomentary
4Nextmomentary
5Previousmomentary
6Cue Gomomentary
7Cue Selectionrange, 0–255 → cue 1–256
8Show Modetoggle
9 + 10Timeline Seek (16-bit)continuous, hold on loss
11 + 12Property 1 (16-bit)continuous — set the property path on the row

Patch the same 12-channel fixture on the console at the same address (a generic 12-channel "dimmer" personality is enough: momentary channels must send 0 released / 255 pressed). The twelve channels are ten controls: Seek and Property 1 each use a coarse + fine pair.

Behaviour worth knowing ​

  • A button is only ever fired by a change the console sends. When a console appears, disappears or restarts, the first frame it sends establishes the baseline and fires nothing — a fixture that comes up with a channel at 255 does not press Play.
  • Moving faders never flood the engine: a continuous / range row sends only when its scaled value moved, at most 20 times a second, and the last position always lands.
  • Every packet is a Monitor event (ArtNet DMX in, folded to ten lines a second); a new or lost source is logged there too.
  • DMX is ignored while a project is loading — the stream re-delivers state within a few frames once the show is up.
  • sACN priority (E1.31 §6.2.3): when two sources send the same universe, the higher priority wins; a lower-priority source is tracked and takes over the moment the higher one stops or sends stream terminated. Preview-data packets are never acted on; only start code 0 (dimmer data) is read.

Troubleshooting ​

ProblemCheck
Status stays no DMX yetConsole → Exaplay on the same subnet, Art-Net broadcast or unicast to this machine's IP, universe patched as a zero-based Port-Address, Windows Firewall allowing inbound UDP 6454 (Art-Net) / 5568 (sACN).
sACN: 0 multicast groups joinedNo enabled row has protocol sACN yet — the groups follow the mappings. With rows present but still no data, the desk may be sending on a different adapter than Windows' default: switch it to unicast to this machine.
port … could not be openedAnother Art-Net application (a visualiser, an output node) owns the port on this machine — close it or move Exaplay's port. sACN shares its port with other E1.31 receivers, so that one only fails when a receiver holds it exclusively.
Live shows a value but nothing happensThe row has no composition, or the mode is momentary and the button never crosses the threshold (check the Live ● dot).
Play works, Cue select fires the wrong cueCue numbers start at 1: use an output range of 1–256, as the fixture does.
The panel says this machine is a CLIENTPatch the master.

Art-Net timecode ​

OpTimeCode is playback synchronization, not DMX fixture control: set Settings → Timecode → Timecode Mode to Receive Art-Net timecode and compositions in timecode mode follow the desk's TC — see Timecode Sync. In every other mode incoming Art-Net timecode is shown as status only.

Exaplay 3 User Documentation