//************************************************************************************** //Multiple 2x5 module for VCV Rack by Alfredo Santamaria - AS - https://github.com/AScustomWorks/AS // //************************************************************************************** #include "AS.hpp" struct Multiple2_5 : Module { enum ParamIds { NUM_PARAMS }; enum InputIds { INPUT1, INPUT2, NUM_INPUTS }; enum OutputIds { OUT11, OUT12, OUT13, OUT14, OUT15, OUT21, OUT22, OUT23, OUT24, OUT25, NUM_OUTPUTS }; Multiple2_5() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {} void step() override; }; void Multiple2_5::step() { float IN1 = inputs[INPUT1].value; float IN2 = inputs[INPUT2].value; // Set outputs outputs[OUT11].value = IN1; outputs[OUT12].value = IN1; outputs[OUT13].value = IN1; outputs[OUT14].value = IN1; outputs[OUT15].value = IN1; /* Update suggested by MarcBrule If the input 2 is not active the second row of outputs takes the value of input 1 so the module becomes a multi 1 x 10, nice and simple idea! */ if(!inputs[INPUT2].active){ outputs[OUT21].value = IN1; outputs[OUT22].value = IN1; outputs[OUT23].value = IN1; outputs[OUT24].value = IN1; outputs[OUT25].value = IN1; }else{ outputs[OUT21].value = IN2; outputs[OUT22].value = IN2; outputs[OUT23].value = IN2; outputs[OUT24].value = IN2; outputs[OUT25].value = IN2; } /* outputs[OUT21].value = IN2; outputs[OUT22].value = IN2; outputs[OUT23].value = IN2; outputs[OUT24].value = IN2; outputs[OUT25].value = IN2; */ //Is it necessary to check for active outputs in this case? /* if (outputs[OUT11].active) { outputs[OUT11].value = IN1; } if (outputs[OUT12].active) { outputs[OUT12].value = IN1; } if (outputs[OUT13].active) { outputs[OUT13].value= IN1; } if (outputs[OUT14].active) { outputs[OUT14].value = IN1; } if (outputs[OUT15].active) { outputs[OUT15].value = IN1; } if (outputs[OUT21].active) { outputs[OUT21].value = IN2; } if (outputs[OUT22].active) { outputs[OUT22].value = IN2; } if (outputs[OUT23].active) { outputs[OUT23].value = IN2; } if (outputs[OUT24].active) { outputs[OUT24].value = IN2; } if (outputs[OUT25].active) { outputs[OUT25].value = IN2; } */ } struct Multiple2_5Widget : ModuleWidget { Multiple2_5Widget(Multiple2_5 *module); }; Multiple2_5Widget::Multiple2_5Widget(Multiple2_5 *module) : ModuleWidget(module) { setPanel(SVG::load(assetPlugin(plugin, "res/Multiple2_5.svg"))); //SCREWS addChild(Widget::create(Vec(RACK_GRID_WIDTH, 0))); addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); addChild(Widget::create(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); //INPUTS addInput(Port::create(Vec(8, 65), Port::INPUT, module, Multiple2_5::INPUT1)); addInput(Port::create(Vec(43, 65), Port::INPUT, module, Multiple2_5::INPUT2)); //OUTPUTS addOutput(Port::create(Vec(8, 130), Port::OUTPUT, module, Multiple2_5::OUT11)); addOutput(Port::create(Vec(43, 130), Port::OUTPUT, module, Multiple2_5::OUT21)); addOutput(Port::create(Vec(8, 175), Port::OUTPUT, module, Multiple2_5::OUT12)); addOutput(Port::create(Vec(43, 175), Port::OUTPUT, module, Multiple2_5::OUT22)); addOutput(Port::create(Vec(8, 220), Port::OUTPUT, module, Multiple2_5::OUT13)); addOutput(Port::create(Vec(43, 220), Port::OUTPUT, module, Multiple2_5::OUT23)); addOutput(Port::create(Vec(8, 265), Port::OUTPUT, module, Multiple2_5::OUT14)); addOutput(Port::create(Vec(43, 265), Port::OUTPUT, module, Multiple2_5::OUT24)); addOutput(Port::create(Vec(8, 310), Port::OUTPUT, module, Multiple2_5::OUT15)); addOutput(Port::create(Vec(43, 310), Port::OUTPUT, module, Multiple2_5::OUT25)); } RACK_PLUGIN_MODEL_INIT(AS, Multiple2_5) { Model *modelMultiple2_5 = Model::create("AS", "Multiple2_5", "Multiple 2 x 5", MULTIPLE_TAG, UTILITY_TAG); return modelMultiple2_5; }