Ambisonics sound control
Ambisonics_sound_ctrl.tox
Layer: output (sound)
In: one position per source (CHOP) + audio (CHOP)
Out: third-order ambisonic mix on the lab's 16 + 1 loudspeaker array
This component places sound sources in the three-dimensional space of the lab. Each source has its own position, size and audio input, and the component renders them through the lab's third-order ambisonic loudspeaker system. The user works only in TouchDesigner: wire in a position (for example a Virtual objects or a tracked joint), point to an audio signal, and set a range. Encoding, decoding to the irregular speaker layout and transport over the Dante network are handled by a dedicated rendering chain in Max/MSP. This gives everyday users of the lab position-driven spatial sound, which would otherwise require specialist knowledge of ambisonics.
Role in the setup
This is the sound counterpart of Wall projection and Floor projection. It is where the spatial logic of a project becomes audible. A virtual object wired into a source makes that object heard at its location. A tracked joint makes a sound follow a body.
Technical specification
Signal chain
- TouchDesigner (HP Z8 workstation). The component holds one source per virtual object slot. Each source has a position (CHOP inlet), an audio input (a CHOP or channel) and a Rangegain. Audio is resampled automatically to the Dante network rate of 48 kHz. The internal network is built and wired by script, which re-checks the structure about once per second.
- Transport. Source positions are sent over OSC. Source audio is sent over Dante (Dante Via on the workstation, Dante Virtual Soundcard in ASIO mode on the rendering machine).
- Rendering (Windows NUC, Max/MSP). Described in full in Max-MSP ambisonic renderer.
- Each position is converted to azimuth, elevation and distance relative to a listening reference point.
- Up to 16 sources are encoded into a third-order AmbiX sound field (ACN channel order, SN3D normalisation, 16 channels) with the ICST
ambiencode~object. - The field is decoded to the measured loudspeaker positions with ICST
ambidecode~.
- Output. There are 16 discrete speaker feeds plus a subwoofer feed. The subwoofer feed is taken from the omnidirectional (W) component and low-pass filtered.
Loudspeaker layout
Room frame: metres. X = width, Y = height, Z = depth. Z = 0 is the north wall, and Z increases towards the entrance. The reference listening point is X = 0, Y = 1.5, Z = 2.5. Azimuth 0° points north, and positive azimuth turns towards +X.
| Ring | Speakers | Height (Y) | Azimuths (°) | Elevation (°) |
|---|---|---|---|---|
| Ground | 1–7 | 0.5 m | −127.6, −90, −47.3, 0, 47.3, 90, 127.6 | −16 … −21 |
| Elevated | 9–16 | 3.7 m | ±26.6, ±73.3, ±106.7, ±153.4 | 38 … 40 |
| Rear | 8 | 3.0 m | 180 | 17.9 |
| Sub | — | — | (omnidirectional, LP-filtered W) | — |
The layout is irregular: it is set by the room and the entrance gap. Positions were measured with a purpose-built calibration tool and entered into the decoder as azimuth, elevation and distance per speaker. They can be recalibrated live without rebuilding the patch.
Gain model
Rangegain sets each source's size and gain. If a virtual object is wired in, Rangegain follows that object's Radius (shown as a bind), so a source's acoustic "size" matches its spatial size. In the renderer, each source's level is scaled by its distance to the listening reference. That reference is either a fixed point or a separately tracked listener. Distance affects loudness only: direction always comes from the source position, never from the listener. This is because listener orientation cannot be tracked reliably. A global bypass forces all sources to full gain, so direction can be tested without level changes.
Test and development modes
- Direction mode: live tracked position, or a fixed default that matches each speaker (for calibration).
- Test audio: a looped voice recording replaces the live input, for testing without performers.
- Ambisonic file input: two players for pre-encoded 16-channel third-order B-format WAV files, mixed into the decoder alongside the live sources (in development).
Parameters (TouchDesigner component)
| Parameter | Function |
|---|---|
| Add virtual object (+/−) | adds or removes sources. Each source gets an inlet, top to bottom in source order. |
| Posin | read-only: shows where each source's position comes from |
| Rangegain | size and gain of the source. Bound to a wired virtual object's Radius, otherwise typed in. |
| Audio in | the CHOP or channel carrying the source's sound. Resampled to 48 kHz. |
Outputs
- The ambisonic mix of all sources on the speaker array (16 + 1 channels).
- A 3D view inside the component: one sphere per source, sized by Rangegain.
Limitations and expected behaviour
- Posin shows the middle of the room: nothing is wired into that source's inlet.
- Rangegain is a plain number instead of a bind: nothing is wired in, or the input is not a virtual object.
- A new or removed source takes a moment to appear: the script rebuilds about once per second.
- A manual rewire inside the component reverts: the script restores the internal chain. Never rewire it by hand.
- Sample-rate mismatch: 44.1 kHz material has to be resampled to 48 kHz before it reaches Dante. The component does this for its own inputs.
- Single listening reference: the decoder is optimised for one central listening area. Listeners far from the centre will hear the spatial image less precisely, which is normal for loudspeaker-based ambisonics on an irregular layout. Checking directional rendering on this layout is ongoing work.
Outlook
Planned work includes:
- a TouchDesigner control interface for the renderer
- a direct Dante input for B-format audio rendered in TouchDesigner
- per-speaker aiming data
- a headphone-based, head-tracked "Augmented Audio Reality" mode alongside the loudspeaker system
Relations
- → Max-MSP ambisonic renderer (OSC positions + Dante audio)
- ← Virtual objects (position + size, via the green output)
- ← Azure Kinect sensors (position)
- ← Calculations (control values, e.g. to drive audio parameters)
- Hardware: Inventory (loudspeakers, Dante network)
References
- User README: Ambisonics_sound_ctrl-README
- Repository: <https://github.com/SpatialComputingL/Td-updates>
- ICST Ambisonics externals for Max (Zurich University of the Arts)
- Overview: Lab Tools