Tempo ramps - fix up previous commit.
This commit is contained in:
parent
e2330739ed
commit
1d85229500
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user