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.

79 lines
2.5KB

  1. #include "Befaco.hpp"
  2. struct DualAtenuverter : Module {
  3. enum ParamIds {
  4. ATEN1_PARAM,
  5. OFFSET1_PARAM,
  6. ATEN2_PARAM,
  7. OFFSET2_PARAM,
  8. NUM_PARAMS
  9. };
  10. enum InputIds {
  11. IN1_INPUT,
  12. IN2_INPUT,
  13. NUM_INPUTS
  14. };
  15. enum OutputIds {
  16. OUT1_OUTPUT,
  17. OUT2_OUTPUT,
  18. NUM_OUTPUTS
  19. };
  20. enum LightIds {
  21. OUT1_POS_LIGHT,
  22. OUT1_NEG_LIGHT,
  23. OUT2_POS_LIGHT,
  24. OUT2_NEG_LIGHT,
  25. NUM_LIGHTS
  26. };
  27. DualAtenuverter() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
  28. void step() override;
  29. };
  30. void DualAtenuverter::step() {
  31. float out1 = inputs[IN1_INPUT].value * params[ATEN1_PARAM].value + params[OFFSET1_PARAM].value;
  32. float out2 = inputs[IN2_INPUT].value * params[ATEN2_PARAM].value + params[OFFSET2_PARAM].value;
  33. out1 = clampf(out1, -10.0, 10.0);
  34. out2 = clampf(out2, -10.0, 10.0);
  35. outputs[OUT1_OUTPUT].value = out1;
  36. outputs[OUT2_OUTPUT].value = out2;
  37. lights[OUT1_POS_LIGHT].value = fmaxf(0.0, out1 / 5.0);
  38. lights[OUT1_NEG_LIGHT].value = fmaxf(0.0, -out1 / 5.0);
  39. lights[OUT2_POS_LIGHT].value = fmaxf(0.0, out2 / 5.0);
  40. lights[OUT2_NEG_LIGHT].value = fmaxf(0.0, -out2 / 5.0);
  41. }
  42. DualAtenuverterWidget::DualAtenuverterWidget() {
  43. DualAtenuverter *module = new DualAtenuverter();
  44. setModule(module);
  45. box.size = Vec(15*5, 380);
  46. {
  47. SVGPanel *panel = new SVGPanel();
  48. panel->box.size = box.size;
  49. panel->setBackground(SVG::load(assetPlugin(plugin, "res/DualAtenuverter.svg")));
  50. addChild(panel);
  51. }
  52. addChild(createScrew<Knurlie>(Vec(15, 0)));
  53. addChild(createScrew<Knurlie>(Vec(15, 365)));
  54. addParam(createParam<Davies1900hWhiteKnob>(Vec(20, 33), module, DualAtenuverter::ATEN1_PARAM, -1.0, 1.0, 0.0));
  55. addParam(createParam<Davies1900hRedKnob>(Vec(20, 91), module, DualAtenuverter::OFFSET1_PARAM, -10.0, 10.0, 0.0));
  56. addParam(createParam<Davies1900hWhiteKnob>(Vec(20, 201), module, DualAtenuverter::ATEN2_PARAM, -1.0, 1.0, 0.0));
  57. addParam(createParam<Davies1900hRedKnob>(Vec(20, 260), module, DualAtenuverter::OFFSET2_PARAM, -10.0, 10.0, 0.0));
  58. addInput(createInput<PJ301MPort>(Vec(7, 152), module, DualAtenuverter::IN1_INPUT));
  59. addOutput(createOutput<PJ301MPort>(Vec(43, 152), module, DualAtenuverter::OUT1_OUTPUT));
  60. addInput(createInput<PJ301MPort>(Vec(7, 319), module, DualAtenuverter::IN2_INPUT));
  61. addOutput(createOutput<PJ301MPort>(Vec(43, 319), module, DualAtenuverter::OUT2_OUTPUT));
  62. addChild(createLight<MediumLight<GreenRedLight>>(Vec(33, 143), module, DualAtenuverter::OUT1_POS_LIGHT));
  63. addChild(createLight<MediumLight<GreenRedLight>>(Vec(33, 311), module, DualAtenuverter::OUT2_POS_LIGHT));
  64. }