Ok, I have been googling around again and I think I found something about this. It looks like this problem has been around a long time because a SOS article from 2007 talks about it in a Cubase Tech article. The problem is called, “Live MIDI Buffering Jitter”.
Unfortunately, most sequencers choose not to calculate any offsets within the next buffer relating to ‘live’ MIDI data — they just quantise them all to the nearest buffer boundary, and rely on the buffers being short enough to mask unwanted rhythmic artifacts. The main reason they do this is to keep every note’s MIDI latency as low as possible, but at the expense of extra jitter.
For instance, if you play regular 16th notes at 120bpm, each note will occur at an interval of 125ms, but when a soft synth is played ‘live’ through an audio interface with a buffer size of 5ms you’ll perhaps hear them with spacings such as 125ms, 125ms, 125ms, 130ms, 120ms, 130ms, 125ms and so on, where occasional notes get shoved into adjacent buffers. For most people this is still scarcely audible, but if you raise the buffer size to 20ms then you might hear a string of ‘live’ notes emerging with spacings of 120ms, 120ms, 120ms, 140ms, 120ms, 120ms, 140ms and so on: the ‘granularity’ has increased.
So this may be a “known” issue. But I still wish there was something that could be done about it.