add an plugin API to query generic-gui grid-layout
[ardour.git] / libs / ardour / ardour / midi_model.h
index b86a7436bbb22617ebe08e5877a4e837f86ba2ae..254d6100770a25ee05e2087f1cf668e524543a49 100644 (file)
@@ -52,9 +52,9 @@ class MidiSource;
  * Because of this MIDI controllers and automatable controllers/widgets/etc
  * are easily interchangeable.
  */
-class LIBARDOUR_API MidiModel : public AutomatableSequence<Evoral::MusicalTime> {
+class LIBARDOUR_API MidiModel : public AutomatableSequence<Evoral::Beats> {
 public:
-       typedef Evoral::MusicalTime TimeType;
+       typedef Evoral::Beats TimeType;
 
        MidiModel (boost::shared_ptr<MidiSource>);
 
@@ -126,7 +126,6 @@ public:
 
                static Variant::Type value_type (Property prop);
 
-       private:
                struct NoteChange {
                        NoteDiffCommand::Property property;
                        NotePtr note;
@@ -135,12 +134,17 @@ public:
                        Variant new_value;
                };
 
-               typedef std::list<NoteChange> ChangeList;
-               ChangeList _changes;
-
+               typedef std::list<NoteChange>                                    ChangeList;
                typedef std::list< boost::shared_ptr< Evoral::Note<TimeType> > > NoteList;
-               NoteList _added_notes;
-               NoteList _removed_notes;
+
+               const ChangeList& changes()       const { return _changes; }
+               const NoteList&   added_notes()   const { return _added_notes; }
+               const NoteList&   removed_notes() const { return _removed_notes; }
+
+       private:
+               ChangeList _changes;
+               NoteList   _added_notes;
+               NoteList   _removed_notes;
 
                std::set<NotePtr> side_effect_removals;
 
@@ -171,8 +175,9 @@ public:
 
        private:
                struct Change {
+                       Change () : sysex_id (0) {}
                        boost::shared_ptr<Evoral::Event<TimeType> > sysex;
-                       gint sysex_id;
+                       gint sysex_id;
                        SysExDiffCommand::Property property;
                        TimeType old_time;
                        TimeType new_time;
@@ -259,8 +264,8 @@ public:
 
        bool write_section_to(boost::shared_ptr<MidiSource>     source,
                              const Glib::Threads::Mutex::Lock& source_lock,
-                             Evoral::MusicalTime               begin = Evoral::MinMusicalTime,
-                             Evoral::MusicalTime               end   = Evoral::MaxMusicalTime);
+                             Evoral::Beats                     begin = Evoral::MinBeats,
+                             Evoral::Beats                     end   = Evoral::MaxBeats);
 
        // MidiModel doesn't use the normal AutomationList serialisation code
        // since controller data is stored in the .mid
@@ -283,7 +288,9 @@ public:
        boost::shared_ptr<Evoral::Control> control_factory(const Evoral::Parameter& id);
 
        void insert_silence_at_start (TimeType);
-       void transpose (TimeType, TimeType, int);
+       void transpose (NoteDiffCommand *, const NotePtr, int);
+
+       std::set<WeakNotePtr>& active_notes() { return _active_notes; }
 
 protected:
        int resolve_overlaps_unlocked (const NotePtr, void* arg = 0);
@@ -302,7 +309,6 @@ private:
 
 public:
        WriteLock edit_lock();
-       WriteLock write_lock();
 
 private:
        friend class DeltaCommand;
@@ -319,6 +325,8 @@ private:
        // We cannot use a boost::shared_ptr here to avoid a retain cycle
        boost::weak_ptr<MidiSource> _midi_source;
        InsertMergePolicy _insert_merge_policy;
+
+       std::set<WeakNotePtr> _active_notes;
 };
 
 } /* namespace ARDOUR */