С чего начать на iOS аудио синтезатор? - PullRequest
30 голосов
/ 29 декабря 2010

Я знаю, что это очень широкая тема, но я слоняюсь с демонстрациями и моими собственными тестами и не уверен, правильно ли я атакую ​​проблему. Так что любые выводы о том, где я должен начать, будут оценены.

Цель состоит в том, чтобы приложение генерировало синтезированные звуки в соответствии с настройками пользователя. (Это не единственная функция приложения, я не воссоздаю здесь Korg, но синтезатор является частью этого.) Пользователь устанавливает типичные настройки синтезатора, такие как wave, reverb и т. Д., Затем выбирает, когда будет играть нота, вероятно, с модификатором высоты тона и скорости.

Я немного поигрался с аудиоустройством и RemoteIO, но едва понимал, что я делаю. Прежде чем я зайду СЛИШКОМ далеко вниз по этой кроличьей норе, я хотел бы знать, нахожусь ли я даже на правильном поле. Я знаю, что аудиосинтез будет на низком уровне, но я надеюсь, что, возможно, есть какие-то библиотеки более высокого уровня, которые я могу использовать.

Если у вас есть какие-либо указания относительно того, с чего начать, и о какой технологии iOS, о которой мне следует прочитать подробнее, сообщите мне.

Спасибо!

РЕДАКТИРОВАТЬ: позвольте мне лучше обобщить вопросы.

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

Существуют ли какие-либо API более высокого уровня, которые могут помочь сгенерировать буферы проще?

Предполагая, что я уже могу генерировать буферы, есть ли лучший / более простой способ передать эти буферы на аудиоустройство iOS, чем аудиоустройство RemoteIO?

Ответы [ 10 ]

9 голосов
/ 29 октября 2012

Это действительно хороший вопрос.Иногда я спрашиваю себя об одном и том же, и всегда заканчиваю тем, что использую MoMu Toolkit от ребят из Стэнфорда.Эта библиотека предоставляет удобную функцию обратного вызова, которая подключается к AudioUnits / AudioToolbox (не уверен), поэтому все, что вам нужно, это установить частоту дискретизации, размер буфера и битовую глубину аудиосэмплов, и вы можете легко синтезировать /обрабатывайте все что угодно внутри функции обратного вызова.

Я также рекомендую Synthesis ToolKit (STK) для iOS , который также был выпущен Ge Wang в Стэнфорде.Действительно классные вещи для синтеза / обработки аудио.

Каждый раз, когда Apple выпускает новую версию iOS, я проверяю новую документацию, чтобы найти лучший (или более простой) способ синтеза аудио, но всегда безуспешно.

РЕДАКТИРОВАТЬ: Я хочу добавить ссылку на исходный код AudioGraph: https://github.com/tkzic/audiograph Это действительно интересное приложение, чтобы показать потенциал AudioUnits, созданный Томом Зикарелли.Код действительно прост в использовании, и отличный способ узнать об этом - кто-то скажет - запутанный процесс работы с низкоуровневым звуком в iOS.

6 голосов
/ 09 июля 2015

Swift & Objective C

Есть отличный проект с открытым исходным кодом, который хорошо документирован с помощью видео и учебных пособий для Objective-C и Swift.

AudioKit.io

4 голосов
/ 01 февраля 2011

Самый низкий уровень доступа к буферам для звуковой карты - через аудиоинтерфейс API, и в частности, аудиоустройство RemoteIO.Это кучка бреда, но в Интернете есть несколько примеров.http://atastypixel.com/blog/using-remoteio-audio-unit/ - это один.

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

Другой способ сделатьэто использование openframeworks для всех ваших аудиоматериалов, но это также предполагает, что вы хотите сделать свой рисунок в openGL.Отрыв реализации аудиоустройства не должен быть слишком большой проблемой, если вы хотите сделать свой рисунок другим способом.Эта конкретная реализация хороша, потому что она сбрасывает все до -1..1 с плавающей запятой для вас.

Наконец, если вы хотите начать с начала набора осцилляторов / фильтров / задержек, которые вы можете подключитьв аудиосистему openframeworks (или любую систему, которая использует массивы с плавающей запятой -1..1), вы можете проверить http://www.maximilian.strangeloop.co.uk.

3 голосов
/ 22 августа 2013

Я знаю, что это старый пост, но посмотрите The Amazing Audio Engine .

Amazing Audio Engine - это сложная структура для аудио приложений iOS, созданная таким образом, что вам не нужно. С ней очень легко работать, и она обрабатывает все тонкости аудио iOS от вашего имени.

Это пришло от разработчика AudioBus для iOS.

3 голосов
/ 09 июня 2013

Я знаю, что эта тема старая, и я удивлен, что ситуация с iOS все еще не улучшилась, когда дело доходит до звука.

Однако на горизонте есть серебряная линия: iOS 6 поддерживает API WebAudio. Мне удалось создать хороший полифонический синтезатор с несколькими строчками в JavaScript. По крайней мере, есть базовые вещи, такие как Осцилляторы, доступные из коробки:

https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html

и (просто чтобы выбрать один пример из многих)

3 голосов
/ 31 августа 2011

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

3 голосов
/ 29 декабря 2010

Это две части: во-первых, вам нужно сгенерировать буферы синтезированного звука - это в значительной степени не зависит от платформы, и вам понадобится хорошее понимание синтеза звука, чтобы написать эту часть.Вторая часть передает эти буферы в соответствующий API для конкретной ОС, чтобы звук действительно воспроизводился.Большинство API для воспроизведения аудио поддерживают двойную буферизацию или даже несколько буферов, так что вы можете синтезировать будущие буферы во время воспроизведения текущего буфера.Что касается того, какой API iOS использовать, это, вероятно, будет зависеть от того, какую архитектуру вы используете для своего приложения, но это действительно простая часть.В части синтеза вам нужно будет выполнить большую часть работы.

2 голосов
/ 11 декабря 2011

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

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

так что вам нужно кодировать смарт внутри этого обратного вызова. Есть несколько ловушек, таких как использование NSLog и доступ к свойствам другого объекта, которые были объявлены без неатома (т.е. они будут неявно создавать блокировки).

это главная причина, по которой Apple создала инфраструктуру более высокого уровня (AQ), чтобы вывести этот сложный бизнес на низком уровне. AQ позволяет вам получать процесс и выплевывать звуковые буферы в потоке, где не имеет значения, если вы вызываете задержку.

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

На самом деле, просто зайдите с аудиоустройствами - начните с той ссылки, которую дал вам jonbro. Несмотря на то, что AQ - это высокоуровневая инфраструктура, она требует большей головной боли, и аудиоустройство RemoteIO - подходящий инструмент для этой работы.

1 голос
/ 26 мая 2012

Я использовал пример вывода звука из открытых фреймворков и библиотеки синтеза stanford stk для работы над моим iOS-синтезатором.

0 голосов
/ 21 августа 2017

Я экспериментировал с Tonic Audio synth library . Простой и понятный код с готовыми примерами для macOS и iOS.

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

Я выдвинул свои поплавки к динамикам, используя аналог Тоника, Новокаин .

Например, 256k использовать их для всей музыки, которую он генерирует.

Совсем недавно я нашел AVAudioUnitSampler , супер-простой способ воспроизведения сэмплированного звука на разных частотах с низкой задержкой.

...