代码之家  ›  专栏  ›  技术社区  ›  Tom Wright

是否可以用C_生成复杂的音调?

  •  8
  • Tom Wright  · 技术社区  · 15 年前

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

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

    6 回复  |  直到 15 年前
        1
  •  19
  •   Mark Rushakoff    15 年前

    这个 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上工作 我可以确认它在VS2005的完整版本和使用C和VC++的单独Express 2008版本中都有效。您需要下载 Win32 Audiere DLL, lib, and header (都在同一个压缩包中)您需要使用VC++和C_从源代码构建C_绑定。

    使用Audiere的一个好处是,通话不阻塞。你不必等待 tone1a 在开始之前停止播放 tone1b 这显然是播放复杂音调的必要条件。我不知道您可以使用多少同时输出流有任何硬上限,所以它可能是您的硬件/OS支持的任何一种。另外,Audiere还可以播放某些音频文件(MP3、wav、aiff、mod、s3m、xm、it本身;Ogg Vorbis、flac、带外部库的speex),而不仅仅是纯生成的音调。

    一个可能的缺点是,当您开始或停止一个单独的音调时,会有一个轻微的“咔哒”声;如果您在已经播放的音调中添加一个音调,则不明显。我找到的最简单的解决方法是,当你分别打开或关闭音调时,缓慢地增大或减小音调的音量。你可能需要利用斜坡的速度让它听起来“恰到好处”。

    请注意,Audiere是LGPL许可的,绑定没有附加许可证。如果你想在商业产品中使用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>常规并确保 /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。注意,默认情况下, #define stream_test 不会在audieretest.cs顶部注释掉,这将引用一个不在硬盘上的文件。你可以简单地评论一下 #define 不加评论 noise_test square_test .

    如果我遗漏了任何细节,希望它们足够小,可以自己解决:)

        2
  •  4
  •   FLamparski    15 年前

    您可以尝试DirectSound…

        3
  •  3
  •   Richard Slater    15 年前

    我一直在看 NAudio 以创建一个程序,在播放备份曲目的同时模拟反馈。有一篇关于生成的博客文章 sine waves at specific frequencies 我怀疑这可以适应你所寻找的。

        4
  •  0
  •   Binoj Antony    15 年前

    是的,这是可能的。

    Here is a link 关于这个的教程。当然,这也会用到 Console.Beep

        5
  •  0
  •   Drew Hall    15 年前

    如果console.beep是异步的或者不是异步的,那么msdn文档并没有明确说明。如果是的话,你可以根据需要快速连续地拨打任意多个电话,没有人会更聪明。当然,您希望使用需要频率和持续时间的版本。

        6
  •  0
  •   CannibalSmith    15 年前

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

    推荐文章