Следующий код настраивает звуковой движок iOS для создания семплеров, которые настраиваются одним звуковым шрифтом (для простоты обсуждения). Затем я использую образцы для воспроизведения MIDI-заметок, и все работает хорошо, пока я не попытаюсь ввести цепочку стандартных эффектов (искажение -> задержка -> реверберация).Как правильно настроить цепочку AVAudioUnitEffects
Если выход пробоотборников просто подключен непосредственно к аудиомодулю MainMixerNode, он работает. Если я подключу пробоотборники к эффекту искажения (первый эффект в цепочке), то, как только я попытаюсь воспроизвести первую ноту MIDI, я получаю ошибку «AVAudioUnitMIDIInstrument.mm:103: - [AVAudioUnitMIDIInstrument startNote: withVelocity: onChannel:]: error -10867 "
ПРИМЕЧАНИЕ. Я использую Xamarin на Mac, поэтому следующее может показаться незнакомым, но я надеюсь, что код будет достаточно читаемым, чтобы помочь вам.
Вопрос в том, где я ошибаюсь в инициализации моих эффектов или их цепочек?
Спасибо заранее, Крис
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...
Как только у меня будет ссылка на git, я отправлю код. –