Поделиться через


Задержка синтезатора

Еще одним соображением времени синтезатора является задержка, которая представляет собой разницу между текущим временем и первым временем, когда может воспроизводиться заметка. Сообщение MIDI не может быть отправлено синтезатору и отрисовано в выходной буфер в текущий момент времени выборки. Для данных, которые уже были помещены в буфер, но еще не были переданы в поток на устройство вывода волн, необходимо указать квоту.

Поэтому приемник волн должен реализовывать часы задержки, которые являются объектом IReferenceClock (описано в документации по Microsoft Windows SDK). Метод IReferenceClock::GetTime часов задержки извлекает время выборки, до которого данные уже были записаны в буфер, и преобразует его в ссылочное время относительно master часов. Приемник волн выполняет преобразования между временем ссылки и выборки с помощью IDirectMusicSynthSink::SampleToRefTime и IDirectMusicSynthSink::RefTimeToSample, поэтому в этом случае синтезатор вызывает IDirectMusicSynthSink::RefTimeToSample для выполнения преобразования.

Все время задержки управляется приемником волн. Реализация метода IDirectMusicSynthSink::GetLatencyClock должна выводить указатель на часы задержки, а этот указатель, в свою очередь, должен быть получен методом IDirectMusicSynth::GetLatencyClock. Приложение использует часы задержки, чтобы определить самую раннюю точку во времени, когда сообщение MIDI может быть помещено в очередь для воспроизведения при его передаче в синтезатор путем вызова метода IDirectMusicSynth::P layBuffer .

Пример задержки сообщения MIDI показан на следующем рисунке.

Схема, иллюстрирующая задержку сообщения MIDI в буферном цикле PCM.

На предыдущем рисунке часы задержки указывают на первое место в буферном цикле PCM, где можно воспроизводить заметку. Обратите внимание, что master часы находятся на уровне 22 единиц времени, что является точкой, из которой в настоящее время воспроизводится звук, но пространство между 22 и 30 единицами времени уже заполнено данными волн и больше не может быть записано. Таким образом, первое место, где можно запланировать новое событие MIDI с меткой времени, — это время 30. Таким образом, часы задержки считывают 30 единиц времени.

Сообщения могут быть запланированы для воспроизведения в это время задержки или в любое время после нее. Таким образом, сообщения, которые должны быть отрисованы немедленно, помечаются временем задержки (а не текущее время), прежде чем помещаться во входной буфер синтезатора.