diff options
author | David Robillard <d@drobilla.net> | 2008-02-21 00:15:20 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2008-02-21 00:15:20 +0000 |
commit | 0d0bd81a75d23a9d2dd13312f30b7f21138e037a (patch) | |
tree | be0b987aca046bcde33a39b2a12f786d3846b785 /libs/ardour/smf_source.cc | |
parent | 68bfed0a461635e3f5c05651f755dca6e22df5d9 (diff) |
Fix timing on MIDI import.
git-svn-id: svn://localhost/ardour2/branches/3.0@3093 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/smf_source.cc')
-rw-r--r-- | libs/ardour/smf_source.cc | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc index 85cebf2b09..10713ef505 100644 --- a/libs/ardour/smf_source.cc +++ b/libs/ardour/smf_source.cc @@ -435,7 +435,7 @@ SMFSource::write_unlocked (MidiRingBuffer& src, nframes_t cnt) time -= _timeline_position; const MidiEvent ev(time, size, buf); - append_event_unlocked(ev); + append_event_unlocked(Frames, ev); if (_model) _model->append(ev); @@ -454,7 +454,7 @@ SMFSource::write_unlocked (MidiRingBuffer& src, nframes_t cnt) void -SMFSource::append_event_unlocked(const MidiEvent& ev) +SMFSource::append_event_unlocked(EventTimeUnit unit, const MidiEvent& ev) { /*printf("%s - append chan = %u, time = %lf, size = %u, data = ", _path.c_str(), (unsigned)ev.channel(), ev.time(), ev.size()); @@ -466,12 +466,19 @@ SMFSource::append_event_unlocked(const MidiEvent& ev) assert(ev.time() >= 0); assert(ev.time() >= _last_ev_time); - // 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(), - _session.tempo_map().meter_at(_timeline_position)); + uint32_t delta_time = 0; - const uint32_t delta_time = (uint32_t)((ev.time() - _last_ev_time) / frames_per_beat * _ppqn); + if (unit == Frames) { + // 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(), + _session.tempo_map().meter_at(_timeline_position)); + + delta_time = (uint32_t)((ev.time() - _last_ev_time) / frames_per_beat * _ppqn); + } else { + assert(unit == Beats); + delta_time = (uint32_t)((ev.time() - _last_ev_time) * _ppqn); + } const size_t stamp_size = write_var_len(delta_time); fwrite(ev.buffer(), 1, ev.size(), _fd); |