はじめに
iOS 8から AVFoundation に追加された AVAudioEngine を利用すると Objective-C で Audio Unit を操作することができます。Core Audio が何やら難しげでとっつきにくかった我々には朗報です。マルチバンドイコライザーなどの幾つかの Audio Units は AVAudioEngine で扱うことが可能です。ただし、AVAudioEngine だけでは Core Audio の全てを扱える訳ではないので今後の対応に期待しましょう。
AVAudioUnitEQ
マルチバンドイコライザーを扱うためのクラスです。バンド数は任意に指定することが可能です。実態は kAudioUnitSubType_NBandEQ
だと思われます。
インスタンス化
AVAudioUnitEQ *EQNode = [[AVAudioUnitEQ alloc] initWithNumberOfBands:10];
let EQNode = AVAudioUnitEQ(numberOfBands: 10)
引数を一つ取り、これには総バンド数を指定します。今回は iTunes でも使われる10-Bandとしました。
AVAudioUnitEQFilterParameters
各バンドは AVAudioUnitEQFilterParameters
で表現され、各のインスタンスに対してパラメータを後から設定します。これらは bands
プロパティから得られる配列内に既にインスタンス化されているため、alloc-init は不要です。
// 初期化時に指定した数の AVAudioUnitEQFilterParameters オブジェクトが格納される(今回は10個)
NSArray *bands = EQNode.bands;
AVAudioUnitEQFilterParameters *parameters = bands[0];
// NO で有効になる
parameters.bypass = NO;
// AVAudioUnitEQFilterType
parameters.filterType = AVAudioUnitEQFilterTypeParametric;
// 帯域幅(オクターブ)
parameters.bandwidth = 1.0f;
// 周波数(Hz)
parameters.frequency = 32.0f;
// 増減値(dB)
parameters.gain = 3.0f;
parameters.bypass = false
parameters.filterType = AVAudioUnitEQFilterType.Parametric
parameters.bandwidth = 1.0
parameters.frequency = 16000.0
parameters.gain = -1.2
全体の増減値は AVAudioUnitEQ.globalGain
です。
EQNode.globalGain = -8.0f;
これらを iTunes のイコライザーに当てはめるとこのようになります。
オーディオファイルの再生
こちらの記事で解説されています。
http://objective-audio.jp/2014/09/avaudioengine.html
AU Lab.app
AU Lab.app では Audio Unit の検証をすることができます。AUNBandEQ で動作検証をすると良いでしょう。
以前の Developer Tools には標準で組み込まれていましたが、最近では追加ダウンロード扱いのようです。