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.

123 lines
6.9KB

  1. /////////////////////////////////////////////////////
  2. // Stereo VU Meter module by Alfredo Santamaria - AS - https://github.com/AScustomWorks/AS
  3. // StereoVUmeter
  4. //
  5. /////////////////////////////////////////////////////
  6. #include "AS.hpp"
  7. #include "dsp/vumeter.hpp"
  8. struct StereoVUmeter : Module {
  9. enum ParamIds {
  10. NUM_PARAMS
  11. };
  12. enum InputIds {
  13. INPUT_LEFT,
  14. INPUT_RIGHT,
  15. NUM_INPUTS
  16. };
  17. enum OutputIds {
  18. OUT_LEFT,
  19. OUT_RIGHT,
  20. NUM_OUTPUTS
  21. };
  22. enum LightIds {
  23. METER_LIGHT_LEFT,
  24. METER_LIGHT_RIGHT = METER_LIGHT_LEFT+15,
  25. NUM_LIGHTS = METER_LIGHT_RIGHT + 15
  26. };
  27. StereoVUmeter() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
  28. }
  29. void step() override;
  30. VUMeter vuBar;
  31. };
  32. void StereoVUmeter::step(){
  33. //GET VALUES AND ROUTE SIGNALS TO OUTPUTS
  34. float signal_in_Left = inputs[INPUT_LEFT].value;
  35. float signal_in_Right = inputs[INPUT_RIGHT].value;
  36. outputs[OUT_LEFT].value = signal_in_Left;
  37. outputs[OUT_RIGHT].value = signal_in_Right;
  38. //VU METER BARS LIGHTS
  39. vuBar.dBInterval = 3;
  40. for (int i = 0; i < 15; i++){
  41. vuBar.setValue(signal_in_Left / 10.0f);
  42. lights[METER_LIGHT_LEFT + i].setBrightnessSmooth(vuBar.getBrightness(i));
  43. vuBar.setValue(signal_in_Right / 10.0f);
  44. lights[METER_LIGHT_RIGHT + i].setBrightnessSmooth(vuBar.getBrightness(i));
  45. }
  46. };
  47. struct StereoVUmeterWidget : ModuleWidget
  48. {
  49. StereoVUmeterWidget(StereoVUmeter *module);
  50. };
  51. StereoVUmeterWidget::StereoVUmeterWidget(StereoVUmeter *module) : ModuleWidget(module) {
  52. setPanel(SVG::load(assetPlugin(plugin, "res/StereoVUmeter.svg")));
  53. //SCREWS - SPECIAL SPACING FOR RACK WIDTH*4
  54. addChild(Widget::create<as_HexScrew>(Vec(0, 0)));
  55. addChild(Widget::create<as_HexScrew>(Vec(box.size.x - RACK_GRID_WIDTH, 0)));
  56. addChild(Widget::create<as_HexScrew>(Vec(0, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  57. addChild(Widget::create<as_HexScrew>(Vec(box.size.x - RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  58. // LEFT COLUMN LEDs
  59. static const float leftCol = 15;
  60. static const float offsetY = 12;
  61. static const float startY = 66;
  62. addChild(ModuleLightWidget::create<MeterLight<RedLight>>(Vec(leftCol, startY + offsetY * 0), module, StereoVUmeter::METER_LIGHT_LEFT + 0));
  63. addChild(ModuleLightWidget::create<MeterLight<RedLight>>(Vec(leftCol, startY + offsetY * 1), module, StereoVUmeter::METER_LIGHT_LEFT + 1));
  64. addChild(ModuleLightWidget::create<MeterLight<RedLight>>(Vec(leftCol, startY + offsetY * 2), module, StereoVUmeter::METER_LIGHT_LEFT + 2));
  65. addChild(ModuleLightWidget::create<MeterLight<OrangeLight>>(Vec(leftCol, startY + offsetY * 3), module, StereoVUmeter::METER_LIGHT_LEFT + 3));
  66. addChild(ModuleLightWidget::create<MeterLight<OrangeLight>>(Vec(leftCol, startY + offsetY * 4), module, StereoVUmeter::METER_LIGHT_LEFT + 4));
  67. addChild(ModuleLightWidget::create<MeterLight<OrangeLight>>(Vec(leftCol, startY + offsetY * 5), module, StereoVUmeter::METER_LIGHT_LEFT + 5));
  68. addChild(ModuleLightWidget::create<MeterLight<YellowLight>>(Vec(leftCol, startY + offsetY * 6), module, StereoVUmeter::METER_LIGHT_LEFT + 6));
  69. addChild(ModuleLightWidget::create<MeterLight<YellowLight>>(Vec(leftCol, startY + offsetY * 7), module, StereoVUmeter::METER_LIGHT_LEFT + 7));
  70. addChild(ModuleLightWidget::create<MeterLight<YellowLight>>(Vec(leftCol, startY + offsetY * 8), module, StereoVUmeter::METER_LIGHT_LEFT + 8));
  71. addChild(ModuleLightWidget::create<MeterLight<YellowLight>>(Vec(leftCol, startY + offsetY * 9), module, StereoVUmeter::METER_LIGHT_LEFT + 9));
  72. addChild(ModuleLightWidget::create<MeterLight<GreenLight>>(Vec(leftCol, startY + offsetY * 10), module, StereoVUmeter::METER_LIGHT_LEFT + 10));
  73. addChild(ModuleLightWidget::create<MeterLight<GreenLight>>(Vec(leftCol, startY + offsetY * 11), module, StereoVUmeter::METER_LIGHT_LEFT + 11));
  74. addChild(ModuleLightWidget::create<MeterLight<GreenLight>>(Vec(leftCol, startY + offsetY * 12), module, StereoVUmeter::METER_LIGHT_LEFT + 12));
  75. addChild(ModuleLightWidget::create<MeterLight<GreenLight>>(Vec(leftCol, startY + offsetY * 13), module, StereoVUmeter::METER_LIGHT_LEFT + 13));
  76. addChild(ModuleLightWidget::create<MeterLight<GreenLight>>(Vec(leftCol, startY + offsetY * 14), module, StereoVUmeter::METER_LIGHT_LEFT + 14));
  77. //RIGHT COLUMN LEDs
  78. static const float rightCol = 37;
  79. addChild(ModuleLightWidget::create<MeterLight<RedLight>>(Vec(rightCol, startY + offsetY * 0), module, StereoVUmeter::METER_LIGHT_RIGHT + 0));
  80. addChild(ModuleLightWidget::create<MeterLight<RedLight>>(Vec(rightCol, startY + offsetY * 1), module, StereoVUmeter::METER_LIGHT_RIGHT + 1));
  81. addChild(ModuleLightWidget::create<MeterLight<RedLight>>(Vec(rightCol, startY + offsetY * 2), module, StereoVUmeter::METER_LIGHT_RIGHT + 2));
  82. addChild(ModuleLightWidget::create<MeterLight<OrangeLight>>(Vec(rightCol, startY + offsetY * 3), module, StereoVUmeter::METER_LIGHT_RIGHT + 3));
  83. addChild(ModuleLightWidget::create<MeterLight<OrangeLight>>(Vec(rightCol, startY + offsetY * 4), module, StereoVUmeter::METER_LIGHT_RIGHT + 4));
  84. addChild(ModuleLightWidget::create<MeterLight<OrangeLight>>(Vec(rightCol, startY + offsetY * 5), module, StereoVUmeter::METER_LIGHT_RIGHT + 5));
  85. addChild(ModuleLightWidget::create<MeterLight<YellowLight>>(Vec(rightCol, startY + offsetY * 6), module, StereoVUmeter::METER_LIGHT_RIGHT + 6));
  86. addChild(ModuleLightWidget::create<MeterLight<YellowLight>>(Vec(rightCol, startY + offsetY * 7), module, StereoVUmeter::METER_LIGHT_RIGHT + 7));
  87. addChild(ModuleLightWidget::create<MeterLight<YellowLight>>(Vec(rightCol, startY + offsetY * 8), module, StereoVUmeter::METER_LIGHT_RIGHT + 8));
  88. addChild(ModuleLightWidget::create<MeterLight<YellowLight>>(Vec(rightCol, startY + offsetY * 9), module, StereoVUmeter::METER_LIGHT_RIGHT + 9));
  89. addChild(ModuleLightWidget::create<MeterLight<GreenLight>>(Vec(rightCol, startY + offsetY * 10), module, StereoVUmeter::METER_LIGHT_RIGHT + 10));
  90. addChild(ModuleLightWidget::create<MeterLight<GreenLight>>(Vec(rightCol, startY + offsetY * 11), module, StereoVUmeter::METER_LIGHT_RIGHT + 11));
  91. addChild(ModuleLightWidget::create<MeterLight<GreenLight>>(Vec(rightCol, startY + offsetY * 12), module, StereoVUmeter::METER_LIGHT_RIGHT + 12));
  92. addChild(ModuleLightWidget::create<MeterLight<GreenLight>>(Vec(rightCol, startY + offsetY * 13), module, StereoVUmeter::METER_LIGHT_RIGHT + 13));
  93. addChild(ModuleLightWidget::create<MeterLight<GreenLight>>(Vec(rightCol, startY + offsetY * 14), module, StereoVUmeter::METER_LIGHT_RIGHT + 14));
  94. //INPUTS
  95. addInput(Port::create<as_PJ301MPort>(Vec(3, 270), Port::INPUT, module, StereoVUmeter::INPUT_LEFT));
  96. addInput(Port::create<as_PJ301MPort>(Vec(3, 310), Port::INPUT, module, StereoVUmeter::INPUT_RIGHT));
  97. //OUTPUTS
  98. addOutput(Port::create<as_PJ301MPort>(Vec(33,270), Port::OUTPUT, module, StereoVUmeter::OUT_LEFT));
  99. addOutput(Port::create<as_PJ301MPort>(Vec(33,310), Port::OUTPUT, module, StereoVUmeter::OUT_RIGHT));
  100. }
  101. RACK_PLUGIN_MODEL_INIT(AS, StereoVUmeter) {
  102. Model *modelStereoVUmeter = Model::create<StereoVUmeter, StereoVUmeterWidget>("AS", "StereoVUmeter", "Stereo VU meter", VISUAL_TAG, UTILITY_TAG);
  103. return modelStereoVUmeter;
  104. }