Vital
Loading...
Searching...
No Matches
dirty_filter.h
Go to the documentation of this file.
1#pragma once
2
3#include "processor.h"
4#include "synth_filter.h"
5
6#include "futils.h"
7#include "one_pole_filter.h"
8
9namespace vital {
10
30 class DirtyFilter : public Processor, public SynthFilter {
31 public:
33 static constexpr mono_float kMinResonance = 0.1f;
35 static constexpr mono_float kMaxResonance = 2.15f;
37 static constexpr mono_float kSaturationBoost = 1.4f;
39 static constexpr mono_float kMaxVisibleResonance = 2.0f;
41 static constexpr mono_float kDriveResonanceBoost = 0.05f;
42
44 static constexpr mono_float kMinCutoff = 1.0f;
46 static constexpr mono_float kMinDrive = 0.1f;
47
49 static constexpr mono_float kFlatResonance = 1.0f;
50
59 return resonance / utils::max(1.0f, coefficient * 0.25f + 0.97f);
60 }
61
66 virtual ~DirtyFilter() { }
67
68 Processor* clone() const override { return new DirtyFilter(*this); }
69
77 virtual void process(int num_samples) override;
78
84 void setupFilter(const FilterState& filter_state) override;
85
98 void process12(int num_samples, poly_float current_resonance,
99 poly_float current_drive, poly_float current_drive_boost, poly_float current_drive_blend,
100 poly_float current_low, poly_float current_band, poly_float current_high);
101
105 void process24(int num_samples, poly_float current_resonance,
106 poly_float current_drive, poly_float current_drive_boost, poly_float current_drive_blend,
107 poly_float current_low, poly_float current_band, poly_float current_high);
108
112 void processDual(int num_samples, poly_float current_resonance,
113 poly_float current_drive, poly_float current_drive_boost,
114 poly_float current_drive_blend, poly_float current_drive_mult,
115 poly_float current_low, poly_float current_high);
116
121 poly_float coefficient, poly_float resonance,
122 poly_float drive, poly_float feed_mult, poly_float normalizer,
123 poly_float pre_feedback_mult, poly_float pre_normalizer,
124 poly_float low, poly_float band, poly_float high);
125
130 poly_float coefficient, poly_float resonance,
131 poly_float drive, poly_float feed_mult, poly_float normalizer,
132 poly_float pre_feedback_mult, poly_float pre_normalizer,
133 poly_float low, poly_float high);
134
139 poly_float coefficient, poly_float resonance,
140 poly_float drive, poly_float feed_mult, poly_float normalizer,
141 poly_float low, poly_float band, poly_float high);
142
148 void reset(poly_mask reset_mask) override;
149
153 void hardReset() override;
154
159 poly_float resonance_in = utils::clamp(tuneResonance(resonance_, coefficient_ * 2.0f), 0.0f, 1.0f);
160 return utils::interpolate(kMinResonance, kMaxResonance, resonance_in) + drive_boost_;
161 }
162
168 poly_float scaled_drive = utils::max(poly_float(kMinDrive), drive_) / (resonance * resonance * 0.5f + 1.0f);
169 return utils::interpolate(drive_, scaled_drive, drive_blend_);
170 }
171
175 force_inline poly_float getLowAmount() { return low_pass_amount_; }
176
180 force_inline poly_float getBandAmount() { return band_pass_amount_; }
181
185 force_inline poly_float getHighAmount() { return high_pass_amount_; }
186
191 if (style == kDualNotchBand)
192 return high_pass_amount_;
193 return low_pass_amount_;
194 }
195
200 if (style == kDualNotchBand)
201 return low_pass_amount_;
202 return high_pass_amount_;
203 }
204
205 private:
206 poly_float coefficient_, resonance_;
207 poly_float drive_, drive_boost_, drive_blend_, drive_mult_;
208
209 poly_float low_pass_amount_;
210 poly_float band_pass_amount_;
211 poly_float high_pass_amount_;
212
213 OnePoleFilter<> pre_stage1_;
214 OnePoleFilter<> pre_stage2_;
215 OnePoleFilter<> stage1_;
216 OnePoleFilter<> stage2_;
219
220 JUCE_LEAK_DETECTOR(DirtyFilter)
221 };
222} // namespace vital
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 getBandAmount()
Gets the band-pass blend amount.
Definition dirty_filter.h:180
static constexpr mono_float kMinCutoff
Minimum cutoff frequency in Hz.
Definition dirty_filter.h:44
virtual ~DirtyFilter()
Definition dirty_filter.h:66
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 getLowAmount()
Gets the low-pass blend amount.
Definition dirty_filter.h:175
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
force_inline poly_float getResonance()
Gets the current resonance value adjusted by coefficient and drive.
Definition dirty_filter.h:158
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
force_inline poly_float getDrive()
Gets the current drive value adjusted based on resonance.
Definition dirty_filter.h:166
static constexpr mono_float kMaxVisibleResonance
Maximum visible resonance value.
Definition dirty_filter.h:39
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 getLowAmount24(int style)
For 24 dB mode, gets the low amount depending on filter style.
Definition dirty_filter.h:190
Processor * clone() const override
Clones this Processor for polyphonic expansion. Must be overridden by subclasses.
Definition dirty_filter.h:68
force_inline poly_float getHighAmount()
Gets the high-pass blend amount.
Definition dirty_filter.h:185
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
force_inline poly_float getHighAmount24(int style)
For 24 dB mode, gets the high amount depending on filter style.
Definition dirty_filter.h:199
DirtyFilter()
Constructs a DirtyFilter with default parameters.
Definition dirty_filter.cpp:9
A one-pole filter implementation with optional nonlinear saturation.
Definition one_pole_filter.h:22
Base class for all signal-processing units in Vital.
Definition processor.h:212
Abstract base class for Vital’s synthesizer filters.
Definition synth_filter.h:19
@ kDualNotchBand
Definition synth_filter.h:78
#define force_inline
Definition common.h:23
cr::Value resonance
Resonance factor for this formant.
Definition formant_filter.cpp:18
Contains faster but less accurate versions of utility math functions, such as exponential,...
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 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 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
Declares the Processor class and related structures for handling audio processing in a polyphonic con...
Represents a vector of floating-point values using SIMD instructions.
Definition poly_values.h:600
Represents a vector of integer values using SIMD instructions.
Definition poly_values.h:56