diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index b74fdfc57b..0dedff5446 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -3189,7 +3189,7 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move) if (_real_section->position_lock_style() == AudioTime) { _real_section = map.add_meter (Meter (_marker->meter().divisions_per_bar(), _marker->meter().note_divisor()) - , _marker->position(), beat, bbt); + , map.frame_time (bbt), beat, bbt); } else { _real_section = map.add_meter (Meter (_marker->meter().divisions_per_bar(), _marker->meter().note_divisor()), beat, bbt); } diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index e1df0c08d3..88199a0d64 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -1270,7 +1270,7 @@ TempoMap::recompute_meters (Metrics& metrics) const double floor_beats = beats - fmod (beats, prev_m->divisions_per_bar()); b_bbt = make_pair (floor_beats + prev_m->beat(), BBT_Time ((floor_beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0)); const double true_pulse = prev_m->pulse() + (floor_beats / prev_m->note_divisor()); - const double pulse_off = true_pulse - (beats / prev_m->note_divisor()); + const double pulse_off = true_pulse - (beats / prev_m->note_divisor()) - prev_m->pulse(); pulse = true_pulse - pulse_off; } else { b_bbt = make_pair (0.0, BBT_Time (1, 1, 0)); @@ -1953,7 +1953,6 @@ void TempoMap::solve_map (Metrics& imaginary, MeterSection* section, const framepos_t& frame) { MeterSection* prev_m = 0; - MeterSection* section_prev = 0; // section previous to section if (!section->movable()) { /* lock the first tempo to our first meter */ @@ -1984,17 +1983,39 @@ TempoMap::solve_map (Metrics& imaginary, MeterSection* section, const framepos_t MeterSection* m; if ((m = dynamic_cast (*i)) != 0) { if (m == section){ - section_prev = prev_m; + /* + here we set the beat for this frame. + we set it 'incorrectly' to the next bar's first beat + and use the delat to find the meter's pulse. + */ + double new_pulse = 0.0; + pair b_bbt; + + if (section->movable()) { + const double beats = ((pulse_at_frame_locked (imaginary, frame) - prev_m->pulse()) * prev_m->note_divisor()); + const double floor_beats = beats - fmod (beats, prev_m->divisions_per_bar()); + b_bbt = make_pair (floor_beats + prev_m->beat(), BBT_Time ((floor_beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0)); + const double true_pulse = prev_m->pulse() + (floor_beats / prev_m->note_divisor()); + const double pulse_off = true_pulse - (beats / prev_m->note_divisor()) - prev_m->pulse(); + new_pulse = true_pulse - pulse_off; + } else { + b_bbt = make_pair (0.0, BBT_Time (1, 1, 0)); + } + + section->set_beat (b_bbt); + section->set_pulse (new_pulse); + prev_m = m; + continue; } if (prev_m) { - double pulse = 0.0; + double new_pulse = 0.0; if (m->position_lock_style() == MusicTime) { - pulse = prev_m->pulse() + ((m->bbt().bars - prev_m->bbt().bars) * prev_m->divisions_per_bar() / prev_m->note_divisor()); - m->set_frame (frame_at_pulse_locked (imaginary, pulse)); - if (pulse > section->pulse()) { + new_pulse = prev_m->pulse() + ((m->bbt().bars - prev_m->bbt().bars) * prev_m->divisions_per_bar() / prev_m->note_divisor()); + m->set_frame (frame_at_pulse_locked (imaginary, new_pulse)); + if (m->frame() > section->frame()) { /* moving 'section' will affect later meters' beat (but not bbt).*/ - pair new_beat (((pulse - prev_m->pulse()) * prev_m->note_divisor()) + prev_m->beat(), m->bbt()); + pair new_beat (((new_pulse - prev_m->pulse()) * prev_m->note_divisor()) + prev_m->beat(), m->bbt()); m->set_beat (new_beat); } } else { @@ -2005,42 +2026,22 @@ TempoMap::solve_map (Metrics& imaginary, MeterSection* section, const framepos_t b_bbt = make_pair (floor_beats + prev_m->beat() , BBT_Time ((floor_beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0)); const double true_pulse = prev_m->pulse() + (floor_beats / prev_m->note_divisor()); - const double pulse_off = true_pulse - (beats / prev_m->note_divisor()); - pulse = true_pulse - pulse_off; + const double pulse_off = true_pulse - (beats / prev_m->note_divisor()) - prev_m->pulse(); + new_pulse = true_pulse - pulse_off; } else { b_bbt = make_pair (0.0, BBT_Time (1, 1, 0)); - pulse = 0.0; + new_pulse = 0.0; } m->set_beat (b_bbt); } - m->set_pulse (pulse); + m->set_pulse (new_pulse); } prev_m = m; } } - if (section_prev || !section->movable()) { - /* - here we set the beat for this frame. - we set it 'incorrectly' to the next bar's first beat - and use the delat to find the meter's pulse. - */ - double pulse = 0.0; - pair b_bbt; - if (section->movable()) { - const double beats = ((pulse_at_frame_locked (imaginary, frame) - prev_m->pulse()) * prev_m->note_divisor()); - const double floor_beats = beats - fmod (beats, prev_m->divisions_per_bar()); - b_bbt = make_pair (floor_beats + prev_m->beat(), BBT_Time ((floor_beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0)); - const double true_pulse = prev_m->pulse() + (floor_beats / prev_m->note_divisor()); - const double pulse_off = true_pulse - (beats / prev_m->note_divisor()); - pulse = true_pulse - pulse_off; - } else { - b_bbt = make_pair (0.0, BBT_Time (1, 1, 0)); - } - section->set_beat (b_bbt); - section->set_pulse (pulse); - } - + MetricSectionFrameSorter fcmp; + imaginary.sort (fcmp); if (section->position_lock_style() == MusicTime) { /* we're setting the frame */ section->set_position_lock_style (AudioTime); @@ -2068,14 +2069,14 @@ TempoMap::solve_map (Metrics& imaginary, MeterSection* section, const double& pu continue; } if (prev_m) { - double pulse = 0.0; + double new_pulse = 0.0; if (m->position_lock_style() == MusicTime) { - pulse = prev_m->pulse() + ((m->bbt().bars - prev_m->bbt().bars) * prev_m->divisions_per_bar() / prev_m->note_divisor()); - m->set_frame (frame_at_pulse_locked (imaginary, pulse)); + new_pulse = prev_m->pulse() + ((m->bbt().bars - prev_m->bbt().bars) * prev_m->divisions_per_bar() / prev_m->note_divisor()); + m->set_frame (frame_at_pulse_locked (imaginary, new_pulse)); - if (pulse > section->pulse()) { + if (new_pulse > section->pulse()) { /* moving 'section' will affect later meters' beat (but not bbt).*/ - pair new_beat (((pulse - prev_m->pulse()) * prev_m->note_divisor()) + prev_m->beat(), m->bbt()); + pair new_beat (((new_pulse - prev_m->pulse()) * prev_m->note_divisor()) + prev_m->beat(), m->bbt()); m->set_beat (new_beat); } } else { @@ -2086,14 +2087,14 @@ TempoMap::solve_map (Metrics& imaginary, MeterSection* section, const double& pu b_bbt = make_pair (floor_beats + prev_m->beat() , BBT_Time ((floor_beats / prev_m->divisions_per_bar()) + prev_m->bbt().bars, 1, 0)); const double true_pulse = prev_m->pulse() + (floor_beats / prev_m->note_divisor()); - const double pulse_off = true_pulse - (beats / prev_m->note_divisor()); - pulse = true_pulse - pulse_off; + const double pulse_off = true_pulse - (beats / prev_m->note_divisor()) - prev_m->pulse(); + new_pulse = true_pulse - pulse_off; } else { b_bbt = make_pair (0.0, BBT_Time (1, 1, 0)); } m->set_beat (b_bbt); } - m->set_pulse (pulse); + m->set_pulse (new_pulse); } prev_m = m; }