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;
57 default: jassertfalse;
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>;
void setCutoffFrequencyHz(SampleType newCutoff) noexcept
void prepare(const ProcessSpec &spec)
void setDrive(SampleType newDrive) noexcept
void setMode(Mode newMode) noexcept
void setResonance(SampleType newResonance) noexcept