我需要创建一个包含许多不同频率的音调的声音。在C#中有什么方法可以做到这一点吗?
到目前为止,我见过的唯一的音调生成方法涉及console.beep,它有效,但仅适用于纯音调(单频)。
发布于 2009-11-04 02:11:46
Audiere库使这项工作变得非常容易。下面是一个几乎完整的C#程序,用于生成"1“按钮的双音多频音调:
AudioDevice device = new AudioDevice();
OutputStream tone1a = device.CreateTone(697); // part A of DTMF for "1" button
OutputStream tone1b = device.CreateTone(1209); // part B
tone1a.Volume = 0.25f;
tone1b.Volume = 0.25f;
tone1a.Play();
tone1b.Play();
Thread.Sleep(2000);
// when tone1a stops, you can easily tell that the tone was indeed DTMF
tone1a.Stop(); 要在C#中使用Audiere,最简单的启动和运行方式是使用Harald Fielker's C# binding (他声称它可以在Mono和VS上工作;我可以确认它在VS2005的完整版和C#和VC++的单独Express2008版本中都可以工作)。您需要下载Win32 Audiere DLL, lib, and header (它们都在相同的压缩包中),并且需要使用VC++和C#从源代码构建C#绑定。
使用Audiere的一个好处是调用是非阻塞的。在启动tone1b之前,您不必等待tone1a停止播放,这显然是播放复杂音调所必需的。我不知道您可以同时使用多少个输出流的硬性上限,所以这可能是您的硬件/操作系统所支持的。顺便说一下,Audiere还可以播放某些音频文件(MP3,WAV,AIFF,MOD,S3M,XM,IT本身;Ogg Vorbis,Flac,Speex与外部库),而不仅仅是纯生成的音调。
一个可能的缺点是,当你开始或停止一个单独的音调时,会有轻微的“滴答声”;如果你在已经播放的音调上添加一个音调,这是不明显的。我找到的最简单的解决办法是,当你打开或关闭音调时,分别缓慢地调高或调低音量。你可能需要调整一下坡道的速度,让它听起来“恰到好处”。
请注意,Audiere是LGPL许可的,绑定没有附加任何许可证。如果您想在商业产品中使用Harald的绑定,您必须咨询您的法律团队或尝试联系他;或者您可以自己制作绑定,以避免麻烦。
@Tom:由于Harald的库没有特定的许可证,我不确定托管它会带来什么影响;但是,我相信我至少可以给你详细说明我的libaudieresharpglue项目是如何建立的。
使用Visual C++ Express2008,打开bindings/csharp/libaudieresharpglue/vc8.0/libaudieresharpglue.sln. VC++会自动将解决方案转换为VS9解决方案。
在另一个文件夹中,您应该有来自Sourceforge的Audiere包。在您的VC++项目属性下,转到Configuration properties > C/C++ > General,并确保您的"Additional Include Directories“中有path/to/audiere-1.9.4-win32/include。然后,在同一个窗口中,转到“链接器”>“常规”,并确保您的“其他库目录”中有/path/to/audiere-1.9.4-win32/lib。然后,您应该能够在vc8.0/Release文件夹中构建项目(最好是在发布模式下)和此输出libaudieresharpglue.dll。
接下来,打开Visual C# Express2008。打开bindings\csharp\test\vc8.0\AudiereCSharpTest.sln并让它转换解决方案。这个项目应该可以很好地构建,但是当你运行它时,你会得到一个错误。这很好;在csharp/test/vc8.0/bin/Release文件夹中,您需要添加来自VC++解决方案的libaudieresharpglue.dll和来自Sourceforge的包中的audiere.dll。
现在,您应该能够构建和运行AudiereCSharpTest了。请注意,默认情况下,AudiereTest.cs顶部的#define stream_test不会被注释掉,它将引用不在硬盘上的文件。您可以简单地注释掉该#define并取消对noise_test或square_test的注释。
这应该涵盖了它;如果我遗漏了任何细节,希望它们足够小,可以自己完成:)
发布于 2009-10-29 19:46:25
您可以随时尝试DirectSound...
发布于 2009-10-29 20:20:06
我一直在关注NAudio,目的是创建一个在播放背景音乐的同时模拟反馈的程序。有一篇关于生成sine waves at specific frequencies的博客文章,我怀疑这可能会被改编成你正在寻找的东西。
https://stackoverflow.com/questions/1643122
复制相似问题