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.

96 lines
4.1KB

  1. //***********************************************************************************************
  2. //
  3. //MonoVUmeter module for VCV Rack by Alfredo Santamaria - AS - https://github.com/AScustomWorks/AS
  4. //
  5. //***********************************************************************************************
  6. #include "AS.hpp"
  7. #include "dsp/vumeter.hpp"
  8. struct MonoVUmeter : Module {
  9. enum ParamIds {
  10. NUM_PARAMS
  11. };
  12. enum InputIds {
  13. INPUT,
  14. NUM_INPUTS
  15. };
  16. enum OutputIds {
  17. OUT,
  18. NUM_OUTPUTS
  19. };
  20. enum LightIds {
  21. METER_LIGHT,
  22. NUM_LIGHTS = METER_LIGHT+15
  23. };
  24. MonoVUmeter() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
  25. }
  26. void step() override;
  27. VUMeter vuBar;
  28. };
  29. void MonoVUmeter::step(){
  30. //GET VALUES AND ROUTE SIGNAL TO OUTPUT
  31. float signal_in = inputs[INPUT].value;
  32. outputs[OUT].value = signal_in;
  33. //VU METER BARS LIGHTS
  34. vuBar.dBInterval = 3;
  35. vuBar.setValue(signal_in / 10.0f);
  36. for (int i = 0; i < 15; i++){
  37. lights[METER_LIGHT + i].setBrightnessSmooth(vuBar.getBrightness(i));
  38. }
  39. };
  40. struct MonoVUmeterWidget : ModuleWidget
  41. {
  42. MonoVUmeterWidget(MonoVUmeter *module);
  43. };
  44. MonoVUmeterWidget::MonoVUmeterWidget(MonoVUmeter *module) : ModuleWidget(module) {
  45. setPanel(SVG::load(assetPlugin(plugin, "res/MonoVUmeter.svg")));
  46. //SCREWS - SPECIAL SPACING FOR RACK WIDTH*4
  47. addChild(Widget::create<as_HexScrew>(Vec(0, 0)));
  48. addChild(Widget::create<as_HexScrew>(Vec(box.size.x - RACK_GRID_WIDTH, 0)));
  49. addChild(Widget::create<as_HexScrew>(Vec(0, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  50. addChild(Widget::create<as_HexScrew>(Vec(box.size.x - RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
  51. // LEFT COLUMN LEDs
  52. static const float ledCol = 11;
  53. static const float offsetY = 12;
  54. static const float startY = 66;
  55. addChild(ModuleLightWidget::create<MeterLight<RedLight>>(Vec(ledCol, startY + offsetY * 0), module, MonoVUmeter::METER_LIGHT + 0));
  56. addChild(ModuleLightWidget::create<MeterLight<RedLight>>(Vec(ledCol, startY + offsetY * 1), module, MonoVUmeter::METER_LIGHT + 1));
  57. addChild(ModuleLightWidget::create<MeterLight<RedLight>>(Vec(ledCol, startY + offsetY * 2), module, MonoVUmeter::METER_LIGHT + 2));
  58. addChild(ModuleLightWidget::create<MeterLight<OrangeLight>>(Vec(ledCol, startY + offsetY * 3), module, MonoVUmeter::METER_LIGHT + 3));
  59. addChild(ModuleLightWidget::create<MeterLight<OrangeLight>>(Vec(ledCol, startY + offsetY * 4), module, MonoVUmeter::METER_LIGHT + 4));
  60. addChild(ModuleLightWidget::create<MeterLight<OrangeLight>>(Vec(ledCol, startY + offsetY * 5), module, MonoVUmeter::METER_LIGHT + 5));
  61. addChild(ModuleLightWidget::create<MeterLight<YellowLight>>(Vec(ledCol, startY + offsetY * 6), module, MonoVUmeter::METER_LIGHT + 6));
  62. addChild(ModuleLightWidget::create<MeterLight<YellowLight>>(Vec(ledCol, startY + offsetY * 7), module, MonoVUmeter::METER_LIGHT + 7));
  63. addChild(ModuleLightWidget::create<MeterLight<YellowLight>>(Vec(ledCol, startY + offsetY * 8), module, MonoVUmeter::METER_LIGHT + 8));
  64. addChild(ModuleLightWidget::create<MeterLight<YellowLight>>(Vec(ledCol, startY + offsetY * 9), module, MonoVUmeter::METER_LIGHT + 9));
  65. addChild(ModuleLightWidget::create<MeterLight<GreenLight>>(Vec(ledCol, startY + offsetY * 10), module, MonoVUmeter::METER_LIGHT + 10));
  66. addChild(ModuleLightWidget::create<MeterLight<GreenLight>>(Vec(ledCol, startY + offsetY * 11), module, MonoVUmeter::METER_LIGHT + 11));
  67. addChild(ModuleLightWidget::create<MeterLight<GreenLight>>(Vec(ledCol, startY + offsetY * 12), module, MonoVUmeter::METER_LIGHT + 12));
  68. addChild(ModuleLightWidget::create<MeterLight<GreenLight>>(Vec(ledCol, startY + offsetY * 13), module, MonoVUmeter::METER_LIGHT + 13));
  69. addChild(ModuleLightWidget::create<MeterLight<GreenLight>>(Vec(ledCol, startY + offsetY * 14), module, MonoVUmeter::METER_LIGHT + 14));
  70. //INPUTS
  71. addInput(Port::create<as_PJ301MPort>(Vec(3, 270), Port::INPUT, module, MonoVUmeter::INPUT));
  72. //OUTPUTS
  73. addOutput(Port::create<as_PJ301MPort>(Vec(3,310), Port::OUTPUT, module, MonoVUmeter::OUT));
  74. }
  75. RACK_PLUGIN_MODEL_INIT(AS, MonoVUmeter) {
  76. Model *modelMonoVUmeter = Model::create<MonoVUmeter, MonoVUmeterWidget>("AS", "MonoVUmeter", "Mono VU meter", VISUAL_TAG, UTILITY_TAG);
  77. return modelMonoVUmeter;
  78. }