rename Region pulse to pos_beats. use new beat distance api where required.

- add more debugging output detecting regions whose
	  beat and frame position do not align on a playlist.
	  this is required as a check as we have never used
	  frame rounding on constant tempi before 8884a5723dc
This commit is contained in:
nick_m 2016-10-31 00:01:02 +11:00
parent ac23496b40
commit dca96d8b5d
8 changed files with 56 additions and 46 deletions

View file

@ -5592,7 +5592,7 @@ NoteDrag::total_dx (const guint state) const
frameoffset_t const dx = _editor->pixel_to_sample (_drags->current_pointer_x() - grab_x()); frameoffset_t const dx = _editor->pixel_to_sample (_drags->current_pointer_x() - grab_x());
/* primary note time */ /* primary note time */
double const quarter_note_start = (_region->region()->pulse() * 4.0) - _region->midi_region()->start_beats(); double const quarter_note_start = _region->region()->pos_beats() - _region->midi_region()->start_beats();
frameoffset_t const n = map.frame_at_quarter_note (quarter_note_start + _primary->note()->time().to_double()); frameoffset_t const n = map.frame_at_quarter_note (quarter_note_start + _primary->note()->time().to_double());
/* new time of the primary note in session frames */ /* new time of the primary note in session frames */

View file

@ -1711,7 +1711,7 @@ MidiRegionView::update_sustained (Note* ev, bool update_ghost_regions)
const boost::shared_ptr<ARDOUR::MidiRegion> mr = midi_region(); const boost::shared_ptr<ARDOUR::MidiRegion> mr = midi_region();
boost::shared_ptr<NoteType> note = ev->note(); boost::shared_ptr<NoteType> note = ev->note();
const double session_source_start = (_region->pulse() * 4.0) - mr->start_beats(); const double session_source_start = _region->pos_beats() - mr->start_beats();
const framepos_t note_start_frames = map.frame_at_quarter_note (note->time().to_double() + session_source_start) - _region->position(); const framepos_t note_start_frames = map.frame_at_quarter_note (note->time().to_double() + session_source_start) - _region->position();
const double x0 = trackview.editor().sample_to_pixel (note_start_frames); const double x0 = trackview.editor().sample_to_pixel (note_start_frames);
@ -1779,7 +1779,7 @@ MidiRegionView::update_hit (Hit* ev, bool update_ghost_regions)
{ {
boost::shared_ptr<NoteType> note = ev->note(); boost::shared_ptr<NoteType> note = ev->note();
const double note_time_qn = note->time().to_double() + ((_region->pulse() * 4.0) - midi_region()->start_beats()); const double note_time_qn = note->time().to_double() + (_region->pos_beats() - midi_region()->start_beats());
const framepos_t note_start_frames = trackview.session()->tempo_map().frame_at_quarter_note (note_time_qn) - _region->position(); const framepos_t note_start_frames = trackview.session()->tempo_map().frame_at_quarter_note (note_time_qn) - _region->position();
const double x = trackview.editor().sample_to_pixel(note_start_frames); const double x = trackview.editor().sample_to_pixel(note_start_frames);
@ -2595,7 +2595,7 @@ MidiRegionView::note_dropped(NoteBase *, frameoffset_t dt, int8_t dnote)
for (Selection::iterator i = _selection.begin(); i != _selection.end() ; ++i) { for (Selection::iterator i = _selection.begin(); i != _selection.end() ; ++i) {
double const start_qn = (_region->pulse() * 4.0) - midi_region()->start_beats(); double const start_qn = _region->pos_beats() - midi_region()->start_beats();
framepos_t new_frames = map.frame_at_quarter_note (start_qn + (*i)->note()->time().to_double()) + dt; framepos_t new_frames = map.frame_at_quarter_note (start_qn + (*i)->note()->time().to_double()) + dt;
Evoral::Beats new_time = Evoral::Beats (map.quarter_note_at_frame (new_frames) - start_qn); Evoral::Beats new_time = Evoral::Beats (map.quarter_note_at_frame (new_frames) - start_qn);
if (new_time < 0) { if (new_time < 0) {
@ -2922,7 +2922,7 @@ MidiRegionView::commit_resizing (NoteBase* primary, bool at_front, double delta_
/* and then to beats */ /* and then to beats */
const double e_qaf = tmap.exact_qn_at_frame (current_fr + midi_region()->position(), divisions); const double e_qaf = tmap.exact_qn_at_frame (current_fr + midi_region()->position(), divisions);
const double quarter_note_start = (_region->pulse() * 4.0) - midi_region()->start_beats(); const double quarter_note_start = _region->pos_beats() - midi_region()->start_beats();
const Evoral::Beats x_beats = Evoral::Beats (e_qaf - quarter_note_start); const Evoral::Beats x_beats = Evoral::Beats (e_qaf - quarter_note_start);
if (at_front && x_beats < canvas_note->note()->end_time()) { if (at_front && x_beats < canvas_note->note()->end_time()) {
@ -4149,7 +4149,7 @@ MidiRegionView::snap_frame_to_grid_underneath (framepos_t p, int32_t divisions,
eqaf -= grid_beats.to_double(); eqaf -= grid_beats.to_double();
} }
} }
const double session_start_off = (_region->pulse() * 4.0) - midi_region()->start_beats(); const double session_start_off = _region->pos_beats() - midi_region()->start_beats();
return Evoral::Beats (eqaf - session_start_off); return Evoral::Beats (eqaf - session_start_off);
} }

View file

@ -175,10 +175,12 @@ class LIBARDOUR_API Region
void set_position_lock_style (PositionLockStyle ps); void set_position_lock_style (PositionLockStyle ps);
void recompute_position_from_lock_style (const int32_t sub_num); void recompute_position_from_lock_style (const int32_t sub_num);
/* meter-based beat at the region position */
double beat () const { return _beat; } double beat () const { return _beat; }
void set_beat (double beat) { _beat = beat; } void set_beat (double beat) { _beat = beat; }
double pulse () const { return _pulse; } /* quarter-note beats at the region position (for use with Evoral::Beats) */
void set_pulse (double pulse) { _pulse = pulse; } double pos_beats () const { return _pos_beats; }
void set_pos_beats (double pb) { _pos_beats = pb; }
void suspend_property_changes (); void suspend_property_changes ();
@ -380,7 +382,7 @@ class LIBARDOUR_API Region
/** Sync position relative to the start of our file */ /** Sync position relative to the start of our file */
PBD::Property<framepos_t> _sync_position; PBD::Property<framepos_t> _sync_position;
double _pulse; double _pos_beats;
SourceList _sources; SourceList _sources;
/** Used when timefx are applied, so we can always use the original source */ /** Used when timefx are applied, so we can always use the original source */

View file

@ -1029,7 +1029,7 @@ LuaBindings::common (lua_State* L)
.addFunction ("lower_to_bottom", &Region::lower_to_bottom) .addFunction ("lower_to_bottom", &Region::lower_to_bottom)
.addFunction ("set_sync_position", &Region::set_sync_position) .addFunction ("set_sync_position", &Region::set_sync_position)
.addFunction ("clear_sync_position", &Region::clear_sync_position) .addFunction ("clear_sync_position", &Region::clear_sync_position)
.addFunction ("pulse", &Region::pulse) .addFunction ("pos_beats", &Region::pos_beats)
.addFunction ("set_hidden", &Region::set_hidden) .addFunction ("set_hidden", &Region::set_hidden)
.addFunction ("set_muted", &Region::set_muted) .addFunction ("set_muted", &Region::set_muted)
.addFunction ("set_opaque", &Region::set_opaque) .addFunction ("set_opaque", &Region::set_opaque)

View file

@ -107,7 +107,7 @@ MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other, frameoffset_t
, _start_beats (Properties::start_beats, 0.0) , _start_beats (Properties::start_beats, 0.0)
, _length_beats (Properties::length_beats, other->_length_beats) , _length_beats (Properties::length_beats, other->_length_beats)
{ {
_start_beats = (_session.tempo_map().exact_qn_at_frame (other->_position + offset, sub_num) - (other->pulse() * 4.0)) + other->_start_beats; _start_beats = (_session.tempo_map().exact_qn_at_frame (other->_position + offset, sub_num) - other->pos_beats()) + other->_start_beats;
update_length_beats (sub_num); update_length_beats (sub_num);
register_properties (); register_properties ();
@ -196,7 +196,7 @@ MidiRegion::clone (boost::shared_ptr<MidiSource> newsrc) const
plist.add (Properties::layer, 0); plist.add (Properties::layer, 0);
boost::shared_ptr<MidiRegion> ret (boost::dynamic_pointer_cast<MidiRegion> (RegionFactory::create (newsrc, plist, true))); boost::shared_ptr<MidiRegion> ret (boost::dynamic_pointer_cast<MidiRegion> (RegionFactory::create (newsrc, plist, true)));
ret->set_pulse (pulse()); ret->set_pos_beats (pos_beats());
return ret; return ret;
} }
@ -227,7 +227,7 @@ void
MidiRegion::set_start_beats_from_start_frames () MidiRegion::set_start_beats_from_start_frames ()
{ {
if (position_lock_style() == AudioTime) { if (position_lock_style() == AudioTime) {
_start_beats = (pulse() * 4.0) - _session.tempo_map().quarter_note_at_frame (_position - _start); _start_beats = pos_beats() - _session.tempo_map().quarter_note_at_frame (_position - _start);
} }
} }
@ -270,11 +270,10 @@ MidiRegion::update_after_tempo_map_change (bool /* send */)
For now, the musical position at the region start is retained, but subsequent events For now, the musical position at the region start is retained, but subsequent events
will maintain their beat distance according to the map. will maintain their beat distance according to the map.
*/ */
_start = _session.tempo_map().frame_at_quarter_note (pulse() * 4.0) _start = _session.tempo_map().frames_between_quarter_notes (pos_beats() - start_beats(), pos_beats());
- _session.tempo_map().frame_at_quarter_note ((pulse() * 4.0) - start_beats());
/* _length doesn't change for audio-locked regions. update length_beats to match. */ /* _length doesn't change for audio-locked regions. update length_beats to match. */
_length_beats = _session.tempo_map().quarter_note_at_frame (_position + _length) - _session.tempo_map().quarter_note_at_frame (_position); _length_beats = _session.tempo_map().quarter_note_at_frame (_position + _length) - pos_beats();
s_and_l.add (Properties::start); s_and_l.add (Properties::start);
s_and_l.add (Properties::length_beats); s_and_l.add (Properties::length_beats);
@ -286,7 +285,7 @@ MidiRegion::update_after_tempo_map_change (bool /* send */)
Region::update_after_tempo_map_change (false); Region::update_after_tempo_map_change (false);
/* _start has now been updated. */ /* _start has now been updated. */
_length = _session.tempo_map().frame_at_pulse (pulse() + (_length_beats / 4.0)) - _position; _length = _session.tempo_map().frames_between_quarter_notes (pos_beats(), pos_beats() + _length_beats);
if (old_start != _start) { if (old_start != _start) {
s_and_l.add (Properties::start); s_and_l.add (Properties::start);
@ -304,7 +303,7 @@ MidiRegion::update_after_tempo_map_change (bool /* send */)
void void
MidiRegion::update_length_beats (const int32_t sub_num) MidiRegion::update_length_beats (const int32_t sub_num)
{ {
_length_beats = _session.tempo_map().exact_qn_at_frame (_position + _length, sub_num) - (pulse() * 4.0); _length_beats = _session.tempo_map().exact_qn_at_frame (_position + _length, sub_num) - pos_beats();
} }
void void
@ -318,8 +317,7 @@ MidiRegion::set_position_internal (framepos_t pos, bool allow_bbt_recompute, con
} }
/* set _start to new position in tempo map */ /* set _start to new position in tempo map */
_start = _session.tempo_map().frame_at_quarter_note (pulse() * 4.0) _start = _session.tempo_map().frames_between_quarter_notes (pos_beats() - start_beats(), pos_beats());
- _session.tempo_map().frame_at_quarter_note ((pulse() * 4.0) - start_beats());
/* in construction from src */ /* in construction from src */
if (_length_beats == 0.0) { if (_length_beats == 0.0) {
@ -327,12 +325,12 @@ MidiRegion::set_position_internal (framepos_t pos, bool allow_bbt_recompute, con
} }
if (position_lock_style() == AudioTime) { if (position_lock_style() == AudioTime) {
_length_beats = _session.tempo_map().quarter_note_at_frame (_position + _length) - _session.tempo_map().quarter_note_at_frame (_position); _length_beats = _session.tempo_map().quarter_note_at_frame (_position + _length) - pos_beats();
} else { } else {
/* leave _length_beats alone, and change _length to reflect the state of things /* leave _length_beats alone, and change _length to reflect the state of things
at the new position (tempo map may dictate a different number of frames). at the new position (tempo map may dictate a different number of frames).
*/ */
Region::set_length_internal (_session.tempo_map().frame_at_quarter_note ((pulse() * 4.0) + length_beats()) - _position, sub_num); Region::set_length_internal (_session.tempo_map().frames_between_quarter_notes (pos_beats(), pos_beats() + length_beats()), sub_num);
} }
} }
@ -416,8 +414,7 @@ MidiRegion::_read_at (const SourceList& /*srcs*/,
<< " _position = " << _position << " _position = " << _position
<< " _start = " << _start << " _start = " << _start
<< " intoffset = " << internal_offset << " intoffset = " << internal_offset
<< " pulse = " << pulse() << " pos_beats = " << pos_beats()
<< " start_pulse = " << start_pulse()
<< " start_beat = " << _start_beats << " start_beat = " << _start_beats
<< endl; << endl;
#endif #endif
@ -435,7 +432,7 @@ MidiRegion::_read_at (const SourceList& /*srcs*/,
tracker, tracker,
filter, filter,
_filtered_parameters, _filtered_parameters,
pulse(), pos_beats(),
_start_beats _start_beats
) != to_read) { ) != to_read) {
return 0; /* "read nothing" */ return 0; /* "read nothing" */
@ -626,15 +623,14 @@ MidiRegion::trim_to_internal (framepos_t position, framecnt_t length, const int3
if (_position != position) { if (_position != position) {
const double pos_qn = _session.tempo_map().exact_qn_at_frame (position, sub_num); const double pos_qn = _session.tempo_map().exact_qn_at_frame (position, sub_num);
const double old_pos_qn = pulse() * 4.0; const double old_pos_qn = pos_beats();
/* sets _pulse to new position.*/ /* sets _pulse to new position.*/
set_position_internal (position, true, sub_num); set_position_internal (position, true, sub_num);
what_changed.add (Properties::position); what_changed.add (Properties::position);
double new_start_qn = start_beats() + (pos_qn - old_pos_qn); double new_start_qn = start_beats() + (pos_qn - old_pos_qn);
const framepos_t new_start = _session.tempo_map().frame_at_quarter_note (pos_qn) framepos_t new_start = _session.tempo_map().frames_between_quarter_notes (pos_qn - new_start_qn, pos_qn);
- _session.tempo_map().frame_at_quarter_note (pos_qn - new_start_qn);
if (!verify_start_and_length (new_start, length)) { if (!verify_start_and_length (new_start, length)) {
return; return;

View file

@ -190,12 +190,12 @@ MidiSource::midi_read (const Lock& lm,
MidiStateTracker* tracker, MidiStateTracker* tracker,
MidiChannelFilter* filter, MidiChannelFilter* filter,
const std::set<Evoral::Parameter>& filtered, const std::set<Evoral::Parameter>& filtered,
const double pulse, const double pos_beats,
const double start_beats) const const double start_beats) const
{ {
BeatsFramesConverter converter(_session.tempo_map(), source_start); BeatsFramesConverter converter(_session.tempo_map(), source_start);
const double start_qn = (pulse * 4.0) - start_beats; const double start_qn = pos_beats - start_beats;
DEBUG_TRACE (DEBUG::MidiSourceIO, DEBUG_TRACE (DEBUG::MidiSourceIO,
string_compose ("MidiSource::midi_read() %5 sstart %1 start %2 cnt %3 tracker %4\n", string_compose ("MidiSource::midi_read() %5 sstart %1 start %2 cnt %3 tracker %4\n",

View file

@ -177,7 +177,7 @@ Region::register_properties ()
, _position (Properties::position, 0) \ , _position (Properties::position, 0) \
, _beat (Properties::beat, 0.0) \ , _beat (Properties::beat, 0.0) \
, _sync_position (Properties::sync_position, (s)) \ , _sync_position (Properties::sync_position, (s)) \
, _pulse (0.0) \ , _pos_beats (0.0) \
, _transient_user_start (0) \ , _transient_user_start (0) \
, _transient_analysis_start (0) \ , _transient_analysis_start (0) \
, _transient_analysis_end (0) \ , _transient_analysis_end (0) \
@ -208,7 +208,7 @@ Region::register_properties ()
, _position(Properties::position, other->_position) \ , _position(Properties::position, other->_position) \
, _beat (Properties::beat, other->_beat) \ , _beat (Properties::beat, other->_beat) \
, _sync_position(Properties::sync_position, other->_sync_position) \ , _sync_position(Properties::sync_position, other->_sync_position) \
, _pulse (other->_pulse) \ , _pos_beats (other->_pos_beats) \
, _user_transients (other->_user_transients) \ , _user_transients (other->_user_transients) \
, _transient_user_start (other->_transient_user_start) \ , _transient_user_start (other->_transient_user_start) \
, _transients (other->_transients) \ , _transients (other->_transients) \
@ -294,7 +294,7 @@ Region::Region (boost::shared_ptr<const Region> other)
_start = other->_start; _start = other->_start;
_beat = other->_beat; _beat = other->_beat;
_pulse = other->_pulse; _pos_beats = other->_pos_beats;
/* sync pos is relative to start of file. our start-in-file is now zero, /* sync pos is relative to start of file. our start-in-file is now zero,
so set our sync position to whatever the the difference between so set our sync position to whatever the the difference between
@ -353,7 +353,7 @@ Region::Region (boost::shared_ptr<const Region> other, frameoffset_t offset, con
_start = other->_start + offset; _start = other->_start + offset;
_beat = _session.tempo_map().exact_beat_at_frame (_position, sub_num); _beat = _session.tempo_map().exact_beat_at_frame (_position, sub_num);
_pulse = _session.tempo_map().exact_qn_at_frame (_position, sub_num) / 4.0; _pos_beats = _session.tempo_map().exact_qn_at_frame (_position, sub_num);
/* if the other region had a distinct sync point /* if the other region had a distinct sync point
set, then continue to use it as best we can. set, then continue to use it as best we can.
@ -550,8 +550,8 @@ Region::set_position_lock_style (PositionLockStyle ps)
_position_lock_style = ps; _position_lock_style = ps;
if (_position_lock_style == MusicTime) { if (_position_lock_style == MusicTime) {
_beat = _session.tempo_map().beat_at_frame (_position); //_beat = _session.tempo_map().beat_at_frame (_position);
_pulse = _session.tempo_map().pulse_at_frame (_position); //_pos_beats = _session.tempo_map().quarter_note_at_frame (_position);
} }
send_change (Properties::position_lock_style); send_change (Properties::position_lock_style);
@ -687,7 +687,7 @@ Region::set_position_internal (framepos_t pos, bool allow_bbt_recompute, const i
recompute_position_from_lock_style (sub_num); recompute_position_from_lock_style (sub_num);
} else { } else {
/* MusicTime dictates that we glue to ardour beats. the pulse may have changed.*/ /* MusicTime dictates that we glue to ardour beats. the pulse may have changed.*/
_pulse = _session.tempo_map().pulse_at_beat (_beat); _pos_beats = _session.tempo_map().quarter_note_at_beat (_beat);
} }
/* check that the new _position wouldn't make the current /* check that the new _position wouldn't make the current
@ -706,7 +706,7 @@ void
Region::recompute_position_from_lock_style (const int32_t sub_num) Region::recompute_position_from_lock_style (const int32_t sub_num)
{ {
_beat = _session.tempo_map().exact_beat_at_frame (_position, sub_num); _beat = _session.tempo_map().exact_beat_at_frame (_position, sub_num);
_pulse = _session.tempo_map().exact_qn_at_frame (_position, sub_num) / 4.0; _pos_beats = _session.tempo_map().exact_qn_at_frame (_position, sub_num);
} }
void void
@ -1865,7 +1865,19 @@ void
Region::post_set (const PropertyChange& pc) Region::post_set (const PropertyChange& pc)
{ {
if (pc.contains (Properties::position)) { if (pc.contains (Properties::position)) {
_pulse = _session.tempo_map().pulse_at_beat (_beat); if (playlist() && _session.tempo_map().frame_at_beat (_beat) != _position && position_lock_style() == MusicTime) {
std::cout << name()
<< " Region::post_set MusicTime position error!!! FRAME AT BEAT : " <<_session.tempo_map().frame_at_beat (_beat)
<< " position : " << _position << " beat : " << _beat << std::endl;
//_position = _session.tempo_map().frame_at_beat (_beat);
}
if (playlist() && _session.tempo_map().frame_at_beat (_beat) != _position && position_lock_style() == AudioTime) {
std::cout << name()
<< " Region::post_set AudioTime position error!!! FRAME AT BEAT : " <<_session.tempo_map().frame_at_beat (_beat)
<< " position : " << _position << " beat : " << _beat << std::endl;
//_beat = _session.tempo_map().beat_at_frame (_position);
}
_pos_beats = _session.tempo_map().quarter_note_at_beat (_beat);
} }
} }

View file

@ -135,7 +135,7 @@ ensure_per_region_source (Session* session, boost::shared_ptr<MidiRegion> region
Source::Lock newsrc_lock (newsrc->mutex()); Source::Lock newsrc_lock (newsrc->mutex());
write_bbt_source_to_source (region->midi_source(0), newsrc, newsrc_lock, region->pulse() - (region->start_beats() / 4.0)); write_bbt_source_to_source (region->midi_source(0), newsrc, newsrc_lock, (region->pos_beats() - region->start_beats()) / 4.0);
cout << UTILNAME << ":" << endl cout << UTILNAME << ":" << endl
<< " Created new midi source file" << endl << " Created new midi source file" << endl
@ -189,7 +189,7 @@ ensure_per_source_source (Session* session, boost::shared_ptr<MidiRegion> region
Source::Lock newsrc_lock (newsrc->mutex()); Source::Lock newsrc_lock (newsrc->mutex());
write_bbt_source_to_source (region->midi_source(0), newsrc, newsrc_lock, region->pulse() - (region->start_beats() / 4.0)); write_bbt_source_to_source (region->midi_source(0), newsrc, newsrc_lock, (region->pos_beats() - region->start_beats()) / 4.0);
cout << UTILNAME << ":" << endl cout << UTILNAME << ":" << endl
<< " Created new midi source file" << endl << " Created new midi source file" << endl
@ -211,8 +211,8 @@ reset_start (Session* session, boost::shared_ptr<MidiRegion> region)
/* force a change to start and start_beats */ /* force a change to start and start_beats */
PositionLockStyle old_pls = region->position_lock_style(); PositionLockStyle old_pls = region->position_lock_style();
region->set_position_lock_style (AudioTime); region->set_position_lock_style (AudioTime);
region->set_start (tmap.frame_at_quarter_note (region->pulse() * 4.0) - tmap.frame_at_quarter_note ((region->pulse() * 4.0) - new_start_qn) + 1); region->set_start (tmap.frame_at_quarter_note (region->pos_beats()) - tmap.frame_at_quarter_note (region->pos_beats() - new_start_qn) + 1);
region->set_start (tmap.frame_at_quarter_note (region->pulse() * 4.0) - tmap.frame_at_quarter_note ((region->pulse() * 4.0) - new_start_qn)); region->set_start (tmap.frame_at_quarter_note (region->pos_beats()) - tmap.frame_at_quarter_note (region->pos_beats() - new_start_qn));
region->set_position_lock_style (old_pls); region->set_position_lock_style (old_pls);
} }
@ -228,8 +228,8 @@ reset_length (Session* session, boost::shared_ptr<MidiRegion> region)
/* force a change to length and length_beats */ /* force a change to length and length_beats */
PositionLockStyle old_pls = region->position_lock_style(); PositionLockStyle old_pls = region->position_lock_style();
region->set_position_lock_style (AudioTime); region->set_position_lock_style (AudioTime);
region->set_length (tmap.frame_at_quarter_note ((region->pulse() * 4.0) + new_length_qn) + 1 - region->position(), 0); region->set_length (tmap.frame_at_quarter_note (region->pos_beats() + new_length_qn) + 1 - region->position(), 0);
region->set_length (tmap.frame_at_quarter_note ((region->pulse() * 4.0) + new_length_qn)- region->position(), 0); region->set_length (tmap.frame_at_quarter_note (region->pos_beats() + new_length_qn)- region->position(), 0);
region->set_position_lock_style (old_pls); region->set_position_lock_style (old_pls);
} }