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.

143 lines
6.1KB

  1. #include "Fundamental.hpp"
  2. #include "dsp/digital.hpp"
  3. #define NUM_CHANNELS 10
  4. struct Mutes : Module {
  5. enum ParamIds {
  6. MUTE_PARAM,
  7. NUM_PARAMS = MUTE_PARAM + NUM_CHANNELS
  8. };
  9. enum InputIds {
  10. IN_INPUT,
  11. NUM_INPUTS = IN_INPUT + NUM_CHANNELS
  12. };
  13. enum OutputIds {
  14. OUT_OUTPUT,
  15. NUM_OUTPUTS = OUT_OUTPUT + NUM_CHANNELS
  16. };
  17. enum LightIds {
  18. MUTE_LIGHT,
  19. NUM_LIGHTS = MUTE_LIGHT + NUM_CHANNELS
  20. };
  21. bool state[NUM_CHANNELS];
  22. SchmittTrigger muteTrigger[NUM_CHANNELS];
  23. Mutes() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
  24. onReset();
  25. }
  26. void step() override;
  27. void onReset() override {
  28. for (int i = 0; i < NUM_CHANNELS; i++) {
  29. state[i] = true;
  30. }
  31. }
  32. void onRandomize() override {
  33. for (int i = 0; i < NUM_CHANNELS; i++) {
  34. state[i] = (randomf() < 0.5f);
  35. }
  36. }
  37. json_t *toJson() override {
  38. json_t *rootJ = json_object();
  39. // states
  40. json_t *statesJ = json_array();
  41. for (int i = 0; i < NUM_CHANNELS; i++) {
  42. json_t *stateJ = json_boolean(state[i]);
  43. json_array_append_new(statesJ, stateJ);
  44. }
  45. json_object_set_new(rootJ, "states", statesJ);
  46. return rootJ;
  47. }
  48. void fromJson(json_t *rootJ) override {
  49. // states
  50. json_t *statesJ = json_object_get(rootJ, "states");
  51. if (statesJ) {
  52. for (int i = 0; i < NUM_CHANNELS; i++) {
  53. json_t *stateJ = json_array_get(statesJ, i);
  54. if (stateJ)
  55. state[i] = json_boolean_value(stateJ);
  56. }
  57. }
  58. }
  59. };
  60. void Mutes::step() {
  61. float out = 0.0f;
  62. for (int i = 0; i < NUM_CHANNELS; i++) {
  63. if (muteTrigger[i].process(params[MUTE_PARAM + i].value))
  64. state[i] ^= true;
  65. if (inputs[IN_INPUT + i].active)
  66. out = inputs[IN_INPUT + i].value;
  67. outputs[OUT_OUTPUT + i].value = state[i] ? out : 0.0f;
  68. lights[MUTE_LIGHT + i].setBrightness(state[i] ? 0.9f : 0.0f);
  69. }
  70. }
  71. template <typename BASE>
  72. struct MuteLight : BASE {
  73. MuteLight() {
  74. this->box.size = mm2px(Vec(6.0f, 6.0f));
  75. }
  76. };
  77. MutesWidget::MutesWidget() {
  78. Mutes *module = new Mutes();
  79. setModule(module);
  80. setPanel(SVG::load(assetPlugin(plugin, "res/Mutes.svg")));
  81. addChild(createScrew<ScrewSilver>(Vec(15, 0)));
  82. addChild(createScrew<ScrewSilver>(Vec(box.size.x - 30, 0)));
  83. addChild(createScrew<ScrewSilver>(Vec(15, 365)));
  84. addChild(createScrew<ScrewSilver>(Vec(box.size.x - 30, 365)));
  85. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 18.165)), module, Mutes::MUTE_PARAM + 0, 0.0f, 1.0f, 0.0f));
  86. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 28.164)), module, Mutes::MUTE_PARAM + 1, 0.0f, 1.0f, 0.0f));
  87. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 38.164)), module, Mutes::MUTE_PARAM + 2, 0.0f, 1.0f, 0.0f));
  88. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 48.165)), module, Mutes::MUTE_PARAM + 3, 0.0f, 1.0f, 0.0f));
  89. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 58.164)), module, Mutes::MUTE_PARAM + 4, 0.0f, 1.0f, 0.0f));
  90. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 68.165)), module, Mutes::MUTE_PARAM + 5, 0.0f, 1.0f, 0.0f));
  91. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 78.164)), module, Mutes::MUTE_PARAM + 6, 0.0f, 1.0f, 0.0f));
  92. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 88.164)), module, Mutes::MUTE_PARAM + 7, 0.0f, 1.0f, 0.0f));
  93. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 98.165)), module, Mutes::MUTE_PARAM + 8, 0.0f, 1.0f, 0.0f));
  94. addParam(createParam<LEDBezel>(mm2px(Vec(16.57, 108.166)), module, Mutes::MUTE_PARAM + 9, 0.0f, 1.0f, 0.0f));
  95. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 17.81)), module, Mutes::IN_INPUT + 0));
  96. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 27.809)), module, Mutes::IN_INPUT + 1));
  97. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 37.809)), module, Mutes::IN_INPUT + 2));
  98. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 47.81)), module, Mutes::IN_INPUT + 3));
  99. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 57.81)), module, Mutes::IN_INPUT + 4));
  100. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 67.809)), module, Mutes::IN_INPUT + 5));
  101. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 77.81)), module, Mutes::IN_INPUT + 6));
  102. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 87.81)), module, Mutes::IN_INPUT + 7));
  103. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 97.809)), module, Mutes::IN_INPUT + 8));
  104. addInput(createInput<PJ301MPort>(mm2px(Vec(4.214, 107.809)), module, Mutes::IN_INPUT + 9));
  105. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 17.81)), module, Mutes::OUT_OUTPUT + 0));
  106. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 27.809)), module, Mutes::OUT_OUTPUT + 1));
  107. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 37.809)), module, Mutes::OUT_OUTPUT + 2));
  108. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 47.81)), module, Mutes::OUT_OUTPUT + 3));
  109. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 57.809)), module, Mutes::OUT_OUTPUT + 4));
  110. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 67.809)), module, Mutes::OUT_OUTPUT + 5));
  111. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 77.81)), module, Mutes::OUT_OUTPUT + 6));
  112. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 87.81)), module, Mutes::OUT_OUTPUT + 7));
  113. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 97.809)), module, Mutes::OUT_OUTPUT + 8));
  114. addOutput(createOutput<PJ301MPort>(mm2px(Vec(28.214, 107.809)), module, Mutes::OUT_OUTPUT + 9));
  115. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 18.915)), module, Mutes::MUTE_LIGHT + 0));
  116. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 28.916)), module, Mutes::MUTE_LIGHT + 1));
  117. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 38.915)), module, Mutes::MUTE_LIGHT + 2));
  118. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 48.915)), module, Mutes::MUTE_LIGHT + 3));
  119. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 58.916)), module, Mutes::MUTE_LIGHT + 4));
  120. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 68.916)), module, Mutes::MUTE_LIGHT + 5));
  121. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 78.915)), module, Mutes::MUTE_LIGHT + 6));
  122. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 88.916)), module, Mutes::MUTE_LIGHT + 7));
  123. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 98.915)), module, Mutes::MUTE_LIGHT + 8));
  124. addChild(createLight<MuteLight<GreenLight>>(mm2px(Vec(17.32, 108.915)), module, Mutes::MUTE_LIGHT + 9));
  125. }