LoginSignup
21

More than 3 years have passed since last update.

AVAudioUnitのパラメータ詳細(基本編)

Last updated at Posted at 2016-03-13

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のパラメータ詳細については、こちらの記事を参照してください。)

AVAudioUnitEffect

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

AVAudioUnitDelay

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

// ディレイタイム
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をセットします。

- (void)loadFactoryPreset:(AVAudioUnitDistortionPreset)preset;

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

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);

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

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

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

AVAudioUnitEQ

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

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

// 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のときよりバンド数の設定方法がわかりやすくなっています。

- (instancetype)initWithNumberOfBands:(NSUInteger)numberOfBands;

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

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

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

// フィルタータイプ
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と同じです。

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をセットします。

- (void)loadFactoryPreset:(AVAudioUnitReverbPreset)preset;

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

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だけのようです。

// 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版です。
ほとんどのパラメータは公開されていますので、十分に柔軟な使い方ができると思います。

// 再生スピード
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つパラメータがありますが、以下のパラメータだけで機能としては十分です。

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

以上です。

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

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

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
21