You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
2.6KB

  1. #pragma once
  2. #include <vector>
  3. #include <map>
  4. #include <memory>
  5. #include "FilteredIterator.h"
  6. #include "SqCommand.h"
  7. #include "MidiEvent.h"
  8. class MidiLock;
  9. class MidiTrack;
  10. class MidiLock;
  11. using MidiTrackPtr = std::shared_ptr<MidiTrack>;
  12. using MidiTrackConstPtr = std::shared_ptr<const MidiTrack>;
  13. class MidiTrack
  14. {
  15. public:
  16. MidiTrack(std::shared_ptr<MidiLock>);
  17. int size() const;
  18. void assertValid() const;
  19. void insertEvent(MidiEventPtr ev);
  20. void deleteEvent(const MidiEvent&);
  21. void insertEnd(MidiEvent::time_t time);
  22. float getLength() const;
  23. std::shared_ptr<MidiEndEvent> getEndEvent();
  24. std::shared_ptr<MidiNoteEvent> getFirstNote();
  25. /**
  26. * Returns all events as a vector, so that they may be indexed.
  27. * Obviously this is rather slow (O(n)), so don't use it for editing.
  28. */
  29. std::vector<MidiEventPtr> _testGetVector() const;
  30. using container = std::multimap<MidiEvent::time_t, MidiEventPtr>;
  31. using iterator = container::iterator;
  32. using reverse_iterator = container::reverse_iterator;
  33. using const_iterator = container::const_iterator;
  34. using const_reverse_iterator = container::const_reverse_iterator;
  35. using iterator_pair = std::pair<const_iterator, const_iterator>;
  36. using note_iterator = filtered_iterator<MidiEvent, MidiTrack::const_iterator>;
  37. using note_iterator_pair = std::pair<note_iterator, note_iterator>;
  38. note_iterator_pair timeRangeNotes(MidiEvent::time_t start, MidiEvent::time_t end) const;
  39. /**
  40. * finds an event that satisfies == and returns a pointer to it
  41. */
  42. const_iterator findEventDeep(const MidiEvent&);
  43. const_iterator findEventPointer(MidiEventPtrC);
  44. /**
  45. * Returns pair of iterators for all events start <= t <= end
  46. */
  47. iterator_pair timeRange(MidiEvent::time_t start, MidiEvent::time_t end) const;
  48. iterator begin()
  49. {
  50. return events.begin();
  51. }
  52. iterator end()
  53. {
  54. return events.end();
  55. }
  56. const_iterator begin() const
  57. {
  58. return events.begin();
  59. }
  60. const_iterator end() const
  61. {
  62. return events.end();
  63. }
  64. void _dump() const;
  65. /**
  66. * factory method to generate test content.
  67. */
  68. enum class TestContent
  69. {
  70. eightQNotes,
  71. empty
  72. };
  73. static MidiTrackPtr makeTest(TestContent, std::shared_ptr<MidiLock>);
  74. std::shared_ptr<MidiLock> lock;
  75. private:
  76. container events;
  77. static MidiTrackPtr makeTest1(std::shared_ptr<MidiLock>);
  78. static MidiTrackPtr makeTestEmpty(std::shared_ptr<MidiLock>);
  79. };
  80. using MidiTrackPtr = std::shared_ptr<MidiTrack>;