Лучше не использовать NSIndexPath (пустая таблица) и не предполагать, что верхней точкой является CGPointZero (вставки содержимого), вот что я использую -
[tableView setContentOffset:CGPointMake(0.0f, -tableView.contentInset.top) animated:YES];
Надеюсь, это поможет.
Короче да. Первый трек содержит информацию о времени, которая будет применяться ко всей аранжировке, поэтому вы применяете эти сообщения для каждого трека с одинаковым абсолютным временем. Поскольку все события используют смещение в тиках, вам необходимо сначала извлечь сообщения об изменении темпа, преобразовать их в абсолютное время, а затем, когда вы читаете другие треки, вы будете применять эти сообщения на основе этой временной шкалы.
Центр технической «промывки мозгов» фанатиков MIDI :
В файле формата 0 изменения темпа разбросаны по всему MTrk. В формате 1 самый первый MTrk должен состоять только из событий темпа (и размера), чтобы его могло прочитать какое-нибудь устройство, способное генерировать «карту темпа». Лучше не размещать MIDI-события в этом MTrk. В формате 2 каждый MTrk должен начинаться по крайней мере с одного события начального темпа (и размера).
Тем не менее, некоторые секвенсоры нарушают это правило и помещают фактические MIDI-события в первую дорожку вместе с информацией о времени, поскольку стандарт не является Не так уж конкретно в этом плане. Ваша программа должна иметь дело с обоими случаями, поскольку она может встретить в «дикой природе» файлы MIDI, отформатированные таким образом.