X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmidi_region.cc;h=035c17c9de3e90f42a036a57a5ed9614e38e39c9;hb=93c24e4433d69fe1de28d4d2ed2045aa7cb3596b;hp=81bfc2aa2345914cb982058b0c1a7e687cbeaea1;hpb=a1be0d0fe102d39a75963632d73171a9d3ec6634;p=ardour.git diff --git a/libs/ardour/midi_region.cc b/libs/ardour/midi_region.cc index 81bfc2aa23..035c17c9de 100644 --- a/libs/ardour/midi_region.cc +++ b/libs/ardour/midi_region.cc @@ -102,15 +102,13 @@ MidiRegion::MidiRegion (boost::shared_ptr other) } /** Create a new MidiRegion that is part of an existing one */ -MidiRegion::MidiRegion (boost::shared_ptr other, frameoffset_t offset) - : Region (other, offset) +MidiRegion::MidiRegion (boost::shared_ptr other, frameoffset_t offset, const int32_t& sub_num) + : Region (other, offset, sub_num) , _start_beats (Properties::start_beats, Evoral::Beats()) , _length_beats (Properties::length_beats, other->_length_beats) { - BeatsFramesConverter bfc (_session.tempo_map(), other->_position); - Evoral::Beats const offset_beats = bfc.from (offset); - - _start_beats = other->_start_beats.val() + offset_beats; + _start_beats = Evoral::Beats (_session.tempo_map().exact_beat_at_frame (other->_position + offset - other->_start, sub_num) - other->beat()); + update_length_beats (sub_num); register_properties (); assert(_name.val().find("/") == string::npos); @@ -164,7 +162,10 @@ MidiRegion::clone (boost::shared_ptr newsrc) const plist.add (Properties::length_beats, _length_beats); plist.add (Properties::layer, 0); - return boost::dynamic_pointer_cast (RegionFactory::create (newsrc, plist, true)); + boost::shared_ptr ret (boost::dynamic_pointer_cast (RegionFactory::create (newsrc, plist, true))); + ret->set_beat (beat()); + + return ret; } void @@ -173,7 +174,8 @@ MidiRegion::post_set (const PropertyChange& pc) Region::post_set (pc); if (pc.contains (Properties::length) && !pc.contains (Properties::length_beats)) { - update_length_beats (); + /* update non-musically */ + update_length_beats (0); } else if (pc.contains (Properties::start) && !pc.contains (Properties::start_beats)) { set_start_beats_from_start_frames (); } @@ -186,10 +188,10 @@ MidiRegion::set_start_beats_from_start_frames () } void -MidiRegion::set_length_internal (framecnt_t len) +MidiRegion::set_length_internal (framecnt_t len, const int32_t& sub_num) { - Region::set_length_internal (len); - update_length_beats (); + Region::set_length_internal (len, sub_num); + update_length_beats (sub_num); } void @@ -198,26 +200,27 @@ MidiRegion::update_after_tempo_map_change (bool /* send */) Region::update_after_tempo_map_change (false); /* _start has now been updated. */ - _length = _session.tempo_map().framepos_plus_beats (_position, _length_beats) - _position; + _length = _session.tempo_map().frame_at_beat (beat() + _length_beats.val().to_double()) - _position; PropertyChange s_and_l; s_and_l.add (Properties::start); s_and_l.add (Properties::length); + s_and_l.add (Properties::length_beats); s_and_l.add (Properties::position); send_change (s_and_l); } void -MidiRegion::update_length_beats () +MidiRegion::update_length_beats (const int32_t& sub_num) { - _length_beats = Evoral::Beats (_session.tempo_map().beat_at_frame (_position + _length) - beat()); + _length_beats = Evoral::Beats (_session.tempo_map().exact_beat_at_frame (_position + _length, sub_num) - beat()); } void -MidiRegion::set_position_internal (framepos_t pos, bool allow_bbt_recompute) +MidiRegion::set_position_internal (framepos_t pos, bool allow_bbt_recompute, const int32_t& sub_num) { - Region::set_position_internal (pos, allow_bbt_recompute); + Region::set_position_internal (pos, allow_bbt_recompute, sub_num); /* set _start to new position in tempo map */ _start = _position - _session.tempo_map().frame_at_beat (beat() - _start_beats.val().to_double()); @@ -225,7 +228,7 @@ MidiRegion::set_position_internal (framepos_t pos, bool allow_bbt_recompute) /* leave _length_beats alone, and change _length to reflect the state of things at the new position (tempo map may dictate a different number of frames). */ - Region::set_length_internal (_session.tempo_map().frame_at_beat (beat() + _length_beats.val().to_double()) - _position); + Region::set_length_internal (_session.tempo_map().frame_at_beat (beat() + _length_beats.val().to_double()) - _position, sub_num); } framecnt_t @@ -328,7 +331,10 @@ MidiRegion::set_state (const XMLNode& node, int version) int ret = Region::set_state (node, version); if (ret == 0) { - update_length_beats (); + /* set length beats to the frame (non-musical) */ + if (position_lock_style() == AudioTime) { + update_length_beats (0); + } } return ret; @@ -458,14 +464,17 @@ MidiRegion::fix_negative_start () } void -MidiRegion::set_start_internal (framecnt_t s) +MidiRegion::set_start_internal (framecnt_t s, const int32_t& sub_num) { - Region::set_start_internal (s); - set_start_beats_from_start_frames (); + Region::set_start_internal (s, sub_num); + + if (position_lock_style() == AudioTime) { + set_start_beats_from_start_frames (); + } } void -MidiRegion::trim_to_internal (framepos_t position, framecnt_t length) +MidiRegion::trim_to_internal (framepos_t position, framecnt_t length, const int32_t& sub_num) { framepos_t new_start; @@ -476,7 +485,7 @@ MidiRegion::trim_to_internal (framepos_t position, framecnt_t length) PropertyChange what_changed; /* beat has not been set by set_position_internal */ - const double beat_delta = _session.tempo_map().beat_at_frame (position) - beat(); + const double beat_delta = _session.tempo_map().exact_beat_at_frame (position, sub_num) - beat(); /* Set position before length, otherwise for MIDI regions this bad thing happens: * 1. we call set_length_internal; length in beats is computed using the region's current @@ -487,11 +496,11 @@ MidiRegion::trim_to_internal (framepos_t position, framecnt_t length) */ if (_position != position) { - set_position_internal (position, true); + set_position_internal (position, true, sub_num); what_changed.add (Properties::position); } - const double new_beat = _session.tempo_map().beat_at_frame (position); + const double new_beat = _session.tempo_map().exact_beat_at_frame (position, sub_num); const double new_start_beat = _start_beats.val().to_double() + beat_delta; new_start = _position - _session.tempo_map().frame_at_beat (new_beat - new_start_beat); @@ -504,15 +513,14 @@ MidiRegion::trim_to_internal (framepos_t position, framecnt_t length) _start_beats = Evoral::Beats (new_start_beat); what_changed.add (Properties::start_beats); - set_start_internal (new_start); + set_start_internal (new_start, sub_num); what_changed.add (Properties::start); } - - if (_length != length) { - set_length_internal (length); + set_length_internal (length, sub_num); what_changed.add (Properties::length); + what_changed.add (Properties::length_beats); } set_whole_file (false);