diff --git a/libs/evoral/ControlList.cc b/libs/evoral/ControlList.cc index 8ecdc5c423..b6e8111f4d 100644 --- a/libs/evoral/ControlList.cc +++ b/libs/evoral/ControlList.cc @@ -381,6 +381,14 @@ ControlList::thin (double thinning_factor) return; } + /* compat. In the past the actual (internal) value was used + * to compute the area. For gain the range is 0..2 (exp). + * Since we cannot change automation-thinning-factor + * in user's existing config, we simply re-normalize + * the thinning factor. + */ + thinning_factor *= .7071; + assert (is_sorted ()); bool changed = false; @@ -407,9 +415,13 @@ ControlList::thin (double thinning_factor) const double pw = prev->when.samples (); const double cw = cur->when.samples (); - double area = fabs ((ppw * (prev->value - cur->value)) + - (pw * (cur->value - prevprev->value)) + - (cw * (prevprev->value - prev->value))); + const float ppv = _desc.to_interface (prevprev->value); + const float cv = _desc.to_interface (cur->value); + const float pv = _desc.to_interface (prev->value); + + double area = fabs ((ppw * (pv - cv)) + + (pw * (cv - ppv)) + + (cw * (ppv - pv))); if (area < thinning_factor) { iterator tmp = pprev; @@ -420,6 +432,7 @@ ControlList::thin (double thinning_factor) */ pprev = i; + prev = cur; _events.erase (tmp); changed = true; continue; diff --git a/libs/evoral/evoral/ParameterDescriptor.h b/libs/evoral/evoral/ParameterDescriptor.h index 33fe4ce70e..824cf24968 100644 --- a/libs/evoral/evoral/ParameterDescriptor.h +++ b/libs/evoral/evoral/ParameterDescriptor.h @@ -33,6 +33,11 @@ struct ParameterDescriptor , rangesteps (0) {} + virtual ~ParameterDescriptor () {} + virtual float to_interface (float val, bool rotary = false) const { + return (val - lower) / (upper - lower); + } + float normal; ///< Default value float lower; ///< Minimum value (in Hz, for frequencies) float upper; ///< Maximum value (in Hz, for frequencies)