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