26 #include <unordered_map>
28 #include <boost/intrusive/list.hpp>
30 #include <glibmm/threads.h>
64 class TempoMapCutBuffer;
87 typedef boost::intrusive::list_base_hook<boost::intrusive::tag<struct point_tag>>
point_hook;
178 Tempo (
double npm, int8_t note_type)
181 , _superclocks_per_note_type (double_npm_to_scpn (npm))
182 , _end_superclocks_per_note_type (double_npm_to_scpn (npm))
183 , _note_type (note_type)
184 , _locked_to_meter (false)
185 , _continuing (false)
188 Tempo (
double npm,
double enpm, int8_t note_type)
191 , _superclocks_per_note_type (double_npm_to_scpn (npm))
192 , _end_superclocks_per_note_type (double_npm_to_scpn (enpm))
193 , _note_type (note_type)
194 , _locked_to_meter (false)
195 , _continuing (false)
212 return _superclocks_per_note_type;
215 return (_superclocks_per_note_type * _note_type) / note_type;
218 return superclocks_per_note_type (4);
221 return _end_superclocks_per_note_type;
224 return (_end_superclocks_per_note_type * _note_type) / note_type;
227 return end_superclocks_per_note_type (4);
236 Type type()
const {
return _superclocks_per_note_type == _end_superclocks_per_note_type ? Constant : Ramped; }
237 bool ramped ()
const {
return _superclocks_per_note_type != _end_superclocks_per_note_type; }
250 bool operator!= (
Tempo const & other)
const {
283 Meter (int8_t dpb, int8_t nv) : _note_value (nv), _divisions_per_bar (dpb) {}
284 Meter (
Meter const & other) : _note_value (other._note_value), _divisions_per_bar (other._divisions_per_bar) {}
297 if (&other !=
this) {
327 typedef boost::intrusive::list_base_hook<boost::intrusive::tag<struct meterpoint_tag>>
meter_hook;
358 typedef boost::intrusive::list_base_hook<boost::intrusive::tag<struct tempo_tag>>
tempo_hook;
480 return superclocks_per_grid () * _meter->divisions_per_bar();
483 return PBD::muldiv_round (_tempo->superclocks_per_note_type(), _tempo->note_type(), (int64_t) _meter->note_value());
487 if (!_tempo->actually_ramped()) {
488 return _tempo->superclocks_per_note_type ();
490 return _tempo->superclocks_per_note_type() * exp (-_tempo->omega() * (sc - _tempo->sclock()));
515 typedef boost::intrusive::list_base_hook<boost::intrusive::tag<struct bartime_tag>>
bartime_hook;
600 bool is_explicit ()
const {
return is_explicit_meter() || is_explicit_tempo() || is_explicit_position(); }
607 typedef boost::intrusive::list<TempoPoint, boost::intrusive::base_hook<tempo_hook>>
Tempos;
608 typedef boost::intrusive::list<MeterPoint, boost::intrusive::base_hook<meter_hook>>
Meters;
609 typedef boost::intrusive::list<MusicTimePoint, boost::intrusive::base_hook<bartime_hook>>
MusicTimes;
610 typedef boost::intrusive::list<Point, boost::intrusive::base_hook<point_hook>>
Points;
617 GridIterator () : sclock (0), tempo (nullptr), meter (nullptr), end (0), bar_mod (0), beat_div (1), valid (false), map (nullptr) {}
619 uint32_t bmod, uint32_t bdiv)
625 , points_iterator (p)
632 valid = (tempo && meter);
636 uint32_t bmod, uint32_t bdiv) {
830 for (
auto const & p :
_points) {
873 template<
typename TimeType,
typename Comparator>
TempoPoint const &
_tempo_at (TimeType when, Comparator cmp)
const {
880 Tempos::const_iterator prev =
_tempos.end();
881 for (Tempos::const_iterator t =
_tempos.begin(); t !=
_tempos.end(); ++t) {
882 if (cmp (*t, when)) {
894 template<
typename TimeType,
typename Comparator>
MeterPoint const &
_meter_at (TimeType when, Comparator cmp)
const {
901 Meters::const_iterator prev =
_meters.end();
902 for (Meters::const_iterator m =
_meters.begin(); m !=
_meters.end(); ++m) {
903 if (cmp (*m, when)) {
985 virtual const char*
what()
const throw() {
return "TempoMap is empty"; }
999 static void map_assert (
bool expr,
char const * exprstr,
char const * file,
int line);
1079 template<
class constness_traits_t>
typename constness_traits_t::iterator_type
1081 typename constness_traits_t::meter_point_type &,
1082 typename constness_traits_t::time_reference (
Point::*)()
const,
1083 typename constness_traits_t::time_type,
1084 typename constness_traits_t::iterator_type begini,
1085 typename constness_traits_t::iterator_type endi,
1086 typename constness_traits_t::tempo_point_type tstart,
1087 typename constness_traits_t::meter_point_type mstart,
1089 bool ret_iterator_after_not_at)
const;
1109 return _get_tempo_and_meter<non_const_traits<superclock_t, superclock_t> > (t, m, &
Point::sclock, sc,
_points.begin(),
_points.end(), &
_tempos.front(), &
_meters.front(), can_match, ret_iterator_after_not_at);
1118 return _get_tempo_and_meter<const_traits<superclock_t, superclock_t> > (t, m, &
Point::sclock, sc,
_points.begin(),
_points.end(), &
_tempos.front(), &
_meters.front(), can_match, ret_iterator_after_not_at);
1122 return _get_tempo_and_meter<const_traits<Beats const &, Beats> > (t, m, &
Point::beats, b,
_points.begin(),
_points.end(), &
_tempos.front(), &
_meters.front(), can_match, ret_iterator_after_not_at);
1134 Tempos::const_iterator tp =
_tempos.begin();
1135 Meters::const_iterator mp =
_meters.begin();
1140 Tempos::const_iterator nxt = tp; ++nxt;
1141 if (nxt ==
_tempos.end() || nxt->sclock() > ref) {
1147 Meters::const_iterator nxt = mp; ++nxt;
1148 if (nxt ==
_meters.end() || mp->sclock() > ref) {
1155 return _get_tempo_and_meter<const_traits<BBT_Time const &, BBT_Time> > (t, m, &
Point::bbt, bbt,
_points.begin(),
_points.end(), &(*tp), &(*mp), can_match, ret_iterator_after_not_at);
1231 typedef boost::intrusive::list<TempoPoint, boost::intrusive::base_hook<tempo_hook>>
Tempos;
1232 typedef boost::intrusive::list<MeterPoint, boost::intrusive::base_hook<meter_hook>>
Meters;
1233 typedef boost::intrusive::list<MusicTimePoint, boost::intrusive::base_hook<bartime_hook>>
MusicTimes;
1234 typedef boost::intrusive::list<Point, boost::intrusive::base_hook<point_hook>>
Points;
1250 return _tempos.empty() && _meters.empty() && _bartimes.empty() && _points.empty();
1273 const std::string&
name ()
const {
return _name; }
1288 #ifdef COMPILER_MSVC
1289 #pragma warning(disable:4101)
std::ostream & operator<<(std::ostream &o, ARDOUR::Bundle const &)
static const int32_t PPQN
bool valid_for(TempoMap const &map, superclock_t start, uint32_t bar_mod, uint32_t beat_div) const
Points::const_iterator points_iterator
GridIterator(TempoMap const &m, TempoPoint const *tp, MeterPoint const *mp, superclock_t sc, Beats const &b, BBT_Time const &bb, Points::const_iterator p, superclock_t e, uint32_t bmod, uint32_t bdiv)
void catch_up_to(superclock_t e)
void set(TempoMap const &m, TempoPoint const *tp, MeterPoint const *mp, superclock_t sc, Beats const &b, BBT_Time const &bb, Points::const_iterator p, superclock_t e, uint32_t bmod, uint32_t bdiv)
TempoMap const & map() const
MapOwned(TempoMap const &map)
void set_map(TempoMap const &map)
MeterPoint(TempoMap const &map, XMLNode const &)
MeterPoint(TempoMap const &map, Meter const &m, superclock_t sc, Beats const &b, BBT_Time const &bbt)
Beats quarters_at(BBT_Time const &bbt) const
XMLNode & get_state() const
BBT_Time bbt_at(Beats const &beats) const
bool operator==(MeterPoint const &other) const
MeterPoint(Meter const &m, Point const &p)
bool operator!=(MeterPoint const &other) const
BBT_Time bbt_subtract(BBT_Time const &bbt, BBT_Offset const &sub) const
int8_t _divisions_per_bar
BBT_Time round_up_to_bar(BBT_Time const &) const
Meter & operator=(Meter const &other)
BBT_Time round_up_to_beat_div(BBT_Time const &, int beat_div) const
BBT_Time round_up_to_beat(BBT_Time const &bbt) const
Meter(int8_t dpb, int8_t nv)
BBT_Time bbt_add(BBT_Time const &bbt, BBT_Offset const &add) const
BBT_Time round_to_bar(BBT_Time const &) const
Beats to_quarters(BBT_Offset const &) const
bool operator==(const Meter &other) const
Meter(Meter const &other)
int divisions_per_bar() const
int set_state(XMLNode const &, int version)
int32_t ticks_per_grid() const
XMLNode & get_state() const
bool operator!=(const Meter &other) const
BBT_Time round_to_beat(BBT_Time const &) const
static std::string xml_node_name
bool operator==(MusicTimePoint const &other) const
virtual ~MusicTimePoint()
XMLNode & get_state() const
void set_name(std::string const &)
MusicTimePoint(TempoMap const &map, superclock_t sc, Beats const &b, BBT_Time const &bbt, Tempo const &t, Meter const &m, std::string name=std::string())
MusicTimePoint(TempoMap const &map, XMLNode const &)
void set(superclock_t sc, Beats const &b, BBT_Time const &bbt)
void add_state(XMLNode &) const
bool operator!=(Point const &other) const
samplepos_t sample(int sr) const
virtual timepos_t time() const =0
Point(TempoMap const &map, superclock_t sc, Beats const &b, BBT_Time const &bbt)
Point(TempoMap const &map, XMLNode const &)
superclock_t sclock() const
Beats const & beats() const
bool operator==(Point const &other) const
void map_reset_set_sclock_for_sr_change(superclock_t sc)
BBT_Time const & bbt() const
const std::string & name() const
TempoCommand(std::string const &name, XMLNode const *before, XMLNode const *after)
TempoCommand(XMLNode const &)
XMLNode & get_state() const
void dump(std::ostream &)
Tempo const * end_tempo() const
void add_end_tempo(Tempo const &t)
Tempo const * start_tempo() const
void add_end_meter(Meter const &t)
void add_start_meter(Meter const &t)
TempoMapCutBuffer(timecnt_t const &)
void add(MeterPoint const &)
timecnt_t duration() const
void add(MusicTimePoint const &)
boost::intrusive::list< TempoPoint, boost::intrusive::base_hook< tempo_hook > > Tempos
Tempos const & tempos() const
boost::intrusive::list< MusicTimePoint, boost::intrusive::base_hook< bartime_hook > > MusicTimes
boost::intrusive::list< Point, boost::intrusive::base_hook< point_hook > > Points
void add(TempoPoint const &)
Meter const * start_meter() const
Meters const & meters() const
MusicTimes const & bartimes() const
Meter const * end_meter() const
boost::intrusive::list< MeterPoint, boost::intrusive::base_hook< meter_hook > > Meters
void add_start_tempo(Tempo const &t)
Points const & points() const
bool is_explicit_meter() const
TempoMapPoint(TempoMap const &map, TempoMetric const &tm, superclock_t sc, Beats const &q, BBT_Time const &bbt)
bool is_explicit_position() const
bool is_explicit_tempo() const
void copy_points(TempoMap const &other)
static void abort_update()
bool set_continuing(TempoPoint &, bool)
MeterPoint const & meter_at(superclock_t sc) const
bool tempo_exists_before(TempoPoint const &t) const
Points::const_iterator get_grid(TempoMapPoints &points, superclock_t start, superclock_t end, uint32_t bar_mod=0, uint32_t beat_div=1) const
void fill_grid_with_final_metric(TempoMapPoints &ret, TempoMetric metric, superclock_t start, superclock_t rstart, superclock_t end, int bar_mod, int beat_div, Beats beats, BBT_Time bbt) const
bool move_tempo(TempoPoint const &point, timepos_t const &destination, bool push=false)
MeterPoint * add_meter(MeterPoint *)
uint32_t n_tempos() const
Beats quarters_at_superclock(superclock_t sc) const
bool solve_ramped_twist(TempoPoint &, TempoPoint &)
bool is_initial(MeterPoint const &) const
TempoPoint * add_tempo(TempoPoint *)
bool core_remove_tempo(TempoPoint const &)
bool tempo_exists_after(TempoPoint const &t) const
static thread_local SharedPtr _tempo_map_p
MeterPoint const & _meter_at(TimeType when, Comparator cmp) const
Beats quarters_at(timepos_t const &) const
MeterPoint const & meter_at(Beats const &b) const
bool can_remove(TempoPoint const &) const
BBT_Argument bbt_at(Beats const &) const
Beats bbtwalk_to_quarters(Beats const &start, BBT_Offset const &distance) const
void stretch_tempo(TempoPoint &ts, double new_npm)
MusicTimePoint * add_or_replace_bartime(MusicTimePoint *)
bool core_remove_bartime(MusicTimePoint const &)
bool solve_constant_twist(TempoPoint &, TempoPoint &)
void shift(timepos_t const &at, timecnt_t const &by)
static void update_thread_tempo_map()
TempoPoint * core_add_tempo(TempoPoint *, bool &)
static WritableSharedPtr write_copy()
void shift(timepos_t const &at, BBT_Offset const &by)
TempoMap(XMLNode const &, int version)
MusicTimes const & bartimes() const
TempoPoint const & tempo_at(superclock_t sc) const
void ramped_twist_tempi(TempoPoint &prev, TempoPoint &focus, TempoPoint &next, double tempo_delta)
Meter const * next_meter(Meter const &) const
int parse_meter_state_3x(const XMLNode &node, LegacyMeterState <s)
samplepos_t sample_at(BBT_Argument const &b) const
MeterPoint * core_add_meter(MeterPoint *, bool &)
timecnt_t bbt_duration_at(timepos_t const &pos, BBT_Offset const &bbt) const
Beats scwalk_to_quarters(Beats const &pos, superclock_t distance) const
void remove_tempo(TempoPoint const &, bool with_reset=true)
TempoPoint const & _tempo_at(TimeType when, Comparator cmp) const
void remove_point(Point const &)
void dump(std::ostream &) const
uint32_t n_meters() const
TempoPoint & set_tempo(Tempo const &, timepos_t const &)
void reset_starting_at(Beats const &)
int set_state(XMLNode const &, int version)
void stretch_tempo_end(TempoPoint *ts, samplepos_t sample, samplepos_t end_sample)
Points::const_iterator get_tempo_and_meter(TempoPoint const *&t, MeterPoint const *&m, BBT_Argument const &bbt, bool can_match, bool ret_iterator_after_not_at) const
bool set_ramped(TempoPoint &, bool)
MeterPoint & set_meter(Meter const &, BBT_Argument const &)
MeterPoint const * previous_meter(MeterPoint const &) const
void remove_bartime(MusicTimePoint const &tp, bool with_reset=true)
samplepos_t sample_at(timepos_t const &t) const
TempoPoint const & tempo_at(Beats const &b) const
TempoPoint const * next_tempo(TempoPoint const &) const
int set_meters_from_state(XMLNode const &)
double min_notes_per_minute() const
void fill_grid_by_walking(TempoMapPoints &ret, Points::const_iterator &p, TempoMetric &metric, superclock_t &start, superclock_t rstart, superclock_t end, int bar_mod, int beat_div, Beats &beats, BBT_Time &bbt) const
bool remove_time(timepos_t const &pos, timecnt_t const &duration)
double max_notes_per_minute() const
constness_traits_t::iterator_type _get_tempo_and_meter(typename constness_traits_t::tempo_point_type &, typename constness_traits_t::meter_point_type &, typename constness_traits_t::time_reference(Point::*)() const, typename constness_traits_t::time_type, typename constness_traits_t::iterator_type begini, typename constness_traits_t::iterator_type endi, typename constness_traits_t::tempo_point_type tstart, typename constness_traits_t::meter_point_type mstart, bool can_match, bool ret_iterator_after_not_at) const
std::list< Point const * > Metrics
TempoMetric metric_at(timepos_t const &) const
int set_state_3x(XMLNode const &)
Meters const & meters() const
std::shared_ptr< TempoMap > WritableSharedPtr
BBT_Argument bbt_at(timepos_t const &) const
bool is_initial(TempoPoint const &) const
TempoPoint & set_tempo(Tempo const &t, timepos_t const &time, Beats const &beats)
void replace_bartime(MusicTimePoint &tp, bool with_reset=true)
superclock_t superclock_at(BBT_Argument const &) const
int set_music_times_from_state(XMLNode const &)
Points::const_iterator get_tempo_and_meter(TempoPoint const *&t, MeterPoint const *&m, superclock_t sc, bool can_match, bool ret_iterator_after_not_at) const
Beats quarters_at_sample(samplepos_t sc) const
TempoPoint const & tempo_at(BBT_Argument const &bbt) const
TempoMetric metric_at(superclock_t, bool can_match=true) const
void midi_clock_beat_at_or_after(samplepos_t const pos, samplepos_t &clk_pos, uint32_t &clk_beat) const
TempoMetric metric_at(BBT_Argument const &, bool can_match=true) const
superclock_t reftime(TempoPoint const &, MeterPoint const &) const
MusicTimePoint * core_add_bartime(MusicTimePoint *, bool &)
static int update(WritableSharedPtr m)
samplepos_t sample_at(Beats const &b) const
void get_metrics(Metrics &m) const
Beats bbtwalk_to_quarters(BBT_Argument const &start, BBT_Offset const &distance) const
void core_add_point(Point *)
void grid(TempoMapPoints &points, superclock_t start, superclock_t end, uint32_t bar_mod=0, uint32_t beat_div=1) const
static void set(SharedPtr new_map)
std::shared_ptr< TempoMap const > SharedPtr
TempoMap(Tempo const &initial_tempo, Meter const &initial_meter)
bool clear_tempos_after(timepos_t const &, bool stop_at_music_time)
MeterPoint & set_meter(Meter const &, superclock_t)
MeterPoint const * next_meter(MeterPoint const &) const
MeterPoint & set_meter(Meter const &, timepos_t const &)
XMLNode & get_state() const
void replace_tempo(TempoPoint const &old, Tempo const &thenew, timepos_t const &)
Points::iterator get_tempo_and_meter(TempoPoint *&t, MeterPoint *&m, superclock_t sc, bool can_match, bool ret_iterator_after_not_at)
static PBD::Signal< void()> MapChanged
TempoPoint const * previous_tempo(TempoPoint const &) const
TempoMetric metric_at(Beats const &, bool can_match=true) const
BBT_Argument round_up_to_bar(BBT_Argument const &bbt) const
void reset_section(Points::iterator &begin, Points::iterator &end, superclock_t, TempoMetric &metric)
MeterPoint const & meter_at(BBT_Argument const &bbt) const
static SerializedRCUManager< TempoMap > _map_mgr
int set_tempos_from_state(XMLNode const &)
TempoPoint const & tempo_at(timepos_t const &p) const
double quarters_per_minute_at(timepos_t const &pos) const
Beats quarters_at(BBT_Argument const &) const
BBT_Argument round_to_bar(BBT_Argument const &bbt) const
TempoPoint & set_tempo(Tempo const &, BBT_Argument const &)
void get_grid(GridIterator &iter, TempoMapPoints &ret, superclock_t rstart, superclock_t end, uint32_t bar_mod=0, uint32_t beat_div=1) const
Tempos const & tempos() const
void change_tempo(TempoPoint &, Tempo const &)
TempoMap(TempoMap const &)
TempoMapCutBuffer * cut_copy(timepos_t const &start, timepos_t const &end, bool copy, bool ripple)
TempoMapCutBuffer * cut(timepos_t const &start, timepos_t const &end, bool ripple)
MeterPoint const & meter_at(timepos_t const &p) const
int parse_tempo_state_3x(const XMLNode &node, LegacyTempoState <s)
Beats scwalk_to_quarters(superclock_t pos, superclock_t distance) const
superclock_t superclock_at(timepos_t const &) const
superclock_t superclock_at(Beats const &) const
bool can_remove(MeterPoint const &) const
static void map_assert(bool expr, char const *exprstr, char const *file, int line)
Points::const_iterator get_tempo_and_meter(TempoPoint const *&t, MeterPoint const *&m, Beats const &b, bool can_match, bool ret_iterator_after_not_at) const
bool core_remove_meter(MeterPoint const &)
TempoMapCutBuffer * copy(timepos_t const &start, timepos_t const &end)
Temporal::timecnt_t convert_duration(Temporal::timecnt_t const &duration, Temporal::timepos_t const &, Temporal::TimeDomain domain) const
bool move_meter(MeterPoint const &point, timepos_t const &destination, bool push=false)
BBT_Argument bbt_at(superclock_t sc) const
void reset_starting_at(superclock_t)
void paste(TempoMapCutBuffer const &, timepos_t const &position, bool ripple, std::string=std::string())
void set_bartime(BBT_Time const &, timepos_t const &, std::string name=std::string())
void sample_rate_changed(samplecnt_t new_sr)
bool clear_tempos_before(timepos_t const &, bool stop_at_music_time)
void constant_twist_tempi(TempoPoint &prev, TempoPoint &focus, TempoPoint &next, double tempo_delta)
TempoMap & operator=(TempoMap const &)
void remove_meter(MeterPoint const &, bool with_reset=true)
BBT_Argument bbt_walk(BBT_Argument const &, BBT_Offset const &) const
samplepos_t samples_per_bar(samplecnt_t sr) const
BBT_Argument round_up_to_bar(BBT_Time const &bbt) const
superclock_t superclock_at(Beats const &qn) const
samplepos_t sample_at(Beats const &qn) const
Beats quarters_at(BBT_Time const &bbt) const
TempoPoint const & tempo() const
BBT_Argument round_to_bar(BBT_Time const &bbt) const
MeterPoint const & meter() const
superclock_t superclocks_per_note_type_at_superclock(superclock_t sc) const
superclock_t superclocks_per_note_type() const
superclock_t superclock_at(BBT_Time const &) const
superclock_t superclocks_per_quarter_note() const
BBT_Argument bbt_add(BBT_Time const &bbt, BBT_Offset const &add) const
superclock_t superclocks_per_note_type(int note_type) const
BBT_Argument bbt_at(Beats const &beats) const
MeterPoint & get_editable_meter() const
BBT_Argument bbt_subtract(BBT_Time const &bbt, BBT_Offset const &sub) const
int divisions_per_bar() const
superclock_t end_superclocks_per_note_type() const
TempoMetric(TempoPoint const &t, MeterPoint const &m)
superclock_t superclocks_per_bar() const
Beats quarters_at_superclock(superclock_t sc) const
TempoPoint const * _tempo
TempoPoint & get_editable_tempo() const
Beats quarters_at_sample(samplepos_t sc) const
BBT_Argument bbt_at(timepos_t const &) const
Beats to_quarters(BBT_Offset const &bbo) const
superclock_t superclocks_per_grid() const
MeterPoint const * _meter
superclock_t reftime() const
bool operator==(TempoPoint const &other) const
Beats quarters_at_sample(samplepos_t sc) const
samplepos_t sample_at(Beats const &qn) const
TempoPoint(TempoMap const &map, XMLNode const &)
void compute_omega_from_next_tempo(TempoPoint const &next_tempo)
superclock_t superclock_at(Beats const &qn) const
XMLNode & get_state() const
TempoPoint(Tempo const &t, Point const &p)
double note_types_per_minute_at_DOUBLE(timepos_t const &pos) const
bool actually_ramped() const
bool operator!=(TempoPoint const &other) const
void compute_omega_from_quarter_duration(Beats const &quarter_duration, superclock_t end_scpqn)
void compute_omega_from_distance_and_next_tempo(Beats const &quarter_duration, TempoPoint const &next_tempo)
TempoPoint(TempoMap const &map, Tempo const &t, superclock_t sc, Beats const &b, BBT_Time const &bbt)
int set_state(XMLNode const &, int version)
Beats quarters_at_superclock(superclock_t sc) const
superclock_t superclocks_per_note_type_at(timepos_t const &) const
TempoPoint & operator=(Tempo const &t)
bool operator!=(Tempo const &other) const
double samples_per_quarter_note(int sr) const
void set_locked_to_meter(bool yn)
Tempo(double npm, double enpm, int8_t note_type)
double note_types_per_minute() const
superclock_t superclocks_per_quarter_note() const
superclock_t _superclocks_per_note_type
double end_note_types_per_minute() const
double samples_per_note_type(int sr) const
static std::string xml_node_name
superclock_t superclocks_per_note_type() const
int set_state(XMLNode const &, int version)
superclock_t end_superclocks_per_note_type() const
bool operator==(Tempo const &other) const
double quarter_notes_per_minute() const
superclock_t superclocks_per_note_type(int note_type) const
void set_note_types_per_minute(double npm)
Tempo(double npm, int8_t note_type)
superclock_t end_superclocks_per_note_type(int note_type) const
superclock_t _end_superclocks_per_note_type
XMLNode & get_state() const
superclock_t end_superclocks_per_quarter_note() const
static superclock_t double_npm_to_scpn(double npm)
void set_continuing(bool yn)
bool locked_to_meter() const
static timepos_t from_superclock(superclock_t s)
GtkImageIconNameData name
PBD::PropertyDescriptor< timepos_t > start
Temporal::timepos_t timepos_t
void add(const Gtk::StockItem &item)
int64_t muldiv_round(int64_t v, int64_t n, int64_t d)
static superclock_t superclock_to_samples(superclock_t s, int sr)
boost::intrusive::list_base_hook< boost::intrusive::tag< struct point_tag > > point_hook
boost::intrusive::list_base_hook< boost::intrusive::tag< struct tempo_tag > > tempo_hook
std::vector< TempoMapPoint > TempoMapPoints
boost::intrusive::list< Point, boost::intrusive::base_hook< point_hook > > Points
boost::intrusive::list< TempoPoint, boost::intrusive::base_hook< tempo_hook > > Tempos
static superclock_t samples_to_superclock(int64_t samples, int sr)
static superclock_t superclock_ticks_per_second()
boost::intrusive::list_base_hook< boost::intrusive::tag< struct bartime_tag > > bartime_hook
boost::intrusive::list< MeterPoint, boost::intrusive::base_hook< meter_hook > > Meters
boost::intrusive::list_base_hook< boost::intrusive::tag< struct meterpoint_tag > > meter_hook
boost::intrusive::list< MusicTimePoint, boost::intrusive::base_hook< bartime_hook > > MusicTimes
void push(lua_State *L, T t)
bool operator==(const ProcessorSelection &a, const ProcessorSelection &b)
superclock_t reference() const
virtual const char * what() const
double note_types_per_minute
double end_note_types_per_minute
TempoPoint const * tempo_point_type
MeterPoint const * meter_point_type
Points::const_iterator iterator_type
TempoPoint * tempo_point_type
Points::iterator iterator_type
MeterPoint * meter_point_type
#define TEMPORAL_SAMPLE_RATE