Resolves a parsed file's tick-based events into real-time seconds, honouring tempo
changes and pairing each note-on with its matching note-off to find a duration. A
note-on with no matching note-off (a malformed or truncated file) still sounds, for a
short default duration, rather than being dropped silently. Each note carries the
channel voice in effect when it starts (program, bank, combined volume/expression
gain, pan), so a sampled renderer can voice it without re-reading the events.
Resolves a parsed file's tick-based events into real-time seconds, honouring tempo changes and pairing each note-on with its matching note-off to find a duration. A note-on with no matching note-off (a malformed or truncated file) still sounds, for a short default duration, rather than being dropped silently. Each note carries the channel voice in effect when it starts (program, bank, combined volume/expression gain, pan), so a sampled renderer can voice it without re-reading the events.