AVAudioUnitのパラメータ詳細（基本編）

iOS8から`AVAudioEngine`というオーディオ機能がAVFoundation内に追加されています。
細かな説明は他の方も行われていますので、ここでは簡単に「AUGraphのiOS版」のようなものと言っておくことにします。（ラッパークラスというのが適当かもしれませんが）

ただし、隠蔽されている点は数多く見られます。今回紹介するパラメータについてもそうですが、コールバックの利用方法が見当たらなかったのは大きいです。それがゆえに、私自身が今後AUGraphからAVAudioEngineに置き換えるかどうかというと、今のところはNOです。
今後の拡充に期待というのと、プロトタイプを作成するときに利用するには便利かなと思います。

大まかには以下の構成になっています。

- AVAudioEngine
- AVAudioFile
- AVAudioNode
  - AVAudioEnvironmentNode　（今回は使わない）
  - AVAudioIONode　（今回は使わない）
  - AVAudioPlayerNode
  - AVAudioMixerNode
  - AVAudioUnit

さらに`AVAudioUnit`（「Audio UnitのiOS版」ですね）について掘り下げると以下のようになっています。

- AVAudioUnit
  - AVAudioUnitEffect
  - AVAudioUnitGenerator　（今回は使わない）
  - AVAudioUnitMIDIInstrument　（今回は使わない）
  - AVAudioUnitTimeEffect

今回はAVAudioUnitのパラメータの詳細について、Audio Unitと比較しながら説明していきます。
（Audio Unitのパラメータ詳細については、[こちらの記事](http://qiita.com/MJeeeey/items/fc9ebf3547fe40244e2c)を参照してください。）

# AVAudioUnitEffect
`kAudioUnitType_Effect`のiOS版です。ただ、公開されているEffectの種類は少ないです。

## AVAudioUnitDelay
ディレイ。`kAudioUnitSubType_Delay`のiOS版です。
これについてはAudio Unitのものと同等のパラメータが公開されています。

~~~c
// ディレイタイム
NSTimeInterval delayTime = 1;	// Range: 0 -> 2

// フィードバック
float feedback = 50;	// Range: -100 -> 100

// 高域側のカットオフ周波数
float lowPassCutoff = 15000;	// Range: 10 -> (samplerate/2)

// Mixの割合
float wetDryMix = 100;	// Range: 0 (all dry) -> 100 (all wet)
~~~

## AVAudioUnitDistortion
ディストーション。`kAudioUnitSubType_Distortion`のiOS版です。
Presetを用意することで、ほとんどのパラメータは隠蔽されています。ですが、簡単につかってみたいのであればこちらの方が良いのかも。

以下のメソッドでPresetをセットします。

~~~objectivec
- (void)loadFactoryPreset:(AVAudioUnitDistortionPreset)preset;
~~~

Presetは以下の種類が用意されています。

~~~c
typedef NS_ENUM(NSInteger, AVAudioUnitDistortionPreset) {
    AVAudioUnitDistortionPresetDrumsBitBrush           = 0,
    AVAudioUnitDistortionPresetDrumsBufferBeats        = 1,
    AVAudioUnitDistortionPresetDrumsLoFi               = 2,
    AVAudioUnitDistortionPresetMultiBrokenSpeaker      = 3,
    AVAudioUnitDistortionPresetMultiCellphoneConcert   = 4,
    AVAudioUnitDistortionPresetMultiDecimated1         = 5,
    AVAudioUnitDistortionPresetMultiDecimated2         = 6,
    AVAudioUnitDistortionPresetMultiDecimated3         = 7,
    AVAudioUnitDistortionPresetMultiDecimated4         = 8,
    AVAudioUnitDistortionPresetMultiDistortedFunk      = 9,
    AVAudioUnitDistortionPresetMultiDistortedCubed     = 10,
    AVAudioUnitDistortionPresetMultiDistortedSquared   = 11,
    AVAudioUnitDistortionPresetMultiEcho1              = 12,
    AVAudioUnitDistortionPresetMultiEcho2              = 13,
    AVAudioUnitDistortionPresetMultiEchoTight1         = 14,
    AVAudioUnitDistortionPresetMultiEchoTight2         = 15,
    AVAudioUnitDistortionPresetMultiEverythingIsBroken = 16,
    AVAudioUnitDistortionPresetSpeechAlienChatter      = 17,
    AVAudioUnitDistortionPresetSpeechCosmicInterference = 18,
    AVAudioUnitDistortionPresetSpeechGoldenPi          = 19,
    AVAudioUnitDistortionPresetSpeechRadioTower        = 20,
    AVAudioUnitDistortionPresetSpeechWaves             = 21
} NS_ENUM_AVAILABLE(10_10, 8_0);
~~~

公開されているパラメータは以下のものだけのようです。

~~~c
// プリゲイン
float preGain = -6;	// Range: -80 -> 20

// Mixの割合
float wetDryMix = 50;	// Range: 0 (all dry) -> 100 (all distorted)
~~~


## AVAudioUnitEQ
イコライザー。`kAudioUnitSubType_NBandEQ`のiOS版です。
これについてはAudio Unitのものと同等のパラメータが公開されています。

他のエフェクトとはやや構成が異なるので、（説明しやすくするため）最初に具体的なコード例を載せます。

~~~objectivec
// AVAudioUnitEQ *_audioUnitEq;

// 初期化（バンド数：2）
NSUInteger numberOfBands = 2;
_audioUnitEq = [[AVAudioUnitEQ alloc] initWithNumberOfBands:numberOfBands];
[_audioEngine attachNode:_audioUnitEq];

// パラメータ設定
_audioUnitEq.globalGain = 0.0;
NSArray *bands = _audioUnitEq.bands;
for (int i = 0; i < numberOfBands; i++) {
	AVAudioUnitEQFilterParameters *parameters = bands[i];
	parameters.filterType = AVAudioUnitEQFilterTypeParametric;
	parameters.frequency = 128.0 + 128.0 * i;
	parameters.bandwidth = 0.5;
	parameters.gain = 0.0;
	parameters.bypass = NO;
}
~~~

初期化時にバンド数をセットするようになっているので、Audio Unitのときよりバンド数の設定方法がわかりやすくなっています。

~~~objectivec
- (instancetype)initWithNumberOfBands:(NSUInteger)numberOfBands;
~~~

バンド全体に対してのパラメータは、以下のグローバルゲインのみです。

~~~c
// グローバルゲイン
float globalGain = 0;	// Range: -96 -> 24
~~~

各バンドに対してのパラメータです。Audio Unitのものと同等のパラメータが公開されています。

~~~objectivec
// フィルタータイプ
AVAudioUnitEQFilterType filterType = 0;

// 中心周波数
float frequency = 1000;	// Range: 20 -> (SampleRate/2)

// バンド幅
float bandwidth = 0.5;	// Range: 0.05 -> 5.0

// ゲイン
float gain = 0;	// Range: -96 -> 24

// バイパス
BOOL bypass = NO;
~~~

フィルタータイプはAudio Unitと同じです。

~~~c
typedef NS_ENUM(NSInteger, AVAudioUnitEQFilterType) {
    AVAudioUnitEQFilterTypeParametric        = 0,
    AVAudioUnitEQFilterTypeLowPass           = 1,
    AVAudioUnitEQFilterTypeHighPass          = 2,
    AVAudioUnitEQFilterTypeResonantLowPass   = 3,
    AVAudioUnitEQFilterTypeResonantHighPass  = 4,
    AVAudioUnitEQFilterTypeBandPass          = 5,
    AVAudioUnitEQFilterTypeBandStop          = 6,
    AVAudioUnitEQFilterTypeLowShelf          = 7,
    AVAudioUnitEQFilterTypeHighShelf         = 8,
    AVAudioUnitEQFilterTypeResonantLowShelf  = 9,
    AVAudioUnitEQFilterTypeResonantHighShelf = 10,
} NS_ENUM_AVAILABLE(10_10, 8_0);
~~~


## AVAudioUnitReverb
リバーブ。`kAudioUnitSubType_Reverb2`のiOS版です。
Presetを用意することで、ほとんどのパラメータは隠蔽されています。（ディストーションと同じ形態）

以下のメソッドでPresetをセットします。

~~~objectivec
- (void)loadFactoryPreset:(AVAudioUnitReverbPreset)preset;
~~~

Presetは以下の種類が用意されています。

~~~c
typedef NS_ENUM(NSInteger, AVAudioUnitReverbPreset) {
    AVAudioUnitReverbPresetSmallRoom       = 0,
    AVAudioUnitReverbPresetMediumRoom      = 1,
    AVAudioUnitReverbPresetLargeRoom       = 2,
    AVAudioUnitReverbPresetMediumHall      = 3,
    AVAudioUnitReverbPresetLargeHall       = 4,
    AVAudioUnitReverbPresetPlate           = 5,
    AVAudioUnitReverbPresetMediumChamber   = 6,
    AVAudioUnitReverbPresetLargeChamber    = 7,
    AVAudioUnitReverbPresetCathedral       = 8,
    AVAudioUnitReverbPresetLargeRoom2      = 9,
    AVAudioUnitReverbPresetMediumHall2     = 10,
    AVAudioUnitReverbPresetMediumHall3     = 11,
    AVAudioUnitReverbPresetLargeHall2      = 12
} NS_ENUM_AVAILABLE(10_10, 8_0);
~~~

公開されているパラメータはwetDryMixだけのようです。

~~~c
// Mixの割合
float wetDryMix = 0.5;	// Range: 0 (all dry) -> 100 (all wet)
~~~

# AVAudioUnitGenerator
`kAudioUnitType_Generator`のiOS版です。
ここでは説明は省略します。

# AVAudioUnitMIDIInstrument
`kAudioUnitType_MusicDevice`のiOS版です。

## AVAudioUnitSampler
サンプラー。`kAudioUnitSubType_Sampler`のiOS版です。
これは別の機会で扱うとして、ここでは説明は省略します。

# AVAudioUnitTimeEffect
`kAudioUnitType_FormatConverter`のiOS版、というにはかなり限定されています。クラス名からもわかるように、Time Effectに関するものが該当するようです。

## AVAudioUnitTimePitch
タイムストレッチ、ピッチシフト。`kAudioUnitSubType_NewTimePitch`のiOS版です。
ほとんどのパラメータは公開されていますので、十分に柔軟な使い方ができると思います。

~~~c
// 再生スピード
float rate = 1.0;	// Range: 1/32 -> 32.0

// ピッチ
float pitch = 1.0;	// Range: -2400 -> 2400

// オーバーラップ数。値の大きい方が音質も向上するが、処理が重くなる。
float overlap = 8.0;	// Range: 3.0 -> 32.0
~~~

## AVAudioUnitVarispeed
再生スピードとピッチが同期して変化するエフェクト。`kAudioUnitSubType_Varispeed`のiOS版です。

Audio Unitではもう1つパラメータがありますが、以下のパラメータだけで機能としては十分です。

~~~c
// 変換レート
float rate = 1.0;	// Range: 0.25 -> 4.0
~~~

以上です。

実装方法については、以下のサンプルプログラムを参照してください。（AudioEngineIO）
https://github.com/JunichiMinamino/AudioObjCSample

今回の記事は、ヘッダーで公開されているプロパティやメソッドについてまとめたものですので「基本編」としました。
AVAudioUnitを用いた場合でもAudio Unitレベルの詳細のパラメータを設定することは可能です。その方法については[AVAudioUnitのパラメータ詳細（応用編）](http://qiita.com/MJeeeey/items/b4332c649e8350dad844)を参照してください。