デジタル オーディオ (合成音楽) と MIDI 音楽 (RtMidi ライブラリを使用) の両方を同時に再生する C++ コードを書いています。デジタル化された音楽はコンピューターのオーディオ デバイスから再生されますが、MIDI 音楽は外部シンセサイザー。デジタル化された楽器と MIDI 楽器の両方を使用する曲を再生したいのですが、これら 2 つのオーディオ ストリームを同期させる最善の方法がわかりません。
- Sleep() のような関数を使用することはできません。遅延時間が不均一であり、私のニーズ (1 ミリ秒のオーダー) に対して長すぎるためです。結果として得られる曲のテンポはオフになり、呼び出されるたびに正確でない限り、テンポは不均一になります。
- オーディオ バッファに配置されたサンプル数をカウントすると、デジタル オーディオのノート間の非常に正確なタイミングが得られます (1 サンプルの最小遅延 - 48kHz で 0.02ms) が、このタイミングは MIDI には使用できません。オーディオはバッファリングされるため、ノートはバーストで合成されます (一度に 1 つのオーディオ バッファをできるだけ早く埋めます)。その結果、デジタル オーディオ バッファが必要になるたびに、一連の MIDI ノートが遅延なく再生されます。補充されます。
- ライブ MIDI データの再生にはタイミング情報がないため、ノートは送信されるとすぐに再生されます。したがって、ノートを後で再生するようにスケジュールすることはできません。そのため、正確な時間に正確に MIDI イベントを自分で送信する必要があります。
現在、私は nanosleep() を使用しています - これは Windows ではなく Linux でのみ動作します - ノート間の正しい時間を待つために。これにより、デジタル オーディオと MIDI データの両方の同期を維持できますが、nanosleep() はあまり一貫性がないため、結果のテンポは非常に不均一になります。
デジタル オーディオと MIDI データの両方で、ノート間の正確なタイミングを維持する方法を考えられる人はいますか?