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.

161 lines
5.0KB

  1. /*
  2. VuBar
  3. 12 LED VU Meter using rack's vumeter.hpp
  4. - top led selects db interval: 1-[2]-3-4
  5. - knob sets brightness
  6. */////////////////////////////////////////////////////////////////////////////
  7. #include "pvc.hpp"
  8. #include "dsp/vumeter.hpp"
  9. namespace rack_plugin_PvC {
  10. struct Vubar : Module {
  11. enum ParamIds {
  12. DIM_PARAM,
  13. RANGE_PARAM,
  14. NUM_PARAMS
  15. };
  16. enum InputIds {
  17. METER_INPUT,
  18. NUM_INPUTS
  19. };
  20. enum OutputIds {
  21. METER_THRU_OUT,
  22. NUM_OUTPUTS
  23. };
  24. enum LightIds {
  25. METER_LIGHT,
  26. NUM_LIGHTS = METER_LIGHT + 12
  27. };
  28. VUMeter vuBar;
  29. float signal_in = 0.0f;
  30. Vubar() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
  31. // reset();
  32. }
  33. void step() override;
  34. // void reset() override;
  35. // void randomize() override;
  36. };
  37. void Vubar::step(){
  38. signal_in = inputs[METER_INPUT].normalize(0.0f);
  39. outputs[METER_THRU_OUT].value = signal_in;
  40. vuBar.dBInterval = params[RANGE_PARAM].value;
  41. vuBar.setValue(signal_in * 0.1f);
  42. for (int i = 0; i < 12; i++) {
  43. lights[METER_LIGHT + i].setBrightnessSmooth(vuBar.getBrightness(i) * (params[DIM_PARAM].value) + clamp(fabsf(signal_in*0.01f),0.00f,0.1f));
  44. }
  45. }
  46. template <typename BASE>
  47. struct MeterLight : BASE {
  48. MeterLight() {
  49. this->box.size = Vec(20, 20);
  50. }
  51. };
  52. struct VuLED1 : PvCLight {
  53. VuLED1() { addBaseColor(nvgRGB(0xff, 0x00, 0x28)); }
  54. };
  55. struct VuLED2 : PvCLight {
  56. VuLED2() { addBaseColor(nvgRGB(0xff, 0x55, 0x29)); }
  57. };
  58. struct VuLED3 : PvCLight {
  59. VuLED3() { addBaseColor(nvgRGB(0xdd, 0x66, 0x2a)); }
  60. };
  61. struct VuLED4 : PvCLight {
  62. VuLED4() { addBaseColor(nvgRGB(0xcc, 0x77, 0x2b)); }
  63. };
  64. struct VuLED5 : PvCLight {
  65. VuLED5() { addBaseColor(nvgRGB(0xbb, 0x88, 0x2c)); }
  66. };
  67. struct VuLED6 : PvCLight {
  68. VuLED6() { addBaseColor(nvgRGB(0xaa, 0x99, 0x2d)); }
  69. };
  70. struct VuLED7 : PvCLight {
  71. VuLED7() { addBaseColor(nvgRGB(0x99, 0xaa, 0x2d)); }
  72. };
  73. struct VuLED8 : PvCLight {
  74. VuLED8() { addBaseColor(nvgRGB(0x88, 0xbb, 0x2c)); }
  75. };
  76. struct VuLED9 : PvCLight {
  77. VuLED9() { addBaseColor(nvgRGB(0x77, 0xcc, 0x2b)); }
  78. };
  79. struct VuLED10 : PvCLight {
  80. VuLED10() { addBaseColor(nvgRGB(0x66, 0xdd, 0x2a)); }
  81. };
  82. struct VuLED11 : PvCLight {
  83. VuLED11() { addBaseColor(nvgRGB(0x55, 0xee, 0x29)); }
  84. };
  85. struct VuLED12 : PvCLight {
  86. VuLED12() { addBaseColor(nvgRGB(0x44, 0xff, 0x28)); }
  87. };
  88. struct RangeToggle : SVGSwitch, ToggleSwitch {
  89. RangeToggle() {
  90. addFrame(SVG::load(assetPlugin(plugin,"res/components/VubarScaleToggle1.svg")));
  91. addFrame(SVG::load(assetPlugin(plugin,"res/components/VubarScaleToggle2.svg")));
  92. addFrame(SVG::load(assetPlugin(plugin,"res/components/VubarScaleToggle3.svg")));
  93. addFrame(SVG::load(assetPlugin(plugin,"res/components/VubarScaleToggle4.svg")));
  94. }
  95. };
  96. struct VubarWidget : ModuleWidget {
  97. VubarWidget(Vubar *module);
  98. };
  99. VubarWidget::VubarWidget(Vubar *module) : ModuleWidget(module) {
  100. setPanel(SVG::load(assetPlugin(plugin, "res/panels/panel2HE.svg")));
  101. // SCREWS
  102. addChild(Widget::create<ScrewHead1>(Vec(0, 0)));
  103. //addChild(Widget::create<ScrewHead2>(Vec(box.size.x - 15, 0)));
  104. addChild(Widget::create<ScrewHead3>(Vec(0, 365)));
  105. //addChild(Widget::create<ScrewHead4>(Vec(box.size.x - 15, 365)));
  106. // LEDs
  107. addChild(ModuleLightWidget::create<MeterLight<VuLED1>> (Vec(5, 22 + 22 * 0), module, Vubar::METER_LIGHT + 0));
  108. addChild(ModuleLightWidget::create<MeterLight<VuLED2>> (Vec(5, 22 + 22 * 1), module, Vubar::METER_LIGHT + 1));
  109. addChild(ModuleLightWidget::create<MeterLight<VuLED3>> (Vec(5, 22 + 22 * 2), module, Vubar::METER_LIGHT + 2));
  110. addChild(ModuleLightWidget::create<MeterLight<VuLED4>> (Vec(5, 22 + 22 * 3), module, Vubar::METER_LIGHT + 3));
  111. addChild(ModuleLightWidget::create<MeterLight<VuLED5>> (Vec(5, 22 + 22 * 4), module, Vubar::METER_LIGHT + 4));
  112. addChild(ModuleLightWidget::create<MeterLight<VuLED6>> (Vec(5, 22 + 22 * 5), module, Vubar::METER_LIGHT + 5));
  113. addChild(ModuleLightWidget::create<MeterLight<VuLED7>> (Vec(5, 22 + 22 * 6), module, Vubar::METER_LIGHT + 6));
  114. addChild(ModuleLightWidget::create<MeterLight<VuLED8>> (Vec(5, 22 + 22 * 7), module, Vubar::METER_LIGHT + 7));
  115. addChild(ModuleLightWidget::create<MeterLight<VuLED9>> (Vec(5, 22 + 22 * 8), module, Vubar::METER_LIGHT + 8));
  116. addChild(ModuleLightWidget::create<MeterLight<VuLED10>> (Vec(5, 22 + 22 * 9), module, Vubar::METER_LIGHT + 9));
  117. addChild(ModuleLightWidget::create<MeterLight<VuLED11>> (Vec(5, 22 + 22 * 10), module, Vubar::METER_LIGHT + 10));
  118. addChild(ModuleLightWidget::create<MeterLight<VuLED12>> (Vec(5, 22 + 22 * 11), module, Vubar::METER_LIGHT + 11));
  119. // Dim the lights
  120. addParam(ParamWidget::create<PvCKnob>(Vec(4, 286),module,Vubar::DIM_PARAM, 0.5f, 0.9f, 0.7f));
  121. // dB interval toggle
  122. addParam(ParamWidget::create<RangeToggle>(Vec(7, 24),module,Vubar::RANGE_PARAM, 1, 4, 2));
  123. // INPUT
  124. addInput(Port::create<InPortAud>(Vec(4, 336), Port::INPUT, module, Vubar::METER_INPUT));
  125. //thru out
  126. addOutput(Port::create<OutPortVal>(Vec(4,312), Port::OUTPUT, module, Vubar::METER_THRU_OUT));
  127. }
  128. } // namespace rack_plugin_PvC
  129. using namespace rack_plugin_PvC;
  130. RACK_PLUGIN_MODEL_INIT(PvC, Vubar) {
  131. Model *modelVubar = Model::create<Vubar, VubarWidget>(
  132. "PvC", "Vubar", "Vubar", VISUAL_TAG);
  133. return modelVubar;
  134. }