Reverb Overview

This file is an overview - more details are provided on each sub-page.

Enable Reverb

Enable reverb on an emitter by setting ReverbRayCount to a value greater than 0:

var listener = new Emitter()
{
    ReverbRayCount = 32,
    ReverbBounceCount = 64,
    ReverbEnergyCap = 32 * 64 * 0.05,
    MaxEchogramTime = 1000, // milliseconds
    EchogramGranularity = 10, // milliseconds
    AffectsGroupedEAX = false,
    HasReverbPan = false,
    EAXPanInnerThreshold = 0.6f,
    EAXPanOuterThreshold = 0.8f,
};

context.AddEmitter(listener);

I recommend having a much higher bounce count for reverb than other ray types (occlusion, permeation, etc). Read more about each reverb setting in the sections below.

Reverb Energy Cap

To control how much energy is required for reverb to be at max volume, you can set an energy cap on each emitter. Read more: Reverb Energy Cap.

Access Reverb Results

Reverb results are exposed via the OnReverbUpdated callback on the RaytracingContext. This gives you a chance to create/update reverb effects before playing a sound.

var listener = new Emitter()
{
    ReverbRayCount = 32,
    ...
};

var context = new RaytracingContext()
{
    OnReverbUpdated = () => 
    {
        // Access reverb stats
        Console.WriteLine(listener.RawReverb.ReturnedTotal);
        Console.WriteLine(listener.ProcessedReverb.OutsidePercent);
        Console.WriteLine(listener.EAX.DecayTime);
        
        // Update reverb effects
        // ...
    }
};

context.AddEmitter(listener);

The values in Emitter.EAX can be copied directly onto an EAX reverb effect in your engine. If you wish to calculate these values yourself, see Custom EAX Formulas.

Planned feature: calculate reverb properties for Godot, FMOD and Wwise reverb systems

Raw Reverb

Emitter.RawReverb contains the raw results of raytracing, such as the number of rays returned to the listener. Read more: RawReverbResults.

public class RawReverbResults
{
    public float DistanceTotal;
    public float ReturnedTotal;
    public float OutsideTotal;
}

Processed Reverb

Emitter.ProcessedReverb contains the results of raytracing that have been processed into a more dev-friendly format. Read more: ProcessedReverbResults.

Grouped EAX

Every emitter has its own EAX object, but it's expensive to run many reverb effects in real time. The engine will group emitters with similar reverb properties together. These grouped EAX objects can be accessed in the context.GroupedEAX list.

Read more: Grouped EAX.

Echograms

Reverb properties are calculated from each emitter's echogram. Read more: Echogram Refinement.

Reverb Pan

Vercidium Audio can calculate the direction of reverb for each entry in context.GroupedEAX.

To enable this, set HasReverbPan to true on the emitter that you would like to hear directional reverb from (usually just your main listener emitter):

var listener = new Emitter()
{
    HasReverbPan = true,
};

Then access the pan dictionary on each entry in context.GroupedEAX:

context.OnReverbUpdated = () => 
{
     foreach (var eax in context.GroupedEAX)
     {
         Vector3F pan = eax.Pan[listener];
     }
};

Read more: Reverb Pan.