私は iOS で AudioUnits を研究しており、そのようなグラフを実装しようとしています:
------------------- -----------------
| | | | | | | |
-->| フォーマットコンバータ | --->| バス 0 |
| | (バリスピード) | | | | |
-------------------- | マルチチャンネル |
-------------------- | ミキサーユニット |
| | | | | | | | --------------------
-->| フォーマットコンバータ | --->| バス 1 | | | | |
| | (バリスピード) | | | | | --->| リモート IO | ------>
-------------------- | | | | | ユニット |
-------------------- | | | | | | |
| | | | | | | | --------------------
->| フォーマットコンバータ | --->| バス 2 |
| | (バリスピード) | | | | |
--------------------- | | |
-----------------
まず、kAudioUnitSubType_Varispeed Unit なしで AudioUnits を操作しようとしました。正常に動作し、サウンドが再生されました。しかし、今はすべての音のピッチを(個別に)実現したいので、各音のピッチを制御するVarispeed Unitを追加することにしました。
私は次のコードを使用しています:
OSStatus 結果 = noErr;
//................................................................ ...................................
// オーディオ ユニットのオーディオ ユニット コンポーネントの説明を指定します。
// グラフに追加。
// I/Oユニット
AudioComponentDescription iOUnitDescription;
iOUnitDescription.componentType = kAudioUnitType_Output;
iOUnitDescription.componentSubType = kAudioUnitSubType_RemoteIO;
iOUnitDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
iOUnitDescription.componentFlags = 0;
iOUnitDescription.componentFlagsMask = 0;
// マルチチャンネル ミキサー ユニット
AudioComponentDescription MixerUnitDescription;
MixerUnitDescription.componentType = kAudioUnitType_Mixer;
MixerUnitDescription.componentSubType = kAudioUnitSubType_MultiChannelMixer;
MixerUnitDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
MixerUnitDescription.componentFlags = 0;
MixerUnitDescription.componentFlagsMask = 0;
// バリスピードユニット
AudioComponentDescription varispeedUnitDescription;
MixerUnitDescription.componentType = kAudioUnitType_FormatConverter;
MixerUnitDescription.componentSubType = kAudioUnitSubType_Varispeed;
MixerUnitDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
MixerUnitDescription.componentFlags = 0;
MixerUnitDescription.componentFlagsMask = 0;
//................................................................ ...................................
// オーディオ処理グラフにノードを追加します。
NSLog (@"オーディオ処理グラフへのノードの追加");
AUNode iONode; // I/O ユニットのノード
AUNode ミキサーノード; // マルチチャンネル ミキサー ユニットのノード
AUNode varispeedNode0;
AUNode varispeedNode1;
AUNode varispeedNode2;
//................................................................ ...................................
// 新しいオーディオ処理グラフを作成します。
結果 = NewAUGraph(&processingGraph);
if (noErr != 結果) {[self printErrorMessage: @"NewAUGraph" withStatus: 結果]; 戻る;}
//................................................................ ...................................
// オーディオ処理グラフを開く
結果 = AUGraphOpen(処理グラフ);
if (noErr != 結果) {
[self printErrorMessage: @"AUGraphOpen" withStatus: 結果];
戻る;
}
//................................................................ ...................................
// ノードをオーディオ処理グラフに追加します
結果 = AUGraphAddNode(
処理グラフ、
&varispeedUnitDescription,
&varispeedNode0);
if (noErr != 結果) {
[self printErrorMessage: @"AUGraphNewNode failed for varispeedNode0 unit" withStatus: result];
戻る;
}
結果 = AUGraphAddNode (
処理グラフ、
&varispeedUnitDescription,
&varispeedNode1);
if (noErr != 結果) {
[self printErrorMessage: @"AUGraphNewNode failed for varispeedNode1 unit" withStatus: result];
戻る;
}
結果 = AUGraphAddNode (
処理グラフ、
&varispeedUnitDescription,
&varispeedNode2);
if (noErr != 結果) {
[self printErrorMessage: @"AUGraphNewNode failed for varispeedNode2 unit" withStatus: result];
戻る;
}
結果 = AUGraphAddNode (
処理グラフ、
&iOUnitDescription,
&iONode);
if (noErr != 結果) {
[self printErrorMessage: @"AUGraphNewNode failed for I/O unit" withStatus: result];
戻る;
}
結果 = AUGraphAddNode (
処理グラフ、
&MixerUnitDescription,
&mixerNode);
if (noErr != 結果) {
[self printErrorMessage: @"AUGraphNewNode failed for Mixer unit" withStatus: result];
戻る;
}
アプリを実行すると、次のエラーが発生しました。
2013-04-24 21:44:59.335 Drumpads[327:c07] *** AUGraphNewNode が varispeedNode0 ユニット エラーで失敗しました: ˇˇ¯+ 2013-04-24 21:44:59.338 Drumpads[327:c07] Error.domain = NSOSStatusErrorDomain、code=-2005、descr =Error Domain=NSOSStatusErrorDomain Code=-2005 「操作を完了できませんでした。(OSStatus エラー - 2005.)」
MacErrors.h -2005 によると、「badComponentType」を意味します。
そのため、バリスピードユニットをAUGraphに追加することすらできないようです。すべてが正しいように見えるので、Varispeed Node を追加するとエラーが発生する理由がわかりません。
developers.apple.com コードのサンプル コードを参考にしました ( OSx用ですが、Varispeed は iOS5 と 6 で利用できるようになったので、このコードを参考にすることにしました)。
音ごとにピッチシフトをコントロールする必要があります。私は Varispeed を選択しましたが、NewTimePitch Nodes についても読みました。(同じグラフで) NewTimePitch を試しましたが、成功しませんでした。
私のコードで何が間違っているのか、Varispeed Node を追加するとエラーが発生する理由を知っている人はいますか?
前もって感謝します!