- for (MidiBuffer::iterator i = from; i != to; ++i) {
- const Evoral::MIDIEvent ev(*i, false);
- if (ev.event_type() == LoopEventType) {
- ret = true;
- continue;
- }
+ }
+ DEBUG_TRACE (PBD::DEBUG::MidiTrackers, string_compose ("%1 OFF %2/%3 current voices = %5 total on %4\n",
+ this, (int) note, (int) chn, _on,
+ (int) _active_notes[note+128 * chn]));
+}
+
+void
+MidiStateTracker::track (const MidiBuffer::const_iterator &from, const MidiBuffer::const_iterator &to)
+{
+ for (MidiBuffer::const_iterator i = from; i != to; ++i) {
+ track(*i);
+ }
+}
+
+void
+MidiStateTracker::track (const uint8_t* evbuf)
+{
+ const uint8_t type = evbuf[0] & 0xF0;
+ const uint8_t chan = evbuf[0] & 0x0F;
+ switch (type) {
+ case MIDI_CTL_ALL_NOTES_OFF:
+ reset();
+ break;
+ case MIDI_CMD_NOTE_ON:
+ add(evbuf[1], chan);
+ break;
+ case MIDI_CMD_NOTE_OFF:
+ remove(evbuf[1], chan);
+ break;
+ }
+}
+
+void
+MidiStateTracker::resolve_notes (MidiBuffer &dst, framepos_t time)
+{
+ DEBUG_TRACE (PBD::DEBUG::MidiTrackers, string_compose ("%1 MB-resolve notes @ %2 on = %3\n", this, time, _on));
+
+ if (!_on) {
+ return;
+ }