summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2014-12-04 00:29:28 -0500
committerDavid Robillard <d@drobilla.net>2014-12-04 00:30:47 -0500
commit24727e65befc310f24196d11a56ec7b269977c16 (patch)
treee399a174cff1c328b4e7ebd71778cfcb81fc3383 /libs
parent9b770c7aff5ad38d5363b232b85018a622596877 (diff)
Make gain controls step by roughly 1.0/0.1 dB.
Shoot for roughly 30 steps for all controls. Always keep sensible step information in ParameterDescriptor and just convert for the UI. This is a little weird, but it's less weird than it was before, and works.
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/amp.cc6
-rw-r--r--libs/ardour/ardour/amp.h2
-rw-r--r--libs/ardour/ardour/dB.h5
-rw-r--r--libs/ardour/ardour/parameter_descriptor.h1
-rw-r--r--libs/ardour/parameter_descriptor.cc45
5 files changed, 36 insertions, 23 deletions
diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc
index 0cf7049c47..8ee42f3bbf 100644
--- a/libs/ardour/amp.cc
+++ b/libs/ardour/amp.cc
@@ -27,6 +27,7 @@
#include "ardour/audio_buffer.h"
#include "ardour/buffer_set.h"
#include "ardour/midi_buffer.h"
+#include "ardour/rc_configuration.h"
#include "ardour/session.h"
#include "i18n.h"
@@ -35,9 +36,6 @@ using namespace ARDOUR;
using namespace PBD;
using std::min;
-/* gain range of -inf to +6dB, default 0dB */
-const float Amp::max_gain_coefficient = 1.99526231f;
-
Amp::Amp (Session& s)
: Processor(s, "Amp")
, _apply_gain(true)
@@ -403,7 +401,7 @@ Amp::set_state (const XMLNode& node, int version)
void
Amp::GainControl::set_value (double val)
{
- AutomationControl::set_value (min (val, (double) max_gain_coefficient));
+ AutomationControl::set_value (min (val, (double) Config->get_max_gain()));
_amp->session().set_dirty ();
}
diff --git a/libs/ardour/ardour/amp.h b/libs/ardour/ardour/amp.h
index b70cd0095c..5408c86bff 100644
--- a/libs/ardour/ardour/amp.h
+++ b/libs/ardour/ardour/amp.h
@@ -106,8 +106,6 @@ public:
std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
- static const float max_gain_coefficient;
-
private:
bool _denormal_protection;
bool _apply_gain;
diff --git a/libs/ardour/ardour/dB.h b/libs/ardour/ardour/dB.h
index 4d5f6c9f44..abacdfcd29 100644
--- a/libs/ardour/ardour/dB.h
+++ b/libs/ardour/ardour/dB.h
@@ -34,6 +34,11 @@ static inline float accurate_coefficient_to_dB (float coeff) {
return 20.0f * log10f (coeff);
}
+static inline double dB_coeff_step(double max_coeff) {
+ const double max_db = lrint(accurate_coefficient_to_dB(max_coeff));
+ return 0.1 * (max_coeff / max_db);
+}
+
extern double zero_db_as_fraction;
#endif /* __ardour_dB_h__ */
diff --git a/libs/ardour/ardour/parameter_descriptor.h b/libs/ardour/ardour/parameter_descriptor.h
index 3e042e1e48..749ed10973 100644
--- a/libs/ardour/ardour/parameter_descriptor.h
+++ b/libs/ardour/ardour/parameter_descriptor.h
@@ -54,6 +54,7 @@ struct LIBARDOUR_API ParameterDescriptor : public Evoral::ParameterDescriptor
boost::shared_ptr<ScalePoints> scale_points;
uint32_t key; ///< for properties
Variant::Type datatype; ///< for properties
+ AutomationType type;
Unit unit;
float step;
float smallstep;
diff --git a/libs/ardour/parameter_descriptor.cc b/libs/ardour/parameter_descriptor.cc
index 36f7183134..5d988583cb 100644
--- a/libs/ardour/parameter_descriptor.cc
+++ b/libs/ardour/parameter_descriptor.cc
@@ -18,8 +18,11 @@
*/
#include "ardour/amp.h"
+#include "ardour/dB.h"
#include "ardour/parameter_descriptor.h"
+#include "ardour/rc_configuration.h"
#include "ardour/types.h"
+#include "ardour/utils.h"
namespace ARDOUR {
@@ -27,6 +30,7 @@ ParameterDescriptor::ParameterDescriptor(const Evoral::Parameter& parameter)
: Evoral::ParameterDescriptor()
, key((uint32_t)-1)
, datatype(Variant::NOTHING)
+ , type((AutomationType)parameter.type())
, unit(NONE)
, step(0)
, smallstep(0)
@@ -39,13 +43,9 @@ ParameterDescriptor::ParameterDescriptor(const Evoral::Parameter& parameter)
, max_unbound(0)
, enumeration(false)
{
- if (parameter.type() == GainAutomation) {
- unit = DB;
- }
-
switch((AutomationType)parameter.type()) {
case GainAutomation:
- upper = Amp::max_gain_coefficient;
+ upper = Config->get_max_gain();
normal = 1.0f;
break;
case PanAzimuthAutomation:
@@ -116,22 +116,33 @@ ParameterDescriptor::update_steps()
if (unit == ParameterDescriptor::MIDI_NOTE) {
step = smallstep = 1; // semitone
largestep = 12; // octave
- } else if (integer_step) {
+ } else if (type == GainAutomation) {
+ /* dB_coeff_step gives a step normalized for [0, max_gain]. This is
+ like "slider position", so we convert from "slider position" to gain
+ to have the correct unit here. */
+ largestep = slider_position_to_gain(dB_coeff_step(upper));
+ step = slider_position_to_gain(largestep / 10.0);
+ smallstep = step;
+ } else {
const float delta = upper - lower;
- smallstep = delta / 10000.0f;
- step = delta / 1000.0f;
- largestep = delta / 40.0f;
+ /* 30 happens to be the total number of steps for a fader with default
+ max gain of 2.0 (6 dB), so we use 30 here too for consistency. */
+ step = smallstep = (delta / 300.0f);
+ largestep = (delta / 30.0f);
- smallstep = std::max(1.0, rint(smallstep));
- step = std::max(1.0, rint(step));
- largestep = std::max(1.0, rint(largestep));
+ if (logarithmic) {
+ /* Compensate for internal_to_interface's pow so we get roughly the
+ desired number of steps. */
+ smallstep = pow(smallstep, 1.5f);
+ step = pow(step, 1.5f);
+ largestep = pow(largestep, 1.5f);
+ } else if (integer_step) {
+ smallstep = std::max(1.0, rint(smallstep));
+ step = std::max(1.0, rint(step));
+ largestep = std::max(1.0, rint(largestep));
+ }
}
- /* else: leave all others as default '0'
- * in that case the UI (eg. AutomationController::create)
- * uses internal_to_interface() to map the value
- * to an appropriate interface range
- */
}
} // namespace ARDOUR