3D Mixier Unit のお勉強

今作ってる音楽アプリでベロシティ(音の強弱)対応にしたいので3D Mixierのお勉強をしながら書き進めて行きたいと思います。

iphoneのCoreAudioについての書籍の定番と言えば、永野哲久さん署のiPhone Core Audioプログラミングです。これ一冊でCoreAudioは完璧と言えるくらいすばらしい書籍です。



3D MixerはAudio Unit正準形に対応していないらしく、8ビット/16ビット、モノラル/ステレオのインターリーブ、リトルエンディアンのリニハPCMのみに対応しているらしい。

※リトルエンディアン
2バイト以上のデータ転送にて1バイトごとに分割して最下位のバイトから記録/送信する方式だとか。


ということは、iphoneOpenALは三次元定位に対応していないらしい。上下前後の定位のみに対応している。


  • 音源の位置を設定するパラメータの定義
enum {
  k3DMixer Param_Azimuth      = 0, //方向-180〜180度
 k3DMixer Param_Elevation    = 1, //角度、動作なし
 k3DMixer Param_Distance     = 2, //文字通り音源までの距離
 k3DMixer Param_Gain         = 3,//音量。-120db〜+20db
  k3DMixer Param_PlaybackRate = 4 //ピッチ
}
  • プロパティ

音量に関するプロパティの定義

enum {
  kAudioUnitProperty_3DMixerDistanceParame = 3010;
  kAudioUnitProperty_3DMixerAttenuationCureve = 3013;
}

MixerDistanceParams構造体の定義

Tyepdef struct MixerDistanceParams{
  Float32 mReferenceDistance; //音の減衰を開始する距離
 Float32 mMaxDistance;//減衰させる最大の距離
  Float32 mMaxAttention;  //一番小さい音量
}
  • 変更するコードのサンプル
MixerDistanceParame mixerDistancePrams;
mixerDistanceParams.mMaxDistance = 100; //MAX100mまで減衰を続ける
mixerDistanceParams.mReferenceDistance = 30; //30mより減衰をはじめる
mixerDistanceParams.mMaxAttenuation   = 50; //最大50db(デシベル)減衰する
Unit32 size = sizeof(MixerDistancePramams);
AudioUnitSetProperty( 3DMixerUnit,
                      kAudioUnitProperty_3DMixerDistanceParam,
                      kAudioUnitScope_Input,
                      0, //バスナンバー 最大32まで設定可能
           &mixerDistanceParams,
                      size);
||<  


<span style="font-weight:bold;">kAudioUnitProperty_3DMixerAttentionCurve</span>
 減衰のカーブを設定できる。

設定値の定義
>|c|
enum{
   k3DMixerAttenuationCurve_Power              =0; //dbベース
  k3DMixerAttenuationCurve_Expontential       =1; //指数関数のカーブ
  k3DMixerAttenuationCurve_Inverse            =2;//逆カーブ
  k3DMixerAttenuationCurve_Linear             = 3; //リニアカーブ
}

プロパティの値と減衰のカーブの関係は下記の図の通り


dbベースのカーブに変更するなら

UInt32 size = sizeof(Unit32);
UInt32 sttenuationCurve = k3DMixerAttenuationCurve_Power;
AudioUnitSetProperty { 3DMixerUnit,
                       kAudioUnitProperty_3DMixerAttenuationCurve,
                       kAudioUnitScope_Input,
                       0,//バスナンバー
                       &attentionCurve,
                       size);