C言語で音を出してみた
C言語で音声データ(単純な正弦波とかの)を作る方法は一応簡単なのですが、そこから先、それをどうプログラム内でスピーカーに出力するかで今まで苦戦していました。googleで「ALSA C言語」とかでいろいろ検索し、サンプルコードを試してみるも、コンパイルしようとすると何故かライブラリのファイルが(それっぽいパッケージはインストールしてあるはずなのに)無いとか、どうもうまくいきませんでした。
で、いろいろ悩んでいたところ、「OpenAl」というOpenGLのオーディオ版みたいなのがあることが分かり、さっそく
のサイト様を参考に試してみたところ、ちゃんと音声を出せました。
ということで、以下に試してみたプログラムを載せます。440Hzの音を10回ポーンポーンと鳴らすプログラムです。
#include <AL/alut.h> #include <math.h> #define DMAX 45100 unsigned char dat[DMAX]; double w = 2*3.141592/44100; int main(int argc, char *argv[]) { int i; ALuint buffer, source; alutInit(&argc, argv); alGenBuffers(1, &buffer); alGenSources(1, &source); for(i=0;i<DMAX;i++) dat[i] = (sin(w*440*i)+1)*100 *((double)(DMAX-i)/DMAX); // buffer = alutCreateBufferHelloWorld(); alBufferData(buffer, AL_FORMAT_MONO8, dat, DMAX, 44100); alSourcei(source, AL_BUFFER, buffer); for(i=0;i<10;i++) { alSourcePlay(source); alutSleep(1); } }
なお、正弦波の音声データを生成する部分は
#define DMAX 45100 unsigned char dat[DMAX]; double w = 2*3.141592/44100; (中略) for(i=0;i<DMAX;i++) dat[i] = (sin(w*440*i)+1)*100 *((double)(DMAX-i)/DMAX);
になります。
私の環境(Ubuntu 12.04)の場合は、libalut-devを(Ubuntuソフトウェアセンターなりaptitudeなりapt-getなりで)インストールすればOK. コンパイルは、例えば
gcc test.c -lalut
みたいな感じでできます。