Browse Source

slewlimiter bug fixed

Signed-off-by: hemmer <915048+hemmer@users.noreply.github.com>
tags/v1.1.0^2
martin-lueders hemmer 5 years ago
parent
commit
2f176da2d2
1 changed files with 7 additions and 4 deletions
  1. +7
    -4
      src/SlewLimiter.cpp

+ 7
- 4
src/SlewLimiter.cpp View File

@@ -46,7 +46,7 @@ struct SlewLimiter : Module {
// Amount of extra slew per voltage difference // Amount of extra slew per voltage difference
const float shapeScale = 1/10.f; const float shapeScale = 1/10.f;


float shape = params[SHAPE_PARAM].getValue();
const simd::float_4 shape = simd::float_4(params[SHAPE_PARAM].getValue());
const simd::float_4 param_rise = simd::float_4(params[RISE_PARAM].getValue() * 10.f); const simd::float_4 param_rise = simd::float_4(params[RISE_PARAM].getValue() * 10.f);
const simd::float_4 param_fall = simd::float_4(params[FALL_PARAM].getValue() * 10.f); const simd::float_4 param_fall = simd::float_4(params[FALL_PARAM].getValue() * 10.f);


@@ -66,12 +66,15 @@ struct SlewLimiter : Module {
simd::float_4 delta_gt_0 = delta > simd::float_4::zero(); simd::float_4 delta_gt_0 = delta > simd::float_4::zero();
simd::float_4 delta_lt_0 = delta < simd::float_4::zero(); simd::float_4 delta_lt_0 = delta < simd::float_4::zero();


simd::float_4 rateCV = ifelse(delta_gt_0, riseCV[c/4], simd::float_4::zero());
simd::float_4 rateCV;
rateCV = ifelse(delta_gt_0, riseCV[c/4], simd::float_4::zero());
rateCV = ifelse(delta_lt_0, fallCV[c/4], rateCV) * 0.1f; rateCV = ifelse(delta_lt_0, fallCV[c/4], rateCV) * 0.1f;


simd::float_4 slew = slewMax * simd::pow(slewMin / slewMax, rateCV);
simd::float_4 pm_one = simd::sgn(delta);


out[c/4] += slew * simd::crossfade(simd::float_4(1.0f), shapeScale*delta, shape) * args.sampleTime;
simd::float_4 slew = slewMax * simd::pow(simd::float_4(slewMin / slewMax), rateCV);

out[c/4] += slew * simd::crossfade(pm_one, shapeScale*delta, shape) * args.sampleTime;
out[c/4] = ifelse( delta_gt_0 & (out[c/4]>in[c/4]), in[c/4], out[c/4]); out[c/4] = ifelse( delta_gt_0 & (out[c/4]>in[c/4]), in[c/4], out[c/4]);
out[c/4] = ifelse( delta_lt_0 & (out[c/4]<in[c/4]), in[c/4], out[c/4]); out[c/4] = ifelse( delta_lt_0 & (out[c/4]<in[c/4]), in[c/4], out[c/4]);




Loading…
Cancel
Save