ブログに書かれている内容は、リアルで喋っちゃ駄目だぞっ!
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
C#しばらくやってないと分からなくなっちゃいました。
というか、プログラミング自体が……
以前からやろうとしてた、WAVEファイルの解析ツールを作成中です。
というか、プログラミング自体が……
以前からやろうとしてた、WAVEファイルの解析ツールを作成中です。
とりあえず動くだけのが出来たので公開。
WAVE.zip(8kb)
ビット数の判定すべき箇所が違うので、たぶん処理すべき内容が間違ってます。
現時点では16ビットデータ限定の動作確認です。
上のようなWAVEファイルのバイナリデータを下のようなテキストデータに出力します。
多分、秒単位の周波数データじゃないかなと思います。
C#の.NETでバイナリデータをいじるのは初めてです。
画像工学だかの課題でビットマップ画像を2値化するプログラムをC言語で作った時は、どうやったんでしたっけ。
(追記:当時のソースを見たら、fgetcを使ってました)
誰かさんのをほぼ丸写ししたから良く覚えてないですが、あの時と違って
今回はヘッダ情報をちゃんとチェックする必要があります。
C#でのバイナリデータの読み書きはStreamReaderクラスでも出来るらしいんですが、
今回はBinaryReaderクラスを使いました。
ヘッダー部分はこのサイトを読みながら必要な部分を読み込み、必要ない部分は読み飛ばします。
最初の「RIFF」や「fmt 」の部分は、ReadBytesメソッドで読みます。
これらの文字列は4バイト指定なのでReadBytes(4)と記述し、ファイルサイズなどの数値データは
4バイト符号なしデータならReadUInt32()を使います。
ReadBytes(4)で読んだ文字列はbyte型配列に格納されているので、
Encoding.UTF8.GetString(byte型の文字列);でstring型へ変換します。
dataチャンク以降の波形データは、
サンプルあたりのビット数が8ビットならReadByte()、16ビットならReadInt16()で読んでいきます。
すっかり忘れてましたが、8ビット=1バイト、16ビット=2バイトなので
1バイト単位で読むメソッドと2バイト単位で読むメソッドを使い分けなきゃいけませんでした。
最初に見たサンプルプログラムが1バイトの読み込みで処理してたもんだから、ここで詰まってました。
んで、"data"の次に波形データ全体のバイト数が記述されているので、
「全体のバイト数÷1ブロックのバイト数」の回数だけループして読み込めばおkでした。
これの後にLISTチャンクがあるので、ファイル末尾まで処理しちゃ駄目です。
参考書籍
WAVプログラミング .NET C#で学ぶ音響処理
参考になったと言えば参考になったんですが、内容の割りにちょっと値段高くありません?
そういえば、ビット・バイト単位のプログラム処理は確かアセンブリで授業でやったはずなんだよなぁ。
グループ作業で他人任せだったもんだから、当時は全然理解できてませんでした。
いかんいかん。
あの時と違ってシリアル通信をしなくて良い分、それだけ楽なはずですし。
WAVEファイルの波形データを見ながら音階や音色を判定するプログラムを作りたいのですが、
波形パターンを調べるのにフーリエ変換するらしいですね。
フーリエ変換は単位を落としまくった経緯があるし、敷居が高過ぎですかね?
フーリエ変換そのものをやってくれるクラスとかあれば良いんですけど……。
WAVE.zip(8kb)
ビット数の判定すべき箇所が違うので、たぶん処理すべき内容が間違ってます。
現時点では16ビットデータ限定の動作確認です。
上のようなWAVEファイルのバイナリデータを下のようなテキストデータに出力します。
多分、秒単位の周波数データじゃないかなと思います。
C#の.NETでバイナリデータをいじるのは初めてです。
画像工学だかの課題でビットマップ画像を2値化するプログラムをC言語で作った時は、どうやったんでしたっけ。
(追記:当時のソースを見たら、fgetcを使ってました)
誰かさんのをほぼ丸写ししたから良く覚えてないですが、あの時と違って
今回はヘッダ情報をちゃんとチェックする必要があります。
C#でのバイナリデータの読み書きはStreamReaderクラスでも出来るらしいんですが、
今回はBinaryReaderクラスを使いました。
ヘッダー部分はこのサイトを読みながら必要な部分を読み込み、必要ない部分は読み飛ばします。
最初の「RIFF」や「fmt 」の部分は、ReadBytesメソッドで読みます。
これらの文字列は4バイト指定なのでReadBytes(4)と記述し、ファイルサイズなどの数値データは
4バイト符号なしデータならReadUInt32()を使います。
ReadBytes(4)で読んだ文字列はbyte型配列に格納されているので、
Encoding.UTF8.GetString(byte型の文字列);でstring型へ変換します。
dataチャンク以降の波形データは、
サンプルあたりのビット数が8ビットならReadByte()、16ビットならReadInt16()で読んでいきます。
すっかり忘れてましたが、8ビット=1バイト、16ビット=2バイトなので
1バイト単位で読むメソッドと2バイト単位で読むメソッドを使い分けなきゃいけませんでした。
最初に見たサンプルプログラムが1バイトの読み込みで処理してたもんだから、ここで詰まってました。
んで、"data"の次に波形データ全体のバイト数が記述されているので、
「全体のバイト数÷1ブロックのバイト数」の回数だけループして読み込めばおkでした。
これの後にLISTチャンクがあるので、ファイル末尾まで処理しちゃ駄目です。
参考書籍
WAVプログラミング .NET C#で学ぶ音響処理
参考になったと言えば参考になったんですが、内容の割りにちょっと値段高くありません?
そういえば、ビット・バイト単位のプログラム処理は確かアセンブリで授業でやったはずなんだよなぁ。
グループ作業で他人任せだったもんだから、当時は全然理解できてませんでした。
いかんいかん。
あの時と違ってシリアル通信をしなくて良い分、それだけ楽なはずですし。
WAVEファイルの波形データを見ながら音階や音色を判定するプログラムを作りたいのですが、
波形パターンを調べるのにフーリエ変換するらしいですね。
フーリエ変換は単位を落としまくった経緯があるし、敷居が高過ぎですかね?
フーリエ変換そのものをやってくれるクラスとかあれば良いんですけど……。
PR
KKK(きっときっと楓ちゃん)
当ブログは、shuffle!に登場する楓ちゃんを応援しています。
ブログ内検索
アーカイブ
名雪かわいいよ、名雪