From 29e0b2e5bfa0b1d107ee5644bddea06aa9cdaf8a Mon Sep 17 00:00:00 2001 From: nick_m Date: Mon, 18 Apr 2016 07:00:19 +1000 Subject: [PATCH] Tempo ramps - make moving music-locked meters less flakey, remove some code. --- gtk2_ardour/editor_drag.cc | 18 +++++++++++------- libs/ardour/ardour/tempo.h | 2 +- libs/ardour/tempo.cc | 36 ++---------------------------------- 3 files changed, 14 insertions(+), 42 deletions(-) diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index f62ba1d2eb..63fff4e463 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -3174,10 +3174,7 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move) } else { _editor->begin_reversible_command (_("copy meter mark")); - Timecode::BBT_Time bbt; - map.bbt_time (adjusted_current_frame (event, false), bbt); - /* round bbt to bars */ - map.round_bbt (bbt, -1); + Timecode::BBT_Time bbt = _real_section->bbt(); /* we can't add a meter where one currently exists */ if (_real_section->frame() < adjusted_current_frame (event, false)) { @@ -3200,11 +3197,18 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move) if (_marker->meter().position_lock_style() == MusicTime) { TempoMap& map (_editor->session()->tempo_map()); Timecode::BBT_Time bbt; - map.bbt_time (adjusted_current_frame (event, false), bbt); + map.bbt_time (pf, bbt); /* round bbt to bars */ map.round_bbt (bbt, -1); - const double beat = map.bbt_to_beats (bbt); - _editor->session()->tempo_map().gui_move_meter (_real_section, beat); + + if (bbt.bars > _real_section->bbt().bars) { + const double pulse = _real_section->pulse() + (_real_section->note_divisor() / _real_section->divisions_per_bar()); + _editor->session()->tempo_map().gui_move_meter (_real_section, pulse); + } else if (bbt.bars < _real_section->bbt().bars) { + const MeterSection& prev_m = map.meter_section_at (pf); + const double pulse = _real_section->pulse() - (prev_m.note_divisor() / prev_m.divisions_per_bar()); + _editor->session()->tempo_map().gui_move_meter (_real_section, pulse); + } } else { _editor->session()->tempo_map().gui_move_meter (_real_section, pf); } diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h index 68e7481d1f..c8c6af5247 100644 --- a/libs/ardour/ardour/tempo.h +++ b/libs/ardour/ardour/tempo.h @@ -391,7 +391,7 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible void gui_move_tempo_frame (TempoSection*, const framepos_t& frame); void gui_move_tempo_beat (TempoSection*, const double& frame); void gui_move_meter (MeterSection*, const framepos_t& frame); - void gui_move_meter (MeterSection*, const double& beat); + void gui_move_meter (MeterSection*, const double& pulse); bool gui_change_tempo (TempoSection*, const Tempo& bpm); bool can_solve_bbt (TempoSection* section, const Timecode::BBT_Time& bbt); diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index 46761153b7..b37d5efb93 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -1932,23 +1932,7 @@ TempoMap::solve_map (Metrics& imaginary, TempoSection* section, const framepos_t recompute_meters (imaginary); return true; } -#if (0) - MetricSectionSorter cmp; - imaginary.sort (cmp); - if (section->position_lock_style() == MusicTime) { - /* we're setting the frame */ - section->set_position_lock_style (AudioTime); - recompute_tempos (imaginary); - section->set_position_lock_style (MusicTime); - } else { - recompute_tempos (imaginary); - } - if (check_solved (imaginary, true)) { - recompute_meters (imaginary); - return true; - } -#endif //dump (imaginary, std::cerr); return false; @@ -2023,23 +2007,7 @@ TempoMap::solve_map (Metrics& imaginary, TempoSection* section, const double& pu recompute_meters (imaginary); return true; } -#if (0) - MetricSectionFrameSorter fcmp; - imaginary.sort (fcmp); - if (section->position_lock_style() == AudioTime) { - /* we're setting the pulse */ - section->set_position_lock_style (MusicTime); - recompute_tempos (imaginary); - section->set_position_lock_style (AudioTime); - } else { - recompute_tempos (imaginary); - } - if (check_solved (imaginary, false)) { - recompute_meters (imaginary); - return true; - } -#endif //dump (imaginary, std::cerr); return false; @@ -2347,11 +2315,11 @@ TempoMap::gui_move_meter (MeterSection* ms, const framepos_t& frame) } void -TempoMap::gui_move_meter (MeterSection* ms, const double& beat) +TempoMap::gui_move_meter (MeterSection* ms, const double& pulse) { { Glib::Threads::RWLock::WriterLock lm (lock); - solve_map (_metrics, ms, pulse_at_beat_locked (_metrics, beat)); + solve_map (_metrics, ms, pulse); } MetricPositionChanged (); // Emit Signal