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
- ambiX — Ambisonic Plug-in Suite
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:
| Platform | Path |
|---|---|
| Windows | C:\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):
| Message | Arguments |
|---|---|
/ambi_enc | id(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):
| Message | Arguments | Range |
|---|---|---|
/ambi_enc_set | id(int) distance(float) azimuth(float) elevation(float) size(float) | az/el deg −180…+180, size 0…1 |
/ambi_enc_subscribe | uuid(str) reply_port(int) [name(str)] [visualizer_ip(str)] | Zeroconf subscription from visualizer |
/ambi_enc_unsubscribe | uuid(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:
| Message | Arguments | Range |
|---|---|---|
/rotation | pitch yaw roll | deg, −180…+180 each |
/quaternion | qw qx qy qz | −1…+1 each |
/xyz | x y z | metres, −5…+5 each |
/translation | x y z | alias of /xyz |
/6dof | x y z qw qx qy qz | metres + 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:
| Message | Arguments | Range |
|---|---|---|
/rotation | pitch yaw roll | deg, −180…+180 each |
/quaternion | qw qx qy qz | −1…+1 each |
/head_pose | user_id x y z pitch yaw roll | id (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_encoderinstances on a 2D Hammer-Aitoff or interactive 3D sphere projection - Automatically discovers
ambix_encoderinstances 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-devis not available, substitutelibwebkit2gtk-4.0-dev— JUCE 8 loads whichever is present at runtime. Likewise, fall back tolibfreetype6-deviflibfreetype-devis unavailable. If you intend to enableWITH_ZITA_CONVOLVER(off by default), also installlibzita-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=OFFif 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.
-
Initialise submodules (if not cloned with
--recurse-submodules):git submodule init git submodule update -
Create a build folder and configure:
mkdir build cd build ccmake .. -
Adjust parameters to your needs, then build:
make -j$(nproc) -
Find the binaries in
ambix/BUILD/_bin/and copy them to your system plug-in folder:Format macOS Windows Linux VST2 /Library/Audio/Plug-Ins/VSTC:\Program Files\Steinberg\VstPlugins/usr/lib/lxvstor/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.
- Enable the
BUILD_LV2CMake flag (e.g.-DBUILD_LV2=ON) and build as usual:
JUCE 8 generates allcmake -B build -DBUILD_LV2=ON -DBUILD_VST=OFF cmake --build build -j$(nproc).ttlfiles automatically during the build (via the bundledjuce_lv2_helper) — no separate TTL-generator step is needed. - The finished
.lv2bundles are written tobuild/lv2_o<AMBI_ORDER>/(e.g.build/lv2_o5/ambix_rotator_o5.lv2/), each containing the.so,manifest.ttl,dsp.ttl, andui.ttl. Copy the.lv2folders 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_LV2now builds LV2 plug-ins independently — previously they were only produced whenBUILD_VSTwas also enabled, which required the (proprietary) VST2 SDK - LV2: rely on JUCE 8's automatic
.ttlgeneration; the obsoletelv2-ttl-generator/generate-ttl.shstep has been removed from the build instructions - LV2 plug-ins are fixed-order (
_oX, like VST2): eachAMBI_ORDERproduces 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) andSYMMETRIC_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 Visualizernetwork 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 signalambix 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 asambix_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 fromambix_encoderinstances on a 2D or 3D sphere in real time, also compatible with IEM MultiEncoder ambix_warp: new interactive GUI with mouse dragging and undo/redoambix_widening: new interactive GUI with mouse dragging gesturesambix_encoder: Zeroconf network advertisement for automatic discovery byambix_visualizer; track name included in OSC messages; opt+drag to adjust multiple source widths simultaneouslyambix_binaural: performance improvements from mcfx_convolverambix_directional_loudness: pressSto toggle solo on the last selected filterambix_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