| 
							- #pragma once
 - 
 - #include "MidiTrack.h"
 - #include "FilteredIterator.h"
 - #include <memory>
 - 
 - class MidiSong;
 - class MidiSelectionModel;
 - 
 - class MidiEditorContext
 - {
 - public:
 -     MidiEditorContext(std::shared_ptr<MidiSong>);
 -     ~MidiEditorContext();
 - 
 -     float cursorPitch() const
 -     {
 -         return m_cursorPitch;
 -     }
 -     void setCursorPitch(float pitch)
 -     {
 -         m_cursorPitch = pitch;
 -     }
 -     float cursorTime() const
 -     {
 -         return m_cursorTime;
 -     }
 -     void setCursorTime(float time)
 -     {
 -         m_cursorTime = time;
 -     }
 - 
 -     MidiEvent::time_t startTime()
 -     {
 -         return m_startTime;
 -     }
 -     void setStartTime(MidiEvent::time_t t)
 -     {
 -         m_startTime = t;
 -     }
 -     void setEndTime(MidiEvent::time_t t)
 -     {
 -         m_endTime = t;
 -     }
 -     void setTimeRange(MidiEvent::time_t start, MidiEvent::time_t end)
 -     {
 -         m_startTime = start;
 -         m_endTime = end;
 -         assert(end > start);
 -     }
 - 
 -     MidiEvent::time_t endTime()
 -     {
 -         return m_endTime;
 -     }
 -     float pitchHi()
 -     {
 -         return m_pitchHi;
 -     }
 -     float pitchLow()
 -     {
 -         return m_pitchLow;
 -     }
 -     void setPitchLow(float p)
 -     {
 -         m_pitchLow = p;
 -     }
 -     void setPitchHi(float p)
 -     {
 -         m_pitchHi = p;
 -     }
 -     void setPitchRange(float l, float h)
 -     {
 -         assert(h >= l);
 -         m_pitchHi = h;
 -         m_pitchLow = l;
 -     }
 -     int getTrackNumber()
 -     {
 -         return trackNumber;
 -     }
 -     void setTrackNumber(int n)
 -     {
 -         trackNumber = n;
 -     }
 - 
 -     MidiTrackPtr getTrack();
 - 
 -     void setCursorToNote(MidiNoteEventPtrC note);
 -     void setCursorToSelection(std::shared_ptr<MidiSelectionModel> selection);
 - 
 -  
 -     // TODO: change to const_iterator
 -     using iterator = filtered_iterator<MidiEvent, MidiTrack::const_iterator>;
 -     using iterator_pair = std::pair<iterator, iterator>;
 -     iterator_pair getEvents() const;
 - 
 -     int track = 0;
 -     std::shared_ptr<MidiSong> getSong() const;
 - 
 -     void scrollVertically(float pitchCV);
 - 
 -     // Which field of note is being edited?
 -     enum class NoteAttribute
 -     {
 -         Pitch,
 -         Duration,
 -         StartTime
 -     };
 - 
 -     NoteAttribute noteAttribute;
 - 
 -     void assertValid() const;
 - 
 -     bool cursorInViewport() const;
 -     void assertCursorInViewport() const;
 -     void scrollViewportToCursorPitch();
 -     bool cursorInViewportTime() const;
 -     void adjustViewportForCursor();
 - private:
 -        // TODO: don't allow direct access?
 -     float m_cursorTime = 0;
 -     float m_cursorPitch = 0;
 - 
 -     // range will include t == start time, but will not
 -     // include t == endTime
 -     MidiEvent::time_t m_startTime = 0;
 -     MidiEvent::time_t m_endTime = 1;
 - 
 -     // pitch is inclusive: Low and Hi will be included
 -     float m_pitchLow = 0;
 -     float m_pitchHi = 0;
 - 
 -     int trackNumber = 0;
 - 
 -      // Below is not for clients to call. TODO: use private or something.
 -     // Definitely need some architecture here.
 -     std::weak_ptr<MidiSong> _song;
 - 
 - };
 - 
 - using MidiEditorContextPtr = std::shared_ptr<MidiEditorContext>;
 
 
  |