#include "Template.hpp" namespace rack_plugin_PG_Instruments { struct PGPanner : Module { enum ParamIds { PAN_PARAM, NUM_PARAMS }; enum InputIds { INPUT, PAN_INPUT, NUM_INPUTS }; enum OutputIds { LEFT_OUTPUT, RIGHT_OUTPUT, NUM_OUTPUTS }; enum LightIds { RUNNING_LIGHT, NUM_LIGHTS }; float panning = 0.5f; PGPanner() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { onReset(); } void onReset() override { } void onRandomize() override { } void step() override { panning = params[PAN_PARAM].value; float mono = inputs[INPUT].value; float panInput = inputs[PAN_INPUT].value; float pan = panning + panInput; float leftGain = cosf(pan * M_PI / 2.0f) * mono; float rightGain = sinf(pan * M_PI / 2.0f) * mono; outputs[LEFT_OUTPUT].value = leftGain; outputs[RIGHT_OUTPUT].value = rightGain; } }; struct PGPannerWidget : ModuleWidget { PGPannerWidget(PGPanner *module) : ModuleWidget(module) { setPanel(SVG::load(assetPlugin(plugin, "res/PGPanner.svg"))); addChild(Widget::create(Vec(15, 0))); addChild(Widget::create(Vec(box.size.x-30, 0))); addChild(Widget::create(Vec(15, 365))); addChild(Widget::create(Vec(box.size.x-30, 365))); addParam(ParamWidget::create(Vec(20, 40), module, PGPanner::PAN_PARAM, 0.0f, 1.0, 0.5f)); addInput(Port::create(Vec(26, 100), Port::INPUT, module, PGPanner::INPUT)); addInput(Port::create(Vec(26, 160), Port::INPUT, module, PGPanner::PAN_INPUT)); addOutput(Port::create(Vec(12, 220), Port::OUTPUT, module, PGPanner::LEFT_OUTPUT)); addOutput(Port::create(Vec(42, 220), Port::OUTPUT, module, PGPanner::RIGHT_OUTPUT)); } }; } // namespace rack_plugin_PG_Instruments using namespace rack_plugin_PG_Instruments; RACK_PLUGIN_MODEL_INIT(PG_Instruments, PGPanner) { Model *modelPGPanner = Model::create("PG-Instruments", "PGPanner", "PG Panner", ATTENUATOR_TAG); return modelPGPanner; }