diff options
-rw-r--r-- | gtk2_ardour/editor.cc | 12 | ||||
-rw-r--r-- | gtk2_ardour/editor.h | 4 | ||||
-rw-r--r-- | gtk2_ardour/editor_rulers.cc | 23 | ||||
-rw-r--r-- | gtk2_ardour/editor_tempodisplay.cc | 55 | ||||
-rw-r--r-- | gtk2_ardour/tempo_lines.cc | 17 | ||||
-rw-r--r-- | libs/ardour/ardour/tempo.h | 2 | ||||
-rw-r--r-- | libs/ardour/tempo.cc | 34 |
7 files changed, 104 insertions, 43 deletions
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index f448f9ac2f..446965588d 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -2239,10 +2239,8 @@ Editor::set_snap_to (SnapType st) case SnapToBeatDiv4: case SnapToBeatDiv3: case SnapToBeatDiv2: { - std::vector<TempoMap::BBTPoint> grid; - compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); - compute_bbt_ruler_scale (grid, leftmost_frame, leftmost_frame + current_page_samples()); - update_tempo_based_rulers (grid); + compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_samples()); + update_tempo_based_rulers (); break; } @@ -4614,10 +4612,8 @@ Editor::visual_changer (const VisualChange& vc) compute_fixed_ruler_scale (); - std::vector<TempoMap::BBTPoint> grid; - compute_current_bbt_points (grid, vc.time_origin, pending_visual_change.time_origin + current_page_samples()); - compute_bbt_ruler_scale (grid, vc.time_origin, pending_visual_change.time_origin + current_page_samples()); - update_tempo_based_rulers (grid); + compute_bbt_ruler_scale (vc.time_origin, pending_visual_change.time_origin + current_page_samples()); + update_tempo_based_rulers (); update_video_timeline(); } diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 15e4c7c0be..2c744fcf9f 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -890,7 +890,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void update_just_timecode (); void compute_fixed_ruler_scale (); //calculates the RulerScale of the fixed rulers void update_fixed_rulers (); - void update_tempo_based_rulers (std::vector<ARDOUR::TempoMap::BBTPoint>& grid); + void update_tempo_based_rulers (); void popup_ruler_menu (framepos_t where = 0, ItemType type = RegionItem); void update_ruler_visibility (); void set_ruler_visible (RulerType, bool); @@ -953,7 +953,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD gint bbt_nmarks; uint32_t bbt_bar_helper_on; uint32_t bbt_accent_modulo; - void compute_bbt_ruler_scale (std::vector<ARDOUR::TempoMap::BBTPoint>& grid, framepos_t lower, framepos_t upper); + void compute_bbt_ruler_scale (framepos_t lower, framepos_t upper); ArdourCanvas::Ruler* timecode_ruler; ArdourCanvas::Ruler* bbt_ruler; diff --git a/gtk2_ardour/editor_rulers.cc b/gtk2_ardour/editor_rulers.cc index 6c9e45abc8..2f12604872 100644 --- a/gtk2_ardour/editor_rulers.cc +++ b/gtk2_ardour/editor_rulers.cc @@ -710,14 +710,12 @@ Editor::update_fixed_rulers () } void -Editor::update_tempo_based_rulers (std::vector<TempoMap::BBTPoint>& grid) +Editor::update_tempo_based_rulers () { if (_session == 0) { return; } - compute_bbt_ruler_scale (grid, leftmost_frame, leftmost_frame+current_page_samples()); - _bbt_metric->units_per_pixel = samples_per_pixel; if (ruler_bbt_action->get_active()) { @@ -1009,7 +1007,7 @@ Editor::metric_get_timecode (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdou } void -Editor::compute_bbt_ruler_scale (std::vector<ARDOUR::TempoMap::BBTPoint>& grid, framepos_t lower, framepos_t upper) +Editor::compute_bbt_ruler_scale (framepos_t lower, framepos_t upper) { if (_session == 0) { return; @@ -1107,22 +1105,17 @@ Editor::compute_bbt_ruler_scale (std::vector<ARDOUR::TempoMap::BBTPoint>& grid, bbt_beat_subdivision = 4; break; } - if (distance (grid.begin(), grid.end()) == 0) { + + const double ceil_upper_beat = floor (max (0.0, _session->tempo_map().beat_at_frame (upper))) + 1.0; + if (ceil_upper_beat == floor_lower_beat) { return; } - i = grid.end(); - i--; + bbt_bars = _session->tempo_map().bbt_at_beat (ceil_upper_beat).bars - _session->tempo_map().bbt_at_beat (floor_lower_beat).bars; - /* XX ?? */ - if ((*i).beat >= (*grid.begin()).beat) { - bbt_bars = (*i).bar - (*grid.begin()).bar; - } else { - bbt_bars = (*i).bar - (*grid.begin()).bar; - } + beats = (ceil_upper_beat - floor_lower_beat) - bbt_bars; + double beat_density = ((beats + 1) * ((double) (upper - lower) / (double) (1 + beat_after_upper_pos - beat_before_lower_pos))) / 5.0; - beats = distance (grid.begin(), grid.end()) - bbt_bars; - double beat_density = ((distance (grid.begin(), grid.end()) + 1) * ((double) (upper - lower) / (double) (1 + grid.back().frame - grid.front().frame))) / 5.0; /* Only show the bar helper if there aren't many bars on the screen */ if ((bbt_bars < 2) || (beats < 5)) { bbt_bar_helper_on = true; diff --git a/gtk2_ardour/editor_tempodisplay.cc b/gtk2_ardour/editor_tempodisplay.cc index 727473e22e..41d19ca794 100644 --- a/gtk2_ardour/editor_tempodisplay.cc +++ b/gtk2_ardour/editor_tempodisplay.cc @@ -166,11 +166,14 @@ Editor::tempo_map_changed (const PropertyChange& /*ignored*/) tempo_lines->tempo_map_changed(); } + compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_samples()); std::vector<TempoMap::BBTPoint> grid; - compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + if (bbt_ruler_scale != bbt_show_many) { + compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + } _session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks); // redraw metric markers draw_measures (grid); - update_tempo_based_rulers (grid); + update_tempo_based_rulers (); } struct CurveComparator { @@ -249,10 +252,15 @@ Editor::marker_position_changed () } } + compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_samples()); std::vector<TempoMap::BBTPoint> grid; - compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + + if (bbt_ruler_scale != bbt_show_many) { + compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + } + draw_measures (grid); - update_tempo_based_rulers (grid); + update_tempo_based_rulers (); } void @@ -263,11 +271,15 @@ Editor::redisplay_tempo (bool immediate_redraw) } if (immediate_redraw) { + compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_samples()); std::vector<TempoMap::BBTPoint> grid; - compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + if (bbt_ruler_scale != bbt_show_many) { + compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + } + draw_measures (grid); - update_tempo_based_rulers (grid); // redraw rulers and measure lines + update_tempo_based_rulers (); // redraw rulers and measure lines } else { Glib::signal_idle().connect (sigc::bind_return (sigc::bind (sigc::mem_fun (*this, &Editor::redisplay_tempo), true), false)); @@ -285,7 +297,36 @@ Editor::compute_current_bbt_points (std::vector<TempoMap::BBTPoint>& grid, frame /* prevent negative values of leftmost from creeping into tempomap */ const double lower_beat = floor (max (0.0, _session->tempo_map().beat_at_frame (leftmost))) - 1.0; - _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost); + switch (bbt_ruler_scale) { + + case bbt_show_beats: + case bbt_show_ticks: + case bbt_show_ticks_detail: + case bbt_show_ticks_super_detail: + _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost); + break; + + case bbt_show_1: + _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost, 1); + break; + + case bbt_show_4: + _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost, 4); + break; + + case bbt_show_16: + _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost, 16); + break; + + case bbt_show_64: + _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost, 64); + break; + + default: + /* bbt_show_many */ + _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost, 128); + break; + } } void diff --git a/gtk2_ardour/tempo_lines.cc b/gtk2_ardour/tempo_lines.cc index 630e476adf..508ae84ed9 100644 --- a/gtk2_ardour/tempo_lines.cc +++ b/gtk2_ardour/tempo_lines.cc @@ -110,9 +110,22 @@ TempoLines::draw (std::vector<ARDOUR::TempoMap::BBTPoint>& grid, i = grid.end(); i--; bars = (*i).bar - (*grid.begin()).bar; - beats = distance (grid.begin(), grid.end()) - bars; - beat_density = (beats * 10.0f) / lines.canvas()->width(); + if (bars < distance (grid.begin(), grid.end()) - 1) { + /* grid contains beats and bars */ + beats = distance (grid.begin(), grid.end()) - bars; + } else { + /* grid contains only bars */ + beats = distance (grid.begin(), grid.end()); + } + + double canvas_width_used = 1.0; + if (leftmost_frame < grid.front().frame) { + const framecnt_t frame_distance = max ((framecnt_t) 1, grid.back().frame - grid.front().frame); + canvas_width_used = 1.0 - ((grid.front().frame - leftmost_frame) / (double) (frame_distance + grid.front().frame)); + } + + beat_density = (beats * 10.0f) / (lines.canvas()->width() * canvas_width_used); if (beat_density > 2.0f) { /* if the lines are too close together, they become useless */ diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h index 99a36cafba..3c56d74db5 100644 --- a/libs/ardour/ardour/tempo.h +++ b/libs/ardour/ardour/tempo.h @@ -324,7 +324,7 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible } void get_grid (std::vector<BBTPoint>&, - framepos_t start, framepos_t end); + framepos_t start, framepos_t end, uint32_t bar_mod = 0); static const Tempo& default_tempo() { return _default_tempo; } static const Meter& default_meter() { return _default_meter; } diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index 1d6f4eccf2..be8761fc39 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -3500,7 +3500,7 @@ TempoMap::round_to_type (framepos_t frame, RoundMode dir, BBTPointType type) void TempoMap::get_grid (vector<TempoMap::BBTPoint>& points, - framepos_t lower, framepos_t upper) + framepos_t lower, framepos_t upper, uint32_t bar_mod) { Glib::Threads::RWLock::ReaderLock lm (lock); int32_t cnt = ceil (beat_at_frame_locked (_metrics, lower)); @@ -3513,14 +3513,32 @@ TempoMap::get_grid (vector<TempoMap::BBTPoint>& points, if (frame_at_beat_locked (_metrics, cnt) >= upper) { return; } + if (bar_mod == 0) { + while (pos >= 0 && pos < upper) { + pos = frame_at_beat_locked (_metrics, cnt); + const TempoSection tempo = tempo_section_at_frame_locked (_metrics, pos); + const MeterSection meter = meter_section_at_frame_locked (_metrics, pos); + const BBT_Time bbt = bbt_at_beat_locked (_metrics, cnt); + points.push_back (BBTPoint (meter, tempo_at_frame_locked (_metrics, pos), pos, bbt.bars, bbt.beats, tempo.c_func())); + ++cnt; + } + } else { + BBT_Time bbt = bbt_at_frame_locked (_metrics, lower); + bbt.beats = 1; + bbt.ticks = 0; - while (pos >= 0 && pos < upper) { - pos = frame_at_beat_locked (_metrics, cnt); - const TempoSection tempo = tempo_section_at_frame_locked (_metrics, pos); - const MeterSection meter = meter_section_at_frame_locked (_metrics, pos); - const BBT_Time bbt = bbt_at_beat_locked (_metrics, cnt); - points.push_back (BBTPoint (meter, tempo_at_frame_locked (_metrics, pos), pos, bbt.bars, bbt.beats, tempo.c_func())); - ++cnt; + if (bar_mod != 1) { + bbt.bars -= bbt.bars % bar_mod; + ++bbt.bars; + } + + while (pos >= 0 && pos < upper) { + pos = frame_at_bbt_locked (_metrics, bbt); + const TempoSection tempo = tempo_section_at_frame_locked (_metrics, pos); + const MeterSection meter = meter_section_at_frame_locked (_metrics, pos); + points.push_back (BBTPoint (meter, tempo_at_frame_locked (_metrics, pos), pos, bbt.bars, bbt.beats, tempo.c_func())); + bbt.bars += bar_mod; + } } } |