81 void reset(
int periodSamples)
noexcept {
82 for (
auto& stage : m_stages) {
83 stage.reset(periodSamples);
92 void reset(
double sampleRate,
double timeMs)
noexcept {
93 for (
auto& stage : m_stages) {
94 stage.reset(sampleRate, timeMs);
104 assert(stage < NumStages);
105 m_stages[stage].setCurrentAndTargetCoeffs(
target);
114 assert(stage < NumStages);
115 m_stages[stage].setTargetCoeffs(
target);
124 assert(stage < NumStages);
125 return m_stages[stage].current();
134 assert(stage < NumStages);
135 return m_stages[stage].target();
141 for (
auto& stage : m_stages) {
147 class CoeffSmoothingStage final {
149 void reset(
int periodSamples)
noexcept {
150 for (
auto& s : m_smoothers) {
151 s.reset(periodSamples);
155 void reset(
double sampleRate,
double timeMs)
noexcept {
156 for (
auto& s : m_smoothers) {
157 s.reset(sampleRate, timeMs);
161 void setCurrentAndTargetCoeffs(BiquadCoefficients<SampleType> newCoeffs)
noexcept {
162 m_smoothers[0].setCurrentAndTargetValue(newCoeffs.a0);
163 m_smoothers[1].setCurrentAndTargetValue(newCoeffs.a1);
164 m_smoothers[2].setCurrentAndTargetValue(newCoeffs.a2);
165 m_smoothers[3].setCurrentAndTargetValue(newCoeffs.b0);
166 m_smoothers[4].setCurrentAndTargetValue(newCoeffs.b1);
167 m_smoothers[5].setCurrentAndTargetValue(newCoeffs.b2);
168 m_current = newCoeffs;
171 void setTargetCoeffs(BiquadCoefficients<SampleType> newCoeffs)
noexcept {
172 m_smoothers[0].setTargetValue(newCoeffs.a0);
173 m_smoothers[1].setTargetValue(newCoeffs.a1);
174 m_smoothers[2].setTargetValue(newCoeffs.a2);
175 m_smoothers[3].setTargetValue(newCoeffs.b0);
176 m_smoothers[4].setTargetValue(newCoeffs.b1);
177 m_smoothers[5].setTargetValue(newCoeffs.b2);
180 void interpolate() noexcept {
182 .a0 = m_smoothers[0](),
183 .a1 = m_smoothers[1](),
184 .a2 = m_smoothers[2](),
185 .b0 = m_smoothers[3](),
186 .b1 = m_smoothers[4](),
187 .b2 = m_smoothers[5]()
191 [[nodiscard]] BiquadCoefficients<SampleType> current() const noexcept {
195 [[nodiscard]] BiquadCoefficients<SampleType> target() const noexcept {
197 .a0 = m_smoothers[0].getTargetValue(),
198 .a1 = m_smoothers[1].getTargetValue(),
199 .a2 = m_smoothers[2].getTargetValue(),
200 .b0 = m_smoothers[3].getTargetValue(),
201 .b1 = m_smoothers[4].getTargetValue(),
202 .b2 = m_smoothers[5].getTargetValue()
207 std::array<marvin::utils::SmoothedValue<SampleType, InterpolationType>, 6> m_smoothers;
208 BiquadCoefficients<SampleType> m_current{};
211 std::array<CoeffSmoothingStage, NumStages> m_stages;