iOS での UDP リスナーのレイテンシを短縮する必要があります。
iOS で動作する RTP-MIDI に代わるものを実装していますが、MIDI データを受信するために単純な UDP サーバーに依存しています。私たちが抱えている問題は、RTP-MIDI が iOS 上の単純な UDP サーバーよりも約 20 ミリ秒速くメッセージを受信して処理できることです。
コード内の他の何かが許容できない遅延を引き起こしている可能性を排除するために、3 つの異なるコード ベースを作成しました。最終的に、iPAD が実際にパケットを受信してから、そのパケットが実際にアプリケーションに渡されて読み取られるまでに時間差があると結論付けました。
これをスコープで測定しました。Note-On コマンドを送信するたびに、送信デバイスからプローブの 1 つにパルスを送信します。iPadのオーディオ出力に別のプローブを接続しました。パルスをトリガーし、音声が聞こえるまでの時間を測定しました。結果として得られたタイミングは、信頼できる平均 45 ミリ秒で、まれな状況で最小 38 および最大約 53 ミリ秒でした。
RTP-MIDI (はるかに冗長なプロトコル) でまったく同じテストを行ったところ、20ms 高速でした。私が持っている最良の予感は、CoreMIDI の一部であるため、RTPMIDI がアプリよりも優先される可能性があるということですが、単純にこれを認めるだけでは役に立ちません。これを修正する方法を本当に理解する必要があります。私たちのアプリは、RTPMIDI と同じくらい高速である必要はありませんが、プロトコルが乱雑ではないため、理論的には可能であると考えています。RTPMIDI は、ジャーナル システムの設計が不十分なため、このアプリケーションには受け入れられないと宣言しました。
テストされた 3 つのコード ベースは次のとおりです。
UDP で受信したデータを仮想 MIDI ポート経由で GarageBand などにそのまま転送する PGMidi の例から派生した Objective-C の実装。
経験豊富なオーディオ エンジン開発者が作成した Objective-C ソース ベースで、出力用の低レイテンシの正弦波ジェネレータが組み込まれています。
Mono ベースの UDP リスナーと組み込みのサウンドフォント シンセサイザー プラグインを備えた Unity3D アプリケーション。
3 つの実装はすべて、スコープ テストで同じ測定値を示しました。
メッセージをより速く取得する方法についての洞察をいただければ幸いです。
回答の検索における新しい情報:
私は答えを探し回っていましたが、通信が UDP ではなく TCP である場合、iOS がより迅速に応答する可能性があることを示唆するこの質問を見つけました。組み込みシステムには TCP 機能がなく、UDP のみであるため、これをテストするには多少の労力が必要です。Wifi の応答性を維持するためだけに TCP 接続を開いたままにしておくことができるかどうかに興味があります。クレイジーなアイデア?私は知らないよ。誰もこれを試しましたか?これをできるだけリアルタイムにする必要があります。