20 #ifndef __ardour_tempo_h__
21 #define __ardour_tempo_h__
27 #include <glibmm/threads.h>
50 Tempo (
double bpm,
double type=4.0)
51 : _beats_per_minute (bpm), _note_type(type) {}
56 return (60.0 * sr) / _beats_per_minute;
68 : _divisions_per_bar (dpb), _note_type (bt) {}
93 : _start (start), _frame (0), _movable (true) {}
95 : _frame (start), _movable (true) {}
99 const Timecode::BBT_Time&
start()
const {
return _start; }
117 virtual XMLNode& get_state()
const = 0;
152 void update_bar_offset_from_bbt (
const Meter&);
153 void update_bbt_time_from_bar_offset (
const Meter&);
176 : _meter (&m), _tempo (&t), _frame (0) {}
181 void set_start (
const Timecode::BBT_Time& t) { _start = t; }
186 if ((meter = dynamic_cast<const MeterSection*>(section))) {
188 }
else if ((tempo = dynamic_cast<const TempoSection*>(section))) {
192 set_frame(section->
frame());
193 set_start(section->
start());
199 const Timecode::BBT_Time&
start()
const {
return _start; }
229 uint32_t b, uint32_t e)
230 : frame (f), meter (&m), tempo (&t), bar (b), beat (e) {}
232 Timecode::BBT_Time
bbt()
const {
return Timecode::BBT_Time (bar, beat, 0); }
233 operator Timecode::BBT_Time()
const {
return bbt(); }
235 bool is_bar()
const {
return beat == 1; }
241 Glib::Threads::RWLock::ReaderLock lm (lock);
242 (obj.*method)(metrics);
245 void get_grid (BBTPointList::const_iterator&, BBTPointList::const_iterator&,
258 void bbt_time (
framepos_t when, Timecode::BBT_Time&);
264 void bbt_time_rt (
framepos_t when, Timecode::BBT_Time&);
265 framepos_t frame_time (
const Timecode::BBT_Time&);
293 void add_meter (
const Meter&, Timecode::BBT_Time where);
295 void remove_tempo (
const TempoSection&,
bool send_signal);
296 void remove_meter (
const MeterSection&,
bool send_signal);
298 void replace_tempo (
const TempoSection&,
const Tempo&,
const Timecode::BBT_Time& where);
299 void replace_meter (
const MeterSection&,
const Meter&,
const Timecode::BBT_Time& where);
308 int set_state (
const XMLNode&,
int version);
310 void dump (std::ostream&)
const;
313 TempoMetric metric_at (Timecode::BBT_Time bbt)
const;
322 void change_existing_tempo_at (
framepos_t,
double bpm,
double note_type);
323 void change_initial_tempo (
double bpm,
double note_type);
328 int n_tempos ()
const;
329 int n_meters ()
const;
335 friend class ::BBTTest;
336 friend class ::FrameposPlusBeatsTest;
337 friend class ::TempoTest;
344 mutable Glib::Threads::RWLock
lock;
347 void recompute_map (
bool reassign_tempo_bbt,
framepos_t end = -1);
350 void require_map_to (
const Timecode::BBT_Time&);
352 Metrics::iterator next_metric,
355 BBTPointList::const_iterator bbt_before_or_at (
framepos_t);
356 BBTPointList::const_iterator bbt_before_or_at (
const Timecode::BBT_Time&);
357 BBTPointList::const_iterator bbt_after_or_at (
framepos_t);
360 void bbt_time (
framepos_t, Timecode::BBT_Time&,
const BBTPointList::const_iterator&);
361 framecnt_t bbt_duration_at_unlocked (
const Timecode::BBT_Time& when,
const Timecode::BBT_Time& bbt,
int dir);
370 void add_tempo_locked (
const Tempo&, Timecode::BBT_Time where,
bool recompute);
371 void add_meter_locked (
const Meter&, Timecode::BBT_Time where,
bool recompute);
const Timecode::BBT_Time & start() const
static Meter _default_meter
Glib::Threads::RWLock lock
std::ostream & operator<<(std::ostream &, const ARDOUR::Meter &)
framecnt_t frame_rate() const
const Meter & meter() const
std::list< MetricSection * > Metrics
void set_metric(const MetricSection *section)
Meter(double dpb, double bt)
void set_meter(const Meter &m)
Metrics::const_iterator metrics_end()
TempoSection(framepos_t start, double qpm, double note_type)
double bar_offset() const
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > start
double _divisions_per_bar
MeterSection(const Timecode::BBT_Time &start, double bpb, double note_type)
Timecode::BBT_Time _start
LIBARDOUR_API uint64_t TempoMap
const Timecode::BBT_Time & start() const
double frames_per_beat(framecnt_t sr) const
void set_start(const Timecode::BBT_Time &t)
MetricSection(framepos_t start)
Tempo(double bpm, double type=4.0)
static const std::string xml_state_node_name
Timecode::BBT_Time bbt() const
static const Meter & default_meter()
virtual void set_start(const Timecode::BBT_Time &w)
static int add_tempo(smf_t *smf, int pulses, int tempo)
BBTPoint(const MeterSection &m, const TempoSection &t, framepos_t f, uint32_t b, uint32_t e)
double note_divisor() const
double beats_per_minute() const
virtual void set_frame(framepos_t f)
const TempoSection * tempo
void set_tempo(const Tempo &t)
void set_frame(framepos_t f)
const Tempo & tempo() const
double divisions_per_bar() const
TempoSection(const Timecode::BBT_Time &start, double qpm, double note_type)
TempoMetric(const Meter &m, const Tempo &t)
MeterSection(framepos_t start, double bpb, double note_type)
MetricSection(const Timecode::BBT_Time &start)
void apply_with_metrics(T &obj, void(T::*method)(const Metrics &))
void set_movable(bool yn)
const MeterSection * meter
std::vector< BBTPoint > BBTPointList
static Tempo _default_tempo
static const Tempo & default_tempo()
Timecode::BBT_Time _start
static const std::string xml_state_node_name