((color red 以下の項目は書きかけです!)) !!! OpenAL (Open Audio Library) * クロスプラットフォームのオーディオAPI * マルチチャンネル3次元定位オーディオを効率よく表現するように設計されている * APIのスタイルと慣習は意図的にOpenGLと似せてある * [本家@|http://kcat.strangesoft.net/openal.html] !!! Hello, Worldを喋らせる 8< #include int main(int argc, char** argv){ ALuint buffer, source; // 初期化 alutInit(&argc,argv); // 有効なバッファとソース番号を取得 alGenBuffers( 1, &buffer ); alGenSources( 1, &source ); // 提供されている"hello world"の音声バッファを作成 buffer = alutCreateBufferHelloWorld (); // ソースとバッファを結び付ける alSourcei( source, AL_BUFFER, buffer ); // 再生 alSourcePlay( source ); // 1秒待って,終了処理 alutSleep (1); alutExit(); return 0; } >8 コンパイル,実行 8< $ gcc -o testal testal.c -lopenal -lalut $ ./testal >8 !!! wavファイルを鳴らす 先のサンプルで,バッファに読み込む部分でwavファイルを指定すればOK. 例えば,se.wavを鳴らしたければ 6< 8< buffer = alutCreateBufferFromFile( "se.wav" ); >8 >9 と変更するだけです. !!! sin波の作成と再生 sin波を作って再生するサンプル. 8< #include #include int main(int argc, char** argv) { ALuint buffer, source; alutInit(&argc,argv); alGenBuffers( 1, &buffer ); alGenSources( 1, &source ); // サンプリング周波数と音階の設定 const int freq = 10000 , Hz = 440; // sin波データ作成 ALshort data[freq/Hz]; for (int i = 0; i < freq/Hz ; ++i) { data[i] = 32767 * sin(i * 3.14159 * 2 * Hz / freq); } // バッファに音データを渡す alBufferData( buffer, AL_FORMAT_MONO16, data, freq/Hz*sizeof(ALshort), freq ); alSourcei( source, AL_BUFFER, buffer ); alSourcei( source, AL_LOOPING, AL_TRUE ); alSourcePlay( source ); alutSleep (1); alutExit(); return 0; } >8 6< * 上記プログラムをコンパイルするには,-std=c99 オプションが必要です. * const int freq = 10000 , Hz = 440;で,サンプリング周波数を10000Hz,音階を440Hz(「ラ」)としています. ** もちろん,音階の数値を変えれば音が変わります. * for文でデータを作っています. * alBufferData( buffer, AL_FORMAT_MONO16, data, freq/Hz*sizeof(ALshort), freq ); ** 第2引数のAL_FORMAT_MONO16は,モノラル16bit-PCM音源であることを示しています. ** 第4引数は渡すデータの長さ(byte単位),第5引数はサンプリング周波数です. * このプログラムでは1波長分しか音データを作成していないので,alSourcei( source, AL_LOOPING, AL_TRUE );を呼んで,ループ再生をオンにしています. ** alutSleep()の時間を長くすれば,その分,鳴り続けます. >9 ちなみに, * AL_FORMAT_MONO8は,8bit-PCM音源,0~255の値 * AL_FORMAT_STEREO8は,ステレオの8bit-PCM音源 * AL_FORMAT_STEREO16は,ステレオ16bit-PCM音源,データは左右左右・・・と交互に並べます !!! BGMとして流したい 音専用のスレッドを作成するのがいいかもしれません. * [[GLib::スレッド]] * [[マルチスレッド]] ---- !!! 設定 端末で使うためには, * libopenal-dev * libalut-dev のインストールが必要.