From 1098b27b35b5afefe76ffbe160a655ef0ed78501 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 24 Nov 2020 15:06:35 -0700 Subject: [PATCH] new tempo map API for almost all of the GUI now --- gtk2_ardour/audio_clock.cc | 57 ++++++++++++------------------ gtk2_ardour/editor_tempodisplay.cc | 10 +++--- gtk2_ardour/step_editor.cc | 13 +++---- libs/temporal/tempo.cc | 17 +++++---- libs/temporal/temporal/tempo.h | 2 +- 5 files changed, 42 insertions(+), 57 deletions(-) diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc index ebc0eecc64..98a91e9ed7 100644 --- a/gtk2_ardour/audio_clock.cc +++ b/gtk2_ardour/audio_clock.cc @@ -64,6 +64,7 @@ using namespace ArdourWidgets; using namespace PBD; using namespace Gtk; using namespace std; +using namespace Temporal; using Gtkmm2ext::Keyboard; @@ -1226,8 +1227,7 @@ AudioClock::set_bbt (timepos_t const & w, timecnt_t const & o, bool /*force*/) } /* handle a common case */ -#warning NUTEMPO FIXME new tempo map API -#if 0 + if (is_duration) { if (when.zero()) { BBT.bars = 0; @@ -1240,15 +1240,15 @@ AudioClock::set_bbt (timepos_t const & w, timecnt_t const & o, bool /*force*/) offset = timecnt_t (bbt_reference_time); } - const double divisions = tmap.meter_section_at_sample (offset).divisions_per_bar(); + const int divisions = tmap.meter_at (timepos_t (offset)).divisions_per_bar(); Temporal::BBT_Time sub_bbt; if (negative) { - BBT = tmap.bbt_at_beat (tmap.beat_at_sample (offset)); - sub_bbt = tmap.bbt_at_sample (offset - when); + BBT = tmap.bbt_at (tmap.quarter_note_at (timepos_t (offset))); + sub_bbt = tmap.bbt_at (timepos_t (offset - when)); } else { - BBT = tmap.bbt_at_beat (tmap.beat_at_sample (when + offset)); - sub_bbt = tmap.bbt_at_sample (offset); + BBT = tmap.bbt_at (tmap.quarter_note_at (when + offset)); + sub_bbt = tmap.bbt_at (timepos_t (offset)); } BBT.bars -= sub_bbt.bars; @@ -1273,9 +1273,9 @@ AudioClock::set_bbt (timepos_t const & w, timecnt_t const & o, bool /*force*/) } } } else { - BBT = _session->tempo_map().bbt_at_sample (when); + BBT = _session->tempo_map().bbt_at (when); } -#endif + if (negative) { snprintf (buf, sizeof (buf), "-%03" PRIu32 BBT_BAR_CHAR "%02" PRIu32 BBT_BAR_CHAR "%04" PRIu32, BBT.bars, BBT.beats, BBT.ticks); @@ -1295,28 +1295,25 @@ AudioClock::set_bbt (timepos_t const & w, timecnt_t const & o, bool /*force*/) pos = bbt_reference_time; } -#warning NUTEMPO FIXME new tempo map API -#if 0 TempoMetric m (_session->tempo_map().metric_at (pos)); #ifndef PLATFORM_WINDOWS /* UTF8 1/4 note and 1/8 note ♩ (\u2669) and ♪ (\u266a) are n/a on Windows */ if (m.tempo().note_type() == 4) { - snprintf (buf, sizeof(buf), "\u2669 = %.3f", _session->tempo_map().tempo_at_sample (pos).note_types_per_minute()); + snprintf (buf, sizeof(buf), "\u2669 = %.3f", m.tempo().note_types_per_minute()); _left_btn.set_text (string_compose ("%1", buf), false); } else if (m.tempo().note_type() == 8) { - snprintf (buf, sizeof(buf), "\u266a = %.3f", _session->tempo_map().tempo_at_sample (pos).note_types_per_minute()); + snprintf (buf, sizeof(buf), "\u266a = %.3f", m.tempo().note_types_per_minute()); _left_btn.set_text (string_compose ("%1", buf), false); } else #endif { - snprintf (buf, sizeof(buf), "1/%.0f = %.3f", m.tempo().note_type(), _session->tempo_map().tempo_at_sample (pos).note_types_per_minute()); + snprintf (buf, sizeof(buf), "1/%.0f = %.3f", m.tempo().note_type(), m.tempo().note_types_per_minute()); _left_btn.set_text (buf, false); } - snprintf (buf, sizeof(buf), "%g/%g", m.meter().divisions_per_bar(), m.meter().note_divisor()); + snprintf (buf, sizeof(buf), "%d/%d", m.meter().divisions_per_bar(), m.meter().note_value()); _right_btn.set_text (string_compose ("%1: %2", S_("TimeSignature|TS"), buf), false); -#endif } } @@ -1914,22 +1911,19 @@ AudioClock::get_sample_step (Field field, timepos_t const & pos, int dir) BBT.bars = 1; BBT.beats = 0; BBT.ticks = 0; -#warning NUTEMPO FIXME new tempo map API - //f = _session->tempo_map().bbt_duration_at (pos,BBT,dir); + f = _session->tempo_map().bbt_duration_at (pos,BBT).samples(); break; case Beats: BBT.bars = 0; BBT.beats = 1; BBT.ticks = 0; -#warning NUTEMPO FIXME new tempo map API - //f = _session->tempo_map().bbt_duration_at(pos,BBT,dir); + f = _session->tempo_map().bbt_duration_at(pos,BBT).samples(); break; case Ticks: BBT.bars = 0; BBT.beats = 0; BBT.ticks = 1; -#warning NUTEMPO FIXME new tempo map API - //f = _session->tempo_map().bbt_duration_at(pos,BBT,dir); + f = _session->tempo_map().bbt_duration_at(pos,BBT).samples(); break; default: error << string_compose (_("programming error: %1"), "attempt to get samples from non-text field!") << endmsg; @@ -2111,21 +2105,18 @@ AudioClock::samples_from_bbt_string (timepos_t const & pos, const string& str) c return 0; } - AnyTime any; - any.type = AnyTime::BBT; + BBT_Time bbt; - if (sscanf (str.c_str(), BBT_SCANF_FORMAT, &any.bbt.bars, &any.bbt.beats, &any.bbt.ticks) != 3) { + if (sscanf (str.c_str(), BBT_SCANF_FORMAT, &bbt.bars, &bbt.beats, &bbt.ticks) != 3) { return 0; } if (is_duration) { - any.bbt.bars++; - any.bbt.beats++; -#warning NUTEMPO new tempo map/session API - //return _session->any_duration_to_samples (pos, any); - return 0; + bbt.bars++; + bbt.beats++; + return _session->tempo_map().bbt_duration_at (pos, bbt).samples(); } else { - return _session->convert_to_samples (any); + return _session->tempo_map().sample_at (bbt, _session->sample_rate()); } } @@ -2144,9 +2135,7 @@ AudioClock::sample_duration_from_bbt_string (timepos_t const & pos, const string return 0; } -#warning NUTEMPO new tempo map API - //return _session->tempo_map().bbt_duration_at(pos,bbt,1); - return 0; + return _session->tempo_map().bbt_duration_at(pos,bbt).samples(); } samplepos_t diff --git a/gtk2_ardour/editor_tempodisplay.cc b/gtk2_ardour/editor_tempodisplay.cc index e8ad30ab96..dda9eafac9 100644 --- a/gtk2_ardour/editor_tempodisplay.cc +++ b/gtk2_ardour/editor_tempodisplay.cc @@ -414,24 +414,22 @@ Editor::mouse_add_new_tempo_event (timepos_t pos) return; } -#warning NUTEMPO requires new tempo map API -#if 0 TempoMap& map(_session->tempo_map()); begin_reversible_command (_("add tempo mark")); - const double pulse = map.exact_qn_at_sample (sample, get_grid_music_divisions (0)) / 4.0; + const Beats qn = map.quarter_note_at (pos); - if (pulse > 0.0) { + if (qn > Beats()) { XMLNode &before = map.get_state(); /* add music-locked ramped (?) tempo using the bpm/note type at sample*/ - map.add_tempo (map.tempo_at_sample (sample), pulse, 0, MusicTime); + map.set_tempo (map.tempo_at (pos), qn); XMLNode &after = map.get_state(); _session->add_command(new MementoCommand(map, &before, &after)); commit_reversible_command (); } -#endif + //map.dump (cerr); } diff --git a/gtk2_ardour/step_editor.cc b/gtk2_ardour/step_editor.cc index c96e9dc786..aff7f507dd 100644 --- a/gtk2_ardour/step_editor.cc +++ b/gtk2_ardour/step_editor.cc @@ -34,6 +34,7 @@ using namespace ARDOUR; using namespace Gtk; using namespace std; +using namespace Temporal; StepEditor::StepEditor (PublicEditor& e, boost::shared_ptr t, MidiTimeAxisView& mtv) : _editor (e) @@ -115,15 +116,9 @@ StepEditor::prepare_step_edit_region () } else { -#warning NUTEMPO new tempo map API -#if 0 - const Meter& m = _mtv.session()->tempo_map().meter_at_sample (step_edit_insert_position); - double baf = max (0.0, _mtv.session()->tempo_map().beat_at_sample (step_edit_insert_position)); - double next_bar_in_beats = baf + m.divisions_per_bar(); - samplecnt_t next_bar_pos = _mtv.session()->tempo_map().sample_at_beat (next_bar_in_beats); - samplecnt_t len = next_bar_pos - step_edit_insert_position; - step_edit_region = _mtv.add_region (step_edit_insert_position, len, true); -#endif + const Meter& m = _mtv.session()->tempo_map().meter_at (step_edit_insert_position); + /* 1 bar long region */ + step_edit_region = _mtv.add_region (step_edit_insert_position, timecnt_t (Beats::beats (m.divisions_per_bar()), step_edit_insert_position), true); RegionView* rv = _mtv.midi_view()->find_view (step_edit_region); step_edit_region_view = dynamic_cast(rv); diff --git a/libs/temporal/tempo.cc b/libs/temporal/tempo.cc index a26c4c89ca..63f0e73191 100644 --- a/libs/temporal/tempo.cc +++ b/libs/temporal/tempo.cc @@ -2466,18 +2466,21 @@ TempoMap::can_remove (MeterPoint const & m) const return !is_initial (m); } -/** returns the sample duration of the supplied BBT time at a specified sample position in the tempo map. +/** returns the duration (using the domain of @param pos) of the supplied BBT time at a specified sample position in the tempo map. * @param pos the frame position in the tempo map. * @param bbt the distance in BBT time from pos to calculate. * @param dir the rounding direction.. - * @return the duration in superclocks between pos and bbt + * @return the timecnt_t that @param bbt represents when starting at @param pos, in + * the time domain of @param pos */ -superclock_t -TempoMap::bbt_duration_at (superclock_t pos, const BBT_Time& bbt, int /* dir_ignored */ ) const +timecnt_t +TempoMap::bbt_duration_at (timepos_t const & pos, BBT_Offset const & dur) const { -#warning paul maybe get rid of this - // return full_duration_at (pos, timecnt_t (bbt, pos), AudioTime).sclock(); - return 0; + if (pos.time_domain() == AudioTime) { + return timecnt_t::from_superclock (superclock_at (bbt_walk (bbt_at (pos), dur)) - pos.superclocks(), pos); + } + return timecnt_t (bbtwalk_to_quarters (pos.beats(), dur) - pos.beats(), pos); + } /** Takes a duration (in any time domain) and considers it as a distance from the given position. diff --git a/libs/temporal/temporal/tempo.h b/libs/temporal/temporal/tempo.h index 0b80744b30..84bb6a1e6f 100644 --- a/libs/temporal/temporal/tempo.h +++ b/libs/temporal/temporal/tempo.h @@ -729,7 +729,7 @@ class LIBTEMPORAL_API TempoMap : public PBD::StatefulDestructible superclock_t superclock_quarters_delta_as_superclock (superclock_t start, Beats const & distance) const; superclock_t superclock_plus_bbt (superclock_t pos, BBT_Time op) const; - superclock_t bbt_duration_at (superclock_t pos, const BBT_Time& bbt, int dir) const; + timecnt_t bbt_duration_at (timepos_t const & pos, BBT_Offset const & bbt) const; Beats bbtwalk_to_quarters (Beats const & start, BBT_Offset const & distance) const; superclock_t superclock_per_quarter_note_at (superclock_t) const;