Fix both note length setting and display in EditNoteDialog
authornick_m <mainsbridge@gmail.com>
Fri, 16 Jun 2017 17:38:18 +0000 (03:38 +1000)
committernick_m <mainsbridge@gmail.com>
Fri, 21 Jul 2017 16:15:20 +0000 (02:15 +1000)
Length clock uses region relative time converter with offset to display
correct value over tempo changes.
Fix note length setting by using source time converter on a sample duration
based on a session-relative offset.

gtk2_ardour/edit_note_dialog.cc

index 08829d093e60228dfb92c3e97f95ba1c4888ba91..997713ae2d24401b525e9c3bdb341bbd14d3e98e 100644 (file)
@@ -104,7 +104,10 @@ EditNoteDialog::EditNoteDialog (MidiRegionView* rv, set<NoteBase*> n)
 
        _length_clock.set_session (_region_view->get_time_axis_view().session ());
        _length_clock.set_mode (AudioClock::BBT);
-       _length_clock.set (_region_view->region_relative_time_converter().to ((*_events.begin())->note()->length ()), true);
+       _length_clock.set (
+               _region_view->region_relative_time_converter().to ((*_events.begin())->note()->end_time ()) + _region_view->region()->position(),
+               true,
+               _region_view->region_relative_time_converter().to ((*_events.begin())->note()->time ()) + _region_view->region()->position());
 
        /* Set up `set all notes...' buttons' sensitivity */
 
@@ -194,8 +197,8 @@ EditNoteDialog::done (int r)
                }
        }
 
-       Evoral::Beats const t = _region_view->source_relative_time_converter().from
-               (_time_clock.current_time() - (_region_view->region()->position() - _region_view->region()->start()));
+       framecnt_t const region_samples = _time_clock.current_time() - (_region_view->region()->position() - _region_view->region()->start());
+       Evoral::Beats const t = _region_view->source_relative_time_converter().from (region_samples);
 
        if (!_time_all.get_sensitive() || _time_all.get_active ()) {
                for (set<NoteBase*>::iterator i = _events.begin(); i != _events.end(); ++i) {
@@ -206,10 +209,10 @@ EditNoteDialog::done (int r)
                }
        }
 
-       Evoral::Beats const d = _region_view->region_relative_time_converter().from (_length_clock.current_duration ());
-
        if (!_length_all.get_sensitive() || _length_all.get_active ()) {
                for (set<NoteBase*>::iterator i = _events.begin(); i != _events.end(); ++i) {
+                       framepos_t const note_end_sample = region_samples + _length_clock.current_duration (_time_clock.current_time());
+                       Evoral::Beats const d = _region_view->source_relative_time_converter().from (note_end_sample) - (*i)->note()->time();
                        if (d != (*i)->note()->length()) {
                                _region_view->change_note_length (*i, d);
                                had_change = true;