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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.88147 の関連記事表示

<< 0 >>
■88147  Re[11]: C#でのwaveファイルの波形表示
□投稿者/ 魔界の仮面弁士 -(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; を指定してあります。
記事No.88011 のレス /過去ログ151より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -