| @@ -21,6 +21,8 @@ struct Mixer : Module { | |||||
| LIGHTS_LEN | LIGHTS_LEN | ||||
| }; | }; | ||||
| bool average = false; | |||||
| Mixer() { | Mixer() { | ||||
| config(PARAMS_LEN, INPUTS_LEN, OUTPUTS_LEN, LIGHTS_LEN); | config(PARAMS_LEN, INPUTS_LEN, OUTPUTS_LEN, LIGHTS_LEN); | ||||
| configParam(LEVEL_PARAM, 0.f, 1.f, 1.f, "Level", "%", 0, 100); | configParam(LEVEL_PARAM, 0.f, 1.f, 1.f, "Level", "%", 0, 100); | ||||
| @@ -30,12 +32,19 @@ struct Mixer : Module { | |||||
| } | } | ||||
| void process(const ProcessArgs& args) override { | void process(const ProcessArgs& args) override { | ||||
| // Get number of channels | |||||
| // Get number of channels and number of connected inputs | |||||
| int channels = 1; | int channels = 1; | ||||
| for (int i = 0; i < 6; i++) | |||||
| int connected = 0; | |||||
| for (int i = 0; i < 6; i++) { | |||||
| channels = std::max(channels, inputs[IN_INPUTS + i].getChannels()); | channels = std::max(channels, inputs[IN_INPUTS + i].getChannels()); | ||||
| if (inputs[IN_INPUTS + i].isConnected()) | |||||
| connected++; | |||||
| } | |||||
| float gain = params[LEVEL_PARAM].getValue(); | float gain = params[LEVEL_PARAM].getValue(); | ||||
| if (average) { | |||||
| gain /= std::max(1, connected); | |||||
| } | |||||
| // Iterate polyphonic channels | // Iterate polyphonic channels | ||||
| for (int c = 0; c < channels; c += 4) { | for (int c = 0; c < channels; c += 4) { | ||||
| @@ -54,6 +63,20 @@ struct Mixer : Module { | |||||
| outputs[OUT_OUTPUT].setChannels(channels); | outputs[OUT_OUTPUT].setChannels(channels); | ||||
| } | } | ||||
| json_t* dataToJson() override { | |||||
| json_t* rootJ = json_object(); | |||||
| // average | |||||
| json_object_set_new(rootJ, "average", json_boolean(average)); | |||||
| return rootJ; | |||||
| } | |||||
| void dataFromJson(json_t* rootJ) override { | |||||
| // average | |||||
| json_t* averageJ = json_object_get(rootJ, "average"); | |||||
| if (averageJ) | |||||
| average = json_boolean_value(averageJ); | |||||
| } | |||||
| }; | }; | ||||
| @@ -78,6 +101,15 @@ struct MixerWidget : ModuleWidget { | |||||
| addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(7.62, 113.115)), module, Mixer::OUT_OUTPUT)); | addOutput(createOutputCentered<PJ301MPort>(mm2px(Vec(7.62, 113.115)), module, Mixer::OUT_OUTPUT)); | ||||
| } | } | ||||
| void appendContextMenu(Menu* menu) override { | |||||
| Mixer* module = dynamic_cast<Mixer*>(this->module); | |||||
| assert(module); | |||||
| menu->addChild(new MenuSeparator); | |||||
| menu->addChild(createBoolPtrMenuItem("Average voltages", "", &module->average)); | |||||
| } | |||||
| }; | }; | ||||