#include "RM.hpp" void RM::step() { if (!(outputs[OUT_OUTPUT].active && (inputs[MODULATOR_INPUT].active || inputs[CARRIER_INPUT].active))) { return; } if (inputs[MODULATOR_INPUT].active != inputs[CARRIER_INPUT].active) { if (inputs[MODULATOR_INPUT].active) { outputs[OUT_OUTPUT].value = inputs[MODULATOR_INPUT].value; } else { outputs[OUT_OUTPUT].value = inputs[CARRIER_INPUT].value; } return; } float modulator = inputs[MODULATOR_INPUT].value; modulator *= params[MODULATOR_DEPTH_PARAM].value; if (inputs[MODULATOR_DEPTH_INPUT].active) { modulator *= clamp(inputs[MODULATOR_DEPTH_INPUT].value / 10.0f, 0.0f, 1.0f); } float carrier = inputs[CARRIER_INPUT].value; float mix = params[MIX_PARAM].value; if (inputs[MIX_INPUT].active) { mix *= clamp(inputs[MIX_INPUT].value / 5.0f, -1.0f, 1.0f); } _mix.setParams(mix, 0.889f, false); outputs[OUT_OUTPUT].value = _mix.next(carrier, modulator * carrier * 0.2f); } struct RMWidget : ModuleWidget { static constexpr int hp = 3; RMWidget(RM* module) : ModuleWidget(module) { box.size = Vec(RACK_GRID_WIDTH * hp, RACK_GRID_HEIGHT); { SVGPanel *panel = new SVGPanel(); panel->box.size = box.size; panel->setBackground(SVG::load(assetPlugin(plugin, "res/RM.svg"))); addChild(panel); } addChild(Widget::create(Vec(0, 0))); addChild(Widget::create(Vec(box.size.x - 15, 365))); // generated by svg_widgets.rb auto modulatorDepthParamPosition = Vec(8.0, 36.0); auto mixParamPosition = Vec(8.0, 142.0); auto modulatorDepthInputPosition = Vec(10.5, 77.0); auto mixInputPosition = Vec(10.5, 183.0); auto modulatorInputPosition = Vec(10.5, 233.0); auto carrierInputPosition = Vec(10.5, 268.0); auto outOutputPosition = Vec(10.5, 306.0); // end generated by svg_widgets.rb addParam(ParamWidget::create(modulatorDepthParamPosition, module, RM::MODULATOR_DEPTH_PARAM, 0.0, 1.0, 1.0)); addParam(ParamWidget::create(mixParamPosition, module, RM::MIX_PARAM, -1.0, 1.0, 1.0)); addInput(Port::create(modulatorInputPosition, Port::INPUT, module, RM::MODULATOR_INPUT)); addInput(Port::create(carrierInputPosition, Port::INPUT, module, RM::CARRIER_INPUT)); addInput(Port::create(modulatorDepthInputPosition, Port::INPUT, module, RM::MODULATOR_DEPTH_INPUT)); addInput(Port::create(mixInputPosition, Port::INPUT, module, RM::MIX_INPUT)); addOutput(Port::create(outOutputPosition, Port::OUTPUT, module, RM::OUT_OUTPUT)); } }; RACK_PLUGIN_MODEL_INIT(Bogaudio, RM) { Model *modelRM = createModel("Bogaudio-RM", "RM", "ring modulator", RING_MODULATOR_TAG); return modelRM; }