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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5
Похожие ответы