Fix time skew after MIDI recording (added missing conversion from delta time to audio...
authorDavid Robillard <d@drobilla.net>
Fri, 8 Jun 2007 23:03:32 +0000 (23:03 +0000)
committerDavid Robillard <d@drobilla.net>
Fri, 8 Jun 2007 23:03:32 +0000 (23:03 +0000)
Fix crash bug in MIDI recording.

git-svn-id: svn://localhost/ardour2/trunk@1980 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/midi_region_view.cc
libs/ardour/ardour/midi_ring_buffer.h
libs/ardour/smf_source.cc

index b4b3f18e3b595c6e052b3324e8d957124c511a10..918505b123afa5899f00e97fb67171adac553210 100644 (file)
@@ -150,12 +150,13 @@ MidiRegionView::end_write()
 void
 MidiRegionView::add_event (const MidiEvent& ev)
 {
-       /*printf("Event, time = %u, size = %zu, data = ",
+       printf("Event, time = %u, size = %zu, data = ",
          ev.time, ev.size);
          for (size_t i=0; i < ev.size; ++i) {
          printf("%X ", ev.buffer[i]);
          }
-         printf("\n");*/
+         printf("\n\n");
+
        double y1 = trackview.height / 2.0;
        if ((ev.buffer[0] & 0xF0) == MIDI_CMD_NOTE_ON) {
                const Byte& note = ev.buffer[1];
index 86319ad4b2e7d2441b34a0a03231acbc90c2037e..657ec0852a0e71d6c9f439fe6afa9d9da622a167 100644 (file)
@@ -300,8 +300,7 @@ MidiRingBuffer::read(MidiBuffer& dst, nframes_t start, nframes_t end)
                        //      priv_read_ptr);
                        //
                } else {
-                       printf("MRB - SKIPPING - %#X %d %d with time %u\n",
-                                       ev.buffer[0], ev.buffer[1], ev.buffer[2], ev.time);
+                       printf("MRB - SKIPPING EVENT (with time %u)\n", ev.time);
                        break;
                }
 
index 11b62e488fb362ed12cbaf33f6810afddfbc2a45..b046ad6fca78247fe5f14f761b4fdd0854ebe7a2 100644 (file)
@@ -790,10 +790,17 @@ SMFSource::load_model(bool lock)
        nframes_t time = 0;
        MidiEvent ev;
        
+       // FIXME: assumes tempo never changes after start
+       const double frames_per_beat = _session.tempo_map().tempo_at(_timeline_position).frames_per_beat(
+                       _session.engine().frame_rate());
+       
        int ret;
        while ((ret = read_event(ev)) >= 0) {
                time += ev.time;
                ev.time = time;
+
+               ev.time = (nframes_t)(ev.time * frames_per_beat / (double)_ppqn);
+
                if (ret > 0) { // didn't skip (meta) event
                        //cerr << "ADDING EVENT TO MODEL: " << ev.time << endl;
                        _model->append(ev);