次のコードは、1 つのサウンド フォントでセットアップされたサンプラーを作成するように iOS オーディオ エンジンを構成します (説明を簡単にするため)。次に、サンプルを使用して MIDI ノートを再生すると、一連の標準エフェクト (ディストーション -> ディレイ -> リバーブ) を導入しようとするまで、すべてうまく機能します。
サンプラーの出力がオーディオ エンジンの MainMixerNode に直接接続されている場合、それは機能します。サンプラーをディストーション エフェクト (チェーンの最初のエフェクト) に接続すると、最初の MIDI ノートを再生しようとするとすぐにエラーが発生します " AVAudioUnitMIDIInstrument.mm:103: -[AVAudioUnitMIDIInstrument startNote:withVelocity:onChannel:]:エラー -10867"
注: 私は Mac で Xamarin を使用してコーディングを行っているため、次の内容は見慣れないかもしれませんが、コードが読みやすく、参考になることを願っています。
問題は、エフェクト/またはそのチェーンを初期化する際にどこが間違っているのかということです。
前もって感謝します、クリス
private void InitAudioEngine(NSUrl sampleFileUrl)
{
AVAudioSession.SharedInstance().Init ();
NSError sessionErrorCode;
sessionErrorCode = AVAudioSession.SharedInstance ().SetCategory (AVAudioSessionCategory.Playback);
if(sessionErrorCode != null)
Logger.Write ("Failed to set AudioSession category");
sessionErrorCode = AVAudioSession.SharedInstance ().SetActive (true);
if(sessionErrorCode != null)
Logger.Write ("Failed to activate AudioSession");
Logger.Write ("Instantiate Audio Engine");
_audioEngine = new AVAudioEngine ();
_samplers = new List<AVAudioUnitSampler> ();
var distortion = new AVAudioUnitDistortion ();
var delay = new AVAudioUnitDelay ();
var reverb = new AVAudioUnitReverb ();
distortion.Init ();
delay.Init ();
reverb.Init ();
distortion.LoadFactoryPreset (AVAudioUnitDistortionPreset.SpeechGoldenPi);
reverb.LoadFactoryPreset (AVAudioUnitReverbPreset.LargeHall2);
delay.DelayTime = 300;
delay.WetDryMix = 30;
delay.Feedback = 30;
_audioEngine.AttachNode (distortion);
_audioEngine.AttachNode (delay);
_audioEngine.AttachNode (reverb);
_audioEngine.Connect (distortion, delay, delay.GetBusOutputFormat (0));
_audioEngine.Connect (delay, reverb, reverb.GetBusOutputFormat (0));
_audioEngine.Connect (reverb, _audioEngine.MainMixerNode, _audioEngine.MainMixerNode.GetBusOutputFormat (0));
for (int index = 0; index < 15; index++)
{
var sampler = new AVAudioUnitSampler ();
sampler.Init ();
_samplers.Add (sampler);
_audioEngine.AttachNode (sampler);
_audioEngine.Connect (sampler, distortion, distortion.GetBusOutputFormat(0));
}
// Connect all the samplers to a defined SoundFont
ConnectSoundbank (sampleFileUrl);
NSError engineErrorCode;
_audioEngine.StartAndReturnError (out engineErrorCode);
if(engineErrorCode != null)
Logger.Write ("Failed to start AudioEngine after samplers attached");
}
// ...
// Later code
// Play a MIDI note on one of the samplers configured above
//
_samplers[0].StartNote(58,127,0); // Crashes with error -10867 (uninitialised)
//...etc...