LoginSignup
33
36

More than 5 years have passed since last update.

AVAudioEngine でマルチバンドイコライザーを作る

Last updated at Posted at 2014-12-21

eqimg.png

はじめに

iOS 8から AVFoundation に追加された AVAudioEngine を利用すると Objective-C で Audio Unit を操作することができます。Core Audio が何やら難しげでとっつきにくかった我々には朗報です。マルチバンドイコライザーなどの幾つかの Audio Units は AVAudioEngine で扱うことが可能です。ただし、AVAudioEngine だけでは Core Audio の全てを扱える訳ではないので今後の対応に期待しましょう。

AVAudioUnitEQ

マルチバンドイコライザーを扱うためのクラスです。バンド数は任意に指定することが可能です。実態は kAudioUnitSubType_NBandEQ だと思われます。

インスタンス化

ObjC
AVAudioUnitEQ *EQNode = [[AVAudioUnitEQ alloc] initWithNumberOfBands:10];
Swift
let EQNode = AVAudioUnitEQ(numberOfBands: 10)

引数を一つ取り、これには総バンド数を指定します。今回は iTunes でも使われる10-Bandとしました。

AVAudioUnitEQFilterParameters

各バンドは AVAudioUnitEQFilterParameters で表現され、各のインスタンスに対してパラメータを後から設定します。これらは bands プロパティから得られる配列内に既にインスタンス化されているため、alloc-init は不要です。

// 初期化時に指定した数の AVAudioUnitEQFilterParameters オブジェクトが格納される(今回は10個)
NSArray *bands = EQNode.bands;
AVAudioUnitEQFilterParameters *parameters = bands[0];
ObjC
// NO で有効になる
parameters.bypass = NO;
// AVAudioUnitEQFilterType
parameters.filterType = AVAudioUnitEQFilterTypeParametric;
// 帯域幅(オクターブ)
parameters.bandwidth = 1.0f;
// 周波数(Hz)
parameters.frequency = 32.0f;
// 増減値(dB)
parameters.gain = 3.0f;
Swift
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 のイコライザーに当てはめるとこのようになります。

itunes.png

オーディオファイルの再生

こちらの記事で解説されています。
http://objective-audio.jp/2014/09/avaudioengine.html

AU Lab.app

AU Lab.app では Audio Unit の検証をすることができます。AUNBandEQ で動作検証をすると良いでしょう。
以前の Developer Tools には標準で組み込まれていましたが、最近では追加ダウンロード扱いのようです。

33
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
36