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.

151 lines
4.1KB

  1. #include "RJModules.hpp"
  2. #include "dsp/digital.hpp"
  3. #include "common.hpp"
  4. #include <iostream>
  5. #include <cmath>
  6. #include <sstream>
  7. #include <iomanip>
  8. /*
  9. Thanks to Strum for the display widget!
  10. */
  11. namespace rack_plugin_RJModules {
  12. struct Displays: Module {
  13. enum ParamIds {
  14. NUM_PARAMS
  15. };
  16. enum InputIds {
  17. CH1_INPUT,
  18. CH2_INPUT,
  19. CH3_INPUT,
  20. NUM_INPUTS
  21. };
  22. enum OutputIds {
  23. CH1_OUTPUT,
  24. CH2_OUTPUT,
  25. CH3_OUTPUT,
  26. NUM_OUTPUTS
  27. };
  28. enum LightIds {
  29. NUM_LIGHTS
  30. };
  31. float display1_val;
  32. float display2_val;
  33. float display3_val;
  34. Displays() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {}
  35. void step() override;
  36. };
  37. struct NumberDisplayWidgeter : TransparentWidget {
  38. float *value;
  39. std::shared_ptr<Font> font;
  40. NumberDisplayWidgeter() {
  41. font = Font::load(assetPlugin(plugin, "res/Segment7Standard.ttf"));
  42. };
  43. void draw(NVGcontext *vg) override
  44. {
  45. // Background
  46. NVGcolor backgroundColor = nvgRGB(0xC0, 0xC0, 0xC0);
  47. nvgBeginPath(vg);
  48. nvgRoundedRect(vg, 0.0, 0.0, box.size.x, box.size.y, 4.0);
  49. nvgFillColor(vg, backgroundColor);
  50. nvgFill(vg);
  51. // text
  52. nvgFontSize(vg, 32);
  53. nvgFontFaceId(vg, font->handle);
  54. nvgTextLetterSpacing(vg, 2.5);
  55. std::stringstream to_display;
  56. to_display = format4display(*value);
  57. Vec textPos = Vec(16.0f, 33.0f);
  58. NVGcolor textColor = nvgRGB(0x00, 0x00, 0x00);
  59. nvgFillColor(vg, textColor);
  60. nvgText(vg, textPos.x, textPos.y, to_display.str().c_str(), NULL);
  61. nvgFontSize(vg, 16);
  62. textPos = Vec(1.0f, (*value<0?20.0f:30.0f));
  63. nvgText(vg, textPos.x, textPos.y, (*value<0?"-":"+"), NULL);
  64. }
  65. };
  66. void Displays::step() {
  67. display1_val = inputs[CH1_INPUT].value;
  68. outputs[CH1_OUTPUT].value = inputs[CH1_INPUT].value;
  69. display2_val = inputs[CH2_INPUT].value;
  70. outputs[CH2_OUTPUT].value = inputs[CH2_INPUT].value;
  71. display3_val = inputs[CH3_INPUT].value;
  72. outputs[CH3_OUTPUT].value = inputs[CH3_INPUT].value;
  73. }
  74. struct DisplaysWidget: ModuleWidget {
  75. DisplaysWidget(Displays *module);
  76. };
  77. DisplaysWidget::DisplaysWidget(Displays *module) : ModuleWidget(module) {
  78. box.size = Vec(15*10, 380);
  79. {
  80. SVGPanel *panel = new SVGPanel();
  81. panel->box.size = box.size;
  82. panel->setBackground(SVG::load(assetPlugin(plugin, "res/Displays.svg")));
  83. addChild(panel);
  84. }
  85. addChild(Widget::create<ScrewSilver>(Vec(15, 0)));
  86. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 0)));
  87. addChild(Widget::create<ScrewSilver>(Vec(15, 365)));
  88. addChild(Widget::create<ScrewSilver>(Vec(box.size.x-30, 365)));
  89. NumberDisplayWidgeter *display = new NumberDisplayWidgeter();
  90. display->box.pos = Vec(28, 60);
  91. display->box.size = Vec(100, 40);
  92. display->value = &module->display1_val;
  93. addChild(display);
  94. addInput(Port::create<PJ301MPort>(Vec(35, 123), Port::INPUT, module, Displays::CH1_INPUT));
  95. addOutput(Port::create<PJ301MPort>(Vec(95, 123), Port::OUTPUT, module, Displays::CH1_OUTPUT));
  96. NumberDisplayWidgeter *display2 = new NumberDisplayWidgeter();
  97. display2->box.pos = Vec(28, 160);
  98. display2->box.size = Vec(100, 40);
  99. display2->value = &module->display2_val;
  100. addChild(display2);
  101. addInput(Port::create<PJ301MPort>(Vec(35, 223), Port::INPUT, module, Displays::CH2_INPUT));
  102. addOutput(Port::create<PJ301MPort>(Vec(95, 223), Port::OUTPUT, module, Displays::CH2_OUTPUT));
  103. NumberDisplayWidgeter *display3 = new NumberDisplayWidgeter();
  104. display3->box.pos = Vec(28, 260);
  105. display3->box.size = Vec(100, 40);
  106. display3->value = &module->display3_val;
  107. addChild(display3);
  108. addInput(Port::create<PJ301MPort>(Vec(35, 323), Port::INPUT, module, Displays::CH3_INPUT));
  109. addOutput(Port::create<PJ301MPort>(Vec(95, 323), Port::OUTPUT, module, Displays::CH3_OUTPUT));
  110. }
  111. } // namespace rack_plugin_RJModules
  112. using namespace rack_plugin_RJModules;
  113. RACK_PLUGIN_MODEL_INIT(RJModules, Displays) {
  114. Model *modelDisplays = Model::create<Displays, DisplaysWidget>("RJModules", "Displays", "[UTIL] Displays", VISUAL_TAG);
  115. return modelDisplays;
  116. }