diff options
author | nick_m <mainsbridge@gmail.com> | 2016-10-31 00:01:02 +1100 |
---|---|---|
committer | nick_m <mainsbridge@gmail.com> | 2016-11-11 03:37:08 +1100 |
commit | dca96d8b5d6737ec811cf5a46548d39a7912bec8 (patch) | |
tree | 3569c1c42a405bc1b43fc22f30d90bba1dc1fe51 | |
parent | ac23496b40537d97469acdec89f787f056dc3bba (diff) |
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
-rw-r--r-- | gtk2_ardour/editor_drag.cc | 2 | ||||
-rw-r--r-- | gtk2_ardour/midi_region_view.cc | 10 | ||||
-rw-r--r-- | libs/ardour/ardour/region.h | 8 | ||||
-rw-r--r-- | libs/ardour/luabindings.cc | 2 | ||||
-rw-r--r-- | libs/ardour/midi_region.cc | 32 | ||||
-rw-r--r-- | libs/ardour/midi_source.cc | 6 | ||||
-rw-r--r-- | libs/ardour/region.cc | 30 | ||||
-rw-r--r-- | session_utils/fix_bbtppq.cc | 12 |
8 files changed, 56 insertions, 46 deletions
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index c32b2932ae..c4ca3a1ca6 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -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()); /* 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()); /* new time of the primary note in session frames */ diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index f4373e2c0e..e0963b2d91 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -1711,7 +1711,7 @@ MidiRegionView::update_sustained (Note* ev, bool update_ghost_regions) const boost::shared_ptr<ARDOUR::MidiRegion> mr = midi_region(); 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 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(); - 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 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) { - 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; Evoral::Beats new_time = Evoral::Beats (map.quarter_note_at_frame (new_frames) - start_qn); if (new_time < 0) { @@ -2922,7 +2922,7 @@ MidiRegionView::commit_resizing (NoteBase* primary, bool at_front, double delta_ /* and then to beats */ 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); 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(); } } - 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); } diff --git a/libs/ardour/ardour/region.h b/libs/ardour/ardour/region.h index fc14e98cb8..866f489037 100644 --- a/libs/ardour/ardour/region.h +++ b/libs/ardour/ardour/region.h @@ -175,10 +175,12 @@ class LIBARDOUR_API Region void set_position_lock_style (PositionLockStyle ps); void recompute_position_from_lock_style (const int32_t sub_num); + /* meter-based beat at the region position */ double beat () const { return _beat; } void set_beat (double beat) { _beat = beat; } - double pulse () const { return _pulse; } - void set_pulse (double pulse) { _pulse = pulse; } + /* quarter-note beats at the region position (for use with Evoral::Beats) */ + double pos_beats () const { return _pos_beats; } + void set_pos_beats (double pb) { _pos_beats = pb; } void suspend_property_changes (); @@ -380,7 +382,7 @@ class LIBARDOUR_API Region /** Sync position relative to the start of our file */ PBD::Property<framepos_t> _sync_position; - double _pulse; + double _pos_beats; SourceList _sources; /** Used when timefx are applied, so we can always use the original source */ diff --git a/libs/ardour/luabindings.cc b/libs/ardour/luabindings.cc index 5920fc023d..3d2e8e2cbf 100644 --- a/libs/ardour/luabindings.cc +++ b/libs/ardour/luabindings.cc @@ -1029,7 +1029,7 @@ LuaBindings::common (lua_State* L) .addFunction ("lower_to_bottom", &Region::lower_to_bottom) .addFunction ("set_sync_position", &Region::set_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_muted", &Region::set_muted) .addFunction ("set_opaque", &Region::set_opaque) diff --git a/libs/ardour/midi_region.cc b/libs/ardour/midi_region.cc index ec0cd95c8b..869cb487e4 100644 --- a/libs/ardour/midi_region.cc +++ b/libs/ardour/midi_region.cc @@ -107,7 +107,7 @@ MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other, frameoffset_t , _start_beats (Properties::start_beats, 0.0) , _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); register_properties (); @@ -196,7 +196,7 @@ MidiRegion::clone (boost::shared_ptr<MidiSource> newsrc) const plist.add (Properties::layer, 0); 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; } @@ -227,7 +227,7 @@ void MidiRegion::set_start_beats_from_start_frames () { 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 will maintain their beat distance according to the map. */ - _start = _session.tempo_map().frame_at_quarter_note (pulse() * 4.0) - - _session.tempo_map().frame_at_quarter_note ((pulse() * 4.0) - start_beats()); + _start = _session.tempo_map().frames_between_quarter_notes (pos_beats() - start_beats(), pos_beats()); /* _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::length_beats); @@ -286,7 +285,7 @@ MidiRegion::update_after_tempo_map_change (bool /* send */) Region::update_after_tempo_map_change (false); /* _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) { s_and_l.add (Properties::start); @@ -304,7 +303,7 @@ MidiRegion::update_after_tempo_map_change (bool /* send */) void 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 @@ -318,8 +317,7 @@ MidiRegion::set_position_internal (framepos_t pos, bool allow_bbt_recompute, con } /* set _start to new position in tempo map */ - _start = _session.tempo_map().frame_at_quarter_note (pulse() * 4.0) - - _session.tempo_map().frame_at_quarter_note ((pulse() * 4.0) - start_beats()); + _start = _session.tempo_map().frames_between_quarter_notes (pos_beats() - start_beats(), pos_beats()); /* in construction from src */ 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) { - _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 { /* 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). */ - 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 << " _start = " << _start << " intoffset = " << internal_offset - << " pulse = " << pulse() - << " start_pulse = " << start_pulse() + << " pos_beats = " << pos_beats() << " start_beat = " << _start_beats << endl; #endif @@ -435,7 +432,7 @@ MidiRegion::_read_at (const SourceList& /*srcs*/, tracker, filter, _filtered_parameters, - pulse(), + pos_beats(), _start_beats ) != to_read) { return 0; /* "read nothing" */ @@ -626,15 +623,14 @@ MidiRegion::trim_to_internal (framepos_t position, framecnt_t length, const int3 if (_position != position) { 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.*/ set_position_internal (position, true, sub_num); what_changed.add (Properties::position); 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) - - _session.tempo_map().frame_at_quarter_note (pos_qn - new_start_qn); + framepos_t new_start = _session.tempo_map().frames_between_quarter_notes (pos_qn - new_start_qn, pos_qn); if (!verify_start_and_length (new_start, length)) { return; diff --git a/libs/ardour/midi_source.cc b/libs/ardour/midi_source.cc index edfc27acb9..d1a3455ba2 100644 --- a/libs/ardour/midi_source.cc +++ b/libs/ardour/midi_source.cc @@ -190,12 +190,12 @@ MidiSource::midi_read (const Lock& lm, MidiStateTracker* tracker, MidiChannelFilter* filter, const std::set<Evoral::Parameter>& filtered, - const double pulse, - const double start_beats) const + const double pos_beats, + const double start_beats) const { 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, string_compose ("MidiSource::midi_read() %5 sstart %1 start %2 cnt %3 tracker %4\n", diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc index 7581e23671..10d123925a 100644 --- a/libs/ardour/region.cc +++ b/libs/ardour/region.cc @@ -177,7 +177,7 @@ Region::register_properties () , _position (Properties::position, 0) \ , _beat (Properties::beat, 0.0) \ , _sync_position (Properties::sync_position, (s)) \ - , _pulse (0.0) \ + , _pos_beats (0.0) \ , _transient_user_start (0) \ , _transient_analysis_start (0) \ , _transient_analysis_end (0) \ @@ -208,7 +208,7 @@ Region::register_properties () , _position(Properties::position, other->_position) \ , _beat (Properties::beat, other->_beat) \ , _sync_position(Properties::sync_position, other->_sync_position) \ - , _pulse (other->_pulse) \ + , _pos_beats (other->_pos_beats) \ , _user_transients (other->_user_transients) \ , _transient_user_start (other->_transient_user_start) \ , _transients (other->_transients) \ @@ -294,7 +294,7 @@ Region::Region (boost::shared_ptr<const Region> other) _start = other->_start; _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, 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; _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 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; if (_position_lock_style == MusicTime) { - _beat = _session.tempo_map().beat_at_frame (_position); - _pulse = _session.tempo_map().pulse_at_frame (_position); + //_beat = _session.tempo_map().beat_at_frame (_position); + //_pos_beats = _session.tempo_map().quarter_note_at_frame (_position); } 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); } else { /* 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 @@ -706,7 +706,7 @@ void Region::recompute_position_from_lock_style (const int32_t 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 @@ -1865,7 +1865,19 @@ void Region::post_set (const PropertyChange& pc) { 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); } } diff --git a/session_utils/fix_bbtppq.cc b/session_utils/fix_bbtppq.cc index 8dce59c35d..f86fe790e7 100644 --- a/session_utils/fix_bbtppq.cc +++ b/session_utils/fix_bbtppq.cc @@ -135,7 +135,7 @@ ensure_per_region_source (Session* session, boost::shared_ptr<MidiRegion> region 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 << " 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()); - 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 << " 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 */ PositionLockStyle old_pls = region->position_lock_style(); 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->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) + 1); + 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); } @@ -228,8 +228,8 @@ reset_length (Session* session, boost::shared_ptr<MidiRegion> region) /* force a change to length and length_beats */ PositionLockStyle old_pls = region->position_lock_style(); 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->pulse() * 4.0) + new_length_qn)- 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->pos_beats() + new_length_qn)- region->position(), 0); region->set_position_lock_style (old_pls); } |