Move /armed/<name> receive msg from arm BUTTON to parent GROUP so pad.lua onReceiveOSC fires on the node that owns the message (FIX 1). Remove feedback.lua from master RMS fader; native receive already drives the VU, onFrame decay was pure downside (FIX 3). Add Lua 5.1/LuaJIT compat shim for table.unpack in melody_faders (FIX 2). Document deferred sequencer playhead in README (FIX 4). Regression test: 16 pad GROUPs carry /armed/* receive; 21 tests pass. Rebuild dist/av-live-control.tosc.
4.9 KiB
TouchOSC control surface
A native TouchOSC (Hexler) iPad layout that drives the AV-Live SuperCollider
engine over OSC and reflects live engine state back onto the surface. Generated
by code (gzipped XML), versioned in this repo, iterated by diff. Replaces the
web_realart/public/control/ web surface as the control method
(web_realart stays for Hydra/WebGL visual sync).
What it is
gen/schema.py— TouchOSC.toscv3 serializer (gzip-XML). Single format choke point. Seedocs/superpowers/specs/2026-06-28-tosc-schema-reference.md.gen/layout.py— data-driven 3-page layout model + widget builders.gen/lua/*.lua— per-widget Lua (pad arm-color, rhythm grid, melody faders, beat/RMS feedback, preset labels). Embedded at build time.gen/build_layout.py— entrypoint →dist/av-live-control.tosc.- SC feedback:
sound_algo/data_only/touchosc_feedback.scd(loaded bysound_algo/data_only/boot.scdafterlaunchpad.scd).
Pages
- LIVE — tempo fader, CLEAR ALL, master VU, beat flash, 4×4 grid of 16 pads (arm button + volume fader + name, armed-state reflection).
- FX / HARMONIE / CONCERT — filter, FX one-shots, breakdown in/out; harmony root/scale/octave/phrase; morceau next, concert, body-play.
- SÉQUENCEURS — rhythm (8 presets + 3×16 grid) and melody (8 presets + 8 step faders) with arm buttons.
Build
cd touchosc
uv run python -m gen.build_layout # writes dist/av-live-control.tosc
uv run pytest -q # 20 tests
*.tosc build outputs under dist/ are the deliverable and are committed.
Validate on GrosMac (before deploying to the iPad)
- Fidelity gate (do this first): in TouchOSC desktop, File > Open →
touchosc/dist/av-live-control.tosc. Confirm all 3 pages render and there are no parse/script errors. (open -a TouchOSC <file>from the shell was observed to open an "Untitled" window — use File > Open inside the app.) If a layout fails to load, fixgen/schema.pyagainst the schema reference and rebuild — no other file changes. - OSC connection: TouchOSC → Connections → OSC (UDP):
- Host =
supra-m1.local(macm1 — the SC engine host) - Send port =
57121(the SC OSCdef port) - Receive port =
9000(matches~toscPortintouchosc_feedback.scd) - Ensure the layout targets Connection 1 (
CONN_DEFAULT="00001").
- Host =
- Control smoke test: with the SC engine running on macm1 (boot the
data-only patch), enter play mode, tap pads and move the tempo / a volume
fader. Watch the macm1 sclang post window for
/launch,/launch/tempo,/launch/voland confirm audio responds. - Feedback check: armed pads light, the beat box flashes, the master VU moves, and selecting a rhythm/melody preset loads its steps + name into the editor widgets.
Deploy to the iPad
- Get
dist/av-live-control.tosconto the iPad (AirDrop, or TouchOSC document sync / iCloud). - On the iPad, set the same OSC connection: host
supra-m1.local, send57121, receive9000. - Confirm landscape canvas. Default canvas is 1194×834 (iPad 11"/Air) with
proportional anchoring; if your model differs, set
CANVASingen/layout.pyand rebuild.
OSC contract (engine routes are reused unchanged)
Control (surface → SC, port 57121): /launch <name> <0|1>,
/launch/vol <name> <0..1.5>, /launch/tempo <60..200>, /launch/clear,
/control/fx/{filter,stutter,crash,kick,swell,breakdown},
/control/harmony/{root(±delta),scale(name),octave(0..2),phrase(0..3)},
/control/concertNext, /control/doScene <play|concert|all>,
/seq/{melody,rhythm} <idx>, /seq/{melody,rhythm}/set ...,
arm sequencers via /launch melseq|rhythmseq <0|1>.
Feedback (SC → surface, port 9000, all created by touchosc_feedback.scd):
/armed/<name> <0|1>, /sync/beat <1>, /sync/rms <amp>,
/seq/rhythm/state <idx> <k> <s> <h> <name>,
/seq/melody/state <idx> <degrees...>.
Known limitations / pending
- Visual fidelity gate (step 1 above) is the one check not automatable here; confirm it on GrosMac before relying on the layout.
- Lua API (Hexler control API:
onReceiveOSC,sendOSC,Color(),self.children,table.unpack, GRID dimension props) is verified at the fidelity gate; each script carries anAPI verified on GrosMacmarker. If a script errors in the editor console, adjust against the TouchOSC manual. - Per-voice VU (spec §4) is deferred: the data-only engine sums all voices to bus 0, so per-voice live levels are not producible without re-routing the audio. The master RMS VU + beat + per-pad armed reflection cover the live-feedback need.
- Sequencer playhead / step-index highlight (spec §2/§4/§7) is deferred: the data-only engine does not emit a step index over OSC, so adding column-highlight requires a new SC step-emit plus a layout column-highlight receiver. Not built in this pass.