Skip to content

External Show Control — IN/OUT Commands

This guide explains how to connect Exaplay 3 to an external show control system (ETC Eos lighting console, Medialon, QLab, Crestron, Q-SYS, CueLab, Alcorn McBride, a custom PLC, or any other device that can send network commands). It covers every supported protocol, with tested command examples and a troubleshooting checklist for each direction.

Show Control


Part 1 — Commands INTO Exaplay (Incoming)

1A — HTTP Control (most flexible)

Any device that can send an HTTP POST request can control Exaplay.

Fire a cue by name:

bash
curl -X POST http://192.168.1.5:8123/cue/trigger \
  -H "Content-Type: application/json" \
  -d '{"name": "Scene 1 - Opening"}'

Scoping to one composition: without a scope, /cue/trigger fires the first matching cue across all compositions in project order. If several Timelines share a cue name (e.g. every act has a "Blackout" cue), add "comp": "comp_act2" (or comp-uid) to disambiguate.

The same "trigger cue X in composition Y" action looks different on each protocol — the cue argument always accepts either the index or the cue name:

Protocol"cue 5 in comp_act2""cue Blackout in comp_act2"
TCP / UDP dotted (primary)comp_act2.cue.go=5comp_act2.cue.go=Blackout
TCP / UDP classicset:cue,comp_act2,5set:cue,comp_act2,Blackout
HTTPPOST /project · {"req":"cue.go","comp-uid":<uid>,"cue":5}{"req":"cue.go","comp-uid":<uid>,"name":"Blackout"}
OSC/exaplay/comp_act2/cue 5/exaplay/comp_act2/cue "Blackout"

Play a composition by name (shortcut — no UID lookup required):

bash
curl -X POST http://192.168.1.5:8123/composition/play \
  -H "Content-Type: application/json" \
  -d '{"name":"Main Show"}'

Transport control (play/pause/stop/seek by UID), Playlist navigation, and setting any property value (e.g. layer opacity) all go through POST /project with the matching req. Full endpoint list, request/response bodies, and error responses: HTTP REST API.

Stop all playback:

bash
curl -X POST http://192.168.1.5:8123/stop

Tip: To find the correct path for any property, open it in the Inspector, click the 🔗 link icon, and read the path in the panel options.


1B — OSC (Open Sound Control)

OSC is supported by virtually every professional show control system.

Exaplay OSC listen port: 8000 (default — configurable in Config → Network → OSC)

The address pattern is /<prefix>/<composition-id>/<command> — the prefix defaults to exaplay and <composition-id> is the composition's variable name (e.g. comp_main).

OSC AddressArgumentsAction
/exaplay/<comp>/play(none)Start the named composition
/exaplay/<comp>/start(none)Start the named composition (alias for play)
/exaplay/<comp>/pause(none)Pause the named composition
/exaplay/<comp>/stop(none)Stop the named composition
/exaplay/<comp>/cuetimef or i (seconds)Seek to position (client instances only)
/exaplay/<comp>/cuei (index) or s (name)Fire a cue by index or name in a Timeline or Playlist
/exaplay/global/start(none)Start all compositions (play all)
/exaplay/global/stop(none)Stop all compositions (stop all)
/exaplay/global/showmodes (on/off/toggle) or i/f (1/0)Set global Show Mode
/exaplay/global/restart(none) or s (project/clean)Restart exaplay (reload current project, or clean for empty)
/timecode (configurable)f, i, or s (HH:MM:SS:FF)Drive timecode-slaved compositions

Note: OSC dispatching is keyed by composition variable name — to fire a cue by name (across all compositions), use the HTTP endpoint POST /cue/trigger instead.

What a complete OSC command looks like — every message is one UDP packet to <engine-ip>:8000 containing the OSC address and (optionally) one argument. With the default prefix exaplay and a composition whose variable name is comp_main:

/exaplay/comp_main/play              # start comp_main (no argument)
/exaplay/comp_main/start             # start comp_main (alias for play)
/exaplay/comp_main/pause             # pause comp_main
/exaplay/comp_main/stop              # stop comp_main
/exaplay/comp_main/cue 5             # trigger cue index 5 in comp_main (int argument)
/exaplay/comp_main/cue "Blackout"    # trigger the cue named Blackout in comp_main
/exaplay/comp_lobby/cue 2            # play Playlist item 2 (1-based position)
/exaplay/comp_lobby/cue "Act 1"      # play the Playlist item named "Act 1"
/exaplay/comp_main/cuetime 12.5      # seek comp_main to 12.5 s (client instances only)
/exaplay/global/start                # global command: start ALL compositions
/exaplay/global/stop                 # global command: stop ALL compositions
/exaplay/global/showmode "on"        # global command: Show Mode on
/exaplay/global/restart "clean"      # global command: restart with empty project

To control a different composition, only the second address segment changes — e.g. /exaplay/comp_lobby/play starts comp_lobby. Get the variable names from the TCP/UDP command get:complist or from the composition's Inspector.

Index semantics for /cue: on a Timeline the argument is the cue's variable index; on a Playlist it is the 1-based list position — both identical to TCP/UDP set:cue and HTTP cue.go. A string argument is matched against the cue/item name within that composition. (Backward compatibility: Playlist /cue historically matched the item's internal variable index; when a numeric argument doesn't resolve to a position, the engine falls back to that legacy match, so old integrations keep working.)

Example — ETC Eos console firing cue 3 in comp_main:

In the Eos Macro editor, add a Network command:

/exaplay/comp_main/cue 3
  UDP to 192.168.1.5:8000

Example — Qlab sending OSC:

  1. In Qlab, add a Network cue.
  2. Set Type to OSC message.
  3. Set destination to 192.168.1.5:8000.
  4. Set message: /exaplay/comp_main/play.

Example — Show Mode ON/OFF via OSC:

/exaplay/global/showmode "on"
/exaplay/global/showmode "off"
/exaplay/global/showmode "toggle"

Example — Restart exaplay via OSC:

/exaplay/global/restart              # restart and reload the current project
/exaplay/global/restart "project"    # same as above (explicit)
/exaplay/global/restart "clean"      # restart with no project loaded

1C — ArtNet Timecode (not supported)

Not supported. ArtNet timecode receive is not supported, so a lighting console cannot drive Exaplay over ArtNet TC. Use OSC, LTC, or MTC for frame-accurate sync instead (see Timecode Sync). ArtNet remains available for DMX output from Data Tracks.


1D — LTC (Linear Timecode via Audio)

  1. Connect the LTC output from your console to an audio input on the Exaplay ASIO interface.
  2. Open Config → Audio Settings → Timecode Input.
  3. Select the channel, set the frame rate to match the console.
  4. The Transport bar shows TC: Locked when the signal is detected.

1E — TCP Text Protocol

Exaplay accepts persistent TCP connections carrying simple comma-delimited or dotted-path commands. This is ideal for Medialon, Alcorn McBride, Crestron/AMX, and any custom PLC that works natively with raw TCP sockets.

Default port: 8100 (configure in Config → Network → TCP Listen)

→ get:complist
← comp_main,Main Show
← END

→ play,comp_main
← OK

→ set:cue,comp_main,5
← OK

Every command is a single ASCII line terminated by \r or \r\n, answered with one response line (OK, a value, or ERR,<reason>). Full command reference — dotted vs. comma syntax, transport, cue triggering, Playlist navigation, volume/alpha/loop, status queries, global commands, and error codes: TCP Command API.

If UDP control listen is enabled (default port 8200), the same text commands work as fire-and-forget UDP datagrams. See the UDP Command API for details.


Part 2 — Commands OUT of Exaplay (Outgoing)

2A — OSC Output

Exaplay can transmit its current playback position and custom events to any OSC listener.

Configure OSC output:

  1. Open Config → Network → OSC Output.
  2. Enter the destination IP and port (e.g. 192.168.1.20:9000).
  3. Choose the Timecode OSC Address pattern.

Exaplay sends /timecode/hh/mm/ss/ff to the configured destination on every frame during playback.

Custom OSC via Data Tracks:

Any Data Track can output to an OSC address. This lets you send a value (float) to any OSC address at any moment in the timeline:

Data Track "LightingMaster"
  Output Type: OSC
  OSC Address: /eos/fader/1/value
  Destination: 192.168.1.20:8000

  Keyframes: fade from 0 to 1.0 over 5 seconds

2B — ArtNet DMX Output

Exaplay can drive lighting fixtures, dimmers, and LED controllers directly over Art-Net, independent of any lighting console. This is useful for installations where Exaplay is the only show control system.

See ArtNet & DMX Output for the full guide.


2C — UDP Output

Any Data Track can output raw UDP datagrams to any device that accepts them:

Data Track "MotionRig"
  Output Type: UDP
  Destination: 192.168.1.30:9500

The current interpolated value is sent as a 4-byte big-endian float on every frame.


Part 3 — Verifying Communication with the Monitor

The Monitor tab is the single most important tool for diagnosing show control integration issues.

How to Use the Monitor Tab

  1. Open the Control View (/control).
  2. Click the 📡 Monitor tab.
  3. Trigger a command from the external system.
  4. Check the Event Log for an entry.

What Good Looks Like

ProtocolEvent Log entry
HTTP triggerPOST /cue/trigger — 200 OK from 192.168.1.20
OSC receivedOSC /exaplay/comp_main/play from 192.168.1.20:8000
ArtNet DMX sentArtNet OpDmx → Universe 0 → 192.168.1.50
OSC sent (outgoing)OSC /eos/fader/1/value 0.75 → 192.168.1.20:8000

If an expected entry is missing, the packet never reached Exaplay — see Part 4.


Part 4 — Troubleshooting

No incoming commands received

CheckWhat to do
IP addressOpen Monitor tab → Host Information card → confirm the correct IP address
PortConfirm the sending device is targeting the correct port (REST: 8123, OSC: 8000, TCP: 8100)
FirewallAllow inbound UDP 8000 and TCP 8123, 8100 in Windows Defender Firewall
SubnetBoth devices must be on the same subnet (e.g. 192.168.1.x / 255.255.255.0)
OSC addressOSC addresses are case-sensitive — /exaplay/comp_main/play/Exaplay/comp_main/play

Windows Firewall — allow Exaplay ports:

batch
netsh advfirewall firewall add rule name="Exaplay HTTP" dir=in action=allow protocol=TCP localport=8123
netsh advfirewall firewall add rule name="Exaplay TCP Control" dir=in action=allow protocol=TCP localport=8100
netsh advfirewall firewall add rule name="Exaplay OSC" dir=in action=allow protocol=UDP localport=8000
netsh advfirewall firewall add rule name="Exaplay ArtNet" dir=in action=allow protocol=UDP localport=6454

ArtNet timecode not locking

ArtNet timecode receive is not supported — it cannot lock regardless of network setup. Use OSC, LTC, or MTC for external timecode sync (see Timecode Sync).


OSC going out but console not receiving

CheckWhat to do
Destination IPConfirm the console's IP in Config → Network → OSC Output
Destination portConfirm the console's OSC receive port matches the configured destination port
Console OSC enabledMany consoles require OSC receive to be explicitly enabled
Firewall on the console machineEnsure the console's firewall allows incoming UDP on the OSC port
Monitor Event LogOutgoing OSC messages should appear in the log — confirm they are being sent

HTTP control returns 404 or connection refused

CheckWhat to do
Engine runningThe engine (not just the UI) must be running — check the tray icon
PortHTTP control uses port 8123 — ensure no other app is using this port
Endpoint pathCheck the exact endpoint path (case-sensitive); verify the property path in the Inspector if needed
JSON formatRequest body must be valid JSON; Content-Type: application/json header is required

Part 5 — Quick Reference

Incoming commands summary

ProtocolPortEnable in
REST HTTP8123 (TCP)Always on
OSC8000 (UDP)Config → Network → OSC
LTCASIO audio inputConfig → Audio → Timecode Input
TCP Text Protocol8100 (TCP)Config → Network → TCP Listen
WebSocket events8123 (WS)Always on (same port as HTTP)

Outgoing commands summary

ProtocolPortEnable in
OSC outputConfigurable UDPConfig → Network → OSC Output
ArtNet DMX6454 (UDP)Data Track → Output Type: ArtNet
UDP rawConfigurableData Track → Output Type: UDP
WebSocket (effects)3001 (WS)Effects Server (auto-started)

Part 6 — Integration Examples by System

ETC Eos / Ion

  1. Enable OSC Rx on Exaplay (port 8000).
  2. In Eos, create a Macro with a Network cue: OSC /exaplay/comp_main/cue 1 → target 192.168.1.5:8000. To trigger a cue by name (any composition), use a Network cue of type String sending an HTTP POST to http://192.168.1.5:8123/cue/trigger with body {"name":"My Cue"} instead.
  3. For bidirectional: configure Eos OSC Tx to send timecode, and Exaplay OSC Rx to receive it.

Qlab (Mac)

  1. Add a Network cue in Qlab.
  2. Select OSC or HTTP based on preference.
  3. For OSC: target 192.168.1.5:8000, address /exaplay/comp_main/play (or /exaplay/comp_main/cue with an integer argument to fire a specific cue).
  4. For HTTP (fires a cue by name across all compositions): target http://192.168.1.5:8123/cue/trigger, method POST, body {"name":"My Cue"}.

Medialon / Alcorn McBride, Crestron / AMX, Q-SYS (QSC), CueLab

All four connect over the same TCP Text Protocol (some also support REST HTTP or OSC as an alternative) described in 1E above — a persistent socket to port 8100 sending ASCII commands like play,comp_main\r. Ready-to-use client code (SIMPL+/SIMPL# for Crestron/AMX, Lua for Q-SYS, TCP Device config for Medialon/Alcorn, OSC/REST setup for CueLab) and the full command table live in one place: TCP Command API → Connecting from Common Show Control Systems.

CueLab can additionally receive Exaplay's timecode back over OSC, for bidirectional sync:

  1. In Exaplay, open Config → Network → OSC Output.
  2. Set destination to <CueLab machine IP>:<CueLab OSC Rx port> (check CueLab Settings → Network → OSC Input).
  3. Exaplay will send /timecode/hh/mm/ss/ff on every frame — CueLab can use this to auto-follow Exaplay's timeline.

Summary Checklist

  • [ ] Engine IP address confirmed (Monitor tab → Host Information)
  • [ ] Firewall rules added for ports 8123 (TCP), 8100 (TCP) and 8000 (UDP)
  • [ ] OSC Rx enabled on the correct port
  • [ ] OSC Tx configured with the correct destination IP/port
  • [ ] ArtNet sync: Exaplay and console are on the same subnet for ArtNet broadcast (if using ArtNet sync)
  • [ ] LTC audio channel and frame rate configured (if using LTC)
  • [ ] HTTP control tested from the external system
  • [ ] Monitor → Event Log shows incoming commands from the external system
  • [ ] Monitor → Event Log shows outgoing commands to the external system
  • [ ] Full show run-through with all external triggers verified

Exaplay 3 User Documentation