diff options
author | nick_m <mainsbridge@gmail.com> | 2016-06-18 23:24:05 +1000 |
---|---|---|
committer | nick_m <mainsbridge@gmail.com> | 2016-07-10 02:18:36 +1000 |
commit | 0e63fa65b5bf96040e752386083f80403042a6e6 (patch) | |
tree | 3a250d21abe924e613be947b739af396cb6facca | |
parent | 93c24e4433d69fe1de28d4d2ed2045aa7cb3596b (diff) |
Remove frame conversion for MidiRegionView::note_in_region_range(), speed up tempo dilation
-rw-r--r-- | gtk2_ardour/midi_region_view.cc | 9 | ||||
-rw-r--r-- | libs/ardour/ardour/midi_region.h | 1 | ||||
-rw-r--r-- | libs/ardour/midi_region.cc | 17 |
3 files changed, 17 insertions, 10 deletions
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 5c460cdf48..fea3857a90 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -1670,12 +1670,9 @@ MidiRegionView::start_playing_midi_chord (vector<boost::shared_ptr<NoteType> > n bool MidiRegionView::note_in_region_range (const boost::shared_ptr<NoteType> note, bool& visible) const { - /* This is imprecise due to all the conversion conversion involved, so only - hide notes if they seem to start more than one tick before the start. */ - const framecnt_t tick_frames = Evoral::Beats::tick().to_ticks(trackview.session()->frame_rate()); - const framepos_t note_start_frames = source_beats_to_region_frames (note->time()); - const bool outside = ((note_start_frames <= -tick_frames) || - (note_start_frames >= _region->length())); + const boost::shared_ptr<ARDOUR::MidiRegion> midi_reg = midi_region(); + const bool outside = (note->time() < midi_reg->start_beats() || + note->time() > midi_reg->start_beats() + midi_reg->length_beats()); visible = (note->note() >= midi_stream_view()->lowest_note()) && (note->note() <= midi_stream_view()->highest_note()); diff --git a/libs/ardour/ardour/midi_region.h b/libs/ardour/ardour/midi_region.h index 9de79a9513..21d6c13ade 100644 --- a/libs/ardour/ardour/midi_region.h +++ b/libs/ardour/ardour/midi_region.h @@ -102,6 +102,7 @@ class LIBARDOUR_API MidiRegion : public Region void fix_negative_start (); Evoral::Beats start_beats () {return _start_beats.val(); } + Evoral::Beats length_beats () {return _length_beats.val(); } protected: virtual bool can_trim_start_before_source_start () const { diff --git a/libs/ardour/midi_region.cc b/libs/ardour/midi_region.cc index 035c17c9de..ce473c162d 100644 --- a/libs/ardour/midi_region.cc +++ b/libs/ardour/midi_region.cc @@ -197,16 +197,25 @@ MidiRegion::set_length_internal (framecnt_t len, const int32_t& sub_num) void MidiRegion::update_after_tempo_map_change (bool /* send */) { + const framepos_t old_pos = _position; + const framepos_t old_length = _length; + const framepos_t old_start = _start; + Region::update_after_tempo_map_change (false); /* _start has now been updated. */ _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); + if (old_start != _start) { + s_and_l.add (Properties::start); + } + if (old_length != _length) { + s_and_l.add (Properties::length); + } + if (old_pos != _position) { + s_and_l.add (Properties::position); + } send_change (s_and_l); } |