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.

153 lines
4.1KB

  1. /*
  2. SumIt
  3. ...still needs some work
  4. */////////////////////////////////////////////////////////////////////////////
  5. #include "pvc.hpp"
  6. #include "dsp/digital.hpp"
  7. namespace rack_plugin_PvC {
  8. struct SumIt : Module {
  9. enum ParamIds {
  10. ATTEN,
  11. ACT_UI = ATTEN + 4,
  12. INV_UI = ACT_UI + 4,
  13. NUM_PARAMS = INV_UI + 4
  14. };
  15. enum InputIds {
  16. INPUT,
  17. ACT_TRIG = INPUT + 4,
  18. INV_TRIG = ACT_TRIG + 4,
  19. RESET_TRIG = INV_TRIG + 4,
  20. NUM_INPUTS
  21. };
  22. enum OutputIds {
  23. SUM_OUT,
  24. INVSUM_OUT,
  25. NUM_OUTPUTS
  26. };
  27. enum LightIds {
  28. ACT_LED,
  29. INV_LED = ACT_LED + 4,
  30. NUM_LIGHTS = INV_LED + 4
  31. };
  32. int mode[4] {};
  33. SchmittTrigger addTrigger[4];
  34. SchmittTrigger subTrigger[4];
  35. SchmittTrigger resetTrigger;
  36. SumIt() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { }
  37. void step() override;
  38. // TODO reset, rand, json
  39. void reset() override {
  40. for (int i = 0; i < 4; i++) {
  41. mode[i] = 0;
  42. }
  43. }
  44. // void randomize() override;
  45. // json_t *toJson() override {
  46. // json_t *rootJ = json_object();
  47. // return rootJ;
  48. // }
  49. // void fromJson(json_t *rootJ) override {
  50. // }
  51. };
  52. void SumIt::step() {
  53. float sum = 0.0f;
  54. for (int i = 0; i < 4; i++)
  55. {
  56. // TODO: change switch logic...
  57. // make the invertTrigger also trigger active.
  58. // when active: trigger at the active side -> off, trigger at the other side -> switch
  59. if (addTrigger[i].process(inputs[ACT_TRIG + i].value + params[ACT_UI + i].value)) {
  60. if (mode[i] == 1) mode[i] = 0;
  61. else mode[i] = 1;
  62. }
  63. if (subTrigger[i].process(inputs[INV_TRIG + i].value + params[INV_UI + i].value)) {
  64. if (mode[i] == 2) mode[i] = 0;
  65. else mode[i] = 2;
  66. }
  67. float control = rescale(params[ATTEN + i].value, 0, 12, 0.0f, 1.0f);
  68. float chanIn = inputs[i].normalize(1.0f) * control;
  69. sum += (mode[i] == 2) ? -chanIn : (mode[i] == 1) ? chanIn : 0.0f;
  70. lights[ACT_LED + i].value = (mode[i] == 1) ? 1:0;
  71. lights[INV_LED + i].value = (mode[i] == 2) ? 1:0;
  72. }
  73. if (resetTrigger.process(inputs[RESET_TRIG].value)) {
  74. reset();
  75. }
  76. clamp(sum, -10.0f, 10.0f);
  77. outputs[SUM_OUT].value = sum;
  78. outputs[INVSUM_OUT].value = -sum;
  79. }
  80. struct EmptyButton : SVGSwitch, MomentarySwitch {
  81. EmptyButton() {
  82. addFrame(SVG::load(assetPlugin(plugin, "res/components/empty.svg")));
  83. box.size = Vec(58,33);
  84. }
  85. };
  86. struct SumItWidget : ModuleWidget {
  87. SumItWidget(SumIt *module);
  88. };
  89. SumItWidget::SumItWidget(SumIt *module) : ModuleWidget(module) {
  90. setPanel(SVG::load(assetPlugin(plugin, "res/panels/SumIt.svg")));
  91. // screws
  92. addChild(Widget::create<ScrewHead1>(Vec(0, 0)));
  93. addChild(Widget::create<ScrewHead2>(Vec(box.size.x - 15, 0)));
  94. addChild(Widget::create<ScrewHead3>(Vec(0, 365)));
  95. addChild(Widget::create<ScrewHead4>(Vec(box.size.x - 15, 365)));
  96. for (int i = 0; i < 4; i++)
  97. {
  98. float top = 76.0f;
  99. addInput(Port::create<InPortAud>(Vec(4, 22 + top*i), Port::INPUT, module, SumIt::INPUT + i));
  100. //TODO: stepped and unstepped knobs
  101. addParam(ParamWidget::create<PvCSnapKnob>(Vec(4, 46 + top*i), module, SumIt::ATTEN + i, 0, 12, 12));
  102. addParam(ParamWidget::create<EmptyButton>(Vec(31, 18 + top*i), module, SumIt::ACT_UI + i, 0, 1, 0));
  103. addChild(ModuleLightWidget::create<EightPixLight<BlueLED>>(Vec(62, 30.5 + top*i), module, SumIt::ACT_LED + i));
  104. addInput(Port::create<InPortBin>(Vec(36, 23.5 + top*i), Port::INPUT, module, SumIt::ACT_TRIG + i));
  105. addParam(ParamWidget::create<EmptyButton>(Vec(31, 52 + top*i), module, SumIt::INV_UI + i, 0, 1, 0));
  106. addChild(ModuleLightWidget::create<EightPixLight<OrangeLED>>(Vec(62, 64.5 + top*i), module, SumIt::INV_LED + i));
  107. addInput(Port::create<InPortBin>(Vec(36, 57.5 + top*i), Port::INPUT, module, SumIt::INV_TRIG + i));
  108. }
  109. addOutput(Port::create<OutPortVal>(Vec(4,336), Port::OUTPUT, module, SumIt::SUM_OUT));
  110. addOutput(Port::create<OutPortVal>(Vec(34,336), Port::OUTPUT, module, SumIt::INVSUM_OUT));
  111. addInput(Port::create<InPortBin>(Vec(64, 326), Port::INPUT, module, SumIt::RESET_TRIG));
  112. }
  113. } // namespace rack_plugin_PvC
  114. using namespace rack_plugin_PvC;
  115. RACK_PLUGIN_MODEL_INIT(PvC, SumIt) {
  116. Model *modelSumIt = Model::create<SumIt, SumItWidget>(
  117. "PvC", "SumIt", "SumIt", BLANK_TAG);
  118. return modelSumIt;
  119. }