AddrSeq.cpp (4837B)
1 2 #include "AddrSeq.hpp" 3 4 void AddrSeq::processAlways(const ProcessArgs& args) { 5 if (expanderConnected()) { 6 AddrSeqExpanderMessage* te = toExpander(); 7 te->baseID = _id; 8 te->position = 1; 9 te->rangeOffset = _rangeOffset; 10 te->rangeScale = _rangeScale; 11 } 12 } 13 14 void AddrSeq::processChannel(const ProcessArgs& args, int c) { 15 std::lock_guard<SpinLock> lock(_elementsLock); 16 std::vector<AddrSeqStep*>& steps = _elements; 17 int stepsN = steps.size(); 18 19 if (c == 0) { 20 for (int i = 0; i < stepsN; ++i) { 21 steps[i]->lightSum = 0.0f; 22 } 23 } 24 25 int step = nextStep( 26 c, 27 &inputs[RESET_INPUT], 28 inputs[CLOCK_INPUT], 29 ¶ms[STEPS_PARAM], 30 params[DIRECTION_PARAM], 31 ¶ms[SELECT_PARAM], 32 inputs[SELECT_INPUT], 33 stepsN 34 ); 35 36 float out = steps[step]->param.getValue(); 37 out += _rangeOffset; 38 out *= _rangeScale; 39 outputs[OUT_OUTPUT].setChannels(_channels); 40 outputs[OUT_OUTPUT].setVoltage(out, c); 41 42 steps[step]->lightSum += 1; 43 44 if (c == _channels - 1) { 45 for (int i = 0; i < stepsN; ++i) { 46 steps[i]->light.value = steps[i]->lightSum * _inverseChannels; 47 } 48 } 49 } 50 51 struct AddrSeqWidget : AddressableSequenceModuleWidget { 52 static constexpr int hp = 6; 53 54 AddrSeqWidget(AddrSeq* module) { 55 setModule(module); 56 box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT); 57 setPanel(box.size, "AddrSeq"); 58 createScrews(); 59 60 // generated by svg_widgets.rb 61 auto stepsParamPosition = Vec(15.5, 131.5); 62 auto directionParamPosition = Vec(16.0, 167.5); 63 auto selectParamPosition = Vec(9.0, 230.0); 64 auto out1ParamPosition = Vec(58.5, 36.0); 65 auto out2ParamPosition = Vec(58.5, 77.3); 66 auto out3ParamPosition = Vec(58.5, 118.6); 67 auto out4ParamPosition = Vec(58.5, 159.9); 68 auto out5ParamPosition = Vec(58.5, 201.1); 69 auto out6ParamPosition = Vec(58.5, 242.4); 70 auto out7ParamPosition = Vec(58.5, 283.7); 71 auto out8ParamPosition = Vec(58.5, 325.0); 72 73 auto clockInputPosition = Vec(11.5, 35.0); 74 auto resetInputPosition = Vec(11.5, 72.0); 75 auto selectInputPosition = Vec(11.5, 270.0); 76 77 auto outOutputPosition = Vec(11.5, 324.0); 78 79 auto out1LightPosition = Vec(66.5, 58.5); 80 auto out2LightPosition = Vec(66.5, 99.8); 81 auto out3LightPosition = Vec(66.5, 141.1); 82 auto out4LightPosition = Vec(66.5, 182.4); 83 auto out5LightPosition = Vec(66.5, 223.6); 84 auto out6LightPosition = Vec(66.5, 264.9); 85 auto out7LightPosition = Vec(66.5, 306.2); 86 auto out8LightPosition = Vec(66.5, 347.5); 87 // end generated by svg_widgets.rb 88 89 addParam(createParam<Knob16>(stepsParamPosition, module, AddrSeq::STEPS_PARAM)); 90 addParam(createParam<SliderSwitch2State14>(directionParamPosition, module, AddrSeq::DIRECTION_PARAM)); 91 addParam(createParam<Knob29>(selectParamPosition, module, AddrSeq::SELECT_PARAM)); 92 addParam(createParam<Knob16>(out1ParamPosition, module, AddrSeq::OUT1_PARAM)); 93 addParam(createParam<Knob16>(out2ParamPosition, module, AddrSeq::OUT2_PARAM)); 94 addParam(createParam<Knob16>(out3ParamPosition, module, AddrSeq::OUT3_PARAM)); 95 addParam(createParam<Knob16>(out4ParamPosition, module, AddrSeq::OUT4_PARAM)); 96 addParam(createParam<Knob16>(out5ParamPosition, module, AddrSeq::OUT5_PARAM)); 97 addParam(createParam<Knob16>(out6ParamPosition, module, AddrSeq::OUT6_PARAM)); 98 addParam(createParam<Knob16>(out7ParamPosition, module, AddrSeq::OUT7_PARAM)); 99 addParam(createParam<Knob16>(out8ParamPosition, module, AddrSeq::OUT8_PARAM)); 100 101 addInput(createInput<Port24>(clockInputPosition, module, AddrSeq::CLOCK_INPUT)); 102 addInput(createInput<Port24>(resetInputPosition, module, AddrSeq::RESET_INPUT)); 103 addInput(createInput<Port24>(selectInputPosition, module, AddrSeq::SELECT_INPUT)); 104 105 addOutput(createOutput<Port24>(outOutputPosition, module, AddrSeq::OUT_OUTPUT)); 106 107 addChild(createLight<BGSmallLight<GreenLight>>(out1LightPosition, module, AddrSeq::OUT1_LIGHT)); 108 addChild(createLight<BGSmallLight<GreenLight>>(out2LightPosition, module, AddrSeq::OUT2_LIGHT)); 109 addChild(createLight<BGSmallLight<GreenLight>>(out3LightPosition, module, AddrSeq::OUT3_LIGHT)); 110 addChild(createLight<BGSmallLight<GreenLight>>(out4LightPosition, module, AddrSeq::OUT4_LIGHT)); 111 addChild(createLight<BGSmallLight<GreenLight>>(out5LightPosition, module, AddrSeq::OUT5_LIGHT)); 112 addChild(createLight<BGSmallLight<GreenLight>>(out6LightPosition, module, AddrSeq::OUT6_LIGHT)); 113 addChild(createLight<BGSmallLight<GreenLight>>(out7LightPosition, module, AddrSeq::OUT7_LIGHT)); 114 addChild(createLight<BGSmallLight<GreenLight>>(out8LightPosition, module, AddrSeq::OUT8_LIGHT)); 115 } 116 117 void contextMenu(Menu* menu) override { 118 AddressableSequenceModuleWidget::contextMenu(menu); 119 OutputRangeOptionMenuItem::addOutputRangeOptionsToMenu(module, menu); 120 } 121 }; 122 123 Model* modelAddrSeq = bogaudio::createModel<AddrSeq, AddrSeqWidget>("Bogaudio-AddrSeq", "ADDR-SEQ", "Voltage-addressable 8-step sequencer", "Sequencer", "Polyphonic");