50 q31_t configure(q31_t frequency, q31_t resonance, FilterMode lpfMode, q31_t lpfMorph, q31_t filterGain) {
53 return static_cast<T*
>(
this)->setConfig(frequency, resonance, lpfMode, lshiftAndSaturate<2>(lpfMorph),
64 if (dryFade < 0.001) {
65 static_cast<T*
>(
this)->doFilter(buffer);
69 memcpy(blendBuffer.data(), buffer.data(), buffer.size_bytes());
70 static_cast<T*
>(
this)->doFilter(buffer);
72 std::span mono_blend_buffer{
reinterpret_cast<q31_t*
>(blendBuffer.data()), buffer.size()};
74 for (
auto [dry, wet] : std::views::zip(mono_blend_buffer, buffer)) {
75 wet = multiply_32x32_rshift32(wet, wetLevel);
76 wet = multiply_accumulate_32x32_rshift32_rounded(wet, dry, ONE_Q31 - wetLevel) << 1;
88 if (dryFade < 0.001) {
89 static_cast<T*
>(
this)->doFilterStereo(buffer);
92 memcpy(blendBuffer.data(), buffer.data(), buffer.size_bytes());
93 static_cast<T*
>(
this)->doFilterStereo(buffer);
95 for (
auto [dry, wet] : std::views::zip(blendBuffer, buffer)) {
96 wet.l = multiply_32x32_rshift32(wet.l, wetLevel);
97 wet.l = multiply_accumulate_32x32_rshift32_rounded(wet.l, dry.l, ONE_Q31 - wetLevel) << 1;
98 wet.r = multiply_32x32_rshift32(wet.r, wetLevel);
99 wet.r = multiply_accumulate_32x32_rshift32_rounded(wet.r, dry.r, ONE_Q31 - wetLevel) << 1;
127 tannedFrequency = instantTan(lshiftAndSaturate<5>(frequency));
131 divideBy1PlusTannedFrequency = (q31_t)(288230376151711744.0 / (
double)(ONE_Q16 + (tannedFrequency >> 1)));
132 fc = multiply_32x32_rshift32_rounded(tannedFrequency, divideBy1PlusTannedFrequency) << 4;