Аудио на iPhone

Я ищу создать приложение, которое эмулирует физический инструмент. У меня есть звуковые сэмплы, но я хочу, чтобы у вас была возможность увеличить высоту тона/частоты динамически, поэтому мне не нужно загружать из слишком большого количества файлов.

Любая идея, с которой аудио API сможет это сделать? Я считаю, что OpenAL или Audio Queue Services, но я не уверен, что подходит. Любые ссылки на руководства/примеры кода также очень ценятся.

Спасибо заранее.

Ответ 1

Я пошел по этой дороге в 2009 году, попробовав Audio Toolkit, Службы очереди аудио, openAL и, наконец, установив RemoteIO AudioUnit.

Audio Toolbox отлично подходит для базовых инициированных звуковых эффектов, но он не смог изменить частоты или образцы циклов.

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

OpenAL был находкой - он работал с ним менее чем через час, после того как я получил приложение для iPhone, отличное от Apple, "CrashLanding". Я обнаружил, что OpenAL идеально подходит для игр или даже для музыкального инструмента - образцы могут быть предварительно загружены, регулировка частоты была простой, а петли не было проблемой. Сделка для меня заключалась в том, что запуск и остановка зацикленного образца приведет к неприятному "поп" почти каждый раз. Также встроенный 3D-позиционный аудиомикшер был слишком интенсивным для процессора по своему вкусу.

Если ваш инструмент не использует зацикленные образцы, я бы предложил сначала попробовать маршрут OpenAL - кривая обучения намного менее запугивает. Попробуйте отследить "SoundEngine.h", "CrashLanding" или "TouchFighter" или проверьте следующую ссылку:

http://benbritten.com/blog/2008/11/06/openal-sound-on-the-iphone/

Поскольку для меня требовались зацикленные сэмплы, я, наконец, остановился на AudioUnits (который на iPhone называется "RemoteIO", если вы хотите делать ввод или вывод). Это было чрезвычайно сложно реализовать - очень похоже на Audio Queue Services, поскольку ядро ​​вашей реализации будет находиться внутри "обратного вызова" буфера, вызываемого несколько раз в секунду, чтобы заполнить буфер исходящего аудио с необработанными значениями SInt16.

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

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

http://michael.tyson.id.au/2008/11/04/using-remoteio-audio-unit/

Удачи!

Отредактированные годы спустя: я открыл исходный код RemoteIO/AudioUnits, о котором я говорил выше: https://github.com/glenn-barnett/hexaphone/blob/master/Classes/Instrument.m - извинения за беспорядок, я надеюсь получить некоторое время, чтобы очистить код и комментарии.

Ответ 2

Попробуйте создать аудиоустройство. Я делаю что-то похожее, и AU хорошо работает для меня. Первоначально я использовал звуковую очередь, поскольку она была проще (более высокий уровень?) И синхронно, однако он испытывал недостаток в реагировании, поэтому я сбросил его для Audio Unit.

Ответ 3

Звучит немного, как будто вы создаете по существу волновой метод синтеза MIDI файлов. Возможно, вы сможете найти MIDI-синтезатор для iPhone, который вы можете использовать, а затем использовать ваши образцы аудио для создания набора для волнения. В любое время, когда вы хотите воспроизводить тональные сигналы, вы просто отправляете MIDI-событие на синтезатор iPhone MIDI с загруженным wavetable набором.