芸軌社株式会社
RSS 2.0

芸軌社公式ブログ

2012年5月28日(月)20:16(+0900)

C言語で音を出してみた

このエントリーをはてなブックマークに追加

OpenALを使って、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

みたいな感じでできます。

その他OpenALの各関数の詳細等については、google先生等にお尋ねください(汗)