X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Ftempo.h;h=a04f1bb072b19033f68f10d7b304a962ae0b0a74;hb=79245a296b73c4ad49bc9b5a204cdda120e1ab90;hp=160f7c266a501a10671bf0ed277924f9c12d1004;hpb=6309807bc77347ad2889a3e08fa2721ffa345194;p=ardour.git diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h index 160f7c266a..a04f1bb072 100644 --- a/libs/ardour/ardour/tempo.h +++ b/libs/ardour/ardour/tempo.h @@ -149,9 +149,6 @@ class LIBARDOUR_API MeterSection : public MetricSection, public Meter { XMLNode& get_state() const; - void set_pulse (double w) { - MetricSection::set_pulse (w); - } void set_beat (std::pair& w) { _beat = w.first; _bbt = w.second; @@ -327,53 +324,16 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible void get_grid (std::vector&, framepos_t start, framepos_t end); - /* TEMPO- AND METER-SENSITIVE FUNCTIONS - - bbt_time(), beat_at_frame(), frame_at_beat(), tick_at_frame(), - frame_at_tick(),frame_time() and bbt_duration_at() - are all sensitive to tempo and meter, and will give answers - that align with the grid formed by tempo and meter sections. - - They SHOULD NOT be used to determine the position of events - whose location is canonically defined in beats. - */ - - void bbt_time (framepos_t when, Timecode::BBT_Time&); - - double beat_at_frame (const framecnt_t& frame) const; - framecnt_t frame_at_beat (const double& beat) const; - - framepos_t frame_time (const Timecode::BBT_Time&); - framecnt_t bbt_duration_at (framepos_t, const Timecode::BBT_Time&, int dir); - - /* TEMPO-SENSITIVE FUNCTIONS - - These next 4 functions will all take tempo in account and should be - used to determine position (and in the last case, distance in beats) - when tempo matters but meter does not. - - They SHOULD be used to determine the position of events - whose location is canonically defined in beats. - */ - - framepos_t framepos_plus_bbt (framepos_t pos, Timecode::BBT_Time b) const; - framepos_t framepos_plus_beats (framepos_t, Evoral::Beats) const; - framepos_t framepos_minus_beats (framepos_t, Evoral::Beats) const; - Evoral::Beats framewalk_to_beats (framepos_t pos, framecnt_t distance) const; - static const Tempo& default_tempo() { return _default_tempo; } static const Meter& default_meter() { return _default_meter; } - const Tempo tempo_at (const framepos_t& frame) const; + /* because tempos may be ramped, this is only valid for the instant requested.*/ double frames_per_beat_at (const framepos_t&, const framecnt_t& sr) const; - const Meter& meter_at (framepos_t) const; - - const TempoSection& tempo_section_at (framepos_t frame) const; - const MeterSection& meter_section_at (framepos_t frame) const; + const TempoSection& tempo_section_at_frame (framepos_t frame) const; + const MeterSection& meter_section_at_frame (framepos_t frame) const; const MeterSection& meter_section_at_beat (double beat) const; - /** add a tempo section locked to pls. ignored values will be set in recompute_tempos() * @param pulse pulse position of new section. ignored if pls == AudioTime * @param frame frame position of new section. ignored if pls == MusicTime @@ -397,25 +357,12 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible void replace_meter (const MeterSection&, const Meter&, const Timecode::BBT_Time& where, const framepos_t& frame , PositionLockStyle pls); - std::pair predict_tempo_position (TempoSection* section, const Timecode::BBT_Time& bbt); - - void gui_move_tempo (TempoSection*, const std::pair& pulse); - void gui_move_meter (MeterSection*, const framepos_t& frame); - - bool gui_change_tempo (TempoSection*, const Tempo& bpm); - void gui_dilate_tempo (TempoSection* tempo, const framepos_t& frame, const framepos_t& end_frame, const double& pulse); - - bool can_solve_bbt (TempoSection* section, const Timecode::BBT_Time& bbt); - framepos_t round_to_bar (framepos_t frame, RoundMode dir); framepos_t round_to_beat (framepos_t frame, RoundMode dir); framepos_t round_to_beat_subdivision (framepos_t fr, int sub_num, RoundMode dir); - void round_bbt (Timecode::BBT_Time& when, const int32_t& snap_divisor, RoundMode dir); void set_length (framepos_t frames); - void fix_legacy_session(); - XMLNode& get_state (void); int set_state (const XMLNode&, int version); @@ -442,29 +389,89 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible framecnt_t frame_rate () const { return _frame_rate; } - double beat_at_bbt (const Timecode::BBT_Time& bbt); - Timecode::BBT_Time bbt_at_beat (const double& beats); + /* TEMPO- AND METER-SENSITIVE FUNCTIONS - double pulse_at_bbt (const Timecode::BBT_Time& bbt); - Timecode::BBT_Time bbt_at_pulse (const double& pulse); + bbt_at_frame(), frame_at_bbt(), beat_at_frame(), frame_at_beat(), tempo_at_beat() + and bbt_duration_at() + are all sensitive to tempo and meter, and will give answers + that align with the grid formed by tempo and meter sections. + They SHOULD NOT be used to determine the position of events + whose location is canonically defined in beats. + */ + + double beat_at_frame (const framecnt_t& frame) const; + framecnt_t frame_at_beat (const double& beat) const; + + Tempo tempo_at_frame (const framepos_t& frame) const; + framepos_t frame_at_tempo (const Tempo& tempo) const; + + Tempo tempo_at_beat (const double& beat) const; + + const Meter& meter_at_frame (framepos_t) const; + + /* you probably only need to use pulses when moving tempos */ double pulse_at_beat (const double& beat) const; double beat_at_pulse (const double& pulse) const; double pulse_at_frame (const framecnt_t& frame) const; framecnt_t frame_at_pulse (const double& pulse) const; + /* bbt - it's nearly always better to use beats.*/ + Timecode::BBT_Time bbt_at_frame (framepos_t when); + Timecode::BBT_Time bbt_at_frame_rt (framepos_t when); + framepos_t frame_at_bbt (const Timecode::BBT_Time&); + + double beat_at_bbt (const Timecode::BBT_Time& bbt); + Timecode::BBT_Time bbt_at_beat (const double& beats); + + double pulse_at_bbt (const Timecode::BBT_Time& bbt); + Timecode::BBT_Time bbt_at_pulse (const double& pulse); + + framecnt_t bbt_duration_at (framepos_t, const Timecode::BBT_Time&, int dir); + + /* TEMPO-SENSITIVE FUNCTIONS + + These next 4 functions will all take tempo in account and should be + used to determine position (and in the last case, distance in beats) + when tempo matters but meter does not. + + They SHOULD be used to determine the position of events + whose location is canonically defined in beats. + */ + + framepos_t framepos_plus_bbt (framepos_t pos, Timecode::BBT_Time b) const; + framepos_t framepos_plus_beats (framepos_t, Evoral::Beats) const; + framepos_t framepos_minus_beats (framepos_t, Evoral::Beats) const; + Evoral::Beats framewalk_to_beats (framepos_t pos, framecnt_t distance) const; + + void gui_move_tempo (TempoSection*, const framepos_t& frame); + void gui_move_meter (MeterSection*, const framepos_t& frame); + bool gui_change_tempo (TempoSection*, const Tempo& bpm); + void gui_dilate_tempo (TempoSection* tempo, const framepos_t& frame, const framepos_t& end_frame, const double& pulse); + + std::pair predict_tempo_position (TempoSection* section, const Timecode::BBT_Time& bbt); + bool can_solve_bbt (TempoSection* section, const Timecode::BBT_Time& bbt); + PBD::Signal0 MetricPositionChanged; + void fix_legacy_session(); private: + + double beat_at_frame_locked (const Metrics& metrics, const framecnt_t& frame) const; + framecnt_t frame_at_beat_locked (const Metrics& metrics, const double& beat) const; + double pulse_at_beat_locked (const Metrics& metrics, const double& beat) const; double beat_at_pulse_locked (const Metrics& metrics, const double& pulse) const; double pulse_at_frame_locked (const Metrics& metrics, const framecnt_t& frame) const; framecnt_t frame_at_pulse_locked (const Metrics& metrics, const double& pulse) const; - double beat_at_frame_locked (const Metrics& metrics, const framecnt_t& frame) const; - framecnt_t frame_at_beat_locked (const Metrics& metrics, const double& beat) const; + Tempo tempo_at_frame_locked (const Metrics& metrics, const framepos_t& frame) const; + framepos_t frame_at_tempo_locked (const Metrics& metrics, const Tempo& tempo) const; + + Timecode::BBT_Time bbt_at_frame_locked (const Metrics& metrics, const framepos_t& frame) const; + framepos_t frame_at_bbt_locked (const Metrics& metrics, const Timecode::BBT_Time&) const; double beat_at_bbt_locked (const Metrics& metrics, const Timecode::BBT_Time& bbt) const ; Timecode::BBT_Time bbt_at_beat_locked (const Metrics& metrics, const double& beats) const; @@ -472,14 +479,10 @@ private: double pulse_at_bbt_locked (const Metrics& metrics, const Timecode::BBT_Time& bbt) const; Timecode::BBT_Time bbt_at_pulse_locked (const Metrics& metrics, const double& pulse) const; - framepos_t frame_time_locked (const Metrics& metrics, const Timecode::BBT_Time&) const; - - const TempoSection& tempo_section_at_locked (const Metrics& metrics, framepos_t frame) const; + const TempoSection& tempo_section_at_frame_locked (const Metrics& metrics, framepos_t frame) const; const TempoSection& tempo_section_at_beat_locked (const Metrics& metrics, const double& beat) const; - const TempoSection& tempo_section_at_pulse_locked (const Metrics& metrics, const double& pulse) const; - const Tempo tempo_at_locked (const Metrics& metrics, const framepos_t& frame) const; - const MeterSection& meter_section_at_locked (const Metrics& metrics, framepos_t frame) const; + const MeterSection& meter_section_at_frame_locked (const Metrics& metrics, framepos_t frame) const; const MeterSection& meter_section_at_beat_locked (const Metrics& metrics, const double& beat) const; bool check_solved (const Metrics& metrics) const;