BogaudioModules

BogaudioModules for VCV Rack
Log | Files | Refs | README | LICENSE

commit 27fa5be6e4692a794ab9c2437c74d33b9f3b72a6
parent 6b8f71ce7de2ba5c05ba3ca20dcf240e6e421118
Author: Matt Demanett <matt@demanett.net>
Date:   Wed, 18 Mar 2020 00:26:23 -0400

(L)VCF: fix max frequency.

Diffstat:
Msrc/LVCF.cpp | 16+++-------------
Msrc/LVCF.hpp | 5+++--
Msrc/VCF.cpp | 6+++---
Msrc/VCF.hpp | 4+++-
4 files changed, 12 insertions(+), 19 deletions(-)

diff --git a/src/LVCF.cpp b/src/LVCF.cpp @@ -28,7 +28,7 @@ void LVCF::Engine::setParams( void LVCF::Engine::sampleRateChange(int modulationSteps) { _sampleRate = APP->engine->getSampleRate(); - _frequencySL.setParams(_sampleRate, 100.0f / (float)modulationSteps, frequencyToSemitone(MultimodeFilter::maxFrequency - MultimodeFilter::minFrequency)); + _frequencySL.setParams(_sampleRate, 100.0f / (float)modulationSteps, frequencyToSemitone(maxFrequency - minFrequency)); _finalHP.setParams(_sampleRate, MultimodeFilter::BUTTERWORTH_TYPE, 2, MultimodeFilter::HIGHPASS_MODE, 80.0f, MultimodeFilter::minQbw); } @@ -124,18 +124,8 @@ void LVCF::modulateChannel(int c) { fcv *= clamp(params[FREQUENCY_CV_PARAM].getValue(), -1.0f, 1.0f); f = std::max(0.0f, f + fcv); } - f *= MultimodeFilter::maxFrequency; - const float lowThreshold = 100.0f; - if (f < lowThreshold) { - float deltaF = std::max(1.0f, _lastFrequency) / MultimodeFilter::maxFrequency; - deltaF = std::pow(deltaF, 1.5f); - deltaF *= std::max(5.0f, 0.5f * MultimodeFilter::maxFrequency); - f = std::max(_lastFrequency - deltaF, f); - - q = std::min(f / lowThreshold, q); - } - _lastFrequency = f; - f = clamp(f, MultimodeFilter::minFrequency, MultimodeFilter::maxFrequency); + f *= maxFrequency; + f = clamp(f, minFrequency, maxFrequency); e.setParams( _poles, diff --git a/src/LVCF.hpp b/src/LVCF.hpp @@ -59,17 +59,18 @@ struct LVCF : BGModule { float next(float sample); }; + static constexpr float maxFrequency = 20000.0f; + static constexpr float minFrequency = MultimodeFilter::minFrequency; MultimodeFilter::Mode _mode = MultimodeFilter::UNKNOWN_MODE; int _polesSetting = 4; int _poles = 0; float _q = 0.0f; MultimodeFilter::BandwidthMode _bandwidthMode = MultimodeFilter::PITCH_BANDWIDTH_MODE; Engine* _engines[maxChannels]; - float _lastFrequency = 0.0f; LVCF() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); - configParam<ScaledSquaringParamQuantity<(int)MultimodeFilter::maxFrequency>>(FREQUENCY_PARAM, 0.0f, 1.0f, 0.21822f, "Center/cutoff frequency", " HZ"); + configParam<ScaledSquaringParamQuantity<(int)maxFrequency>>(FREQUENCY_PARAM, 0.0f, 1.0f, 0.22361f, "Center/cutoff frequency", " HZ"); configParam(FREQUENCY_CV_PARAM, -1.0f, 1.0f, 0.0f, "Frequency CV attenuation", "%", 0.0f, 100.0f); configParam(Q_PARAM, 0.0f, 1.0f, 0.0f, "Resonance / bandwidth", "%", 0.0f, 100.0f); configParam(MODE_PARAM, 0.0f, 3.0f, 0.0f, "Mode"); diff --git a/src/VCF.cpp b/src/VCF.cpp @@ -50,7 +50,7 @@ void VCF::Engine::setParams( void VCF::Engine::sampleRateChange(int modulationSteps) { _sampleRate = APP->engine->getSampleRate(); - _frequencySL.setParams(_sampleRate, 100.0f / (float)modulationSteps, frequencyToSemitone(MultimodeFilter::maxFrequency - MultimodeFilter::minFrequency)); + _frequencySL.setParams(_sampleRate, 100.0f / (float)modulationSteps, frequencyToSemitone(maxFrequency - minFrequency)); _finalHP.setParams(_sampleRate, MultimodeFilter::BUTTERWORTH_TYPE, 2, MultimodeFilter::HIGHPASS_MODE, 80.0f, MultimodeFilter::minQbw); for (int i = 0; i < nFilters; ++i) { _gainSLs[i].setParams(_sampleRate, 50.0f, 1.0f); @@ -156,7 +156,7 @@ void VCF::modulateChannel(int c) { fcv *= clamp(params[FREQUENCY_CV_PARAM].getValue(), -1.0f, 1.0f); f = std::max(0.0f, f + fcv); } - f *= MultimodeFilter::maxFrequency; + f *= maxFrequency; if (inputs[PITCH_INPUT].isConnected() || inputs[FM_INPUT].isConnected()) { float fm = inputs[FM_INPUT].getPolyVoltage(c); fm *= clamp(params[FM_PARAM].getValue(), 0.0f, 1.0f); @@ -164,7 +164,7 @@ void VCF::modulateChannel(int c) { pitch += fm; f += cvToFrequency(pitch); } - f = clamp(f, MultimodeFilter::minFrequency, MultimodeFilter::maxFrequency); + f = clamp(f, minFrequency, maxFrequency); e.setParams( slope, diff --git a/src/VCF.hpp b/src/VCF.hpp @@ -63,13 +63,15 @@ struct VCF : BGModule { float next(float sample); }; + static constexpr float maxFrequency = 20000.0f; + static constexpr float minFrequency = MultimodeFilter::minFrequency; MultimodeFilter::Mode _mode = MultimodeFilter::UNKNOWN_MODE; MultimodeFilter::BandwidthMode _bandwidthMode = MultimodeFilter::PITCH_BANDWIDTH_MODE; Engine* _engines[maxChannels] {}; VCF() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); - configParam<ScaledSquaringParamQuantity<(int)MultimodeFilter::maxFrequency>>(FREQUENCY_PARAM, 0.0f, 1.0f, 0.21822f, "Center/cutoff frequency", " HZ"); + configParam<ScaledSquaringParamQuantity<(int)maxFrequency>>(FREQUENCY_PARAM, 0.0f, 1.0f, 0.22361f, "Center/cutoff frequency", " HZ"); configParam(FREQUENCY_CV_PARAM, -1.0f, 1.0f, 0.0f, "Frequency CV attenuation", "%", 0.0f, 100.0f); configParam(FM_PARAM, 0.0f, 1.0f, 0.0f, "FM", "%", 0.0f, 100.0f); configParam(Q_PARAM, 0.0f, 1.0f, 0.0f, "Resonance / bandwidth", "%", 0.0f, 100.0f);