C++ 在没有库的情况下生成声音?

C++ 在没有库的情况下生成声音?,c++,c,audio,C++,C,Audio,我试图找到有关如何生成声音的文档、教程和示例。我的意思是不用一个藏有所有有趣东西的图书馆 我对声音很感兴趣,我想开始用它做点什么,但我不知道从哪里开始 如果我错了,请纠正我,但生成声音的最低级别是以下级别之一(DirectSound ,CoreAudio,ALSA,OSS),具体取决于操作系统。所以我必须选择一个操作系统,学习合适的音响系统 这真的值得吗?或者我应该学习一个包含以上所有内容并提供跨平台兼容性的库 也许这个问题不是很清楚,对此我很抱歉,但事实证明我甚至不知道我想要什么。我只是想为我

我试图找到有关如何生成声音的文档、教程和示例。我的意思是不用一个藏有所有有趣东西的图书馆

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

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

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


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

在一些Unix(ish)系统上,你可以而且它会播放。在使用ALSA的现代Linux系统上,您可能需要使用管道将其传输到。不过,在这两种情况下,您都不需要使用任何特定的声音库—只需打开一个输出流并写入即可。这就是所有这些一行程序的工作方式。

您需要与音频硬件进行通信,但您可以直接进行通信的时间已经很长了


我可以建议你吗?

这里有一个例子让你开始学习

// 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;
      }

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

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

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

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

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

同样值得一看的是:


我还记得在Amiga的那些日子里,有一个有趣的家伙创造了一个(ab-)使用的程序。

这并不能直接回答你的问题,只不过这是一个有趣的因素,关于一个音乐家用一台不是用来发声的电脑发声:@Alex Reynolds,这很鼓舞人心。如果你只想要“a”的声音,只需做
cout@Mysticial:我认为这更像是一个A,不是吗?@KerrekSB BIOS的嘟嘟声是一个A?我认为这取决于实现?+1。这里对bytebeaters进行了很好的概述:我的示例使用8位单声道,但可以很容易地修改为使用其他格式(例如16位立体声)。这正是我所需要的。谢谢。播放CD:
find/run/user/${user}/gvfs/cdd*-iname“*.wav”-print0 | xargs-0aplay