diff options
Diffstat (limited to 'libs/ardour/ardour')
-rw-r--r-- | libs/ardour/ardour/midi_playlist.h | 5 | ||||
-rw-r--r-- | libs/ardour/ardour/midi_region.h | 19 | ||||
-rw-r--r-- | libs/ardour/ardour/midi_source.h | 15 | ||||
-rw-r--r-- | libs/ardour/ardour/midi_state_tracker.h | 5 | ||||
-rw-r--r-- | libs/ardour/ardour/midi_track.h | 5 | ||||
-rw-r--r-- | libs/ardour/ardour/smf_source.h | 13 |
6 files changed, 38 insertions, 24 deletions
diff --git a/libs/ardour/ardour/midi_playlist.h b/libs/ardour/ardour/midi_playlist.h index c83bf80a28..6d617ad0f0 100644 --- a/libs/ardour/ardour/midi_playlist.h +++ b/libs/ardour/ardour/midi_playlist.h @@ -25,6 +25,7 @@ #include "ardour/ardour.h" #include "ardour/playlist.h" +#include "ardour/midi_state_tracker.h" #include "evoral/Parameter.hpp" namespace ARDOUR @@ -74,6 +75,10 @@ private: bool region_changed (Change, boost::shared_ptr<Region>); NoteMode _note_mode; + + typedef std::map<Region*,MidiStateTracker*> NoteTrackers; + NoteTrackers _note_trackers; + }; } /* namespace ARDOUR */ diff --git a/libs/ardour/ardour/midi_region.h b/libs/ardour/ardour/midi_region.h index c796ee742b..f8f663bc78 100644 --- a/libs/ardour/ardour/midi_region.h +++ b/libs/ardour/ardour/midi_region.h @@ -42,6 +42,7 @@ class Playlist; class Session; class MidiFilter; class MidiSource; +class MidiStateTracker; template<typename T> class MidiRingBuffer; class MidiRegion : public Region @@ -56,10 +57,11 @@ class MidiRegion : public Region virtual sframes_t readable_length() const { return length(); } nframes_t read_at (MidiRingBuffer<nframes_t>& dst, - sframes_t position, - nframes_t dur, - uint32_t chan_n = 0, - NoteMode mode = Sustained) const; + sframes_t position, + nframes_t dur, + uint32_t chan_n = 0, + NoteMode mode = Sustained, + MidiStateTracker* tracker = 0) const; nframes_t master_read_at (MidiRingBuffer<nframes_t>& dst, sframes_t position, @@ -104,10 +106,11 @@ class MidiRegion : public Region private: nframes_t _read_at (const SourceList&, MidiRingBuffer<nframes_t>& dst, - nframes_t position, - nframes_t dur, - uint32_t chan_n = 0, - NoteMode mode = Sustained) const; + sframes_t position, + nframes_t dur, + uint32_t chan_n = 0, + NoteMode mode = Sustained, + MidiStateTracker* tracker = 0) const; void recompute_at_start (); void recompute_at_end (); diff --git a/libs/ardour/ardour/midi_source.h b/libs/ardour/ardour/midi_source.h index bffcde5192..5298ab2f4f 100644 --- a/libs/ardour/ardour/midi_source.h +++ b/libs/ardour/ardour/midi_source.h @@ -34,6 +34,7 @@ namespace ARDOUR { +class MidiStateTracker; class MidiModel; template<typename T> class MidiRingBuffer; @@ -55,11 +56,12 @@ class MidiSource : virtual public Source * \param cnt Length of range to be read (in audio frames) * \param stamp_offset Offset to add to event times written to dst * \param negative_stamp_offset Offset to subtract from event times written to dst + * \param tracker an optional pointer to MidiStateTracker object, for note on/off tracking */ virtual nframes_t midi_read (MidiRingBuffer<nframes_t>& dst, - sframes_t source_start, - sframes_t start, nframes_t cnt, - sframes_t stamp_offset, sframes_t negative_stamp_offset) const; + sframes_t source_start, + sframes_t start, nframes_t cnt, + sframes_t stamp_offset, sframes_t negative_stamp_offset, MidiStateTracker*) const; virtual nframes_t midi_write (MidiRingBuffer<nframes_t>& src, sframes_t source_start, @@ -113,9 +115,10 @@ class MidiSource : virtual public Source virtual void flush_midi() = 0; virtual nframes_t read_unlocked (MidiRingBuffer<nframes_t>& dst, - sframes_t position, - sframes_t start, nframes_t cnt, - sframes_t stamp_offset, sframes_t negative_stamp_offset) const = 0; + sframes_t position, + sframes_t start, nframes_t cnt, + sframes_t stamp_offset, sframes_t negative_stamp_offset, + MidiStateTracker* tracker) const = 0; virtual nframes_t write_unlocked (MidiRingBuffer<nframes_t>& dst, sframes_t position, diff --git a/libs/ardour/ardour/midi_state_tracker.h b/libs/ardour/ardour/midi_state_tracker.h index a058121da8..7b95772cac 100644 --- a/libs/ardour/ardour/midi_state_tracker.h +++ b/libs/ardour/ardour/midi_state_tracker.h @@ -21,11 +21,11 @@ #define __ardour_midi_state_tracker_h__ #include <bitset> - #include "ardour/midi_buffer.h" namespace ARDOUR { +template <typename T> class MidiRingBuffer; /** Tracks played notes, so they can be resolved in potential stuck note * situations (e.g. looping, transport stop, etc). @@ -36,7 +36,10 @@ public: MidiStateTracker(); void track (const MidiBuffer::iterator& from, const MidiBuffer::iterator& to, bool& looped); + void add (uint8_t note, uint8_t chn); + void remove (uint8_t note, uint8_t chn); void resolve_notes (MidiBuffer& buffer, nframes64_t time); + void resolve_notes (MidiRingBuffer<nframes_t>& buffer, nframes64_t time); void dump (std::ostream&); void reset (); diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h index c273395a74..bc636eea83 100644 --- a/libs/ardour/ardour/midi_track.h +++ b/libs/ardour/ardour/midi_track.h @@ -22,6 +22,7 @@ #include "ardour/track.h" #include "ardour/midi_ring_buffer.h" +#include "ardour/midi_state_tracker.h" namespace ARDOUR { @@ -96,8 +97,7 @@ protected: int _set_state (const XMLNode&, int, bool call_base); private: - void write_out_of_band_data ( - BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes); + void write_out_of_band_data (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes); int set_diskstream (boost::shared_ptr<MidiDiskstream> ds); void use_new_diskstream (); @@ -111,7 +111,6 @@ private: uint8_t _default_channel; bool _midi_thru; - int no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, bool state_changing, bool can_record, bool rec_monitors_input); void push_midi_input_to_step_edit_ringbuffer (nframes_t nframes); diff --git a/libs/ardour/ardour/smf_source.h b/libs/ardour/ardour/smf_source.h index fbaa049d8a..7793b6a91c 100644 --- a/libs/ardour/ardour/smf_source.h +++ b/libs/ardour/ardour/smf_source.h @@ -71,12 +71,13 @@ public: private: nframes_t read_unlocked (MidiRingBuffer<nframes_t>& dst, - sframes_t position, - sframes_t start, - nframes_t cnt, - sframes_t stamp_offset, - sframes_t negative_stamp_offset) const; - + sframes_t position, + sframes_t start, + nframes_t cnt, + sframes_t stamp_offset, + sframes_t negative_stamp_offset, + MidiStateTracker* tracker) const; + nframes_t write_unlocked (MidiRingBuffer<nframes_t>& src, sframes_t position, nframes_t cnt); |