X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmidi_region.cc;h=dc7293f7b5c1c3cca72e1b2a8070f9f105655a44;hb=5694d877aaf4e69c90f76aa592e110289cbe81c6;hp=9826fa56414148a1b44c60ad1cafa3b2647e2713;hpb=751662241a1ad8118c7fc7600f6e0412439bfd3c;p=ardour.git diff --git a/libs/ardour/midi_region.cc b/libs/ardour/midi_region.cc index 9826fa5641..dc7293f7b5 100644 --- a/libs/ardour/midi_region.cc +++ b/libs/ardour/midi_region.cc @@ -44,6 +44,7 @@ #include "ardour/source_factory.h" #include "ardour/tempo.h" #include "ardour/types.h" +#include "ardour/evoral_types_convert.h" #include "pbd/i18n.h" #include @@ -80,6 +81,7 @@ MidiRegion::MidiRegion (const SourceList& srcs) : Region (srcs) , _start_beats (Properties::start_beats, 0.0) , _length_beats (Properties::length_beats, midi_source(0)->length_beats().to_double()) + , _ignore_shift (false) { register_properties (); midi_source(0)->ModelChanged.connect_same_thread (_source_connection, boost::bind (&MidiRegion::model_changed, this)); @@ -92,6 +94,7 @@ MidiRegion::MidiRegion (boost::shared_ptr other) : Region (other) , _start_beats (Properties::start_beats, other->_start_beats) , _length_beats (Properties::length_beats, other->_length_beats) + , _ignore_shift (false) { //update_length_beats (); register_properties (); @@ -106,6 +109,7 @@ MidiRegion::MidiRegion (boost::shared_ptr other, MusicFrame of : Region (other, offset) , _start_beats (Properties::start_beats, other->_start_beats) , _length_beats (Properties::length_beats, other->_length_beats) + , _ignore_shift (false) { register_properties (); @@ -585,6 +589,27 @@ MidiRegion::model_changed () midi_source()->AutomationStateChanged.connect_same_thread ( _model_connection, boost::bind (&MidiRegion::model_automation_state_changed, this, _1) ); + + model()->ContentsShifted.connect_same_thread (_model_shift_connection, boost::bind (&MidiRegion::model_shifted, this, _1)); +} +void +MidiRegion::model_shifted (double qn_distance) +{ + if (!model()) { + return; + } + + if (!_ignore_shift) { + PropertyChange what_changed; + _start_beats += qn_distance; + framepos_t const new_start = _session.tempo_map().frames_between_quarter_notes (_quarter_note - _start_beats, _quarter_note); + _start = new_start; + what_changed.add (Properties::start); + what_changed.add (Properties::start_beats); + send_change (what_changed); + } else { + _ignore_shift = false; + } } void @@ -620,7 +645,10 @@ MidiRegion::fix_negative_start () { BeatsFramesConverter c (_session.tempo_map(), _position); - model()->insert_silence_at_start (c.from (-_start)); + _ignore_shift = true; + + model()->insert_silence_at_start (Evoral::Beats (- _start_beats)); + _start = 0; _start_beats = 0.0; } @@ -629,6 +657,7 @@ void MidiRegion::set_start_internal (framecnt_t s, const int32_t sub_num) { Region::set_start_internal (s, sub_num); + set_start_beats_from_start_frames (); }