筆者が子供のころは「ラジオの製作」とか「初歩のラジオ」といった雑誌をむさぼり読むのが電子工作への第一歩でした。そういった雑誌に時々紹介されていた懐かしい回路の一つにカラオケ・マシンがあります。無論、どこぞから楽曲をダウンロードするような回路であるはずがありません。ステレオ信号化された音楽の多くは、ボーカルがセンターに配置されています。そのため、左チャンネルと右チャンネルの差分をとるとボーカルが見事に消えるという回路でした。当時はこれをオペアンプで組むのがかっこいいやりかたでした。延々と「オペアンプは±の電源を同時に入れないと一発で壊れる」などという注意が書いてあったものです。ICがダメージに弱かった時代です。
MCMを使って同じ処理をしてみましょう。やることが単純ですので、プログラムも単純です。以下にhandleBufferメンバー関数を示します。
void CKaraoke::handleBuffer( struct mcm::sample * bufTx, struct mcm::sample * bufRx ) { for ( int i=0; i< this->bufSize; i++ ){ // LchとRchの差分 bufTx[i].l = bufTx[i].r = bufRx[i].l - bufRx[i].r; } }
クラス名が変わったことを除けば、forループのなかで行う処理がコピーから両チャンネルの差分に変わったことが唯一の変更点です。新しいプロジェクトを起こすのがばかばかしいほどの変更の小ささです。
実際に走らせて見るとやはりボーカルが完全に消えるということはありません。とくにエコーが効いていたりすると高音のリークが大きくなります。また、肝心の楽器の音のバランスが崩れるのもご愛嬌といったところです。
⇒次はボリューム制御