Nonlinear operations meant to be placed inside the feedback loop of an FDN.
More...
|
| std::unique_ptr< FilterBank > | sfFDN::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< FilterBank > | sfFDN::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< FilterBank > | sfFDN::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.
|
| |
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.
◆ MakeMultichannelControllableFullWaveRectifier()
Builds a bank of controllable full-wave rectifiers, one per channel.
- Parameters
-
| options | The 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_argument | if any entry is invalid. |
◆ MakeMultichannelControllableFullWaveRectifierOptions()
Returns the options of a bank of controllable full-wave rectifiers covering every channel.
- Parameters
-
| alpha | The distortion amount applied to every active channel. |
| sample_rate | The sample rate, in Hz. |
| channel_count | The number of channels. |
| active_channel_count | The 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()
Builds a bank of ring modulators, one per channel.
- Parameters
-
| options | The per-channel configurations. A std::nullopt entry leaves its channel unprocessed. |
- Exceptions
-
| std::invalid_argument | if 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
-
| frequency | The modulation frequency, in cycles per sample. |
| amplitude | The linear gain applied to the modulating sinusoid. |
| channel_count | The number of channels. |
| active_channel_count | The 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()
Builds a bank of signal-dependent fractional delays, one per channel.
- Parameters
-
| options | The per-channel configurations. A std::nullopt entry leaves its channel unprocessed. |
- Exceptions
-
| std::invalid_argument | if any entry is invalid. |
◆ MakeMultichannelSignalDependentFractionalDelayOptions()
Returns the options of a bank of signal-dependent fractional delays covering every channel.
- Parameters
-
| d | The interpolation weight applied to every active channel. |
| channel_count | The number of channels. |
| active_channel_count | The number of channels that carry a filter, counted from the last channel. Zero means every channel. |