Skip to content

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.

/wall/config

engine → sc state since 0.2.0

The geometry of this installation.

i columns
i rows
i panelColumns
i panelRows
i areaFirstColumn
i areaColumns
f widthMeters
f heightMeters
iiiiiiff
columns i int32 1 – 64
Holds across the whole wall, decorative columns included.
rows i int32 1 – 32
Holds up the whole wall.
panelColumns i int32 1 – 64
Holds across one panel. The wall is a whole number of panels wide.
panelRows i int32 1 – 32
Holds up one panel.
areaFirstColumn i int32 0 – 63
First column of the interactive area, zero-based. Columns left of it are decorative.
areaColumns i int32 1 – 64
Width of the interactive area in columns. Columns right of it are decorative. Zones split this area, not the whole wall.
widthMeters f 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.
heightMeters f float32 0.5 – 20.0meters
Physical height of the whole wall.

Must arrive in the same bundle as /wall/blanks.

packet /wall/config 20 12 5 6 2 16 5.0 3.0
SuperCollider NetAddr("127.0.0.1", 57120).sendMsg('/wall/config', 20, 12, 5, 6, 2, 16, 5.0, 3.0);
engine (C#) 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

engine → sc state since 0.2.0

Grid positions that have no hold.

i* holdIds
i*
holdIds i 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.

packet /wall/blanks 0 19
SuperCollider NetAddr("127.0.0.1", 57120).sendMsg('/wall/blanks', 0, 19);
engine (C#) osc.Send(Osc.WallBlanks, 0, 19);

/wall/hold/touch

engine → sc event since 0.1.0

A hold has been grabbed.

i holdId
f velocity
f timestamp
iff
holdId i int32 hold index · 0 – holdCount−1
Flat index, bottom-left origin, row-major. See the wall map.
velocity f float32 0.0 – 1.0normalized
Impact force at the moment of contact. Sensors that only report on/off send 1.0.
timestamp f float32 seconds
Engine time since session start. Monotonic, float seconds. Used for ordering and for measuring latency, not for scheduling.
packet /wall/hold/touch 42 0.81 12.334
SuperCollider NetAddr("127.0.0.1", 57120).sendMsg('/wall/hold/touch', 42, 0.81, 12.334);
engine (C#) 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

engine → sc event since 0.1.0

A hold has been let go.

i holdId
f timestamp
if
holdId i int32 hold index · 0 – holdCount−1
Flat index, bottom-left origin, row-major.
timestamp f float32 seconds
Engine time since session start. Monotonic, float seconds.
packet /wall/hold/release 42 13.102
SuperCollider NetAddr("127.0.0.1", 57120).sendMsg('/wall/hold/release', 42, 13.102);
engine (C#) osc.Send(Osc.WallHoldRelease, 42, 13.102f);