diff options
author | Robin Gareus <robin@gareus.org> | 2016-12-07 19:47:04 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-12-07 19:47:04 +0100 |
commit | 295562dd52deae1ccf0594f574c44c95677abf27 (patch) | |
tree | 26516723c6f687fae7d8d0cbca9bc2ffc948cc40 /libs/ardour/midi_track.cc | |
parent | d7660957325bdebbb75f21c0d19b9f0aad6e7f37 (diff) |
Save/Restore MIDI Automation Controls (current CC, PGM)
Diffstat (limited to 'libs/ardour/midi_track.cc')
-rw-r--r-- | libs/ardour/midi_track.cc | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index c17bc916d9..c5433347a0 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -69,12 +69,13 @@ using namespace PBD; MidiTrack::MidiTrack (Session& sess, string name, TrackMode mode) : Track (sess, name, PresentationInfo::MidiTrack, mode, DataType::MIDI) - , _immediate_events(1024) // FIXME: size? + , _immediate_events(6096) // FIXME: size? , _step_edit_ring_buffer(64) // FIXME: size? , _note_mode(Sustained) , _step_editing (false) , _input_active (true) { + _session.SessionLoaded.connect_same_thread (*this, boost::bind (&MidiTrack::restore_controls, this)); } MidiTrack::~MidiTrack () @@ -266,6 +267,14 @@ MidiTrack::state(bool full_state) root.add_property ("step-editing", (_step_editing ? "yes" : "no")); root.add_property ("input-active", (_input_active ? "yes" : "no")); + for (Controls::const_iterator c = _controls.begin(); c != _controls.end(); ++c) { + if (boost::dynamic_pointer_cast<MidiTrack::MidiControl>(c->second)) { + boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c->second); + assert (ac); + root.add_child_nocopy (ac->get_state ()); + } + } + return root; } @@ -335,6 +344,18 @@ MidiTrack::set_state_part_two () } void +MidiTrack::restore_controls () +{ + // TODO order events (CC before PGM to set banks) + for (Controls::const_iterator c = _controls.begin(); c != _controls.end(); ++c) { + boost::shared_ptr<MidiTrack::MidiControl> mctrl = boost::dynamic_pointer_cast<MidiTrack::MidiControl>(c->second); + if (mctrl) { + mctrl->restore_value(); + } + } +} + +void MidiTrack::update_controls(const BufferSet& bufs) { const MidiBuffer& buf = bufs.get_midi(0); @@ -712,6 +733,12 @@ MidiTrack::set_parameter_automation_state (Evoral::Parameter param, AutoState st } void +MidiTrack::MidiControl::restore_value () +{ + actually_set_value (get_value(), Controllable::NoGroup); +} + +void MidiTrack::MidiControl::actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override) { const Evoral::Parameter ¶meter = _list ? _list->parameter() : Control::parameter(); |