Вопрос

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

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

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

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

Спасибо!

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

Свифт и Цель C

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

AudioKit.io

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

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

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

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

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

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

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

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

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

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

Я знаю, что это старый пост, но посмотрите Удивительный звуковой движок.

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

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

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

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

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

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

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

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

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

Я экспериментировал с Библиотека синтезаторов Tonic Audio.Чистый и простой для понимания код с готовыми к компиляции примерами для macOS и iOS.

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

Я отправил свои плавающие массивы на динамики, используя аналог Tonic, Новокаин.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top