Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有可能在C#中生成复杂的音调吗?_C#_Audio_Beep - Fatal编程技术网

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

有可能在C#中生成复杂的音调吗?,c#,audio,beep,C#,Audio,Beep,我需要创建一个包含许多不同频率音调的声音。在C#中有什么方法可以做到这一点吗 到目前为止,我所看到的唯一的音调生成方法是console.beep,它可以工作,但仅适用于纯音(单频)。是的,这是可能的 这方面的教程。当然,这也会使用Console.Beep,您可以随时尝试DirectSound…MSDN文档没有明确说明Console.Beep是否异步。如果是这样的话,你可能会接二连三地拨打你所需要的电话,没有人会比你更聪明。当然,您希望使用频率和持续时间相同的版本。我一直在研究如何创建一个程序,在

我需要创建一个包含许多不同频率音调的声音。在C#中有什么方法可以做到这一点吗

到目前为止,我所看到的唯一的音调生成方法是console.beep,它可以工作,但仅适用于纯音(单频)。

是的,这是可能的


这方面的教程。当然,这也会使用Console.Beep,您可以随时尝试DirectSound…

MSDN文档没有明确说明Console.Beep是否异步。如果是这样的话,你可能会接二连三地拨打你所需要的电话,没有人会比你更聪明。当然,您希望使用频率和持续时间相同的版本。

我一直在研究如何创建一个程序,在播放背景曲目时模拟反馈。有一篇关于生成的博文,我想这可以用来做你想做的事情。

基本上,你必须实现自己的软件合成器或找到第三方库。请参阅:

该库使此操作非常容易。下面是一个几乎完整的C#程序,用于为“1”按钮生成DTMF音调:

要在C#中使用Audiere,最简单的启动和运行方法就是使用它(他声称它适用于Mono和VS;我可以确认它适用于VS2005的完整版本以及使用C#和VC++的单独Express 2008版本)。您需要下载(都在同一个zip中),并且需要使用VC++和C从源代码构建C#绑定

使用Audiere的一个很好的好处是调用是无阻塞的。您不必等待
tone1a
停止播放,然后再开始播放
tone1b
,这显然是播放复杂音调的必要条件。我不知道您可以使用多少并发输出流有任何严格的上限,所以它可能是您的硬件/操作系统支持的。顺便说一句,Audiere还可以播放某些音频文件(MP3、WAV、AIFF、MOD、S3M、XM,它本身;Ogg Vorbis、Flac、Speex以及外部库),而不仅仅是纯音

一个可能的缺点是,当你开始或停止一个单独的音调时,会听到轻微的“咔嗒”声;如果在已播放的音调中添加一个音调,则不明显。我找到的最简单的解决方法是,分别在打开或关闭音调时,缓慢地将音调的音量调高或调低。您可能需要调整坡道速度,使其听起来“恰到好处”

请注意,Audiere是LGPL许可的,绑定没有附带许可证。如果你想在商业产品中使用Harald的约束力,你必须咨询你的法律团队或设法联系他;或者你可以自己装订,避免麻烦


@汤姆:因为哈拉尔德的图书馆没有附带任何特定的许可证,我不确定托管它会带来什么影响;然而,我相信我至少可以给你们提供关于我的libaudieresharpglue项目是如何建立的详细信息

< P>使用Visual C++ Express 2008,打开代码>绑定/cSpAc/LaboEdieReSpReps/VC80/LIbOdieReSePrpCase.SLN ./COD> VC++将自动将该解决方案转换为VS9解决方案。 在另一个文件夹中,您应该有来自Sourceforge的Audiere包。在VC++项目属性下,转到配置属性>C/C++>常规,并确保“附加包含目录”中有
路径/to/audiere-1.9.4-win32/include
。然后,在同一窗口中,转到链接器>常规,并确保您的“附加包含目录”中有
/path/to/audiere-1.9.4-win32/lib
“附加库目录。”然后,您应该能够在
vc8.0/Release
文件夹中构建项目(最好是在发布模式下)和该输出
libaudieresharpglue.dll

接下来,打开Visual C#Express 2008。打开
bindings\csharp\test\vc8.0\audierrecsharptest.sln
,让它转换解决方案。项目应该可以生成,但运行时会出现错误。这很好;在
csharp/test/vc8.0/bin/Release
文件夹中,您需要从t添加libaudierresharpgluse.dll他从Sourceforge的包中获得了VC++解决方案和audiere.dll

现在,您应该能够构建并运行AudiereCSharpTest。请注意,默认情况下,
#define stream_test
不会在AudiereTest.cs顶部注释掉,这将引用一个不在硬盘上的文件。您只需注释掉
#define
并取消注释
noise_test
square_test


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

从我在那里看到的,这也只能一次生成单音。请参考,使用电脑扬声器(用于嘟嘟声)这通常不是一个好的做法。你应该使用默认音频输出。我实际上更喜欢使用默认音频输出。最终它将需要通过耳机。这是一个重要的一点。忘记Beep。你想使用DirectSound或WaveOut。两者都是非托管API,因此你必须使用PInvoke或切换到C++/CLI作为你的API语言。我不熟悉C#-可以使用线程对同步调用进行分层吗?您可以使用新线程调用Console.Beep,但您仍然无法一次播放多个声音。您是否有专门指向使用DirectSound生成复杂音调的链接?简言之,您将编写大量sin()的结果调用wave缓冲区,然后让它播放该缓冲区。这是迄今为止最有希望的,但我无法同时运行多个频率。文档中提到,您是否尝试使用多线程,支持windows混合设备。这是一个漂亮的库,如果NAudio不工作,可能需要仔细查看对我来说不是。我在编译“liba”时遇到了很大的问题
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();