From 7ff7f4013dfbbf18d08e397230ad2486fa7ff58f Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 9 Jun 2007 02:07:59 +0000 Subject: Use double MIDI timestamps (towards tempo based time, and more-than-sample-accurate LV2 MIDI plugin application). Eliminate double iteration over MIDIRingBuffer read to translate timestamps. git-svn-id: svn://localhost/ardour2/trunk@1981 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/smf_source.cc | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'libs/ardour/smf_source.cc') diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc index b046ad6fca..d1192f5186 100644 --- a/libs/ardour/smf_source.cc +++ b/libs/ardour/smf_source.cc @@ -250,7 +250,7 @@ SMFSource::find_first_event_after(nframes_t start) * skipped (eg a meta event), or -1 on EOF (or end of track). */ int -SMFSource::read_event(MidiEvent& ev) const +SMFSource::read_event(jack_midi_event_t& ev) const { // - 4 is for the EOT event, which we don't actually want to read //if (feof(_fd) || ftell(_fd) >= _header_size + _track_size - 4) { @@ -307,13 +307,12 @@ SMFSource::read_unlocked (MidiRingBuffer& dst, nframes_t start, nframes_t cnt, n // FIXME: ugh unsigned char ev_buf[MidiBuffer::max_event_size()]; - MidiEvent ev; + jack_midi_event_t ev; // time in SMF ticks ev.time = 0; ev.size = MidiBuffer::max_event_size(); ev.buffer = ev_buf; - // FIXME: it would be an impressive feat to actually make this any slower :) - + // FIXME: don't seek to start every read fseek(_fd, _header_size, 0); // FIXME: assumes tempo never changes after start @@ -787,8 +786,11 @@ SMFSource::load_model(bool lock) fseek(_fd, _header_size, 0); - nframes_t time = 0; - MidiEvent ev; + uint64_t time = 0; /* in SMF ticks */ + jack_midi_event_t ev; + ev.time = 0; + ev.size = 0; + ev.buffer = NULL; // FIXME: assumes tempo never changes after start const double frames_per_beat = _session.tempo_map().tempo_at(_timeline_position).frames_per_beat( @@ -797,13 +799,12 @@ SMFSource::load_model(bool lock) 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); + + const double ev_time = (double)(time * frames_per_beat / (double)_ppqn); // in frames if (ret > 0) { // didn't skip (meta) event //cerr << "ADDING EVENT TO MODEL: " << ev.time << endl; - _model->append(ev); + _model->append(ev_time, ev.size, ev.buffer); } } } -- cgit v1.2.3