13
0

Tempo ramps - fix up previous commit.

This commit is contained in:
nick_m 2016-05-27 04:17:49 +10:00
parent e2330739ed
commit 1d85229500

View File

@ -219,14 +219,14 @@ TempoSection::tempo_at_frame (const framepos_t& f, const framecnt_t& frame_rate)
/** returns the zero-based frame (relative to session) /** returns the zero-based frame (relative to session)
where the tempo in whole pulses per minute occurs in this section. where the tempo in whole pulses per minute occurs in this section.
beat b is only used for constant tempos. pulse p is only used for constant tempos.
note that the tempo map may have multiple such values. note that the tempo map may have multiple such values.
*/ */
framepos_t framepos_t
TempoSection::frame_at_tempo (const double& ppm, const double& b, const framecnt_t& frame_rate) const TempoSection::frame_at_tempo (const double& ppm, const double& p, const framecnt_t& frame_rate) const
{ {
if (_type == Constant || _c_func == 0.0) { if (_type == Constant || _c_func == 0.0) {
return ((b - pulse()) * frames_per_pulse (frame_rate)) + frame(); return ((p - pulse()) * frames_per_pulse (frame_rate)) + frame();
} }
return minute_to_frame (time_at_pulse_tempo (ppm), frame_rate) + frame(); return minute_to_frame (time_at_pulse_tempo (ppm), frame_rate) + frame();
@ -1612,7 +1612,8 @@ TempoMap::tempo_at_frame_locked (const Metrics& metrics, const framepos_t& frame
return ret_tempo; return ret_tempo;
} }
/** returns the frame at which the supplied tempo occurs, or 0. /** returns the frame at which the supplied tempo occurs, or
* the frame of the last tempo section (search exhausted)
* only the position of the first occurence will be returned * only the position of the first occurence will be returned
* (extend me) * (extend me)
*/ */
@ -1628,25 +1629,37 @@ framepos_t
TempoMap::frame_at_tempo_locked (const Metrics& metrics, const Tempo& tempo) const TempoMap::frame_at_tempo_locked (const Metrics& metrics, const Tempo& tempo) const
{ {
TempoSection* prev_t = 0; TempoSection* prev_t = 0;
const double tempo_ppm = tempo.beats_per_minute() / tempo.note_type();
Metrics::const_iterator i; Metrics::const_iterator i;
for (i = _metrics.begin(); i != _metrics.end(); ++i) { for (i = _metrics.begin(); i != _metrics.end(); ++i) {
TempoSection* t; TempoSection* t;
if ((t = dynamic_cast<TempoSection*> (*i)) != 0) { if ((t = dynamic_cast<TempoSection*> (*i)) != 0) {
if (!t->active()) { if (!t->active()) {
continue; continue;
} }
if ((prev_t) && t->beats_per_minute() / t->note_type() > tempo.beats_per_minute() / tempo.note_type()) {
/* t has a greater tempo */ const double t_ppm = t->beats_per_minute() / t->note_type();
const framepos_t ret_frame = prev_t->frame_at_tempo (tempo.beats_per_minute() / tempo.note_type(), 1.0, _frame_rate);
return ret_frame; if (t_ppm == tempo_ppm) {
return t->frame();
}
if (prev_t) {
const double prev_t_ppm = prev_t->beats_per_minute() / prev_t->note_type();
if ((t_ppm > tempo_ppm && prev_t_ppm < tempo_ppm) || (t_ppm < tempo_ppm && prev_t_ppm > tempo_ppm)) {
const framepos_t ret_frame = prev_t->frame_at_tempo (tempo_ppm, prev_t->pulse(), _frame_rate);
return ret_frame;
}
} }
prev_t = t; prev_t = t;
} }
} }
return 0; return prev_t->frame();
} }