【发布时间】:2022-10-06 14:35:10
【问题描述】:
我正在寻找一种使用 NAudio 的 MixingSampleProvider 将数千个 WAV 文件混合到一个文件中的方法。我正在构建一个鼓采样器,我希望能够创建一整首歌曲(基于 MIDI 信息),然后可以将其导出到单个 WAV 文件中.
我遇到的问题是MixingSampleProvider 有一个1024 个来源的限制如果达到该限制,则抛出和异常说Too many mixer inputs。我确信这个限制是有原因的,我想知道如何实现我的目标。
我已经搜索了 NAudio 演示和 Mark Heath\'s blog,但我还没有找到我真正需要的东西。
我在想我可以将歌曲分割成更小的片段(在 1024 个采样器输入下)然后合并单独的部分。这是要走的路,还是有更好的路?感谢您的任何建议。
这是我的代码的一部分:
public class DrumSampler
{
private readonly MixingSampleProvider _mixer;
private readonly Dictionary<string, SampleSource> _cachedSamples = new();
public DrumSampler()
{
var waveFormat = WaveFormat.CreateIeeeFloatWaveFormat(44100, 2);
_mixer = new MixingSampleProvider(waveFormat);
LoadSamples();
}
private void LoadSamples()
{
LoadSample(\"kick\", @\"C:\\Samples\\kick.wav\");
LoadSample(\"snare\", @\"C:\\Samples\\snare.wav\");
LoadSample(\"crash\", @\"C:\\Samples\\crash.wav\");
}
private void LoadSample(string key, string filePath)
{
_cachedSamples.Add(key, SampleSource.CreateFromWaveFile(filePath, _mixer.WaveFormat));
}
public void ExportSong()
{
AddDrums();
WaveFileWriter.CreateWaveFile16(\"song.wav\", _mixer);
}
private void AddDrums()
{
//simulate adding drum samples based on MIDI information
for (int i = 0; i < 1000; i++)
{
var sample = _cachedSamples[\"kick\"];
var delayed = new DelayedSampleProvider(sample, TimeSpan.FromSeconds(123));
_mixer.AddMixerInput(delayed);
}
}
}
SampleSource 的实现取自 NAudio 的 DrumMachineDemo。
DelayedSampleProvider 的实现受到 NAudio 的 OffsetSampleProvider 的启发。