Midi timestamps

David Henningsson coding at diwic.se
Sun Mar 14 15:05:00 CET 2021


Hi,

When writing an application that records midi (and e g saves it to 
disk), ultra-low latency isn't really needed, all we need to know is 
exactly when the midi message came in. The application can then wake up 
once a second or so, to write the incoming data, including an accurate 
timestamp for every event, to disk.

As far as I can see, the rawmidi interface does not support such a 
feature at all. There is a snd_rawmidi_status syscall, but its timestamp 
field is not even filled by the kernel (!). But even if that was fixed, 
it would not fix the problem as there could be several midi events in 
the buffer with different timestamps.

You could use the seq interface, it does support timestamps, but I can 
see at least two potential problems with this:

First, the seq code runs in a work queue, not in the actual IRQ. This 
means that midi event is timestamped too late, especially so if the work 
is delayed for some reason.

Second, seq hard-codes the timestamp type to monotonic - there is no 
monotonic_raw, so the timestamp would be affected by NTP changes.

Also, the timespec uses 32-bit for sec and nsec, but I suspect this is 
less of a problem (unless people constantly record midi for sixty years 
or so...).

It seems like it could be useful to have a rawmidi mode which 
automatically prefixes every incoming message with a timestamp. This 
would replace the current "raw" midi buffer with some type of header 
"length, timestamp, data" or so. Arguably this would make the rawmidi 
slightly less raw, but anyway. Does this make sense? Should I attempt to 
write something? Or would it be better to try to use (and potentially 
improve) the seq code?

// David



More information about the Alsa-devel mailing list