Создание простых сигналов с помощью CoreAudio - PullRequest
9 голосов
/ 11 июня 2010

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

Что мне нужно для этого? И можете ли вы дать мне пример или учебник? Спасибо.

Ответы [ 5 ]

14 голосов
/ 21 марта 2011

В предыдущем ответе есть ряд ошибок. Я, легендарный :-) Джеймс Маккартни, а не Джеймс Харкинс написал sinewavedemo, я также написал SuperCollider, о котором рассказывает сайт audiosynth.com. Я также сейчас работаю в Apple над CoreAudio. Sinewavedemo использует CoreAudio, поскольку он использует AudioHardware.h из CoreAudio.framework в качестве способа воспроизведения звука.

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

2 голосов
/ 01 января 2015

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

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

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

  • для прямоугольной волны, избегайте просто программировать массив со значениями +1 / -1. Такой сигнал не ограничен полосой пропускания и будет многозначным. Не забывайте, что спектр прямоугольной волны практически бесконечен!

Чтобы получить хорошие алгоритмы для генерации сигнала, взгляните на musicdsp.org, это, вероятно, один из лучших ресурсов для этого

1 голос
/ 27 декабря 2012

Если вы не делаете это в реальном времени, использование функции sin() из math.h - неплохая идея.Просто заполните заранее столько сэмплов, сколько вам нужно, с помощью sin (), когда пришло время его воспроизвести, просто отправьте его в аудио-буфер.Функция sin () может быть довольно медленной, чтобы вызывать один семпл каждый раз, если вы делаете это в режиме реального времени, поскольку использование метода интерполированного волнового поиска намного быстрее, но результирующий звук не будет таким спектрально чистым.

1 голос
/ 11 июня 2010

Вы новичок в звуковом программировании в целом? В качестве отправной точки я бы проверил

http://www.audiosynth.com/sinewavedemo.html

Это минимальная реализация osx sinewave от легендарного Джеймса Харкинса. Обратите внимание, что он вообще не использует CoreAudio.

Если вы специально хотите использовать CoreAudio для своей синусоиды, вам нужно создать модуль вывода (RemoteIO на iphone, AUHAL на osx) и предоставить обратный вызов ввода, где вы можете в значительной степени использовать код из приведенного выше примера. Проверить

http://developer.apple.com/mac/library/technotes/tn2002/tn2091.html

Преимущества CoreAudio заключаются, главным образом, в связывании других эффектов с вашей синусоидой, написании плагинов для таких хостов, как Logic, и предоставлении для них интерфейсов, в написании хоста (например, Logic) для плагинов, которые могут быть объединены в цепочку.

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

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

Вот некоторая помощь по настройке графиков http://timbolstad.com/2010/03/16/core-audio-getting-started-pt2/

Это не так сложно, как кажется. Apple предоставляет вспомогательные классы C ++ для многих вещей (/ Developer / examples / CoreAudio / PublicUtility), и даже если вы не хотите использовать C ++ (вам не нужно!), Они могут быть полезным руководством по API CoreAudio.

0 голосов
/ 08 января 2015

Хороший и хорошо документированный синусоидальный проигрыватель пример кода в главе 7 книги Adamson / Avila "Learning Core Audio", опубликованной Addison-Wesley Professional (ISBN-10: 0-321 -63684-8):

http://www.informit.com/store/learning-core-audio-a-hands-on-guide-to-audio-programming-9780321636843

Это довольно новая публикация (2012 г.), в которой конкретно рассматривается вопрос этого вопроса. Это только отправная точка, но это ценная отправная точка.

КСТАТИ. Не переходите к графикам до того, как позади этот базовый урок (который включает в себя некоторую математику).

Что касается примера кода, то быстрый и эффективный метод, который я часто использую, имеет дело с предварительно заполненной синусоидальной таблицей поиска, которая имеет столько же элементов, сколько частота дискретизации, для 44100 Гц таблица имеет размер 44100. Другими словами, длина цикла равна частота дискретизации. Это дает приемлемый компромисс между скоростью и качеством во многих случаях. Вы можете инициализировать его с помощью программы.
Если вы генерируете сэмплы с плавающей точкой (по умолчанию в OSX) и используете функции math , используйте sinf () вместо (поплавок) грех () . Акции в циклах внутреннего цикла обратного вызова рендеринга всегда дорогостоящие . Как и повторяющиеся умножения констант, такие как 2.0 * M_PI , которые слишком часто можно найти в примерах кода.

...