3D Mixier Unit のお勉強
今作ってる音楽アプリでベロシティ(音の強弱)対応にしたいので3D Mixierのお勉強をしながら書き進めて行きたいと思います。
iphoneのCoreAudioについての書籍の定番と言えば、永野哲久さん署のiPhone Core Audioプログラミングです。これ一冊でCoreAudioは完璧と言えるくらいすばらしい書籍です。
3D MixerはAudio Unit正準形に対応していないらしく、8ビット/16ビット、モノラル/ステレオのインターリーブ、リトルエンディアンのリニハPCMのみに対応しているらしい。
※リトルエンディアン
2バイト以上のデータ転送にて1バイトごとに分割して最下位のバイトから記録/送信する方式だとか。
ということは、iphoneのOpenALは三次元定位に対応していないらしい。上下前後の定位のみに対応している。
- 音源の位置を設定するパラメータの定義
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);