Browse Source

MidSide: Normalize decoder's mid/side inputs to encoder's mid/side outputs.

tags/v2.3.0
Andrew Belt 1 year ago
parent
commit
8abe0abb68
1 changed files with 33 additions and 32 deletions
  1. +33
    -32
      src/MidSide.cpp

+ 33
- 32
src/MidSide.cpp View File

@@ -47,41 +47,42 @@ struct MidSide : Module {
using simd::float_4;

// Encoder
{
int channels = std::max(inputs[ENC_LEFT_INPUT].getChannels(), inputs[ENC_RIGHT_INPUT].getChannels());
outputs[ENC_MID_OUTPUT].setChannels(channels);
outputs[ENC_SIDES_OUTPUT].setChannels(channels);

for (int c = 0; c < channels; c += 4) {
float_4 width = params[ENC_WIDTH_PARAM].getValue();
width += inputs[ENC_WIDTH_INPUT].getPolyVoltageSimd<float_4>(c) / 10 * 2;
width = simd::fmax(width, 0.f);
float_4 left = inputs[ENC_LEFT_INPUT].getVoltageSimd<float_4>(c);
float_4 right = inputs[ENC_RIGHT_INPUT].getVoltageSimd<float_4>(c);
float_4 mid = (left + right) / 2;
float_4 sides = (left - right) / 2 * width;
outputs[ENC_MID_OUTPUT].setVoltageSimd(mid, c);
outputs[ENC_SIDES_OUTPUT].setVoltageSimd(sides, c);
}
int channels = std::max(inputs[ENC_LEFT_INPUT].getChannels(), inputs[ENC_RIGHT_INPUT].getChannels());

outputs[ENC_MID_OUTPUT].setChannels(channels);
outputs[ENC_SIDES_OUTPUT].setChannels(channels);

for (int c = 0; c < channels; c += 4) {
float_4 width = params[ENC_WIDTH_PARAM].getValue();
width += inputs[ENC_WIDTH_INPUT].getPolyVoltageSimd<float_4>(c) / 10 * 2;
width = simd::fmax(width, 0.f);
float_4 left = inputs[ENC_LEFT_INPUT].getVoltageSimd<float_4>(c);
float_4 right = inputs[ENC_RIGHT_INPUT].getVoltageSimd<float_4>(c);
float_4 mid = (left + right) / 2;
float_4 sides = (left - right) / 2 * width;
outputs[ENC_MID_OUTPUT].setVoltageSimd(mid, c);
outputs[ENC_SIDES_OUTPUT].setVoltageSimd(sides, c);
}

// Decoder
{
int channels = std::max(inputs[DEC_MID_INPUT].getChannels(), inputs[DEC_SIDES_INPUT].getChannels());
outputs[DEC_LEFT_OUTPUT].setChannels(channels);
outputs[DEC_RIGHT_OUTPUT].setChannels(channels);

for (int c = 0; c < channels; c += 4) {
float_4 width = params[DEC_WIDTH_PARAM].getValue();
width += inputs[DEC_WIDTH_INPUT].getPolyVoltageSimd<float_4>(c) / 10 * 2;
width = simd::fmax(width, 0.f);
float_4 mid = inputs[DEC_MID_INPUT].getVoltageSimd<float_4>(c);
float_4 sides = inputs[DEC_SIDES_INPUT].getVoltageSimd<float_4>(c);
float_4 left = mid + sides * width;
float_4 right = mid - sides * width;
outputs[DEC_LEFT_OUTPUT].setVoltageSimd(left, c);
outputs[DEC_RIGHT_OUTPUT].setVoltageSimd(right, c);
}
if (inputs[DEC_MID_INPUT].isConnected() || inputs[DEC_SIDES_INPUT].isConnected())
channels = std::max(inputs[DEC_MID_INPUT].getChannels(), inputs[DEC_SIDES_INPUT].getChannels());

outputs[DEC_LEFT_OUTPUT].setChannels(channels);
outputs[DEC_RIGHT_OUTPUT].setChannels(channels);

for (int c = 0; c < channels; c += 4) {
float_4 width = params[DEC_WIDTH_PARAM].getValue();
width += inputs[DEC_WIDTH_INPUT].getPolyVoltageSimd<float_4>(c) / 10 * 2;
width = simd::fmax(width, 0.f);
float_4 mid = outputs[ENC_MID_OUTPUT].getVoltageSimd<float_4>(c);
float_4 sides = outputs[ENC_SIDES_OUTPUT].getVoltageSimd<float_4>(c);
mid = inputs[DEC_MID_INPUT].getNormalVoltageSimd<float_4>(mid, c);
sides = inputs[DEC_SIDES_INPUT].getNormalVoltageSimd<float_4>(sides, c);
float_4 left = mid + sides * width;
float_4 right = mid - sides * width;
outputs[DEC_LEFT_OUTPUT].setVoltageSimd(left, c);
outputs[DEC_RIGHT_OUTPUT].setVoltageSimd(right, c);
}
}
};


Loading…
Cancel
Save