fix mute automation for busses & consolidate code.
[ardour.git] / libs / ardour / ardour / tempo.h
index 663b8a941120a6b0f2c23993b1483a32eaf54184..a04f1bb072b19033f68f10d7b304a962ae0b0a74 100644 (file)
@@ -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<double, Timecode::BBT_Time>& w) {
                _beat = w.first;
                _bbt = w.second;
@@ -327,53 +324,16 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible
        void get_grid (std::vector<BBTPoint>&,
                       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,24 +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<double, framepos_t> predict_tempo_position (TempoSection* section, const Timecode::BBT_Time& bbt);
-
-       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);
-
-       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 set_length (framepos_t frames);
 
-       void fix_legacy_session();
-
        XMLNode& get_state (void);
        int set_state (const XMLNode&, int version);
 
@@ -441,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<double, framepos_t> predict_tempo_position (TempoSection* section, const Timecode::BBT_Time& bbt);
+       bool can_solve_bbt (TempoSection* section, const Timecode::BBT_Time& bbt);
+
        PBD::Signal0<void> 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;
@@ -471,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;