From d437f9570e3eac0d0602a424d433d10d84b87a9d Mon Sep 17 00:00:00 2001 From: Johannes Mueller Date: Thu, 3 Aug 2017 22:20:07 +0200 Subject: compressors: Make the attack no longer influence the release. Before this change, setting a low release time and a high attack time made any compressor also release slowly (according to the attack parameter). This commit changes this behavior so that the attack parameter only affects the attack without affecting the release. Signed-off-by: Damien Zammit --- plugins/ZaMultiComp/ZaMultiCompPlugin.cpp | 16 +++++++------- plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp | 29 +++++++++++++++----------- plugins/ZamComp/ZamCompPlugin.cpp | 17 ++++++++------- plugins/ZamCompX2/ZamCompX2Plugin.cpp | 30 +++++++++++++++------------ 4 files changed, 53 insertions(+), 39 deletions(-) diff --git a/plugins/ZaMultiComp/ZaMultiCompPlugin.cpp b/plugins/ZaMultiComp/ZaMultiCompPlugin.cpp index 0e183c0..ffb7976 100644 --- a/plugins/ZaMultiComp/ZaMultiCompPlugin.cpp +++ b/plugins/ZaMultiComp/ZaMultiCompPlugin.cpp @@ -791,7 +791,7 @@ void ZaMultiCompPlugin::run_comp(int k, float in, float *out) float cdb=0.f; float Lgain = 1.f; float Lxg, Lyg; - float Lxl, Lyl, Ly1; + float Lxl, Lyl; Lyg = 0.f; in = sanitize_denormal(in); @@ -811,12 +811,15 @@ void ZaMultiCompPlugin::run_comp(int k, float in, float *out) Lxl = Lxg - Lyg; - old_y1[k] = sanitize_denormal(old_y1[k]); - old_yl[k] = sanitize_denormal(old_yl[k]); + old_yl[k] = sanitize_denormal(old_yl[k]); - Ly1 = fmaxf(Lxl, release_coeff * old_y1[k]+(1.f-release_coeff)*Lxl); - Lyl = attack_coeff * old_yl[k]+(1.f-attack_coeff)*Ly1; - Ly1 = sanitize_denormal(Ly1); + if (Lxl < old_yl[k]) { + Lyl = release_coeff * old_yl[k] + (1.f-release_coeff)*Lxl; + } else if (Lxl > old_yl[k]) { + Lyl = attack_coeff * old_yl[k]+(1.f-attack_coeff)*Lxl; + } else { + Lyl = Lxl; + } Lyl = sanitize_denormal(Lyl); cdb = -Lyl; @@ -827,7 +830,6 @@ void ZaMultiCompPlugin::run_comp(int k, float in, float *out) *out = in * Lgain; old_yl[k] = Lyl; - old_y1[k] = Ly1; old_yg[k] = Lyg; } diff --git a/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp b/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp index d74093f..877377b 100644 --- a/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp +++ b/plugins/ZaMultiCompX2/ZaMultiCompX2Plugin.cpp @@ -811,8 +811,8 @@ void ZaMultiCompX2Plugin::run_comp(int k, float inL, float inR, float *outL, flo float Rgain = 1.f; float Lxg, Lyg; float Rxg, Ryg; - float Lxl, Lyl, Ly1; - float Rxl, Ryl, Ry1; + float Lxl, Lyl; + float Rxl, Ryl; Lyg = Ryg = 0.f; inL = sanitize_denormal(inL); @@ -850,22 +850,29 @@ void ZaMultiCompX2Plugin::run_comp(int k, float inL, float inR, float *outL, flo Lxl = Rxl = (Lxg - Lyg + Rxg - Ryg) / 2.f; } - old_y1[0][k] = sanitize_denormal(old_y1[0][k]); - old_y1[1][k] = sanitize_denormal(old_y1[1][k]); old_yl[0][k] = sanitize_denormal(old_yl[0][k]); old_yl[1][k] = sanitize_denormal(old_yl[1][k]); - Ly1 = fmaxf(Lxl, release_coeff * old_y1[0][k]+(1.f-release_coeff)*Lxl); - Lyl = attack_coeff * old_yl[0][k]+(1.f-attack_coeff)*Ly1; - Ly1 = sanitize_denormal(Ly1); + + if (Lxl < old_yl[0][k]) { + Lyl = release_coeff * old_yl[0][k] + (1.f-release_coeff)*Lxl; + } else if (Lxl > old_yl[0][k]) { + Lyl = attack_coeff * old_yl[0][k]+(1.f-attack_coeff)*Lxl; + } else { + Lyl = Lxl; + } Lyl = sanitize_denormal(Lyl); cdb = -Lyl; Lgain = from_dB(cdb); - Ry1 = fmaxf(Rxl, release_coeff * old_y1[1][k]+(1.f-release_coeff)*Rxl); - Ryl = attack_coeff * old_yl[1][k]+(1.f-attack_coeff)*Ry1; - Ry1 = sanitize_denormal(Ry1); + if (Rxl < old_yl[1][k]) { + Ryl = release_coeff * old_yl[1][k] + (1.f-release_coeff)*Rxl; + } else if (Rxl > old_yl[1][k]) { + Ryl = attack_coeff * old_yl[1][k]+(1.f-attack_coeff)*Rxl; + } else { + Ryl = Rxl; + } Ryl = sanitize_denormal(Ryl); cdb = -Ryl; @@ -881,8 +888,6 @@ void ZaMultiCompX2Plugin::run_comp(int k, float inL, float inR, float *outL, flo old_yl[0][k] = Lyl; old_yl[1][k] = Ryl; - old_y1[0][k] = Ly1; - old_y1[1][k] = Ry1; old_yg[0][k] = Lyg; old_yg[1][k] = Ryg; } diff --git a/plugins/ZamComp/ZamCompPlugin.cpp b/plugins/ZamComp/ZamCompPlugin.cpp index 876dda3..af2a279 100644 --- a/plugins/ZamComp/ZamCompPlugin.cpp +++ b/plugins/ZamComp/ZamCompPlugin.cpp @@ -300,7 +300,7 @@ void ZamCompPlugin::run(const float** inputs, float** outputs, uint32_t frames) float max = 0.f; float lgaininp = 0.f; float Lgain = 1.f; - float Lxg, Lxl, Lyg, Lyl, Ly1; + float Lxg, Lxl, Lyg, Lyl; float checkwidth = 0.f; bool usesidechain = (sidechain < 0.5) ? false : true; uint32_t i; @@ -340,11 +340,15 @@ void ZamCompPlugin::run(const float** inputs, float** outputs, uint32_t frames) Lxl = Lxg - Lyg; - oldL_y1 = sanitize_denormal(oldL_y1); oldL_yl = sanitize_denormal(oldL_yl); - Ly1 = fmaxf(Lxl, release_coeff * oldL_y1+(1.f-release_coeff)*Lxl); - Lyl = attack_coeff * oldL_yl+(1.f-attack_coeff)*Ly1; - Ly1 = sanitize_denormal(Ly1); + + if (Lxl < oldL_yl) { + Lyl = release_coeff * oldL_yl + (1.f-release_coeff)*Lxl; + } else if (Lxl > oldL_yl) { + Lyl = attack_coeff * oldL_yl+(1.f-attack_coeff)*Lxl; + } else { + Lyl = Lxl; + } Lyl = sanitize_denormal(Lyl); cdb = -Lyl; @@ -358,11 +362,10 @@ void ZamCompPlugin::run(const float** inputs, float** outputs, uint32_t frames) max = (fabsf(outputs[0][i]) > max) ? fabsf(outputs[0][i]) : sanitize_denormal(max); oldL_yl = Lyl; - oldL_y1 = Ly1; oldL_yg = Lyg; } outlevel = (max == 0.f) ? -45.f : to_dB(max); // relative to - thresdb; - } +} // ----------------------------------------------------------------------- diff --git a/plugins/ZamCompX2/ZamCompX2Plugin.cpp b/plugins/ZamCompX2/ZamCompX2Plugin.cpp index 78fc43d..330b1b5 100644 --- a/plugins/ZamCompX2/ZamCompX2Plugin.cpp +++ b/plugins/ZamCompX2/ZamCompX2Plugin.cpp @@ -322,8 +322,8 @@ void ZamCompX2Plugin::run(const float** inputs, float** outputs, uint32_t frames float rgaininp = 0.f; float Lgain = 1.f; float Rgain = 1.f; - float Lxg, Lxl, Lyg, Lyl, Ly1; - float Rxg, Rxl, Ryg, Ryl, Ry1; + float Lxg, Lxl, Lyg, Lyl; + float Rxg, Rxl, Ryg, Ryl; float checkwidth = 0.f; uint32_t i; float in0; @@ -393,13 +393,14 @@ void ZamCompX2Plugin::run(const float** inputs, float** outputs, uint32_t frames Lxl = Rxl = (Lxg - Lyg + Rxg - Ryg) / 2.f; } - oldL_y1 = sanitize_denormal(oldL_y1); - oldR_y1 = sanitize_denormal(oldR_y1); oldL_yl = sanitize_denormal(oldL_yl); - oldR_yl = sanitize_denormal(oldR_yl); - Ly1 = fmaxf(Lxl, release_coeff * oldL_y1+(1.f-release_coeff)*Lxl); - Lyl = attack_coeff * oldL_yl+(1.f-attack_coeff)*Ly1; - Ly1 = sanitize_denormal(Ly1); + if (Lxl < oldL_yl) { + Lyl = release_coeff * oldL_yl + (1.f-release_coeff)*Lxl; + } else if (Lxl > oldL_yl) { + Lyl = attack_coeff * oldL_yl+(1.f-attack_coeff)*Lxl; + } else { + Lyl = Lxl; + } Lyl = sanitize_denormal(Lyl); cdb = -Lyl; @@ -407,9 +408,14 @@ void ZamCompX2Plugin::run(const float** inputs, float** outputs, uint32_t frames gainred = Lyl; - Ry1 = fmaxf(Rxl, release_coeff * oldR_y1+(1.f-release_coeff)*Rxl); - Ryl = attack_coeff * oldR_yl+(1.f-attack_coeff)*Ry1; - Ry1 = sanitize_denormal(Ry1); + oldR_y1 = sanitize_denormal(oldR_y1); + if (Rxl < oldR_yl) { + Ryl = release_coeff * oldR_yl + (1.f-release_coeff)*Rxl; + } else if (Rxl > oldR_yl) { + Ryl = attack_coeff * oldR_yl+(1.f-attack_coeff)*Rxl; + } else { + Ryl = Rxl; + } Ryl = sanitize_denormal(Ryl); cdb = -Ryl; @@ -424,8 +430,6 @@ void ZamCompX2Plugin::run(const float** inputs, float** outputs, uint32_t frames oldL_yl = Lyl; oldR_yl = Ryl; - oldL_y1 = Ly1; - oldR_y1 = Ry1; oldL_yg = Lyg; oldR_yg = Ryg; } -- cgit v1.2.3