Skip to content

Climbing Wall OSC

This is the contract between the game engine, which owns the wall’s sensors, lights, game rules and content, and SuperCollider, which owns every sound the installation makes. If a message is not described here, it does not exist.

One YAML source is the truth. This site, the SuperCollider responder stubs and the engine’s constants file are all generated from it, so nobody writes an address string twice and nobody typos one.

Hold identity is the single biggest off-by-one risk in the project, so it is settled once, here, in a picture generated from the same file as the code.

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 0 1 2 3 decorative interactive area decorative
The reference wall: 240 holds, 20 × 12, built from 4 × 2 panels of 5 × 6. Hold 0 (circled) is bottom-left; numbering runs along each row, then up, across the whole wall including decorative columns. Columns 2–17 are the interactive area. Real walls report their own size with /wall/config.

Walls come in different sizes, so the engine reports the real one with /wall/config before anything else. See Wall & zones for the interactive area, panels and how multi-player modes split the wall.

Sending from the engine

The startup order, the float rule, and live geometry. See Lifecycle then the engine guide.

Receiving in SuperCollider

Generated OSCdefs wire the addresses up; your logic lives in ~handlers. See the SuperCollider guide.

Who picks the sound

Content is named by the engine; feedback is chosen by SuperCollider. See the rule.

Testing without the other side

A mock engine for all eight modes and a schema-aware monitor. See Testing.

  1. UDP is lossy, so continuous data is absolute, never a delta. The Climbing Synth sends the whole note pattern every time, never “add a note”. A dropped packet heals on the next one.
  2. State changes are idempotent. Sending /mode/start twice is safe. Anything that genuinely must land declares an explicit acknowledgement.
  3. IDs travel as arguments, not as address segments. /wall/hold/touch 12, never /wall/hold/12/touch.
  4. Continuous values are floats. Always. Integers are for identifiers, counts and flags. See Types & units.
  5. Nothing about the wall is a constant. Hold, zone and speaker indices are checked against the live configuration, never a hard-coded range.
  6. The engine names content; SuperCollider chooses feedback.
  7. Once an address is published, it is never repurposed.

Every message has its own anchor. Copy its link and paste it into chat, so feedback reads “the growl on /mode/memory/mistake should not repeat within a second” rather than a paragraph both sides read differently.