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

わんくま同盟

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

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

■88147 / 11階層)  C#でのwaveファイルの波形表示
□投稿者/ 魔界の仮面弁士 (1768回)-(2018/08/05(Sun) 05:08:12)
No88141 (akaveco さん) に返信
> 0x7Fにしたら、できました!
誤記でお手数をおかけしました…!
掲示板投稿時にうっかり一文字消してしまっていたらしく、
そのまま気が付きませんで。orz


> いろいろ確認作業もしていただいて、お手間を取らせて申し訳ありません。
実データを提供してもらえたので、検証しやすかったです。


> ついでで申し訳ありませんが、32bitについてはどのようにすればいいのでしょうか?
元データが DC,FB,6E,BA だった場合、PCM なら符号付き整数型のはずなので、
 ビッグエンディアンなら 0xDCFB6EBA すなわち -587,501,894
 リトルエンディアンなら 0xBA6EFBDC すなわち -1,167,131,684
になるということです。通常はリトルエンディアンの並びになるはず。


> 32bitでも同様に符号の処理が必要なのでしょうか?
リトルエンディアンであれば、そのまま BitConverter.ToInt32 だけで良いはずです。
 Int32 int32_LE = BitConverter.ToInt32(data4, n);

仮にビッグエンディアンなら、[0][1][2][3] を [3][2][1][0] の順で渡すことになるので、
 Int32 int32_BE = BitConverter.ToInt32(data4.Skip(n).Take(4).Reverse().ToArray(), 0);
といった感じになります。あるいは下記のようにも書けます。
 Int32 int32_BE = System.Net.IPAddress.NetworkToHostOrder(int32_LE);


> 32bitモノラルのこの音声ファイルを描画すると
> https://drive.google.com/file/d/1Ce0fbeHXJo5SWllIjMCg1u7QeHAOIVkn/view?usp=sharing
うっ…。Sazanami では対応していないフォーマットでした。
他に波形を拡大表示できるソフトは無いですかね。

ひとまず手動解析してみましたが、
これは WAVE_FORMAT_PCM フォーマットではなく、
WAVE_FORMAT_IEEE_FLOAT フォーマットですよね?

 [00000-00003] RIFF.ID       : 52,49,46,46 "RIFF"
 [00004-00007] RIFF.Size     : 0006BACC (441,036 Bytes)
 [00008-0000B] RIFF.FileType : 57,41,56,45 ("WAVE")

 [0000C-0000F] Chunk.ID      : 66,6D,74,20 ("fmt ")
 [00010-00013] Chunk.Size    : 00000010 (16 Bytes)
 [00014-00015] フォーマットID: 0003 (WAVE_FORMAT_IEEE_FLOAT)
 [00016-00017] チャンネル数  : 0001 (モノラル)
 [00018-0001B] 標本化周波数  : 0000AC44 (44100 Hz = 44.1 kHz)
 [0001C-0001F] 秒間バイト数  : 0002B110 (176,400)
 [00020-00021] ブロックサイズ: 0004 (4 Bytes = 32bit)
 [00022-00023] 量子化ビット数: 0020 (32bit)

 [00024-00027] Chunk.ID      : 64,61,74,61 ("data")
 [00028-0002B] Chunk.Size    : 0006BAA8 (441,000 Bytes)
 [0002C-6BAD3] 波形データ    : ★★


なのでこの場合は、整数として処理してはマズイと思います。
4 バイト単位で BitConverter.ToInt32 するのではなく、
4 バイト単位で BitConverter.ToSingle すると良いのかも。
(手持ちのソフトでは正しい波形が分からないので、確認はできませんが)


ひとまず、提供いただいた 32bit.txt ファイルの内容から
かきおこしてみると、こんな感じになりますね。

【ファイル全体(2.50秒)】
http://www.vb-user.net/junk/replySamples/2018.08.05.04.36/IEEE_FLOAT_2500.png

【0.00 秒〜0.50秒区間】
http://www.vb-user.net/junk/replySamples/2018.08.05.04.36/IEEE_FLOAT_500.png

【0.00 秒〜0.01秒区間】
http://www.vb-user.net/junk/replySamples/2018.08.05.04.36/IEEE_FLOAT_10.png

※ StepLine チャートで描画させています。
※ ChartAreas[0] は、BitConverter.ToInt32 による変換結果です。
※ ChartAreas[1] は、BitConverter.ToSingle による変換結果です。
※ AxisY.ScaleBreakStyle.Enabled = true; を指定してあります。

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[10]: C#でのwaveファイルの波形表示 /akaveco →Re[12]: C#でのwaveファイルの波形表示 /akaveco
 
上記関連ツリー

C#でのwaveファイルの波形表示 / akaveco (18/07/30(Mon) 05:12) #88011
Re[1]: C#でのwaveファイルの波形表示 / 魔界の仮面弁士 (18/07/30(Mon) 11:33) #88020
  └ Re[2]: C#でのwaveファイルの波形表示 / akaveco (18/07/30(Mon) 12:41) #88027
    └ Re[3]: C#でのwaveファイルの波形表示 / 魔界の仮面弁士 (18/07/30(Mon) 17:24) #88041
      └ Re[4]: C#でのwaveファイルの波形表示 / akaveco (18/07/31(Tue) 11:34) #88055
        └ Re[5]: C#でのwaveファイルの波形表示 / 魔界の仮面弁士 (18/08/01(Wed) 17:38) #88083
          └ Re[6]: C#でのwaveファイルの波形表示 / akaveco (18/08/02(Thu) 12:00) #88093
            └ Re[7]: C#でのwaveファイルの波形表示 / 魔界の仮面弁士 (18/08/02(Thu) 17:34) #88103
              └ Re[8]: C#でのwaveファイルの波形表示 / akaveco (18/08/02(Thu) 21:19) #88104
                └ Re[9]: C#でのwaveファイルの波形表示 / 魔界の仮面弁士 (18/08/04(Sat) 00:54) #88138
                  └ Re[10]: C#でのwaveファイルの波形表示 / akaveco (18/08/04(Sat) 16:38) #88141
                    └ C#でのwaveファイルの波形表示 / 魔界の仮面弁士 (18/08/05(Sun) 05:08) #88147 ←Now
                      └ Re[12]: C#でのwaveファイルの波形表示 / akaveco (18/08/08(Wed) 09:50) #88179
                        └ Re[13]: C#でのwaveファイルの波形表示 / akaveco (18/08/08(Wed) 09:51) #88180 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信