diff options
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/amp.cc | 4 | ||||
-rw-r--r-- | libs/ardour/ardour/dB.h | 2 | ||||
-rw-r--r-- | libs/ardour/ardour/rc_configuration_vars.h | 1 | ||||
-rw-r--r-- | libs/ardour/ardour/utils.h | 59 | ||||
-rw-r--r-- | libs/ardour/globals.cc | 1 | ||||
-rw-r--r-- | libs/ardour/monitor_processor.cc | 24 | ||||
-rw-r--r-- | libs/ardour/region.cc | 1 | ||||
-rw-r--r-- | libs/ardour/session.cc | 2 | ||||
-rw-r--r-- | libs/ardour/utils.cc | 12 |
9 files changed, 87 insertions, 19 deletions
diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc index 200a29861e..bbbaa9b331 100644 --- a/libs/ardour/amp.cc +++ b/libs/ardour/amp.cc @@ -412,8 +412,8 @@ void Amp::GainControl::set_value (double val) { // max gain at about +6dB (10.0 ^ ( 6 dB * 0.05)) - if (val > 1.99526231f) { - val = 1.99526231f; + if (val > 1.99526231) { + val = 1.99526231; } _amp->set_gain (val, this); diff --git a/libs/ardour/ardour/dB.h b/libs/ardour/ardour/dB.h index e5865aabd8..d2675fb3c9 100644 --- a/libs/ardour/ardour/dB.h +++ b/libs/ardour/ardour/dB.h @@ -34,6 +34,6 @@ static inline float accurate_coefficient_to_dB (float coeff) { return 20.0f * log10 (coeff); } -static const double zero_db_as_fraction = 0.781787; +extern double zero_db_as_fraction; #endif /* __ardour_dB_h__ */ diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h index ffe85e8fcb..6fb67595e2 100644 --- a/libs/ardour/ardour/rc_configuration_vars.h +++ b/libs/ardour/ardour/rc_configuration_vars.h @@ -164,6 +164,7 @@ CONFIG_VARIABLE (WaveformShape, waveform_shape, "waveform-shape", Traditional) CONFIG_VARIABLE (bool, allow_special_bus_removal, "allow-special-bus-removal", false) CONFIG_VARIABLE (int32_t, processor_usage, "processor-usage", -1) CONFIG_VARIABLE (bool, color_regions_using_track_color, "color-regions-using-track-color", false) +CONFIG_VARIABLE (gain_t, max_gain, "max-gain", 2.0) /* +6.0dB */ /* denormal management */ diff --git a/libs/ardour/ardour/utils.h b/libs/ardour/ardour/utils.h index dac4086cba..17fa9070ff 100644 --- a/libs/ardour/ardour/utils.h +++ b/libs/ardour/ardour/utils.h @@ -36,6 +36,7 @@ bool string_is_affirmative (const std::string&); #include "ardour/ardour.h" #include "ardour/data_type.h" +#include "ardour/dB.h" class XMLNode; @@ -70,22 +71,78 @@ ARDOUR::SyncSource string_to_sync_source (std::string str); const char* edit_mode_to_string (ARDOUR::EditMode); ARDOUR::EditMode string_to_edit_mode (std::string); +#undef OLD_GAIN_MATH +#define OLD_GAIN_MATH static inline double gain_to_slider_position (ARDOUR::gain_t g) { if (g == 0) return 0; - return pow((6.0*log(g)/log(2.0)+192.0)/198.0, 8.0); +#ifndef OLD_GAIN_MATH + /* Power Law With Exponential Cutoff 2D, fit to data from TC Spectra + console (image of fader gradations + + y = C * x(-T) * exp(-x/K) + + C = 8.2857630370864188E-01 + T = -5.1526743785019269E-01 + K = 7.8990885960495589E+00 + + */ + + return 8.2857630370864188E-01 * pow(g,5.1526743785019269E-01) * exp (-g/7.8990885960495589E+00); +#else + return pow((6.0*log(g)/log(2.0)+192.0)/198.0, 8.0); +#endif } static inline ARDOUR::gain_t slider_position_to_gain (double pos) { + if (pos == 0.0) { + return 0.0; + } + +#ifndef OLD_GAIN_MATH + /* 5th order polynomial function fit to data from a TC Spectra console + fader (image of fader gradations). + + y = a + bx1 + cx2 + dx3 + fx4 + gx5 + + a = -1.1945480381045521E-02 + b = 1.5809476525537265E+00 + c = -1.5850710838966151E+01 + d = 6.1643128605961991E+01 + f = -8.5525246160607693E+01 + g = 4.1312725896188283E+01 + + */ + + double p = pos; + double g = -1.1945480381045521E-02; + + g += 1.5809476525537265E+00 * pos; + pos *= p; + g += -1.5850710838966151E+01 * pos; + pos *= p; + g += 6.1643128605961991E+01 * pos; + pos *= p; + g += -8.5525246160607693E+01 * pos; + pos *= p; + g += 4.1312725896188283E+01 * pos; + + return g; +#else /* XXX Marcus writes: this doesn't seem right to me. but i don't have a better answer ... */ if (pos == 0.0) return 0; return pow (2.0,(sqrt(sqrt(sqrt(pos)))*198.0-192.0)/6.0); +#endif } +#undef OLD_GAIN_MATH + +double gain_to_slider_position_with_max (double g, double max_gain = 2.0); +double slider_position_to_gain_with_max (double g, double max_gain = 2.0); /* I don't really like hard-coding these falloff rates here * Probably should use a map of some kind that could be configured diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc index 7238a1f0e6..6e6dd70856 100644 --- a/libs/ardour/globals.cc +++ b/libs/ardour/globals.cc @@ -65,6 +65,7 @@ #include "ardour/audiosource.h" #include "ardour/buffer_manager.h" #include "ardour/control_protocol_manager.h" +#include "ardour/dB.h" #include "ardour/debug.h" #include "ardour/filesystem_paths.h" #include "ardour/midi_region.h" diff --git a/libs/ardour/monitor_processor.cc b/libs/ardour/monitor_processor.cc index 1125dedc64..835bfde70f 100644 --- a/libs/ardour/monitor_processor.cc +++ b/libs/ardour/monitor_processor.cc @@ -1,9 +1,9 @@ #include "pbd/convert.h" #include "pbd/error.h" +#include "pbd/locale_guard.h" #include "pbd/xml++.h" #include "ardour/amp.h" -#include "ardour/dB.h" #include "ardour/debug.h" #include "ardour/audio_buffer.h" #include "ardour/monitor_processor.h" @@ -34,10 +34,12 @@ MonitorProcessor::MonitorProcessor (Session& s) , _dim_all_ptr (new MPControl<bool> (false, _("monitor dim"), Controllable::Toggle)) , _cut_all_ptr (new MPControl<bool> (false, _("monitor cut"), Controllable::Toggle)) , _mono_ptr (new MPControl<bool> (false, _("monitor mono"), Controllable::Toggle)) - , _dim_level_ptr (new MPControl<volatile gain_t> /* units in dB */ - (-12.0, _("monitor dim level"), Controllable::Flag (0), -20.0f, 0.0f)) - , _solo_boost_level_ptr (new MPControl<volatile gain_t> /* units in dB */ - (0.0, _("monitor solo boost level"), Controllable::Flag (0), 0.0, 20.0)) + , _dim_level_ptr (new MPControl<volatile gain_t> + /* default is -12dB, range is -20dB to 0dB */ + (0.251188635826, _("monitor dim level"), Controllable::Flag (0), 0.100000001490, 1.0)) + , _solo_boost_level_ptr (new MPControl<volatile gain_t> + /* default is 0dB, range is 0dB to +20dB */ + (1.0, _("monitor solo boost level"), Controllable::Flag (0), 1.0, 10.0)) , _dim_all_control (_dim_all_ptr) , _cut_all_control (_cut_all_ptr) @@ -202,6 +204,7 @@ MonitorProcessor::set_state (const XMLNode& node, int version) XMLNode& MonitorProcessor::state (bool full) { + LocaleGuard lg (X_("POSIX")); XMLNode& node (Processor::state (full)); char buf[64]; @@ -251,12 +254,11 @@ MonitorProcessor::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t / gain_t target_gain; gain_t dim_level_this_time = _dim_level; gain_t global_cut = (_cut_all ? 0.0f : 1.0f); - gain_t global_dim = (_dim_all ? dim_level_this_time : 1.0f); + gain_t global_dim = (_dim_all ? dim_level_this_time : 1.0); gain_t solo_boost; if (_session.listening() || _session.soloing()) { - /* solo boost controller is in dB */ - solo_boost = dB_to_coefficient (_solo_boost_level); + solo_boost = _solo_boost_level; } else { solo_boost = 1.0; } @@ -266,11 +268,7 @@ MonitorProcessor::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t / /* don't double-scale by both track dim and global dim coefficients */ gain_t dim_level = (global_dim == 1.0 ? (_channels[chn]->dim ? dim_level_this_time : 1.0) : 1.0); - - /* dim level is in dB */ - - dim_level = dB_to_coefficient (dim_level); - + if (_channels[chn]->soloed) { target_gain = _channels[chn]->polarity * _channels[chn]->cut * dim_level * global_cut * global_dim * solo_boost; } else { diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc index 30a0b6f24a..8a95f22f8d 100644 --- a/libs/ardour/region.cc +++ b/libs/ardour/region.cc @@ -1249,7 +1249,6 @@ int Region::_set_state (const XMLNode& node, int /*version*/, PropertyChange& what_changed, bool send) { const XMLProperty* prop; - const XMLNodeList& nlist = node.children(); Stateful::save_extra_xml (node); diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 923fd6164f..3e3d391a7a 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -1188,7 +1188,7 @@ Session::set_block_size (pframes_t nframes) ::process(). It is therefore fine to do things that block here. */ - + { current_block_size = nframes; diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc index 0e1b06b1a7..4175322bb6 100644 --- a/libs/ardour/utils.cc +++ b/libs/ardour/utils.cc @@ -672,6 +672,18 @@ how_many_dsp_threads () return num_threads; } +double gain_to_slider_position_with_max (double g, double max_gain) +{ + /* max gain is ignored for now */ + return gain_to_slider_position (g); +} + +double slider_position_to_gain_with_max (double g, double max_gain) +{ + /* max gain is ignored for now */ + return slider_position_to_gain (g); +} + extern "C" { void c_stacktrace() { stacktrace (cerr); } } |