mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-15 19:16:40 +01:00
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
This commit is contained in:
parent
0605f98fdc
commit
7ff7f4013d
11 changed files with 102 additions and 94 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue