VCF.hpp (2983B)
1 #pragma once 2 3 #include "bogaudio.hpp" 4 #include "dsp/filters/multimode.hpp" 5 #include "dsp/signal.hpp" 6 7 using namespace bogaudio::dsp; 8 9 extern Model* modelVCF; 10 11 namespace bogaudio { 12 13 struct VCF : BGModule { 14 enum ParamsIds { 15 FREQUENCY_PARAM, 16 FREQUENCY_CV_PARAM, 17 FM_PARAM, 18 Q_PARAM, 19 MODE_PARAM, 20 SLOPE_PARAM, 21 NUM_PARAMS 22 }; 23 24 enum InputsIds { 25 FREQUENCY_CV_INPUT, 26 FM_INPUT, 27 PITCH_INPUT, 28 IN_INPUT, 29 Q_INPUT, 30 SLOPE_INPUT, 31 NUM_INPUTS 32 }; 33 34 enum OutputsIds { 35 OUT_OUTPUT, 36 NUM_OUTPUTS 37 }; 38 39 struct Engine { 40 static constexpr int maxPoles = 12; 41 static constexpr int minPoles = 1; 42 static constexpr int nFilters = maxPoles; 43 MultimodeFilter16 _filters[nFilters]; 44 float _gains[nFilters] {}; 45 bogaudio::dsp::SlewLimiter _gainSLs[nFilters]; 46 float _sampleRate; 47 bogaudio::dsp::SlewLimiter _frequencySL; 48 MultimodeFilter4 _finalHP; 49 50 Engine() { 51 sampleRateChange(); 52 } 53 54 void setParams( 55 float slope, 56 MultimodeFilter::Mode mode, 57 float frequency, 58 float qbw, 59 MultimodeFilter::BandwidthMode bwm 60 ); 61 void reset(); 62 void sampleRateChange(); 63 float next(float sample); 64 }; 65 66 static constexpr float maxFrequency = 20000.0f; 67 static constexpr float minFrequency = MultimodeFilter::minFrequency; 68 MultimodeFilter::Mode _mode = MultimodeFilter::UNKNOWN_MODE; 69 MultimodeFilter::BandwidthMode _bandwidthMode = MultimodeFilter::PITCH_BANDWIDTH_MODE; 70 Engine* _engines[maxChannels] {}; 71 72 VCF() { 73 config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS); 74 configParam<ScaledSquaringParamQuantity<(int)maxFrequency>>(FREQUENCY_PARAM, 0.0f, 1.0f, 0.22361f, "Center/cutoff frequency", " HZ"); 75 configParam(FREQUENCY_CV_PARAM, -1.0f, 1.0f, 0.0f, "Frequency CV attenuation", "%", 0.0f, 100.0f); 76 configParam(FM_PARAM, 0.0f, 1.0f, 0.0f, "FM", "%", 0.0f, 100.0f); 77 configParam(Q_PARAM, 0.0f, 1.0f, 0.0f, "Resonance / bandwidth", "%", 0.0f, 100.0f); 78 configSwitch(MODE_PARAM, 0.0f, 3.0f, 0.0f, "Mode", {"Lowpass", "Highpass", "Bandpass", "Band reject"}); 79 paramQuantities[MODE_PARAM]->snapEnabled = true; 80 configParam<ScaledSquaringParamQuantity<Engine::maxPoles - Engine::minPoles>>(SLOPE_PARAM, 0.0f, 1.0f, 0.522233f, "Slope", " poles", 0.0f, 1.0f, Engine::minPoles); 81 configBypass(IN_INPUT, OUT_OUTPUT); 82 83 configInput(FREQUENCY_CV_INPUT, "Cutoff CV"); 84 configInput(FM_INPUT, "Cutoff FM"); 85 configInput(PITCH_INPUT, "Cutoff pitch (1V/octave)"); 86 configInput(IN_INPUT, "Signal"); 87 configInput(Q_INPUT, "Resonance CV"); 88 configInput(SLOPE_INPUT, "Slope CV"); 89 90 configOutput(OUT_OUTPUT, "Signal"); 91 } 92 93 json_t* saveToJson(json_t* root) override; 94 void loadFromJson(json_t* root) override; 95 void sampleRateChange() override; 96 bool active() override; 97 int channels() override; 98 void addChannel(int c) override; 99 void removeChannel(int c) override; 100 void modulate() override; 101 void modulateChannel(int c) override; 102 void processAll(const ProcessArgs& args) override; 103 void processChannel(const ProcessArgs& args, int c) override; 104 }; 105 106 } // namespace bogaudio