BogaudioModules

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

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");