我需要创建一个包含许多不同频率音调的声音。有没有办法在 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 的 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 的约束力,您必须咨询您的法律团队或尝试联系 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++ 解决方案的 libaudieresharpglie.dll 和来自 Sourceforge 的包中的 audiere.dll。
现在,您应该能够构建和运行 AudiereCSharpTest。请注意,默认情况下,#define stream_test
AudiereTest.cs 顶部没有注释掉,这将引用不在您的硬盘驱动器上的文件。您可以简单地注释掉它#define
并取消注释noise_test
或square_test
。
那应该涵盖它;如果我错过了任何细节,希望它们足够小,您可以自己解决:)
您可以随时尝试 DirectSound ...
我一直在研究NAudio,以创建一个在播放背景音轨时模拟反馈的程序。有一篇关于在特定频率下生成正弦波的博客文章,我怀疑这可以适应你正在寻找的东西。
是的,有可能。
这是有关此教程的链接。但当然这也使用Console.Beep
MSDN 文档没有明确说明 Console.Beep 是否是异步的。如果是这样,您可能可以根据需要快速连续拨打任意数量的电话,没有人会更聪明。当然,您希望使用需要频率和持续时间的版本。
本质上,您必须实现自己的软件合成器或找到第 3 方库。见:http ://en.wikipedia.org/wiki/Demo_(computer_programming)#Music