我需要创建一个包含许多不同频率音调的声音.有没有办法在C#中做到这一点?
到目前为止,我见过的唯一的音调生成方法涉及console.beep,它可以工作,但仅适用于纯音(单频).
Mar*_*off 19
该Audiere库使得这个非常容易做到的.这是一个几乎完整的C#程序,用于为"1"按钮生成DTMF音调:
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();
Run Code Online (Sandbox Code Playgroud)
要在C#中使用Audiere,最简单的启动和运行方式是使用Harald Fielker的C#绑定(他声称可以在Mono 和 VS上运行;我可以确认它适用于VS2005的完整版本并使用单独的Express 2008版本C#和VC++).您需要下载Win32 Audiere DLL,lib和标题(它们都在同一个zip 文件夹中),您需要使用VC++和C#从源代码构建C#绑定.
使用Audiere的一个好处是,呼叫是非阻塞的.tone1a
在开始之前你不必等待停止播放tone1b
,这显然是播放复杂音调的必要条件.我不知道您可以使用多少同时输出流的任何硬上限,因此它可能是您的硬件/操作系统支持的任何内容.顺便说一句,Audiere还可以播放某些音频文件(MP3,WAV,AIFF,MOD,S3M,XM,IT本身; Ogg Vorbis,Flac,Speex与外部库),而不仅仅是纯生成的音调.
一个可能的缺点是,当你开始或停止一个单独的音调时,会有轻微的"咔嗒"声; 如果你为已播放的音调添加一个音调,则不会引起注意.我发现的最简单的解决方法是分别在打开或关闭音调时缓慢上调或下调音量.您可能需要使用斜坡速度来使其听起来"恰到好处".
请注意,Audiere是LGPL许可的,绑定没有附加许可证.如果您想在商业产品中使用他的装订,您将需要咨询您的法律团队或尝试获取Harald.或者你可以自己制定绑定并避免麻烦.
使用Visual C++ Express 2008,打开bindings/csharp/libaudieresharpglue/vc8.0/libaudieresharpglue.sln.
VC++会自动将解决方案转换为VS9解决方案.
在另一个文件夹中,您应该拥有Sourceforge的Audiere包.在VC++项目属性下,转到"配置属性">"C/C++">"常规",并确保已path/to/audiere-1.9.4-win32/include
包含在"其他包含目录"中.然后,在同一窗口中,转到"链接器">"常规",确保您具有/path/to/audiere-1.9.4-win32/lib
"其他库目录".然后,您应该能够libaudieresharpglue.dll
在您的vc8.0/Release
文件夹中构建项目(最好是在发布模式下)和此输出.
接下来,打开Visual C#Express 2008.打开bindings\csharp\test\vc8.0\AudiereCSharpTest.sln
并让它转换解决方案.项目应该构建正常,但是当你运行它时会出现错误.没关系; 在您的csharp/test/vc8.0/bin/Release
文件夹中,您需要添加来自VC++解决方案的libaudieresharpglue.dll和来自Sourceforge的软件包中的audiere.dll.
现在,您应该能够构建和运行AudiereCSharpTest.请注意,默认情况下,#define stream_test
AudiereTest.cs顶部没有注释掉,这将引用不在硬盘驱动器上的文件.你可以简单地注释掉它#define
并取消注释noise_test
或square_test
.
这应该涵盖它; 如果我错过了任何细节,希望它们足够小,可以自己完成:)