После небольшого тестирования я на самом деле обнаружил, что воспроизводится не первая нота, а последующие ноты, которые играют заранее. Кроме того, количество нот, которые воспроизводятся точно во время запуска секвенсора, зависит от установленного темпа.
Самое смешное, что если темп <400, будет одна нота, сыгранная вовремя, а другие заранее, если это 400 <= bpm <800, то две ноты будут сыграны правильно, а другие заранее и и так далее, за каждые 400 ударов в минуту вы получаете еще одну ноту, сыгранную правильно. </p>
Итак ... поскольку ноты разыгрываются заранее, а не поздно, решение, которое решило это для меня:
1) Используйте сэмплер, который не подключен напрямую к миди-выходу трека, но имеет метод .play()
, вызываемый внутри обратного вызова.
2) Следите за тем, когда запускается секвенсор
3) При каждом обратном вызове подсчитайте, когда нота должна воспроизводиться относительно времени начала, и укажите, сколько времени на самом деле, чтобы вы могли рассчитать смещение.
4) использовать вычисленное смещение для dispatch_async после смещения вашего .play()
метода.
И все, я протестировал это на нескольких устройствах, и теперь все ноты отлично воспроизводятся вовремя.