X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Famp.cc;h=d7b901434069f3a221af9ae4c4a1d96b2cb1f6f1;hb=11ba1854b398c72e93cd42efeec6aa48a4e9a125;hp=880fe2575ef60351f923da6afa5ce2893aad6397;hpb=96cc1dbe80f0378ca010c1c5ac37913958193360;p=ardour.git diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc index 880fe2575e..d7b9014340 100644 --- a/libs/ardour/amp.cc +++ b/libs/ardour/amp.cc @@ -16,7 +16,6 @@ 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include #include @@ -26,11 +25,12 @@ #include "ardour/amp.h" #include "ardour/audio_buffer.h" #include "ardour/buffer_set.h" +#include "ardour/gain_control.h" #include "ardour/midi_buffer.h" #include "ardour/rc_configuration.h" #include "ardour/session.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace ARDOUR; using namespace PBD; @@ -38,28 +38,18 @@ using namespace PBD; // used for low-pass filter denormal protection #define GAIN_COEFF_TINY (1e-10) // -200dB -Amp::Amp (Session& s, std::string type) +Amp::Amp (Session& s, const std::string& name, boost::shared_ptr gc, bool control_midi_also) : Processor(s, "Amp") , _apply_gain(true) , _apply_gain_automation(false) , _current_gain(GAIN_COEFF_ZERO) , _current_automation_frame (INT64_MAX) + , _gain_control (gc) , _gain_automation_buffer(0) - , _type (type) - , _midi_amp (type != "trim") + , _midi_amp (control_midi_also) { - Evoral::Parameter p (_type == "trim" ? TrimAutomation : GainAutomation); - boost::shared_ptr gl (new AutomationList (p)); - _gain_control = boost::shared_ptr (new GainControl ((_type == "trim") ? X_("trimcontrol") : X_("gaincontrol"), s, this, p, gl)); - _gain_control->set_flags (Controllable::GainLike); - - add_control(_gain_control); -} - -std::string -Amp::display_name() const -{ - return _("Fader"); + set_display_name (name); + add_control (_gain_control); } bool @@ -79,8 +69,15 @@ Amp::configure_io (ChanCount in, ChanCount out) return Processor::configure_io (in, out); } +static void +scale_midi_velocity(Evoral::Event& ev, float factor) +{ + factor = std::max(factor, 0.0f); + ev.set_velocity(std::min(127L, lrintf(ev.velocity() * factor))); +} + void -Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool) +Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double /*speed*/, pframes_t nframes, bool) { if (!_active && !_pending_active) { return; @@ -97,10 +94,10 @@ Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, for (BufferSet::midi_iterator i = bufs.midi_begin(); i != bufs.midi_end(); ++i) { MidiBuffer& mb (*i); for (MidiBuffer::iterator m = mb.begin(); m != mb.end(); ++m) { - Evoral::MIDIEvent ev = *m; + Evoral::Event ev = *m; if (ev.is_note_on()) { assert(ev.time() >= 0 && ev.time() < nframes); - ev.scale_velocity (fabsf (gab[ev.time()])); + scale_midi_velocity (ev, fabsf (gab[ev.time()])); } } } @@ -127,7 +124,7 @@ Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, } else { /* manual (scalar) gain */ - gain_t const dg = _gain_control->user_double(); + gain_t const dg = _gain_control->get_value(); if (_current_gain != dg) { @@ -144,9 +141,9 @@ Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, MidiBuffer& mb (*i); for (MidiBuffer::iterator m = mb.begin(); m != mb.end(); ++m) { - Evoral::MIDIEvent ev = *m; + Evoral::Event ev = *m; if (ev.is_note_on()) { - ev.scale_velocity (fabsf (_current_gain)); + scale_midi_velocity (ev, fabsf (_current_gain)); } } } @@ -195,11 +192,11 @@ Amp::apply_gain (BufferSet& bufs, framecnt_t sample_rate, framecnt_t nframes, ga MidiBuffer& mb (*i); for (MidiBuffer::iterator m = mb.begin(); m != mb.end(); ++m) { - Evoral::MIDIEvent ev = *m; + Evoral::Event ev = *m; if (ev.is_note_on()) { const gain_t scale = delta * (ev.time()/(double) nframes); - ev.scale_velocity (fabsf (initial+scale)); + scale_midi_velocity (ev, fabsf (initial + scale)); } } } @@ -313,7 +310,7 @@ Amp::apply_simple_gain (BufferSet& bufs, framecnt_t nframes, gain_t target, bool MidiBuffer& mb (*i); for (MidiBuffer::iterator m = mb.begin(); m != mb.end(); ++m) { - Evoral::MIDIEvent ev = *m; + Evoral::Event ev = *m; if (ev.is_note_on()) { ev.set_velocity (0); } @@ -333,9 +330,9 @@ Amp::apply_simple_gain (BufferSet& bufs, framecnt_t nframes, gain_t target, bool MidiBuffer& mb (*i); for (MidiBuffer::iterator m = mb.begin(); m != mb.end(); ++m) { - Evoral::MIDIEvent ev = *m; + Evoral::Event ev = *m; if (ev.is_note_on()) { - ev.scale_velocity (fabsf (target)); + scale_midi_velocity(ev, fabsf (target)); } } } @@ -357,31 +354,12 @@ Amp::apply_simple_gain (AudioBuffer& buf, framecnt_t nframes, gain_t target) } } -void -Amp::inc_gain (gain_t factor, void *src) -{ - float desired_gain = _gain_control->user_double(); - - if (fabsf (desired_gain) < GAIN_COEFF_SMALL) { - // really?! what's the idea here? - set_gain (0.000001f + (0.000001f * factor), src); - } else { - set_gain (desired_gain + (desired_gain * factor), src); - } -} - -void -Amp::set_gain (gain_t val, void *) -{ - _gain_control->set_value (val); -} - XMLNode& Amp::state (bool full_state) { XMLNode& node (Processor::state (full_state)); - node.add_property("type", _type); - node.add_child_nocopy (_gain_control->get_state()); + node.set_property("type", _gain_control->parameter().type() == GainAutomation ? "amp" : "trim"); + node.add_child_nocopy (_gain_control->get_state()); return node; } @@ -389,61 +367,15 @@ Amp::state (bool full_state) int Amp::set_state (const XMLNode& node, int version) { - XMLNode* gain_node; + XMLNode* gain_node; Processor::set_state (node, version); - if ((gain_node = node.child (Controllable::xml_node_name.c_str())) != 0) { - _gain_control->set_state (*gain_node, version); - } - - return 0; -} - -void -Amp::GainControl::set_value (double val) -{ - AutomationControl::set_value (std::max (std::min (val, (double)_desc.upper), (double)_desc.lower)); - _amp->session().set_dirty (); -} - -double -Amp::GainControl::internal_to_interface (double v) const -{ - if (_desc.type == GainAutomation) { - return gain_to_slider_position (v); - } else { - return (accurate_coefficient_to_dB (v) - lower_db) / range_db; + if ((gain_node = node.child (Controllable::xml_node_name.c_str ())) != 0) { + _gain_control->set_state (*gain_node, version); } -} - -double -Amp::GainControl::interface_to_internal (double v) const -{ - if (_desc.type == GainAutomation) { - return slider_position_to_gain (v); - } else { - return dB_to_coefficient (lower_db + v * range_db); - } -} -double -Amp::GainControl::internal_to_user (double v) const -{ - return accurate_coefficient_to_dB (v); -} - -double -Amp::GainControl::user_to_internal (double u) const -{ - return dB_to_coefficient (u); -} - -std::string -Amp::GainControl::get_user_string () const -{ - char theBuf[32]; sprintf( theBuf, _("%3.1f dB"), accurate_coefficient_to_dB (get_value())); - return std::string(theBuf); + return 0; } /** Write gain automation for this cycle into the buffer previously passed in to @@ -460,9 +392,10 @@ Amp::setup_gain_automation (framepos_t start_frame, framepos_t end_frame, framec && _gain_control->automation_playback()) { assert (_gain_automation_buffer); - _apply_gain_automation = _gain_control->list()->curve().rt_safe_get_vector ( - start_frame, end_frame, _gain_automation_buffer, nframes); - if (start_frame != _current_automation_frame) { + + _apply_gain_automation = _gain_control->get_masters_curve ( start_frame, end_frame, _gain_automation_buffer, nframes); + + if (start_frame != _current_automation_frame && _session.bounce_processing ()) { _current_gain = _gain_automation_buffer[0]; } _current_automation_frame = end_frame; @@ -479,7 +412,7 @@ Amp::visible() const } std::string -Amp::value_as_string (boost::shared_ptr ac) const +Amp::value_as_string (boost::shared_ptr ac) const { if (ac == _gain_control) { char buffer[32];