#include "plugin.hpp" struct Viz : Module { enum ParamIds { NUM_PARAMS }; enum InputIds { POLY_INPUT, NUM_INPUTS }; enum OutputIds { NUM_OUTPUTS }; enum LightIds { ENUMS(VU_LIGHTS, 16 * 2), NUM_LIGHTS }; int lastChannels = 0; dsp::ClockDivider lightDivider; Viz() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); lightDivider.setDivision(16); } void process(const ProcessArgs &args) override { if (lightDivider.process()) { lastChannels = inputs[POLY_INPUT].getChannels(); float deltaTime = args.sampleTime * lightDivider.getDivision(); for (int c = 0; c < 16; c++) { float v = inputs[POLY_INPUT].getVoltage(c) / 10.f; lights[VU_LIGHTS + c * 2 + 0].setSmoothBrightness(v, deltaTime); lights[VU_LIGHTS + c * 2 + 1].setSmoothBrightness(-v, deltaTime); } } } }; struct VizDisplay : Widget { Viz *module; std::shared_ptr font; VizDisplay() { box.size = mm2px(Vec(15.24, 88.126)); font = APP->window->loadFont(asset::plugin(pluginInstance, "res/nunito/Nunito-Bold.ttf")); } void draw(const DrawArgs &args) override { for (int c = 0; c < 16; c++) { Vec p = Vec(15, 16 + (float) c / 16 * (box.size.y - 10)); std::string text = string::f("%d", c + 1); nvgFontFaceId(args.vg, font->handle); nvgFontSize(args.vg, 11); nvgTextLetterSpacing(args.vg, 0.0); nvgTextAlign(args.vg, NVG_ALIGN_CENTER | NVG_ALIGN_BASELINE); if (module && c < module->lastChannels) nvgFillColor(args.vg, nvgRGB(255, 255, 255)); else nvgFillColor(args.vg, nvgRGB(99, 99, 99)); nvgText(args.vg, p.x, p.y, text.c_str(), NULL); } } }; struct VizWidget : ModuleWidget { VizWidget(Viz *module) { setModule(module); setPanel(APP->window->loadSvg(asset::plugin(pluginInstance, "res/Viz.svg"))); addChild(createWidget(Vec(RACK_GRID_WIDTH, 0))); addChild(createWidget(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); addChild(createWidget(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); addChild(createWidget(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); addInput(createInputCentered(mm2px(Vec(7.619, 21.346)), module, Viz::POLY_INPUT)); addChild(createLightCentered>(mm2px(Vec(10.854, 33.626)), module, Viz::VU_LIGHTS + 0 * 2)); addChild(createLightCentered>(mm2px(Vec(10.854, 38.916)), module, Viz::VU_LIGHTS + 1 * 2)); addChild(createLightCentered>(mm2px(Vec(10.854, 44.205)), module, Viz::VU_LIGHTS + 2 * 2)); addChild(createLightCentered>(mm2px(Vec(10.854, 49.496)), module, Viz::VU_LIGHTS + 3 * 2)); addChild(createLightCentered>(mm2px(Vec(10.854, 54.785)), module, Viz::VU_LIGHTS + 4 * 2)); addChild(createLightCentered>(mm2px(Vec(10.854, 60.075)), module, Viz::VU_LIGHTS + 5 * 2)); addChild(createLightCentered>(mm2px(Vec(10.854, 65.364)), module, Viz::VU_LIGHTS + 6 * 2)); addChild(createLightCentered>(mm2px(Vec(10.854, 70.654)), module, Viz::VU_LIGHTS + 7 * 2)); addChild(createLightCentered>(mm2px(Vec(10.854, 75.943)), module, Viz::VU_LIGHTS + 8 * 2)); addChild(createLightCentered>(mm2px(Vec(10.854, 81.233)), module, Viz::VU_LIGHTS + 9 * 2)); addChild(createLightCentered>(mm2px(Vec(10.854, 86.522)), module, Viz::VU_LIGHTS + 10 * 2)); addChild(createLightCentered>(mm2px(Vec(10.854, 91.812)), module, Viz::VU_LIGHTS + 11 * 2)); addChild(createLightCentered>(mm2px(Vec(10.854, 97.101)), module, Viz::VU_LIGHTS + 12 * 2)); addChild(createLightCentered>(mm2px(Vec(10.854, 102.392)), module, Viz::VU_LIGHTS + 13 * 2)); addChild(createLightCentered>(mm2px(Vec(10.854, 107.681)), module, Viz::VU_LIGHTS + 14 * 2)); addChild(createLightCentered>(mm2px(Vec(10.854, 112.971)), module, Viz::VU_LIGHTS + 15 * 2)); VizDisplay *vizDisplay = createWidget(mm2px(Vec(0.0, 29.235))); vizDisplay->module = module; addChild(vizDisplay); } }; Model *modelViz = createModel("Viz");