DADSRHPlus.cpp (9381B)
1 2 #include "DADSRHPlus.hpp" 3 4 void DADSRHPlus::reset() { 5 for (int c = 0; c < _channels; ++c) { 6 _core[c]->reset(); 7 } 8 } 9 10 int DADSRHPlus::channels() { 11 return inputs[TRIGGER_INPUT].getChannels(); 12 } 13 14 void DADSRHPlus::addChannel(int c) { 15 _core[c] = new DADSRHCore( 16 params[DELAY_PARAM], 17 params[ATTACK_PARAM], 18 params[DECAY_PARAM], 19 params[SUSTAIN_PARAM], 20 params[RELEASE_PARAM], 21 params[HOLD_PARAM], 22 params[ATTACK_SHAPE_PARAM], 23 params[DECAY_SHAPE_PARAM], 24 params[RELEASE_SHAPE_PARAM], 25 params[TRIGGER_PARAM], 26 params[MODE_PARAM], 27 params[LOOP_PARAM], 28 params[SPEED_PARAM], 29 params[RETRIGGER_PARAM], 30 31 &inputs[DELAY_INPUT], 32 &inputs[ATTACK_INPUT], 33 &inputs[DECAY_INPUT], 34 &inputs[SUSTAIN_INPUT], 35 &inputs[RELEASE_INPUT], 36 &inputs[HOLD_INPUT], 37 inputs[TRIGGER_INPUT], 38 39 &outputs[DELAY_OUTPUT], 40 &outputs[ATTACK_OUTPUT], 41 &outputs[DECAY_OUTPUT], 42 &outputs[SUSTAIN_OUTPUT], 43 &outputs[RELEASE_OUTPUT], 44 outputs[ENV_OUTPUT], 45 outputs[INV_OUTPUT], 46 outputs[TRIGGER_OUTPUT], 47 48 _delayLights, 49 _attackLights, 50 _decayLights, 51 _sustainLights, 52 _releaseLights, 53 lights[ATTACK_SHAPE1_LIGHT], 54 lights[ATTACK_SHAPE2_LIGHT], 55 lights[ATTACK_SHAPE3_LIGHT], 56 lights[DECAY_SHAPE1_LIGHT], 57 lights[DECAY_SHAPE2_LIGHT], 58 lights[DECAY_SHAPE3_LIGHT], 59 lights[RELEASE_SHAPE1_LIGHT], 60 lights[RELEASE_SHAPE2_LIGHT], 61 lights[RELEASE_SHAPE3_LIGHT], 62 63 _triggerOnLoad, 64 _shouldTriggerOnLoad 65 ); 66 } 67 68 void DADSRHPlus::removeChannel(int c) { 69 delete _core[c]; 70 _core[c] = NULL; 71 } 72 73 void DADSRHPlus::processChannel(const ProcessArgs& args, int c) { 74 _core[c]->step(c, _channels); 75 } 76 77 void DADSRHPlus::postProcess(const ProcessArgs& args) { 78 float delaySum = 0.0f; 79 float attackSum = 0.0f; 80 float decaySum = 0.0f; 81 float sustainSum = 0.0f; 82 float releaseSum = 0.0f; 83 for (int c = 0; c < _channels; ++c) { 84 delaySum += _delayLights[c]; 85 attackSum += _attackLights[c]; 86 decaySum += _decayLights[c]; 87 sustainSum += _sustainLights[c]; 88 releaseSum += _releaseLights[c]; 89 } 90 lights[DELAY_LIGHT].value = delaySum * _inverseChannels; 91 lights[ATTACK_LIGHT].value = attackSum * _inverseChannels; 92 lights[DECAY_LIGHT].value = decaySum * _inverseChannels; 93 lights[SUSTAIN_LIGHT].value = sustainSum * _inverseChannels; 94 lights[RELEASE_LIGHT].value = releaseSum * _inverseChannels; 95 } 96 97 bool DADSRHPlus::shouldTriggerOnNextLoad() { 98 for (int c = 0; c < _channels; ++c) { 99 if (_core[c] && _core[c]->_stage != _core[c]->STOPPED_STAGE) { 100 return true; 101 } 102 } 103 return false; 104 } 105 106 struct DADSRHPlusWidget : TriggerOnLoadModuleWidget { 107 static constexpr int hp = 15; 108 109 DADSRHPlusWidget(DADSRHPlus* module) { 110 setModule(module); 111 box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT); 112 setPanel(box.size, "DADSRHPlus"); 113 createScrews(); 114 115 // generated by svg_widgets.rb 116 auto delayParamPosition = Vec(27.0, 33.0); 117 auto attackParamPosition = Vec(27.0, 89.0); 118 auto decayParamPosition = Vec(27.0, 145.0); 119 auto sustainParamPosition = Vec(27.0, 201.0); 120 auto releaseParamPosition = Vec(27.0, 257.0); 121 auto holdParamPosition = Vec(82.3, 313.0); 122 auto attackShapeParamPosition = Vec(77.0, 124.0); 123 auto decayShapeParamPosition = Vec(77.0, 180.5); 124 auto releaseShapeParamPosition = Vec(77.0, 292.5); 125 auto triggerParamPosition = Vec(90.0, 43.0); 126 auto modeParamPosition = Vec(119.5, 94.5); 127 auto loopParamPosition = Vec(119.5, 144.5); 128 auto speedParamPosition = Vec(19.5, 320.5); 129 auto retriggerParamPosition = Vec(54.5, 320.5); 130 131 auto delayInputPosition = Vec(152.0, 40.0); 132 auto attackInputPosition = Vec(152.0, 96.0); 133 auto decayInputPosition = Vec(152.0, 152.0); 134 auto sustainInputPosition = Vec(152.0, 208.0); 135 auto releaseInputPosition = Vec(152.0, 264.0); 136 auto holdInputPosition = Vec(152.0, 320.0); 137 auto triggerInputPosition = Vec(115.0, 40.0); 138 139 auto delayOutputPosition = Vec(189.0, 40.0); 140 auto attackOutputPosition = Vec(189.0, 96.0); 141 auto decayOutputPosition = Vec(189.0, 152.0); 142 auto sustainOutputPosition = Vec(189.0, 208.0); 143 auto releaseOutputPosition = Vec(189.0, 264.0); 144 auto envOutputPosition = Vec(115.0, 191.0); 145 auto invOutputPosition = Vec(115.0, 228.0); 146 auto triggerOutputPosition = Vec(115.0, 265.0); 147 148 auto delayLightPosition = Vec(12.0, 76.0); 149 auto attackLightPosition = Vec(12.0, 123.0); 150 auto decayLightPosition = Vec(12.0, 179.0); 151 auto sustainLightPosition = Vec(12.0, 235.0); 152 auto releaseLightPosition = Vec(12.0, 291.0); 153 auto attackShape1LightPosition = Vec(77.0, 96.0); 154 auto attackShape2LightPosition = Vec(77.0, 106.0); 155 auto attackShape3LightPosition = Vec(77.0, 116.0); 156 auto decayShape1LightPosition = Vec(77.0, 152.5); 157 auto decayShape2LightPosition = Vec(77.0, 162.5); 158 auto decayShape3LightPosition = Vec(77.0, 172.5); 159 auto releaseShape1LightPosition = Vec(77.0, 264.5); 160 auto releaseShape2LightPosition = Vec(77.0, 274.5); 161 auto releaseShape3LightPosition = Vec(77.0, 284.5); 162 // end generated by svg_widgets.rb 163 164 addParam(createParam<Knob38>(delayParamPosition, module, DADSRHPlus::DELAY_PARAM)); 165 addParam(createParam<Knob38>(attackParamPosition, module, DADSRHPlus::ATTACK_PARAM)); 166 addParam(createParam<Knob38>(decayParamPosition, module, DADSRHPlus::DECAY_PARAM)); 167 addParam(createParam<Knob38>(sustainParamPosition, module, DADSRHPlus::SUSTAIN_PARAM)); 168 addParam(createParam<Knob38>(releaseParamPosition, module, DADSRHPlus::RELEASE_PARAM)); 169 addParam(createParam<Knob38>(holdParamPosition, module, DADSRHPlus::HOLD_PARAM)); 170 addParam(createParam<StatefulButton9>(attackShapeParamPosition, module, DADSRHPlus::ATTACK_SHAPE_PARAM)); 171 addParam(createParam<StatefulButton9>(decayShapeParamPosition, module, DADSRHPlus::DECAY_SHAPE_PARAM)); 172 addParam(createParam<StatefulButton9>(releaseShapeParamPosition, module, DADSRHPlus::RELEASE_SHAPE_PARAM)); 173 addParam(createParam<Button18>(triggerParamPosition, module, DADSRHPlus::TRIGGER_PARAM)); 174 addParam(createParam<SliderSwitch2State14>(modeParamPosition, module, DADSRHPlus::MODE_PARAM)); 175 addParam(createParam<SliderSwitch2State14>(loopParamPosition, module, DADSRHPlus::LOOP_PARAM)); 176 addParam(createParam<SliderSwitch2State14>(speedParamPosition, module, DADSRHPlus::SPEED_PARAM)); 177 addParam(createParam<SliderSwitch2State14>(retriggerParamPosition, module, DADSRHPlus::RETRIGGER_PARAM)); 178 179 addInput(createInput<Port24>(delayInputPosition, module, DADSRHPlus::DELAY_INPUT)); 180 addInput(createInput<Port24>(attackInputPosition, module, DADSRHPlus::ATTACK_INPUT)); 181 addInput(createInput<Port24>(decayInputPosition, module, DADSRHPlus::DECAY_INPUT)); 182 addInput(createInput<Port24>(sustainInputPosition, module, DADSRHPlus::SUSTAIN_INPUT)); 183 addInput(createInput<Port24>(releaseInputPosition, module, DADSRHPlus::RELEASE_INPUT)); 184 addInput(createInput<Port24>(holdInputPosition, module, DADSRHPlus::HOLD_INPUT)); 185 addInput(createInput<Port24>(triggerInputPosition, module, DADSRHPlus::TRIGGER_INPUT)); 186 187 addOutput(createOutput<Port24>(delayOutputPosition, module, DADSRHPlus::DELAY_OUTPUT)); 188 addOutput(createOutput<Port24>(attackOutputPosition, module, DADSRHPlus::ATTACK_OUTPUT)); 189 addOutput(createOutput<Port24>(decayOutputPosition, module, DADSRHPlus::DECAY_OUTPUT)); 190 addOutput(createOutput<Port24>(sustainOutputPosition, module, DADSRHPlus::SUSTAIN_OUTPUT)); 191 addOutput(createOutput<Port24>(releaseOutputPosition, module, DADSRHPlus::RELEASE_OUTPUT)); 192 addOutput(createOutput<Port24>(envOutputPosition, module, DADSRHPlus::ENV_OUTPUT)); 193 addOutput(createOutput<Port24>(invOutputPosition, module, DADSRHPlus::INV_OUTPUT)); 194 addOutput(createOutput<Port24>(triggerOutputPosition, module, DADSRHPlus::TRIGGER_OUTPUT)); 195 196 addChild(createLight<BGTinyLight<GreenLight>>(delayLightPosition, module, DADSRHPlus::DELAY_LIGHT)); 197 addChild(createLight<BGTinyLight<GreenLight>>(attackLightPosition, module, DADSRHPlus::ATTACK_LIGHT)); 198 addChild(createLight<BGTinyLight<GreenLight>>(decayLightPosition, module, DADSRHPlus::DECAY_LIGHT)); 199 addChild(createLight<BGTinyLight<GreenLight>>(sustainLightPosition, module, DADSRHPlus::SUSTAIN_LIGHT)); 200 addChild(createLight<BGTinyLight<GreenLight>>(releaseLightPosition, module, DADSRHPlus::RELEASE_LIGHT)); 201 addChild(createLight<BGTinyLight<GreenLight>>(attackShape1LightPosition, module, DADSRHPlus::ATTACK_SHAPE1_LIGHT)); 202 addChild(createLight<BGTinyLight<GreenLight>>(attackShape2LightPosition, module, DADSRHPlus::ATTACK_SHAPE2_LIGHT)); 203 addChild(createLight<BGTinyLight<GreenLight>>(attackShape3LightPosition, module, DADSRHPlus::ATTACK_SHAPE3_LIGHT)); 204 addChild(createLight<BGTinyLight<GreenLight>>(decayShape1LightPosition, module, DADSRHPlus::DECAY_SHAPE1_LIGHT)); 205 addChild(createLight<BGTinyLight<GreenLight>>(decayShape2LightPosition, module, DADSRHPlus::DECAY_SHAPE2_LIGHT)); 206 addChild(createLight<BGTinyLight<GreenLight>>(decayShape3LightPosition, module, DADSRHPlus::DECAY_SHAPE3_LIGHT)); 207 addChild(createLight<BGTinyLight<GreenLight>>(releaseShape1LightPosition, module, DADSRHPlus::RELEASE_SHAPE1_LIGHT)); 208 addChild(createLight<BGTinyLight<GreenLight>>(releaseShape2LightPosition, module, DADSRHPlus::RELEASE_SHAPE2_LIGHT)); 209 addChild(createLight<BGTinyLight<GreenLight>>(releaseShape3LightPosition, module, DADSRHPlus::RELEASE_SHAPE3_LIGHT)); 210 } 211 }; 212 213 Model* modelDADSRHPlus = bogaudio::createModel<DADSRHPlus, DADSRHPlusWidget>("Bogaudio-DADSRHPlus", "DADSR(H)+", "Advanced envelope generator with additional CV", "Envelope generator", "Polyphonic");