我正在尝试查找有关如何生成声音的文档,教程和示例。我的意思是不使用会隐藏所有有趣内容的库。
我对声音感兴趣,我想开始用它做点什么,但我不知道从哪里开始。
如果我错了,请纠正我,但生成声音的最低级别是其中之一(DirectSound ,CoreAudio,ALSA,OSS)取决于操作系统。所以我必须选择一个操作系统并学习合适的音响系统?
这真的值得,或者我应该学习一个包含以上所有内容并提供跨平台兼容性的库?
也许这个问题不是很清楚,我很抱歉,但事实证明我甚至都不知道自己想要什么。我只是想为我的论文找到一些有趣的东西。
答案 0 :(得分:9)
这是一个让你入门的例子。
// 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声称是跨平台的。感兴趣的主要特征是您可以创建(或使用现有的)插件来构建音频过滤器管道。
答案 1 :(得分:5)
在某些Unix(ish)系统上,你可以just write audio data to /dev/audio
(or /dev/dsp
)并且它会播放。在使用ALSA的现代Linux系统上,您可能需要将其管道传输到aplay
。但在任何一种情况下,您都不需要使用任何特定的声音库 - 只需打开输出流并写入即可。这就是所有bytebeat个单行所做的事情。
答案 2 :(得分:2)
您需要与音频硬件进行通信,但您可以直接进行的时间很长......
我可以建议OpenAL吗?
答案 3 :(得分:2)
所有其他答案只是建议一些抽象或库。总是有可能直接退回到硬件上。 (这是一个好主意是一个完全不同的问题,完全取决于你决定)
我可以建议查看音频驱动程序代码吗? Emu10k1驱动程序只是linux源代码中的一个示例。
另外值得一看的是:“Creating a Kernel Driver for the PC-Speaker”
我还记得在Amiga上的日子,一些有趣的家伙创建了一个程序(ab-)使用了Floppy drive stepper motor as an audio output。