TouchDesigner
AllWhat it's for — TouchDesigner is a node graph, not a console. It has no cue list to GO and no blackout to fire, so CueSync does not pretend otherwise: it sends your addresses to your operators, and the patch decides what they mean. What CueSync adds is timing — beat-locked ramps, cue-accurate triggers, and a live musical feed your network can react to on its own.
There are two connections and they do different jobs. Most rigs want both.
| The output | The CueSync Bus | |
|---|---|---|
| Carries | your cue actions, timecode, the panic | beat, tempo, energy, key, drop countdown, three-band audio |
| Port | 9000 (default) | 9002 (default) |
| Addresses | whatever you type | /cuesync/bus/<Leaf> |
| Set up | Settings → Network Outputs → Add output | Settings → MIDI → CueSync Bus |
| Direction | cue fires when you say | streams continuously while a track plays |
⚠️ Beat and tempo do not come over the output. They ride the Bus, on its own port. If you are
waiting for a /td/beat you will wait forever — see CueSync Bus
for the full vocabulary.
Receiving in TouchDesigner
Add an OSC In CHOP, set its port, and bind channels with a Select CHOP. Add an OSC In DAT on the same port too — TouchDesigner is happy to have both, and the DAT is where you look when something does not arrive, because it records the address and the exact arguments.
Three things about a CHOP that catch people out. All three were measured against TouchDesigner 2025.33230, not assumed:
- A CHOP carries numbers only. Send
/td/label "intro"and it appears in the DAT and not in the CHOP. That is correct, not a fault — text is a DAT's business. CueSync types every value you write: a value that parses as a number goes on the wire as one, anything else goes as text. - The address becomes the channel name, minus the leading slash.
/td/levelbinds astd/level. - Several values on one address become numbered channels.
/td/colour 1 0.5 0.2arrives astd/colour1,td/colour2,td/colour3. That is how you drive a colour, a UV offset or an XY position from a single cue — type the values space-separated in the action's Value(s) field.
What a cue can do
| Action | What it sends |
|---|---|
| TouchDesigner | one value, several values, or a pulse, on an address you type |
| Fade with the TouchDesigner parameter target | ramps one address from a start to an end value over beats or milliseconds, on a curve |
The Fade is the one worth knowing about. A TouchDesigner action sets a value and stops — the change is instant. A Fade ramps it, and if you give the duration in beats the ramp is tempo-locked, so a four-beat wash opens with the phrase whatever the track is doing. Pick Fade in the Cue Editor, choose the TouchDesigner parameter target, and type the address.
The same target is available to a Follower, which drives a parameter from a musical signal continuously instead of from a cue.
Timecode
Route a timecode output to TouchDesigner and CueSync sends the position as one atomic bundle:
/td/timecode/hours /td/timecode/minutes /td/timecode/seconds
/td/timecode/frames /td/timecode/framerate /td/timecode/running
All six land together, so a patch never reads a half-updated position.
The panic — wire this before you need it
⚠️ CueSync cannot black out a TouchDesigner patch, and no software can. There is no blackout command in TouchDesigner for it to send. What it sends instead, on any emergency stop or Blackout pad, is:
/cuesync/panic 1
Nothing happens unless you wire it. Until you do, a panic reports success and your visuals keep running — so CueSync raises a "Blackout sent but unconfirmable" warning naming the output, every time, rather than letting a green panic speak for a stage that is still lit.
Two nodes fix it. Bind the panic and gate your output master with it:
OSC In CHOP ──▶ Select CHOP ──▶ Math CHOP ──▶ your output master
cuesync/panic gain −1
→ panic post-add 1
The Math CHOP computes 1 − panic, so the master sits at 1 normally and drops to 0 the
moment a panic arrives. Sending /cuesync/panic 0 — or releasing the blackout in CueSync — brings
it back. Hang your real master off that channel and the emergency stop means something.
A working version of exactly this patch, buildable from a script with no clicking, lives in
tools/touchdesigner-verify/ in the CueSync repository.
Checking it works
The DAT is the first place to look: if the address is not in it, the packet never arrived, and the problem is the network or the port — not the patch. If the address is in the DAT but not the CHOP, you sent text where the CHOP wanted a number.
CueSync's own side reports every send, so an output that has gone away turns amber in Diagnostics rather than failing silently.
Related
- CueSync Bus — the musical feed, its ten values and their ranges
- Network Outputs — adding, routing and health
- Protocol Reference — every protocol, transport and port
- Action Reference — every field, per action
Looking for a quick fix?
The Help Center has short task-focused articles and a support team that responds within 24 hours.