BogaudioModules

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

ADSR.hpp (2049B)


      1 #pragma once
      2 
      3 #include "bogaudio.hpp"
      4 #include "dsp/envelope.hpp"
      5 
      6 extern Model* modelADSR;
      7 
      8 namespace bogaudio {
      9 
     10 struct ADSR : BGModule {
     11 	enum ParamsIds {
     12 		ATTACK_PARAM,
     13 		DECAY_PARAM,
     14 		SUSTAIN_PARAM,
     15 		RELEASE_PARAM,
     16 		LINEAR_PARAM,
     17 		NUM_PARAMS
     18 	};
     19 
     20 	enum InputsIds {
     21 		GATE_INPUT,
     22 		NUM_INPUTS
     23 	};
     24 
     25 	enum OutputsIds {
     26 		OUT_OUTPUT,
     27 		NUM_OUTPUTS
     28 	};
     29 
     30 	enum LightsIds {
     31 		ATTACK_LIGHT,
     32 		DECAY_LIGHT,
     33 		SUSTAIN_LIGHT,
     34 		RELEASE_LIGHT,
     35 		NUM_LIGHTS
     36 	};
     37 
     38 	struct Engine {
     39 		Trigger gateTrigger;
     40 		bogaudio::dsp::ADSR envelope;
     41 
     42 		Engine() {
     43 			reset();
     44 			sampleRateChange();
     45 			envelope.setSustain(0.0f);
     46 			envelope.setRelease(0.0f);
     47 		}
     48 		void reset();
     49 		void sampleRateChange();
     50 	};
     51 	Engine* _engines[maxChannels] {};
     52 	bool _linearMode = false;
     53 	int _attackLightSum;
     54 	int _decayLightSum;
     55 	int _sustainLightSum;
     56 	int _releaseLightSum;
     57 	float _invert = 1.0f;
     58 
     59 	ADSR() {
     60 		config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
     61 		configParam<EnvelopeSegmentParamQuantity>(ATTACK_PARAM, 0.0f, 1.0f, 0.141421f, "Attack", " s");
     62 		configParam<EnvelopeSegmentParamQuantity>(DECAY_PARAM, 0.0f, 1.0f, SQUARE_ROOT_ONE_TENTH, "Decay", " s");
     63 		configParam(SUSTAIN_PARAM, 0.0f, 1.0f, 1.0f, "Sustain", "%", 0.0f, 100.0f);
     64 		configParam<EnvelopeSegmentParamQuantity>(RELEASE_PARAM, 0.0f, 1.0f, SQUARE_ROOT_ONE_TENTH, "Release", " s");
     65 		configSwitch(LINEAR_PARAM, 0.0f, 1.0f, 0.0f, "Linear", {"Disabled (logarithmic)", "Enabled"});
     66 
     67 		configInput(GATE_INPUT, "Gate");
     68 
     69 		configOutput(OUT_OUTPUT, "Envelope");
     70 	}
     71 
     72 	void reset() override;
     73 	void sampleRateChange() override;
     74 	json_t* saveToJson(json_t* root) override;
     75 	void loadFromJson(json_t* root) override;
     76 	bool active() override;
     77 	int channels() override;
     78 	void addChannel(int c) override;
     79 	void removeChannel(int c) override;
     80 	void modulate() override;
     81 	void modulateChannel(int c) override;
     82 	void processAlways(const ProcessArgs& args) override;
     83 	void processChannel(const ProcessArgs& args, int c) override;
     84 	void postProcessAlways(const ProcessArgs& args) override;
     85 };
     86 
     87 } // namespace bogaudio