|
- #pragma once
-
- #include "util/math.hpp"
-
-
- namespace rack {
-
- struct RCFilter {
- float c = 0.0;
- float xstate[1] = {};
- float ystate[1] = {};
-
- // `r` is the ratio between the cutoff frequency and sample rate, i.e. r = f_c / f_s
- void setCutoff(float r) {
- c = 2.0 / r;
- }
- void process(float x) {
- float y = (x + xstate[0] - ystate[0] * (1 - c)) / (1 + c);
- xstate[0] = x;
- ystate[0] = y;
- }
- float lowpass() {
- return ystate[0];
- }
- float highpass() {
- return xstate[0] - ystate[0];
- }
- };
-
-
- struct PeakFilter {
- float state = 0.0;
- float c = 0.0;
-
- /** Rate is lambda / sampleRate */
- void setRate(float r) {
- c = 1.0 - r;
- }
- void process(float x) {
- if (x > state)
- state = x;
- state *= c;
- }
- float peak() {
- return state;
- }
- };
-
-
- struct SlewLimiter {
- float rise = 1.0;
- float fall = 1.0;
- float out = 0.0;
-
- void setRiseFall(float _rise, float _fall) {
- rise = _rise;
- fall = _fall;
- }
- float process(float in) {
- float delta = clamp(in - out, -fall, rise);
- out += delta;
- return out;
- }
- };
-
-
- } // namespace rack
|