タケノコ畑の置手紙

ちょっとしたプログラムのこととかをにわかなりに書いてみるブログ

OpenALとC

記念すべき第一回はCでOpenALを扱うお話です。

注)基本的にWindows主体で進めていきます。Mac持ってないんです・・・

 

まずOpenALとは!

OpenAL (Open Audio Library)はクロスプラットフォームのオーディオAPIであるフリーソフト。 マルチチャンネル3次元定位オーディオを効率よく表現するように設計された。 APIのスタイルと慣習は意図的にOpenGLと似せてある。by Wikipedia

ようするにいろんなデバイスで音を鳴らせるようにするライブラリのことですね。

 

これを使ってCで音を鳴らすプログラムを作っていきたいと思います。

 まず用意するものを以下に書いときます

・PC

Visual Studioとかプログラム書くやつとコンパイラ

OpenALSDK

 

ただIncludeしてプログラムを書くだけなのでそんなに大変ではないと思います。

持ってない方はこちらからDLしてくださいね。

おすすめはCommunity

ダウンロード | IDE、Code、Team Foundation Server | Visual Studio

上のSDKをDL

OpenAL: Cross Platform 3D Audio

 

インストールが終わるとデフォルトだとC:\Program Files (x86)\OpenAL 1.1 SDKに入っているので、場所を忘れずにメモっておきましょう。

では早速プログラムをVisual Studioで書いていきます。

ファイル>新規作成>プロジェクトからVisual C++の空のプロジェクトを選びます。

f:id:TaKeNoKo46:20180524203306p:plain作成したらプロジェクト>新しい項目の追加(Ctrl+Shift+A)でメインのcppを作ります。とりあえず以下のプログラムを貼り付けてみてください。

 

 

#define SAMPLINGRATE 44100
//ここでπを宣言
#define _USE_MATH_DEFINES

#include <al.h>
#include <alc.h>
#include <math.h>
#include <stdlib.h>

#pragma comment(lib, "OpenAL32.lib")

int main(void) {
	//OpenALの下準備 おまじない的な
	ALCdevice *device = alcOpenDevice(NULL);
	ALCcontext *context = alcCreateContext(device, NULL);
	alcMakeContextCurrent(context);
	
	//バッファ(保存領域)とソース(音源)を宣言
	ALuint buffer;
	ALuint source;
	//それを生成
	alGenBuffers(1, &buffer);
	alGenSources(1, &source);

	//new演算子で音源を入れる配列を動的確保
	signed short* wav_data = new signed short[SAMPLINGRATE];
	//ここで440Hzのsin波を1秒間分生成
	for (int i = 0; i < SAMPLINGRATE; i++) {
		wav_data[i] = 32767 * sin(2 * M_PI*i * 440 / SAMPLINGRATE);
	}
	//バッファに音源データを入れる
	alBufferData(buffer, AL_FORMAT_MONO16, &wav_data[0], SAMPLINGRATE * sizeof(signed short), SAMPLINGRATE);
	//ソースにバッファを適用
	alSourcei(source, AL_BUFFER, buffer);
	//ループ再生をON
	alSourcei(source, AL_LOOPING, AL_TRUE);
	//ソースを再生!
	alSourcePlay(source);

	//ここで一時停止
	system("PAUSE");

	//動的確保したメモリを破棄
	delete[] wav_data;
	// バッファの破棄
	alDeleteBuffers(1, &buffer);
	// ソースの破棄
	alDeleteSources(1, &source);
	
	//OpenALの後始末
	alcMakeContextCurrent(nullptr);
	alcDestroyContext(context);
	alcCloseDevice(device);
	return 0;
}

・・・まぁインクルード先が指定されないままコード書いてもね・・・

ってことでインクルードとライブラリのディレクトリを指定させちゃいましょう。

 詳しいソースコードの解説はこちらをどうぞ。

hatakenoko.hateblo.jp

 

プロジェクト>(名前)のプロパティから

VC++ディレクトリ>インクルードディレクトリを変更します。

f:id:TaKeNoKo46:20180524212359p:plain

デフォルトならC:\Program Files (x86)\OpenAL 1.1 SDK\includeでOKです。

ライブラリならすぐ下にあるので、同様に設定します。

C:\Program Files (x86)\OpenAL 1.1 SDK\libs\Win64←もしくは32

 

 ついでなんで構成も変えましょう。

f:id:TaKeNoKo46:20180524212927p:plain

黄色で囲った部分をWindowsのbit数で変えます。

64bitならx64、32bitならx86にしてください。

紛らわしいので十分注意してください。

 

ここまでやったらF5でコンパイル&実行します。

真っ黒いコンソール画面とともに美しいsin波の音が聴こえてきましたか?

私がOpenALをやってみるうえでこちらを参考にしました。

とても分かりやすいのでもっといろんなことをやってみたい方はどうぞ。

チュートリアル形式で始めるOpenAL

チュートリアル形式で始めるOpenAL

 

 

今回はただ音を鳴らすだけだったのでこんな感じで終わりますが、OpenALにはもっとたくさんの機能があります。

これからはぼちぼち更新していく予定なのでよかったらお付き合いください。

あと詳しいソースコードの解説とか音についてとかを書いてみる予定です。

それではまた次回の置手紙でお会いしましょう・・・