summaryrefslogtreecommitdiff
path: root/libs/plugins/a-exp.lv2
diff options
context:
space:
mode:
authorJohannes Mueller <github@johannes-mueller.org>2017-08-03 17:10:59 +0200
committerJohannes Mueller <github@johannes-mueller.org>2018-05-12 19:49:18 +0200
commit2a5d56215cbe0f86d649394168b6869946508a21 (patch)
treede416e0fb183fed1ad0f67933728375852d0c042 /libs/plugins/a-exp.lv2
parent48c568187df1361d6b17d9846214e605cf08bb56 (diff)
New visualization of the compressor state in graph view
To properly visualize attack and release we calculate the input level out of the gain reduction the output level threshold and ratio. if (output_level >= threshold) { // no expansion input_level = output_level } else { input_level = (gain_reduction - threshold * (1-ratio)) / ratio }
Diffstat (limited to 'libs/plugins/a-exp.lv2')
-rw-r--r--libs/plugins/a-exp.lv2/a-exp.c55
1 files changed, 8 insertions, 47 deletions
diff --git a/libs/plugins/a-exp.lv2/a-exp.c b/libs/plugins/a-exp.lv2/a-exp.c
index 2becb97d4e..553edbdf21 100644
--- a/libs/plugins/a-exp.lv2/a-exp.c
+++ b/libs/plugins/a-exp.lv2/a-exp.c
@@ -82,8 +82,6 @@ typedef struct {
float srate;
- float old_in_peak_db;
-
float makeup_gain;
float tau;
@@ -255,7 +253,6 @@ activate(LV2_Handle instance)
*(aexp->gainr) = 160.0f;
*(aexp->outlevel) = -45.0f;
- aexp->old_in_peak_db = -160.0f;
}
static void
@@ -322,14 +319,12 @@ run_mono(LV2_Handle instance, uint32_t n_samples)
}
#endif
- float in_peak = 0.f;
aexp->v_gainr = 0.0;
for (i = 0; i < n_samples; i++) {
in0 = input[i];
sc0 = sc[i];
ingain = usesidechain ? fabs(sc0) : fabs(in0);
- in_peak = fmaxf (in_peak, ingain);
Lyg = 0.f;
Lxg = (ingain==0.f) ? -160.f : to_dB(ingain);
Lxg = sanitize_denormal(Lxg);
@@ -374,27 +369,11 @@ run_mono(LV2_Handle instance, uint32_t n_samples)
aexp->makeup_gain = makeup_gain;
#ifdef LV2_EXTENDED
- float in_peak_db = to_dB(in_peak);
-
- if (!isfinite_local (in_peak_db)) {
- in_peak_db = -160.0f;
- }
-
- const float tot_rel_c = exp(-1000.f/(*(aexp->release) * srate) * n_samples);
- const float tot_atk_c = exp(-1000.f/(*(aexp->attack) * srate) * n_samples);
-
- const float old_in_peak_db = aexp->old_in_peak_db;
-
- if (in_peak_db < old_in_peak_db && in_peak_db < thresdb) {
- in_peak_db = tot_rel_c*old_in_peak_db + (1.f-tot_rel_c)*in_peak_db;
- } else if (in_peak_db > aexp->old_in_peak_db && in_peak_db > thresdb) {
- in_peak_db = tot_atk_c*old_in_peak_db+ (1.f*tot_atk_c)*in_peak_db;
- }
-
- aexp->old_in_peak_db = in_peak_db;
-
- const float v_lvl_in = in_peak_db;
const float v_lvl_out = (max < 0.001f) ? -60.f : to_dB(max);
+ const float v_lvl_in = v_lvl_out > thresdb ?
+ v_lvl_out :
+ (aexp->v_lvl_out - thresdb * (1.f-ratio))/ratio;
+
if (fabsf (aexp->v_lvl_out - v_lvl_out) >= 1 || fabsf (aexp->v_lvl_in - v_lvl_in) >= 1) {
// >= 1dB difference
aexp->need_expose = true;
@@ -479,7 +458,6 @@ run_stereo(LV2_Handle instance, uint32_t n_samples)
}
#endif
- float in_peak = 0.f;
aexp->v_gainr = 0.0;
for (i = 0; i < n_samples; i++) {
@@ -488,7 +466,6 @@ run_stereo(LV2_Handle instance, uint32_t n_samples)
sc0 = sc[i];
maxabslr = fmaxf(fabs(in0), fabs(in1));
ingain = usesidechain ? fabs(sc0) : maxabslr;
- in_peak = fmaxf (in_peak, ingain);
Lyg = 0.f;
Lxg = (ingain==0.f) ? -160.f : to_dB(ingain);
Lxg = sanitize_denormal(Lxg);
@@ -536,27 +513,11 @@ run_stereo(LV2_Handle instance, uint32_t n_samples)
aexp->makeup_gain = makeup_gain;
#ifdef LV2_EXTENDED
- float in_peak_db = to_dB(in_peak);
-
- if (!isfinite_local (in_peak_db)) {
- in_peak_db = -160.0f;
- }
-
- const float tot_rel_c = exp(-1000.f/(*(aexp->release) * srate) * n_samples);
- const float tot_atk_c = exp(-1000.f/(*(aexp->attack) * srate) * n_samples);
-
- const float old_in_peak_db = aexp->old_in_peak_db;
-
- if (in_peak_db < old_in_peak_db && in_peak_db < thresdb) {
- in_peak_db = tot_rel_c*old_in_peak_db + (1.f-tot_rel_c)*in_peak_db;
- } else if (in_peak_db > aexp->old_in_peak_db && in_peak_db > thresdb) {
- in_peak_db = tot_atk_c*old_in_peak_db+ (1.f*tot_atk_c)*in_peak_db;
- }
-
- aexp->old_in_peak_db = in_peak_db;
-
- const float v_lvl_in = in_peak_db;
const float v_lvl_out = (max < 0.001f) ? -60.f : to_dB(max);
+ const float v_lvl_in = v_lvl_out > thresdb ?
+ v_lvl_out :
+ (aexp->v_lvl_out - thresdb * (1.f-ratio))/ratio;
+
if (fabsf (aexp->v_lvl_out - v_lvl_out) >= 1 || fabsf (aexp->v_lvl_in - v_lvl_in) >= 1) {
// >= 1dB difference
aexp->need_expose = true;