MCP: Mixbus32C: Restore missing filter controls to the Dyn page.
[ardour.git] / libs / ardour / ardour / midi_region.h
index 29d3b99d4de21d5fc7dd6c84ef71d64873fbef82..9039db63d5ba6d1240ef28f6ea1fcde73bc6b025 100644 (file)
 #include "evoral/Beats.hpp"
 #include "evoral/Range.hpp"
 
+#include "pbd/string_convert.h"
+
 #include "ardour/ardour.h"
+#include "ardour/midi_cursor.h"
 #include "ardour/region.h"
 
 class XMLNode;
 
 namespace ARDOUR {
        namespace Properties {
-               LIBARDOUR_API extern PBD::PropertyDescriptor<Evoral::Beats> start_beats;
-               LIBARDOUR_API extern PBD::PropertyDescriptor<Evoral::Beats> length_beats;
+               LIBARDOUR_API extern PBD::PropertyDescriptor<double> start_beats;
+               LIBARDOUR_API extern PBD::PropertyDescriptor<double> length_beats;
        }
 }
 
@@ -77,6 +80,7 @@ class LIBARDOUR_API MidiRegion : public Region
                            framepos_t position,
                            framecnt_t dur,
                            Evoral::Range<framepos_t>* loop_range,
+                           MidiCursor& cursor,
                            uint32_t  chan_n = 0,
                            NoteMode  mode = Sustained,
                            MidiStateTracker* tracker = 0,
@@ -86,6 +90,7 @@ class LIBARDOUR_API MidiRegion : public Region
                                   framepos_t position,
                                   framecnt_t dur,
                                   Evoral::Range<framepos_t>* loop_range,
+                                  MidiCursor& cursor,
                                   uint32_t  chan_n = 0,
                                   NoteMode  mode = Sustained) const;
 
@@ -106,8 +111,8 @@ class LIBARDOUR_API MidiRegion : public Region
        boost::shared_ptr<const MidiModel> model() const;
 
        void fix_negative_start ();
-       Evoral::Beats start_beats () {return _start_beats.val(); }
-       Evoral::Beats length_beats () {return _length_beats.val(); }
+       double start_beats () const {return _start_beats; }
+       double length_beats () const {return _length_beats; }
 
        void clobber_sources (boost::shared_ptr<MidiSource> source);
 
@@ -119,17 +124,18 @@ class LIBARDOUR_API MidiRegion : public Region
 
   private:
        friend class RegionFactory;
-       PBD::Property<Evoral::Beats> _start_beats;
-       PBD::Property<Evoral::Beats> _length_beats;
+       PBD::Property<double> _start_beats;
+       PBD::Property<double> _length_beats;
 
        MidiRegion (const SourceList&);
        MidiRegion (boost::shared_ptr<const MidiRegion>);
-       MidiRegion (boost::shared_ptr<const MidiRegion>, frameoffset_t offset, const int32_t sub_num = 0);
+       MidiRegion (boost::shared_ptr<const MidiRegion>, ARDOUR::MusicFrame offset);
 
        framecnt_t _read_at (const SourceList&, Evoral::EventSink<framepos_t>& dst,
                             framepos_t position,
                             framecnt_t dur,
                             Evoral::Range<framepos_t>* loop_range,
+                            MidiCursor& cursor,
                             uint32_t chan_n = 0,
                             NoteMode mode = Sustained,
                             MidiStateTracker* tracker = 0,
@@ -142,12 +148,14 @@ class LIBARDOUR_API MidiRegion : public Region
        void recompute_at_end ();
 
        void set_position_internal (framepos_t pos, bool allow_bbt_recompute, const int32_t sub_num);
+       void set_position_music_internal (double qn);
        void set_length_internal (framecnt_t len, const int32_t sub_num);
        void set_start_internal (framecnt_t, const int32_t sub_num);
        void trim_to_internal (framepos_t position, framecnt_t length, const int32_t sub_num);
        void update_length_beats (const int32_t sub_num);
 
        void model_changed ();
+       void model_shifted (double qn_distance);
        void model_automation_state_changed (Evoral::Parameter const &);
 
        void set_start_beats_from_start_frames ();
@@ -155,10 +163,10 @@ class LIBARDOUR_API MidiRegion : public Region
 
        std::set<Evoral::Parameter> _filtered_parameters; ///< parameters that we ask our source not to return when reading
        PBD::ScopedConnection _model_connection;
+       PBD::ScopedConnection _model_shift_connection;
        PBD::ScopedConnection _source_connection;
        PBD::ScopedConnection _model_contents_connection;
-
-       double _last_length_beats;
+       bool _ignore_shift;
 };
 
 } /* namespace ARDOUR */