ambiX

June 6, 2026 · View on GitHub

Cross-platform Ambisonic VST/VST3/LV2 plug-ins and standalone applications for macOS, Windows, and Linux.

  • VST3 plug-ins automatically adjust to the track channel count and switch Ambisonic order (VST2 are pre-built for a fixed order/channel count).
  • Uses the ambiX convention: ACN channel order, SN3D normalization, full periphony (3D), excluding the √(1/4π) factor
  • Spherical harmonics are computed recursively; the maximum order is defined at compile time — in practice limited by the host's channel count (N+1)² or CPU
  • Built on the JUCE framework (GPLv3)
  • Designed to complement the mcfx multichannel plug-in suite

Convention reference: Nachbar et al., Ambisonics Symposium 2011


Table of Contents


Plug-ins

Further reading: LAC 2013 paper, ICSA 2014 paper

ambix_binaural

Binaural decoder with impulse responses for various real-world loudspeaker setups and venues.

Preset search paths:

PlatformPath
WindowsC:\Users\<username>\AppData\Roaming\ambix\binaural_presets\
macOS~/Library/ambix/binaural_presets/
Linux~/ambix/binaural_presets/

ambix_decoder

Same as ambix_binaural but without convolution — loudspeaker signals are sent directly to the outputs (single-band decoding).

Uses the same preset format and search paths as ambix_binaural.

The IEM AllRADecoder is easier https://plugins.iem.at/docs/allradecoder/ to work with nowadays.


ambix_converter

Converts between different Ambisonic standards on the fly (including FuMa ↔ ambiX and 2D ↔ 3D), allowing multiple standards within one project.


ambix_directional_loudness

Amplifies, attenuates, or filters specific regions of the spherical sound field. Press S to toggle solo on the last selected filter.


ambix_encoder

Panning plug-in with a configurable number of input channels. A width parameter spreads channels equally along the azimuth.

  • OSC remote control with configurable custom ID; the track name is included in outgoing OSC messages for easier identification
  • Opt+drag to adjust the width of multiple sources simultaneously
  • Automatically advertises itself on the local network (Zeroconf) so the ambix_visualizer can discover it without manual IP/port configuration

Outgoing (sent to configured target):

MessageArguments
/ambi_encid(int) track_name(str) distance(float) azimuth(float) elevation(float) size(float) peak(float) rms(float) [reply_port(int)]

Azimuth and elevation in degrees (−180…+180); distance is currently unused (always 2.0); size 0…1; peak and rms linear 0…1 (0 dBFS = 1.0); reply_port is appended only when the receiver is bound.

Incoming (received on configured port):

MessageArgumentsRange
/ambi_enc_setid(int) distance(float) azimuth(float) elevation(float) size(float)az/el deg −180…+180, size 0…1
/ambi_enc_subscribeuuid(str) reply_port(int) [name(str)] [visualizer_ip(str)]Zeroconf subscription from visualizer
/ambi_enc_unsubscribeuuid(str)Remove a Zeroconf subscription

ambix_move

6DoF-like soundfield translation and rotation.

  • Translates the listener viewpoint by ±5 m in x, y, z on a virtual sampling sphere (configurable reference radius 1–5 m)
  • Rotation follows the same Yaw / Pitch / Roll + quaternion convention as ambix_rotator
  • The full 6DoF transformation is computed as a single matrix multiply at runtime (decode → remap directions + apply 1/r gain → re-encode)
  • Independent enable toggles for translation and rotation
  • OSC control on a configurable UDP port (default 7130), useful for binaural playback with 6DoF head-tracking:
MessageArgumentsRange
/rotationpitch yaw rolldeg, −180…+180 each
/quaternionqw qx qy qz−1…+1 each
/xyzx y zmetres, −5…+5 each
/translationx y zalias of /xyz
/6dofx y z qw qx qy qzmetres + quaternion

ambix_maxre

Applies (or reciprocally applies) spherical max-rE weighting to suppress sidelobes, as described in Zotter & Frank — "All-Round Ambisonic Panning and Decoding".


ambix_mirror

Inverts or mirrors the sound field about the x, y, or z axis.


ambix_rotator

Rotation around the x, y, and z axes (including quaternion input). OSC control on a configurable UDP port:

MessageArgumentsRange
/rotationpitch yaw rolldeg, −180…+180 each
/quaternionqw qx qy qz−1…+1 each
/head_poseuser_id x y z pitch yaw rollid (int), position (ignored), deg

ambix_rotator_z

Rotation around the z axis only.


ambix_vmic

Virtual microphone: outputs the selected region of the sound field as an audio signal rather than an Ambisonic stream.


ambix_warp

Warps the sound field towards the equator, poles, front, or back. The GUI supports mouse dragging and undo/redo.


ambix_widening

Frequency-dependent rotation around the z axis for source widening or diffuse early reflections. The GUI supports mouse dragging gestures.

Article: http://dx.doi.org/10.14279/depositonce-12 — created with Franz Zotter and Matthias Frank.


Standalone Applications

ambix_visualizer

Real-time 3D source position visualizer — runs as a macOS desktop app or an iOS/iPadOS app (iPad recommended).

  • Displays source positions from one or more ambix_encoder instances on a 2D Hammer-Aitoff or interactive 3D sphere projection
  • Automatically discovers ambix_encoder instances on the local network via Zeroconf (no manual IP/port setup needed); also accepts manual OSC subscriptions for use with other encoders (e.g. IEM MultiEncoder)
  • Listens on a configurable UDP port (default 9000)

See ambix_visualizer/README.md for build instructions, iOS deployment, and network setup details.


Prerequisites for Building

CMake and a working build environment are required. FFTW3 is required on Linux/Windows; Eigen 3 ships as a git submodule (no system install needed). Standalone applications additionally require the ASIO SDK for Windows ASIO support.

Linux — install dependencies (Debian/Ubuntu):

sudo apt install libasound2-dev libjack-jackd2-dev \
    ladspa-sdk \
    libcurl4-openssl-dev \
    libfreetype-dev libfontconfig1-dev \
    libx11-dev libxcomposite-dev libxcursor-dev libxext-dev libxinerama-dev libxrandr-dev libxrender-dev \
    libwebkit2gtk-4.1-dev \
    libglu1-mesa-dev mesa-common-dev \
    libfftw3-dev

On older Ubuntu/Debian where libwebkit2gtk-4.1-dev is not available, substitute libwebkit2gtk-4.0-dev — JUCE 8 loads whichever is present at runtime. Likewise, fall back to libfreetype6-dev if libfreetype-dev is unavailable. If you intend to enable WITH_ZITA_CONVOLVER (off by default), also install libzita-convolver-dev.

Standalone apps on Linux use JACK (libjack-jackd2-dev) and apply a patch to JUCE's JACK backend so all requested channels are exposed as ports up front, regardless of the audio interface channel count. Disable with -DJUCE_JACK=OFF if you want a build without JACK.

Windows x64 — FFTW3 is fetched and built by vcpkg (declared in vcpkg.json with SSE2/AVX/AVX2/threads features, statically linked into each plug-in — no DLL to ship). Both scripts/build_all_win64.bat and scripts/run_tests.py auto-bootstrap vcpkg into %USERPROFILE%\vcpkg if neither VCPKG_ROOT nor (GH Actions') VCPKG_INSTALLATION_ROOT is set, so no manual setup is required.

To bootstrap vcpkg manually (e.g. to share one checkout across projects):

git clone https://github.com/microsoft/vcpkg "%USERPROFILE%\vcpkg"
"%USERPROFILE%\vcpkg\bootstrap-vcpkg.bat"
setx VCPKG_ROOT "%USERPROFILE%\vcpkg"

If you invoke CMake directly, point it at the toolchain and overlay triplet:

cmake -B build ^
    -DCMAKE_TOOLCHAIN_FILE="%VCPKG_ROOT%\scripts\buildsystems\vcpkg.cmake" ^
    -DVCPKG_OVERLAY_TRIPLETS=vcpkg-triplets ^
    -DVCPKG_TARGET_TRIPLET=x64-windows-static-md-release ...

Clone the repository including submodules:

git clone --recurse-submodules https://github.com/kronihias/ambix/

How to Build

Use cmake-gui or cmake/ccmake from the terminal.

  1. Initialise submodules (if not cloned with --recurse-submodules):

    git submodule init
    git submodule update
    
  2. Create a build folder and configure:

    mkdir build
    cd build
    ccmake ..
    
  3. Adjust parameters to your needs, then build:

    make -j$(nproc)
    
  4. Find the binaries in ambix/BUILD/_bin/ and copy them to your system plug-in folder:

    FormatmacOSWindowsLinux
    VST2/Library/Audio/Plug-Ins/VSTC:\Program Files\Steinberg\VstPlugins/usr/lib/lxvst or /usr/local/lib/lxvst

LV2 Plug-ins

LV2 plug-ins are fixed-order (like VST2), using the AMBI_ORDER CMake variable and the _oX naming suffix. They can be built on their own or alongside VST2.

  1. Enable the BUILD_LV2 CMake flag (e.g. -DBUILD_LV2=ON) and build as usual:
    cmake -B build -DBUILD_LV2=ON -DBUILD_VST=OFF
    cmake --build build -j$(nproc)
    
    JUCE 8 generates all .ttl files automatically during the build (via the bundled juce_lv2_helper) — no separate TTL-generator step is needed.
  2. The finished .lv2 bundles are written to build/lv2_o<AMBI_ORDER>/ (e.g. build/lv2_o5/ambix_rotator_o5.lv2/), each containing the .so, manifest.ttl, dsp.ttl, and ui.ttl. Copy the .lv2 folders to ~/.lv2 (per-user) or /usr/lib/lv2 (system-wide).

Known Problems

  • Documentation is sparse — refer to the papers linked above for background.
  • GUI-less plug-ins cannot be used as standalones.
  • Linux: LV2 plug-ins now ship an X11 GUI (JUCE 8), but it may not work in every host; VST plug-in GUIs may crash — if in doubt, use the host's built-in generic UI or the standalone version via JACK.

Changelog

v0.4.6 (2026-06-06)

  • LV2: BUILD_LV2 now builds LV2 plug-ins independently — previously they were only produced when BUILD_VST was also enabled, which required the (proprietary) VST2 SDK
  • LV2: rely on JUCE 8's automatic .ttl generation; the obsolete lv2-ttl-generator / generate-ttl.sh step has been removed from the build instructions
  • LV2 plug-ins are fixed-order (_oX, like VST2): each AMBI_ORDER produces its own bundle. Runtime order-switching as in VST3 is not possible because LV2 audio ports are statically declared in the .ttl

v0.4.5 (2026-06-06)

This release focuses on improved Linux support.

  • Linux: JACK standalone application, with its own device and channel-count settings UI (no longer relies on a patched JUCE JACK backend)
  • Standalone: per-plug-in output channel count — fixed stereo for binaural, variable for the decoder/virtual-mic — plus NO_INPUT (output-only) and SYMMETRIC_IO (input-driven) opt-ins
  • ambix_encoder: input-clamped, editable source selector
  • editors: refresh the Ambisonic-order title when the channel count changes

v0.4.4 (2026-05-24)

  • testsuite for Mac, Win, Linux
  • Win: statically link to custom built fftw via vcpkg
  • ambix_encoder/ambix Visualizer network discovery improvements
  • update to JUCE 8.0.13
  • ambix_encoder - add backward compatibility to projects saved before the large overhaul in v0.4.3

v0.4.3 (2026-05-17)

  • major overhaul of ambix_encoder
  • only have a single ambix_encoder that can handle multiple sources
  • linked/unlinked mode
  • popup window with panning view
  • sphere view add labels
  • hammer-aitoff 2d projection mode
  • preset factory (compatible with iem multiencoder and sparta)
  • solo/mute per source
  • ambix visualizer compatible with new multi-source encoder functions

v0.4.2 (2026-05-05)

  • ambix_directional_loudness: add energy visualizer pre/post modification, add hammer-aitoff projection view, low/high-pass for visualizer signal
  • ambix Visualizer: add meter next to puck, performance improvements

v0.4.1 (2026-04-20)

  • fix VST3 channel reordering

v0.4.0 (2026-04-19)

  • VST3 support: all plug-ins now ship as VST3 with a single binary that automatically adjusts to the track's Ambisonic order — VST3 is recommended going forward, VST2 is considered legacy for backward compatibility
  • New: ambix_move — 6DoF-like soundfield transformation: translate the listener position (x/y/z) and rotate using the same Yaw/Pitch/Roll + quaternion convention as ambix_rotator; independent enable toggles for translation and rotation; OSC control on a configurable port, useful for binaural playback with 6DoF head-tracking (small head movements)
  • New: ambix_visualizer — standalone macOS/Win and iOS/iPadOS/Android app that displays source positions from ambix_encoder instances on a 2D or 3D sphere in real time, also compatible with IEM MultiEncoder
  • ambix_warp: new interactive GUI with mouse dragging and undo/redo
  • ambix_widening: new interactive GUI with mouse dragging gestures
  • ambix_encoder: Zeroconf network advertisement for automatic discovery by ambix_visualizer; track name included in OSC messages; opt+drag to adjust multiple source widths simultaneously
  • ambix_binaural: performance improvements from mcfx_convolver
  • ambix_directional_loudness: press S to toggle solo on the last selected filter
  • ambix_rotator: fix initialisation issue
  • Update to JUCE 8

v0.3.0 (2022-04-16)

New builds optimised for Apple Silicon and 64-bit Intel Mac; Windows 64-bit. Update to JUCE 7; removed soxr dependency.

v0.2.10 (2020-02-06)

ambix_binaural: fix dropouts/artifacts for hosts sending incomplete block sizes (e.g. Adobe, Steinberg); option to store preset within the project (enables DAW project exchange without external files); allow exporting stored preset as a .zip file.

v0.2.9 (2019-06-12)

ambix_warp: fixed crash.

v0.2.8 (2017-05-20)

ambix_binaural: improved FFTW thread-safety to fix startup crash when other plug-ins use FFTW. ambix_rotator: add quaternion input.

v0.2.7 (2017-03-22)

ambix_binaural: improved performance, various bugfixes. ambix_rotator: improved performance. ambix_encoder: adjustable custom ID for remote control.

v0.2.6 (2016-04-08)

ambix_converter: fixed scaling of the W channel when converting from/to FuMa. ambix_binaural: convolution engine fix, preset dir save fix. ambix_vmic: GUI fix.

v0.2.5 (2015-12-06)

Removed liblo dependency. ambix_encoder: improved GUI performance. ambix_decoder: fixed binaural L/R impulse response swap, added volume control, indicate loaded preset in menu. ambix_directional_loudness: improved solo/window behaviour (multiple filters now pass through when soloed), 8 filters by default. ambix_rotator: GUI and OSC rewrite. ambix_vmic: GUI update, 8 outputs by default.

v0.2.4 (2015-07-19)

Improved efficiency for ambix_binaural.

v0.2.3 (2014-12-27)

Multichannel encoder displays actual source positions; AudioMulch compatibility for saving settings.

v0.2.2 (2014-08-18)

Encoder flickering fix; added OSC settings; new control modes: right-click for relative source movement, Shift to freeze elevation, Ctrl to freeze azimuth.

v0.2.1 (2014-04-17)

Fixed VST identifier for Plogue Bidule compatibility.

v0.2.0 (2014-03-30)

Added ambix_widening; JUCE update; encoder GUI panning fix.

(2014-03-15)

Fixed binaural decoder crash during configuration unloading.

(2014-02-19)

Warping curve 2 adjusted slightly (ICSA paper); warping pre-emphasis added; ambix_encoder: fixed abs(elevation) > 90°.

(2014-02-13)

Added ambix_maxre.

v0.1.0 (2014-01-24)

First release.


Thanks to: Institute of Electronic Music and Acoustics Graz, Franz Zotter, Winfried Ritsch, Martin Rumori, Florian Hollerweger, Peter Plessas, IOhannes Zmölnig, Thomas Musil, Gerriet K. Sharma, Matthias Frank, Fons Adriaensen, Jörn Nettingsmeier, Filipe Coelho (DISTRHO project), Daniel Rudrich (IEM Plug-ins), Music Innovation Studies Centre of the Lithuanian Academy of Music and Theatre, Ricardas Kabelis, Mantautas Krukauskas, Tadas Dailyda, Sebastian Grill, the surrsound and Linux audio communities.


© 2013–2026 Matthias Kronlachner — m.kronlachner@gmail.com