+ if (sends_output ()) {
+
+ void* port_buffer = port_engine.get_buffer (_port_handle, nframes);
+
+ if (_resolve_required) {
+ /* resolve all notes at the start of the buffer */
+ resolve_notes (port_buffer, 0);
+ _resolve_required = false;
+ }
+
+ for (MidiBuffer::iterator i = _buffer->begin(); i != _buffer->end(); ++i) {
+
+ 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.time() >= _global_port_buffer_offset + _port_buffer_offset) {
+ if (port_engine.midi_event_put (port_buffer, (pframes_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
+ << " to early for " << _global_port_buffer_offset
+ << " + " << _port_buffer_offset << endl;
+ }
+ }