Лучший способ воспроизвести звук с помощью атаки / сустейна (петли) / затухания с помощью AVAudioPlayer - PullRequest
5 голосов
/ 09 мая 2011

У меня проблема с поиском ресурсов при воспроизведении последовательности атаки (начало звука) / сустейна (зацикливание звука) / затухания (окончание звука) без разрывов перехода. Есть ли хорошие библиотеки для обработки этого, или я должен свернуть свои собственные с AVAudioPlayer? AudioQueue - лучшее место для поиска? Раньше я использовал SoundEngine.cpp, но это давно прошло. CAF по-прежнему является лучшим форматом для использования?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

Из вашего описания звучит так, как будто вы пытаетесь написать программный синтезатор. Единственный способ, которым вы могли бы использовать AVAudioPlayer для чего-то подобного, это составить всю длительность заметки в виде одного файла WAV, а затем воспроизвести все это с помощью AVAudioPlayer.

Для создания звука ноты произвольной длительности, который начинает воспроизводиться в ответ на действие пользователя (например, нажатие кнопки), а затем продолжается до второго действия пользователя (например, нажатие кнопки «Стоп» или отмена пальца). первая кнопка) начинает процесс понижения громкости зацикленной области до нуля (часть «релиз»), вам нужно будет использовать AudioQueue (AVAudioPlayer может использоваться для воспроизведения звука, созданного полностью в памяти, но весь воспроизведение должно быть построено до начала воспроизведения, а это означает, что вы не можете изменить то, что воспроизводится, в ответ на действия пользователя [кроме как остановить воспроизведение]).

Вот другой вопрос / ответ , который показывает просто, как использовать AudioQueue. AudioQueue вызывает метод обратного вызова всякий раз, когда ему нужно загрузить больше данных для воспроизведения - вам придется реализовать весь код, который зацикливает и оборачивает исходные данные файла WAV.

1 голос
/ 27 октября 2011

создать свой собственный генератор конвертов очень просто.трудной частью будет обновление вашей программы для использования аудиоуслуг более низкого уровня для непосредственного изменения сигнала.

для этого вам потребуется:

  • сэмплы аудиофайла
  • настроить AudioQueue (это один из подходов, но я продолжаю с ним, потому что он был упомянут в OP, и это относительно высокий уровень API для предоставленного пользователем буфера семплов)
  • обеспечиваетсигнал в очередь
  • определяет, является ли ваша программа лучшей в режиме реального времени или предварительно обработанной

в реальном времени

  • Позволяет использовать живые варианты
  • управление точками петли
  • управление позицией рендеринга
  • возможность определения амплитуды для применения в зависимости от диапазона положения выборки, который вы читаете

или

Предварительно обработано

  • Может потребоваться больше памяти
  • Требуется меньше ЦП
  • применить конверт к вашей копиибуфера семплов
  • управляйте вашим положением рендераion

Я также предполагаю, что вам нужны только медленные / простые переходы.Если вам нужен какой-нибудь сумасшедший / быстрый LFO без псевдонимов, у вас будет гораздо больше работы.Этот подход не должен приводить к звуковому псевдониму, если ваши изменения не слишком резкие:

Писать простой генератор огибающей (EG) легко;Если вам нужен толчок в этом направлении, проверьте Apple SinSynth на очень простой EG.

...