+ boost::shared_ptr<MidiSource> clone (Evoral::MusicalTime begin = Evoral::MinMusicalTime,
+ Evoral::MusicalTime end = Evoral::MaxMusicalTime);
+
+ /** Read the data in a given time range from the MIDI source.
+ * All time stamps in parameters are in audio frames (even if the source has tempo time).
+ * \param dst Ring buffer where read events are written
+ * \param source_start Start position of the SOURCE in this read context
+ * \param start Start of range to be read
+ * \param cnt Length of range to be read (in audio frames)
+ * \param tracker an optional pointer to MidiStateTracker object, for note on/off tracking
+ */
+ virtual framecnt_t midi_read (Evoral::EventSink<framepos_t>& dst,
+ framepos_t source_start,
+ framepos_t start, framecnt_t cnt,
+ MidiStateTracker*,
+ std::set<Evoral::Parameter> const &) const;
+
+ virtual framecnt_t midi_write (MidiRingBuffer<framepos_t>& src,
+ framepos_t source_start,
+ framecnt_t cnt);
+
+ virtual void append_event_unlocked_beats(const Evoral::Event<Evoral::MusicalTime>& ev) = 0;
+
+ virtual void append_event_unlocked_frames(const Evoral::Event<framepos_t>& ev,
+ framepos_t source_start) = 0;
+
+ virtual bool empty () const;
+ virtual framecnt_t length (framepos_t pos) const;
+ virtual void update_length (framepos_t pos, framecnt_t cnt);
+
+ virtual void mark_streaming_midi_write_started (NoteMode mode);
+ virtual void mark_streaming_write_started ();
+ virtual void mark_streaming_write_completed ();
+ void mark_write_starting_now ();