mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-17 04:06:26 +01:00
temporal: fixes for TempoMap::move_meter()
This commit is contained in:
parent
60db5a827f
commit
192b2fd839
2 changed files with 26 additions and 9 deletions
|
|
@ -1251,7 +1251,7 @@ TempoMap::reset_starting_at (superclock_t sc)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
TempoMap::move_meter (MeterPoint const & mp, timepos_t const & when, bool push)
|
TempoMap::move_meter (MeterPoint const & mp, timepos_t const & when, bool earlier, bool push)
|
||||||
{
|
{
|
||||||
assert (!_tempos.empty());
|
assert (!_tempos.empty());
|
||||||
assert (!_meters.empty());
|
assert (!_meters.empty());
|
||||||
|
|
@ -1268,10 +1268,10 @@ TempoMap::move_meter (MeterPoint const & mp, timepos_t const & when, bool push)
|
||||||
|
|
||||||
beats = when.beats ();
|
beats = when.beats ();
|
||||||
|
|
||||||
if (beats > mp.beats ()) {
|
if (earlier) {
|
||||||
round_up = true;
|
|
||||||
} else {
|
|
||||||
round_up = false;
|
round_up = false;
|
||||||
|
} else {
|
||||||
|
round_up = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do not allow moving a meter marker to the same position as
|
/* Do not allow moving a meter marker to the same position as
|
||||||
|
|
@ -1284,21 +1284,38 @@ TempoMap::move_meter (MeterPoint const & mp, timepos_t const & when, bool push)
|
||||||
/* meter changes must be on bar */
|
/* meter changes must be on bar */
|
||||||
for (t = _tempos.begin(), prev_t = _tempos.end(); t != _tempos.end() && t->beats() < beats; ++t) { prev_t = t; }
|
for (t = _tempos.begin(), prev_t = _tempos.end(); t != _tempos.end() && t->beats() < beats; ++t) { prev_t = t; }
|
||||||
for (m = _meters.begin(), prev_m = _meters.end(); m != _meters.end() && m->beats() < beats && *m != mp; ++m) { prev_m = m; }
|
for (m = _meters.begin(), prev_m = _meters.end(); m != _meters.end() && m->beats() < beats && *m != mp; ++m) { prev_m = m; }
|
||||||
assert (prev_m != _meters.end());
|
|
||||||
if (prev_t == _tempos.end()) { prev_t = _tempos.begin(); }
|
if (prev_m == _meters.end()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prev_t == _tempos.end()) {
|
||||||
|
prev_t = _tempos.begin();
|
||||||
|
}
|
||||||
|
|
||||||
TempoMetric metric (*prev_t, *prev_m);
|
TempoMetric metric (*prev_t, *prev_m);
|
||||||
bbt = metric.bbt_at (beats);
|
bbt = metric.bbt_at (beats);
|
||||||
|
|
||||||
if (round_up) {
|
if (round_up) {
|
||||||
bbt = metric.meter().round_up_to_bar (bbt);
|
bbt = metric.meter().round_up_to_bar (bbt);
|
||||||
} else {
|
} else {
|
||||||
bbt = metric.meter().round_down_to_bar (bbt);
|
bbt = metric.meter().round_down_to_bar (bbt);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (t = _tempos.begin(), prev_t = _tempos.end(); t != _tempos.end() && t->bbt() < bbt; ++t) { prev_t = t; }
|
for (t = _tempos.begin(), prev_t = _tempos.end(); t != _tempos.end() && t->bbt() < bbt; ++t) { prev_t = t; }
|
||||||
for (m = _meters.begin(), prev_m = _meters.end(); m != _meters.end() && m->bbt() < bbt && *m != mp; ++m) { prev_m = m; }
|
for (m = _meters.begin(), prev_m = _meters.end(); m != _meters.end() && m->bbt() < bbt && *m != mp; ++m) { prev_m = m; }
|
||||||
assert (prev_m != _meters.end());
|
|
||||||
if (prev_t == _tempos.end()) { prev_t = _tempos.begin(); }
|
if (prev_m == _meters.end()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prev_t == _tempos.end()) {
|
||||||
|
prev_t = _tempos.begin();
|
||||||
|
}
|
||||||
|
|
||||||
metric = TempoMetric (*prev_t, *prev_m);
|
metric = TempoMetric (*prev_t, *prev_m);
|
||||||
beats = metric.quarters_at (bbt);
|
beats = metric.quarters_at (bbt);
|
||||||
|
|
||||||
for (m = _meters.begin(), prev_m = _meters.end(); m != _meters.end(); ++m) {
|
for (m = _meters.begin(), prev_m = _meters.end(); m != _meters.end(); ++m) {
|
||||||
if (&*m != &mp) {
|
if (&*m != &mp) {
|
||||||
if (m->beats() == beats) {
|
if (m->beats() == beats) {
|
||||||
|
|
|
||||||
|
|
@ -719,7 +719,7 @@ class /*LIBTEMPORAL_API*/ TempoMap : public PBD::StatefulDestructible
|
||||||
|
|
||||||
/* these are a convenience method that just wrap some odd semantics */
|
/* these are a convenience method that just wrap some odd semantics */
|
||||||
LIBTEMPORAL_API bool move_tempo (TempoPoint const & point, timepos_t const & destination, bool push = false);
|
LIBTEMPORAL_API bool move_tempo (TempoPoint const & point, timepos_t const & destination, bool push = false);
|
||||||
LIBTEMPORAL_API bool move_meter (MeterPoint const & point, timepos_t const & destination, bool push = false);
|
LIBTEMPORAL_API bool move_meter (MeterPoint const & point, timepos_t const & destination, bool earlier, bool push = false);
|
||||||
|
|
||||||
LIBTEMPORAL_API int set_state (XMLNode const&, int version);
|
LIBTEMPORAL_API int set_state (XMLNode const&, int version);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue