wavファイルのフォーマットを読み込む

http://d.hatena.ne.jp/shokai/20091028/1256680676 でファイルヘッダを読み込んだので、続けてフォーマットチャンク部分を読み込んだ。


この本、Cで書かれてるけどわかりやすいから参考にした。
WAVプログラミング―C言語で学ぶ音響処理


readHeader.rb

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

if ARGV.size < 1
  puts 'ruby readHeader.rb input.wav'
  exit 1
end

File.open(ARGV.first){|file|
  file.binmode
  puts riff = file.read(4)
  data_size = file.read(4).unpack('V')[0]
  puts "#{data_size} (bytes)"
  puts wave = file.read(4)
  
  if riff != 'RIFF' or wave != 'WAVE'
    puts 'not wave file'
    exit 1
  end
  
  while !file.eof?
    id = file.read(4)
    chunk_size = file.read(4).unpack('V')[0]
    puts "chunk id: #{id}, size: #{chunk_size}"
    if id == 'fmt '
      format_id = file.read(2)[0].to_i
      puts "フォーマットID: #{format_id}"
      channel_num = file.read(2)[0]
      puts "チャンネル数: #{channel_num}"
      hz = file.read(4).unpack('V').join.to_i
      puts "サンプリングレート #{hz} (hz)"
      byte_per_sec = file.read(4).unpack('V').join.to_i
      puts "byte per sec #{byte_per_sec}"
      block_size = file.read(2)[0].to_i
      puts "ブロックサイズ #{block_size}"
      bit_per_sample = file.read(2)[0].to_i
      puts "bit per sample #{bit_per_sample}"
    else
      data = file.read(chunk_size) # 音が入っている部分
    end
  end
}


結果

RIFF
44951076 (bytes)
WAVE
chunk id: fmt , size: 16
フォーマットID: 1
チャンネル数: 2
サンプリングレート 44100 (hz)
byte per sec 22050
ブロックサイズ 4
bit per sample 16
chunk id: data, size: 44951040