よなかのすうがく

Audio signal processing and Electronic kit, and hobby.

AudioUnits パラメータの単位設定

AudioUnitsを何個か作ったなかで情報が少なくて面倒臭くなることが幾つかあったので、とりあえず記事にまとめてみます。
まあ、これぐらいはすぐに調べたら分かるような内容ですが一箇所にあるほうがよさそうなので。




・パラメータの単位設定

実際に作ったらわかるのですがパラメータごとに単位設定は適切なものにする必要があります。
それを変更するのは、以前に書いたと思いますが以下の関数になります。

OSStatus SampleUnit::GetParameterInfo(	AudioUnitScope		inScope,
					AudioUnitParameterID	inParameterID,
					AudioUnitParameterInfo	&outParameterInfo )
{
	OSStatus result = noErr;
	
	outParameterInfo.flags =
		kAudioUnitParameterFlag_IsWritable + kAudioUnitParameterFlag_IsReadable;
	
	if (inScope == kAudioUnitScope_Global)
	{
		switch(inParameterID)
		{
			case kSampleUnitParam_Param1:
				AUBase::FillInParameterName (outParameterInfo, kParam1_Name, false);
				outParameterInfo.unit = kAudioUnitParameterUnit_Percent; //単位設定
				outParameterInfo.minValue = kMinParam1;
				outParameterInfo.maxValue = kMaxParam1;
				outParameterInfo.defaultValue = kDefaultParam1;
				break;
	
			default:
				result = kAudioUnitErr_InvalidParameter;
				break;
		}
	}
	
	else
	{
		result = kAudioUnitErr_InvalidParameter;
	}
	
	return result;
}


引数で持ってきたoutParameterInfo.unitに単位を指定するわけですね。
じゃあその単位はどれだけの種類があるかというと……

  • kAudioUnitParameterUnit_Generic
  • kAudioUnitParameterUnit_Indexed
  • kAudioUnitParameterUnit_Boolean
  • kAudioUnitParameterUnit_Percent
  • kAudioUnitParameterUnit_Seconds
  • kAudioUnitParameterUnit_SampleFrames
  • kAudioUnitParameterUnit_Phase
  • kAudioUnitParameterUnit_Rate
  • kAudioUnitParameterUnit_Hertz
  • kAudioUnitParameterUnit_Cents
  • kAudioUnitParameterUnit_RelativeSemiTones
  • kAudioUnitParameterUnit_MIDINoteNumber
  • kAudioUnitParameterUnit_MIDIController
  • kAudioUnitParameterUnit_Decibels
  • kAudioUnitParameterUnit_LinearGain
  • kAudioUnitParameterUnit_Degrees
  • kAudioUnitParameterUnit_EqualPowerCrossfade
  • kAudioUnitParameterUnit_MixerFaderCurve1
  • kAudioUnitParameterUnit_Pan
  • kAudioUnitParameterUnit_Meters
  • kAudioUnitParameterUnit_AbsoluteCents
  • kAudioUnitParameterUnit_Octaves
  • kAudioUnitParameterUnit_BPM
  • kAudioUnitParameterUnit_Beats
  • kAudioUnitParameterUnit_Milliseconds
  • kAudioUnitParameterUnit_Ratio
  • kAudioUnitParameterUnit_CustomUnit

結構な量ですね。まあ大体の奴は単位が変わるだけなので実際に実装して確認するのが一番だと思われる。
ただ例えば整数のみを扱いたい場合や、チェックボックスやドロップダウンリストで扱いたい場合が出てくる。その場合についての処理方法を書いていく。

・整数パラメータ

一番単純で簡単にできる設定。

outParameterInfo.unit = kAudioUnitParameterUnit_Indexed; //整数のみを扱う


チェックボックス(boolean)パラメータ

簡単に設定できるが、GetParameter()で取ってくる値がbool型なので処理する際は以下のようにする必要あり。

outParameterInfo.unit = kAudioUnitParameterUnit_Boolean; //整数のみを扱う
if(GetParameter(kSampleUnitParam_Boolean)){ /* 処理内容 */ }

・ドロップダウンリストパラメータ

ドロップダウンリストにするためには、outParameterInfo.unitを変えるだけではなく新たに関数を追加する必要があり。若干面倒くさい。

outParameterInfo.unit = kAudioUnitParameterUnit_Indexed; //整数のみを扱う

//クラス宣言内の処理
virtual OSStatus GetParameterValueStrings(	AudioUnitScope		inScope,
						AudioUnitParameterID	inParameterID,
						CFArrayRef		*outStrings );
//定数宣言
static CFStringRef kDropDownList_Name = CFSTR("DropDownList"); //パラメータ名
static const int kItem1 = 1;
static const int kItem2 = 2;
static const int kDefaultValue_DropDownList = kItem1;
static CFStringRef kMenuItem_Item1 = CFSTR ("Item1");
static CFStringRef kMenuItem_Item2 = CFSTR ("Item2");

//処理の中身
OSStatus SampleUnit::GetParameterValueStrings(	AudioUnitScope		inScope,
						AudioUnitParameterID	inParameterID,
						CFArrayRef		*outStrings )
{
	if ((inScope == kAudioUnitScope_Global) && (inParameterID == kSampleUnitParam_DropDownList))
	{
		if (outStrings == NULL) return noErr;
		
		CFStringRef	strings [] = {
			kMenuItem_Item1,
			kMenuItem_Item2
		};
		
		*outStrings = CFArrayCreate (NULL, (const void **)strings, (sizeof(strings)/sizeof(strings[0])), NULL);
		
		return noErr;
	}
	
	return kAudioUnitErr_InvalidParameter;
}

とりあえず今回はここまで。