【问题标题】:Generating sounds without a library? [closed]在没有库的情况下生成声音? [关闭]
【发布时间】:2012-02-26 13:57:03
【问题描述】:

我正在尝试查找有关如何生成声音的文档、教程和示例。我的意思是不使用会隐藏所有有趣内容的库。

我对声音很感兴趣,我想开始用它做点什么,但我不知道从哪里开始。

如果我错了,请纠正我,但产生声音的最低级别是其中之一(DirectSound ,CoreAudio,ALSA,OSS) 取决于操作系统。所以我必须选择一个操作系统并学习合适的声音系统?

这真的值得吗,还是我应该学习一个包含以上所有内容并提供跨平台兼容性的库?

也许这个问题不是很清楚,对此我很抱歉,但事实证明我什至不知道我想要什么。我只是想为我的论文找到一些有趣的东西。

【问题讨论】:

  • 这并没有直接回答你的问题,只是它是一个有趣的事实,关于一个音乐家用一台不是用来发声的电脑发声:en.wikipedia.org/wiki/Aphex_Twin#ZX81_competition
  • @AlexReynolds 太鼓舞人心了。
  • 如果你只想要“a”的声音,就做cout << (char)7; :)
  • @Mysticial:我认为这更像是一个 A#,不是?
  • @KerrekSB BIOS 哔声是 A#?我认为这取决于实现?

标签: c++ c audio


【解决方案1】:

在某些 Unix(ish) 系统上,您可以 just write audio data to /dev/audio (or /dev/dsp) 并且它会播放。在使用 ALSA 的现代 Linux 系统上,您可能需要将其通过管道传递给 aplay。不过,无论哪种情况,您都不需要使用任何特定的声音库——只需打开一个输出流并写入即可。这就是所有bytebeat 单行者的做法。

【讨论】:

【解决方案2】:

您需要与音频硬件进行通信,但是您可以直接进行的时代已经过去了......

我可以建议OpenAL吗?

【讨论】:

    【解决方案3】:

    这是一个让您入门的示例。

    // filename "wf.cpp" (simple wave-form generator)
    
       #include <iostream>
       #include <cmath>
       #include <stdint.h>
    
    int main()
       {
    
       const double R=8000; // sample rate (samples per second)
       const double C=261.625565; // frequency of middle-C (hertz)
       const double F=R/256; // bytebeat frequency of 1*t due to 8-bit truncation (hertz)
       const double V=127; // a volume constant
    
       for ( int t=0; ; t++ )
          {
          uint8_t temp = (sin(t*2*M_PI/R*C)+1)*V; // pure middle C sine wave
       // uint8_t temp = t/F*C; // middle C saw wave (bytebeat style)
       // uint8_t temp = (t*5&t>>7)|(t*3&t>>10); // viznut bytebeat composition
          std::cout<<temp;
          }
    
       }
    

    通过ALSA接口在Linux上编译运行:

    make wf && ./wf |aplay
    

    通过GStreamer接口在Linux上编译运行:

    make wf && ./wf |gst-launch-0.10 -v filesrc location=/dev/stdin ! 'audio/x-raw-int,rate=8000,channels=1,depth=8' ! autoaudiosink
    

    GStreamer 声称是跨平台的。它的主要功能是您可以创建(或使用现有的)插件来构建音频过滤器管道。

    【讨论】:

    • 我的示例使用 8 位单声道,但可以轻松修改为使用其他格式(例如 16 位立体声)。
    • 这正是我所需要的。谢谢。
    • 播放 CD:find /run/user/${USER}/gvfs/cdd* -iname "*.wav" -print0 |xargs -0 aplay
    • 那个 gstreamer 示例在 2021 年对我不起作用,这里是为 gstreamer 1.0 翻译的:gst-launch-1.0 -v filesrc location=/dev/stdin ! 'audio/x-raw,format=U8,rate=8000,channels=1,depth=8' ! alsasink
    【解决方案4】:

    所有其他答案只是建议一些抽象或库。总是有可能直接依靠硬件。 (这是否是一个好主意是一个完全不同的问题,完全由您决定)

    我可以建议查看音频驱动程序代码吗? Emu10k1 驱动程序只是 linux 源代码中的一个示例。

    另外值得一看的是:“Creating a Kernel Driver for the PC-Speaker

    我还记得在 Amiga 上的日子,某个有趣的家伙创建了一个程序,该程序 (ab-) 使用了 Floppy drive stepper motor as an audio output

    【讨论】:

      猜你喜欢
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 2021-11-22
      • 1970-01-01
      相关资源
      最近更新 更多