Wall
The wall’s geometry, and physical events from its surface. Geometry is sent at runtime because installations differ in size; touch events are raw sensor facts — no mode logic, no scoring, no interpretation.
Messages
Section titled “Messages”/wall/config
The geometry of this installation.
iiiiiiff -
columnsi int32 1 – 64 - Holds across the whole wall, decorative columns included.
-
rowsi int32 1 – 32 - Holds up the whole wall.
-
panelColumnsi int32 1 – 64 - Holds across one panel. The wall is a whole number of panels wide.
-
panelRowsi int32 1 – 32 - Holds up one panel.
-
areaFirstColumni int32 0 – 63 - First column of the interactive area, zero-based. Columns left of it are decorative.
-
areaColumnsi int32 1 – 64 - Width of the interactive area in columns. Columns right of it are decorative. Zones split this area, not the whole wall.
-
widthMetersf float32 0.5 – 50.0meters - Physical width of the whole wall. Lets SuperCollider place sounds between the speakers in real distances rather than hold counts.
-
heightMetersf float32 0.5 – 20.0meters - Physical height of the whole wall.
Must arrive in the same bundle as /wall/blanks.
/wall/config 20 12 5 6 2 16 5.0 3.0 NetAddr("127.0.0.1", 57120).sendMsg('/wall/config', 20, 12, 5, 6, 2, 16, 5.0, 3.0); osc.Send(Osc.WallConfig, 20, 12, 5, 6, 2, 16, 5.0f, 3.0f); Sent once at startup, before any /mode/load, and again on /sys/sync. Every hold index anywhere in the protocol is relative to the most recent /wall/config — holdCount is columns × rows.
Send it in the same bundle as /wall/blanks: a new size with the old blank list is a wall that does not exist.
The generated SuperCollider responder updates ~oscWall itself before calling your handler, so ~holdIndex, ~holdColRow and ~zoneColumns are correct from the moment the message lands.
/wall/blanks
Grid positions that have no hold.
i* -
holdIdsi int32 hold index · 0 – holdCount−1repeats 0 – n times - Every blank position, in any order. An empty message means the grid is complete. These indices stay reserved: the numbering does not close up over them.
Must arrive in the same bundle as /wall/config.
/wall/blanks 0 19 NetAddr("127.0.0.1", 57120).sendMsg('/wall/blanks', 0, 19); osc.Send(Osc.WallBlanks, 0, 19); /wall/hold/touch
A hold has been grabbed.
iff -
holdIdi int32 hold index · 0 – holdCount−1 - Flat index, bottom-left origin, row-major. See the wall map.
-
velocityf float32 0.0 – 1.0normalized - Impact force at the moment of contact. Sensors that only report on/off send 1.0.
-
timestampf float32 seconds - Engine time since session start. Monotonic, float seconds. Used for ordering and for measuring latency, not for scheduling.
/wall/hold/touch 42 0.81 12.334 NetAddr("127.0.0.1", 57120).sendMsg('/wall/hold/touch', 42, 0.81, 12.334); osc.Send(Osc.WallHoldTouch, 42, 0.81f, 12.334f); Every touch, in every mode, whether or not it means anything to the game. Modes report what a touch MEANT with their own messages; this one only says it happened, and SuperCollider is free to ignore it.
A release may arrive with no matching touch if SuperCollider started mid-grab — treat an unmatched release as normal, not as an error.
/wall/hold/release
A hold has been let go.
if -
holdIdi int32 hold index · 0 – holdCount−1 - Flat index, bottom-left origin, row-major.
-
timestampf float32 seconds - Engine time since session start. Monotonic, float seconds.
/wall/hold/release 42 13.102 NetAddr("127.0.0.1", 57120).sendMsg('/wall/hold/release', 42, 13.102); osc.Send(Osc.WallHoldRelease, 42, 13.102f);