Периодически воспроизводите чистые звуки с помощью AudioKit - PullRequest
0 голосов
/ 17 мая 2018

Я хочу воспроизводить очень простые звуки с помощью генератора AudioKit на заданной частоте.

Например: воспроизвести простую синусоидальную волну при 400 Гц в течение 50 миллисекунд, затем 100 мс тишины, затем воспроизвести 600 Гц в течение 50 мс…

У меня есть вид металла, где я оказываю визуальные стимулы.Я намеревался использовать базовый AKOscillator и функцию рендеринга CADisplayLink для воспроизведения / остановки звука в некоторых кадрах.

Я попытался использовать oscillator.play() и oscillator.stop() или изменить амплитуду с помощью oscillator.amplitude = 0 иoscillator.amplitude = 1, но результатом в обоих случаях является дрожание около 10 мс.

Если я сначала создаю файлы .wav, а затем воспроизводлю их с AKPlayer.play(), синхронизация правильная.

Iхочу гибкость, чтобы использовать любую частоту в любое время.Как я могу сделать что-то похожее на первый подход?Обернуть осциллятор в миди-инструмент - это путь?

1 Ответ

0 голосов
/ 17 мая 2018

CADisplayLink работает в потоке пользовательского интерфейса, поэтому у него будет некоторое дрожание субкадра, поскольку поток пользовательского интерфейса имеет более низкий приоритет, чем аудиопотоки (и, возможно, другие ОС).

Единственный способ, которым япреуспел в надежном синтезе аудио с произвольной частотой с точностью до миллисекунды в реальном времени - поместил синусоидальный генератор (или генератор сигналов или просмотр таблицы) в обратный вызов аудиоустройства (RemoteIO для iOS) и посчитал выборки перед динамической вставкойостановка / запуск требуемой синусоиды (или другой формы волны) в буфере (ах) обратного вызова, начиная с правильного индекса смещения буфера выборки.

Сначала я предварительно сгенерировал таблицы поиска синусоидальных сигналов;но позже сделал некоторое профилирование;и обнаружил, что простой вызов функции sin () с вращающейся фазой, с частотой дискретизации звука, занимает едва измеряемую долю процента процессорного времени на любом современном устройстве iOS.Если вы используете увеличивающуюся фазу, убедитесь, что фаза находится в разумном числовом диапазоне, изредка прибавляя / вычитая кратные 2 * pi.

...