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