private void PlaySound() { StartRecordingButton.IsEnabled = false; if (outputDevice == null) { StereoToMonoSampleProvider toMonoSampleProvider; outputDevice = new WaveOutEvent(); try { toMonoSampleProvider = new StereoToMonoSampleProvider(audioFileReader); volumeProvider = new VolumeSampleProvider(toMonoSampleProvider); } catch (ArgumentException) { volumeProvider = new VolumeSampleProvider(audioFileReader); } panningProvider = new PanningSampleProvider(volumeProvider); panningProvider.Pan = (float)(PanningSlider.Value / 100.0f); volumeProvider.Volume = (float)(VolumeSlider.Value / 100.0f); //TestLabel.Content = panningProvider.Pan; outputDevice.Init(panningProvider); } if (outputDevice != null) { outputDevice.Play(); } }
private ISampleProvider CreateSampleChain(WaveStream sourceStream) { //loop is implemented as a wave stream _loopingProvider = new LoopingWaveStream(sourceStream); _loopingProvider.EnableLooping = _loop; var outputSample = _loopingProvider.ToSampleProvider(); //fade-in/fade-out _fadingProvider = new FadeInOutStopSampleProvider(outputSample); outputSample = _fadingProvider; //panning (will convert to mono) if (PanningEnabled) { var monoProvider = new StereoToMonoSampleProvider(outputSample); _panningProvider = new PanningSampleProvider(monoProvider); _panningProvider.PanStrategy = new StereoBalanceStrategy(); _panningProvider.Pan = Pan; outputSample = _panningProvider; } //volume _volumeProvider = new VolumeSampleProvider(outputSample); _volumeProvider.Volume = _volume; outputSample = _volumeProvider; return(outputSample); }
private void closeAudioFilerReader() { if (audioFileReader != null) { audioFileReader.Dispose(); audioFileReader = null; panningProvider = null; volumeProvider = null; } }
public void Stop() { IsPlaying = false; audioFile.Position = 0; outputDevice?.Stop(); currentEntity = null; panner = null; }
public MixerChannel(IEventAggregator events) { _events = events ?? throw new ArgumentNullException(nameof(events)); _buffer = new BufferedWaveProvider(WaveFormat.CreateIeeeFloatWaveFormat(WaveFormat.SampleRate, 1)); _volume = new VolumeSampleProvider(_buffer.ToSampleProvider()); _balance = new PanningSampleProvider(_volume) { Pan = 0f }; _events.Subscribe(this); }
public void Play(Entity entity) { Stop(); IsPlaying = true; currentEntity = entity; audioFile.Position = 0; audioFile.Volume = Utils.CalculateVolume(entity); panner = new PanningSampleProvider(audioFile); panner.Pan = Utils.CalculateStereo(entity); outputDevice = new WaveOutEvent(); outputDevice.PlaybackStopped += OutputDevice_PlaybackStopped; outputDevice.Init(panner); outputDevice.Play(); }
public void Dispose() { if (waveStream == null) { return; } waveOut.PlaybackStopped -= onPlaybackComplete; waveOut.Stop(); waveOut.Dispose(); waveStream.Dispose(); byteStream.Dispose(); waveOut = null; panningProvider = null; volumeProvider = null; waveStream = null; byteStream = null; }
/* Applies volume and pan parameters to outgoing samples*/ private ISampleProvider ProcessInput(ISampleProvider input, int bankIndex, int padIndex) { VolumeSampleProvider VSP = new VolumeSampleProvider(input); VSP.Volume = samplerModel.song.banks[bankIndex].pads[padIndex].volume; PanningSampleProvider PSP = new PanningSampleProvider(VSP.ToWaveProvider16().ToSampleProvider()); // <- this throws ArgumentException PSP.Pan = samplerModel.song.banks[bankIndex].pads[padIndex].pan; //ISampleProvider result = PSP.Skip(new TimeSpan(0, 0, (int) samplerModel.song.banks[bankIndex].pads[padIndex].startPoint)); ISampleProvider result = PSP.Skip(samplerModel.song.banks[bankIndex].pads[padIndex].startPoint); //int duration = (int)(samplerModel.song.banks[bankIndex].pads[padIndex].endPoint - samplerModel.song.banks[bankIndex].pads[padIndex].startPoint); TimeSpan duration = (samplerModel.song.banks[bankIndex].pads[padIndex].endPoint - samplerModel.song.banks[bankIndex].pads[padIndex].startPoint); //result = result.Take(new TimeSpan(0,0,duration)); result = result.Take(duration); return(result.ToWaveProvider16().ToSampleProvider()); }
public void wasapiPlay() { ISampleProvider sampleProvider1; VolumeSampleProvider volumeSampleProv1; SmbPitchShiftingSampleProvider smbPitchSampleProv1; OffsetSampleProvider offsetSampleProv1; PanningSampleProvider panSampleProv1; void funcForBuff(object sender, WaveInEventArgs waveInEventArgs) { buffWaveProv.AddSamples(waveInEventArgs.Buffer, 0, waveInEventArgs.BytesRecorded); } var enumerator = new NAudio.CoreAudioApi.MMDeviceEnumerator(); wInput = enumerator.GetDevice(strInputDeviceID); wOutput = enumerator.GetDevice(strOutputDeviceID); wOut = new WasapiOut(wOutput, AudioClientShareMode.Shared, true, 10); wCapture = new WasapiCapture(wInput, true, 10); buffWaveProv = new BufferedWaveProvider(wCapture.WaveFormat); wCapture.DataAvailable += funcForBuff; sampleProvider1 = buffWaveProv.ToSampleProvider(); smbPitchSampleProv1 = new SmbPitchShiftingSampleProvider(sampleProvider1); smbPitchSampleProv1.PitchFactor = fPitch; offsetSampleProv1 = new OffsetSampleProvider(smbPitchSampleProv1); offsetSampleProv1.DelayBy = new TimeSpan(0, 0, 0, 0, iLatency); panSampleProv1 = new PanningSampleProvider(offsetSampleProv1.ToMono(1f, 1f)); panSampleProv1.Pan = fPanning; volumeSampleProv1 = new VolumeSampleProvider(panSampleProv1); volumeSampleProv1.Volume = fVolume; wOut.Init(volumeSampleProv1); wCapture.StartRecording(); wOut.Play(); }
// constructor internal Audio(AudioType type, AudioFormat format, byte[] data, int device) : base(type, format, data, device) { playing.Value = false; waveOut.DeviceNumber = device; waveOut.PlaybackStopped += OnPlaybackComplete; byteStream = new MemoryStream(data); if (Format == AudioFormat.AIFF) { waveStream = new AiffFileReader(byteStream); } else if (Format == AudioFormat.WAV) { waveStream = new WaveFileReader(byteStream); } else if (Format == AudioFormat.MP3) { waveStream = new Mp3FileReader(byteStream); } else if (Format == AudioFormat.Vorbis) { waveStream = new VorbisWaveReader(byteStream); } volumeProvider = new VolumeSampleProvider(waveStream.ToSampleProvider()) { Volume = (float)Volume }; if (waveStream.WaveFormat.Channels == 1) { panningProvider = new PanningSampleProvider(volumeProvider) { Pan = (float)Pan }; waveOut.Init(panningProvider); } else { waveOut.Init(volumeProvider); } }
public ISampleProvider ApplyPanVolume(ISampleProvider input, Slot slot) { //get the specified pan for this slot float pan = panValues[slot]; float volume = volumeValues[slot]; MixingSampleProvider result = new MixingSampleProvider(WaveFormat.CreateIeeeFloatWaveFormat(sampleRate, channels)); result.AddMixerInput(input); VolumeSampleProvider vsp = new VolumeSampleProvider(result); vsp.Volume = volume; PanningSampleProvider psp = new PanningSampleProvider(vsp); psp.Pan = pan; return(result); }
public void Start() { this._waveOut?.Dispose(); // Stop → Init だと WASAPI がエラー出すので作り直す this._waveOut = new WasapiOut(AudioClientShareMode.Shared, true, 50); this._waveOut.PlaybackStopped += this.WaveOutPlaybackStopped; // ISampleProvider をつくる // SmbPitchShiftingSampleProvider は内部でバッファーを持っているので、使いまわせない this._pitchShiftProvider = new SmbPitchShiftingSampleProvider(this._monoSampleProvider, 1024, 2, 1f); //this._pitchShiftProvider = new StftPitchShiftingSampleProvider(this._monoSampleProvider); var provider = new PanningSampleProvider(this._pitchShiftProvider) { Pan = this._pan }; this._waveOut.Init(provider); this._waveOut.Play(); }
public void Initialize(int audioDevice) { Dispose(); waveOut = new WaveOutEvent(); waveOut.DeviceNumber = audioDevice; waveOut.PlaybackStopped += onPlaybackComplete; byteStream = new MemoryStream(_data); if (_format == AudioFormat.Aiff) { waveStream = new AiffFileReader(byteStream); } else if (_format == AudioFormat.Wav) { waveStream = new WaveFileReader(byteStream); } else if (_format == AudioFormat.Mp3) { waveStream = new Mp3FileReader(byteStream); } else if (_format == AudioFormat.Vorbis) { waveStream = new VorbisWaveReader(byteStream); } volumeProvider = new VolumeSampleProvider(waveStream.ToSampleProvider()); volumeProvider.Volume = (float)_volume; if (waveStream.WaveFormat.Channels == 1) { panningProvider = new PanningSampleProvider(volumeProvider); panningProvider.Pan = (float)_pan; waveOut.Init(panningProvider); } else { waveOut.Init(volumeProvider); } }
private Mixer() { try { mixer.ReadFully = true; mixer.MixerInputEnded += OnInputEnded; VSP = new VolumeSampleProvider(mixer); VSP.Volume = baseVolume; PSP = new PanningSampleProvider(VSP); PSP.Pan = basePan; // waveOut = new WaveOutEvent(); // waveOut = new DirectSoundOut(40); waveOut = new NAudio.Wave.AsioOut("ASIO4ALL v2"); //waveOut = new AsioOut(); waveOut.Init(PSP); waveOut.Play(); } catch (Exception e) { throw e; } }
public void LocateNewSE(bool isRight) { Random random; if (isRight) { random = rightRandom; } else { random = leftRandom; } CachedSound target; while (true) { target = seList[random.Next(seList.Count)]; if (!lastCache.Contains(target.Name)) { break; } } if (lastCache[0] == null) { lastCache[0] = target.Name; } else { if (lastCache[1] == null) { lastCache[1] = target.Name; } else { lastCache[0] = lastCache[1]; lastCache[1] = target.Name; } } if (isRight) { Debug.WriteLine($"{target} is Fired on Right"); } else { Debug.WriteLine($"{target} is Fired on Left"); } var volumeProvider = new VolumeSampleProvider(target.ToSampleProvider()); volumeProvider.Volume = (float)selectedPreset.SEVolume; var panProvider = new PanningSampleProvider(volumeProvider); if (isRight) { panProvider.Pan = 1; mixer.AddMixerInput(new RightSESampleProvider(panProvider)); } else { panProvider.Pan = -1; mixer.AddMixerInput(new LeftSESampleProvider(panProvider)); } }
public static void PlaySample(Level level, WadSample sample, int channel, float volume = 1.0f, float pitch = 1.0f, float pan = 0.0f, int loopCount = 1) { if (volume <= 0.0f || loopCount <= 0) { return; } var disposables = new List <IDisposable>(); try { // Load data. // If waveform data is loaded into memory, use it to play sound, otherwise find wav file on disk. WaveFileReader waveStream; MemoryStream memoryStream; if (sample.IsLoaded) { memoryStream = disposables.AddAndReturn(new MemoryStream(sample.Data, false)); waveStream = disposables.AddAndReturn(new WaveFileReader(memoryStream)); } else { var path = WadSounds.TryGetSamplePath(level.Settings, sample.FileName); if (path == null) { return; } else { waveStream = disposables.AddAndReturn(new WaveFileReader(path)); } } // Apply looping ISampleProvider sampleStream; if (loopCount <= 1) { sampleStream = waveStream.ToSampleProvider(); } else { sampleStream = new RepeatedStream(waveStream) { LoopCount = loopCount } }; // Always play sample as 22 khz if (sampleStream.WaveFormat.SampleRate != 22050) { sampleStream = new PitchedStream { Source = sampleStream, Pitch = 22050.0f / sampleStream.WaveFormat.SampleRate } } ; // Apply panning if (pan != 1.0f) { sampleStream = new PanningSampleProvider(sampleStream) { Pan = pan } } ; // Apply pitch if (pitch != 1.0f) { sampleStream = new PitchedStream { Source = sampleStream, Pitch = pitch } } ; // Apply volume if (volume != 1.0f) { sampleStream = new VolumeSampleProvider(sampleStream) { Volume = volume } } ; // Add some silence to make sure the audio plays out. const int latencyInMilliseconds = 200; int latencyInSamples = (sampleStream.WaveFormat.SampleRate * latencyInMilliseconds * 2) / 1000; sampleStream = new OffsetSampleProvider(sampleStream) { LeadOutSamples = sampleStream.WaveFormat.Channels * latencyInSamples }; // Play _channels[channel] = disposables.AddAndReturn(new WaveOut()); _channels[channel].Init(sampleStream); _channels[channel].PlaybackStopped += (s, e) => { foreach (IDisposable disposable in disposables) { disposable?.Dispose(); } _channels[channel] = null; _indices[channel] = -1; }; _channels[channel].Play(); } catch (Exception ex) { // Clean up in case of a problem foreach (IDisposable disposable in disposables) { disposable?.Dispose(); } _logger.Error("Error while playing sample " + sample + ", exception: " + ex); } }
public TrackSampleProvider() { mix = new MixingSampleProvider(WaveFormat.CreateIeeeFloatWaveFormat(44100, 2)); pan = new PanningSampleProvider(mix.ToMono()); volume = new VolumeSampleProvider(pan); }