From 5451a70a1648c31e37d739061a85e13f75a428ed Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 29 May 2014 07:48:25 +0200 Subject: increase accuracy of fades. --- libs/ardour/audioregion.cc | 51 +++++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 23 deletions(-) (limited to 'libs/ardour/audioregion.cc') diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc index dca38e17d3..dd198db3b4 100644 --- a/libs/ardour/audioregion.cc +++ b/libs/ardour/audioregion.cc @@ -991,6 +991,8 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len) _fade_in->clear (); _inverse_fade_in->clear (); + const int num_steps = min((framecnt_t)256, max ((framecnt_t) 16, len / 512)); + switch (shape) { case FadeLinear: _fade_in->fast_simple_add (0.0, VERY_SMALL_SIGNAL); @@ -999,15 +1001,15 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len) break; case FadeFast: - generate_db_fade (_fade_in.val(), len, 10, -60); + generate_db_fade (_fade_in.val(), len, num_steps, -60); reverse_curve (c1, _fade_in.val()); _fade_in->copy_events (*c1); generate_inverse_power_curve (_inverse_fade_in.val(), _fade_in.val()); break; case FadeSlow: - generate_db_fade (c1, len, 10, -1); // start off with a slow fade - generate_db_fade (c2, len, 10, -80); // end with a fast fade + generate_db_fade (c1, len, num_steps, -1); // start off with a slow fade + generate_db_fade (c2, len, num_steps, -80); // end with a fast fade merge_curves (_fade_in.val(), c1, c2); reverse_curve (c3, _fade_in.val()); _fade_in->copy_events (*c3); @@ -1016,9 +1018,9 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len) case FadeConstantPower: _fade_in->fast_simple_add (0.0, VERY_SMALL_SIGNAL); - for (int i = 1; i < 9; ++i) { - float dist = (float) i/10.f; - _fade_in->fast_simple_add (len*dist, sin (dist*M_PI/2.f)); + for (int i = 1; i < num_steps; ++i) { + const float dist = i / (num_steps + 1.f); + _fade_in->fast_simple_add (len * dist, sin (dist * M_PI / 2.0)); } _fade_in->fast_simple_add (len, 1.0); reverse_curve (_inverse_fade_in.val(), _fade_in.val()); @@ -1027,15 +1029,16 @@ AudioRegion::set_fade_in (FadeShape shape, framecnt_t len) case FadeSymmetric: //start with a nearly linear cuve _fade_in->fast_simple_add (0, 1); - _fade_in->fast_simple_add (0.5*len, 0.6); + _fade_in->fast_simple_add (0.5 * len, 0.6); //now generate a fade-out curve by successively applying a gain drop - const float breakpoint = 0.7; //linear for first 70% - for (int i = 2; i < 9; i++) { - float coeff = (1.0-breakpoint); + const double breakpoint = 0.7; //linear for first 70% + for (int i = 2; i < num_steps; i++) { + const double offset = 1.0 - breakpoint; + float coeff = 1.0 - breakpoint; for (int j = 0; j < i; j++) { coeff *= 0.5; //6dB drop per step } - _fade_in->fast_simple_add (len* (breakpoint+((1.0-breakpoint)*(double)i/9.0)), coeff); + _fade_in->fast_simple_add (len * (breakpoint + (offset * (double)i / (double)num_steps)), coeff); } _fade_in->fast_simple_add (len, VERY_SMALL_SIGNAL); reverse_curve (c3, _fade_in.val()); @@ -1070,6 +1073,8 @@ AudioRegion::set_fade_out (FadeShape shape, framecnt_t len) _fade_out->clear (); _inverse_fade_out->clear (); + const int num_steps = min((framecnt_t)256, max ((framecnt_t) 16, len / 512)); + switch (shape) { case FadeLinear: _fade_out->fast_simple_add (0.0, 1.0); @@ -1078,13 +1083,13 @@ AudioRegion::set_fade_out (FadeShape shape, framecnt_t len) break; case FadeFast: - generate_db_fade (_fade_out.val(), len, 10, -60); + generate_db_fade (_fade_out.val(), len, num_steps, -60); generate_inverse_power_curve (_inverse_fade_out.val(), _fade_out.val()); break; case FadeSlow: - generate_db_fade (c1, len, 10, -1); //start off with a slow fade - generate_db_fade (c2, len, 10, -80); //end with a fast fade + generate_db_fade (c1, len, num_steps, -1); //start off with a slow fade + generate_db_fade (c2, len, num_steps, -80); //end with a fast fade merge_curves (_fade_out.val(), c1, c2); generate_inverse_power_curve (_inverse_fade_out.val(), _fade_out.val()); break; @@ -1093,9 +1098,9 @@ AudioRegion::set_fade_out (FadeShape shape, framecnt_t len) //constant-power fades use a sin/cos relationship //the cutoff is abrupt but it has the benefit of being symmetrical _fade_out->fast_simple_add (0.0, 1.0); - for (int i = 1; i < 9; i++ ) { - float dist = (float)i/10.0; - _fade_out->fast_simple_add ((len * dist), cos(dist*M_PI/2)); + for (int i = 1; i < num_steps; ++i) { + const float dist = i / (num_steps + 1.f); + _fade_out->fast_simple_add (len * dist, cos (dist * M_PI / 2.0)); } _fade_out->fast_simple_add (len, VERY_SMALL_SIGNAL); reverse_curve (_inverse_fade_out.val(), _fade_out.val()); @@ -1104,17 +1109,17 @@ AudioRegion::set_fade_out (FadeShape shape, framecnt_t len) case FadeSymmetric: //start with a nearly linear cuve _fade_out->fast_simple_add (0, 1); - _fade_out->fast_simple_add (0.5*len, 0.6); + _fade_out->fast_simple_add (0.5 * len, 0.6); //now generate a fade-out curve by successively applying a gain drop - const float breakpoint = 0.7; //linear for first 70% - const int num_steps = 9; + const double breakpoint = 0.7; //linear for first 70% for (int i = 2; i < num_steps; i++) { - float coeff = (1.0-breakpoint); + const double offset = 1.0 - breakpoint; + float coeff = 1.0 - breakpoint; for (int j = 0; j < i; j++) { - coeff *= 0.5; //6dB drop per step + coeff *= 0.5; // 6dB drop per step } - _fade_out->fast_simple_add (len* (breakpoint+((1.0-breakpoint)*(double)i/(double)num_steps)), coeff); + _fade_out->fast_simple_add (len * (breakpoint + (offset * (double)i / (double)num_steps)), coeff); } _fade_out->fast_simple_add (len, VERY_SMALL_SIGNAL); reverse_curve (_inverse_fade_out.val(), _fade_out.val()); -- cgit v1.2.3