diff --git a/src/VCA.cpp b/src/VCA.cpp index b444111..18b2e15 100644 --- a/src/VCA.cpp +++ b/src/VCA.cpp @@ -119,7 +119,7 @@ struct VCA_1 : Module { NUM_LIGHTS }; - float lastCv = 0.f; + float amplitude = 0.f; VCA_1() { config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); @@ -128,11 +128,33 @@ struct VCA_1 : Module { } void process(const ProcessArgs &args) override { - float cv = inputs[CV_INPUT].getNormalVoltage(10.f) / 10.f; - if ((int) params[EXP_PARAM].getValue() == 0) - cv = std::pow(cv, 4.f); - lastCv = cv; - outputs[OUT_OUTPUT].setVoltage(inputs[IN_INPUT].getVoltage() * params[LEVEL_PARAM].getValue() * cv); + int channels = inputs[IN_INPUT].getChannels(); + float amplitudeSum = 0.f; + float level = params[LEVEL_PARAM].getValue(); + + for (int c = 0; c < channels; c++) { + // Get input + float in = inputs[IN_INPUT].getVoltage(c); + + // Get gain + float gain = level; + if (inputs[CV_INPUT].isConnected()) { + float cv = clamp(inputs[CV_INPUT].getPolyVoltage(c) / 10.f, 0.f, 1.f); + if ((int) std::round(params[EXP_PARAM].getValue()) == 0) + cv = std::pow(cv, 4.f); + gain *= cv; + } + + // Apply gain + in *= gain; + amplitudeSum += gain; + + // Set output + outputs[OUT_OUTPUT].setVoltage(in, c); + } + + outputs[OUT_OUTPUT].setChannels(channels); + amplitude = (channels > 0) ? (amplitudeSum / channels) : 0.f; } }; @@ -145,7 +167,7 @@ struct VCA_1VUKnob : SliderKnob { } void draw(const DrawArgs &args) override { - float lastCv = module ? module->lastCv : 1.f; + float amplitude = module ? module->amplitude : 1.f; nvgBeginPath(args.vg); nvgRoundedRect(args.vg, 0, 0, box.size.x, box.size.y, 2.0); @@ -159,7 +181,6 @@ struct VCA_1VUKnob : SliderKnob { for (int i = 0; i < segs; i++) { float value = paramQuantity ? paramQuantity->getValue() : 1.f; float segValue = clamp(value * segs - (segs - i - 1), 0.f, 1.f); - float amplitude = value * lastCv; float segAmplitude = clamp(amplitude * segs - (segs - i - 1), 0.f, 1.f); nvgBeginPath(args.vg); nvgRect(args.vg, r.pos.x, r.pos.y + r.size.y / segs * i + 0.5,