A good X32 scene — the EQs, the gates, each player’s in-ear mix, the routing out to the stage boxes — takes hours at the desk, and moving any of it into the next band’s scene means touching one control at a time. The files themselves are plain text, 2118 lines for one console, and nothing on the desk or in X32-Edit tells you what differs between two of them.
What it does
Carry one player's in-ear mix into another scene
transplant OLD.scn NEW.scn --bus 9 -o OUT.scn copies the bus strip and every send feeding it, both sides of a stereo pair, and lists each path it wrote — 48 of them in the example scene. Nothing else in the destination moves. snippet --bus 9 writes that same mix as a .snp the desk recalls in place mid-changeover, leaving every other aux alone.
See what changed between two scenes, in words
Two scenes for the same console, and neither the desk nor X32-Edit will tell you what differs. diff A B --by-strip prints one block per strip — ch 01 "Kick", and under it send -> bus 09 level -0.3 -> -9.8 — showing only the fields that moved. The raw path-by-path diff of those same two files runs 1381 lines. live-diff SCENE does the same against the desk that is actually powered up, and history PATH --dir LIB follows one parameter across a library of saved scenes.
Move channels to a second stage box with their gain
Analog gain and phantom live at /headamp/NNN, indexed by physical input rather than by channel, so re-patching a channel to an AES50 input leaves its gain behind on the old jack — the CLI’s set-input does exactly that. move_inputs_to_stagebox(scene, {1: 1, 2: 2}, port="A") moves the routing slot and the head amp together. It is a Python call; there is no CLI equivalent yet. One bad channel number and the whole batch writes nothing at all.
Check a scene against your rig before doors
preflight SCENE --config rig.json checks a file against a JSON description of your rig: output patch and tap points, routing, stereo links, send taps, DCA and mute groups. Findings read FAIL ch 07 in the main blend, expected out of it. A mute group saved engaged fails too — it silences its members on recall. Exit 1 on a failure, so it runs in a script.
Set up the next band from a scene that already works
One JSON file holds the names, head amps, EQ, dynamics, monitor mixes, FX, routing and output patch for a band; band-setup TEMPLATE PLAN.json -o OUT.scn lays it over a scene you already trust. The example plan lands 77 lines over 76 paths. If anything the plan did not name comes out different from the template, it stops and writes no file — so a half-applied scene never reaches the desk.
Set an effect by parameter name
You want the plate reverb decaying at 2.1 seconds and you do not want to count slots to work out where that number goes. fx-types PLAT lists all 12 of its parameters with the desk’s own defaults (Decay 2.11, Damp 6k50), and set-fx SCENE 4 --type PLAT --set Decay=2.1 writes them by name. Values go out in the console’s own token format. That matters: write a compressor ratio as 4 instead of 4.0 and the desk keeps the threshold, then silently reverts ratio, knee, makeup, attack, hold and release.
One change, on a real scene file
A night’s worth of desk work, said once and applied to the file the console reads.
Put a plate on FX 4 with a 2.1 second decay and the damping up at 8 kHz. Then ease off the kick compressor — threshold −18, ratio 3:1 — and pull that 6.8 k bite down to 4.5 k, +2.5 dB, a bit wider.
4 changed path(s):
ch 01 "Kick"
dyn thr -21.5 -> -18.0, ratio 10 -> 3.0
eq 4 freq 6k85 -> 4k50, gain +4.75 -> +2.50, q 2.0 -> 1.4
fx
fx 4 type type CR/R (Chorus + Chamber) -> PLAT (Plate Reverb)
fx 4 params PreDelay 0.25 -> 32, Decay 35 -> 2.10, Size 15.1 -> 60,
Damp 180 -> 8k00, Diff 100 -> 30, Level +10 -> 0.0,
LoCut 20 -> 60, HiCut 1.32 -> 7k2, BassMult 40 -> 1.09,
Xover 6k4 -> 211.44, ModDepth 83 -> 20, ModSpeed 100 -> 202,118 lines in the scene. Exactly 4 differ.
You load after.scn on the desk and everything you did not ask for is byte-identical.