.NET 4.x Воспроизвести звук определённой частоты через звуковую карту - C#

Узнай цену своей работы

Формулировка задачи:

вообщем пишу виртуальное пианино.при нажатие на кнопку надо воспроизвести определённый звук определённой частотой . пробовал beep но это через системный динамик да и звук не красивый. при ходит на ум ещё одна идея каждую ноту синтезировать и в отдельный файл но это тоже самоубийство.есть ли нормальный способ ?

Решение задачи: «.NET 4.x Воспроизвести звук определённой частоты через звуковую карту»

textual
Листинг программы
  1. // your own wave provider
  2.  public abstract class WaveProvider32 : IWaveProvider
  3.     {
  4.         private WaveFormat waveFormat;
  5.  
  6.         public WaveProvider32() : this(44100, 1) { }
  7.        
  8.  
  9.         public WaveProvider32(int sampleRate, int channels)
  10.         {
  11.             SetWaveFormat(sampleRate, channels);
  12.         }
  13.  
  14.         public void SetWaveFormat(int sampleRate, int channels)
  15.         {
  16.             this.waveFormat = WaveFormat.CreateIeeeFloatWaveFormat(sampleRate, channels);            
  17.         }
  18.  
  19.         public int Read(byte[] buffer, int offset, int count)
  20.         {
  21.             WaveBuffer waveBuffer = new WaveBuffer(buffer);
  22.             int samplesRequired = count / 4;
  23.             int samplesRead = Read(waveBuffer.FloatBuffer, offset / 4, samplesRequired);
  24.             return samplesRead * 4;
  25.         }
  26.  
  27.         public abstract int Read(float[] buffer, int offset, int sampleCount);
  28.  
  29.         public WaveFormat WaveFormat
  30.         {
  31.             get { return waveFormat; }
  32.            
  33.         }
  34.  
  35.     }
  36.    
  37.     // concrete implementation
  38.     public class SineWaveProvider32 : WaveProvider32
  39.     {
  40.         int sample;
  41.  
  42.         public SineWaveProvider32()
  43.         {
  44.             Frequency = 1000; // <--  This is your frequency
  45.             Amplitude = 0.25f; // let's not hurt our ears            
  46.         }
  47.  
  48.         public float Frequency { get; set; }
  49.         public float Amplitude { get; set; }
  50.  
  51.         public override int Read(float[] buffer, int offset, int sampleCount)
  52.         {
  53.             int sampleRate = WaveFormat.SampleRate;
  54.             for (int n = 0; n < sampleCount; n++)
  55.             {
  56.                 buffer[n + offset] = (float)(Amplitude * Math.Sin((2 * Math.PI * sample * Frequency) / sampleRate));
  57.                 sample++;
  58.                 if (sample >= sampleRate) sample = 0;
  59.             }
  60.             return sampleCount;
  61.         }
  62.     }// example of using
  63.     var sineWaveProvider = new SineWaveProvider32();
  64.                 sineWaveProvider.SetWaveFormat(16000, 1); // 16kHz mono
  65.                 sineWaveProvider.Frequency = 500;
  66.                 sineWaveProvider.Amplitude = 0.35f;
  67.                 waveOut = new WaveOut();
  68.                 waveOut.Init(sineWaveProvider);                
  69.                 waveOut.Play();

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


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

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

13   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы