#include "HetrickCV.hpp" #include "dsp/digital.hpp" namespace rack_plugin_HetrickCV { #ifdef USE_VST2 #define plugin "HetrickCV" #endif // USE_VST2 struct TwoToFour : Module { enum ParamIds { NUM_PARAMS }; enum InputIds { INA_INPUT, INB_INPUT, NUM_INPUTS }; enum OutputIds { OUT1_OUTPUT, OUT2_OUTPUT, OUT3_OUTPUT, OUT4_OUTPUT, NUM_OUTPUTS }; enum LightIds { OUT1_POS_LIGHT, OUT1_NEG_LIGHT, OUT2_POS_LIGHT, OUT2_NEG_LIGHT, OUT3_POS_LIGHT, OUT3_NEG_LIGHT, OUT4_POS_LIGHT, OUT4_NEG_LIGHT, NUM_LIGHTS }; float outs[4] = {}; TwoToFour() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { } void step() override; // For more advanced Module features, read Rack's engine.hpp header file // - toJson, fromJson: serialization of internal data // - onSampleRateChange: event triggered by a change of sample rate // - reset, randomize: implements special behavior when user clicks these from the context menu }; void TwoToFour::step() { const float inA = inputs[INA_INPUT].value; const float inB = inputs[INB_INPUT].value; outs[0] = inA + inB; outs[1] = outs[0] * -1.0f; outs[3] = inA - inB; outs[2] = outs[3] * -1.0f; outputs[OUT1_OUTPUT].value = outs[0]; outputs[OUT2_OUTPUT].value = outs[1]; outputs[OUT3_OUTPUT].value = outs[2]; outputs[OUT4_OUTPUT].value = outs[3]; lights[OUT1_POS_LIGHT].setBrightnessSmooth(fmaxf(0.0, outs[0] / 5.0)); lights[OUT1_NEG_LIGHT].setBrightnessSmooth(fmaxf(0.0, -outs[0] / 5.0)); lights[OUT2_POS_LIGHT].setBrightnessSmooth(fmaxf(0.0, outs[1] / 5.0)); lights[OUT2_NEG_LIGHT].setBrightnessSmooth(fmaxf(0.0, -outs[1] / 5.0)); lights[OUT3_POS_LIGHT].setBrightnessSmooth(fmaxf(0.0, outs[2] / 5.0)); lights[OUT3_NEG_LIGHT].setBrightnessSmooth(fmaxf(0.0, -outs[2] / 5.0)); lights[OUT4_POS_LIGHT].setBrightnessSmooth(fmaxf(0.0, outs[3] / 5.0)); lights[OUT4_NEG_LIGHT].setBrightnessSmooth(fmaxf(0.0, -outs[3] / 5.0)); } struct TwoToFourWidget : ModuleWidget { TwoToFourWidget(TwoToFour *module); }; TwoToFourWidget::TwoToFourWidget(TwoToFour *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/2To4.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))); //////PARAMS////// //////INPUTS////// addInput(Port::create(Vec(10, 100), Port::INPUT, module, TwoToFour::INA_INPUT)); addInput(Port::create(Vec(55, 100), Port::INPUT, module, TwoToFour::INB_INPUT)); for(int i = 0; i < 4; i++) { const int yPos = i*45; addOutput(Port::create(Vec(33, 150 + yPos), Port::OUTPUT, module, TwoToFour::OUT1_OUTPUT + i)); addChild(ModuleLightWidget::create>(Vec(70, 158 + yPos), module, TwoToFour::OUT1_POS_LIGHT + i*2)); } } } // namespace rack_plugin_HetrickCV using namespace rack_plugin_HetrickCV; RACK_PLUGIN_MODEL_INIT(HetrickCV, TwoToFour) { Model *modelTwoToFour = Model::create("HetrickCV", "2To4", "2 To 4 Mix Matrix", MIXER_TAG); return modelTwoToFour; }