diff --git a/src/Mutes.cpp b/src/Mutes.cpp index c958f83..8d7fb27 100644 --- a/src/Mutes.cpp +++ b/src/Mutes.cpp @@ -1,33 +1,30 @@ #include "plugin.hpp" -#define NUM_CHANNELS 10 - - struct Mutes : Module { enum ParamIds { - MUTE_PARAM, - NUM_PARAMS = MUTE_PARAM + NUM_CHANNELS + ENUMS(MUTE_PARAM, 10), + NUM_PARAMS }; enum InputIds { - IN_INPUT, - NUM_INPUTS = IN_INPUT + NUM_CHANNELS + ENUMS(IN_INPUT, 10), + NUM_INPUTS }; enum OutputIds { - OUT_OUTPUT, - NUM_OUTPUTS = OUT_OUTPUT + NUM_CHANNELS + ENUMS(OUT_OUTPUT, 10), + NUM_OUTPUTS }; enum LightIds { - MUTE_LIGHT, - NUM_LIGHTS = MUTE_LIGHT + NUM_CHANNELS + ENUMS(MUTE_LIGHT, 10), + NUM_LIGHTS }; - bool state[NUM_CHANNELS]; - dsp::SchmittTrigger muteTrigger[NUM_CHANNELS]; + bool state[10]; + dsp::BooleanTrigger muteTrigger[10]; Mutes() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); - for (int i = 0; i < NUM_CHANNELS; i++) { + for (int i = 0; i < 10; i++) { params[MUTE_PARAM + i].config(0.0, 1.0, 0.0, string::f("Ch %d mute", i+1)); } @@ -35,24 +32,41 @@ struct Mutes : Module { } void process(const ProcessArgs &args) override { - float out = 0.f; - for (int i = 0; i < NUM_CHANNELS; i++) { - if (muteTrigger[i].process(params[MUTE_PARAM + i].getValue())) + float out[16] = {}; + int channels = 1; + for (int i = 0; i < 10; i++) { + // Process trigger + if (muteTrigger[i].process(params[MUTE_PARAM + i].getValue() > 0.f)) state[i] ^= true; - if (inputs[IN_INPUT + i].active) - out = inputs[IN_INPUT + i].getVoltage(); - outputs[OUT_OUTPUT + i].setVoltage(state[i] ? out : 0.f); - lights[MUTE_LIGHT + i].setBrightness(state[i] ? 0.9f : 0.f); + + // Get input + // Inputs are normalized to the input above it, so only set if connected + if (inputs[IN_INPUT + i].active) { + inputs[IN_INPUT + i].getVoltages(out); + channels = inputs[IN_INPUT + i].getChannels(); + } + + // Set output and light + outputs[OUT_OUTPUT + i].setChannels(channels); + if (state[i]) { + outputs[OUT_OUTPUT + i].setVoltages(out); + lights[MUTE_LIGHT + i].setBrightness(0.9f); + } + else { + for (int c = 0; c < channels; c++) + outputs[OUT_OUTPUT + i].setVoltage(0.f); + lights[MUTE_LIGHT + i].setBrightness(0.f); + } } } void onReset() override { - for (int i = 0; i < NUM_CHANNELS; i++) { + for (int i = 0; i < 10; i++) { state[i] = true; } } void onRandomize() override { - for (int i = 0; i < NUM_CHANNELS; i++) { + for (int i = 0; i < 10; i++) { state[i] = (random::uniform() < 0.5f); } } @@ -61,7 +75,7 @@ struct Mutes : Module { json_t *rootJ = json_object(); // states json_t *statesJ = json_array(); - for (int i = 0; i < NUM_CHANNELS; i++) { + for (int i = 0; i < 10; i++) { json_t *stateJ = json_boolean(state[i]); json_array_append_new(statesJ, stateJ); } @@ -73,7 +87,7 @@ struct Mutes : Module { // states json_t *statesJ = json_object_get(rootJ, "states"); if (statesJ) { - for (int i = 0; i < NUM_CHANNELS; i++) { + for (int i = 0; i < 10; i++) { json_t *stateJ = json_array_get(statesJ, i); if (stateJ) state[i] = json_boolean_value(stateJ);