- const Evoral::Event<double>& 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);
+
+
+ if (sends_output() && _trace_on) {
+ uint8_t const * const buf = ev.buffer();
+ const framepos_t now = AudioEngine::instance()->sample_time_at_cycle_start();
+
+ _self_parser.set_timestamp (now + ev.time());
+
+ uint32_t limit = ev.size();
+
+ for (size_t n = 0; n < limit; ++n) {
+ _self_parser.scanner (buf[n]);
+ }
+ }
+
+
+ // event times are in frames, relative to cycle start
+
+#ifndef NDEBUG
+ if (DEBUG_ENABLED (DEBUG::MidiIO)) {
+ DEBUG_STR_DECL(a);
+ DEBUG_STR_APPEND(a, string_compose ("MidiPort %1 pop event @ %2 sz %3 ", _buffer, ev.time(), ev.size()));
+ for (size_t i=0; i < ev.size(); ++i) {
+ DEBUG_STR_APPEND(a,hex);
+ DEBUG_STR_APPEND(a,"0x");
+ DEBUG_STR_APPEND(a,(int)(ev.buffer()[i]));
+ DEBUG_STR_APPEND(a,' ');
+ }
+ DEBUG_STR_APPEND(a,'\n');
+ DEBUG_TRACE (DEBUG::MidiIO, DEBUG_STR(a).str());
+ }
+#endif
+
+ 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.time()
+ << " too early for " << _global_port_buffer_offset
+ << " + " << _port_buffer_offset;
+ for (size_t xx = 0; xx < ev.size(); ++xx) {
+ cerr << ' ' << hex << (int) ev.buffer()[xx];
+ }
+ cerr << dec << endl;