(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 件のコメント:
コメントを投稿