You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

168 lines
6.5KB

  1. #include "plugin.hpp"
  2. struct Mutes : Module {
  3. enum ParamIds {
  4. ENUMS(MUTE_PARAM, 10),
  5. NUM_PARAMS
  6. };
  7. enum InputIds {
  8. ENUMS(IN_INPUT, 10),
  9. NUM_INPUTS
  10. };
  11. enum OutputIds {
  12. ENUMS(OUT_OUTPUT, 10),
  13. NUM_OUTPUTS
  14. };
  15. enum LightIds {
  16. ENUMS(MUTE_LIGHT, 10),
  17. NUM_LIGHTS
  18. };
  19. bool state[10];
  20. dsp::BooleanTrigger muteTrigger[10];
  21. Mutes() {
  22. config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS);
  23. for (int i = 0; i < 10; i++) {
  24. configParam(MUTE_PARAM + i, 0.0, 1.0, 0.0, string::f("Ch %d mute", i+1));
  25. }
  26. onReset();
  27. }
  28. void process(const ProcessArgs &args) override {
  29. const float zero[16] = {};
  30. float out[16] = {};
  31. int channels = 1;
  32. // Iterate rows
  33. for (int i = 0; i < 10; i++) {
  34. // Process trigger
  35. if (muteTrigger[i].process(params[MUTE_PARAM + i].getValue() > 0.f))
  36. state[i] ^= true;
  37. // Get input
  38. // Inputs are normalized to the input above it, so only set if connected
  39. if (inputs[IN_INPUT + i].isConnected()) {
  40. inputs[IN_INPUT + i].getVoltages(out);
  41. channels = inputs[IN_INPUT + i].getChannels();
  42. }
  43. // Set output
  44. if (outputs[OUT_OUTPUT + i].isConnected()) {
  45. outputs[OUT_OUTPUT + i].setChannels(channels);
  46. outputs[OUT_OUTPUT + i].setVoltages(state[i] ? out : zero);
  47. }
  48. // Set light
  49. lights[MUTE_LIGHT + i].setBrightness(state[i] ? 0.9f : 0.f);
  50. }
  51. }
  52. void onReset() override {
  53. for (int i = 0; i < 10; i++) {
  54. state[i] = true;
  55. }
  56. }
  57. void onRandomize() override {
  58. for (int i = 0; i < 10; i++) {
  59. state[i] = (random::uniform() < 0.5f);
  60. }
  61. }
  62. json_t *dataToJson() override {
  63. json_t *rootJ = json_object();
  64. // states
  65. json_t *statesJ = json_array();
  66. for (int i = 0; i < 10; i++) {
  67. json_t *stateJ = json_boolean(state[i]);
  68. json_array_append_new(statesJ, stateJ);
  69. }
  70. json_object_set_new(rootJ, "states", statesJ);
  71. return rootJ;
  72. }
  73. void dataFromJson(json_t *rootJ) override {
  74. // states
  75. json_t *statesJ = json_object_get(rootJ, "states");
  76. if (statesJ) {
  77. for (int i = 0; i < 10; i++) {
  78. json_t *stateJ = json_array_get(statesJ, i);
  79. if (stateJ)
  80. state[i] = json_boolean_value(stateJ);
  81. }
  82. }
  83. }
  84. };
  85. template <typename BASE>
  86. struct MuteLight : BASE {
  87. MuteLight() {
  88. this->box.size = mm2px(Vec(6.f, 6.f));
  89. }
  90. };
  91. struct MutesWidget : ModuleWidget {
  92. MutesWidget(Mutes *module) {
  93. setModule(module);
  94. setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/Mutes.svg")));
  95. addChild(createWidget<ScrewSilver>(Vec(15, 0)));
  96. addChild(createWidget<ScrewSilver>(Vec(box.size.x - 30, 0)));
  97. addChild(createWidget<ScrewSilver>(Vec(15, 365)));
  98. addChild(createWidget<ScrewSilver>(Vec(box.size.x - 30, 365)));
  99. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 18.165)), module, Mutes::MUTE_PARAM + 0));
  100. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 28.164)), module, Mutes::MUTE_PARAM + 1));
  101. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 38.164)), module, Mutes::MUTE_PARAM + 2));
  102. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 48.165)), module, Mutes::MUTE_PARAM + 3));
  103. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 58.164)), module, Mutes::MUTE_PARAM + 4));
  104. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 68.165)), module, Mutes::MUTE_PARAM + 5));
  105. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 78.164)), module, Mutes::MUTE_PARAM + 6));
  106. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 88.164)), module, Mutes::MUTE_PARAM + 7));
  107. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 98.165)), module, Mutes::MUTE_PARAM + 8));
  108. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 108.166)), module, Mutes::MUTE_PARAM + 9));
  109. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 17.81)), module, Mutes::IN_INPUT + 0));
  110. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 27.809)), module, Mutes::IN_INPUT + 1));
  111. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 37.809)), module, Mutes::IN_INPUT + 2));
  112. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 47.81)), module, Mutes::IN_INPUT + 3));
  113. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 57.81)), module, Mutes::IN_INPUT + 4));
  114. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 67.809)), module, Mutes::IN_INPUT + 5));
  115. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 77.81)), module, Mutes::IN_INPUT + 6));
  116. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 87.81)), module, Mutes::IN_INPUT + 7));
  117. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 97.809)), module, Mutes::IN_INPUT + 8));
  118. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 107.809)), module, Mutes::IN_INPUT + 9));
  119. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 17.81)), module, Mutes::OUT_OUTPUT + 0));
  120. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 27.809)), module, Mutes::OUT_OUTPUT + 1));
  121. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 37.809)), module, Mutes::OUT_OUTPUT + 2));
  122. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 47.81)), module, Mutes::OUT_OUTPUT + 3));
  123. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 57.809)), module, Mutes::OUT_OUTPUT + 4));
  124. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 67.809)), module, Mutes::OUT_OUTPUT + 5));
  125. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 77.81)), module, Mutes::OUT_OUTPUT + 6));
  126. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 87.81)), module, Mutes::OUT_OUTPUT + 7));
  127. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 97.809)), module, Mutes::OUT_OUTPUT + 8));
  128. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 107.809)), module, Mutes::OUT_OUTPUT + 9));
  129. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 18.915)), module, Mutes::MUTE_LIGHT + 0));
  130. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 28.916)), module, Mutes::MUTE_LIGHT + 1));
  131. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 38.915)), module, Mutes::MUTE_LIGHT + 2));
  132. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 48.915)), module, Mutes::MUTE_LIGHT + 3));
  133. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 58.916)), module, Mutes::MUTE_LIGHT + 4));
  134. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 68.916)), module, Mutes::MUTE_LIGHT + 5));
  135. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 78.915)), module, Mutes::MUTE_LIGHT + 6));
  136. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 88.916)), module, Mutes::MUTE_LIGHT + 7));
  137. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 98.915)), module, Mutes::MUTE_LIGHT + 8));
  138. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 108.915)), module, Mutes::MUTE_LIGHT + 9));
  139. }
  140. };
  141. Model *modelMutes = createModel<Mutes, MutesWidget>("Mutes");