13
0

Tempo ramps - multiple audio-locked meters are go.

- more or less
This commit is contained in:
nick_m 2016-03-31 06:45:44 +11:00
parent b341e6cfaa
commit 094aa816df

View File

@ -1262,10 +1262,11 @@ TempoMap::recompute_meters (Metrics& metrics)
double pulse = 0.0; double pulse = 0.0;
pair<double, BBT_Time> b_bbt; pair<double, BBT_Time> b_bbt;
if (meter->movable()) { if (meter->movable()) {
const double beats = ((pulse_at_frame_locked (metrics, meter->frame()) - prev_m->pulse()) * prev_m->note_divisor()) - prev_m->beat(); double beats = ((pulse_at_frame_locked (metrics, meter->frame()) - prev_m->pulse()) * prev_m->note_divisor()) - prev_m->beat();
b_bbt = make_pair (ceil (beats), BBT_Time (accumulated_bars + 1, 1, 0)); double ceil_beats = beats + prev_m->divisions_per_bar() - fmod (beats, prev_m->divisions_per_bar());
const double true_pulse = prev_m->pulse() + (ceil (beats) - prev_m->beat()) / prev_m->note_divisor(); const double true_pulse = prev_m->pulse() + (ceil_beats - prev_m->beat()) / prev_m->note_divisor();
const double pulse_off = true_pulse - ((beats - prev_m->beat()) / prev_m->note_divisor()); const double pulse_off = true_pulse - ((beats - prev_m->beat()) / prev_m->note_divisor());
b_bbt = make_pair (ceil_beats, BBT_Time (accumulated_bars + 1, 1, 0));
pulse = true_pulse - pulse_off; pulse = true_pulse - pulse_off;
} else { } else {
b_bbt = make_pair (0.0, BBT_Time (1, 1, 0)); b_bbt = make_pair (0.0, BBT_Time (1, 1, 0));
@ -2014,16 +2015,15 @@ TempoMap::solve_map (Metrics& imaginary, MeterSection* section, const Meter& mt,
if (m == section){ if (m == section){
/* /*
here we set the beat for this frame. here we set the beat for this frame.
we're going to set it 'incorrectly' to the next integer and use this difference we set it 'incorrectly' to the next bar's beat
to find the meter's pulse. and use this difference to find the meter's pulse.
(meters should fall on integral beats to keep us sane)
XXX do it to the bar, you fool, not the beat! - and don't forget to recompute_meters that way too.
*/ */
double pulse = 0.0; double pulse = 0.0;
pair<double, BBT_Time> b_bbt; pair<double, BBT_Time> b_bbt;
if (m->movable()) { if (m->movable()) {
double beats = ((pulse_at_frame_locked (imaginary, frame) - prev_ms->pulse()) * prev_ms->note_divisor()) - prev_ms->beat(); double beats = ((pulse_at_frame_locked (imaginary, frame) - prev_ms->pulse()) * prev_ms->note_divisor()) - prev_ms->beat();
b_bbt = make_pair (ceil (beats), BBT_Time (accumulated_bars + 1, 1, 0)); double ceil_beats = beats + prev_ms->divisions_per_bar() - fmod (beats, prev_ms->divisions_per_bar());
b_bbt = make_pair (ceil_beats, BBT_Time (accumulated_bars + 1, 1, 0));
const double true_pulse = prev_ms->pulse() + ((ceil (beats) - prev_ms->beat()) / prev_ms->note_divisor()); const double true_pulse = prev_ms->pulse() + ((ceil (beats) - prev_ms->beat()) / prev_ms->note_divisor());
const double pulse_off = true_pulse - ((beats - prev_ms->beat()) / prev_ms->note_divisor()); const double pulse_off = true_pulse - ((beats - prev_ms->beat()) / prev_ms->note_divisor());
pulse = true_pulse - pulse_off; pulse = true_pulse - pulse_off;
@ -2044,10 +2044,11 @@ TempoMap::solve_map (Metrics& imaginary, MeterSection* section, const Meter& mt,
double pulse = 0.0; double pulse = 0.0;
pair<double, BBT_Time> b_bbt; pair<double, BBT_Time> b_bbt;
if (m->movable()) { if (m->movable()) {
const double beats = ((pulse_at_frame_locked (imaginary, m->frame()) - prev_ms->pulse()) * prev_ms->note_divisor()) - prev_ms->beat(); double beats = ((pulse_at_frame_locked (imaginary, m->frame()) - prev_ms->pulse()) * prev_ms->note_divisor()) - prev_ms->beat();
double ceil_beats = beats + prev_ms->divisions_per_bar() - fmod (beats , prev_ms->divisions_per_bar());
const double true_pulse = prev_ms->pulse() + (m->beat() - prev_ms->beat()) / prev_ms->note_divisor(); const double true_pulse = prev_ms->pulse() + (m->beat() - prev_ms->beat()) / prev_ms->note_divisor();
const double pulse_off = true_pulse - ((beats - prev_ms->beat()) / prev_ms->note_divisor()); const double pulse_off = true_pulse - ((ceil_beats - prev_ms->beat()) / prev_ms->note_divisor());
b_bbt = make_pair (ceil (beats), BBT_Time (accumulated_bars + 1, 1, 0)); b_bbt = make_pair (ceil_beats, BBT_Time (accumulated_bars + 1, 1, 0));
pulse = true_pulse - pulse_off; pulse = true_pulse - pulse_off;
} else { } else {
b_bbt = make_pair (0.0, BBT_Time (1, 1, 0)); b_bbt = make_pair (0.0, BBT_Time (1, 1, 0));
@ -2102,11 +2103,20 @@ TempoMap::solve_map (Metrics& imaginary, MeterSection* section, const Meter& mt,
m->set_frame (frame_at_pulse_locked (imaginary, pulse)); m->set_frame (frame_at_pulse_locked (imaginary, pulse));
m->set_pulse (pulse); m->set_pulse (pulse);
} else { } else {
if (!m->movable()) { double pulse = 0.0;
pair<double, BBT_Time> b_bbt = make_pair (0.0, BBT_Time (1, 1, 0)); pair<double, BBT_Time> b_bbt;
m->set_beat (b_bbt); if (m->movable()) {
double beats = ((pulse_at_frame_locked (imaginary, m->frame()) - prev_ms->pulse()) * prev_ms->note_divisor()) - prev_ms->beat();
double ceil_beats = beats + prev_ms->divisions_per_bar() - fmod (beats , prev_ms->divisions_per_bar());
const double true_pulse = prev_ms->pulse() + (m->beat() - prev_ms->beat()) / prev_ms->note_divisor();
const double pulse_off = true_pulse - ((ceil_beats - prev_ms->beat()) / prev_ms->note_divisor());
b_bbt = make_pair (ceil_beats, BBT_Time (accumulated_bars + 1, 1, 0));
pulse = true_pulse - pulse_off;
} else {
b_bbt = make_pair (0.0, BBT_Time (1, 1, 0));
pulse = 0.0;
} }
const double pulse = prev_ms->pulse() + (m->beat() - prev_ms->beat()) / prev_ms->note_divisor(); m->set_beat (b_bbt);
m->set_pulse (pulse); m->set_pulse (pulse);
} }
} }