Processingでサウンドエフェクト処理をはじめよう

第4回 トーンコントロール [その2]

前回のトーンコントロールの続きです。

② ToneControlタブのソース

まず、ToneControlタブのソースの説明をします。
Processingのサウンド用のライブラリ minim でエフェクト処理を実装するには、AudioEffect interface を利用します。
AudioEffect interface の説明は、BassToneタブのソースの説明の時にしますが、この interface を使うには、

import ddf.minim.effects.*;

と言う宣言をしなければなりません。
「minimライブラリのeffectsに関するライブラリを使うよ」と言う宣言です。

DownGain down;
BassTone bass;
HiTone hi;

ここで、DownGainタブ、BassToneタブ、HiToneタブで記述したクラスのオブジェクト変数を宣言しています。
この段階では「down, bass, hiと言う変数を使うよ」と言っているだけで、まだ、オブジェクトそのものは生成されていません。
setup()メソッドの中の

down = new DownGain(DGAIN);
bass = new BassTone(FS, LF, LGAIN);
hi = new HiTone(FS, HF, HGAIN);

で、オブジェクトを生成しており、この後から、down, bass, hiオブジェクトが使える様になります。
DownGain() には DGAIN を渡していますね。DGAIN は音量を調節するパラメータです。(音量を半分にしたい場合は、0.5を渡します)
BaseTone() には FS, LF, LGAIN を渡しています。 FS のサンプリング周波数で、LF周波数以下の低音をLGAINの量で調整します。HiTone() も同様です。

player.addEffect(down);
player.addEffect(bass);
player.addEffect(hi);

で、AudioPlayer player オブジェクトにエフェクト処理を追加しています。
addEffect() でエフェクト処理を追加すると、player.plye()メソッドでサウンドファイルを再生している時に、 自動で追加したエフェクト処理を呼び出してくれます。
便利ですね。
draw()メソッドの中は、このプログラムを実行して見ると分かると思うのですが、再生中のサウンドデータの波形をウィンドウに描画する処理になっています。

background(0);

で、ウィンドウの中身を黒に塗りつぶします。
渡す値(引数と言います)を一つだけにすると、グレイスケールの色を指定していることになります。0が黒で、255が白です。その中間の値はグレーの濃さになります。

stroke(255);

で、波形を描く線の色を指定します。255なので白です。
for文の中身は、以下の様になっています。

for(int i = 0; i < player.left.size()-1; i++)
{
  line(i, 50 + player.left.get(i)*50, i+1, 50 + player.left.get(i+1)*50);
  line(i, 150 + player.right.get(i)*50, i+1, 150 + player.right.get(i+1)*50);
}

playerleftright にLチャンネルとRチャンネルのデータが入っていると思ってください。
left.size() で、Lチャンネル内のデータの数が分かります。iを0からLチャンネルのサイズ分まで増やしながら繰り返します。

line(i, 50 + player.left.get(i)*50, i+1, 50 + player.left.get(i+1)*50);

line() は、line( x1, y1, x2, y2 ) で、座標(x1,y1)から(x2, y2)に線を引きます。
横方向は、x1 = i、x2 = i+1 で、サンプルデータの今と次の順番になります。(時系列ですね)
縦方向は、left.get() で、iとi+1のデータの値を取り出しています。 今と次のデータの大きさですね。 この値に50を足しているのは、画面上方向から50ピクセル分をLチャンネルの値が0の時の中心にするためです。 データの値は1以下の値なので、50を掛けることで、+50~-50の間に値が収まります。
これを一つずつiを増やしながら線を描くので、波形が描けます。
Rチャンネルも同様です。
ところで、一度に全部の波形を描いたら、プログラムを実行したときの様に、波形が動いて見えませんよね。
実は、left.size は、

player = minim.loadFile("sample.wav", 1024);

の時に指定した、1024になります。
ファイルから1024ずつデータを繰り返し読み込んでいます。
1024分再生したら、次の1024分を使って再生します。
これをストリーミングと言います。
なので、1024分の波形を描いた後に、次の1024分描くので、いつも波形が動いている様に見えるわけです。
(細かいことを言うと、ウィンドウのサイズは、横方向200なので全部の波形が描かれていないのですが)

以上が、ToneControlタブのソースの説明です。
まだまだ先がありますが、それは次回で説明します。(いつも途中で終わってすみません)

「Processingでサウンドエフェクト処理をはじめよう」一覧に戻る