.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();