- const Evoral::Event<nframes_t>& ev = *i;
- // event times should be frames, relative to cycle start
- assert(ev.time() >= 0);
- assert(ev.time() < (nframes+offset));
- if (ev.time() >= offset) {
- jack_midi_event_write (jack_buffer, (jack_nframes_t) ev.time(), ev.buffer(), ev.size());
+
+ const Evoral::MIDIEvent<MidiBuffer::TimeType> ev (*i, false);
+
+ // event times are in frames, relative to cycle start
+
+ assert (ev.time() < (nframes + _global_port_buffer_offset + _port_buffer_offset));
+
+ if (ev.event_type() == LoopEventType) {
+ resolve_notes (jack_buffer, ev.time());
+ continue;
+ }
+
+ if (ev.time() >= _global_port_buffer_offset + _port_buffer_offset) {
+ if (jack_midi_event_write (jack_buffer, (jack_nframes_t) ev.time(), ev.buffer(), ev.size()) != 0) {
+ cerr << "write failed, drop flushed note off on the floor, time "
+ << ev.time() << " > " << _global_port_buffer_offset + _port_buffer_offset << endl;
+ }
+ } else {
+ cerr << "drop flushed event on the floor, time " << ev.time()
+ << " < " << _global_port_buffer_offset + _port_buffer_offset << endl;