public BasicAudioController(ISoundOut programSoundOut, int channels, int sampleRate) { mixer = new SoundMixer(channels, sampleRate) { FillWithZeros = true, DivideResult = true }; monoToStereoChannelMatrix = new ChannelMatrix(ChannelMask.SpeakerFrontCenter, ChannelMask.SpeakerFrontLeft | ChannelMask.SpeakerFrontRight); monoToStereoChannelMatrix.SetMatrix( new[, ] { { 1.0f, 1.0f } }); soundOut = programSoundOut; }
public MIDIAudioController(ISoundOut programSoundOut) { frequencies = new List <double>(); mixer = new SoundMixer(2, sampleRate) { FillWithZeros = true, DivideResult = true }; monoToStereoChannelMatrix = new ChannelMatrix(ChannelMask.SpeakerFrontCenter, ChannelMask.SpeakerFrontLeft | ChannelMask.SpeakerFrontRight); monoToStereoChannelMatrix.SetMatrix( new[, ] { { 1.0f, 1.0f } }); soundOut = programSoundOut; midiKeys = new List <MidiKeyPlaying>(); }
static void Main(string[] args) { Console.WriteLine( "This example will mix one audio file with \n" + "two sine waves (300Hz and 700Hz).\n" + "The 300Hz sine wave will play only on the right\n" + "channel and the 700Hz sine wave only on the left channel." + "\n\n\nPlease select the audio file!\n" ); IWaveSource fileWaveSource = null; do { OpenFileDialog openFileDialog = new OpenFileDialog() { Title = "Select any file to mix into", Filter = CodecFactory.SupportedFilesFilterEn }; if (openFileDialog.ShowDialog() == DialogResult.OK) { try { fileWaveSource = CodecFactory.Instance.GetCodec(openFileDialog.FileName); } catch { } } } while (fileWaveSource == null); const int mixerSampleRate = 44100; //44.1kHz var mixer = new SimpleMixer(2, mixerSampleRate) //output: stereo, 44,1kHz { FillWithZeros = true, DivideResult = true //you may play around with this }; var monoToLeftOnlyChannelMatrix = new ChannelMatrix(ChannelMask.SpeakerFrontCenter, ChannelMask.SpeakerFrontLeft | ChannelMask.SpeakerFrontRight); var monoToRightOnlyChannelMatrix = new ChannelMatrix(ChannelMask.SpeakerFrontCenter, ChannelMask.SpeakerFrontLeft | ChannelMask.SpeakerFrontRight); /* * Set the channel conversion matrix. * The y-axis specifies the input. This in only one channel since the SineGenerator only uses one channel. * The x-axis specifies the output. There we have to use two channels since we want stereo output. * The first value on the x-axis specifies the volume of the left channel, the second value * on the x-axis specifies the volume of the right channel. * * If we take look at the left only channel conversion matrix, we can see that we are mapping one channel (y-axis) * to two channels (x-axis). The left channel receives a volume of 1.0 (which means 100%) and the right channel * receives a volume of 0.0 (which means 0.0% -> muted). */ monoToLeftOnlyChannelMatrix.SetMatrix( new[, ] { { 1.0f, 0.0f } }); monoToRightOnlyChannelMatrix.SetMatrix( new[, ] { { 0.0f, 1.0f } }); VolumeSource volumeSource1, volumeSource2; //Add any sound track. mixer.AddSource( fileWaveSource .ChangeSampleRate(mixerSampleRate) .ToStereo() .ToSampleSource()); //Add a 700Hz sine with a amplitude of 0.5 which plays only on the left channel. mixer.AddSource( new SineGenerator(700, 0.5, 0).ToWaveSource() .AppendSource(x => new DmoChannelResampler(x, monoToLeftOnlyChannelMatrix, mixerSampleRate)) .AppendSource(x => new VolumeSource(x.ToSampleSource()), out volumeSource1)); //Add a 300Hz sine with a amplitude of 0.5 which plays only on the right channel. mixer.AddSource( new SineGenerator(300, 0.5, 0).ToWaveSource() .AppendSource(x => new DmoChannelResampler(x, monoToRightOnlyChannelMatrix, mixerSampleRate)) .AppendSource(x => new VolumeSource(x.ToSampleSource()), out volumeSource2)); //Initialize the soundout with the mixer. var soundOut = new WasapiOut() { Latency = 200 }; //better use a quite high latency soundOut.Initialize(mixer.ToWaveSource()); soundOut.Play(); //adjust the volume of the input signals (default value is 100%): volumeSource1.Volume = 0.5f; //set the volume of the 700Hz sine to 50% volumeSource2.Volume = 0.7f; //set the volume of the 300Hz sine to 70% Console.ReadKey(); mixer.Dispose(); soundOut.Dispose(); }