DADSRH.cpp (7463B)
1 2 #include "DADSRH.hpp" 3 4 void DADSRH::reset() { 5 for (int c = 0; c < _channels; ++c) { 6 _core[c]->reset(); 7 } 8 } 9 10 int DADSRH::channels() { 11 return inputs[TRIGGER_INPUT].getChannels(); 12 } 13 14 void DADSRH::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 NULL, 32 NULL, 33 NULL, 34 NULL, 35 NULL, 36 NULL, 37 inputs[TRIGGER_INPUT], 38 39 NULL, 40 NULL, 41 NULL, 42 NULL, 43 NULL, 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 DADSRH::removeChannel(int c) { 69 delete _core[c]; 70 _core[c] = NULL; 71 } 72 73 void DADSRH::processChannel(const ProcessArgs& args, int c) { 74 _core[c]->step(c, _channels); 75 } 76 77 void DADSRH::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 DADSRH::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 DADSRHWidget : TriggerOnLoadModuleWidget { 107 static constexpr int hp = 10; 108 109 DADSRHWidget(DADSRH* module) { 110 setModule(module); 111 box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT); 112 setPanel(box.size, "DADSRH"); 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 triggerInputPosition = Vec(115.0, 40.0); 132 133 auto envOutputPosition = Vec(115.0, 191.0); 134 auto invOutputPosition = Vec(115.0, 228.0); 135 auto triggerOutputPosition = Vec(115.0, 265.0); 136 137 auto delayLightPosition = Vec(12.0, 76.0); 138 auto attackLightPosition = Vec(12.0, 123.0); 139 auto decayLightPosition = Vec(12.0, 179.0); 140 auto sustainLightPosition = Vec(12.0, 235.0); 141 auto releaseLightPosition = Vec(12.0, 291.0); 142 auto attackShape1LightPosition = Vec(77.0, 96.0); 143 auto attackShape2LightPosition = Vec(77.0, 106.0); 144 auto attackShape3LightPosition = Vec(77.0, 116.0); 145 auto decayShape1LightPosition = Vec(77.0, 152.5); 146 auto decayShape2LightPosition = Vec(77.0, 162.5); 147 auto decayShape3LightPosition = Vec(77.0, 172.5); 148 auto releaseShape1LightPosition = Vec(77.0, 264.5); 149 auto releaseShape2LightPosition = Vec(77.0, 274.5); 150 auto releaseShape3LightPosition = Vec(77.0, 284.5); 151 // end generated by svg_widgets.rb 152 153 addParam(createParam<Knob38>(delayParamPosition, module, DADSRH::DELAY_PARAM)); 154 addParam(createParam<Knob38>(attackParamPosition, module, DADSRH::ATTACK_PARAM)); 155 addParam(createParam<Knob38>(decayParamPosition, module, DADSRH::DECAY_PARAM)); 156 addParam(createParam<Knob38>(sustainParamPosition, module, DADSRH::SUSTAIN_PARAM)); 157 addParam(createParam<Knob38>(releaseParamPosition, module, DADSRH::RELEASE_PARAM)); 158 addParam(createParam<Knob38>(holdParamPosition, module, DADSRH::HOLD_PARAM)); 159 addParam(createParam<StatefulButton9>(attackShapeParamPosition, module, DADSRH::ATTACK_SHAPE_PARAM)); 160 addParam(createParam<StatefulButton9>(decayShapeParamPosition, module, DADSRH::DECAY_SHAPE_PARAM)); 161 addParam(createParam<StatefulButton9>(releaseShapeParamPosition, module, DADSRH::RELEASE_SHAPE_PARAM)); 162 addParam(createParam<Button18>(triggerParamPosition, module, DADSRH::TRIGGER_PARAM)); 163 addParam(createParam<SliderSwitch2State14>(modeParamPosition, module, DADSRH::MODE_PARAM)); 164 addParam(createParam<SliderSwitch2State14>(loopParamPosition, module, DADSRH::LOOP_PARAM)); 165 addParam(createParam<SliderSwitch2State14>(speedParamPosition, module, DADSRH::SPEED_PARAM)); 166 addParam(createParam<SliderSwitch2State14>(retriggerParamPosition, module, DADSRH::RETRIGGER_PARAM)); 167 168 addInput(createInput<Port24>(triggerInputPosition, module, DADSRH::TRIGGER_INPUT)); 169 170 addOutput(createOutput<Port24>(envOutputPosition, module, DADSRH::ENV_OUTPUT)); 171 addOutput(createOutput<Port24>(invOutputPosition, module, DADSRH::INV_OUTPUT)); 172 addOutput(createOutput<Port24>(triggerOutputPosition, module, DADSRH::TRIGGER_OUTPUT)); 173 174 addChild(createLight<BGTinyLight<GreenLight>>(delayLightPosition, module, DADSRH::DELAY_LIGHT)); 175 addChild(createLight<BGTinyLight<GreenLight>>(attackLightPosition, module, DADSRH::ATTACK_LIGHT)); 176 addChild(createLight<BGTinyLight<GreenLight>>(decayLightPosition, module, DADSRH::DECAY_LIGHT)); 177 addChild(createLight<BGTinyLight<GreenLight>>(sustainLightPosition, module, DADSRH::SUSTAIN_LIGHT)); 178 addChild(createLight<BGTinyLight<GreenLight>>(releaseLightPosition, module, DADSRH::RELEASE_LIGHT)); 179 addChild(createLight<BGTinyLight<GreenLight>>(attackShape1LightPosition, module, DADSRH::ATTACK_SHAPE1_LIGHT)); 180 addChild(createLight<BGTinyLight<GreenLight>>(attackShape2LightPosition, module, DADSRH::ATTACK_SHAPE2_LIGHT)); 181 addChild(createLight<BGTinyLight<GreenLight>>(attackShape3LightPosition, module, DADSRH::ATTACK_SHAPE3_LIGHT)); 182 addChild(createLight<BGTinyLight<GreenLight>>(decayShape1LightPosition, module, DADSRH::DECAY_SHAPE1_LIGHT)); 183 addChild(createLight<BGTinyLight<GreenLight>>(decayShape2LightPosition, module, DADSRH::DECAY_SHAPE2_LIGHT)); 184 addChild(createLight<BGTinyLight<GreenLight>>(decayShape3LightPosition, module, DADSRH::DECAY_SHAPE3_LIGHT)); 185 addChild(createLight<BGTinyLight<GreenLight>>(releaseShape1LightPosition, module, DADSRH::RELEASE_SHAPE1_LIGHT)); 186 addChild(createLight<BGTinyLight<GreenLight>>(releaseShape2LightPosition, module, DADSRH::RELEASE_SHAPE2_LIGHT)); 187 addChild(createLight<BGTinyLight<GreenLight>>(releaseShape3LightPosition, module, DADSRH::RELEASE_SHAPE3_LIGHT)); 188 } 189 }; 190 191 Model* modelDADSRH = bogaudio::createModel<DADSRH, DADSRHWidget>("Bogaudio-DADSRH", "DADSR(H)", "Advanced envelope generator", "Envelope generator", "Polyphonic");