是否有可能在C#中生成复杂的音调?

我需要创建一个包含许多不同频率音调的声音。 有没有办法在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的一个好处是,呼叫是非阻塞的。 在启动tone1b之前,您不必等待tone1a停止播放,这显然是播放复杂音调的必要条件。 我不知道您可以使用多少同时输出流的任何硬性上限,因此它可能是您的硬件/操作系统支持的任何内容。 顺便说一句,Audiere还可以播放某些音频文件(MP3,WAV,AIFF,MOD,S3M,XM,IT本身; Ogg Vorbis,Flac,Speex与外部库),而不仅仅是纯生成的音调。

一个可能的缺点是,当您开始或停止单个音调时,会发出轻微的“咔嗒”声; 如果你为已播放的音调添加一个音调,则不会引起注意。 我发现的最简单的解决方法是分别在打开或关闭音调时缓慢上调或下调音量。 您可能需要使用斜坡速度来使其听起来“恰到好处”。

请注意,Audiere是LGPL许可的,绑定没有附加许可证。 如果你想在商业产品中使用他的装订,你必须咨询你的法律团队或试着掌握Harald。 或者你可以自己绑定并避免麻烦。


@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 。 然后,您应该能够在vc8.0/Release文件夹中构建项目(最好是在Release模式下)并输出libaudieresharpglue.dll

接下来,打开Visual C#Express 2008.打开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_testsquare_test

这应该涵盖它; 如果我错过任何细节,希望它们足够小,可以靠自己:)

你总是可以试试DirectSound ……

我一直在寻找NAudio ,以期创建一个在播放背景音乐时模仿反馈的程序。 有一篇关于以特定频率生成正弦波的博客文章,我怀疑这可以适应你正在寻找的东西。

对的,这是可能的。

这是一个关于此的教程的链接 。 但当然这也使用Console.Beep

如果Console.Beep是异步的,MSDN文档也不清楚。 如果是这样,你可以快速连续发出尽可能多的电话,没有人会更聪明。 当然,您需要使用频率和持续时间的版本。

基本上,您必须实现自己的软件合成器或找到第三方库。 请参阅: http : //en.wikipedia.org/wiki/Demo_ (computer_programming)#Music