1

次のコードは、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...
4

1 に答える 1

0

ここでの問題は、複数のサンプラーを各エフェクトにフィードしようとすることでした。サンプラーごとにディレイ/リバーブ/ディストーションを作成する必要があるようです。

基本的にシグナルチェーンはSampler→Distortion→Delay→Reverb→Mixerである必要があります。

上記のステートメントにはいくつかの仮定があります。たとえば、遅延で複数の入力バスを使用して複数のサンプラーを遅延に接続できる場合、私は間違っている可能性があります。しかし、私はそこまでテストする気になれませんでした。

1対1のマッピングを行うと、コードが機能しました。

そのため、AvAudioUnitXXXX エフェクトを作成し、ループ内で接続する必要があります。

于 2015-10-28T10:27:35.760 に答える