13
0

libtemporal: MusicTimePoint now IS-A Point,Tempo and Meter, all at once

This commit is contained in:
Paul Davis 2021-02-06 22:09:16 -07:00
parent cc0d065443
commit d6d0eb0d9e
2 changed files with 23 additions and 10 deletions

View File

@ -435,8 +435,8 @@ TempoPoint::get_state () const
}
TempoPoint::TempoPoint (TempoMap const & map, XMLNode const & node)
: Tempo (node)
, Point (map, node)
: Point (map, node)
, Tempo (node)
, _omega (0)
{
}
@ -527,8 +527,8 @@ TempoPoint::quarters_at_superclock (superclock_t sc) const
}
MeterPoint::MeterPoint (TempoMap const & map, XMLNode const & node)
: Meter (node)
, Point (map, node)
: Point (map, node)
, Meter (node)
{
}
@ -596,6 +596,8 @@ TempoMetric::superclock_at (BBT_Time const & bbt) const
MusicTimePoint::MusicTimePoint (TempoMap const & map, XMLNode const & node)
: Point (map, node)
, TempoPoint (map, node)
, MeterPoint (map, node)
{
}
@ -626,7 +628,7 @@ TempoMap::TempoMap (Tempo const & initial_tempo, Meter const & initial_meter)
{
TempoPoint* tp = new TempoPoint (*this, initial_tempo, 0, Beats(), BBT_Time());
MeterPoint* mp = new MeterPoint (*this, initial_meter, 0, Beats(), BBT_Time());
MusicTimePoint* mtp = new MusicTimePoint (*this, 0, Beats(), BBT_Time());
MusicTimePoint* mtp = new MusicTimePoint (*this, 0, Beats(), BBT_Time(), *tp, *mp);
_tempos.push_back (*tp);
_meters.push_back (*mp);
@ -887,7 +889,7 @@ TempoMap::set_bartime (BBT_Time const & bbt, timepos_t const & pos)
superclock_t sc (pos.superclocks());
TempoMetric metric (metric_at (sc));
MusicTimePoint* tp = new MusicTimePoint (bbt, Point (*this, sc, metric.quarters_at_superclock (sc), bbt));
MusicTimePoint* tp = new MusicTimePoint (*this, sc, metric.quarters_at_superclock (sc), bbt, metric.tempo(), metric.meter());
ret = add_or_replace_bartime (*tp);
@ -2014,6 +2016,16 @@ std::operator<<(std::ostream& str, TempoPoint const & t)
return str;
}
std::ostream&
std::operator<<(std::ostream& str, MusicTimePoint const & p)
{
str << "MP@";
str << *((Point*) &p);
str << *((Tempo*) &p);
str << *((Meter*) &p);
return str;
}
std::ostream&
std::operator<<(std::ostream& str, TempoMetric const & tm)
{
@ -2516,7 +2528,7 @@ TempoMap::insert_time (timepos_t const & pos, timecnt_t const & duration)
TempoPoint current_tempo = *t;
MeterPoint current_meter = *m;
MusicTimePoint current_time_point (*this, 0, Beats(), BBT_Time());
MusicTimePoint current_time_point (*this, 0, Beats(), BBT_Time(), current_tempo, current_meter);
if (_bartimes.size() > 0) {
current_time_point = *b;

View File

@ -516,11 +516,11 @@ class LIBTEMPORAL_API TempoMetric {
* position is given by a Point that might use superclock or Beats, and the
* Point's BBT time member is overwritten.
*/
class LIBTEMPORAL_API MusicTimePoint : public virtual Point
class LIBTEMPORAL_API MusicTimePoint : public virtual TempoPoint, public virtual MeterPoint
{
public:
MusicTimePoint (TempoMap const & map, superclock_t sc, Beats const & b, BBT_Time const & bbt) : Point (map, sc, b, bbt) {}
MusicTimePoint (BBT_Time const & bbt_time, Point const & p) : Point (p) { _bbt = bbt_time; }
MusicTimePoint (TempoMap const & map, superclock_t sc, Beats const & b, BBT_Time const & bbt, Tempo const & t, Meter const & m) : Point (map, sc, b, bbt), TempoPoint (t, *this), MeterPoint (m, *this) {}
// MusicTimePoint (BBT_Time const & bbt_time, Point const & p) : Point (p), TempoPoint (p.map().tempo_at (p.sclock()), p), MeterPoint (p.map().meter_at (p.sclock()), p) { _bbt = bbt_time; }
MusicTimePoint (TempoMap const & map, XMLNode const &);
boost::intrusive::list_member_hook<> _bartime_hook;
@ -867,6 +867,7 @@ std::ostream& operator<<(std::ostream& str, Temporal::Meter const &);
std::ostream& operator<<(std::ostream& str, Temporal::Point const &);
std::ostream& operator<<(std::ostream& str, Temporal::TempoPoint const &);
std::ostream& operator<<(std::ostream& str, Temporal::MeterPoint const &);
std::ostream& operator<<(std::ostream& str, Temporal::MusicTimePoint const &);
std::ostream& operator<<(std::ostream& str, Temporal::TempoMetric const &);
}