■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")
|
|