Wave音声の再生音に合わせて振幅バーを表示するプログラム。WaveCreateでは1pxに入る範囲の音声データ振幅の最小値と最大値を1本の線で表したが、 WaveLevelでは40msecの範囲の音声データ振幅の最小値と最大値バーを画像(BMP)で表示する。 これを再生と同時に繰り返す。 と言うことだ。 ※ 間隔を40msecとしたのは、実際に動かして丁度よさそうな感じだったのでこの値にしたのだ。 それでは具体的に、。 上記音声再生中の画像キャプチャーをご覧あれ。 薄い緑と濃い緑が有るが、薄いほうが最小値で、濃いほうが最大値だ。 最大値だけでも良かったが、見た目に物足りなさを感じたので両方を表現したのだ。 そして、用意したのが下のBMP画像だ。 @ A まず、表示するウインドのサイズを決めよう。 32bitのサンプリングは-2147483648〜2147483647の範囲で振幅値が表現されている。 そこで、正のデータ(最大値2147483647)の振幅値を表示するにあたり、2の22乗に縮小する計算をした。 2147483647÷2の22乗=511.9999997615814208984375こうすれば、振幅値の2147483647を約512pxの画面を用意すれば図に表現できる。 ちなみに16bitの場合は、2の6乗の縮小にすれば、 32767÷2の6乗=511.984375となるので、32bitのサンプリングと同じ512pxの図に表現できる。 では、画像は、 全体幅が2000px(ちと大きいが)で、中心の1000px部分を境に音声色部分と無音色部分(ウインドの色)画像を用意する。 中心が無音(32bitの場合-192dBの位置)で、これを音に合わせて右へずらすことで振幅レベルを表現する。 最小値と最大値の表示は、 先に画像@を無音の中心から最小値までマイナスした位置から右側全てを表示し、 次に画像Aを最小値の位置から右側全てを表示する。 (ちょっと説明しずらいなー、。まぁソースコードを見てくんな。) 再生に合わせての振幅バー表示について。 再生位置をwaveOutGetPositionで取り出して、そこから40msecの範囲の最大値、最小値を求めバーを表示する。 但し、取り出したリアルタイムの位置で最小・大値を求めると、表示した時に再生音と画像にズレが生じるので、 40msec分進めた位置で値を求めることとした。 そしてこれを繰り返すと、再生の音に合わせた振幅バーの表示ができるのだ。 |
|
この考えでプログラムにすると、こんな感じWaveLevel.cppになる。 これはそのリソースresource.hとresource.rcだ。 そして画像はlevelH.bmpとlevelL.bmpとなる。
|