Вы могли бы сделать это, написав свой собственный IWaveProvider / WaveStream, выходной WaveFormat которого имеет три канала.Он содержит ссылку на каждый из трех ваших входных файлов.Затем в методе Read он определяет количество запрошенных выборок и считывает соответствующее число из каждого исходного файла.Затем образцы должны чередоваться - один из первого файла, один из второго, один из третьего.Для отсрочки вы просто вводите нули.
Вот пример неопробованного примера кода, который чередуется из различных исходных файлов (все должны иметь одинаковую битовую глубину и частоту дискретизации), которые, мы надеемся, укажут вам правильное направление:
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.