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

Как я и говорил, с помощью Audio Unit мы можем накладывать эффекты на звук, мы рассмотрим это на примере графа с тремя вершинами: AudioFilePlayer, Delay, RemoteIO. Звук из плеера будет поступать на вход эффекта, а из эффекта будет идти на RemoteIO, который свою очередь отправит звук на динамики.

Как добавить юнит в граф

Интересующий нас юнит с эффектом имеет тип kAudioUnitType_Effect и подтип kAudioUnitSubType_Delay. Добавить вершину с таким юнитом в граф можно так:

AudioComponentDescription acd;
acd.componentManufacturer = kAudioUnitManufacturer_Apple;
acd.componentType = kAudioUnitType_Effect;
acd.componentSubType = kAudioUnitSubType_Delay;

AUGraph graph = ...; AUNode delayNode; CA(AUGraphAddNode(graph, &acd, &delayNode));

Так же, как и для других юнитов, мы можем получить сам юнит из вершины (обязательно после открытия графа!):

AUGraph graph = ...;
AudioUnit delayUnit;
CA(AUGraphNodeInfo(graph, delayNode, NULL, &delayUnit));

Теперь соединим вершины:

AUGraph graph = ...;
AUNode playerNode = ...;
AUNode delayNode = ...;
AUNode rioNode = ...;
CA(AUGraphConnectNodeInput(graph, playerNode, 0, delayNode, 0));
CA(AUGraphConnectNodeInput(graph, delayNode, 0, rioNode, 0)); 

Первым вызовом AUGraphConnectNodeInput мы подключаем выход плеера ко входу эффекта, а вторым вызовом AUGraphConnectNodeInput мы подключаем выход эффекта ко входу RemoteIO.

Параметры юнита Delay

Как было сказано в введении, у юнитов кроме свойств есть еще и параметры. Параметры влияют на то, что юнит делает со звуком. Итак, Delay имеет 4 параметра:

  • kDelayParam_WetDryMix — влияет на то, сколько (по громкости) мы слышим оригинального звука и звука измененного эффектом. Диапазон от 0 до 100. Например, если значение 30, то мы слышим 70% громкости оригинального звука и 30% измененного. По-умолчанию значение равно 50.
  • kDelayParam_DelayTime — длинна задержки звука в секундах. Диапазон от 0 до 2 секунд. По-умолчанию значение 1. В таком случае мы будем слышать повторяющийся звук через секунду.
  • kDelayParam_Feedback — определяет насколько быстро будет затухать звук. Значения от -100 до 100. Чем больше значение (по моим наблюдениям, по модулю) тем медленнее будет затухать звук. Похоже, что на 100 совсем не затухает.
  • kDelayParam_LopassCutoff — самый нераскрытый для меня параметр. Но, очевидно, это — фильтр, который пропускает все частоты ниже заданных. Диапазон от 10 до половины частоты дискретизации звука. По-умолчанию равен 15000 Hz.

Установим, например, длинну задержки звука:

AudioUnit delayUnit = ...;
AudioUnitParameterValue value = 0.5; // длинна задержки - пол секунды
CA(AudioUnitSetParameter(delayUnit, kDelayParam_DelayTime, kAudioUnitScope_Global, 0, value, 0));

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

Заключение

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

  • Audio Unit в iOS. Часть 1, введение
  • Audio Unit в iOS. Часть 2, строим граф и проигрываем файлы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *