eater's Shadow & Knuckles


Virtual Surround

A Rust crate which allows you to simulate surround sound in a stereo space, alternatively known as "discount Dolby Atmos" or "eater's Shadow & Knuckles" (MSFT's built-in version is called Microsoft Sonic)

This crate will always introduce a small amount of delay which is needed for fourier transforms, for e.g. kemar on 48000hz this is 512 samples or 10.6ms

Time of the transform itself are negligible on a Ryzen 5800X


git clone --recursive


The crate with the Logic, and fourier transforms. math.


  • rust (default), uses the realfft and rustfft crates for FFT, this feature is in place so we can later switch out for other FFT implementations
  • resample (default), compile with resampling support (by use of libsamplerate) this is used when the sample rate of the hrir is not equal to target sample rate

Totally undocumented for your own enjoyment!


jack-vsf <hrir-file>

Create a JACK based Virtual Surround filter, please do a release build, Rust in debug is a bit CPU hungry


You need to have the following installed:

  • libsamplerate
  • jack (or pipewire's fake jack)
cargo build -p jack-vsf --release
# and if you're feeling spicy
strip target/release/jack-vsf


there has to be a JACK server running already, or Fake JACK (aka pipewire)

# sample run, press enter to quit
./target/release/jack-vsf ./resources/hrir_kemar/hrir-kemar.wav


Git submodule with patched bwavfile crate, which introduces support for PCM f32 wav files, and some other small things


Git submodule with patched libsamplerate-sys crate, which allows for dynamic linking, instead of using a static build

Additional files

This git repo contains some extra sample HRIR files, which are open to distribution

the kemar head will do fine, but you might get a better experience by finding your perfect head match in hrir_listen

  • resources/hrir_kemar is licensed under MIT, uses a dummy head (1994)
  • resources/hrir_listen is public domain, uses a bunch of random people's heads (2002 - 2003)
You might also like...