Make Host CV work for mini variant, hide unused jacks

Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
falkTX 2022-12-31 12:46:25 +00:00
parent 919e21703b
commit 45022608ab
No known key found for this signature in database
GPG key ID: CDBAA37ABC74FBA0
4 changed files with 140 additions and 56 deletions

View file

@ -313,19 +313,23 @@ struct HostAudio8 : HostAudio<8> {
template<int numIO> template<int numIO>
struct HostAudioWidget : ModuleWidgetWith8HP { struct HostAudioWidget : ModuleWidgetWith8HP {
HostAudio<numIO>* const module; HostAudio<numIO>* const module;
CardinalPluginContext* const pcontext;
HostAudioWidget(HostAudio<numIO>* const m) HostAudioWidget(HostAudio<numIO>* const m)
: module(m) : module(m),
pcontext(static_cast<CardinalPluginContext*>(APP))
{ {
setModule(m); setModule(m);
setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/HostAudio.svg"))); setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/HostAudio.svg")));
createAndAddScrews(); createAndAddScrews();
const uint8_t ioCount = pcontext->variant == kCardinalVariantMain ? 8 : 2;
for (uint i=0; i<numIO; ++i) for (uint i=0; i<numIO; ++i)
{ {
createAndAddInput(i); createAndAddInput(i, i, i<ioCount);
createAndAddOutput(i); createAndAddOutput(i, i, i<ioCount);
} }
} }
@ -395,11 +399,13 @@ struct HostAudioWidget8 : HostAudioWidget<8> {
void draw(const DrawArgs& args) override void draw(const DrawArgs& args) override
{ {
const uint8_t ioCount = pcontext->variant == kCardinalVariantMain ? 8 : 2;
drawBackground(args.vg); drawBackground(args.vg);
drawOutputJacksArea(args.vg, 8); drawOutputJacksArea(args.vg, ioCount);
setupTextLines(args.vg); setupTextLines(args.vg);
for (int i=0; i<8; ++i) for (int i=0; i<ioCount; ++i)
{ {
char text[] = {'A','u','d','i','o',' ',static_cast<char>('0'+i+1),'\0'}; char text[] = {'A','u','d','i','o',' ',static_cast<char>('0'+i+1),'\0'};
drawTextLine(args.vg, i, text); drawTextLine(args.vg, i, text);

View file

@ -18,8 +18,6 @@
#include "plugincontext.hpp" #include "plugincontext.hpp"
#include "ModuleWidgets.hpp" #include "ModuleWidgets.hpp"
#define CARDINAL_AUDIO_IO_OFFSET 8
// ----------------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------------
USE_NAMESPACE_DISTRHO; USE_NAMESPACE_DISTRHO;
@ -54,17 +52,28 @@ struct HostCV : TerminalModule {
throw rack::Exception("Plugin context is null"); throw rack::Exception("Plugin context is null");
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
configParam<SwitchQuantity>(BIPOLAR_INPUTS_1_5, 0.f, 1.f, 0.f, "Bipolar Inputs 1-5")->randomizeEnabled = false;
if (pcontext->variant == kCardinalVariantMini)
{
configParam<SwitchQuantity>(BIPOLAR_INPUTS_1_5, 0.f, 1.f, 0.f, "Bipolar Inputs")->randomizeEnabled = false;
configParam<SwitchQuantity>(BIPOLAR_OUTPUTS_1_5, 0.f, 1.f, 0.f, "Bipolar Outputs")->randomizeEnabled = false;
}
else
{
configParam<SwitchQuantity>(BIPOLAR_INPUTS_1_5, 0.f, 1.f, 0.f, "Bipolar Inputs 1-5")->randomizeEnabled = false;
configParam<SwitchQuantity>(BIPOLAR_OUTPUTS_1_5, 0.f, 1.f, 0.f, "Bipolar Outputs 1-5")->randomizeEnabled = false;
}
configParam<SwitchQuantity>(BIPOLAR_INPUTS_6_10, 0.f, 1.f, 0.f, "Bipolar Inputs 6-10")->randomizeEnabled = false; configParam<SwitchQuantity>(BIPOLAR_INPUTS_6_10, 0.f, 1.f, 0.f, "Bipolar Inputs 6-10")->randomizeEnabled = false;
configParam<SwitchQuantity>(BIPOLAR_OUTPUTS_1_5, 0.f, 1.f, 0.f, "Bipolar Outputs 1-5")->randomizeEnabled = false;
configParam<SwitchQuantity>(BIPOLAR_OUTPUTS_6_10, 0.f, 1.f, 0.f, "Bipolar Outputs 6-10")->randomizeEnabled = false; configParam<SwitchQuantity>(BIPOLAR_OUTPUTS_6_10, 0.f, 1.f, 0.f, "Bipolar Outputs 6-10")->randomizeEnabled = false;
} }
void processTerminalInput(const ProcessArgs&) override void processTerminalInput(const ProcessArgs&) override
{ {
if (pcontext->variant != kCardinalVariantMain) if (pcontext->variant != kCardinalVariantMain && pcontext->variant != kCardinalVariantMini)
return; return;
const uint8_t ioOffset = pcontext->variant == kCardinalVariantMini ? 2 : 8;
const uint32_t bufferSize = pcontext->bufferSize; const uint32_t bufferSize = pcontext->bufferSize;
const uint32_t processCounter = pcontext->processCounter; const uint32_t processCounter = pcontext->processCounter;
@ -87,27 +96,38 @@ struct HostCV : TerminalModule {
} }
else if (const float* const* const dataIns = pcontext->dataIns) else if (const float* const* const dataIns = pcontext->dataIns)
{ {
if (dataIns[CARDINAL_AUDIO_IO_OFFSET] == nullptr) if (dataIns[ioOffset] == nullptr)
return; return;
float outputOffset; float outputOffset;
outputOffset = params[BIPOLAR_OUTPUTS_1_5].getValue() > 0.1f ? 5.0f : 0.0f; outputOffset = params[BIPOLAR_OUTPUTS_1_5].getValue() > 0.1f ? 5.f : 0.f;
for (int i=0; i<5; ++i) for (int i=0; i<5; ++i)
outputs[i].setVoltage(dataIns[i+CARDINAL_AUDIO_IO_OFFSET][k] - outputOffset); outputs[i].setVoltage(dataIns[i+ioOffset][k] - outputOffset);
outputOffset = params[BIPOLAR_OUTPUTS_6_10].getValue() > 0.1f ? 5.0f : 0.0f; if (pcontext->variant == kCardinalVariantMain)
{
outputOffset = params[BIPOLAR_OUTPUTS_6_10].getValue() > 0.1f ? 5.f : 0.f;
for (int i=5; i<10; ++i) for (int i=5; i<10; ++i)
outputs[i].setVoltage(dataIns[i+CARDINAL_AUDIO_IO_OFFSET][k] - outputOffset); outputs[i].setVoltage(dataIns[i+ioOffset][k] - outputOffset);
}
else
{
for (int i=5; i<10; ++i)
outputs[i].setVoltage(0.f);
}
} }
} }
void processTerminalOutput(const ProcessArgs&) override void processTerminalOutput(const ProcessArgs&) override
{ {
if (pcontext->variant != kCardinalVariantMain || pcontext->bypassed) if (pcontext->variant != kCardinalVariantMain && pcontext->variant != kCardinalVariantMini)
return;
if (pcontext->bypassed)
return; return;
const uint8_t ioOffset = pcontext->variant == kCardinalVariantMini ? 2 : 8;
const uint32_t bufferSize = pcontext->bufferSize; const uint32_t bufferSize = pcontext->bufferSize;
// only incremented on output // only incremented on output
@ -119,54 +139,87 @@ struct HostCV : TerminalModule {
float** const dataOuts = pcontext->dataOuts; float** const dataOuts = pcontext->dataOuts;
if (dataOuts[CARDINAL_AUDIO_IO_OFFSET] == nullptr) if (dataOuts[ioOffset] == nullptr)
return; return;
float inputOffset; float inputOffset;
inputOffset = params[BIPOLAR_INPUTS_1_5].getValue() > 0.1f ? 5.0f : 0.0f; inputOffset = params[BIPOLAR_INPUTS_1_5].getValue() > 0.1f ? 5.0f : 0.0f;
for (int i=0; i<5; ++i) for (int i=0; i<5; ++i)
dataOuts[i+CARDINAL_AUDIO_IO_OFFSET][k] += inputs[i].getVoltage() + inputOffset; dataOuts[i+ioOffset][k] += inputs[i].getVoltage() + inputOffset;
inputOffset = params[BIPOLAR_INPUTS_6_10].getValue() > 0.1f ? 5.0f : 0.0f; if (pcontext->variant == kCardinalVariantMain)
{
inputOffset = params[BIPOLAR_INPUTS_6_10].getValue() > 0.1f ? 5.0f : 0.0f;
for (int i=5; i<10; ++i) for (int i=5; i<10; ++i)
dataOuts[i+CARDINAL_AUDIO_IO_OFFSET][k] += inputs[i].getVoltage() + inputOffset; dataOuts[i+ioOffset][k] += inputs[i].getVoltage() + inputOffset;
}
} }
}; };
#ifndef HEADLESS #ifndef HEADLESS
struct HostCVWidget : ModuleWidgetWith8HP { struct HostCVWidget : ModuleWidgetWith8HP {
CardinalPluginContext* const pcontext;
HostCVWidget(HostCV* const module) HostCVWidget(HostCV* const module)
: pcontext(static_cast<CardinalPluginContext*>(APP))
{ {
setModule(module); setModule(module);
setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/HostCV.svg"))); setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/HostCV.svg")));
createAndAddScrews(); createAndAddScrews();
uint8_t maxVisible;
switch (pcontext->variant)
{
case kCardinalVariantMain:
maxVisible = HostCV::NUM_INPUTS;
break;
case kCardinalVariantMini:
maxVisible = 5;
break;
default:
maxVisible = 0;
break;
}
for (uint i=0; i<HostCV::NUM_INPUTS; ++i) for (uint i=0; i<HostCV::NUM_INPUTS; ++i)
createAndAddInput(i); createAndAddInput(i, i, i<maxVisible);
for (uint i=0; i<HostCV::NUM_OUTPUTS; ++i) for (uint i=0; i<HostCV::NUM_OUTPUTS; ++i)
createAndAddOutput(i); createAndAddOutput(i, i, i<maxVisible);
} }
void draw(const DrawArgs& args) override void draw(const DrawArgs& args) override
{ {
drawBackground(args.vg); drawBackground(args.vg);
drawOutputJacksArea(args.vg, HostCV::NUM_INPUTS);
if (pcontext->variant != kCardinalVariantMain && pcontext->variant != kCardinalVariantMini)
return;
drawOutputJacksArea(args.vg, pcontext->variant == kCardinalVariantMini ? 5 : HostCV::NUM_INPUTS);
setupTextLines(args.vg); setupTextLines(args.vg);
drawTextLine(args.vg, 0, "CV 1"); switch (pcontext->variant)
drawTextLine(args.vg, 1, "CV 2"); {
drawTextLine(args.vg, 2, "CV 3"); case kCardinalVariantMain:
drawTextLine(args.vg, 3, "CV 4"); drawTextLine(args.vg, 5, "CV 6");
drawTextLine(args.vg, 4, "CV 5"); drawTextLine(args.vg, 6, "CV 7");
drawTextLine(args.vg, 5, "CV 6"); drawTextLine(args.vg, 7, "CV 8");
drawTextLine(args.vg, 6, "CV 7"); drawTextLine(args.vg, 8, "CV 9");
drawTextLine(args.vg, 7, "CV 8"); drawTextLine(args.vg, 9, "CV 10");
drawTextLine(args.vg, 8, "CV 9"); // fall through
drawTextLine(args.vg, 9, "CV 10"); case kCardinalVariantMini:
drawTextLine(args.vg, 0, "CV 1");
drawTextLine(args.vg, 1, "CV 2");
drawTextLine(args.vg, 2, "CV 3");
drawTextLine(args.vg, 3, "CV 4");
drawTextLine(args.vg, 4, "CV 5");
break;
default:
break;
}
ModuleWidgetWith8HP::draw(args); ModuleWidgetWith8HP::draw(args);
} }
@ -175,25 +228,40 @@ struct HostCVWidget : ModuleWidgetWith8HP {
{ {
menu->addChild(new ui::MenuSeparator); menu->addChild(new ui::MenuSeparator);
menu->addChild(createCheckMenuItem("Bipolar Inputs 1-5", "", if (pcontext->variant == kCardinalVariantMini)
[=]() {return module->params[HostCV::BIPOLAR_INPUTS_1_5].getValue() > 0.1f;}, {
[=]() {module->params[HostCV::BIPOLAR_INPUTS_1_5].setValue(1.0f - module->params[HostCV::BIPOLAR_INPUTS_1_5].getValue());} menu->addChild(createCheckMenuItem("Bipolar Inputs", "",
)); [=]() {return module->params[HostCV::BIPOLAR_INPUTS_1_5].getValue() > 0.1f;},
[=]() {module->params[HostCV::BIPOLAR_INPUTS_1_5].setValue(1.0f - module->params[HostCV::BIPOLAR_INPUTS_1_5].getValue());}
));
menu->addChild(createCheckMenuItem("Bipolar Inputs 6-10", "", menu->addChild(createCheckMenuItem("Bipolar Outputs", "",
[=]() {return module->params[HostCV::BIPOLAR_INPUTS_6_10].getValue() > 0.1f;}, [=]() {return module->params[HostCV::BIPOLAR_OUTPUTS_1_5].getValue() > 0.1f;},
[=]() {module->params[HostCV::BIPOLAR_INPUTS_6_10].setValue(1.0f - module->params[HostCV::BIPOLAR_INPUTS_6_10].getValue());} [=]() {module->params[HostCV::BIPOLAR_OUTPUTS_1_5].setValue(1.0f - module->params[HostCV::BIPOLAR_OUTPUTS_1_5].getValue());}
)); ));
}
else
{
menu->addChild(createCheckMenuItem("Bipolar Inputs 1-5", "",
[=]() {return module->params[HostCV::BIPOLAR_INPUTS_1_5].getValue() > 0.1f;},
[=]() {module->params[HostCV::BIPOLAR_INPUTS_1_5].setValue(1.0f - module->params[HostCV::BIPOLAR_INPUTS_1_5].getValue());}
));
menu->addChild(createCheckMenuItem("Bipolar Outputs 1-5", "", menu->addChild(createCheckMenuItem("Bipolar Inputs 6-10", "",
[=]() {return module->params[HostCV::BIPOLAR_OUTPUTS_1_5].getValue() > 0.1f;}, [=]() {return module->params[HostCV::BIPOLAR_INPUTS_6_10].getValue() > 0.1f;},
[=]() {module->params[HostCV::BIPOLAR_OUTPUTS_1_5].setValue(1.0f - module->params[HostCV::BIPOLAR_OUTPUTS_1_5].getValue());} [=]() {module->params[HostCV::BIPOLAR_INPUTS_6_10].setValue(1.0f - module->params[HostCV::BIPOLAR_INPUTS_6_10].getValue());}
)); ));
menu->addChild(createCheckMenuItem("Bipolar Outputs 6-10", "", menu->addChild(createCheckMenuItem("Bipolar Outputs 1-5", "",
[=]() {return module->params[HostCV::BIPOLAR_OUTPUTS_6_10].getValue() > 0.1f;}, [=]() {return module->params[HostCV::BIPOLAR_OUTPUTS_1_5].getValue() > 0.1f;},
[=]() {module->params[HostCV::BIPOLAR_OUTPUTS_6_10].setValue(1.0f - module->params[HostCV::BIPOLAR_OUTPUTS_6_10].getValue());} [=]() {module->params[HostCV::BIPOLAR_OUTPUTS_1_5].setValue(1.0f - module->params[HostCV::BIPOLAR_OUTPUTS_1_5].getValue());}
)); ));
menu->addChild(createCheckMenuItem("Bipolar Outputs 6-10", "",
[=]() {return module->params[HostCV::BIPOLAR_OUTPUTS_6_10].getValue() > 0.1f;},
[=]() {module->params[HostCV::BIPOLAR_OUTPUTS_6_10].setValue(1.0f - module->params[HostCV::BIPOLAR_OUTPUTS_6_10].getValue());}
));
}
} }
}; };
#else #else

View file

@ -37,16 +37,20 @@ struct ModuleWidgetWithSideScrews : ModuleWidget {
createAndAddInput(paramId, paramId); createAndAddInput(paramId, paramId);
} }
void createAndAddInput(const uint posY, const uint paramId) { void createAndAddInput(const uint posY, const uint paramId, bool visible = true) {
addInput(createInput<PJ301MPort>(Vec(startX_In, startY + padding * posY), module, paramId)); PortWidget* const widget = createInput<PJ301MPort>(Vec(startX_In, startY + padding * posY), module, paramId);
widget->visible = visible;
addInput(widget);
} }
void createAndAddOutput(const uint paramId) { void createAndAddOutput(const uint paramId) {
createAndAddOutput(paramId, paramId); createAndAddOutput(paramId, paramId);
} }
void createAndAddOutput(const uint posY, const uint paramId) { void createAndAddOutput(const uint posY, const uint paramId, bool visible = true) {
addOutput(createOutput<PJ301MPort>(Vec(startX_Out, startY + padding * posY), module, paramId)); PortWidget* const widget = createOutput<PJ301MPort>(Vec(startX_Out, startY + padding * posY), module, paramId);
widget->visible = visible;
addOutput(widget);
} }
void createAndAddScrews() { void createAndAddScrews() {

View file

@ -375,7 +375,11 @@ public:
context->dataOuts = new float*[DISTRHO_PLUGIN_NUM_OUTPUTS]; context->dataOuts = new float*[DISTRHO_PLUGIN_NUM_OUTPUTS];
for (uint32_t i=0; i<DISTRHO_PLUGIN_NUM_INPUTS;++i) for (uint32_t i=0; i<DISTRHO_PLUGIN_NUM_INPUTS;++i)
*const_cast<float**>(&context->dataIns[i]) = new float[1]; {
float** const bufferptr = const_cast<float**>(&context->dataIns[i]);
*bufferptr = new float[1];
(*bufferptr)[0] = 0.f;
}
for (uint32_t i=0; i<DISTRHO_PLUGIN_NUM_OUTPUTS;++i) for (uint32_t i=0; i<DISTRHO_PLUGIN_NUM_OUTPUTS;++i)
context->dataOuts[i] = new float[1]; context->dataOuts[i] = new float[1];
@ -619,6 +623,8 @@ public:
#if CARDINAL_VARIANT_MINI #if CARDINAL_VARIANT_MINI
{ {
const ScopedContext sc(this); const ScopedContext sc(this);
for (uint32_t i=0; i<DISTRHO_PLUGIN_NUM_OUTPUTS;++i)
context->dataOuts[i][0] = 0.f;
++context->processCounter; ++context->processCounter;
context->engine->stepBlock(1); context->engine->stepBlock(1);
} }