commit 22df3b7e1afbe03176536209bd51905127c974f4
parent e281c970770c2c2ddb8880059caf323c4d195012
Author: Matt Demanett <matt@demanett.net>
Date: Sat, 6 Jun 2020 22:51:57 -0400
WALK, WALK2: fix stall at low rates when the sample rate is above 48k; fix them to seem to walk at the same rate regardless of sample rate. #120
Diffstat:
5 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/src/Test.cpp b/src/Test.cpp
@@ -13,9 +13,10 @@ void Test::processChannel(const ProcessArgs& args, int _c) {
if (!inputs[IN_INPUT].isConnected()) {
return;
}
+ float sr = APP->engine->getSampleRate();
_lpf.setParams(
- APP->engine->getSampleRate(),
- 10000.0 * clamp(params[PARAM1_PARAM].getValue(), 0.0f, 1.0f),
+ sr,
+ 0.49f * sr * clamp(params[PARAM1_PARAM].getValue(), 0.0f, 1.0f),
std::max(10.0 * clamp(params[PARAM2_PARAM].getValue(), 0.0f, 1.0f), 0.1)
);
outputs[OUT_OUTPUT].setVoltage(_lpf.next(inputs[IN_INPUT].getVoltage()));
diff --git a/src/Test.hpp b/src/Test.hpp
@@ -4,7 +4,7 @@
extern Model* modelTest;
-// #define LPF 1
+#define LPF 1
// #define LPFNOISE 1
// #define SINE 1
// #define SQUARE 1
@@ -29,7 +29,7 @@ extern Model* modelTest;
// #define SATURATOR 1
// #define BROWNIAN 1
// #define RANDOMWALK 1
-#define DCBLOCKER 1
+// #define DCBLOCKER 1
#include "pitch.hpp"
#ifdef LPF
diff --git a/src/dsp/filters/filter.cpp b/src/dsp/filters/filter.cpp
@@ -15,9 +15,9 @@ void LowPassFilter::setParams(float sampleRate, float cutoff, float q) {
_q = q;
// printf("\nLPF set param: sr=%f c=%f q=%f\n", _sampleRate, _cutoff, _q);
- float w0 = 2.0 * M_PI * _cutoff / _sampleRate;
- float cosw0 = cosf(w0);
- float alpha = sinf(w0) / (2.0 * _q);
+ double w0 = 2.0 * M_PI * (double)(_cutoff / _sampleRate);
+ double cosw0 = cos(w0);
+ double alpha = sin(w0) / (2.0 * _q);
_biquad.setParams(
(1.0 - cosw0) / 2.0,
diff --git a/src/dsp/filters/filter.hpp b/src/dsp/filters/filter.hpp
@@ -60,7 +60,7 @@ struct LowPassFilter : Filter {
float _cutoff = 0.0f;
float _q = 0.0f;
- BiquadFilter<float> _biquad;
+ BiquadFilter<double> _biquad; // double is necessary here to make low cutoffs work at high sample rates.
LowPassFilter(float sampleRate = 1000.0f, float cutoff = 100.0f, float q = 0.001f) {
setParams(sampleRate, cutoff, q);
diff --git a/src/dsp/noise.cpp b/src/dsp/noise.cpp
@@ -30,7 +30,7 @@ void RandomWalk::setParams(float sampleRate, float change) {
assert(change >= 0.0f);
assert(change <= 1.0f);
- _filter.setParams(sampleRate, std::max(2.0f, change * 0.49f * sampleRate));
+ _filter.setParams(sampleRate, std::max(2.0f, change * 0.49f * std::min(44100.0f, sampleRate)));
const float maxDamp = 0.98;
const float minDamp = 0.9999;