入力振幅に応じて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をクリア }
⇒次はストレンジ・アトラクター