openFrameworks 基本動作 音楽編

今月末のiPhoneの勉強会に備えて、昨年7月以来、久々にopenFrameworksをやろうと本を引っぱり出してきました。 第二回目です。

Beyond Interaction ―メディアアートのための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); 再生中の音のボリュームを取得