FourMan.cpp (3272B)
1 2 #include "FourMan.hpp" 3 4 #define OUTPUT_SCALE "output_scale" 5 6 void FourMan::reset() { 7 for (int i = 0; i < 4; i++) { 8 _trigger[i].reset(); 9 _pulse[i].process(10.0f); 10 } 11 } 12 13 void FourMan::sampleRateChange() { 14 _sampleTime = APP->engine->getSampleTime(); 15 } 16 17 json_t* FourMan::saveToJson(json_t* root) { 18 root = TriggerOnLoadModule::saveToJson(root); 19 json_object_set_new(root, OUTPUT_SCALE, json_real(_outputScale)); 20 return root; 21 } 22 23 void FourMan::loadFromJson(json_t* root) { 24 TriggerOnLoadModule::loadFromJson(root); 25 json_t* os = json_object_get(root, OUTPUT_SCALE); 26 if (os) { 27 _outputScale = json_real_value(os); 28 } 29 } 30 31 void FourMan::processAll(const ProcessArgs& args) { 32 bool initialPulse = false; 33 if (_initialDelay && !_initialDelay->next()) { 34 initialPulse = true; 35 delete _initialDelay; 36 _initialDelay = NULL; 37 } 38 39 for (int i = 0; i < 4; i++) { 40 bool high = _trigger[i].process(params[TRIGGER1_PARAM + i].getValue()) || _trigger[i].isHigh() || (initialPulse && _triggerOnLoad && _shouldTriggerOnLoad); 41 if (high) { 42 _pulse[i].trigger(0.001f); 43 } 44 high = _pulse[i].process(_sampleTime); 45 46 outputs[OUT1_OUTPUT + i].setVoltage(high ? (5.0f * _outputScale) : 0.0f); 47 } 48 } 49 50 struct FourManWidget : TriggerOnLoadModuleWidget { 51 static constexpr int hp = 3; 52 53 FourManWidget(FourMan* module) 54 : TriggerOnLoadModuleWidget("Trigger on load") 55 { 56 setModule(module); 57 box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT); 58 setPanel(box.size, "FourMan"); 59 createScrews(); 60 61 // generated by svg_widgets.rb 62 auto trigger1ParamPosition = Vec(13.5, 22.0); 63 auto trigger2ParamPosition = Vec(13.5, 102.0); 64 auto trigger3ParamPosition = Vec(13.5, 182.0); 65 auto trigger4ParamPosition = Vec(13.5, 262.0); 66 67 auto out1OutputPosition = Vec(10.5, 57.0); 68 auto out2OutputPosition = Vec(10.5, 137.0); 69 auto out3OutputPosition = Vec(10.5, 217.0); 70 auto out4OutputPosition = Vec(10.5, 297.0); 71 // end generated by svg_widgets.rb 72 73 addParam(createParam<Button18>(trigger1ParamPosition, module, FourMan::TRIGGER1_PARAM)); 74 addParam(createParam<Button18>(trigger2ParamPosition, module, FourMan::TRIGGER2_PARAM)); 75 addParam(createParam<Button18>(trigger3ParamPosition, module, FourMan::TRIGGER3_PARAM)); 76 addParam(createParam<Button18>(trigger4ParamPosition, module, FourMan::TRIGGER4_PARAM)); 77 78 addOutput(createOutput<Port24>(out1OutputPosition, module, FourMan::OUT1_OUTPUT)); 79 addOutput(createOutput<Port24>(out2OutputPosition, module, FourMan::OUT2_OUTPUT)); 80 addOutput(createOutput<Port24>(out3OutputPosition, module, FourMan::OUT3_OUTPUT)); 81 addOutput(createOutput<Port24>(out4OutputPosition, module, FourMan::OUT4_OUTPUT)); 82 } 83 84 void contextMenu(Menu* menu) override { 85 TriggerOnLoadModuleWidget::contextMenu(menu); 86 87 auto m = dynamic_cast<FourMan*>(module); 88 assert(m); 89 90 OptionsMenuItem* o = new OptionsMenuItem("Output"); 91 o->addItem(OptionMenuItem("+5V", [m]() { return m->_outputScale == 1.0f; }, [m]() { m->_outputScale = 1.0f; })); 92 o->addItem(OptionMenuItem("+10V", [m]() { return m->_outputScale == 2.0f; }, [m]() { m->_outputScale = 2.0f; })); 93 OptionsMenuItem::addToMenu(o, menu); 94 } 95 }; 96 97 Model* modelFourMan = createModel<FourMan, FourManWidget>("Bogaudio-FourMan", "4MAN", "Quad button-controlled gates / triggers", "Controller", "Quad");