#pragma once #include #include #include #include "FilteredIterator.h" #include "SqCommand.h" #include "MidiEvent.h" class MidiLock; class MidiTrack; class MidiLock; using MidiTrackPtr = std::shared_ptr; using MidiTrackConstPtr = std::shared_ptr; class MidiTrack { public: MidiTrack(std::shared_ptr); int size() const; void assertValid() const; void insertEvent(MidiEventPtr ev); void deleteEvent(const MidiEvent&); void insertEnd(MidiEvent::time_t time); float getLength() const; std::shared_ptr getEndEvent(); std::shared_ptr getFirstNote(); /** * Returns all events as a vector, so that they may be indexed. * Obviously this is rather slow (O(n)), so don't use it for editing. */ std::vector _testGetVector() const; using container = std::multimap; using iterator = container::iterator; using reverse_iterator = container::reverse_iterator; using const_iterator = container::const_iterator; using const_reverse_iterator = container::const_reverse_iterator; using iterator_pair = std::pair; using note_iterator = filtered_iterator; using note_iterator_pair = std::pair; note_iterator_pair timeRangeNotes(MidiEvent::time_t start, MidiEvent::time_t end) const; /** * finds an event that satisfies == and returns a pointer to it */ const_iterator findEventDeep(const MidiEvent&); const_iterator findEventPointer(MidiEventPtrC); /** * Returns pair of iterators for all events start <= t <= end */ iterator_pair timeRange(MidiEvent::time_t start, MidiEvent::time_t end) const; iterator begin() { return events.begin(); } iterator end() { return events.end(); } const_iterator begin() const { return events.begin(); } const_iterator end() const { return events.end(); } void _dump() const; /** * factory method to generate test content. */ enum class TestContent { eightQNotes, empty }; static MidiTrackPtr makeTest(TestContent, std::shared_ptr); std::shared_ptr lock; private: container events; static MidiTrackPtr makeTest1(std::shared_ptr); static MidiTrackPtr makeTestEmpty(std::shared_ptr); }; using MidiTrackPtr = std::shared_ptr;