C# 在可更新的背景线程上播放的音调

C# 在可更新的背景线程上播放的音调,c#,winforms,C#,Winforms,我有一个C Windows窗体应用程序,它连接到感知环境变化的第三方设备。我想有一个不断运行的线程是可以更新的语气运行。频率的高低取决于我传入线程的值。我可以举出这方面的任何例子或想法吗?我在声音生成方面不是很流利,也不确定是否应该使用Beepint,int 谢谢 NAudio NuGet软件包非常容易使用。我这里有一个工作剪辑,您可以根据需要进行修改: void Main() { var sine = new SineGenerator(); var waveOut = ne

我有一个C Windows窗体应用程序,它连接到感知环境变化的第三方设备。我想有一个不断运行的线程是可以更新的语气运行。频率的高低取决于我传入线程的值。我可以举出这方面的任何例子或想法吗?我在声音生成方面不是很流利,也不确定是否应该使用Beepint,int


谢谢

NAudio NuGet软件包非常容易使用。我这里有一个工作剪辑,您可以根据需要进行修改:

void Main()
{
    var sine = new SineGenerator();

    var waveOut = new WaveOut();
    waveOut.DesiredLatency = 100;

    waveOut.Init(sine);
    waveOut.Play();

    var random = new Random();

    while (true)
    {
        Thread.Sleep(100);
        sine.Frequency = random.Next(100, 500);
    }

    waveOut.Stop();
}

public class SineGenerator : IWaveProvider
{
    private WaveFormat waveFormat;
    private int sample;

    public SineGenerator()
        : this(44100, 1)
    {
        Frequency = 1000;
        Amplitude = 0.25f;
    }

    public float Frequency { get; set;}
    public float Amplitude { get; set; }

    public SineGenerator(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 = this.Read(waveBuffer.FloatBuffer, offset / 4, samplesRequired);
        return samplesRead * 4;
    }

    public int Read(float[] buffer, int offset, int sampleCount)
    {
        int sampleRate = WaveFormat.SampleRate;
        int channels = WaveFormat.Channels;

        double p = 2.0 * Math.PI / channels * Frequency;

        for (int n = 0; n < sampleCount; n += channels)
        {
            float value = (float)(Amplitude * Math.Sin((sample * p) / sampleRate));

            var b = Convert.ToByte((value + 0.5) * 255);
            value = (float)b / 255;

            for (int c = 0; c < channels; c++)
            {
                buffer[n + offset + c] = value;
            }

            sample += channels;
            if (sample == int.MaxValue) sample = 0;
        }

        return sampleCount;
    }

    public WaveFormat WaveFormat
    {
        get { return waveFormat; }
    }
}

有关更多解决方案,请参见线程。

谢谢!!我正在尝试实现,但使用您的代码听不到音调的变化,我唯一更改的是将min/max更改为1000/2000,以便更容易听到。我期望音调随机变化,对吗?很好,我不用用循环测试它,而是在实时数据下运行,按照指示工作。谢谢@thomai!!