.NET 4.x Воспроизвести звук определённой частоты через звуковую карту - C#
Формулировка задачи:
вообщем пишу виртуальное пианино.при нажатие на кнопку надо воспроизвести определённый звук определённой частотой . пробовал beep но это через системный динамик да и звук не красивый. при ходит на ум ещё одна идея каждую ноту синтезировать и в отдельный файл но это тоже самоубийство.есть ли нормальный способ ?
Решение задачи: «.NET 4.x Воспроизвести звук определённой частоты через звуковую карту»
textual
Листинг программы
- // your own wave provider
- public abstract class WaveProvider32 : IWaveProvider
- {
- private WaveFormat waveFormat;
- public WaveProvider32() : this(44100, 1) { }
- public WaveProvider32(int sampleRate, int channels)
- {
- SetWaveFormat(sampleRate, channels);
- }
- public void SetWaveFormat(int sampleRate, int channels)
- {
- this.waveFormat = WaveFormat.CreateIeeeFloatWaveFormat(sampleRate, channels);
- }
- public int Read(byte[] buffer, int offset, int count)
- {
- WaveBuffer waveBuffer = new WaveBuffer(buffer);
- int samplesRequired = count / 4;
- int samplesRead = Read(waveBuffer.FloatBuffer, offset / 4, samplesRequired);
- return samplesRead * 4;
- }
- public abstract int Read(float[] buffer, int offset, int sampleCount);
- public WaveFormat WaveFormat
- {
- get { return waveFormat; }
- }
- }
- // concrete implementation
- public class SineWaveProvider32 : WaveProvider32
- {
- int sample;
- public SineWaveProvider32()
- {
- Frequency = 1000; // <-- This is your frequency
- Amplitude = 0.25f; // let's not hurt our ears
- }
- public float Frequency { get; set; }
- public float Amplitude { get; set; }
- public override int Read(float[] buffer, int offset, int sampleCount)
- {
- int sampleRate = WaveFormat.SampleRate;
- for (int n = 0; n < sampleCount; n++)
- {
- buffer[n + offset] = (float)(Amplitude * Math.Sin((2 * Math.PI * sample * Frequency) / sampleRate));
- sample++;
- if (sample >= sampleRate) sample = 0;
- }
- return sampleCount;
- }
- }// example of using
- var sineWaveProvider = new SineWaveProvider32();
- sineWaveProvider.SetWaveFormat(16000, 1); // 16kHz mono
- sineWaveProvider.Frequency = 500;
- sineWaveProvider.Amplitude = 0.35f;
- waveOut = new WaveOut();
- waveOut.Init(sineWaveProvider);
- waveOut.Play();
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д