#include "ML_modules.hpp" #include "dsp/digital.hpp" #include #include namespace rack_plugin_ML_modules { struct VoltMeter : Module { enum ParamIds { NUM_PARAMS }; enum InputIds { IN1_INPUT, IN2_INPUT, IN3_INPUT, IN4_INPUT, NUM_INPUTS }; enum OutputIds { NUM_OUTPUTS }; enum LightIds { NUM_LIGHTS }; VoltMeter() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { for(int i=0; i<4; i++) {volts[i] = 0.0f; active[i] = false;}}; void step() override; float volts[4]; bool active[4]; }; void VoltMeter::step() { for(int i=0; i<4; i++) { active[i] = inputs[IN1_INPUT+i].active; volts[i] = 0.9 * volts[i] + 0.1 * inputs[IN1_INPUT+i].normalize(0.0); }; }; struct VoltDisplayWidget : TransparentWidget { float *value; bool *on; std::shared_ptr font; VoltDisplayWidget() { font = Font::load(assetPlugin(plugin, "res/Segment7Standard.ttf")); }; void draw(NVGcontext *vg) { // Background // NVGcolor backgroundColor = nvgRGB(0x44, 0x44, 0x44); NVGcolor backgroundColor = nvgRGB(0x20, 0x20, 0x20); NVGcolor borderColor = nvgRGB(0x10, 0x10, 0x10); nvgBeginPath(vg); nvgRoundedRect(vg, 0.0, 0.0, box.size.x, box.size.y, 4.0); nvgFillColor(vg, backgroundColor); nvgFill(vg); nvgStrokeWidth(vg, 1.0); nvgStrokeColor(vg, borderColor); nvgStroke(vg); nvgFontSize(vg, 18); nvgFontFaceId(vg, font->handle); nvgTextLetterSpacing(vg, 2.5); char display_string[10]; sprintf(display_string,"%6.2f",*value); Vec textPos = Vec(6.0f, 17.0f); NVGcolor textColor = nvgRGB(0xdf, 0xd2, 0x2c); nvgFillColor(vg, nvgTransRGBA(textColor, 16)); nvgText(vg, textPos.x, textPos.y, "~~~~~~", NULL); textColor = nvgRGB(0xda, 0xe9, 0x29); nvgFillColor(vg, nvgTransRGBA(textColor, 16)); nvgText(vg, textPos.x, textPos.y, "\\\\\\\\\\\\", NULL); if(*on) { textColor = nvgRGB(0xf0, 0x00, 0x00); nvgFillColor(vg, textColor); nvgText(vg, textPos.x, textPos.y, display_string, NULL); }; } }; struct VoltMeterWidget : ModuleWidget { VoltMeterWidget(VoltMeter *module); TextField ** label; }; VoltMeterWidget::VoltMeterWidget(VoltMeter *module) : ModuleWidget(module) { box.size = Vec(15*8, 380); // label = new TextField*[4]; { SVGPanel *panel = new SVGPanel(); panel->box.size = box.size; panel->setBackground(SVG::load(assetPlugin(plugin,"res/VoltMeter.svg"))); addChild(panel); } const float delta_y = 70; addChild(Widget::create(Vec(15, 0))); addChild(Widget::create(Vec(15, 365))); addChild(Widget::create(Vec(box.size.x-30, 0))); addChild(Widget::create(Vec(box.size.x-30, 365))); for(int i=0; i<4; i++) { addInput(Port::create(Vec(12, 60+i*delta_y), Port::INPUT, module, VoltMeter::IN1_INPUT+i)); VoltDisplayWidget *display = new VoltDisplayWidget(); display->box.pos = Vec(10,90+i*delta_y); display->box.size = Vec(100, 20); display->value = &module->volts[i]; display->on = &module->active[i]; addChild(display); // label[i] = new TextField(); // label[i]->box.pos = Vec(50,60+i*65); // label[i]->box.size = Vec(60,30); // addChild(label[i]); }; } } // namespace rack_plugin_ML_modules using namespace rack_plugin_ML_modules; RACK_PLUGIN_MODEL_INIT(ML_modules, VoltMeter) { Model *modelVoltMeter = Model::create("ML modules", "VoltMeter", "Volt Meter", VISUAL_TAG, UTILITY_TAG); return modelVoltMeter; }