BogaudioModules

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

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