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:
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);