Tempo ramps - rename bbt_time() -> bbt_at_frame(), frame_time() -> frame_at_bbt()
[ardour.git] / gtk2_ardour / editor_rulers.cc
index 57ee38069b2e773d6784cd512ed554da04a7c25e..596f4f26b9bcd2bb499c47a4cf8aedfeac5576d6 100644 (file)
@@ -1017,8 +1017,14 @@ Editor::compute_bbt_ruler_scale (std::vector<ARDOUR::TempoMap::BBTPoint>& grid,
 
        std::vector<TempoMap::BBTPoint>::const_iterator i;
        Timecode::BBT_Time lower_beat, upper_beat; // the beats at each end of the ruler
-       framecnt_t beat_before_lower_pos = _session->tempo_map().frame_at_beat (floor(_session->tempo_map().beat_at_frame (lower)));
-       framecnt_t beat_after_upper_pos = _session->tempo_map().frame_at_beat (floor (_session->tempo_map().beat_at_frame (upper)) + 1.0);
+       double floor_lower_beat = floor(_session->tempo_map().beat_at_frame (lower));
+
+       if (floor_lower_beat < 0.0) {
+               floor_lower_beat = 0.0;
+       }
+
+       const framecnt_t beat_before_lower_pos = _session->tempo_map().frame_at_beat (floor_lower_beat);
+       const framecnt_t beat_after_upper_pos = _session->tempo_map().frame_at_beat (floor (_session->tempo_map().beat_at_frame (upper)) + 1.0);
 
        _session->bbt_time (beat_before_lower_pos, lower_beat);
        _session->bbt_time (beat_after_upper_pos, upper_beat);
@@ -1116,25 +1122,25 @@ Editor::compute_bbt_ruler_scale (std::vector<ARDOUR::TempoMap::BBTPoint>& grid,
        }
 
        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;
        }
 
-       if (bbt_bars > 8192) {
+       if (beat_density > 8192) {
                bbt_ruler_scale = bbt_show_many;
-       } else if (bbt_bars > 1024) {
+       } else if (beat_density > 1024) {
                bbt_ruler_scale = bbt_show_64;
-       } else if (bbt_bars > 256) {
+       } else if (beat_density > 512) {
                bbt_ruler_scale = bbt_show_16;
-       } else if (bbt_bars > 64) {
+       } else if (beat_density > 128) {
                bbt_ruler_scale = bbt_show_4;
-       } else if (bbt_bars > 10) {
+       } else if (beat_density > 16) {
                bbt_ruler_scale =  bbt_show_1;
-       } else if (bbt_bars > 2) {
+       } else if (beat_density > 2) {
                bbt_ruler_scale =  bbt_show_beats;
-       } else  if (bbt_bars > 0) {
+       } else  if (beat_density > 0.5) {
                bbt_ruler_scale =  bbt_show_ticks;
        } else {
                bbt_ruler_scale =  bbt_show_ticks_detail;
@@ -1269,7 +1275,7 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
                                next_beat.beats = (*i).beat;
                                next_beat.bars = (*i).bar;
                                next_beat.ticks = tick;
-                               pos = _session->tempo_map().frame_time (next_beat);
+                               pos = _session->tempo_map().frame_at_bbt (next_beat);
 
                                if (t % bbt_accent_modulo == (bbt_accent_modulo - 1)) {
                                        i_am_accented = true;
@@ -1339,7 +1345,7 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
                                next_beat.beats = (*i).beat;
                                next_beat.bars = (*i).bar;
                                next_beat.ticks = tick;
-                               pos = _session->tempo_map().frame_time (next_beat);
+                               pos = _session->tempo_map().frame_at_bbt (next_beat);
 
                                if (t % bbt_accent_modulo == (bbt_accent_modulo - 1)) {
                                        i_am_accented = true;
@@ -1415,7 +1421,7 @@ Editor::metric_get_bbt (std::vector<ArdourCanvas::Ruler::Mark>& marks, gdouble l
                        while (tick < Timecode::BBT_Time::ticks_per_beat && (n < bbt_nmarks)) {
 
                                next_beat.ticks = tick;
-                               pos = _session->tempo_map().frame_time (next_beat);
+                               pos = _session->tempo_map().frame_at_bbt (next_beat);
                                if (t % bbt_accent_modulo == (bbt_accent_modulo - 1)) {
                                        i_am_accented = true;
                                }