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

时间:2009-10-29 11:37:49

标签: c# audio beep

我需要创建一个包含许多不同频率音调的声音。有没有办法在C#中做到这一点?

到目前为止,我见过的唯一的音调生成方法涉及console.beep,它有效,但仅适用于纯音(单频)。

6 个答案:

答案 0 :(得分: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();  

要在C#中使用Audiere,最简单的启动和运行方式是使用Harald Fielker's C# binding(他声称可以使用Mono VS;我可以确认它在两者中都有效完整版VS2005并使用单独的Express 2008版本的C#和VC ++)。您需要下载Win32 Audiere DLL, lib, and header(它们都在同一个zip中),您需要使用VC ++和C#从源代码构建C#绑定。

使用Audiere的一个好处是,呼叫是非阻塞的。在开始tone1a之前,您不必等待tone1b停止播放,这显然是播放复杂音调的必要条件。我不知道您可以使用多少同时输出流的任何硬上限,因此它可能是您的硬件/操作系统支持的任何内容。顺便说一句,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 ++项目属性下,转到配置属性&gt; C / C ++&gt;一般情况,并确保您的“其他包含目录”中包含path/to/audiere-1.9.4-win32/include。然后,在同一窗口中,转到Linker&gt;一般,并确保在“其他库目录”中有/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。请注意,默认情况下,AudiereTest.cs顶部没有注释掉#define stream_test,这将引用不在硬盘驱动器上的文件。您只需注释掉#define并取消注释noise_testsquare_test

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

答案 1 :(得分:4)

您可以随时尝试DirectSound ...

答案 2 :(得分:3)

我一直在寻找NAudio,以创建一个在播放背景音乐时模仿反馈的程序。有一篇关于生成sine waves at specific frequencies的博客文章,我怀疑这可以适应你正在寻找的东西。

答案 3 :(得分:0)

是的,这是可能的。

Here is a link到这方面的教程。但当然这也使用Console.Beep

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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