Аудио на iPhone - PullRequest
       22

Аудио на iPhone

10 голосов
/ 16 июня 2009

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

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

Заранее спасибо.

Ответы [ 4 ]

19 голосов
/ 17 июня 2009

Я пошел по этому пути в 2009 году, пробуя Audio Toolkit, Audio Queue Services, openAL и, наконец, остановился на RemoteIO AudioUnit.

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

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

OpenAL был находкой - он был готов к работе менее чем через час, после того как я взял в руки пример приложения для iPhone «CrashLanding», которое больше недоступно от Apple. Я обнаружил, что OpenAL идеально подходит для игр или даже музыкальных инструментов - сэмплы можно было предварительно загружать, регулировать частоту было легко, и зацикливание не было проблемой. Для меня заключалась сделка, заключающаяся в том, что запуск и остановка петлевого семпла почти каждый раз приводили бы к неприятному «поп» Кроме того, встроенный трехмерный позиционный аудиомикшер был слишком загружен процессором, на мой взгляд.

Если ваш инструмент не использует циклические сэмплы, я бы предложил сначала попробовать маршрут 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 - извиняюсь за беспорядок, я надеюсь, что у меня будет время, чтобы почистить код и комментарии. 1029 *

1 голос
/ 17 июня 2009

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

0 голосов
/ 24 октября 2012

Другой вариант теперь - AUSampler. http://developer.apple.com/library/mac/#technotes/tn2283/_index.html

0 голосов
/ 17 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...