.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();
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д