18 pre_stage1_.
reset(reset_mask);
19 pre_stage2_.
reset(reset_mask);
20 stage1_.
reset(reset_mask);
21 stage2_.
reset(reset_mask);
22 stage3_.
reset(reset_mask);
23 stage4_.
reset(reset_mask);
40 low_pass_amount_ = 0.0f;
41 band_pass_amount_ = 0.0f;
42 high_pass_amount_ = 0.0f;
75 current_resonance =
utils::maskLoad(current_resonance, resonance_, reset_mask);
77 current_drive_boost =
utils::maskLoad(current_drive_boost, drive_boost_, reset_mask);
78 current_drive_blend =
utils::maskLoad(current_drive_blend, drive_blend_, reset_mask);
79 current_drive_mult =
utils::maskLoad(current_drive_mult, drive_mult_, reset_mask);
80 current_low =
utils::maskLoad(current_low, low_pass_amount_, reset_mask);
81 current_band =
utils::maskLoad(current_band, band_pass_amount_, reset_mask);
82 current_high =
utils::maskLoad(current_high, high_pass_amount_, reset_mask);
141 mono_float tick_increment = 1.0f / num_samples;
142 poly_float delta_resonance = (resonance_ - current_resonance) * tick_increment;
143 poly_float delta_drive = (drive_ - current_drive) * tick_increment;
144 poly_float delta_drive_boost = (drive_boost_ - current_drive_boost) * tick_increment;
145 poly_float delta_drive_blend = (drive_blend_ - current_drive_blend) * tick_increment;
146 poly_float delta_low = (low_pass_amount_ - current_low) * tick_increment;
147 poly_float delta_band = (band_pass_amount_ - current_band) * tick_increment;
148 poly_float delta_high = (high_pass_amount_ - current_high) * tick_increment;
153 poly_float base_midi = midi_cutoff_buffer[num_samples - 1];
158 for (
int i = 0; i < num_samples; ++i) {
159 current_drive_boost += delta_drive_boost;
160 current_resonance += delta_resonance;
163 poly_float midi_delta = midi_cutoff_buffer[i] - base_midi;
169 poly_float coefficient_squared = coefficient * coefficient;
181 current_drive += delta_drive;
182 current_drive_blend += delta_drive_blend;
184 / (resonance_squared * 0.5f + 1.0f);
188 current_low += delta_low;
189 current_band += delta_band;
190 current_high += delta_high;
193 audio_out[i] =
tick(audio_in[i],
228 mono_float tick_increment = 1.0f / num_samples;
229 poly_float delta_resonance = (resonance_ - current_resonance) * tick_increment;
230 poly_float delta_drive = (drive_ - current_drive) * tick_increment;
231 poly_float delta_drive_boost = (drive_boost_ - current_drive_boost) * tick_increment;
232 poly_float delta_drive_blend = (drive_blend_ - current_drive_blend) * tick_increment;
233 poly_float delta_low = (low_pass_amount_ - current_low) * tick_increment;
234 poly_float delta_band = (band_pass_amount_ - current_band) * tick_increment;
235 poly_float delta_high = (high_pass_amount_ - current_high) * tick_increment;
240 poly_float base_midi = midi_cutoff_buffer[num_samples - 1];
245 for (
int i = 0; i < num_samples; ++i) {
246 current_drive_boost += delta_drive_boost;
247 current_resonance += delta_resonance;
250 poly_float midi_delta = midi_cutoff_buffer[i] - base_midi;
256 poly_float coefficient_squared = coefficient * coefficient;
264 poly_float coefficient_diff = coefficient_squared - coefficient;
267 poly_float pre_feedback = coefficient2 - coefficient_squared - 1.0f;
271 current_drive += delta_drive;
272 current_drive_blend += delta_drive_blend;
274 / (resonance_squared * 0.5f + 1.0f);
278 current_low += delta_low;
279 current_band += delta_band;
280 current_high += delta_high;
283 audio_out[i] =
tick24(audio_in[i],
320 mono_float tick_increment = 1.0f / num_samples;
321 poly_float delta_resonance = (resonance_ - current_resonance) * tick_increment;
322 poly_float delta_drive = (drive_ - current_drive) * tick_increment;
323 poly_float delta_drive_boost = (drive_boost_ - current_drive_boost) * tick_increment;
324 poly_float delta_drive_blend = (drive_blend_ - current_drive_blend) * tick_increment;
325 poly_float delta_drive_mult = (drive_mult_ - current_drive_mult) * tick_increment;
326 poly_float delta_low = (low_pass_amount_ - current_low) * tick_increment;
327 poly_float delta_high = (high_pass_amount_ - current_high) * tick_increment;
332 poly_float base_midi = midi_cutoff_buffer[num_samples - 1];
337 for (
int i = 0; i < num_samples; ++i) {
338 current_drive_boost += delta_drive_boost;
339 current_resonance += delta_resonance;
342 poly_float midi_delta = midi_cutoff_buffer[i] - base_midi;
348 poly_float coefficient_squared = coefficient * coefficient;
356 poly_float coefficient_diff = coefficient_squared - coefficient;
359 poly_float pre_feedback = coefficient2 - coefficient_squared - 1.0f;
363 current_drive += delta_drive;
364 current_drive_blend += delta_drive_blend;
365 current_drive_mult += delta_drive_mult;
367 / (resonance_squared * 0.5f + 1.0f);
371 current_low += delta_low;
372 current_high += delta_high;
375 audio_out[i] =
tickDual(audio_in[i],
397 static constexpr float kMaxMidi = 150.0f;
406 drive_ = (filter_state.
drive - 1.0f) * 2.0f + 1.0f;
419 drive_mult_ = -t + 2.0f;
421 low_pass_amount_ = t;
422 band_pass_amount_ = 0.0f;
423 high_pass_amount_ = 1.0f;
428 low_pass_amount_ =
utils::min(-blend + 1.0f, 1.0f);
429 band_pass_amount_ = 0.0f;
430 high_pass_amount_ =
utils::min(blend + 1.0f, 1.0f);
435 poly_float drive_inv_t = -drive_blend_ + 1.0f;
438 low_pass_amount_ = mult * (peak_band_value + 1.0f);
439 band_pass_amount_ = mult * (peak_band_value - blend + 1.0f) * 2.0f;
440 high_pass_amount_ = low_pass_amount_;
444 band_pass_amount_ =
utils::sqrt(-blend * blend + 1.0f);
446 low_pass_amount_ = (-blend) & blend_mask;
447 high_pass_amount_ = blend & ~blend_mask;
483 poly_float stage1_input = (audio_in - feedback) * pre_normalizer;
489 poly_float band_pass = stage1_out - stage2_out;
490 poly_float high_pass = stage1_input - stage1_out - band_pass;
492 poly_float pre_out = band * band_pass + high * high_pass + low * stage2_out;
495 return tick(pre_out, coefficient,
resonance, drive, feed_mult, normalizer, low, band, high);
528 poly_float stage1_input = (audio_in - feedback) * pre_normalizer;
534 poly_float band_pass = stage1_out - stage2_out;
535 poly_float high_pass = stage1_input - stage1_out - band_pass;
538 poly_float pre_out = low * high_pass + high * stage2_out;
541 return tick(pre_out, coefficient,
resonance, drive, feed_mult, normalizer, low, 0.0f, high);
572 poly_float band_pass = stage1_out - stage2_out;
573 poly_float high_pass = stage1_in - stage1_out - band_pass;
589 poly_float stage4_in = loop_input - stage3_out;
590 stage4_.
tick(stage4_in, coefficient);
A nonlinear filter that produces a "dirty" and saturated sound, ideal for adding character to the sig...
Definition dirty_filter.h:30
void process24(int num_samples, poly_float current_resonance, poly_float current_drive, poly_float current_drive_boost, poly_float current_drive_blend, poly_float current_low, poly_float current_band, poly_float current_high)
Processes the filter in 24 dB/oct mode.
Definition dirty_filter.cpp:216
force_inline poly_float tick(poly_float audio_in, poly_float coefficient, poly_float resonance, poly_float drive, poly_float feed_mult, poly_float normalizer, poly_float low, poly_float band, poly_float high)
Processes a single sample in 12 dB mode or as a part of other modes' chains.
Definition dirty_filter.cpp:557
static constexpr mono_float kMaxResonance
Maximum resonance factor.
Definition dirty_filter.h:35
force_inline poly_float tuneResonance(poly_float resonance, poly_float coefficient)
Tunes the resonance based on the filter coefficient.
Definition dirty_filter.h:58
static constexpr mono_float kSaturationBoost
Scaling factor applied during saturation.
Definition dirty_filter.h:37
void reset(poly_mask reset_mask) override
Resets the filter state for specific voices.
Definition dirty_filter.cpp:17
static constexpr mono_float kMinDrive
Minimum drive value.
Definition dirty_filter.h:46
static constexpr mono_float kMinResonance
Minimum resonance factor.
Definition dirty_filter.h:33
void setupFilter(const FilterState &filter_state) override
Sets up the filter's internal state (cutoff, resonance, drive, blend) from the given FilterState.
Definition dirty_filter.cpp:396
static constexpr mono_float kDriveResonanceBoost
Additional resonance boost when drive is applied.
Definition dirty_filter.h:41
static constexpr mono_float kFlatResonance
Flat resonance factor used internally.
Definition dirty_filter.h:49
force_inline poly_float tickDual(poly_float audio_in, poly_float coefficient, poly_float resonance, poly_float drive, poly_float feed_mult, poly_float normalizer, poly_float pre_feedback_mult, poly_float pre_normalizer, poly_float low, poly_float high)
Processes a single sample in dual mode.
Definition dirty_filter.cpp:512
void processDual(int num_samples, poly_float current_resonance, poly_float current_drive, poly_float current_drive_boost, poly_float current_drive_blend, poly_float current_drive_mult, poly_float current_low, poly_float current_high)
Processes the filter in dual (e.g., dual-notch band) mode.
Definition dirty_filter.cpp:308
force_inline poly_float tick24(poly_float audio_in, poly_float coefficient, poly_float resonance, poly_float drive, poly_float feed_mult, poly_float normalizer, poly_float pre_feedback_mult, poly_float pre_normalizer, poly_float low, poly_float band, poly_float high)
Processes a single sample in 24 dB mode with nonlinearities and drive.
Definition dirty_filter.cpp:466
virtual void process(int num_samples) override
Processes a block of audio samples.
Definition dirty_filter.cpp:52
void hardReset() override
Hard resets the filter, clearing all internal states.
Definition dirty_filter.cpp:32
void process12(int num_samples, poly_float current_resonance, poly_float current_drive, poly_float current_drive_boost, poly_float current_drive_blend, poly_float current_low, poly_float current_band, poly_float current_high)
Processes the filter in 12 dB/oct mode.
Definition dirty_filter.cpp:129
DirtyFilter()
Constructs a DirtyFilter with default parameters.
Definition dirty_filter.cpp:9
A one-dimensional lookup table for a given function with a specified resolution.
Definition lookup_table.h:31
force_inline poly_float cubicLookup(poly_float value) const
Performs a cubic interpolation lookup on the precomputed data.
Definition lookup_table.h:61
force_inline void reset(poly_mask reset_mask)
Resets the filter state for the voices indicated by a mask.
Definition one_pole_filter.h:36
force_inline poly_float getNextSatState()
Gets the next saturated filter state value.
Definition one_pole_filter.h:113
force_inline poly_float tick(poly_float audio_in, poly_float coefficient)
Processes a single sample, applying the saturation function at each step.
Definition one_pole_filter.h:73
force_inline poly_float tickBasic(poly_float audio_in, poly_float coefficient)
Processes a single sample in a basic (non-saturating) manner.
Definition one_pole_filter.h:56
Base class for all signal-processing units in Vital.
Definition processor.h:212
force_inline Input * input(unsigned int index=0) const
Retrieves the Input pointer at a given index.
Definition processor.h:587
force_inline int getSampleRate() const
Retrieves the current (effective) sample rate.
Definition processor.h:326
bool inputMatchesBufferSize(int input=0)
Checks whether the buffer size of a particular input matches the size needed by this Processor.
Definition processor.cpp:42
force_inline poly_mask getResetMask(int input_index) const
Retrieves a mask indicating which voices triggered a note-on event. Compares the input's trigger_valu...
Definition processor.h:360
force_inline Output * output(unsigned int index=0) const
Retrieves the Output pointer at a given index.
Definition processor.h:616
Holds the parameters necessary to configure a SynthFilter at runtime.
Definition synth_filter.h:92
void loadSettings(Processor *processor)
Loads state from a Processor’s input signals (MIDI cutoff, drive, style, etc.).
Definition synth_filter.cpp:30
const poly_float * midi_cutoff_buffer
Pointer to the buffer storing per-sample MIDI cutoff.
Definition synth_filter.h:111
poly_float drive_percent
Normalized drive parameter in [0..1].
Definition synth_filter.h:114
poly_float pass_blend
Blend parameter in [0..2], controlling pass type.
Definition synth_filter.h:117
poly_float drive
Drive in linear magnitude.
Definition synth_filter.h:113
int style
Filter style enum (e.g., k12Db, k24Db)
Definition synth_filter.h:116
poly_float midi_cutoff
MIDI note-based cutoff value.
Definition synth_filter.h:110
poly_float resonance_percent
Resonance parameter in [0..1].
Definition synth_filter.h:112
@ kReset
Reset signal.
Definition synth_filter.h:56
@ kAudio
Audio input index.
Definition synth_filter.h:55
FilterState filter_state_
Internal storage of the most recent FilterState, used by derived filters.
Definition synth_filter.h:151
static const CoefficientLookup * getCoefficientLookup()
Retrieves a pointer to the static coefficient lookup table.
Definition synth_filter.h:48
@ kBandPeakNotch
Definition synth_filter.h:79
@ kNotchPassSwap
Definition synth_filter.h:77
@ k12Db
Definition synth_filter.h:75
@ kDualNotchBand
Definition synth_filter.h:78
#define VITAL_ASSERT(x)
Definition common.h:11
#define force_inline
Definition common.h:23
Contains faster but less accurate versions of utility math functions, such as exponential,...
const poly_mask kFullMask
A mask covering all lanes of a poly_float vector.
Definition synth_constants.h:257
force_inline poly_float midiOffsetToRatio(poly_float note_offset)
Converts a MIDI note offset to a frequency ratio.
Definition futils.h:184
force_inline poly_float tanh(poly_float value)
Approximates tanh function using a complex polynomial.
Definition futils.h:347
force_inline poly_float clamp(poly_float value, mono_float min, mono_float max)
Clamps each lane of a vector to [min, max].
Definition poly_utils.h:306
force_inline poly_float mulAdd(poly_float a, poly_float b, poly_float c)
Performs a fused multiply-add on SIMD data: (a * b) + c.
Definition poly_utils.h:61
force_inline poly_float min(poly_float left, poly_float right)
Returns the minimum of two poly_floats lane-by-lane.
Definition poly_utils.h:334
force_inline poly_float max(poly_float left, poly_float right)
Returns the maximum of two poly_floats lane-by-lane.
Definition poly_utils.h:327
force_inline poly_float maskLoad(poly_float zero_value, poly_float one_value, poly_mask reset_mask)
Selects between two values (zero_value or one_value) based on a mask in each lane.
Definition poly_utils.h:351
force_inline poly_float midiNoteToFrequency(poly_float value)
Converts a MIDI note to a frequency (vectorized).
Definition poly_utils.h:123
force_inline poly_float sqrt(poly_float value)
Computes the square root of each element in a poly_float.
Definition poly_utils.h:169
force_inline poly_float interpolate(poly_float from, poly_float to, mono_float t)
Performs a linear interpolation between two poly_floats using a scalar t in [0..1].
Definition poly_utils.h:182
Contains classes and functions used within the Vital synthesizer framework.
float mono_float
Definition common.h:33
poly_float * buffer
Pointer to the output buffer.
Definition processor.h:110
Represents a vector of floating-point values using SIMD instructions.
Definition poly_values.h:600
static force_inline poly_mask vector_call lessThan(poly_float one, poly_float two)
Definition poly_values.h:1105
static force_inline simd_type vector_call min(simd_type one, simd_type two)
Returns the element-wise minimum of two SIMD float registers.
Definition poly_values.h:920
static force_inline simd_type vector_call abs(simd_type value)
Computes the absolute value of each element in the SIMD float register.
Definition poly_values.h:935
Represents a vector of integer values using SIMD instructions.
Definition poly_values.h:56
static force_inline uint32_t vector_call anyMask(simd_type value)
Returns a bitmask that indicates which bytes/elements in the register are non-zero.
Definition poly_values.h:352