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);