-
- 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()));
+ /* Read from region into target. */
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO, string_compose ("read from %1 at %2 for %3 LR %4 .. %5\n",
+ mr->name(), start, dur,
+ (loop_range ? loop_range->from : -1),
+ (loop_range ? loop_range->to : -1)));
+ mr->read_at (tgt, start, dur, loop_range, chan_n, _note_mode, &tracker->tracker, filter);
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO,
+ string_compose ("\tPost-read: %1 active notes\n", tracker->tracker.on()));
+
+ if (find (ended.begin(), ended.end(), *i) != ended.end()) {
+ /* Region ended within the read range, so resolve any active notes
+ (either stuck notes in the data, or notes that end after the end
+ of the region). */
+ DEBUG_TRACE (DEBUG::MidiPlaylistIO,
+ string_compose ("\t%1 ended, resolve notes and delete (%2) tracker\n",
+ mr->name(), ((new_tracker) ? "new" : "old")));
+
+ tracker->tracker.resolve_notes (tgt, loop_range ? loop_range->squish ((*i)->last_frame()) : (*i)->last_frame());
+ if (!new_tracker) {
+ _note_trackers.erase (t);