#include #include "Squinky.hpp" #include "WidgetComposite.h" #ifdef _GMR #include "GMR.h" /** */ struct GMRModule : Module { public: GMRModule(); /** * * Overrides of Module functions */ void step() override; void onSampleRateChange() override; GMR gmr; private: }; void GMRModule::onSampleRateChange() { float rate = engineGetSampleRate(); gmr.setSampleRate(rate); } GMRModule::GMRModule() : Module(gmr.NUM_PARAMS, gmr.NUM_INPUTS, gmr.NUM_OUTPUTS, gmr.NUM_LIGHTS), gmr(this) { onSampleRateChange(); gmr.init(); } void GMRModule::step() { gmr.step(); } //////////////////// // module widget //////////////////// struct GMRWidget : ModuleWidget { GMRWidget(GMRModule *); void addLabel(const Vec& v, const char* str, const NVGcolor& color = COLOR_BLACK) { Label* label = new Label(); label->box.pos = v; label->text = str; label->color = color; addChild(label); } }; /** * Widget constructor will describe my implementation structure and * provide meta-data. * This is not shared by all modules in the DLL, just one */ GMRWidget::GMRWidget(GMRModule *module) : ModuleWidget(module) { box.size = Vec(6 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT); { SVGPanel *panel = new SVGPanel(); panel->box.size = box.size; panel->setBackground(SVG::load(assetPlugin(plugin, "res/blank_panel.svg"))); addChild(panel); } addInput(Port::create( Vec(40, 200), Port::INPUT, module, module->gmr.CLOCK_INPUT)); addOutput(Port::create( Vec(40, 300), Port::OUTPUT, module, module->gmr.TRIGGER_OUTPUT)); // screws addChild(Widget::create(Vec(RACK_GRID_WIDTH, 0))); addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); addChild(Widget::create(Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); addChild(Widget::create(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH))); } RACK_PLUGIN_MODEL_INIT(squinkylabs_plug1, GMR) { Model *modelGMRModule = Model::create("Squinky Labs", "squinkylabs-GMR", "GMR", EFFECT_TAG, LFO_TAG); return modelGMRModule; } #endif