C#でWAVEファイルを作りたくなったのでメモ。
ヘッダ部分はCの構造体みたいな感じにスマートに作れるっぽいけど、とりあえず今回は1個1個ちまちま書き込んでる。
Visual Studio 2015のC#6からプロパティの初期化を行えるようになってちょっと便利になった(コンストラクタ作れって話だが)。
このプログラムはFormアプリケーションとして動作するが、起動時にデスクトップに"test.wav"というファイルを作ったらすぐに終了するようになっている。コンストラクタ内でCloseすると例外が発生するためやってはいけない。こういう「フォームなんて要らねぇよ」という場合はLoadイベントに匿名メソッドを追加し、その中でCloseするとヨサゲ。
作成するWAVEファイルは、44.1kHz16bit2chの標準的な感じの物。長さは10秒で、ch1/ch2共に1336Hzと941Hzを加算した正弦波を作る。今のところ、自動生成に対応しているのはヘッダのみ。実際の音声データは自前でバイナリレベルを扱う必要がある。でもまぁクラスに配列を渡すと最大4GiB近くを確保しようとしてOutOfMemoryExceptionが発生しちゃうから仕方ないね!!
BinaryWriterにちまちま書き込んでいけば4GB(4*10^9byte)の波形データでも扱える(書きだすのに非常に時間が掛かるが)。大容量のデータをR/Wする場合はすべてをバッファに読み出すことは不可能なので、その辺りをうまくゴニョゴニョする必要がある。
このプログラムで作ったWAVEをSoundEngine Freeで開いてFFTするとこんな感じ。
