これを行うには、出力 WaveFormat に 3 つのチャネルがある独自のカスタム IWaveProvider/WaveStream を記述します。3 つの入力ファイルのそれぞれへの参照を保持します。次に、Read メソッドで、要求されたサンプル数を計算し、各ソース ファイルから適切な数を読み取ります。次に、サンプルをインターリーブする必要があります。最初のファイルから 1 つ、2 番目のファイルから 1 つ、3 番目のファイルから 1 つです。遅延するには、ゼロを入れるだけです。
さまざまなソース ファイル (すべて同じビット深度とサンプル レートである必要があります) からインターリーブする未テストのサンプル コードを次に示します。これにより、正しい方向に進むことが期待されます。
int Read(byte[] buffer, int offset, int bytesRequired)
{
int bytesPerSample = this.WaveFormat.BitsPerSample / 8;
int samplesRequired = bytesRequired / bytesPerSample;
int channels = this.WaveFormat.Channels; // 3
int samplesPerChannel = samplesRequired / channels;
byte[] readBuffer = new byte[samplesPerChannel * bytesPerSample];
for (int channel = 0; channel < channels; channel++)
{
int read = inputs[channel].Read(readBuffer, 0, samplesPerChannel * bytesPerSample);
int outOffset = offset + channel * bytesPerSample;
for (int i = 0; i < read; i += bytesPerSample)
{
Array.Copy(readBuffer, i, buffer, outOffset, bytesPerSample);
outOffset += channels * bytesPerSample;
}
}
}
コードが過度に複雑にならないようにするために、別の派生 IWaveProvider / WaveStream を作成し、その Read メソッドが適切な量の無音を返した後、入力ファイルから実際のデータを返すことによって、無音の挿入を行うことができます。これは、インターリーブする WaveStream への入力として使用できます。