|
@@ -19,30 +19,22 @@ struct Mutes : Module { |
|
|
NUM_LIGHTS |
|
|
NUM_LIGHTS |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
bool state[10]; |
|
|
|
|
|
dsp::BooleanTrigger muteTrigger[10]; |
|
|
|
|
|
|
|
|
|
|
|
Mutes() { |
|
|
Mutes() { |
|
|
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); |
|
|
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); |
|
|
for (int i = 0; i < 10; i++) { |
|
|
for (int i = 0; i < 10; i++) { |
|
|
configButton(MUTE_PARAMS + i, string::f("Row %d mute", i + 1)); |
|
|
|
|
|
|
|
|
configSwitch(MUTE_PARAMS + i, 0.f, 1.f, 0.f, string::f("Row %d mute", i + 1)); |
|
|
configInput(IN_INPUTS + i, string::f("Row %d", i + 1)); |
|
|
configInput(IN_INPUTS + i, string::f("Row %d", i + 1)); |
|
|
configOutput(OUT_OUTPUTS + i, string::f("Row %d", i + 1)); |
|
|
configOutput(OUT_OUTPUTS + i, string::f("Row %d", i + 1)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
onReset(); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void process(const ProcessArgs& args) override { |
|
|
void process(const ProcessArgs& args) override { |
|
|
const float zero[16] = {}; |
|
|
|
|
|
float out[16] = {}; |
|
|
|
|
|
int channels = 1; |
|
|
|
|
|
|
|
|
|
|
|
// Iterate rows |
|
|
// Iterate rows |
|
|
for (int i = 0; i < 10; i++) { |
|
|
for (int i = 0; i < 10; i++) { |
|
|
// Process trigger |
|
|
|
|
|
if (muteTrigger[i].process(params[MUTE_PARAMS + i].getValue() > 0.f)) |
|
|
|
|
|
state[i] ^= true; |
|
|
|
|
|
|
|
|
int channels = 1; |
|
|
|
|
|
const float zero[16] = {}; |
|
|
|
|
|
float out[16] = {}; |
|
|
|
|
|
bool mute = params[MUTE_PARAMS + i].getValue() > 0.f; |
|
|
|
|
|
|
|
|
// Get input |
|
|
// Get input |
|
|
// Inputs are normalized to the input above it, so only set if connected |
|
|
// Inputs are normalized to the input above it, so only set if connected |
|
@@ -54,54 +46,29 @@ struct Mutes : Module { |
|
|
// Set output |
|
|
// Set output |
|
|
if (outputs[OUT_OUTPUTS + i].isConnected()) { |
|
|
if (outputs[OUT_OUTPUTS + i].isConnected()) { |
|
|
outputs[OUT_OUTPUTS + i].setChannels(channels); |
|
|
outputs[OUT_OUTPUTS + i].setChannels(channels); |
|
|
outputs[OUT_OUTPUTS + i].writeVoltages(state[i] ? out : zero); |
|
|
|
|
|
|
|
|
outputs[OUT_OUTPUTS + i].writeVoltages(mute ? zero : out); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Set light |
|
|
// Set light |
|
|
lights[MUTE_LIGHTS + i].setBrightness(state[i] ? 0.9f : 0.f); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void onReset() override { |
|
|
|
|
|
for (int i = 0; i < 10; i++) { |
|
|
|
|
|
state[i] = true; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
void onRandomize() override { |
|
|
|
|
|
for (int i = 0; i < 10; i++) { |
|
|
|
|
|
state[i] = random::get<bool>(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
json_t* dataToJson() override { |
|
|
|
|
|
json_t* rootJ = json_object(); |
|
|
|
|
|
|
|
|
|
|
|
// states |
|
|
|
|
|
json_t* statesJ = json_array(); |
|
|
|
|
|
for (int i = 0; i < 10; i++) { |
|
|
|
|
|
json_t* stateJ = json_boolean(state[i]); |
|
|
|
|
|
json_array_append_new(statesJ, stateJ); |
|
|
|
|
|
|
|
|
lights[MUTE_LIGHTS + i].setBrightness(mute); |
|
|
} |
|
|
} |
|
|
json_object_set_new(rootJ, "states", statesJ); |
|
|
|
|
|
|
|
|
|
|
|
return rootJ; |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void dataFromJson(json_t* rootJ) override { |
|
|
void dataFromJson(json_t* rootJ) override { |
|
|
// states |
|
|
|
|
|
|
|
|
// In <2.0, states were stored in data |
|
|
json_t* statesJ = json_object_get(rootJ, "states"); |
|
|
json_t* statesJ = json_object_get(rootJ, "states"); |
|
|
if (statesJ) { |
|
|
if (statesJ) { |
|
|
for (int i = 0; i < 10; i++) { |
|
|
for (int i = 0; i < 10; i++) { |
|
|
json_t* stateJ = json_array_get(statesJ, i); |
|
|
json_t* stateJ = json_array_get(statesJ, i); |
|
|
if (stateJ) |
|
|
if (stateJ) |
|
|
state[i] = json_boolean_value(stateJ); |
|
|
|
|
|
|
|
|
params[MUTE_PARAMS + i].setValue(!json_boolean_value(stateJ)); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void invertMutes() { |
|
|
|
|
|
|
|
|
void invert() { |
|
|
for (int i = 0; i < 10; i++) { |
|
|
for (int i = 0; i < 10; i++) { |
|
|
state[i] ^= true; |
|
|
|
|
|
|
|
|
params[MUTE_PARAMS + i].setValue(!params[MUTE_PARAMS + i].getValue()); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
@@ -117,16 +84,16 @@ struct MutesWidget : ModuleWidget { |
|
|
addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); |
|
|
addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); |
|
|
addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); |
|
|
addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); |
|
|
|
|
|
|
|
|
addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(20.312, 21.968)), module, Mutes::MUTE_PARAMS + 0, Mutes::MUTE_LIGHTS + 0)); |
|
|
|
|
|
addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(20.312, 32.095)), module, Mutes::MUTE_PARAMS + 1, Mutes::MUTE_LIGHTS + 1)); |
|
|
|
|
|
addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(20.312, 42.222)), module, Mutes::MUTE_PARAMS + 2, Mutes::MUTE_LIGHTS + 2)); |
|
|
|
|
|
addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(20.312, 52.35)), module, Mutes::MUTE_PARAMS + 3, Mutes::MUTE_LIGHTS + 3)); |
|
|
|
|
|
addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(20.312, 62.477)), module, Mutes::MUTE_PARAMS + 4, Mutes::MUTE_LIGHTS + 4)); |
|
|
|
|
|
addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(20.312, 72.605)), module, Mutes::MUTE_PARAMS + 5, Mutes::MUTE_LIGHTS + 5)); |
|
|
|
|
|
addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(20.312, 82.732)), module, Mutes::MUTE_PARAMS + 6, Mutes::MUTE_LIGHTS + 6)); |
|
|
|
|
|
addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(20.312, 92.86)), module, Mutes::MUTE_PARAMS + 7, Mutes::MUTE_LIGHTS + 7)); |
|
|
|
|
|
addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(20.312, 102.987)), module, Mutes::MUTE_PARAMS + 8, Mutes::MUTE_LIGHTS + 8)); |
|
|
|
|
|
addParam(createLightParamCentered<LEDLightBezel<>>(mm2px(Vec(20.312, 113.115)), module, Mutes::MUTE_PARAMS + 9, Mutes::MUTE_LIGHTS + 9)); |
|
|
|
|
|
|
|
|
addParam(createLightParamCentered<LEDLightLatch<MediumSimpleLight<WhiteLight>>>(mm2px(Vec(20.312, 21.968)), module, Mutes::MUTE_PARAMS + 0, Mutes::MUTE_LIGHTS + 0)); |
|
|
|
|
|
addParam(createLightParamCentered<LEDLightLatch<MediumSimpleLight<WhiteLight>>>(mm2px(Vec(20.312, 32.095)), module, Mutes::MUTE_PARAMS + 1, Mutes::MUTE_LIGHTS + 1)); |
|
|
|
|
|
addParam(createLightParamCentered<LEDLightLatch<MediumSimpleLight<WhiteLight>>>(mm2px(Vec(20.312, 42.222)), module, Mutes::MUTE_PARAMS + 2, Mutes::MUTE_LIGHTS + 2)); |
|
|
|
|
|
addParam(createLightParamCentered<LEDLightLatch<MediumSimpleLight<WhiteLight>>>(mm2px(Vec(20.312, 52.35)), module, Mutes::MUTE_PARAMS + 3, Mutes::MUTE_LIGHTS + 3)); |
|
|
|
|
|
addParam(createLightParamCentered<LEDLightLatch<MediumSimpleLight<WhiteLight>>>(mm2px(Vec(20.312, 62.477)), module, Mutes::MUTE_PARAMS + 4, Mutes::MUTE_LIGHTS + 4)); |
|
|
|
|
|
addParam(createLightParamCentered<LEDLightLatch<MediumSimpleLight<WhiteLight>>>(mm2px(Vec(20.312, 72.605)), module, Mutes::MUTE_PARAMS + 5, Mutes::MUTE_LIGHTS + 5)); |
|
|
|
|
|
addParam(createLightParamCentered<LEDLightLatch<MediumSimpleLight<WhiteLight>>>(mm2px(Vec(20.312, 82.732)), module, Mutes::MUTE_PARAMS + 6, Mutes::MUTE_LIGHTS + 6)); |
|
|
|
|
|
addParam(createLightParamCentered<LEDLightLatch<MediumSimpleLight<WhiteLight>>>(mm2px(Vec(20.312, 92.86)), module, Mutes::MUTE_PARAMS + 7, Mutes::MUTE_LIGHTS + 7)); |
|
|
|
|
|
addParam(createLightParamCentered<LEDLightLatch<MediumSimpleLight<WhiteLight>>>(mm2px(Vec(20.312, 102.987)), module, Mutes::MUTE_PARAMS + 8, Mutes::MUTE_LIGHTS + 8)); |
|
|
|
|
|
addParam(createLightParamCentered<LEDLightLatch<MediumSimpleLight<WhiteLight>>>(mm2px(Vec(20.312, 113.115)), module, Mutes::MUTE_PARAMS + 9, Mutes::MUTE_LIGHTS + 9)); |
|
|
|
|
|
|
|
|
addInput(createInputCentered<PJ301MPort>(mm2px(Vec(7.291, 21.968)), module, Mutes::IN_INPUTS + 0)); |
|
|
addInput(createInputCentered<PJ301MPort>(mm2px(Vec(7.291, 21.968)), module, Mutes::IN_INPUTS + 0)); |
|
|
addInput(createInputCentered<PJ301MPort>(mm2px(Vec(7.291, 32.095)), module, Mutes::IN_INPUTS + 1)); |
|
|
addInput(createInputCentered<PJ301MPort>(mm2px(Vec(7.291, 32.095)), module, Mutes::IN_INPUTS + 1)); |
|
@@ -158,7 +125,7 @@ struct MutesWidget : ModuleWidget { |
|
|
menu->addChild(new MenuSeparator); |
|
|
menu->addChild(new MenuSeparator); |
|
|
|
|
|
|
|
|
menu->addChild(createMenuItem("Invert mutes", "", |
|
|
menu->addChild(createMenuItem("Invert mutes", "", |
|
|
[=]() {module->invertMutes();} |
|
|
|
|
|
|
|
|
[=]() {module->invert();} |
|
|
)); |
|
|
)); |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|