chakokuのブログ(rev4)

日々のごった煮ブログです

SharpDX + XAudio2で任意の音を出す

C#を使って音を鳴らすプログラムを作る上で、どのようなライブラリを使うべきか調べたけど、いろいろ変遷があって、一体どのライブラリを使ったらいいのか分からなかった。ひとまず過去の資産が使えそうな、SharpDXとXAudio2を使うことにして、Sin関数により正弦波を生成してバッファに入れてStreamingで再生させるプログラムを作った。
左が試作中の再生アプリ。周波数を入れるか、スライダーを動かすと指定した周波数の正弦波が再生される。

試作して音が鳴るようにはなったものの、音の切り替え時(再生周波数の変更時)にプチプチとノイズが乗る現象が発生した。幸い再現性は100%*1だったので特殊なタイミングによるものではなくて、作成した波形データ自体に問題があるのでは?と推測した。そこで、、実際の波形を見るためにWAV形式で音を録音して波形ビューア*2で、どのような波形になっているのかを確認した。すると、、やはり、音の切り替わりの時にSin波が連続せず、非連続になっていた。これが音の切り替わりの時のノイズの原因であった(左の図、周波数の変わり目で櫛状になっている部分)。

音データはsin(3.14*n)といった計算で出しているのになぜ終点が0にならないのか??とソースを見たところ、自分の実装のまずさで、sinで波形を作っているルーチンとcosで波形を作っているのが混ざっていた。これにより、波形がうまくつながらず、ノイズになっていたのであった。波形ルーチンをsinに統一した結果、プチプチ音は無くなり、一旦この試作は完了した。

というわけで、、任意の波形を繰り返して再生するプログラム(部品)はできたので、、脳波データを入力として、それを50倍ぐらいに倍速再生することで、可聴領域に周波数変換させて、脳波を実際に聞いてみようと思う。。
多分、脳波データそのままだと、60Hzとかの電源ノイズが乗っているので、ノッチフィルタを実装しないとだめだろうとは思っています。

*1:音が切り替わる時には必ずプチっと鳴る

*2:ツール名はSoundEngine