#include "DS.hpp" namespace rack_plugin_SubmarineFree { template struct XG_1 : DS_Module { enum ParamIds { NUM_PARAMS }; enum InputIds { INPUT_A_1, INPUT_B_1 = x, NUM_INPUTS = x + x }; enum OutputIds { OUTPUT_1, NUM_OUTPUTS = x }; enum LightIds { NUM_LIGHTS }; XG_1() : DS_Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {} void step() override { int setCount = 0; for (int i = 0; i < x; i++) { if (inputs[INPUT_A_1 + i].active) if (inputs[INPUT_A_1 + i].value > midpoint()) setCount++; if (inputs[INPUT_B_1 + i].active) if (inputs[INPUT_B_1 + i].value > midpoint()) setCount++; if (outputs[OUTPUT_1 + i].active) { outputs[OUTPUT_1 + i].value = (setCount % 2)?voltage1:voltage0; setCount = 0; } } } }; struct XG104 : ModuleWidget { XG104(XG_1<4> *module) : ModuleWidget(module) { setPanel(SVG::load(assetPlugin(plugin, "res/XG-104.svg"))); for (int i = 0; i < 4; i++) { int offset = 87 * i; addInput(Port::create(Vec(2.5,19 + offset), Port::INPUT, module, XG_1<4>::INPUT_A_1 + i)); addInput(Port::create(Vec(2.5,47 + offset), Port::INPUT, module, XG_1<4>::INPUT_B_1 + i)); addOutput(Port::create(Vec(2.5,75 + offset), Port::OUTPUT, module, XG_1<4>::OUTPUT_1 + i)); } } void appendContextMenu(Menu *menu) override { ((DS_Module *)module)->appendContextMenu(menu); } }; struct XG106 : ModuleWidget { XG106(XG_1<6> *module) : ModuleWidget(module) { setPanel(SVG::load(assetPlugin(plugin, "res/XG-106.svg"))); for (int i = 0; i < 6; i++) { int offset = 58 * i; addInput(Port::create(Vec(4,19 + offset), Port::INPUT, module, XG_1<6>::INPUT_A_1 + i)); addInput(Port::create(Vec(4,47 + offset), Port::INPUT, module, XG_1<6>::INPUT_B_1 + i)); addOutput(Port::create(Vec(62,33 + offset), Port::OUTPUT, module, XG_1<6>::OUTPUT_1 + i)); } } void appendContextMenu(Menu *menu) override { ((DS_Module *)module)->appendContextMenu(menu); } }; } // namespace rack_plugin_SubmarineFree using namespace rack_plugin_SubmarineFree; RACK_PLUGIN_MODEL_INIT(SubmarineFree, XG104) { Model *modelXG104 = Model::create, XG104>("Submarine (Free)", "XG-104", "XG-104 XOR Gates", LOGIC_TAG, MULTIPLE_TAG); return modelXG104; } RACK_PLUGIN_MODEL_INIT(SubmarineFree, XG106) { Model *modelXG106 = Model::create, XG106>("Submarine (Free)", "XG-106", "XG-106 XOR Gates", LOGIC_TAG, MULTIPLE_TAG); return modelXG106; }