2015-10-05 2 views
1

Следующий код настраивает звуковой движок 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... 

ответ

0

Проблема здесь пытается накормить несколько пробников в каждый эффект. Кажется, вам нужно создать Delay/Reverb/Distortion на пробоотборник.

В основном сигнальная цепь должна быть сэмплером -> Искажение -> Задержка -> Реверберация -> Миксер.

В приведенных выше утверждениях есть некоторые предположения, я могу ошибаться, если вы можете подключить несколько пробоотборников к задержке, используя, например, несколько входных шин при задержке. Но я не мог быть обеспокоен тестированием.

Как только я перешел с одного на один, мой код работал.

Таким образом, эффекты AvAudioUnitXXXX должны быть созданы и подключены внутри цикла.

+0

Как только у меня будет ссылка на git, я отправлю код. –

Смежные вопросы