#include "Fundamental.hpp" struct VCMixer : Module { enum ParamIds { MIX_PARAM, CH1_PARAM, CH2_PARAM, CH3_PARAM, NUM_PARAMS }; enum InputIds { MIX_CV_INPUT, CH1_INPUT, CH1_CV_INPUT, CH2_INPUT, CH2_CV_INPUT, CH3_INPUT, CH3_CV_INPUT, NUM_INPUTS }; enum OutputIds { MIX_OUTPUT, CH1_OUTPUT, CH2_OUTPUT, CH3_OUTPUT, NUM_OUTPUTS }; VCMixer(); void step(); }; VCMixer::VCMixer() { params.resize(NUM_PARAMS); inputs.resize(NUM_INPUTS); outputs.resize(NUM_OUTPUTS); } void VCMixer::step() { float ch1 = getf(inputs[CH1_INPUT]) * params[CH1_PARAM] * clampf(getf(inputs[CH1_CV_INPUT], 10.0) / 10.0, 0.0, 1.0); float ch2 = getf(inputs[CH2_INPUT]) * params[CH2_PARAM] * clampf(getf(inputs[CH2_CV_INPUT], 10.0) / 10.0, 0.0, 1.0); float ch3 = getf(inputs[CH3_INPUT]) * params[CH3_PARAM] * clampf(getf(inputs[CH3_CV_INPUT], 10.0) / 10.0, 0.0, 1.0); float mix = (ch1 + ch2 + ch3) * params[MIX_PARAM] * getf(inputs[MIX_CV_INPUT], 10.0) / 10.0; setf(outputs[CH1_OUTPUT], ch1); setf(outputs[CH2_OUTPUT], ch2); setf(outputs[CH3_OUTPUT], ch3); setf(outputs[MIX_OUTPUT], mix); } VCMixerWidget::VCMixerWidget() { VCMixer *module = new VCMixer(); setModule(module); box.size = Vec(15*10, 380); { SVGPanel *panel = new SVGPanel(); panel->box.size = box.size; panel->setBackground(SVG::load(assetPlugin(plugin, "res/VCMixer.svg"))); addChild(panel); } addChild(createScrew(Vec(15, 0))); addChild(createScrew(Vec(box.size.x-30, 0))); addChild(createScrew(Vec(15, 365))); addChild(createScrew(Vec(box.size.x-30, 365))); addParam(createParam(Vec(48, 55), module, VCMixer::MIX_PARAM, 0.0, 1.0, 0.5)); addParam(createParam(Vec(57, 139), module, VCMixer::CH1_PARAM, 0.0, 1.0, 0.0)); addParam(createParam(Vec(57, 219), module, VCMixer::CH2_PARAM, 0.0, 1.0, 0.0)); addParam(createParam(Vec(57, 300), module, VCMixer::CH3_PARAM, 0.0, 1.0, 0.0)); addInput(createInput(Vec(16, 69), module, VCMixer::MIX_CV_INPUT)); addInput(createInput(Vec(22, 129), module, VCMixer::CH1_INPUT)); addInput(createInput(Vec(22, 160), module, VCMixer::CH1_CV_INPUT)); addInput(createInput(Vec(22, 209), module, VCMixer::CH2_INPUT)); addInput(createInput(Vec(22, 241), module, VCMixer::CH2_CV_INPUT)); addInput(createInput(Vec(22, 290), module, VCMixer::CH3_INPUT)); addInput(createInput(Vec(22, 322), module, VCMixer::CH3_CV_INPUT)); addOutput(createOutput(Vec(110, 69), module, VCMixer::MIX_OUTPUT)); addOutput(createOutput(Vec(110, 145), module, VCMixer::CH1_OUTPUT)); addOutput(createOutput(Vec(110, 225), module, VCMixer::CH2_OUTPUT)); addOutput(createOutput(Vec(110, 306), module, VCMixer::CH3_OUTPUT)); }