2015-10-05 1 views
1

Le code suivant configure le moteur audio iOS pour créer des échantillonneurs qui sont configurés avec une police son (pour simplifier la discussion). J'utilise ensuite les samples pour jouer des notes MIDI et tout fonctionne bien jusqu'à ce que j'essaie d'introduire une chaîne d'effets standards (distorsion -> delay -> reverb).Comment configurer correctement une chaîne d'AVAudioUnitEffects

Si la sortie des échantillonneurs est simplement connectée directement au MainMixerNode du moteur audio, cela fonctionne. Si je connecte les samplers à l'effet de distorsion (le premier effet de la chaîne) alors dès que je tente de jouer la première note MIDI, j'obtiens une erreur "AVAudioUnitMIDIInstrument.mm:103: - [AVAudioUnitMIDIInstrument startNote: withVelocity: onChannel:]: erreur -10867 "

NOTE: Je code en utilisant Xamarin sur Mac, donc ce qui suit peut sembler peu familier mais j'espère que le code est assez lisible pour votre aide.

La question est simplement de savoir où je vais mal dans l'initialisation de mes effets/ou de la chaîne de ceux-ci?

Merci à l'avance, Chris


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... 

Répondre

0

La question ici a essayé de nourrir plusieurs échantillonneurs dans chaque effet. Il semble que vous ayez besoin de créer un Delay/Reverb/Distortion par Sampler. Fondamentalement, la chaîne du signal doit être Sampleur -> Distorsion -> Retard -> Réverbération -> Mélangeur.

Il y a certaines hypothèses dans les déclarations ci-dessus, je peux me tromper si vous pouvez connecter plusieurs échantillonneurs à un retard en utilisant plusieurs bus d'entrée sur le retard par exemple. Mais je ne pouvais pas être dérangé de tester dans cette mesure.

Une fois que je suis allé avec le mappage un à un, mon code a fonctionné. Par conséquent, les effets AvAudioUnitXXXX doivent être créés et connectés à l'intérieur de la boucle.

+0

Dès que mon git repos sera aligné, je posterai le code. –