C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■88020 / )  Re[1]: C#でのwaveファイルの波形表示
□投稿者/ 魔界の仮面弁士 (1748回)-(2018/07/30(Mon) 11:33:35)
No88011 (akaveco さん) に返信
> http://tomosoft.jp/design/?p=8985
> https://tomosoft.jp/design/?p=9023
> のようなもので、このサイトでの方法はうまくいったのですが、

とりあえず "fmt " チャンクと "data" チャンクだけ調べれば、
他のチャンクは読み捨ててしまっても良さそうですね。

別案として、こういう実装もありました。
https://social.msdn.microsoft.com/Forums/en-us/ccff6fd9-3b36-4aa2-a9d4-ba3a56bae88f/how-to-draw-a-wav-chart-graph-with-real-time-postion-indicator?forum=vbgeneral


> 対応しているのが8ビット、16ビットのモノラルとステレオのWaveファイルのみになっています。
> 24ビットや32ビットに対応するにはどのようにすればいいのでしょうか?

switch (waveHeader.BitPerSample) での判定が、
 case 8:
 case 16:
の 2 つしか無いからでしょうか。


8bit なら、bytes 値をそのまま渡していき、
16bit なら、2 バイト単位で渡していますので、同様にして、
24bit なら、3 バイト単位で渡すようにし、
32bit なら、4 バイト単位で渡してみては如何でしょう。

モノラルなら valuesR だけに詰め込み、
ステレオなら valuesL→R→L→R と交互に詰め込んでください。

ただし、チャンネル数は 2 や 4 ばかりではありません。
下記の『Sample WAVE files』には、6ch や 8ch の wav ファイルも掲載されていますね。
http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/


レンダリングする際には、
 8bit の場合、1 サンプルあたり 1 byte で -128 〜 +127
16bit の場合、1 サンプルあたり 2 bytes で -32,768 〜 +32,767
24bit の場合、1 サンプルあたり 3 bytes で -8,388,608 〜 +8,388,607
32bit の場合、1 サンプルあたり 4 bytes で -2,147,483,648 〜 +2,147,483,647
かと思いますが、波形データの解釈の仕方は、waveHeader.FormatID によっても左右されるようです。
http://www.web-sky.org/program/other/wave.php#format



参考までに、64 bit なファイル(Windows Media Player 非対応)として、
http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Samples.html
にある M1F1-float64-AFsp.wav (376,112 バイト) を解析してみました。


バイナリ解析すると、こんな感じでした。
自分の見立てだと、何故か 0x5BCDB が余ってしまった…。

 [00000-00003] RIFF.ID       : 52,49,46,46 "RIFF"
 [00004-00007] RIFF.Size     : 0005BD28  (376,104 Bytes)
 [00008-0000B] RIFF.FileType : 57,41,56,45 ("WAVE")

 [0000C-0000F] Chunk.ID      : 66,6D,74,20 ("fmt ")
 [00010-00013] Chunk.Size    : 00000012 (18 Bytes)
 [00014-00015] フォーマットID: 0003 (IEEE float format)
 [00016-00017] チャンネル数  : 0002 (ステレオ)
 [00018-0001B] 標本化周波数  : 00001F40 (8000 Hz = 8kHz)
 [0001C-0001F] 秒間バイト数  : 0001F400 (128000)
 [00020-00021] ブロックサイズ: 0010 (16 Bytes)
 [00022-00023] 量子化ビット数: 0040 (64bit)
 [00024-00025] 拡張部サイズ  : 00,00 (なし)

 [00026-00029] Chunk.ID      : 66,61,63,74 ("fact")
 [0002A-0002D] Chunk.Size    : 00000004 (4 Bytes)
 [0002E-00031] 全サンプル数  : 00005BC5 (23,493)

 [00032-00035] Chunk.ID      : 64,61,74,61 ("data")
 [00036-00039] Chunk.Size    : 0005BC50 (375,888 Bytes)
 [0003A-5BC89] 波形データ    : ★★

 [5BC8A-5BC5D] Chunk.ID      : 61,66,73,70 ("afsp")
 [5BC5E-5BC91] 00000049      : 00000049 (73 Bytes)
 [5BC92-5BCDA] AFspデータ    : ("AFspdate: 2003-01-30 03:28:50 UTC\0user: kabal@CAPELLA\0program: CopyAudio\0")

 [5BCDB-5BCDB] 00

 [5BCDC-5BCDF] Chunk.ID      : 4C,49,53,54 ("LIST")
 [5BCE0-5BCE3] Chunk.Size    : 0000004C (76 Bytes)
 [5BCE4-5BCE7] LISTタイプ    : 49,4E,46,4F ("INFO")
 [5BCE8-5BCEB] SubChunk.ID   : 49,43,52,44 ("ICRD")
 [5BCEC-5BCEF] SubChunk.Size : 00000018 (24 Bytes)
 [5BCF0-5BD07] SubChunk.Data : ("2003-01-30 03:28:50 UTC\0")
 [5BD08-5BD0B] Subchunk.ID   : 49,53,46,54 ("ISFT")
 [5BD0C-5BD0F] SubChunk.Size : 0000000A (10 Bytes)
 [5BD10-5BD19] SubChunk.Data : ("CopyAudio\0")
 [5BD1A-5BD1D] Subchunk.ID   : 49,43,4D,54 ("ICMT")
 [5BD0E-5BD20] SubChunk.Size : 0000000E (14 Bytes)
 [5BD22-5BD2F] SubChunk.Data : ("kabal@CAPELLA\0")

返信 編集キー/


管理者用

- Child Tree -