ads by Amazon

2013年4月10日水曜日

7. 440Hz(A)の矩形波を鳴らし続けてみる

それでは、「4. 無音を鳴らし続ける処理の実装(Windows編)」で示したtest03.cpp(無音を鳴らし続けるプログラム)を少し改造して、440HzのA(ラ)を鳴らし続けるプログラムを作成してみたいと思います。なお、他所の解説サイトでは、サイン波を例に示している所が多いみたいですが、「サイン波よりも矩形波の方がコンピュータ向き」ということを体感して頂く為、ここでは矩形波を例に説明します。

(1)処理の考え方
test03.cppの場合、1秒の長さは22050Hzです。
つまり、出力する波形の周期は、22050Hz÷440Hzということで、だいたい50Hzのインターバルで発音してあげれば良いという計算になります。正確には50.11363636363636ですが、先ずは、そこまで厳密に考慮せず、ゆとり式に「だいたい50Hz」ということで処理を実装することにします。どうせテスト目的のものですし。なお、50Hzの矩形波(交流波)を出力するには、25Hzで「正」と「負」を交互に書き込みます。

(2)矩形波バッファリングの実装
それでは、サウンドスレッド(sndmain)に対して、だいたい440Hzの矩形波をバッファリングする処理を実装していきたいと思います。

先ずは、矩形波の算出をするための変数を宣言します。

■変数宣言の追加
    /* 矩形波バッファリング用の変数*/
    int i;
    int hz=0;
    short val=4096;

そして、memsetでバッファを0クリアしていた部分に以下の赤字のような形に変更します。

■バッファリング処理の実装
    /* 要求待ちループ */
    while(1) {
        /* READY状態の間、バッファの音を鳴らし続ける */
        while(SND_READY==_SndCTRL) {
            /* バッファを440Hzの矩形波で埋める */
            for(i=0;i<SAMPLE_BUFS/2;i++) {
                ((short*)buf)[i]=val;
                hz++;
                if(25==hz) {
                    hz=0;
                    val=-val;
                }
            }

これで、50Hz周期で、振幅4096(÷32768)の矩形波がバッファリングされるようになりました。このプログラム(test04.cpp)をコンパイルして実行すれば、だいたい440HzのAっぽい音が鳴り続けます。

0 件のコメント:

コメントを投稿