今月末のiPhoneの勉強会に備えて、昨年7月以来、久々にopenFrameworksをやろうと本を引っぱり出してきました。 第二回目です。
波形を生成する
ここでは本の例題にそって、気づいたことを記載していきます。
P151から出てくる最初の例「音響合成」で出てくるコードの中で新しく関数が出てきます。
audioRequest() ofSoundStreamSetup()
audioRequest()
まず、audioRequested()は、draw() やupdate()などと同じさまざまなイベント実行関数が含まれているクラスを"ofSimpleApp"に属しています。 設定したチャンネル数で、指定したサイズの波形をサウンドとして出力するための機能です。
ofSoundStreamSetup()
サウンド出力の設定を行います。 出力のチャンネル数、入力のチャンネル数、ofSimpleAppへのポインタを指定します。
チャンネルはよくわからないが、ステレオが2ch。 ヤマハの電化製品で5.1chなどある。音が2つの方向から聞こえるのが2chだと思います。
まずは、ofSetColor()で色を設定するように、ofSoundStreameSetup()でサウンドを設定します。
具体的なaudioRequest()の中身
[cpp] void testApp::audioRequested(float* output,int bufferSize , int nChannels){
float sample;
float phaseDiff;
//サンプリング辺りの位相の変化数を計算
phaseDiff = TWO_PI * frequency/sampleRate;
//バファサイズ分の波形を作成する for (int i =0; i < bufferSize; i++) {
// 位相を更新 phase += phaseDiff;
//位相がTWO_PIを超えるまで while (phase > TWO_PI) {
phase -= TWO_PI;
}
//SIN波を形成 sample = sin(phase);
output[i * nChannels] = sample * pan * amp;
output[i * nChannels + 1] = sample * pan * amp;
}
[/cpp]
TWO_PI
TWO_PIは6.28318530717958647693の値をもつ数学的な定数である。直径における円の円周率である。三角関数sin() とcos()と組み合わせると便利である。とProcessingのサイトに載ってました。円周率の2倍っぽいです。
サンプリング 音の波形を一定の時間で区切り、その区切った時間ごとに、波形の一を計算し数値の集合に変換します。 サンプリングを一秒間に何回行うかの単位を、サンプリング周波と言います。
今回の例では、サンプリング周波(sampleRate)で44100と指定されています。
定位 音の距離?
位相 時間みたいです?
周波数 一秒間に何回周期(一周期は波一回)があるか。周波数が高いと、音が高くなる。
バッファとは一時記録の領域です、バッファサイズはそのサイズ。終わると自動的に消去される。
音声を入力する
先ほどは、新しく音声を出力していましたが、今度は既にある音を波形に変換します。
[cpp]
float * left = new float[256]; float * right = new float[256];
ofSoundStreamSetup(0 , 2 , this , 44100 , bufferSize , 4);
void testApp::audioReceived(float* input , int bufferSize , int nChannels){
for (int i = 0; i<bufferSize; i++) {
left[i] = input[i*2];
right[i] = input[i*2+1];
}
}
[/cpp]
audioReceived()は音が発生したときに呼び出される関数です。 これで配列の中に、信号の配列、バッファサイズ、チャンネル数を格納します。
ファイルを呼び込んで音楽を再生する
ofSoundPlayerクラスを利用する。 まずはインスタンスを作り、その後に色々はメソッドを使い音楽をコントロールします。 [cpp] .hファイル
ofSoundPlayer mySound; // インスタンス(mySound)を作成
.cpp ファイル
void testApp :: setup(){
mySound.loadSound(" 再生する音楽ファイル名"); mySound.setLoop(true); mySound.play();
}
[/cpp]
float * ofSoundGetSpectrum(int nBands); 再生中の音のボリュームを取得