+
+ void update_bar_offset_from_bbt (const Meter&);
+ void update_bbt_time_from_bar_offset (const Meter&);
+ double bar_offset() const { return _bar_offset; }
+
+ void set_type (Type type);
+ Type type () const { return _type; }
+
+ double tempo_at_frame (framepos_t frame, double end_bpm, framepos_t end_frame, framecnt_t frame_rate) const;
+ framepos_t frame_at_tempo (double tempo, double end_bpm, framepos_t end_frame, framecnt_t frame_rate) const;
+
+ double tick_at_frame (framepos_t frame, double end_bpm, framepos_t end_frame, framecnt_t frame_rate) const;
+ framepos_t frame_at_tick (double tick, double end_bpm, framepos_t end_frame, framecnt_t frame_rate) const;
+
+ double beat_at_frame (framepos_t frame, double end_bpm, framepos_t end_frame, framecnt_t frame_rate) const;
+ framepos_t frame_at_beat (double beat, double end_bpm, framepos_t end_frame, framecnt_t frame_rate) const;
+
+ private:
+
+ framecnt_t minute_to_frame (double time, framecnt_t frame_rate) const;
+ double frame_to_minute (framecnt_t frame, framecnt_t frame_rate) const;
+
+ /* tempo ramp functions. zero-based with time in minutes,
+ * 'tick tempo' in ticks per minute and tempo in bpm.
+ * time relative to section start.
+ */
+ double c_func (double end_tpm, double end_time) const;
+ double a_func (double begin_tpm, double end_tpm, double end_time) const;
+
+ double tempo_at_time (double time, double end_bpm, double end_time) const;
+ double time_at_tempo (double tempo, double end_bpm, double end_time) const;
+ double tick_tempo_at_time (double time, double end_tpm, double end_time) const;
+ double time_at_tick_tempo (double tick_tempo, double end_tpm, double end_time) const;
+
+ double tick_at_time (double time, double end_tpm, double end_time) const;
+ double time_at_tick (double tick, double end_tpm, double end_time) const;
+
+ double beat_at_time (double time, double end_tpm, double end_time) const;
+ double time_at_beat (double beat, double end_tpm, double end_time) const;
+
+ /* this value provides a fractional offset into the bar in which
+ the tempo section is located in. A value of 0.0 indicates that
+ it occurs on the first beat of the bar, a value of 0.5 indicates
+ that it occurs halfway through the bar and so on.
+
+ this enables us to keep the tempo change at the same relative
+ position within the bar if/when the meter changes.
+ */
+ double _bar_offset;
+ Type _type;