sfFDN
Loading...
Searching...
No Matches
Shimmer nonlinearities

Nonlinear operations meant to be placed inside the feedback loop of an FDN. More...

Collaboration diagram for Shimmer nonlinearities:

Classes

class  sfFDN::ControllableFullWaveRectifier
 A controllable full-wave rectifier, with optional antiderivative antialiasing. More...
 
class  sfFDN::SignalDependentFractionalDelay
 A signal-dependent fractional delay filter. More...
 
class  sfFDN::RingModulator
 A ring modulator. More...
 

Functions

std::unique_ptr< FilterBanksfFDN::MakeMultichannelControllableFullWaveRectifier (const MultichannelControllableFullWaveRectifierOptions &options)
 Builds a bank of controllable full-wave rectifiers, one per channel.
 
MultichannelControllableFullWaveRectifierOptions sfFDN::MakeMultichannelControllableFullWaveRectifierOptions (float alpha, float sample_rate, uint32_t channel_count, uint32_t active_channel_count=0)
 Returns the options of a bank of controllable full-wave rectifiers covering every channel.
 
std::unique_ptr< FilterBanksfFDN::MakeMultichannelSignalDependentFractionalDelay (const MultichannelSignalDependentFractionalDelayOptions &options)
 Builds a bank of signal-dependent fractional delays, one per channel.
 
MultichannelSignalDependentFractionalDelayOptions sfFDN::MakeMultichannelSignalDependentFractionalDelayOptions (float d, uint32_t channel_count, uint32_t active_channel_count=0)
 Returns the options of a bank of signal-dependent fractional delays covering every channel.
 
std::unique_ptr< FilterBanksfFDN::MakeMultichannelRingModulator (const MultichannelRingModulatorOptions &options)
 Builds a bank of ring modulators, one per channel.
 
MultichannelRingModulatorOptions sfFDN::MakeMultichannelRingModulatorOptions (float frequency, float amplitude, uint32_t channel_count, uint32_t active_channel_count=0)
 Returns the options of a decorrelated bank of ring modulators.
 

Detailed Description

Nonlinear operations meant to be placed inside the feedback loop of an FDN.

These implement three of the five operations of G. Dal Santo, X. Pi, K. Prawda, S. J. Schlecht and V. Välimäki, "Shimmer Reverberation with Nonlinear Feedback Delay Networks", Proc. DAFx26, Cambridge, MA, USA, 2026.

Each of them is a single-channel processor. Place them in FDNConfig::loop_filter_configs, after the attenuation filters and before the feedback matrix, using the multichannel banks built by the MakeMultichannel… factories below. The feedback matrix then distributes the newly generated harmonics across every channel of the network, which is what turns a per-channel waveshaper into a reverberation effect.

All three are approximately energy preserving, which is what keeps the enclosing network stable, but none of them is exactly so. Section 4 of the paper analyses this in detail; the individual classes document what it means for them.

Function Documentation

◆ MakeMultichannelControllableFullWaveRectifier()

std::unique_ptr< FilterBank > sfFDN::MakeMultichannelControllableFullWaveRectifier ( const MultichannelControllableFullWaveRectifierOptions & options)

Builds a bank of controllable full-wave rectifiers, one per channel.

Parameters
optionsThe per-channel configurations. A std::nullopt entry leaves its channel unprocessed. The number of channels of the returned processor is options.channels.size().
Exceptions
std::invalid_argumentif any entry is invalid.

◆ MakeMultichannelControllableFullWaveRectifierOptions()

MultichannelControllableFullWaveRectifierOptions sfFDN::MakeMultichannelControllableFullWaveRectifierOptions ( float alpha,
float sample_rate,
uint32_t channel_count,
uint32_t active_channel_count = 0 )

Returns the options of a bank of controllable full-wave rectifiers covering every channel.

Parameters
alphaThe distortion amount applied to every active channel.
sample_rateThe sample rate, in Hz.
channel_countThe number of channels.
active_channel_countThe number of channels that carry a rectifier, counted from the last channel. Zero means every channel. The channels of an FDN are conventionally ordered by increasing delay length, and Section 6.1 of the paper recommends placing the nonlinearity behind the longer delay lines when a more gradually evolving effect is wanted, so the active channels are taken from the end.

◆ MakeMultichannelRingModulator()

std::unique_ptr< FilterBank > sfFDN::MakeMultichannelRingModulator ( const MultichannelRingModulatorOptions & options)

Builds a bank of ring modulators, one per channel.

Parameters
optionsThe per-channel configurations. A std::nullopt entry leaves its channel unprocessed.
Exceptions
std::invalid_argumentif any entry is invalid.

◆ MakeMultichannelRingModulatorOptions()

MultichannelRingModulatorOptions sfFDN::MakeMultichannelRingModulatorOptions ( float frequency,
float amplitude,
uint32_t channel_count,
uint32_t active_channel_count = 0 )

Returns the options of a decorrelated bank of ring modulators.

Parameters
frequencyThe modulation frequency, in cycles per sample.
amplitudeThe linear gain applied to the modulating sinusoid.
channel_countThe number of channels.
active_channel_countThe number of channels that carry a modulator, counted from the last channel. Zero means every channel.
Note
The initial phase of active channel i of n is i / n, so the channels do not reach the peak of their modulator at the same instant. Phase-aligned modulators across every channel produce a much stronger tremolo, because the feedback matrix then sums channels that are all being attenuated together.

◆ MakeMultichannelSignalDependentFractionalDelay()

std::unique_ptr< FilterBank > sfFDN::MakeMultichannelSignalDependentFractionalDelay ( const MultichannelSignalDependentFractionalDelayOptions & options)

Builds a bank of signal-dependent fractional delays, one per channel.

Parameters
optionsThe per-channel configurations. A std::nullopt entry leaves its channel unprocessed.
Exceptions
std::invalid_argumentif any entry is invalid.

◆ MakeMultichannelSignalDependentFractionalDelayOptions()

MultichannelSignalDependentFractionalDelayOptions sfFDN::MakeMultichannelSignalDependentFractionalDelayOptions ( float d,
uint32_t channel_count,
uint32_t active_channel_count = 0 )

Returns the options of a bank of signal-dependent fractional delays covering every channel.

Parameters
dThe interpolation weight applied to every active channel.
channel_countThe number of channels.
active_channel_countThe number of channels that carry a filter, counted from the last channel. Zero means every channel.