///////////////////////////////////////////////////// // Stereo VU Meter module by Alfredo Santamaria - AS - https://github.com/AScustomWorks/AS // StereoVUmeter // ///////////////////////////////////////////////////// #include "AS.hpp" #include "dsp/vumeter.hpp" struct StereoVUmeter : Module { enum ParamIds { NUM_PARAMS }; enum InputIds { INPUT_LEFT, INPUT_RIGHT, NUM_INPUTS }; enum OutputIds { OUT_LEFT, OUT_RIGHT, NUM_OUTPUTS }; enum LightIds { METER_LIGHT_LEFT, METER_LIGHT_RIGHT = METER_LIGHT_LEFT+15, NUM_LIGHTS = METER_LIGHT_RIGHT + 15 }; StereoVUmeter() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { } void step() override; VUMeter vuBar; }; void StereoVUmeter::step(){ //GET VALUES AND ROUTE SIGNALS TO OUTPUTS float signal_in_Left = inputs[INPUT_LEFT].value; float signal_in_Right = inputs[INPUT_RIGHT].value; outputs[OUT_LEFT].value = signal_in_Left; outputs[OUT_RIGHT].value = signal_in_Right; //VU METER BARS LIGHTS vuBar.dBInterval = 3; for (int i = 0; i < 15; i++){ vuBar.setValue(signal_in_Left / 10.0f); lights[METER_LIGHT_LEFT + i].setBrightnessSmooth(vuBar.getBrightness(i)); vuBar.setValue(signal_in_Right / 10.0f); lights[METER_LIGHT_RIGHT + i].setBrightnessSmooth(vuBar.getBrightness(i)); } }; struct StereoVUmeterWidget : ModuleWidget { StereoVUmeterWidget(StereoVUmeter *module); }; StereoVUmeterWidget::StereoVUmeterWidget(StereoVUmeter *module) : ModuleWidget(module) { setPanel(SVG::load(assetPlugin(plugin, "res/StereoVUmeter.svg"))); //SCREWS - SPECIAL SPACING FOR RACK WIDTH*4 addChild(Widget::create(Vec(0, 0))); addChild(Widget::create(Vec(box.size.x - RACK_GRID_WIDTH, 0))); addChild(Widget::create(Vec(0, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); addChild(Widget::create(Vec(box.size.x - RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); // LEFT COLUMN LEDs static const float leftCol = 15; static const float offsetY = 12; static const float startY = 66; addChild(ModuleLightWidget::create>(Vec(leftCol, startY + offsetY * 0), module, StereoVUmeter::METER_LIGHT_LEFT + 0)); addChild(ModuleLightWidget::create>(Vec(leftCol, startY + offsetY * 1), module, StereoVUmeter::METER_LIGHT_LEFT + 1)); addChild(ModuleLightWidget::create>(Vec(leftCol, startY + offsetY * 2), module, StereoVUmeter::METER_LIGHT_LEFT + 2)); addChild(ModuleLightWidget::create>(Vec(leftCol, startY + offsetY * 3), module, StereoVUmeter::METER_LIGHT_LEFT + 3)); addChild(ModuleLightWidget::create>(Vec(leftCol, startY + offsetY * 4), module, StereoVUmeter::METER_LIGHT_LEFT + 4)); addChild(ModuleLightWidget::create>(Vec(leftCol, startY + offsetY * 5), module, StereoVUmeter::METER_LIGHT_LEFT + 5)); addChild(ModuleLightWidget::create>(Vec(leftCol, startY + offsetY * 6), module, StereoVUmeter::METER_LIGHT_LEFT + 6)); addChild(ModuleLightWidget::create>(Vec(leftCol, startY + offsetY * 7), module, StereoVUmeter::METER_LIGHT_LEFT + 7)); addChild(ModuleLightWidget::create>(Vec(leftCol, startY + offsetY * 8), module, StereoVUmeter::METER_LIGHT_LEFT + 8)); addChild(ModuleLightWidget::create>(Vec(leftCol, startY + offsetY * 9), module, StereoVUmeter::METER_LIGHT_LEFT + 9)); addChild(ModuleLightWidget::create>(Vec(leftCol, startY + offsetY * 10), module, StereoVUmeter::METER_LIGHT_LEFT + 10)); addChild(ModuleLightWidget::create>(Vec(leftCol, startY + offsetY * 11), module, StereoVUmeter::METER_LIGHT_LEFT + 11)); addChild(ModuleLightWidget::create>(Vec(leftCol, startY + offsetY * 12), module, StereoVUmeter::METER_LIGHT_LEFT + 12)); addChild(ModuleLightWidget::create>(Vec(leftCol, startY + offsetY * 13), module, StereoVUmeter::METER_LIGHT_LEFT + 13)); addChild(ModuleLightWidget::create>(Vec(leftCol, startY + offsetY * 14), module, StereoVUmeter::METER_LIGHT_LEFT + 14)); //RIGHT COLUMN LEDs static const float rightCol = 37; addChild(ModuleLightWidget::create>(Vec(rightCol, startY + offsetY * 0), module, StereoVUmeter::METER_LIGHT_RIGHT + 0)); addChild(ModuleLightWidget::create>(Vec(rightCol, startY + offsetY * 1), module, StereoVUmeter::METER_LIGHT_RIGHT + 1)); addChild(ModuleLightWidget::create>(Vec(rightCol, startY + offsetY * 2), module, StereoVUmeter::METER_LIGHT_RIGHT + 2)); addChild(ModuleLightWidget::create>(Vec(rightCol, startY + offsetY * 3), module, StereoVUmeter::METER_LIGHT_RIGHT + 3)); addChild(ModuleLightWidget::create>(Vec(rightCol, startY + offsetY * 4), module, StereoVUmeter::METER_LIGHT_RIGHT + 4)); addChild(ModuleLightWidget::create>(Vec(rightCol, startY + offsetY * 5), module, StereoVUmeter::METER_LIGHT_RIGHT + 5)); addChild(ModuleLightWidget::create>(Vec(rightCol, startY + offsetY * 6), module, StereoVUmeter::METER_LIGHT_RIGHT + 6)); addChild(ModuleLightWidget::create>(Vec(rightCol, startY + offsetY * 7), module, StereoVUmeter::METER_LIGHT_RIGHT + 7)); addChild(ModuleLightWidget::create>(Vec(rightCol, startY + offsetY * 8), module, StereoVUmeter::METER_LIGHT_RIGHT + 8)); addChild(ModuleLightWidget::create>(Vec(rightCol, startY + offsetY * 9), module, StereoVUmeter::METER_LIGHT_RIGHT + 9)); addChild(ModuleLightWidget::create>(Vec(rightCol, startY + offsetY * 10), module, StereoVUmeter::METER_LIGHT_RIGHT + 10)); addChild(ModuleLightWidget::create>(Vec(rightCol, startY + offsetY * 11), module, StereoVUmeter::METER_LIGHT_RIGHT + 11)); addChild(ModuleLightWidget::create>(Vec(rightCol, startY + offsetY * 12), module, StereoVUmeter::METER_LIGHT_RIGHT + 12)); addChild(ModuleLightWidget::create>(Vec(rightCol, startY + offsetY * 13), module, StereoVUmeter::METER_LIGHT_RIGHT + 13)); addChild(ModuleLightWidget::create>(Vec(rightCol, startY + offsetY * 14), module, StereoVUmeter::METER_LIGHT_RIGHT + 14)); //INPUTS addInput(Port::create(Vec(3, 270), Port::INPUT, module, StereoVUmeter::INPUT_LEFT)); addInput(Port::create(Vec(3, 310), Port::INPUT, module, StereoVUmeter::INPUT_RIGHT)); //OUTPUTS addOutput(Port::create(Vec(33,270), Port::OUTPUT, module, StereoVUmeter::OUT_LEFT)); addOutput(Port::create(Vec(33,310), Port::OUTPUT, module, StereoVUmeter::OUT_RIGHT)); } RACK_PLUGIN_MODEL_INIT(AS, StereoVUmeter) { Model *modelStereoVUmeter = Model::create("AS", "StereoVUmeter", "Stereo VU meter", VISUAL_TAG, UTILITY_TAG); return modelStereoVUmeter; }