diff --git a/include/plugincontext.hpp b/include/plugincontext.hpp index bda0263..5daa32c 100644 --- a/include/plugincontext.hpp +++ b/include/plugincontext.hpp @@ -68,7 +68,7 @@ using CardinalDGL::IdleCallback; // -------------------------------------------------------------------------------------------------------------------- // Cardinal specific context -static constexpr const uint32_t kModuleParameterCount = 24; +static constexpr const uint32_t kModuleParameterCount = 512; enum CardinalVariant { kCardinalVariantMain, diff --git a/plugins/Cardinal/src/HostParameters.cpp b/plugins/Cardinal/src/HostParameters.cpp index 1cbb37f..18063a6 100644 --- a/plugins/Cardinal/src/HostParameters.cpp +++ b/plugins/Cardinal/src/HostParameters.cpp @@ -30,17 +30,18 @@ struct HostParameters : TerminalModule { NUM_INPUTS }; enum OutputIds { - NUM_OUTPUTS = kModuleParameterCount + NUM_OUTPUTS = 32 }; enum LightIds { NUM_LIGHTS }; CardinalPluginContext* const pcontext; - rack::dsp::SlewLimiter parameters[kModuleParameterCount]; - bool parametersConnected[kModuleParameterCount] = {}; + rack::dsp::SlewLimiter parameters[32]; + bool parametersConnected[32] = {}; bool bypassed = false; bool smooth = true; + uint8_t bank = 0; uint32_t lastProcessCounter = 0; HostParameters() @@ -61,7 +62,7 @@ struct HostParameters : TerminalModule { bypassed = isBypassed(); lastProcessCounter = processCounter; - for (uint32_t i=0; iparameters[i]) - : pcontext->parameters[i]); + outputs[i].setVoltage(smooth ? parameters[i].process(args.sampleTime, pcontext->parameters[i+32*bank]) + : pcontext->parameters[i+32*bank]); } } @@ -91,7 +92,7 @@ struct HostParameters : TerminalModule { { const double fall = 1.0 / (double(pcontext->bufferSize) / e.sampleRate); - for (uint32_t i=0; i(APP)) - handleHostParameterDrag(pcontext, portId, true); + handleHostParameterDrag(pcontext, ((HostParameters*)module)->bank*portId, true); PJ301MPort::onDragStart(e); } void onDragEnd(const DragEndEvent& e) override { if (const CardinalPluginContext* const pcontext = static_cast(APP)) - handleHostParameterDrag(pcontext, portId, false); + handleHostParameterDrag(pcontext, ((HostParameters*)module)->bank*portId, false); PJ301MPort::onDragEnd(e); } }; @@ -138,7 +142,7 @@ struct HostParametersWidget : ModuleWidgetWith9HP { static constexpr const float startX = 10.0f; static constexpr const float startY = 90.0f; static constexpr const float paddingH = 30.0f; - static constexpr const float paddingV = 49.0f; + static constexpr const float paddingV = 36.0f; HostParameters* const module; @@ -149,10 +153,10 @@ struct HostParametersWidget : ModuleWidgetWith9HP { setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/HostParameters.svg"))); createAndAddScrews(); - for (int i=0; i<24; ++i) + for (int i=0; i<32; ++i) { - const float x = startX + int(i / 6) * paddingH; - const float y = startY + int(i % 6) * paddingV; + const float x = startX + int(i % 4) * paddingH; + const float y = startY + int(i / 4) * paddingV; addOutput(createOutput(Vec(x, y), m, i)); } } @@ -162,22 +166,28 @@ struct HostParametersWidget : ModuleWidgetWith9HP { drawBackground(args.vg); nvgFontFaceId(args.vg, 0); - nvgFontSize(args.vg, 14); + nvgFontSize(args.vg, 10); - char text[] = { '0', '0', '\0' }; - for (int i=0; i<24; ++i) + char text[] = { '0', '0', '0', '\0'}; + snprintf(text, 4, "%03d", 32*(module == nullptr ? 0 : module->bank)); + for (int i=0; i<32; ++i) { - const float x = startX + int(i / 6) * paddingH; - const float y = startY + int(i % 6) * paddingV; + const float x = startX + int(i % 4) * paddingH; + const float y = startY + int(i / 4) * paddingV; nvgBeginPath(args.vg); nvgRoundedRect(args.vg, x - 1.0f, y - 19.0f, paddingH - 4.0f, paddingV - 4.0f, 4); nvgFillColor(args.vg, nvgRGB(0xd0, 0xd0, 0xd0)); nvgFill(args.vg); - if (text[1]++ == '9') + + if (text[2]++ == '9') { - text[1] = '0'; - ++text[0]; + text[2] = '0'; + if (text[1]++ == '9') + { + text[1] = '0'; + ++text[0]; + } } nvgBeginPath(args.vg); nvgFillColor(args.vg, color::BLACK); @@ -191,6 +201,15 @@ struct HostParametersWidget : ModuleWidgetWith9HP { { menu->addChild(new MenuSeparator); menu->addChild(createBoolPtrMenuItem("Smooth", "", &module->smooth)); + menu->addChild(createSubmenuItem("Bank", string::f("%d", module->bank), [=](Menu* menu) { + for (int c = 0; c < 16; c++) { + menu->addChild(createCheckMenuItem(string::f("%d", c+1), "", + [=]() {return module->bank == c;}, + [=]() {module->bank = c;} + )); + } + })); + } }; #else