Audio Unitのパラメータ詳細（Effect編）

[前回の投稿](http://qiita.com/MJeeeey/items/6583689e23ac702e31c0)では、AUGraphを用いたリアルタイム・タイムストレッチについて説明しました。これは`kAudioUnitType_FormatConverter`の分類にある`kAudioUnitSubType_AUiPodTimeOther`を用いて実現しました。

Audio Unitは他にも様々な機能を有しています。今回は`kAudioUnitType_Effect`に対して、パラメータの詳細について説明します。

## 概要

Audio Unitのパラメータの種類は`AudioUnit/AUComponent.h`で定義されています。

`Audio Unit Type`は以下の種類があります。

~~~
kAudioUnitType_Output
kAudioUnitType_MusicDevice
kAudioUnitType_MusicEffect
kAudioUnitType_FormatConverter
kAudioUnitType_Effect
kAudioUnitType_Mixer
kAudioUnitType_Panner
kAudioUnitType_Generator
kAudioUnitType_OfflineEffect
kAudioUnitType_MIDIProcessor
~~~

Audio Unit Type の各Typeをさらに分類した`Audio Unit SubType`のうち、Effectについて、iOSで（現時点で）利用できる機能は以下のものがあります。

~~~
kAudioUnitSubType_PeakLimiter
kAudioUnitSubType_DynamicsProcessor
kAudioUnitSubType_LowPassFilter
kAudioUnitSubType_HighPassFilter
kAudioUnitSubType_BandPassFilter
kAudioUnitSubType_HighShelfFilter
kAudioUnitSubType_LowShelfFilter
kAudioUnitSubType_ParametricEQ
kAudioUnitSubType_Distortion
kAudioUnitSubType_Delay
kAudioUnitSubType_SampleDelay
kAudioUnitSubType_NBandEQ
kAudioUnitSubType_Reverb2
kAudioUnitSubType_AUiPodEQ
~~~

今回は上記SubTypeのパラメータについて説明します。一部を除き、大部分は`AudioUnit/AudioUnitParameters.h`で定義されています。

前回の投稿と同様、サンプルプログラムでのNSLogにて取得した結果をそのまま載せています。

## kAudioUnitSubType_PeakLimiter

ピーク・リミッター。コンプレッサーとほぼ同じ概念のエフェクトです。
`attack time`でリミッターがかかるまでの時間を、`release time`でリミッターが終了するまでの時間を調整します。`pre-gain`でリミッターのゲインを調整します。

~~~
numOfParams = 3
paramList[0] = 0
paramInfo.name = attack time
paramInfo.minValue = 0.000500
paramInfo.maxValue = 0.030000
paramInfo.defaultValue = 0.002000
paramList[1] = 1
paramInfo.name = release time
paramInfo.minValue = 0.001000
paramInfo.maxValue = 0.040000
paramInfo.defaultValue = 0.005000
paramList[2] = 2
paramInfo.name = pre-gain
paramInfo.minValue = -40.000000
paramInfo.maxValue = 40.000000
paramInfo.defaultValue = 0.000000
~~~

## kAudioUnitSubType_DynamicsProcessor

ダイナミクス・プロセッサー。ダイナミクス系のエフェクト（コンプレッサー／リミッター、エキスパンダー／ノイズ・ゲート）が得られます。エキスパンダーとは、しきい値のレベルに対して、それ以上のレベルをより大きく、それ以下のレベルをより小さくして、ダイナミックレンジを広げる機能です。
`compression threshold`はコンプレッサーのしきい値を設定します。
`headroom`は基準音量レベルと最大許容レベルの比を設定します。
`expansion ratio`と`expansion threshold`はエキスパンダーの増幅率としきい値を設定します。
`attack time``release time`はダイナミクスのかかる前後の時間を調整します。

~~~
numOfParams = 7
paramList[0] = 0
paramInfo.name = compression threshold
paramInfo.minValue = -100.000000
paramInfo.maxValue = 20.000000
paramInfo.defaultValue = -15.000000
paramList[1] = 1
paramInfo.name = headroom
paramInfo.minValue = 0.100000
paramInfo.maxValue = 40.000000
paramInfo.defaultValue = 5.600000
paramList[2] = 2
paramInfo.name = expansion ratio
paramInfo.minValue = 1.000000
paramInfo.maxValue = 50.000000
paramInfo.defaultValue = 1.000000
paramList[3] = 3
paramInfo.name = expansion threshold
paramInfo.minValue = -120.000000
paramInfo.maxValue = 0.000000
paramInfo.defaultValue = -100.000000
paramList[4] = 4
paramInfo.name = attack time
paramInfo.minValue = 0.001000
paramInfo.maxValue = 0.300000
paramInfo.defaultValue = 0.050000
paramList[5] = 5
paramInfo.name = release time
paramInfo.minValue = 0.010000
paramInfo.maxValue = 3.000000
paramInfo.defaultValue = 0.030000
paramList[6] = 6
paramInfo.name = master gain
paramInfo.minValue = -40.000000
paramInfo.maxValue = 40.000000
paramInfo.defaultValue = 0.000000
~~~

## kAudioUnitSubType_LowPassFilter

ローパスフィルター。`cutoff frequency`以下の周波数領域の音を通します。
`resonance`はcutoff frequency付近の周波数の音量を調整する機能で、音にクセが付きます。

~~~
numOfParams = 2
paramList[0] = 0
paramInfo.name = cutoff frequency
paramInfo.minValue = 10.000000
paramInfo.maxValue = 21829.500000
paramInfo.defaultValue = 6900.000000
paramList[1] = 1
paramInfo.name = resonance
paramInfo.minValue = -20.000000
paramInfo.maxValue = 40.000000
paramInfo.defaultValue = 0.000000
~~~

## kAudioUnitSubType_HighPassFilter

ハイパスフィルター。`cutoff frequency`以上の周波数領域の音を通します。

~~~
numOfParams = 2
paramList[0] = 0
paramInfo.name = cutoff frequency
paramInfo.minValue = 10.000000
paramInfo.maxValue = 22050.000000
paramInfo.defaultValue = 6900.000000
paramList[1] = 1
paramInfo.name = resonance
paramInfo.minValue = -20.000000
paramInfo.maxValue = 40.000000
paramInfo.defaultValue = 0.000000
~~~

## kAudioUnitSubType_BandPassFilter

バンドパスフィルター。`cutoff frequency`を中心に、`bandwidth`の幅の周波数領域の音を通します。ローパスフィルターとハイパスフィルターを組み合わせたフィルターです。

~~~
numOfParams = 2
paramList[0] = 0
paramInfo.name = center frequency
paramInfo.minValue = 20.000000
paramInfo.maxValue = 22050.000000
paramInfo.defaultValue = 5000.000000
paramList[1] = 1
paramInfo.name = bandwidth
paramInfo.minValue = 100.000000
paramInfo.maxValue = 12000.000000
paramInfo.defaultValue = 600.000000
~~~

## kAudioUnitSubType_HighShelfFilter

ハイシェルフフィルター。`cutoff frequency`以上の周波数領域の音を`gain`分だけ増幅します。

~~~
numOfParams = 2
paramList[0] = 0
paramInfo.name = cutoff frequency
paramInfo.minValue = 10000.000000
paramInfo.maxValue = 22050.000000
paramInfo.defaultValue = 10000.000000
paramList[1] = 1
paramInfo.name = gain
paramInfo.minValue = -40.000000
paramInfo.maxValue = 40.000000
paramInfo.defaultValue = 0.000000
~~~

## kAudioUnitSubType_LowShelfFilter

ローシェルフフィルター。`cutoff frequency`以下の周波数領域の音を`gain`分だけ増幅します。

~~~
numOfParams = 2
paramList[0] = 0
paramInfo.name = cutoff frequency
paramInfo.minValue = 10.000000
paramInfo.maxValue = 200.000000
paramInfo.defaultValue = 80.000000
paramList[1] = 1
paramInfo.name = gain
paramInfo.minValue = -40.000000
paramInfo.maxValue = 40.000000
paramInfo.defaultValue = 0.000000
~~~

## kAudioUnitSubType_ParametricEQ

パラメトリックイコライザー。`cutoff frequency`を中心に、`Q`（変動させる帯域幅）の値の帯域幅に対する周波数領域の音を`gain`分だけ増幅します。

~~~
numOfParams = 3
paramList[0] = 0
paramInfo.name = center frequency
paramInfo.minValue = 20.000000
paramInfo.maxValue = 21829.500000
paramInfo.defaultValue = 2000.000000
paramList[1] = 1
paramInfo.name = Q
paramInfo.minValue = 1.000000
paramInfo.maxValue = 20.000000
paramInfo.defaultValue = 10.000000
paramList[2] = 2
paramInfo.name = gain
paramInfo.minValue = -20.000000
paramInfo.maxValue = 20.000000
paramInfo.defaultValue = 0.000000
~~~

## kAudioUnitSubType_Distortion

ディストーション。歪み系のエフェクトとして有名です。
こちらはまだ詳細は追えていないです。パラメータ数が16個もあり、例えば`decimation`はデータの間引き、`ring mod`はリング・モジュレーターに関するパラメータと思われます。わかりしだい、おいおい追記したいと思います。

~~~
numOfParams = 16
paramList[0] = 0
paramInfo.name = delay
paramInfo.minValue = 0.100000
paramInfo.maxValue = 500.000000
paramInfo.defaultValue = 0.100000
paramList[1] = 1
paramInfo.name = decay
paramInfo.minValue = 0.100000
paramInfo.maxValue = 50.000000
paramInfo.defaultValue = 1.000000
paramList[2] = 2
paramInfo.name = delay mix
paramInfo.minValue = 0.000000
paramInfo.maxValue = 100.000000
paramInfo.defaultValue = 50.000000
paramList[3] = 3
paramInfo.name = decimation
paramInfo.minValue = 0.000000
paramInfo.maxValue = 100.000000
paramInfo.defaultValue = 50.000000
paramList[4] = 4
paramInfo.name = rounding
paramInfo.minValue = 0.000000
paramInfo.maxValue = 100.000000
paramInfo.defaultValue = 0.000000
paramList[5] = 5
paramInfo.name = decimation mix
paramInfo.minValue = 0.000000
paramInfo.maxValue = 100.000000
paramInfo.defaultValue = 50.000000
paramList[6] = 6
paramInfo.name = linear term
paramInfo.minValue = 0.000000
paramInfo.maxValue = 1.000000
paramInfo.defaultValue = 1.000000
paramList[7] = 7
paramInfo.name = squared term
paramInfo.minValue = 0.000000
paramInfo.maxValue = 20.000000
paramInfo.defaultValue = 0.000000
paramList[8] = 8
paramInfo.name = cubic term
paramInfo.minValue = 0.000000
paramInfo.maxValue = 20.000000
paramInfo.defaultValue = 0.000000
paramList[9] = 9
paramInfo.name = polynomial mix
paramInfo.minValue = 0.000000
paramInfo.maxValue = 100.000000
paramInfo.defaultValue = 50.000000
paramList[10] = 10
paramInfo.name = ring mod freq 1
paramInfo.minValue = 0.500000
paramInfo.maxValue = 8000.000000
paramInfo.defaultValue = 100.000000
paramList[11] = 11
paramInfo.name = ring mod freq 2
paramInfo.minValue = 0.500000
paramInfo.maxValue = 8000.000000
paramInfo.defaultValue = 100.000000
paramList[12] = 12
paramInfo.name = ring mod balance
paramInfo.minValue = 0.000000
paramInfo.maxValue = 100.000000
paramInfo.defaultValue = 50.000000
paramList[13] = 13
paramInfo.name = ring mod mix
paramInfo.minValue = 0.000000
paramInfo.maxValue = 100.000000
paramInfo.defaultValue = 0.000000
paramList[14] = 14
paramInfo.name = soft clip gain
paramInfo.minValue = -80.000000
paramInfo.maxValue = 20.000000
paramInfo.defaultValue = -6.020600
paramList[15] = 15
paramInfo.name = wet/dry mix
paramInfo.minValue = 0.000000
paramInfo.maxValue = 100.000000
paramInfo.defaultValue = 50.000000
~~~

## kAudioUnitSubType_Delay

ディレイ。エコーの効果が得られます。`dry/wet mix`でディレイ部分の音量を調整します。`delay time`はディレイの時間、`feedback`はディレイの回数を設定します。

~~~
numOfParams = 4
paramList[0] = 0
paramInfo.name = dry/wet mix
paramInfo.minValue = 0.000000
paramInfo.maxValue = 100.000000
paramInfo.defaultValue = 50.000000
paramList[1] = 1
paramInfo.name = delay time
paramInfo.minValue = 0.000100
paramInfo.maxValue = 2.000000
paramInfo.defaultValue = 1.000000
paramList[2] = 2
paramInfo.name = feedback
paramInfo.minValue = -99.900002
paramInfo.maxValue = 99.900002
paramInfo.defaultValue = 50.000000
paramList[3] = 3
paramInfo.name = lowpass cutoff frequency
paramInfo.minValue = 10.000000
paramInfo.maxValue = 22050.000000
paramInfo.defaultValue = 15000.000000
~~~

## kAudioUnitSubType_SampleDelay

サンプルディレイ。サンプル単位でディレイをかけることができます。

~~~
numOfParams = 1
paramList[0] = 0
paramInfo.name = in to out delay
paramInfo.minValue = 0.000000
paramInfo.maxValue = 4410.000000
paramInfo.defaultValue = 0.000000
~~~

## kAudioUnitSubType_NBandEQ

Nバンドイコライザー。`gain`だけを可変にして、他のパラメータは固定で用いるのが一般的かと思います。

~~~
numOfParams = 41
paramList[0] = 0
paramInfo.name = global gain
paramInfo.minValue = -96.000000
paramInfo.maxValue = 24.000000
paramInfo.defaultValue = 0.000000

paramList[1] = 1000
paramInfo.name = bypass
paramInfo.minValue = 0.000000
paramInfo.maxValue = 1.000000
paramInfo.defaultValue = 1.000000
paramList[2] = 2000
paramInfo.name = type
paramInfo.minValue = 0.000000
paramInfo.maxValue = 10.000000
paramInfo.defaultValue = 0.000000
paramList[3] = 3000
paramInfo.name = frequency
paramInfo.minValue = 10.000000
paramInfo.maxValue = 21609.000000
paramInfo.defaultValue = 1000.000000
paramList[4] = 4000
paramInfo.name = gain
paramInfo.minValue = -96.000000
paramInfo.maxValue = 24.000000
paramInfo.defaultValue = 0.000000
paramList[5] = 5000
paramInfo.name = bandwidth
paramInfo.minValue = 0.050000
paramInfo.maxValue = 5.000000
paramInfo.defaultValue = 0.500000

paramList[6] = 1001
paramInfo.name = bypass
paramInfo.minValue = 0.000000
paramInfo.maxValue = 1.000000
paramInfo.defaultValue = 1.000000
paramList[7] = 2001
paramInfo.name = type
paramInfo.minValue = 0.000000
paramInfo.maxValue = 10.000000
paramInfo.defaultValue = 0.000000
paramList[8] = 3001
paramInfo.name = frequency
paramInfo.minValue = 10.000000
paramInfo.maxValue = 21609.000000
paramInfo.defaultValue = 1000.000000
paramList[9] = 4001
paramInfo.name = gain
paramInfo.minValue = -96.000000
paramInfo.maxValue = 24.000000
paramInfo.defaultValue = 0.000000
paramList[10] = 5001
paramInfo.name = bandwidth
paramInfo.minValue = 0.050000
paramInfo.maxValue = 5.000000
paramInfo.defaultValue = 0.500000

　[11]~[35]　長いので省略

paramList[36] = 1007
paramInfo.name = bypass
paramInfo.minValue = 0.000000
paramInfo.maxValue = 1.000000
paramInfo.defaultValue = 1.000000
paramList[37] = 2007
paramInfo.name = type
paramInfo.minValue = 0.000000
paramInfo.maxValue = 10.000000
paramInfo.defaultValue = 0.000000
paramList[38] = 3007
paramInfo.name = frequency
paramInfo.minValue = 10.000000
paramInfo.maxValue = 21609.000000
paramInfo.defaultValue = 1000.000000
paramList[39] = 4007
paramInfo.name = gain
paramInfo.minValue = -96.000000
paramInfo.maxValue = 24.000000
paramInfo.defaultValue = 0.000000
paramList[40] = 5007
paramInfo.name = bandwidth
paramInfo.minValue = 0.050000
paramInfo.maxValue = 5.000000
paramInfo.defaultValue = 0.500000
~~~

`type`については以下のようになっています。いわゆるNバンドイコライザーを実現したい場合は type = 0 にします。

~~~
kAUNBandEQFilterType_Parametric = 0,
kAUNBandEQFilterType_2ndOrderButterworthLowPass = 1,
kAUNBandEQFilterType_2ndOrderButterworthHighPass = 2,
kAUNBandEQFilterType_ResonantLowPass = 3,
kAUNBandEQFilterType_ResonantHighPass = 4,
kAUNBandEQFilterType_BandPass = 5,
kAUNBandEQFilterType_BandStop = 6,
kAUNBandEQFilterType_LowShelf = 7,
kAUNBandEQFilterType_HighShelf = 8,
kAUNBandEQFilterType_ResonantLowShelf = 9,
kAUNBandEQFilterType_ResonantHighShelf = 10,
~~~

特に設定をしなければ上の例のように8バンド分のパラメータが用意されますが、`kAUNBandEQProperty_NumberOfBands`プロパティを設定することでバンド数を変更することができます。

## kAudioUnitSubType_Reverb2

リバーブ。ディレイを複雑にしたもの、という感じです。Reverb2 となっていますが、想定されるように Reverb1 にあたるものがあったようで、改善版のようです。
`delay time`は min/max で調整でき、`decay time`も low/high freq で調整できます。`randomize reflections`で反射のランダム性を調整します。これらを含む、すべてのパラメータをスライダーでUIに割り当てて試してみるとわかりやすいと思います。

~~~
numOfParams = 7
paramList[0] = 0
paramInfo.name = dry/wet mix
paramInfo.minValue = 0.000000
paramInfo.maxValue = 100.000000
paramInfo.defaultValue = 50.000000
paramList[1] = 1
paramInfo.name = gain
paramInfo.minValue = -20.000000
paramInfo.maxValue = 20.000000
paramInfo.defaultValue = 0.000000
paramList[2] = 2
paramInfo.name = min delay time
paramInfo.minValue = 0.000100
paramInfo.maxValue = 1.000000
paramInfo.defaultValue = 0.008000
paramList[3] = 3
paramInfo.name = max delay time
paramInfo.minValue = 0.000100
paramInfo.maxValue = 1.000000
paramInfo.defaultValue = 0.050000
paramList[4] = 4
paramInfo.name = low freq decay time
paramInfo.minValue = 0.001000
paramInfo.maxValue = 20.000000
paramInfo.defaultValue = 1.000000
paramList[5] = 5
paramInfo.name = high freq decay time
paramInfo.minValue = 0.001000
paramInfo.maxValue = 20.000000
paramInfo.defaultValue = 1.000000
paramList[6] = 6
paramInfo.name = randomize reflections
paramInfo.minValue = 1.000000
paramInfo.maxValue = 1000.000000
paramInfo.defaultValue = 1.000000
~~~

## kAudioUnitSubType_AUiPodEQ

iPodイコライザー。デフォルトの「ミュージック」アプリの設定に含まれるイコライザーですので、細かな調整をするような使い方はなさそうです。現在利用できるのは23種類のようですが、なぜかパラメータの設定範囲はそれより広く設けられています。

~~~
numOfParams = 3
paramList[0] = 0
paramInfo.name = Filter1 Index
paramInfo.minValue = -1.000000
paramInfo.maxValue = 58.000000
paramInfo.defaultValue = -1.000000
paramList[1] = 1
paramInfo.name = Filter2 Index
paramInfo.minValue = -1.000000
paramInfo.maxValue = 58.000000
paramInfo.defaultValue = -1.000000
paramList[2] = 2
paramInfo.name = Filter3 Index
paramInfo.minValue = -1.000000
paramInfo.maxValue = 58.000000
paramInfo.defaultValue = -1.000000
~~~

以上です。

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

サンプルではローパスフィルター（kAudioUnitSubType_LowPassFilter）の例で作成してあります。