I\'m trying to record an input and merge it together with a song (not concatenate). I have a guitar that i recorded while listening to a song and I want to put the guitar on the
That should be possible with a WaveMixerStream32
, e.g like this
var mixer = new WaveMixerStream32 { AutoStop = true};
var wav1 = new WaveFileReader(@"c:\...\1.wav");
var wav2 = new WaveFileReader(@"c:\...\2.wav");
mixer.AddInputStream(new WaveChannel32(wav1));
mixer.AddInputStream(new WaveChannel32(wav2));
WaveFileWriter.CreateWaveFile("mixed.wav", new Wave32To16Stream(mixer));
To mix multiple ISampleProvider
sources using a MixingSampleProvider
, you can do the following:
Here SignalGenerator
has a Gain
property which allows to specify how loud it should be in the mix.
using System;
using NAudio.Wave;
using NAudio.Wave.SampleProviders;
namespace ConsoleApplication1
{
internal class Program
{
private static void Main(string[] args)
{
ISampleProvider provider1 = new SignalGenerator
{
Frequency = 1000.0f,
Gain = 0.5f
};
ISampleProvider provider2 = new SignalGenerator
{
Frequency = 1250.0f,
Gain = 0.5f
};
var takeDuration1 = TimeSpan.FromSeconds(5); // otherwise it would emit indefinitely
var takeDuration2 = TimeSpan.FromSeconds(10);
var sources = new[]
{
provider1.Take(takeDuration1),
provider2.Take(takeDuration2)
};
var mixingSampleProvider = new MixingSampleProvider(sources);
var waveProvider = mixingSampleProvider.ToWaveProvider();
WaveFileWriter.CreateWaveFile("test.wav", waveProvider);
}
}
}