Set number of host parameters to 512

- 512 should be enough for anybody
- Added banks to Host Params module
This commit is contained in:
Brian Hrebec 2025-06-08 23:00:48 -05:00
parent e4abb1cd78
commit 85b4b857c8
2 changed files with 42 additions and 23 deletions

View file

@ -68,7 +68,7 @@ using CardinalDGL::IdleCallback;
// -------------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------
// Cardinal specific context // Cardinal specific context
static constexpr const uint32_t kModuleParameterCount = 24; static constexpr const uint32_t kModuleParameterCount = 512;
enum CardinalVariant { enum CardinalVariant {
kCardinalVariantMain, kCardinalVariantMain,

View file

@ -30,17 +30,18 @@ struct HostParameters : TerminalModule {
NUM_INPUTS NUM_INPUTS
}; };
enum OutputIds { enum OutputIds {
NUM_OUTPUTS = kModuleParameterCount NUM_OUTPUTS = 32
}; };
enum LightIds { enum LightIds {
NUM_LIGHTS NUM_LIGHTS
}; };
CardinalPluginContext* const pcontext; CardinalPluginContext* const pcontext;
rack::dsp::SlewLimiter parameters[kModuleParameterCount]; rack::dsp::SlewLimiter parameters[32];
bool parametersConnected[kModuleParameterCount] = {}; bool parametersConnected[32] = {};
bool bypassed = false; bool bypassed = false;
bool smooth = true; bool smooth = true;
uint8_t bank = 0;
uint32_t lastProcessCounter = 0; uint32_t lastProcessCounter = 0;
HostParameters() HostParameters()
@ -61,7 +62,7 @@ struct HostParameters : TerminalModule {
bypassed = isBypassed(); bypassed = isBypassed();
lastProcessCounter = processCounter; lastProcessCounter = processCounter;
for (uint32_t i=0; i<kModuleParameterCount; ++i) for (uint32_t i=0; i<32; ++i)
{ {
const bool connected = outputs[i].isConnected(); const bool connected = outputs[i].isConnected();
@ -76,11 +77,11 @@ struct HostParameters : TerminalModule {
if (bypassed) if (bypassed)
return; return;
for (uint32_t i=0; i<kModuleParameterCount; ++i) for (uint32_t i=0; i<32; ++i)
{ {
if (parametersConnected[i]) if (parametersConnected[i])
outputs[i].setVoltage(smooth ? parameters[i].process(args.sampleTime, pcontext->parameters[i]) outputs[i].setVoltage(smooth ? parameters[i].process(args.sampleTime, pcontext->parameters[i+32*bank])
: pcontext->parameters[i]); : pcontext->parameters[i+32*bank]);
} }
} }
@ -91,7 +92,7 @@ struct HostParameters : TerminalModule {
{ {
const double fall = 1.0 / (double(pcontext->bufferSize) / e.sampleRate); const double fall = 1.0 / (double(pcontext->bufferSize) / e.sampleRate);
for (uint32_t i=0; i<kModuleParameterCount; ++i) for (uint32_t i=0; i<32; ++i)
{ {
parameters[i].reset(); parameters[i].reset();
parameters[i].setRiseFall(fall, fall); parameters[i].setRiseFall(fall, fall);
@ -107,6 +108,7 @@ struct HostParameters : TerminalModule {
DISTRHO_SAFE_ASSERT_RETURN(rootJ != nullptr, nullptr); DISTRHO_SAFE_ASSERT_RETURN(rootJ != nullptr, nullptr);
json_object_set_new(rootJ, "smooth", json_boolean(smooth)); json_object_set_new(rootJ, "smooth", json_boolean(smooth));
json_object_set_new(rootJ, "bank", json_integer(bank));
return rootJ; return rootJ;
} }
@ -115,6 +117,8 @@ struct HostParameters : TerminalModule {
{ {
if (json_t* const smoothJ = json_object_get(rootJ, "smooth")) if (json_t* const smoothJ = json_object_get(rootJ, "smooth"))
smooth = json_boolean_value(smoothJ); smooth = json_boolean_value(smoothJ);
if (json_t* const bankJ = json_object_get(rootJ, "bank"))
bank = json_integer_value(bankJ);
} }
}; };
@ -124,12 +128,12 @@ struct HostParameters : TerminalModule {
struct CardinalParameterPJ301MPort : PJ301MPort { struct CardinalParameterPJ301MPort : PJ301MPort {
void onDragStart(const DragStartEvent& e) override { void onDragStart(const DragStartEvent& e) override {
if (const CardinalPluginContext* const pcontext = static_cast<CardinalPluginContext*>(APP)) if (const CardinalPluginContext* const pcontext = static_cast<CardinalPluginContext*>(APP))
handleHostParameterDrag(pcontext, portId, true); handleHostParameterDrag(pcontext, ((HostParameters*)module)->bank*portId, true);
PJ301MPort::onDragStart(e); PJ301MPort::onDragStart(e);
} }
void onDragEnd(const DragEndEvent& e) override { void onDragEnd(const DragEndEvent& e) override {
if (const CardinalPluginContext* const pcontext = static_cast<CardinalPluginContext*>(APP)) if (const CardinalPluginContext* const pcontext = static_cast<CardinalPluginContext*>(APP))
handleHostParameterDrag(pcontext, portId, false); handleHostParameterDrag(pcontext, ((HostParameters*)module)->bank*portId, false);
PJ301MPort::onDragEnd(e); PJ301MPort::onDragEnd(e);
} }
}; };
@ -138,7 +142,7 @@ struct HostParametersWidget : ModuleWidgetWith9HP {
static constexpr const float startX = 10.0f; static constexpr const float startX = 10.0f;
static constexpr const float startY = 90.0f; static constexpr const float startY = 90.0f;
static constexpr const float paddingH = 30.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; HostParameters* const module;
@ -149,10 +153,10 @@ struct HostParametersWidget : ModuleWidgetWith9HP {
setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/HostParameters.svg"))); setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/HostParameters.svg")));
createAndAddScrews(); 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 x = startX + int(i % 4) * paddingH;
const float y = startY + int(i % 6) * paddingV; const float y = startY + int(i / 4) * paddingV;
addOutput(createOutput<CardinalParameterPJ301MPort>(Vec(x, y), m, i)); addOutput(createOutput<CardinalParameterPJ301MPort>(Vec(x, y), m, i));
} }
} }
@ -162,22 +166,28 @@ struct HostParametersWidget : ModuleWidgetWith9HP {
drawBackground(args.vg); drawBackground(args.vg);
nvgFontFaceId(args.vg, 0); nvgFontFaceId(args.vg, 0);
nvgFontSize(args.vg, 14); nvgFontSize(args.vg, 10);
char text[] = { '0', '0', '\0' }; char text[] = { '0', '0', '0', '\0'};
for (int i=0; i<24; ++i) 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 x = startX + int(i % 4) * paddingH;
const float y = startY + int(i % 6) * paddingV; const float y = startY + int(i / 4) * paddingV;
nvgBeginPath(args.vg); nvgBeginPath(args.vg);
nvgRoundedRect(args.vg, x - 1.0f, y - 19.0f, paddingH - 4.0f, paddingV - 4.0f, 4); nvgRoundedRect(args.vg, x - 1.0f, y - 19.0f, paddingH - 4.0f, paddingV - 4.0f, 4);
nvgFillColor(args.vg, nvgRGB(0xd0, 0xd0, 0xd0)); nvgFillColor(args.vg, nvgRGB(0xd0, 0xd0, 0xd0));
nvgFill(args.vg); nvgFill(args.vg);
if (text[1]++ == '9')
if (text[2]++ == '9')
{ {
text[1] = '0'; text[2] = '0';
++text[0]; if (text[1]++ == '9')
{
text[1] = '0';
++text[0];
}
} }
nvgBeginPath(args.vg); nvgBeginPath(args.vg);
nvgFillColor(args.vg, color::BLACK); nvgFillColor(args.vg, color::BLACK);
@ -191,6 +201,15 @@ struct HostParametersWidget : ModuleWidgetWith9HP {
{ {
menu->addChild(new MenuSeparator); menu->addChild(new MenuSeparator);
menu->addChild(createBoolPtrMenuItem("Smooth", "", &module->smooth)); 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 #else