BogaudioModules

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

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