入力振幅に応じてLEDを光らせるプログラムです。受信バッファからピーク値を抜き出して、それに応じてLEDを光らせます。音の大きさに応じてLEDが左右に動きます。
LEDの制御はPF出力を使おうを参考にしてください。
十分な数のLEDがあればピーク値を対数変換することでダイナミックな動きを楽しめます。しかし、今回はLEDが4つしかないため、ごく狭い範囲の音の大きさにだけ反応します。反応する音のレンジを変えるときには下のプログラムの「上位3ビットのみ抽出」の部分を変えるといいでしょう。
このプログラムもダウンロードできます。ボリューム制御プログラムを元にしているので、プッシュスイッチによる音量調節機能もついています。
void CTT_Volume::handleBuffer( struct mcm::sample * bufTx, struct mcm::sample * bufRx )
{
short lev=0;
for ( int i=0; i< this->bufSize; i++ ){ // bufSizeは送受信バッファの長さ
bufTx[i].l = bufRx[i].l; // Lch受信データを送信バッファにコピー
bufTx[i].r = bufRx[i].r; // Rch受信データを送信バッファにコピー
if ( lev < abs(bufRx[i].l ) ) // 絶対値がlevより大きければlevにコピー
lev = abs(bufRx[i].l );
if ( lev < abs(bufRx[i].r ) )
lev = abs(bufRx[i].r );
}
lev >>= 12; // 上位3ビットのみ抽出
lev = 1 << lev; // ピーク値をビット位置に変更
// LED設定
sysreg_write( sysreg_IOPG, General_Purpose_IO );
io_space_write( FLAGS, 0xf & lev ); // LEDの値に値をセット
io_space_write( FLAGC, 0xf & ~lev ); // 0の部分のLEDをクリア
}
⇒次はストレンジ・アトラクター