+ 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);
+
+#ifndef NDEBUG
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("After %1 (%2 .. %3) we now have %4\n", mr->name(), mr->position(), mr->last_frame(), evlist.size()));
+ for (Evoral::EventList<framepos_t>::iterator x = evlist.begin(); x != evlist.end(); ++x) {
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("\t%1\n", **x));
+ }
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("\tAFTER: tracker says there are %1 on notes\n", tracker->on()));
+#endif
+ if (find (ended.begin(), ended.end(), *i) != ended.end()) {
+
+ /* the region ended within the read range, so
+ * resolve any dangling notes (i.e. notes whose
+ * end is beyond the end of the region).
+ */
+
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("\t%1 ended in this read, resolve notes and delete (%2) tracker\n",
+ mr->name(), ((new_tracker) ? "new" : "old")));
+
+ tracker->resolve_notes (evlist, (*i)->last_frame());
+ delete tracker;
+ if (!new_tracker) {
+ _note_trackers.erase (t);
+ }
+
+ } else {
+
+ if (new_tracker) {
+ _note_trackers.insert (make_pair (mr.get(), tracker));
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, "\tadded tracker to trackers\n");
+ }
+ }
+ }
+
+ if (!evlist.empty()) {
+
+ /* sort the event list */
+ EventsSortByTimeAndType<framepos_t> cmp;
+ evlist.sort (cmp);
+
+#ifndef NDEBUG
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("Final we now have %1 events\n", evlist.size()));
+ for (Evoral::EventList<framepos_t>::iterator x = evlist.begin(); x != evlist.end(); ++x) {
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("\t%1\n", **x));
+ }
+#endif
+ /* write into dst */
+ for (Evoral::EventList<framepos_t>::iterator e = evlist.begin(); e != evlist.end(); ++e) {
+ Evoral::Event<framepos_t>* ev (*e);
+ dst.write (ev->time(), ev->event_type(), ev->size(), ev->buffer());
+ delete ev;
+ }
+
+ }
+ }
+
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, "-------------------------------------------------------------\n");
+ return dur;