#include "RJModules.hpp" #include #include #include namespace rack_plugin_RJModules { struct Randoms: Module { enum ParamIds { NUM_PARAMS }; enum InputIds { CH1_CV_INPUT_1, CH1_CV_INPUT_2, CH2_CV_INPUT_1, CH2_CV_INPUT_2, CH3_CV_INPUT_1, CH3_CV_INPUT_2, NUM_INPUTS }; enum OutputIds { CH1_OUTPUT, CH2_OUTPUT, CH3_OUTPUT, NUM_OUTPUTS }; Randoms() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {} void step() override; }; void Randoms::step() { float mapped_ch1v1 = inputs[CH1_CV_INPUT_1].value; float mapped_ch1v2 = inputs[CH1_CV_INPUT_2].value; float mapped_ch2v1 = inputs[CH2_CV_INPUT_1].value; float mapped_ch2v2 = inputs[CH2_CV_INPUT_2].value; float mapped_ch3v1 = inputs[CH3_CV_INPUT_1].value; float mapped_ch3v2 = inputs[CH3_CV_INPUT_2].value; std::random_device rd; // obtain a random number from hardware std::mt19937 eng(rd()); // seed the generator if (mapped_ch1v1 == mapped_ch1v2){ mapped_ch1v1 = -12; mapped_ch1v2 = 12; } std::uniform_real_distribution<> distr1(mapped_ch1v1, mapped_ch1v2); // define the range outputs[CH1_OUTPUT].value = distr1(eng); if (mapped_ch2v1 == mapped_ch2v2){ mapped_ch2v1 = -12; mapped_ch2v2 = 12; } std::uniform_real_distribution<> distr2(mapped_ch2v1, mapped_ch2v2); outputs[CH1_OUTPUT].value = distr1(eng); if (mapped_ch3v1 == mapped_ch3v2){ mapped_ch3v1 = -12; mapped_ch3v2 = 12; } std::uniform_real_distribution<> distr3(mapped_ch3v1, mapped_ch3v2); outputs[CH1_OUTPUT].value = distr1(eng); } struct RandomsWidget: ModuleWidget { RandomsWidget(Randoms *module); }; RandomsWidget::RandomsWidget(Randoms *module) : ModuleWidget(module) { box.size = Vec(15*10, 380); { SVGPanel *panel = new SVGPanel(); panel->box.size = box.size; panel->setBackground(SVG::load(assetPlugin(plugin, "res/Randoms.svg"))); addChild(panel); } addChild(Widget::create(Vec(15, 0))); addChild(Widget::create(Vec(box.size.x-30, 0))); addChild(Widget::create(Vec(15, 365))); addChild(Widget::create(Vec(box.size.x-30, 365))); addInput(Port::create(Vec(22, 70), Port::INPUT, module, Randoms::CH1_CV_INPUT_1)); addInput(Port::create(Vec(22, 100), Port::INPUT, module, Randoms::CH1_CV_INPUT_2)); addInput(Port::create(Vec(22, 150), Port::INPUT, module, Randoms::CH2_CV_INPUT_1)); addInput(Port::create(Vec(22, 180), Port::INPUT, module, Randoms::CH2_CV_INPUT_2)); addInput(Port::create(Vec(22, 230), Port::INPUT, module, Randoms::CH3_CV_INPUT_1)); addInput(Port::create(Vec(22, 260), Port::INPUT, module, Randoms::CH3_CV_INPUT_2)); addOutput(Port::create(Vec(110, 85), Port::OUTPUT, module, Randoms::CH1_OUTPUT)); addOutput(Port::create(Vec(110, 165), Port::OUTPUT, module, Randoms::CH2_OUTPUT)); addOutput(Port::create(Vec(110, 245), Port::OUTPUT, module, Randoms::CH3_OUTPUT)); } } // namespace rack_plugin_RJModules using namespace rack_plugin_RJModules; RACK_PLUGIN_MODEL_INIT(RJModules, Randoms) { Model *modelRandoms = Model::create("RJModules", "Randoms", "[NUM] Randoms", UTILITY_TAG); return modelRandoms; }