Уже давно как многие устройства поддерживают Running Status. Даже если нажать (ИЛИ отпустить) 10 нот, то передастся всего навсего 21 байт: 9к nn vv nn vv … nn vv (к - MIDI канал, nn - нота, vv - динамика). Ну или же 31 байт (9к nn vv 00 nn vv 00 … nn vv 00 — не знаю, может ли быть так?). Если Running Status не поддерживает, то 9к nn vv 9к nn vv… или 9к nn vv 00 9к nn vv 00… — итого 30 или 40 байт). Получается, в теории, при скорости 32 байта в миллисекунду, т.е. 31,25 киБ/сек, минимальная задержка между первым и последним событиями может доходить до 2 мсек… Но вот про размер пакета в 8 байт… хм… А что мешает устройству объединить пару таких событий в один пакет?
Кстати, мне приходилось вручную шестнадцатеричным редактором править MIDI-файлы (SMF). Там между MIDI-событиями может вставляться от одного до нескольких байт — время между событиями в "tick`ах" (00 - нет расстояния, т.е. в секвенсоре они отображаются одновременно). Если в процессе такой правки меняется итоговый размер файла, то тогда ещё нужно и в MTrk-заголовке поправить это число.
Ещё нужно учесть, что некоторые устройства отправляют Active Sensing (FE) и Timing Clock (F8), вот тут-то при живой игре, помимо того, что пальцами трудно столько клавиш в одном tick`е нажать (не говоря уже о том, чтоб воткнуть в один пакет), так ещё и эти System Realtime сообщения могут совсем незначительно сдвинуть сообщения нот/CC/пр.… А вот что касается tick`ов и темпа – О – вот это интересно рассчитать:
при 320 BPM одна доля (один удар) или, проще говоря, четверть должна быть равной 187,5 мсек.;
Если TPQN (PPQ) = 1680, то между tick`ами должно выходить около 0,1116 мсек.
Теперь вот думаем в один ли tick разместит одно/два/три события, когда за один пакет из 8 байт проходит 0,25 мсек, или же оно в одно время может на tick`и разделить, а в другое время - вместить?…