Recording Live Sessions¶
TiXL can record a live performance — audio plus the MIDI and OSC events that drove the visuals — and replay it later. This is useful for two things:
- Tweaking after the fact. Adjust audio-reactive thresholds, MIDI mappings, and animations against the exact session you played, without needing the original controller plugged in.
- Preparing the next show. Run the captured performance back through the graph as you iterate on visuals, so you're designing against real input instead of dummy values.
A single click on the toolbar's record button captures both audio and IO data together. On stop, two clips appear on the timeline: a TimelineAudioClip with the recorded .wav and a LoadDataClip op with the recorded .data. Both files land in the active project's Assets/ folder and show up in the AssetLib.
Quick start¶
- Set the composition's Syncing mode to Timeline (Project Settings → Playback). Recording is disabled in Tapping mode because clips need a coherent playhead position.
- Click the record button on the right end of the timeline toolbar.
- Perform — play notes, twist knobs, send OSC, talk into the mic, whatever you'd do in a live set.
- Click record again to stop.
Two clips appear on the timeline at the bar you started recording. Hit play to replay the session.
What gets captured¶
| Source | File | Notes |
|---|---|---|
| Audio | .wav (16-bit PCM, native sample rate) |
The configured WASAPI input device, or the system default if none is set. Recording works in any AudioSource mode — switching to ProjectSoundtrack doesn't disable mic capture. |
| MIDI | .data (JSON) |
Every MIDI device currently registered with TiXL. Notes, CCs, pitch bend, channel pressure. |
| OSC | .data (same file) |
The port configured in CoreSettings.DefaultOscPort. |
| Variations / Snapshot recalls | — | Not captured. Recalls depend on the active composition's state, which changes over a live session; replaying them in a different context wouldn't reproduce the same result. |
File layout¶
The session index (007) is shared between audio and data within one recording so they pair up. A backup copy of each file also lands in %APPDATA%\TiXL<version>\Recordings\ — useful if a project file gets damaged.
Replaying¶
The LoadDataClip op exposes the recorded data as a DataClip value on the graph. To drive MidiInput / OscInput ops from the recording, chain it through a SimulateIoData op:
SimulateIoData dispatches recorded events through a parallel bus the input ops subscribe to. Replay works regardless of whether the original device is currently connected — MidiInput ops match by device name string, not by hardware presence.
Multiple LoadDataClips can feed one SimulateIoData via its multi-input. Each clip tracks its own source-time cursor; events from overlapping clips fire simultaneously.
The audio side just plays — drop the TimelineAudioClip on the timeline and the audio engine renders it like any other clip.
Tweak / re-record loop¶
The typical workflow:
- Record a session.
- Hit play, watch the visuals, see what doesn't react the way you wanted.
- Adjust an
[AudioReaction]threshold, aMidiInputRange, a parameter curve. - Loop back to play and re-evaluate against the same captured session.
- When the visuals are tuned, the next live show should behave the same way against fresh live input.
The recording's LoadDataClip is a normal [TimeClip] — you can move it on the timeline, trim its start/end via the source-range handles, or even drop the same .data file twice for repeated playback.
Editing recorded data¶
The on-disk .data format is JSON, designed to be human-readable and tool-friendly:
{
"Version": 1,
"Metadata": {
"TixlVersion": "4.5",
"RecordedAtUtc": "2026-05-28T16:42:11.0123456Z"
},
"Channels": [
{
"Path": ["Midi", "APC mini mk2", "Ch1", "CC49"],
"Type": "float",
"DurationType": "Tick",
"Events": [
{ "Time": 0.301, "Value": 70.0 },
...
]
}
]
}
You can edit the file in a text editor to trim or modify events. After saving, the LoadDataClip op picks up the change automatically (file-watch).
Limitations¶
- Variation / snapshot replay isn't supported — the active composition's state changes too much across sessions for a reliable round-trip.
- Hung notes on scrubbing. During edit-time scrub backward over an active note, the note's
NoteOffisn't fired. Move the playhead past the note end to release. - Multi-arg OSC messages are recorded as separate channels per arg index. Replay sends them as single-arg messages.