#include "Southpole.hpp" namespace rack_plugin_Southpole { struct Abr : Module { enum ParamIds { SWITCH1_PARAM, SWITCH2_PARAM, SWITCH3_PARAM, SWITCH4_PARAM, SWITCH5_PARAM, SWITCH6_PARAM, SWITCH7_PARAM, SWITCH8_PARAM, NUM_PARAMS }; enum InputIds { INA1_INPUT, INA2_INPUT, INA3_INPUT, INA4_INPUT, INA5_INPUT, INA6_INPUT, INA7_INPUT, INA8_INPUT, INB1_INPUT, INB2_INPUT, INB3_INPUT, INB4_INPUT, INB5_INPUT, INB6_INPUT, INB7_INPUT, INB8_INPUT, NUM_INPUTS }; enum OutputIds { OUT1_OUTPUT, OUT2_OUTPUT, OUT3_OUTPUT, OUT4_OUTPUT, OUT5_OUTPUT, OUT6_OUTPUT, OUT7_OUTPUT, OUT8_OUTPUT, SUMA_OUTPUT, SUMB_OUTPUT, SUM_OUTPUT, NUM_OUTPUTS }; enum LightIds { NUM_LIGHTS }; bool swState[8] = {}; Abr() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { reset(); } void step() override; void reset() override { for (int i = 0; i < 8; i++) { swState[i] = false; } } void randomize() override { for (int i = 0; i < 8; i++) { swState[i] = (randomUniform() < 0.5); } } json_t *toJson() override { json_t *rootJ = json_object(); json_t *swStatesJ = json_array(); for (int i = 0; i < 8; i++) { json_t *swStateJ = json_boolean(swState[i]); json_array_append_new(swStatesJ, swStateJ); } json_object_set_new(rootJ, "swStates", swStatesJ); return rootJ; } void fromJson(json_t *rootJ) override { json_t *swStatesJ = json_object_get(rootJ, "swStates"); if (swStatesJ) { for (int i = 0; i < 8; i++) { json_t *stateJ = json_array_get(swStatesJ, i); if (stateJ) { swState[i] = json_boolean_value(stateJ); } } } } }; void Abr::step() { float outa = 0.; float outb = 0.; float out = 0.; for(int i = 0; i < 8; i++) { swState[i] = params[SWITCH1_PARAM + i].value > 0.5; if ( !swState[i] ) { if(inputs[INA1_INPUT + i].active) { float ina = inputs[INA1_INPUT + i].value; outputs[OUT1_OUTPUT + i].value = ina; outa += ina; out += ina; } } else { if(inputs[INB1_INPUT + i].active) { float inb = inputs[INB1_INPUT + i].value; outputs[OUT1_OUTPUT + i].value = inb; outb += inb; out += inb; } } } outputs[SUMA_OUTPUT].value = outa; outputs[SUMB_OUTPUT].value = outb; outputs[SUM_OUTPUT].value = out; } struct AbrWidget : ModuleWidget { AbrWidget(Abr *module) : ModuleWidget(module) { box.size = Vec(6 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT); { auto *panel = new SVGPanel(); panel->box.size = box.size; panel->setBackground(SVG::load(assetPlugin(plugin, "res/Abr.svg"))); addChild(panel); } const float x1 = 3.; const float x2 = 4.+20.; const float x3 = 5.+43.; const float x4 = 5.+63.; float yPos = 18.; for(int i = 0; i < 8; i++) { yPos += 32.; addInput(Port::create(Vec(x1, yPos), Port::INPUT, module, Abr::INA1_INPUT + i)); addParam(ParamWidget::create(Vec(x2+1, 3 + yPos), module, Abr::SWITCH1_PARAM + i, 0.0, 1.0, 0.0)); addInput(Port::create(Vec(x3, yPos), Port::INPUT, module, Abr::INB1_INPUT + i)); addOutput(Port::create(Vec(x4, yPos), Port::OUTPUT, module, Abr::OUT1_OUTPUT + i)); } yPos += 48.; addOutput(Port::create(Vec(x1, yPos), Port::OUTPUT, module, Abr::SUMA_OUTPUT)); addOutput(Port::create(Vec(x3, yPos), Port::OUTPUT, module, Abr::SUMB_OUTPUT)); addOutput(Port::create(Vec(x4, yPos), Port::OUTPUT, module, Abr::SUM_OUTPUT)); } }; } // namespace rack_plugin_Southpole using namespace rack_plugin_Southpole; RACK_PLUGIN_MODEL_INIT(Southpole, Abr) { Model *modelAbr = Model::create("Southpole", "Abr", "Abr - A/B switch", SWITCH_TAG, MIXER_TAG); return modelAbr; }