+
+ NoteTrackers::iterator t = _note_trackers.find (mr.get());
+ MidiStateTracker* tracker;
+ bool new_tracker = false;
+
+ if (t == _note_trackers.end()) {
+ tracker = new MidiStateTracker;
+ new_tracker = true;
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, "\tBEFORE: new tracker\n");
+ } else {
+ tracker = t->second;
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("\tBEFORE: tracker says there are %1 on notes\n", tracker->on()));
+ }
+
+ mr->read_at (dst, start, dur, chan_n, _note_mode, tracker);
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("\tAFTER: tracker says there are %1 on notes\n", tracker->on()));
+
+ if (new_tracker) {
+ pair<Region*,MidiStateTracker*> newpair;
+ newpair.first = mr.get();
+ newpair.second = tracker;
+ _note_trackers.insert (newpair);
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, "\tadded tracker to trackers\n");
+ }
+
+ _read_data_count += mr->read_data_count();
+ }
+
+ } else {
+
+ /* multiple regions and/or note resolution: sort by layer, read into a temporary non-monotonically
+ sorted EventSink, sort and then insert into dst.
+ */
+
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("%1 regions to read, plus %2 trackers\n", regs.size(), tracker_info.size()));
+
+ Evoral::EventList<nframes_t> evlist;
+
+ for (vector<TrackerInfo>::iterator t = tracker_info.begin(); t != tracker_info.end(); ++t) {
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("Resolve %1 notes\n", (*t).first->on()));
+ (*t).first->resolve_notes (evlist, (*t).second);
+ delete (*t).first;
+ }
+
+#ifndef NDEBUG
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("After resolution we now have %1 events\n", evlist.size()));
+ for (Evoral::EventList<nframes_t>::iterator x = evlist.begin(); x != evlist.end(); ++x) {
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("\t%1\n", **x));
+ }
+#endif
+
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("for %1 .. %2 we have %3 to consider\n", start, start+dur-1, regs.size()));
+
+ for (vector<boost::shared_ptr<Region> >::iterator i = regs.begin(); i != regs.end(); ++i) {
+ boost::shared_ptr<MidiRegion> mr = boost::dynamic_pointer_cast<MidiRegion>(*i);
+ if (!mr) {
+ continue;
+ }
+
+ NoteTrackers::iterator t = _note_trackers.find (mr.get());
+ MidiStateTracker* tracker;
+ bool new_tracker = false;
+
+
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("Before %1 (%2 .. %3) we now have %4 events\n", mr->name(), mr->position(), mr->last_frame(), evlist.size()));
+
+ if (t == _note_trackers.end()) {
+ tracker = new MidiStateTracker;
+ new_tracker = true;
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, "\tBEFORE: new tracker\n");
+ } else {
+ tracker = t->second;
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("\tBEFORE: tracker says there are %1 on notes\n", tracker->on()));
+ }
+
+
+ mr->read_at (evlist, start, dur, chan_n, _note_mode, tracker);