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>
79template <
typename SampleType>
83 s.fill (SampleType (0));
85 cutoffTransformSmoother.setCurrentAndTargetValue (cutoffTransformSmoother.getTargetValue());
86 scaledResonanceSmoother.setCurrentAndTargetValue (scaledResonanceSmoother.getTargetValue());
90template <
typename SampleType>
93 jassert (newCutoff > SampleType (0));
94 cutoffFreqHz = newCutoff;
99template <
typename SampleType>
102 jassert (newResonance >= SampleType (0) && newResonance <= SampleType (1));
103 resonance = newResonance;
108template <
typename SampleType>
111 jassert (newDrive >= SampleType (1));
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>
123 auto& s = state[channelToUse];
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));
162 static constexpr SampleType smootherRampTimeSec = SampleType (0.05);
163 cutoffTransformSmoother.reset (newValue, smootherRampTimeSec);
164 scaledResonanceSmoother.reset (newValue, smootherRampTimeSec);
170template class LadderFilter<float>;
171template class LadderFilter<double>;
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.
Commonly used mathematical constants.
This structure is passed into a DSP algorithm's prepare() method, and contains information about vari...
uint32 numChannels
The number of channels that the process() method will be expected to handle.
double sampleRate
The sample rate that will be used for the data that is sent to the processor.