diff --git a/src/Merge.cpp b/src/Merge.cpp index eac2151..71c1579 100644 --- a/src/Merge.cpp +++ b/src/Merge.cpp @@ -19,24 +19,30 @@ struct Merge : Module { }; dsp::Counter lightCounter; + int channels; Merge() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); lightCounter.setPeriod(512); + onReset(); + } + + void onReset() override { + channels = -1; } void process(const ProcessArgs &args) override { int lastChannel = -1; for (int c = 0; c < 16; c++) { + float v = 0.f; if (inputs[MONO_INPUTS + c].isConnected()) { lastChannel = c; - float v = inputs[MONO_INPUTS + c].getVoltage(); - outputs[POLY_OUTPUT].setVoltage(v, c); + v = inputs[MONO_INPUTS + c].getVoltage(); } + outputs[POLY_OUTPUT].setVoltage(v, c); } - // This also sets higher channels to 0V if the number of channels shrinks. - outputs[POLY_OUTPUT].setChannels(lastChannel + 1); + outputs[POLY_OUTPUT].setChannels((channels >= 0) ? channels : (lastChannel + 1)); // Set channel lights infrequently if (lightCounter.process()) { @@ -46,6 +52,47 @@ struct Merge : Module { } } } + + json_t *dataToJson() override { + json_t *rootJ = json_object(); + json_object_set_new(rootJ, "channels", json_integer(channels)); + return rootJ; + } + + void dataFromJson(json_t *rootJ) override { + json_t *channelsJ = json_object_get(rootJ, "channels"); + if (channelsJ) + channels = json_integer_value(channelsJ); + } +}; + + +struct MergeChannelItem : MenuItem { + Merge *module; + int channels; + void onAction(const event::Action &e) override { + module->channels = channels; + } +}; + + +struct MergeChannelsItem : MenuItem { + Merge *module; + Menu *createChildMenu() override { + Menu *menu = new Menu; + for (int channels = -1; channels <= 16; channels++) { + MergeChannelItem *item = new MergeChannelItem; + if (channels < 0) + item->text = "Automatic"; + else + item->text = string::f("%d", channels); + item->rightText = CHECKMARK(module->channels == channels); + item->module = module; + item->channels = channels; + menu->addChild(item); + } + return menu; + } }; @@ -95,6 +142,18 @@ struct MergeWidget : ModuleWidget { addChild(createLightCentered>(mm2px(Vec(19.275, 23.775)), module, Merge::CHANNEL_LIGHTS + 14)); addChild(createLightCentered>(mm2px(Vec(21.276, 23.775)), module, Merge::CHANNEL_LIGHTS + 15)); } + + void appendContextMenu(Menu *menu) override { + Merge *module = dynamic_cast(this->module); + + menu->addChild(new MenuEntry); + + MergeChannelsItem *channelsItem = new MergeChannelsItem; + channelsItem->text = "Channels"; + channelsItem->rightText = RIGHT_ARROW; + channelsItem->module = module; + menu->addChild(channelsItem); + } };