Canvas

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

  1. 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.
  2. 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).
  3. 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~.
  1. 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.

RingSpeakersHeight (Y)Azimuths (°)Elevation (°)
Ground1–70.5 m−127.6, −90, −47.3, 0, 47.3, 90, 127.6−16 … −21
Elevated9–163.7 m±26.6, ±73.3, ±106.7, ±153.438 … 40
Rear83.0 m18017.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)

ParameterFunction
Add virtual object (+/−)adds or removes sources. Each source gets an inlet, top to bottom in source order.
Posinread-only: shows where each source's position comes from
Rangegainsize and gain of the source. Bound to a wired virtual object's Radius, otherwise typed in.
Audio inthe CHOP or channel carrying the source's sound. Resampled to 48 kHz.

Outputs

Limitations and expected behaviour

Outlook

Planned work includes:

Relations

References