rename Region pulse to pos_beats. use new beat distance api where required.
authornick_m <mainsbridge@gmail.com>
Sun, 30 Oct 2016 13:01:02 +0000 (00:01 +1100)
committernick_m <mainsbridge@gmail.com>
Thu, 10 Nov 2016 16:37:08 +0000 (03:37 +1100)
- 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

gtk2_ardour/editor_drag.cc
gtk2_ardour/midi_region_view.cc
libs/ardour/ardour/region.h
libs/ardour/luabindings.cc
libs/ardour/midi_region.cc
libs/ardour/midi_source.cc
libs/ardour/region.cc
session_utils/fix_bbtppq.cc

index c32b2932aeb1f031950c2284e34549c68f891cf8..c4ca3a1ca6448dcb6dd04017d28d2f9d3d9ae311 100644 (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());
 
        /* 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 */
index f4373e2c0ed7e4ca31565e73de04c541255d2e4b..e0963b2d911d8a7c5d17937545730f58d62cd5a0 100644 (file)
@@ -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);
 }
index fc14e98cb89c9ad01b7f54e114e520cd62afd578..866f489037eaf7a22a5c1ca2181555f1ff87a406 100644 (file)
@@ -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 */
index 5920fc023ddf001324569f43131d149ba151d676..3d2e8e2cbf9ecfe54d5625ec15d3745d011524d6 100644 (file)
@@ -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)
index ec0cd95c8b076ea210677b74537a170d3d73ee3f..869cb487e48eeb72c24e842f4ce4bb69adf4eb01 100644 (file)
@@ -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;
index edfc27acb9fe00e65404ee4da9b87275d7d81cde..d1a3455ba2d51879c189e7e6d9bf6491e5303523 100644 (file)
@@ -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",
index 7581e2367195adcd4b6691c5f1e3ca59e7bcbc21..10d123925a5d728bcd934468a0da1482579da391 100644 (file)
@@ -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);
        }
 }
 
index 8dce59c35d995e88acde0fc6b7a5328ba8c3b938..f86fe790e7e4eaf4ced76095c5c35270d4f2120b 100644 (file)
@@ -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);
 }