13
0

fix LV2 BPM report (use ramped tempo)

This commit is contained in:
Robin Gareus 2016-08-17 17:02:56 +02:00
parent 6bf40e3a44
commit b3cec2716e

View File

@ -2276,6 +2276,7 @@ write_position(LV2_Atom_Forge* forge,
const TempoMetric& t, const TempoMetric& t,
Timecode::BBT_Time& bbt, Timecode::BBT_Time& bbt,
double speed, double speed,
double bpm,
framepos_t position, framepos_t position,
framecnt_t offset) framecnt_t offset)
{ {
@ -2300,7 +2301,7 @@ write_position(LV2_Atom_Forge* forge,
lv2_atom_forge_key(forge, urids.time_beatsPerBar); lv2_atom_forge_key(forge, urids.time_beatsPerBar);
lv2_atom_forge_float(forge, t.meter().divisions_per_bar()); lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
lv2_atom_forge_key(forge, urids.time_beatsPerMinute); lv2_atom_forge_key(forge, urids.time_beatsPerMinute);
lv2_atom_forge_float(forge, t.tempo().beats_per_minute()); lv2_atom_forge_float(forge, bpm);
#else #else
lv2_atom_forge_blank(forge, &frame, 1, urids.time_Position); lv2_atom_forge_blank(forge, &frame, 1, urids.time_Position);
lv2_atom_forge_property_head(forge, urids.time_frame, 0); lv2_atom_forge_property_head(forge, urids.time_frame, 0);
@ -2317,7 +2318,7 @@ write_position(LV2_Atom_Forge* forge,
lv2_atom_forge_property_head(forge, urids.time_beatsPerBar, 0); lv2_atom_forge_property_head(forge, urids.time_beatsPerBar, 0);
lv2_atom_forge_float(forge, t.meter().divisions_per_bar()); lv2_atom_forge_float(forge, t.meter().divisions_per_bar());
lv2_atom_forge_property_head(forge, urids.time_beatsPerMinute, 0); lv2_atom_forge_property_head(forge, urids.time_beatsPerMinute, 0);
lv2_atom_forge_float(forge, t.tempo().beats_per_minute()); lv2_atom_forge_float(forge, bpm);
#endif #endif
LV2_Evbuf_Iterator end = lv2_evbuf_end(buf); LV2_Evbuf_Iterator end = lv2_evbuf_end(buf);
@ -2346,7 +2347,7 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
} }
if (_bpm_control_port) { if (_bpm_control_port) {
*_bpm_control_port = tmetric.tempo().beats_per_minute(); *_bpm_control_port = tmap.tempo_at_frame (start).beats_per_minute();
} }
#ifdef LV2_EXTENDED #ifdef LV2_EXTENDED
@ -2418,26 +2419,18 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
if (valid && (flags & PORT_INPUT)) { if (valid && (flags & PORT_INPUT)) {
if ((flags & PORT_POSITION)) { if ((flags & PORT_POSITION)) {
Timecode::BBT_Time bbt (tmap.bbt_at_frame (start)); Timecode::BBT_Time bbt (tmap.bbt_at_frame (start));
double bpm = tmetric.tempo().beats_per_minute(); double bpm = tmap.tempo_at_frame (start).beats_per_minute();
double beatpos = (bbt.bars - 1) * tmetric.meter().divisions_per_bar() double beatpos = (bbt.bars - 1) * tmetric.meter().divisions_per_bar()
+ (bbt.beats - 1) + (bbt.beats - 1)
+ (bbt.ticks / Timecode::BBT_Time::ticks_per_beat); + (bbt.ticks / Timecode::BBT_Time::ticks_per_beat);
beatpos *= tmetric.meter().note_divisor() / 4.0; beatpos *= tmetric.meter().note_divisor() / 4.0;
#if 0 // DEBUG
// XXX BUG beats_per_minute() is most recent fixed tempo -- not ramped
printf("POS:%ld <> %ld SPD: %f <> %f BBT: %f <> %f BPM: %f <> %f\n",
start, _next_cycle_start,
speed, _next_cycle_speed,
beatpos, _next_cycle_beat,
bpm, _current_bpm);
#endif
if (start != _next_cycle_start || if (start != _next_cycle_start ||
speed != _next_cycle_speed || speed != _next_cycle_speed ||
rint (1000 * beatpos) != rint(1000 * _next_cycle_beat) || rint (1000 * beatpos) != rint(1000 * _next_cycle_beat) ||
bpm != _current_bpm) { bpm != _current_bpm) {
// Transport or Tempo has changed, write position at cycle start // Transport or Tempo has changed, write position at cycle start
write_position(&_impl->forge, _ev_buffers[port_index], write_position(&_impl->forge, _ev_buffers[port_index],
tmetric, bbt, speed, start, 0); tmetric, bbt, speed, bpm, start, 0);
} }
} }
@ -2468,8 +2461,9 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
tmetric.set_metric(metric); tmetric.set_metric(metric);
Timecode::BBT_Time bbt; Timecode::BBT_Time bbt;
bbt = tmap.bbt_at_pulse (metric->pulse()); bbt = tmap.bbt_at_pulse (metric->pulse());
double bpm = tmap.tempo_at_frame (start/*XXX*/).beats_per_minute();
write_position(&_impl->forge, _ev_buffers[port_index], write_position(&_impl->forge, _ev_buffers[port_index],
tmetric, bbt, speed, tmetric, bbt, speed, bpm,
metric->frame(), metric->frame(),
metric->frame() - start); metric->frame() - start);
++metric_i; ++metric_i;
@ -2729,7 +2723,7 @@ LV2Plugin::connect_and_run(BufferSet& bufs,
* so it needs to be realative to that. * so it needs to be realative to that.
*/ */
TempoMetric t = tmap.metric_at(start); TempoMetric t = tmap.metric_at(start);
_current_bpm = t.tempo().beats_per_minute(); _current_bpm = tmap.tempo_at_frame (start).beats_per_minute();
Timecode::BBT_Time bbt (tmap.bbt_at_frame (start)); Timecode::BBT_Time bbt (tmap.bbt_at_frame (start));
double beatpos = (bbt.bars - 1) * t.meter().divisions_per_bar() double beatpos = (bbt.bars - 1) * t.meter().divisions_per_bar()
+ (bbt.beats - 1) + (bbt.beats - 1)