前回の投稿では、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)の例で作成してあります。