//============================================================================================================ //! //! \file Fade-G2.cpp //! //! \brief Fade-G2 is a four input six voice two-dimensional fader. //! //============================================================================================================ #include "Gratrix.hpp" namespace rack_plugin_Gratrix { //============================================================================================================ //! \brief The module. struct GtxModule_Fade_G2 : Module { enum ParamIds { BLEND12_PARAM, BLENDAB_PARAM, NUM_PARAMS }; enum InputIds { BLEND12_INPUT, BLENDAB_INPUT, IN1A_INPUT, IN1B_INPUT, IN2A_INPUT, IN2B_INPUT, NUM_INPUTS, OFF_INPUTS = IN1A_INPUT }; enum OutputIds { OUT1A_OUTPUT, OUT2B_OUTPUT, NUM_OUTPUTS, OFF_OUTPUTS = OUT1A_OUTPUT }; enum LightIds { IN_1AP_GREEN, IN_1AP_RED, IN_1AQ_GREEN, IN_1AQ_RED, IN_1BP_GREEN, IN_1BP_RED, IN_1BQ_GREEN, IN_1BQ_RED, IN_2AP_GREEN, IN_2AP_RED, IN_2AQ_GREEN, IN_2AQ_RED, IN_2BP_GREEN, IN_2BP_RED, IN_2BQ_GREEN, IN_2BQ_RED, OUT_1AP_GREEN, OUT_1AP_RED, OUT_1AQ_GREEN, OUT_1AQ_RED, OUT_2BP_GREEN, OUT_2BP_RED, OUT_2BQ_GREEN, OUT_2BQ_RED, NUM_LIGHTS }; GtxModule_Fade_G2() : Module(NUM_PARAMS, (GTX__N+1) * (NUM_INPUTS - OFF_INPUTS ) + OFF_INPUTS, (GTX__N ) * (NUM_OUTPUTS - OFF_OUTPUTS) + OFF_OUTPUTS, NUM_LIGHTS) { lights[IN_1AP_GREEN].value = 0.0f; lights[IN_1AP_RED].value = 1.0f; lights[IN_1AQ_GREEN].value = 0.0f; lights[IN_1AQ_RED].value = 1.0f; lights[IN_1BP_GREEN].value = 1.0f; lights[IN_1BP_RED].value = 0.0f; lights[IN_1BQ_GREEN].value = 0.0f; lights[IN_1BQ_RED].value = 1.0f; lights[IN_2AP_GREEN].value = 0.0f; lights[IN_2AP_RED].value = 1.0f; lights[IN_2AQ_GREEN].value = 1.0f; lights[IN_2AQ_RED].value = 0.0f; lights[IN_2BP_GREEN].value = 1.0f; lights[IN_2BP_RED].value = 0.0f; lights[IN_2BQ_GREEN].value = 1.0f; lights[IN_2BQ_RED].value = 0.0f; } static constexpr std::size_t imap(std::size_t port, std::size_t bank) { return (port < OFF_INPUTS) ? port : port + bank * (NUM_INPUTS - OFF_INPUTS); } static constexpr std::size_t omap(std::size_t port, std::size_t bank) { return port + bank * NUM_OUTPUTS; } void step() override { float blend12 = params[BLEND12_PARAM].value; float blendAB = params[BLENDAB_PARAM].value; if (inputs[BLEND12_INPUT].active) blend12 *= clamp(inputs[BLEND12_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f); if (inputs[BLENDAB_INPUT].active) blendAB *= clamp(inputs[BLENDAB_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f); for (std::size_t i=0; i(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))); addParam(createParamGTX(Vec(fx(1), fy(0)), module, GtxModule_Fade_G2::BLENDAB_PARAM, 0.0f, 1.0f, 0.0f)); addParam(createParamGTX(Vec(fx(2), fy(0)), module, GtxModule_Fade_G2::BLEND12_PARAM, 0.0f, 1.0f, 0.0f)); addInput(createInputGTX(Vec(fx(0), fy(-0.28)), module, GtxModule_Fade_G2::BLENDAB_INPUT)); addInput(createInputGTX(Vec(fx(0), fy(+0.28)), module, GtxModule_Fade_G2::BLEND12_INPUT)); for (std::size_t i=0; i(Vec(px(0, i), py(1, i)), module, GtxModule_Fade_G2::imap(GtxModule_Fade_G2::IN1A_INPUT, i))); addInput(createInputGTX(Vec(px(0, i), py(2, i)), module, GtxModule_Fade_G2::imap(GtxModule_Fade_G2::IN1B_INPUT, i))); addInput(createInputGTX(Vec(px(1, i), py(1, i)), module, GtxModule_Fade_G2::imap(GtxModule_Fade_G2::IN2A_INPUT, i))); addInput(createInputGTX(Vec(px(1, i), py(2, i)), module, GtxModule_Fade_G2::imap(GtxModule_Fade_G2::IN2B_INPUT, i))); addOutput(createOutputGTX(Vec(px(2, i), py(1, i)), module, GtxModule_Fade_G2::omap(GtxModule_Fade_G2::OUT1A_OUTPUT, i))); addOutput(createOutputGTX(Vec(px(2, i), py(2, i)), module, GtxModule_Fade_G2::omap(GtxModule_Fade_G2::OUT2B_OUTPUT, i))); } addInput(createInputGTX(Vec(gx(0), gy(1)), module, GtxModule_Fade_G2::imap(GtxModule_Fade_G2::IN1A_INPUT, GTX__N))); addInput(createInputGTX(Vec(gx(0), gy(2)), module, GtxModule_Fade_G2::imap(GtxModule_Fade_G2::IN1B_INPUT, GTX__N))); addInput(createInputGTX(Vec(gx(1), gy(1)), module, GtxModule_Fade_G2::imap(GtxModule_Fade_G2::IN2A_INPUT, GTX__N))); addInput(createInputGTX(Vec(gx(1), gy(2)), module, GtxModule_Fade_G2::imap(GtxModule_Fade_G2::IN2B_INPUT, GTX__N))); for (std::size_t i=0, x=0; x<3; ++x) { for (std::size_t y=0; y<2; ++y) { addChild(ModuleLightWidget::create>(l_s(gx(x)+rad_l_s()/2+28, gy(y+1)-47.5-(1+rad_l_s())), module, i)); i+=2; addChild(ModuleLightWidget::create>(l_s(gx(x)+rad_l_s()/2+28, gy(y+1)-47.5+(1+rad_l_s())), module, i)); i+=2; } } } }; } // namespace rack_plugin_Gratrix using namespace rack_plugin_Gratrix; RACK_PLUGIN_MODEL_INIT(Gratrix, Fade_G2) { Model *model = Model::create("Gratrix", "Fade-G2", "Fade-G2", MIXER_TAG); // right tag? return model; }