WAVEファイルの内容について

解決


dkk3  2002-09-26 03:41:13  No: 1595

プログラムを始めて半年ほどになります。WAVEファイルの内容を表示したいのですが、うまくいきません。いい方法はないでしょうか?

WAVEファイルのフォーマットはこのようになっているんですが・・・(たぶん知っている人多いと思います・・・)

4バイト 'R' 'I' 'F' 'F' 
4バイト これ以下のバイト数 (= ファイルサイズ - 8) 
8バイト 'W' 'A' 'V' 'E' 'f' 'm' 't' ' '(←スペース) 
4バイト WAVEfmt欄のバイト数,つねに 16 (10 00 00 00) 
2バイト データ形式 (PCM: 01 00) 
2バイト チャネル数 (モノ: 01 00 ステレオ: 02 00) 
4バイト サンプリングレート (44100Hz なら 44 AC 00 00) 
4バイト バイト/秒 (44100Hz ステレオ 16ビット なら 10 B1 02 00) 
2バイト バイト/サンプル×チャネル数 (ステレオ 16ビット なら 04 00) 
2バイト ビット/サンプル (16ビット なら 10 00) 
4バイト 欄の名前 ('d' 'a' 't' 'a','f' 'a' 'c' 't' など) 
4バイト この欄のバイト数 n 
nバイト 欄の内容

欄の内容については http://www.matsusaka-u.ac.jp/~okumura/wavefmt.html  (リンクフリー)  を参照してください。

Recordを使って一番下の (nバイト 欄の内容) 以外はmemoやlistboxあたりを使って表示できましたが、 (nバイト 欄の内容) は下から2番目の (4バイト この欄のバイト数 n) によってバイト数が変動するので、プログラムがうまく組めません。動的配列が必要だと思うのですが・・・  よろしければ、いい方法を教えてくれませんか?


dkk3  2002-09-26 04:10:14  No: 1596

追加ですみませんが、TFileStreamを使っています。


たかみちえ  URL  2002-09-26 05:16:31  No: 1597

へぇー、わたしはVBをやっていたときを合わせて1年半くらいになりますけど、
ファイルフォーマットにはMIDIデータしか手を触れてないですよ…(^^ゞ
WAVEデータも、見てみたいとは思うもののほとんどぜんぜんなので、
お役に立つかどうかわかりませんけど。
  ヘッダの44バイトまでは固定なものの、
最後の4バイトが可変で、内容がわからないからどうしようもない…と言うことですよね?

  まず、DelphiにはTMemoryStreamなんていう便利なものがあるんですから、それを使うといいです。
  それに、バイト長を示す4バイトの分だけ、見つけたバイトを書き写していけばいいでしょうね。
TMemoryStreamは、先にサイズを決めておかないとWriteしてくれないようなので、
先にサイズを決めておきます。

  ええと、同じストリームつながりということで、
VBでMIDIファイル内のプログラムチェンジ(楽器変更命令)を書き換えて、
曲をアレンジしてしまうという機能つきプレイヤーを作ったんですけど、
それの曲アレンジ部分だけを移植したソフトがうちのホームページにあります。
(書き換えをTFileStreamでやってしまっているので、異常に遅いですけど(^^ゞ)
ソースは中に入っているので、参考に見てみてください。
上の[HomePage]リンクからどうぞ、フリーソフト屋にある"midiChanger"というソフトです。


たかみちえ  URL  2002-09-26 05:18:52  No: 1598

と思いきや、前回の更新で間違えて消したままになってました。
http://homepage2.nifty.com/_omp/Village/program/SoftArcive/midChanger.lzh
ここにアップしておきました。


KF  2002-09-26 05:21:00  No: 1599

8バイト 'W' 'A' 'V' 'E' 'f' 'm' 't' ' '(←スペース) 
4バイト WAVEfmt欄のバイト数,つねに 16 (10 00 00 00) 
ここは
4バイト 'W' 'A' 'V' 'E'
4バイト 'f' 'm' 't' ' '
4バイト fmt欄のバイト数,つねに 16 (10 00 00 00) 
と解釈します.またfmt欄のバイト数は16とは限りません.
16というサイズは WAVEFORMAT という構造体のサイズですが
WAVEFORMATEX という構造体は18です. WAVEFORMATEX は WAVEFORMAT を
拡張した構造体でデータが増えて18バイトになっています.
WAVEデータを解析するときは両方に対応しておいたほうが良いでしょう.
'W' 'A' 'V' 'E' 部分はWAVE形式であることを示します.
'f' 'm' 't' ' ' というのはfmt(format)チャンクという意味です.
チャンクには'd' 'a' 't' 'a', 'f' 'a' 'c' 't' , 'L' 'I' 'S' 'T' など
がありますがチャンクの順番は決められていません.例えばfmtチャンクの
後がdataチャンクと決め付けてはいけません.
RIFFファイルを読み書きするには mmioOpen, mmioWrite, mmioRead等の
専用APIがありますからそれを使いましょう.


dkk3  2002-09-27 04:15:36  No: 1600

たかみちえさん、KFさん、ありがとうございました。
TMemoryStreamでWAVEファイルの内容をLoadFromFileでメモリバッファにロードした後、forループを交えた4、5行程度の処理で簡単にできました。
WAVEFORMAT以外にWAVEFORMATEXという構造体があるのは全く知りませんでした。さっそく対応できるようにしたいと思います。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加