+ int set_state (const XMLNode&, int version);
+
+ bool length_mutable() const { return true; }
+
+ void set_length_beats(double l) { _length_beats = l; }
+ double length_beats() const { return _length_beats; }
+
+ virtual void load_model(bool lock=true, bool force_reload=false) = 0;
+ virtual void destroy_model() = 0;
+
+ /** This must be called with the source lock held whenever the
+ * source/model contents have been changed (reset iterators/cache/etc).
+ */
+ void invalidate();
+
+ void set_note_mode(NoteMode mode);
+
+ boost::shared_ptr<MidiModel> model() { return _model; }
+ void set_model (boost::shared_ptr<MidiModel>);
+ void drop_model();
+
+ Evoral::ControlList::InterpolationStyle interpolation_of (Evoral::Parameter) const;
+ void set_interpolation_of (Evoral::Parameter, Evoral::ControlList::InterpolationStyle);
+ void copy_interpolation_from (boost::shared_ptr<MidiSource>);
+ void copy_interpolation_from (MidiSource *);
+
+ AutoState automation_state_of (Evoral::Parameter) const;
+ void set_automation_state_of (Evoral::Parameter, AutoState);
+ void copy_automation_state_from (boost::shared_ptr<MidiSource>);
+ void copy_automation_state_from (MidiSource *);
+
+ /** Emitted when a different MidiModel is set */
+ PBD::Signal0<void> ModelChanged;
+ /** Emitted when a parameter's interpolation style is changed */
+ PBD::Signal2<void, Evoral::Parameter, Evoral::ControlList::InterpolationStyle> InterpolationChanged;
+ /** Emitted when a parameter's automation state is changed */
+ PBD::Signal2<void, Evoral::Parameter, AutoState> AutomationStateChanged;