_end_note_types_per_minute = _note_types_per_minute;
_legacy_end = true;
}
+ } else {
+ _legacy_end = true;
+ }
+
+ if ((prop = node.property ("tempo-type")) != 0) {
+ TempoSection::Type old_type;
+
+ old_type = Type (string_2_enum (prop->value(), old_type));
+ if (old_type == TempoSection::Constant) {
+ _end_note_types_per_minute = _note_types_per_minute;
+ }
}
if ((prop = node.property ("movable")) == 0) {
if (prev_t) {
const double prev_t_bpm = prev_t->note_types_per_minute();
const double prev_t_end_bpm = prev_t->end_note_types_per_minute();
- if (prev_t_bpm > tempo_bpm && prev_t_end_bpm < tempo_bpm
- || prev_t_bpm < tempo_bpm && prev_t_end_bpm > tempo_bpm
- || prev_t_end_bpm == tempo_bpm) {
+ if ((prev_t_bpm > tempo_bpm && prev_t_end_bpm < tempo_bpm)
+ || (prev_t_bpm < tempo_bpm && prev_t_end_bpm > tempo_bpm)
+ || (prev_t_end_bpm == tempo_bpm)) {
return prev_t->minute_at_ntpm (tempo_bpm, t->pulse());
}
return *prev_t;
}
+TempoSection*
+TempoMap::next_tempo_section (TempoSection* ts) const
+{
+ if (!ts) {
+ return 0;
+ }
+
+ Glib::Threads::RWLock::ReaderLock lm (lock);
+
+ TempoSection* prev = 0;
+
+ for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+
+ if ((*i)->is_tempo()) {
+ TempoSection* t = static_cast<TempoSection*> (*i);
+
+ if (!t->active()) {
+ continue;
+ }
+
+ if (prev && prev == ts) {
+
+ return t;
+ }
+
+ prev = t;
+ }
+ }
+
+ if (prev == 0) {
+ fatal << endmsg;
+ abort(); /*NOTREACHED*/
+ }
+
+ return 0;
+}
/* don't use this to calculate length (the tempo is only correct for this frame).
do that stuff based on the beat_at_frame and frame_at_beat api
*/
}
if (prev_t) {
- if (prev_t->type() == TempoSection::Ramp) {
+ if (prev_t->type() != TempoSection::Constant) {
prev_t->set_end_note_types_per_minute (t->note_types_per_minute());
- } else {
- prev_t->set_end_note_types_per_minute (prev_t->note_types_per_minute());
}
}