A standalone C++/JUCE application that takes a stereo mix, separates it into stems, and re-renders them in 3D space over headphones.
-
Blind source separation — Non-negative Matrix Factorisation (NMF) splits a stereo track into individual stems without any prior knowledge of the source material.
-
Feature extraction — each stem is analysed frame-by-frame for spectral centroid, spectral tilt, spectral flux, RMS, and peak energy.
-
3D positioning — these features drive a time-varying mapping into 3D space, panned using either:
- VBAP (Vector Base Amplitude Panning), or
- 3rd-order HOA (Higher Order Ambisonics)
both targeting an ITU-R BS.2051 System H loudspeaker layout (22.2, without LFE channels).
-
Binaural rendering — the virtual loudspeaker feeds are convolved with BRIRs to produce a binaural mix for headphone playback, using either:
- the BBC R&D BRIR set, or
- the IoSR Surrey BRIR set.
-
Interactive UI — a stem list with per-stem solo/mute, and an OpenGL 3D visualiser showing each stem's spatial position, with brightness/saturation modulated by its extracted features.
- macOS
- Windows
This project uses CMake and pulls in dependencies (including Eigen) as git submodules, so clone recursively or fetch submodules after cloning:
git submodule update --init --recursiveBefore building, the BRIR datasets need to be fetched and converted into a format compatible with libmysofa:
scripts/fetch_brir.sh
python3 tools/convert_brirs.pyfetch_brir.sh downloads the BBC R&D and IoSR Surrey BRIR sets. convert_brirs.py converts them into SimpleFreeFieldHRIR-format SOFA files that libmysofa can load (requires Python with netCDF4 installed).
Once submodules are initialised and the BRIRs are fetched and converted, configure and build with CMake as normal:
cmake -B build
cmake --build buildGhost Field Spatialiser is released under the GPL v3 license.