ゴールデンウイークの感覚がまだ抜けきらない週末です。
かなり仕事の積み残しがあるので、週末に少し自宅で仕事をして減らそうと思ったのですが、結局それも叶わず貴重な休日が終わろうとしています。こんなことで良いのか、いつも悩んでしまいます。
先日、WAVEファイル生成のコードをアップロードするとお約束していたので、アップロードしました。
WAVEファイルを作成して保存するだけでは面白くないので、モールス信号を生成してメモリーストリームに入れ、それを再生するクラスにしてみました。
15~30分で作成したものなのでかなり手抜きコードですが、何をしているのかは理解いただけるかと思います。(コメントが少なくてすいません。)
前回の説明とは特に関係はないのですが、データの書き込みにBinaryWriter使用しています。byte[]を使用するよりも、ファイルデータと同じ感覚で書き出しができるので非常に便利です。このプログラムでは音データのサイズが最後までわかりませんので、最初にヘッダーサイズ分だけ書き出しポジションを移動させ、音データを書き出し、その後の書き出したデータサイズを元にヘッダーを更新、書き出しポジションを先頭に戻して書き出すことをしています。
msWave = new MemoryStream();
bwWave = new BinaryWriter(msWave);
中略
書き出し位置を先頭も移動し、ヘッダーの書き出し。
//=======================================================
// WaveHeaderをストリームに書き出し。
//=======================================================
bwWave.Seek(0, SeekOrigin.Begin);
bwWave.Write(StructureToByteArray(Header));
と、このような感じです。
昔はC++/アセンブラしか使用していませんでしたしので、デバイス制御、バイナリ操作が必要な場合は、C#よりもC++が私としては楽ですね。自分でメンテナンスしているライブラリもあるので。(並べ替え、メモリ管理からデバイス制御まで)
一方で、ユーザーインターフェースが絡むとC#の方が楽なんですよね。C++のポインタ感覚でデータ処理ができると言うことないのですが。.NET Frameworkの今後のアップデートに期待したいと思います。