diff --git a/res/VCMixer.svg b/res/VCMixer.svg index 03130ec..1c5137f 100644 --- a/res/VCMixer.svg +++ b/res/VCMixer.svg @@ -9,15 +9,15 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="150.22649" - height="379.99997" - viewBox="0 0 39.747425 100.54168" + width="50.799999mm" + height="128.4993mm" + viewBox="0 0 50.799999 128.4993" version="1.1" - id="svg4541" - sodipodi:docname="VCMixer.svg" - inkscape:version="0.92.2 5c3e80d, 2017-08-06"> + id="svg152160" + inkscape:version="0.92.2 5c3e80d, 2017-08-06" + sodipodi:docname="VCMixer.svg"> + id="defs152154" /> + inkscape:window-y="18" + inkscape:window-maximized="0" /> + id="metadata152157"> @@ -57,336 +58,550 @@ inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" - transform="translate(5.559749,-98.968292)"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + transform="translate(-12.397619,10.666317)"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/VCMixer.cpp b/src/VCMixer.cpp index 1a0c848..05786b6 100644 --- a/src/VCMixer.cpp +++ b/src/VCMixer.cpp @@ -3,79 +3,73 @@ struct VCMixer : Module { enum ParamIds { - MIX_PARAM, - CH1_PARAM, - CH2_PARAM, - CH3_PARAM, + MIX_LVL_PARAM, + ENUMS(LVL_PARAM, 4), NUM_PARAMS }; enum InputIds { MIX_CV_INPUT, - CH1_INPUT, - CH1_CV_INPUT, - CH2_INPUT, - CH2_CV_INPUT, - CH3_INPUT, - CH3_CV_INPUT, + ENUMS(CH_INPUT, 4), + ENUMS(CV_INPUT, 4), NUM_INPUTS }; enum OutputIds { MIX_OUTPUT, - CH1_OUTPUT, - CH2_OUTPUT, - CH3_OUTPUT, + ENUMS(CH_OUTPUT, 4), NUM_OUTPUTS }; VCMixer() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS) {} - void step() override; -}; - -void VCMixer::step() { - float ch1 = inputs[CH1_INPUT].value * params[CH1_PARAM].value * clamp(inputs[CH1_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f); - float ch2 = inputs[CH2_INPUT].value * params[CH2_PARAM].value * clamp(inputs[CH2_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f); - float ch3 = inputs[CH3_INPUT].value * params[CH3_PARAM].value * clamp(inputs[CH3_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f, 1.0f); - float cv = fmaxf(inputs[MIX_CV_INPUT].normalize(10.0f) / 10.0f, 0.0f); - float mix = (ch1 + ch2 + ch3) * params[MIX_PARAM].value * cv; - - outputs[CH1_OUTPUT].value = ch1; - outputs[CH2_OUTPUT].value = ch2; - outputs[CH3_OUTPUT].value = ch3; - outputs[MIX_OUTPUT].value = mix; -} + void step() override { + float mix = 0.f; + for (int i = 0; i < 4; i++) { + float ch = inputs[CH_INPUT + i].value; + ch *= powf(params[LVL_PARAM + i].value, 3.f); + ch *= clamp(inputs[CV_INPUT + i].normalize(10.f) / 10.f, 0.f, 1.f); + outputs[CH_OUTPUT + i].value = ch; + mix += ch; + } + mix *= params[MIX_LVL_PARAM].value; + mix *= clamp(inputs[MIX_CV_INPUT].normalize(10.f) / 10.f, 0.f, 1.f); + outputs[MIX_OUTPUT].value = mix; + } +}; struct VCMixerWidget : ModuleWidget { - VCMixerWidget(VCMixer *module); -}; - -VCMixerWidget::VCMixerWidget(VCMixer *module) : ModuleWidget(module) { - setPanel(SVG::load(assetPlugin(plugin, "res/VCMixer.svg"))); + VCMixerWidget(VCMixer *module) : ModuleWidget(module) { + setPanel(SVG::load(assetPlugin(plugin, "res/VCMixer.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))); + 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))); - addParam(ParamWidget::create(Vec(52, 58), module, VCMixer::MIX_PARAM, 0.0f, 1.0f, 0.5f)); - addParam(ParamWidget::create(Vec(57, 139), module, VCMixer::CH1_PARAM, 0.0f, 1.0f, 0.0f)); - addParam(ParamWidget::create(Vec(57, 219), module, VCMixer::CH2_PARAM, 0.0f, 1.0f, 0.0f)); - addParam(ParamWidget::create(Vec(57, 300), module, VCMixer::CH3_PARAM, 0.0f, 1.0f, 0.0f)); + addParam(ParamWidget::create(mm2px(Vec(19.049999, 21.161154)), module, VCMixer::MIX_LVL_PARAM, 0.0, 2.0, 1.0)); + addParam(ParamWidget::create(mm2px(Vec(5.8993969, 44.33149).plus(Vec(-2, 0))), module, VCMixer::LVL_PARAM + 0, 0.0, 1.0, 1.0)); + addParam(ParamWidget::create(mm2px(Vec(17.899343, 44.331486).plus(Vec(-2, 0))), module, VCMixer::LVL_PARAM + 1, 0.0, 1.0, 1.0)); + addParam(ParamWidget::create(mm2px(Vec(29.899292, 44.331486).plus(Vec(-2, 0))), module, VCMixer::LVL_PARAM + 2, 0.0, 1.0, 1.0)); + addParam(ParamWidget::create(mm2px(Vec(41.90065, 44.331486).plus(Vec(-2, 0))), module, VCMixer::LVL_PARAM + 3, 0.0, 1.0, 1.0)); - addInput(Port::create(Vec(16, 69), Port::INPUT, module, VCMixer::MIX_CV_INPUT)); - addInput(Port::create(Vec(22, 129), Port::INPUT, module, VCMixer::CH1_INPUT)); - addInput(Port::create(Vec(22, 160), Port::INPUT, module, VCMixer::CH1_CV_INPUT)); - addInput(Port::create(Vec(22, 209), Port::INPUT, module, VCMixer::CH2_INPUT)); - addInput(Port::create(Vec(22, 241), Port::INPUT, module, VCMixer::CH2_CV_INPUT)); - addInput(Port::create(Vec(22, 290), Port::INPUT, module, VCMixer::CH3_INPUT)); - addInput(Port::create(Vec(22, 322), Port::INPUT, module, VCMixer::CH3_CV_INPUT)); + // Use old interleaved order for backward compatibility with <0.6 + addInput(Port::create(mm2px(Vec(3.2935331, 23.404598)), Port::INPUT, module, VCMixer::MIX_CV_INPUT)); + addInput(Port::create(mm2px(Vec(3.2935331, 78.531639)), Port::INPUT, module, VCMixer::CH_INPUT + 0)); + addInput(Port::create(mm2px(Vec(3.2935331, 93.531586)), Port::INPUT, module, VCMixer::CV_INPUT + 0)); + addInput(Port::create(mm2px(Vec(15.29348, 78.531639)), Port::INPUT, module, VCMixer::CH_INPUT + 1)); + addInput(Port::create(mm2px(Vec(15.29348, 93.531586)), Port::INPUT, module, VCMixer::CV_INPUT + 1)); + addInput(Port::create(mm2px(Vec(27.293465, 78.531639)), Port::INPUT, module, VCMixer::CH_INPUT + 2)); + addInput(Port::create(mm2px(Vec(27.293465, 93.531586)), Port::INPUT, module, VCMixer::CV_INPUT + 2)); + addInput(Port::create(mm2px(Vec(39.293411, 78.531639)), Port::INPUT, module, VCMixer::CH_INPUT + 3)); + addInput(Port::create(mm2px(Vec(39.293411, 93.531586)), Port::INPUT, module, VCMixer::CV_INPUT + 3)); - addOutput(Port::create(Vec(110, 69), Port::OUTPUT, module, VCMixer::MIX_OUTPUT)); - addOutput(Port::create(Vec(110, 145), Port::OUTPUT, module, VCMixer::CH1_OUTPUT)); - addOutput(Port::create(Vec(110, 225), Port::OUTPUT, module, VCMixer::CH2_OUTPUT)); - addOutput(Port::create(Vec(110, 306), Port::OUTPUT, module, VCMixer::CH3_OUTPUT)); -} + addOutput(Port::create(mm2px(Vec(39.293411, 23.4046)), Port::OUTPUT, module, VCMixer::MIX_OUTPUT)); + addOutput(Port::create(mm2px(Vec(3.2935331, 108.53153)), Port::OUTPUT, module, VCMixer::CH_OUTPUT + 0)); + addOutput(Port::create(mm2px(Vec(15.29348, 108.53153)), Port::OUTPUT, module, VCMixer::CH_OUTPUT + 1)); + addOutput(Port::create(mm2px(Vec(27.293465, 108.53153)), Port::OUTPUT, module, VCMixer::CH_OUTPUT + 2)); + addOutput(Port::create(mm2px(Vec(39.293411, 108.53153)), Port::OUTPUT, module, VCMixer::CH_OUTPUT + 3)); + } +}; -Model *modelVCMixer = Model::create("Fundamental", "VCMixer", "VC Mixer", MIXER_TAG, AMPLIFIER_TAG); +Model *modelVCMixer = Model::create("Fundamental", "VCMixer", "Mixer", MIXER_TAG, AMPLIFIER_TAG);