我需要创建一种包含许多不同频率音调的声音。在C#中有什么方法可以做到这一点?
到目前为止,我所见的唯一的音调生成方法涉及console.beep,该方法有效,但仅适用于纯音调(单个频率)。
最佳答案
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();
要在C#中使用Audiere,最简单的启动和运行方式是使用Harald Fielker's C# binding(他声称该功能可在Mono和VS上使用;我可以确认它在VS2005的完整版本中以及在单独的Express 2008版本的C#和VC++)。您需要下载Win32 Audiere DLL, lib, and header(它们都在同一zip中),并且需要使用VC++和C#从源代码构建C#绑定(bind)。
使用Audiere的好处之一是调用是非阻塞的。开始
tone1a
之前,您不必等待tone1b
停止播放,这显然是播放复杂音调的必要条件。我不知道您可以使用多少个同时输出流的硬性上限,因此可能是您的硬件/OS支持的。顺便说一下,Audiere还可以播放某些音频文件(MP3,WAV,AIFF,MOD,S3M,XM,IT本身;带有外部库的Ogg Vorbis,Flac,Speex),而不仅仅是纯音调。可能的不利之处是,在您启动或停止单个音调时会听到轻微的“喀哒”声。如果您在已经播放的音调中添加一个音调就不会引起注意。我找到的最简单的解决方法是,分别在打开或关闭音调时缓慢增大或减小音调的音量。您可能需要试一试斜坡速度,以使其听起来“恰到好处”。
请注意,Audiere是LGPL许可的,并且绑定(bind)中未附加任何许可。如果您想在商业产品中使用Harald的绑定(bind),则必须咨询您的法律团队或尝试获取Harald的所有权;或者您也可以自己进行绑定(bind)并避免麻烦。
@Tom:由于Harald的图书馆没有附加特定的许可证,所以我不确定托管它会带来什么影响。但是,我相信至少可以为您详细介绍我的libaudieresharpglue项目是如何建立的。
使用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
。然后,您应该能够构建项目(最好在 Release模式下),并将此输出libaudieresharpglue.dll
输出到vc8.0/Release
文件夹中。接下来,打开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
。那应该覆盖它;如果我错过了任何细节,希望它们足够小,可以自己解决:)
关于c# - 是否可以在C#中生成复杂的音调?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1643122/