30template <
typename SampleType>
33 setSampleRate (SampleType (1000));
43template <
typename SampleType>
51 case Mode::LPF12: A = {{ SampleType (0), SampleType (0), SampleType (1), SampleType (0), SampleType (0) }}; comp = SampleType (0.5);
break;
52 case Mode::HPF12: A = {{ SampleType (1), SampleType (-2), SampleType (1), SampleType (0), SampleType (0) }}; comp = SampleType (0);
break;
53 case Mode::BPF12: A = {{ SampleType (0), SampleType (0), SampleType (-1), SampleType (1), SampleType (0) }}; comp = SampleType (0.5);
break;
54 case Mode::LPF24: A = {{ SampleType (0), SampleType (0), SampleType (0), SampleType (0), SampleType (1) }}; comp = SampleType (0.5);
break;
55 case Mode::HPF24: A = {{ SampleType (1), SampleType (-4), SampleType (6), SampleType (-4), SampleType (1) }}; comp = SampleType (0);
break;
56 case Mode::BPF24: A = {{ SampleType (0), SampleType (0), SampleType (1), SampleType (-2), SampleType (1) }}; comp = SampleType (0.5);
break;
60 static constexpr auto outputGain = SampleType (1.2);
70template <
typename SampleType>
73 setSampleRate (SampleType (
spec.sampleRate));
74 setNumChannels (
spec.numChannels);
79template <
typename SampleType>
83 s.fill (SampleType (0));
85 cutoffTransformSmoother.setCurrentAndTargetValue (cutoffTransformSmoother.getTargetValue());
86 scaledResonanceSmoother.setCurrentAndTargetValue (scaledResonanceSmoother.getTargetValue());
90template <
typename SampleType>
99template <
typename SampleType>
108template <
typename SampleType>
114 gain =
std::pow (drive, SampleType (-2.642)) * SampleType (0.6103) + SampleType (0.3903);
115 drive2 = drive * SampleType (0.04) + SampleType (0.96);
116 gain2 =
std::pow (drive2, SampleType (-2.642)) * SampleType (0.6103) + SampleType (0.3903);
120template <
typename SampleType>
125 const auto a1 = cutoffTransformValue;
126 const auto g =
a1 * SampleType (-1) + SampleType (1);
127 const auto b0 = g * SampleType (0.76923076923);
128 const auto b1 = g * SampleType (0.23076923076);
130 const auto dx = gain * saturationLUT (drive *
inputValue);
131 const auto a =
dx + scaledResonanceValue * SampleType (-4) * (gain2 * saturationLUT (drive2 * s[4]) -
dx * comp);
133 const auto b =
b1 * s[0] +
a1 * s[1] +
b0 * a;
134 const auto c =
b1 * s[1] +
a1 * s[2] +
b0 * b;
135 const auto d =
b1 * s[2] +
a1 * s[3] +
b0 * c;
136 const auto e =
b1 * s[3] +
a1 * s[4] +
b0 * d;
144 return a * A[0] + b * A[1] + c * A[2] + d * A[3] + e * A[4];
148template <
typename SampleType>
149void LadderFilter<SampleType>::updateSmoothers() noexcept
151 cutoffTransformValue = cutoffTransformSmoother.getNextValue();
152 scaledResonanceValue = scaledResonanceSmoother.getNextValue();
156template <
typename SampleType>
157void LadderFilter<SampleType>::setSampleRate (SampleType newValue)
noexcept
159 jassert (newValue > SampleType (0));
Multi-mode filter based on the Moog ladder filter.
LadderFilter()
Creates an uninitialised filter.
void setCutoffFrequencyHz(SampleType newCutoff) noexcept
Sets the cutoff frequency of the filter.
void prepare(const ProcessSpec &spec)
Initialises the filter.
void setDrive(SampleType newDrive) noexcept
Sets the amount of saturation in the filter.
void setMode(Mode newMode) noexcept
Sets filter mode.
void reset() noexcept
Resets the internal state variables of the filter.
void setResonance(SampleType newResonance) noexcept
Sets the resonance of the filter.
Type unalignedPointerCast(void *ptr) noexcept
Casts a pointer to another type via void*, which suppresses the cast-align warning which sometimes ar...
Commonly used mathematical constants.
This structure is passed into a DSP algorithm's prepare() method, and contains information about vari...