可能重复: 在C#中产生正弦波或方波
我想发出声音。或者类似于:
MakeSound(frequency, duration);或者:
MakeSound(MyArrayOfSamples);我发现了一个叫做:Microsoft.Directx.DirectSound的东西,但是我读到它已经停止了。在Visual (2010)中,我找不到它作为引用的选项。我已经找到了此链接,根据我所读到的,它应该包括它,但是我对使用2006年的东西犹豫不决,因为它可能不再被支持。这一个说它是用于C/C++ (尽管也说了“托管代码”),我不想浪费数周的时间来理解如何将其封装到托管代码中,只是为了发现我做不到。我找到的最有希望的链接是WaveFormat,但我找不到如何使用它。
我不是在问如何得到声波的数学表达式。我也没有问如何播放mp3文件等。我也不寻找第三方软件或包装。只是为了一个非常具体的目标的C# / .net解决方案。
发布于 2012-12-26 15:40:53
无论从哪种角度来看,除非您想使用非托管代码,否则您必须构建一个WAV来播放它。但是,下面是来自埃里克·利珀特的博客的代码片段,它将向您展示如何使用频率滚动自己的WAV文件。
namespace Wave
{
using System;
using System.IO;
class MainClass {
public static void Main() {
FileStream stream = new FileStream("test.wav", FileMode.Create);
BinaryWriter writer = new BinaryWriter(stream);
int RIFF = 0x46464952;
int WAVE = 0x45564157;
int formatChunkSize = 16;
int headerSize = 8;
int format = 0x20746D66;
short formatType = 1;
short tracks = 1;
int samplesPerSecond = 44100;
short bitsPerSample = 16;
short frameSize = (short)(tracks * ((bitsPerSample + 7)/8));
int bytesPerSecond = samplesPerSecond * frameSize;
int waveSize = 4;
int data = 0x61746164;
int samples = 88200 * 4;
int dataChunkSize = samples * frameSize;
int fileSize = waveSize + headerSize + formatChunkSize + headerSize + dataChunkSize;
writer.Write(RIFF);
writer.Write(fileSize);
writer.Write(WAVE);
writer.Write(format);
writer.Write(formatChunkSize);
writer.Write(formatType);
writer.Write(tracks);
writer.Write(samplesPerSecond);
writer.Write(bytesPerSecond);
writer.Write(frameSize);
writer.Write(bitsPerSample);
writer.Write(data);
writer.Write(dataChunkSize);
double aNatural = 220.0;
double ampl = 10000;
double perfect = 1.5;
double concert = 1.498307077;
double freq = aNatural * perfect;
for (int i = 0; i < samples / 4; i++) {
double t = (double)i / (double)samplesPerSecond;
short s = (short)(ampl * (Math.Sin(t * freq * 2.0 * Math.PI)));
writer.Write(s);
}
freq = aNatural * concert;
for (int i = 0; i < samples / 4; i++) {
double t = (double)i / (double)samplesPerSecond;
short s = (short)(ampl * (Math.Sin(t * freq * 2.0 * Math.PI)));
writer.Write(s);
}
for (int i = 0; i < samples / 4; i++) {
double t = (double)i / (double)samplesPerSecond;
short s = (short)(ampl * (Math.Sin(t * freq * 2.0 * Math.PI) + Math.Sin(t * freq * perfect * 2.0 * Math.PI)));
writer.Write(s);
}
for (int i = 0; i < samples / 4; i++) {
double t = (double)i / (double)samplesPerSecond;
short s = (short)(ampl * (Math.Sin(t * freq * 2.0 * Math.PI) + Math.Sin(t * freq * concert * 2.0 * Math.PI)));
writer.Write(s);
}
writer.Close();
stream.Close();
}
}
}根据您的需要将其拆分,但是请注意aNatural变量--它是一个频率--就像您正在寻找的一样。
现在,您可以将其放入MemoryStream中,然后根据需要使用SoundPlayer播放它。
发布于 2012-12-26 15:44:07
下面是内核中嘟嘟声函数的包装器,使用的是持续时间和频率。如今,Beep使用的是声卡;在我的时代,它使用了一些粘贴在主板上的压电设备。
using System;
using System.Runtime.InteropServices;
class BeepSample
{
[DllImport("kernel32.dll", SetLastError=true)]
static extern bool Beep(uint dwFreq, uint dwDuration);
static void Main()
{
Console.WriteLine("Testing PC speaker...");
for (uint i = 100; i <= 20000; i++)
{
Beep(i, 5);
}
Console.WriteLine("Testing complete.");
}
}在我的Win10框中,我需要将持续时间(最后一个参数)设置得比这里的5ms大得多,最多50 ms,但是为了得到合理的东西,我必须设置它100 ms。
或者使用Console.Beep(Int32,Int32)方法,如果您想要采取简单的路线。该方法是在.Net 2.0中提出的。
https://stackoverflow.com/questions/14042630
复制相似问题