Class thl::dsp::fx::StereoFDN#

class StereoFDN : public thl::dsp::BaseProcessor#

Inheritance diagram for thl::dsp::fx::StereoFDN:

digraph { graph [bgcolor="#00000000"] node [shape=rectangle style=filled fillcolor="#FFFFFF" font=Helvetica padding=2] edge [color="#1414CE"] "2" [label="thl::dsp::BaseProcessor" tooltip="thl::dsp::BaseProcessor"] "1" [label="thl::dsp::fx::StereoFDN" tooltip="thl::dsp::fx::StereoFDN" fillcolor="#BFBFBF"] "1" -> "2" [dir=forward tooltip="public-inheritance"] }

Collaboration diagram for thl::dsp::fx::StereoFDN:

digraph { graph [bgcolor="#00000000"] node [shape=rectangle style=filled fillcolor="#FFFFFF" font=Helvetica padding=2] edge [color="#1414CE"] "2" [label="thl::dsp::BaseProcessor" tooltip="thl::dsp::BaseProcessor"] "1" [label="thl::dsp::fx::StereoFDN" tooltip="thl::dsp::fx::StereoFDN" fillcolor="#BFBFBF"] "1" -> "2" [dir=forward tooltip="public-inheritance"] }

Minimal stereo feedback delay network.

This first version defaults to one delay line for the left channel and one delay line for the right channel, but the storage is parameterized by an equal number of delay lines per side:

s[n] = delayed x[n] x[n] = u[n] + feedback * A * s[n] y[n] = dry * u[n] + wet * s[n]

where A is currently a 2x2 stereo rotation over the per-channel line mix. Later versions can expand A into the full per-line block matrix.

Public Types

enum class MatrixKind#

Values:

enumerator Householder#
enumerator Circulant#
enumerator Triangular#
enumerator Hadamard#
enumerator Anderson#
enumerator Diagonal#
enumerator RandomOrthogonal#

Public Functions

explicit StereoFDN(size_t delay_lines_per_channel = 1)#
~StereoFDN() override#
StereoFDN(const StereoFDN&) = delete#
StereoFDN &operator=(const StereoFDN&) = delete#
StereoFDN(StereoFDN&&) noexcept#
StereoFDN &operator=(StereoFDN&&) noexcept#
virtual void prepare(const double &sample_rate, const size_t &samples_per_block, const size_t &num_channels) override#
virtual void process(thl::core::BufferView buffer, uint32_t modulation_offset = 0) override#
void reset()#
void set_delay_lines_per_channel(size_t delay_lines_per_channel)#
void set_delay_samples(size_t left_delay_samples, size_t right_delay_samples)#
void set_delay_sample(size_t channel, size_t line, size_t delay_samples)#
void set_delay_ms(float left_delay_ms, float right_delay_ms)#
void set_crossfade_samples(size_t crossfade_samples)#
void set_linear_smoothing_samples(size_t smoothing_samples)#
void set_base_time_ms(float base_time_ms)#
void set_delay_spread(float delay_spread)#
void set_feedback(float feedback)#
void set_damping(float damping)#
void set_cross_feedback(float cross_feedback)#
void set_input_pan(float input_pan)#
void set_matrix_kind(MatrixKind matrix_kind)#
void set_wet(float wet)#
void set_dry(float dry)#
inline size_t delay_lines_per_channel() const#
inline size_t total_delay_lines() const#
inline size_t left_delay_samples() const#
inline size_t right_delay_samples() const#
size_t delay_samples(size_t channel, size_t line) const#
inline size_t crossfade_samples() const#
inline size_t linear_smoothing_samples() const#
inline float base_time_ms() const#
inline float delay_spread() const#
inline float feedback() const#
inline float damping() const#
inline float cross_feedback() const#
inline float input_pan() const#
inline MatrixKind matrix_kind() const#
inline float wet() const#
inline float dry() const#

Public Static Attributes

static constexpr size_t k_left = 0#
static constexpr size_t k_right = 1#
static constexpr size_t k_num_audio_channels = 2#
static constexpr size_t k_num_channels = k_num_audio_channels#

Protected Types

enum Parameter#

Values:

enumerator BaseTimeMs#
enumerator DelaySpread#
enumerator Feedback#
enumerator Damping#
enumerator CrossFeedback#
enumerator InputPan#
enumerator MatrixKindParam#
enumerator Wet#
enumerator Dry#
enumerator NumParameters#

Protected Functions

template<typename T>
T get_parameter(Parameter p, uint32_t modulation_offset = 0)#
virtual float get_parameter_float(Parameter p, uint32_t modulation_offset = 0)#
virtual int get_parameter_int(Parameter p, uint32_t modulation_offset = 0)#
template<>
inline float get_parameter(Parameter p, uint32_t modulation_offset)#