LMMS
Loading...
Searching...
No Matches
juce_LadderFilter.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28namespace dsp
29{
30
31//==============================================================================
32template <typename SampleType>
34{
35 setSampleRate (SampleType (1000)); // intentionally setting unrealistic default
36 // sample rate to catch missing initialisation bugs
37 setResonance (SampleType (0));
38 setDrive (SampleType (1.2));
39
40 mode = Mode::LPF24;
41 setMode (Mode::LPF12);
42}
43
44//==============================================================================
45template <typename SampleType>
47{
48 if (newMode == mode)
49 return;
50
51 switch (newMode)
52 {
53 case Mode::LPF12: A = {{ SampleType (0), SampleType (0), SampleType (1), SampleType (0), SampleType (0) }}; comp = SampleType (0.5); break;
54 case Mode::HPF12: A = {{ SampleType (1), SampleType (-2), SampleType (1), SampleType (0), SampleType (0) }}; comp = SampleType (0); break;
55 case Mode::BPF12: A = {{ SampleType (0), SampleType (0), SampleType (-1), SampleType (1), SampleType (0) }}; comp = SampleType (0.5); break;
56 case Mode::LPF24: A = {{ SampleType (0), SampleType (0), SampleType (0), SampleType (0), SampleType (1) }}; comp = SampleType (0.5); break;
57 case Mode::HPF24: A = {{ SampleType (1), SampleType (-4), SampleType (6), SampleType (-4), SampleType (1) }}; comp = SampleType (0); break;
58 case Mode::BPF24: A = {{ SampleType (0), SampleType (0), SampleType (1), SampleType (-2), SampleType (1) }}; comp = SampleType (0.5); break;
59 default: jassertfalse; break;
60 }
61
62 static constexpr auto outputGain = SampleType (1.2);
63
64 for (auto& a : A)
65 a *= outputGain;
66
67 mode = newMode;
68 reset();
69}
70
71//==============================================================================
72template <typename SampleType>
74{
75 setSampleRate (SampleType (spec.sampleRate));
77 reset();
78}
79
80//==============================================================================
81template <typename SampleType>
83{
84 for (auto& s : state)
85 s.fill (SampleType (0));
86
87 cutoffTransformSmoother.setCurrentAndTargetValue (cutoffTransformSmoother.getTargetValue());
88 scaledResonanceSmoother.setCurrentAndTargetValue (scaledResonanceSmoother.getTargetValue());
89}
90
91//==============================================================================
92template <typename SampleType>
93void LadderFilter<SampleType>::setCutoffFrequencyHz (SampleType newCutoff) noexcept
94{
95 jassert (newCutoff > SampleType (0));
96 cutoffFreqHz = newCutoff;
98}
99
100//==============================================================================
101template <typename SampleType>
102void LadderFilter<SampleType>::setResonance (SampleType newResonance) noexcept
103{
104 jassert (newResonance >= SampleType (0) && newResonance <= SampleType (1));
105 resonance = newResonance;
107}
108
109//==============================================================================
110template <typename SampleType>
111void LadderFilter<SampleType>::setDrive (SampleType newDrive) noexcept
112{
113 jassert (newDrive >= SampleType (1));
114
115 drive = newDrive;
116 gain = std::pow (drive, SampleType (-2.642)) * SampleType (0.6103) + SampleType (0.3903);
117 drive2 = drive * SampleType (0.04) + SampleType (0.96);
118 gain2 = std::pow (drive2, SampleType (-2.642)) * SampleType (0.6103) + SampleType (0.3903);
119}
120
121//==============================================================================
122template <typename SampleType>
123SampleType LadderFilter<SampleType>::processSample (SampleType inputValue, size_t channelToUse) noexcept
124{
125 auto& s = state[channelToUse];
126
127 const auto a1 = cutoffTransformValue;
128 const auto g = a1 * SampleType (-1) + SampleType (1);
129 const auto b0 = g * SampleType (0.76923076923);
130 const auto b1 = g * SampleType (0.23076923076);
131
132 const auto dx = gain * saturationLUT (drive * inputValue);
133 const auto a = dx + scaledResonanceValue * SampleType (-4) * (gain2 * saturationLUT (drive2 * s[4]) - dx * comp);
134
135 const auto b = b1 * s[0] + a1 * s[1] + b0 * a;
136 const auto c = b1 * s[1] + a1 * s[2] + b0 * b;
137 const auto d = b1 * s[2] + a1 * s[3] + b0 * c;
138 const auto e = b1 * s[3] + a1 * s[4] + b0 * d;
139
140 s[0] = a;
141 s[1] = b;
142 s[2] = c;
143 s[3] = d;
144 s[4] = e;
145
146 return a * A[0] + b * A[1] + c * A[2] + d * A[3] + e * A[4];
147}
148
149//==============================================================================
150template <typename SampleType>
156
157//==============================================================================
158template <typename SampleType>
159void LadderFilter<SampleType>::setSampleRate (SampleType newValue) noexcept
160{
161 jassert (newValue > SampleType (0));
162 cutoffFreqScaler = SampleType (-2.0 * juce::MathConstants<double>::pi) / newValue;
163
164 static constexpr SampleType smootherRampTimeSec = SampleType (0.05);
165 cutoffTransformSmoother.reset (newValue, smootherRampTimeSec);
166 scaledResonanceSmoother.reset (newValue, smootherRampTimeSec);
167
169}
170
171//==============================================================================
172template class LadderFilter<float>;
173template class LadderFilter<double>;
174
175} // namespace dsp
176} // namespace juce
#define noexcept
Definition DistrhoDefines.h:72
uint8_t a
Definition Spc_Cpu.h:141
Definition juce_LadderFilter.h:48
SampleType processSample(SampleType inputValue, size_t channelToUse) noexcept
Definition juce_LadderFilter.cpp:123
SampleType drive2
Definition juce_LadderFilter.h:131
SampleType drive
Definition juce_LadderFilter.h:131
SampleType gain
Definition juce_LadderFilter.h:131
LadderFilter()
Definition juce_LadderFilter.cpp:33
LookupTableTransform< SampleType > saturationLUT
Definition juce_LadderFilter.h:140
void setCutoffFrequencyHz(SampleType newCutoff) noexcept
Definition juce_LadderFilter.cpp:93
void prepare(const ProcessSpec &spec)
Definition juce_LadderFilter.cpp:73
void setSampleRate(SampleType newValue) noexcept
Definition juce_LadderFilter.cpp:159
void updateSmoothers() noexcept
Definition juce_LadderFilter.cpp:151
SmoothedValue< SampleType > cutoffTransformSmoother
Definition juce_LadderFilter.h:137
void setDrive(SampleType newDrive) noexcept
Definition juce_LadderFilter.cpp:111
Mode mode
Definition juce_LadderFilter.h:148
SampleType gain2
Definition juce_LadderFilter.h:131
void updateResonance() noexcept
Definition juce_LadderFilter.h:128
std::vector< std::array< SampleType, numStates > > state
Definition juce_LadderFilter.h:134
SampleType resonance
Definition juce_LadderFilter.h:144
SmoothedValue< SampleType > scaledResonanceSmoother
Definition juce_LadderFilter.h:137
void setMode(Mode newMode) noexcept
Definition juce_LadderFilter.cpp:46
SampleType cutoffFreqScaler
Definition juce_LadderFilter.h:146
void setNumChannels(size_t newValue)
Definition juce_LadderFilter.h:126
void reset() noexcept
Definition juce_LadderFilter.cpp:82
SampleType cutoffTransformValue
Definition juce_LadderFilter.h:138
void updateCutoffFreq() noexcept
Definition juce_LadderFilter.h:127
SampleType scaledResonanceValue
Definition juce_LadderFilter.h:138
LadderFilterMode Mode
Definition juce_LadderFilter.h:51
SampleType comp
Definition juce_LadderFilter.h:131
SampleType cutoffFreqHz
Definition juce_LadderFilter.h:143
std::array< SampleType, numStates > A
Definition juce_LadderFilter.h:135
void setResonance(SampleType newResonance) noexcept
Definition juce_LadderFilter.cpp:102
* e
Definition inflate.c:1404
unsigned d
Definition inflate.c:940
int g
Definition inflate.c:1573
unsigned s
Definition inflate.c:1555
virtual ASIOError setSampleRate(ASIOSampleRate sampleRate)=0
#define jassert(expression)
#define jassertfalse
Definition juce_AudioBlock.h:29
Definition carla_juce.cpp:31
static const SPFLOAT outputGain
Definition revsc.c:50
Definition juce_ProcessContext.h:38
uint32 numChannels
Definition juce_ProcessContext.h:46
double sampleRate
Definition juce_ProcessContext.h:40
return c
Definition crypt.c:175
b
Definition crypt.c:628