wavファイルを複数つなげる

前の記事に書いたWavFile.rbは、dataチャンクを増やした時にファイルフォーマットや各チャンクのsize値も更新するようになっているので、こんな風に複数wavを接続するのも簡単にできる。
ただしformat chunkが同じwavファイル同士のみ。formatが違うとデータチャンクの周波数とかをいじらなければならない


connectWavFiles.rb

#!/usr/bin/env ruby
require 'WavFile'

if ARGV.size < 3
  puts 'ruby connectWavFiles.rb input1.wav input2.wav output.wav'
  exit 1
end

out_file = ARGV.pop
format = nil
dataChunk = nil

ARGV.each{|in_file|
  puts "input #{in_file}"
  open(in_file){|f|
    in_format, in_chunks = WavFile::readAll(f)
    format = in_format if format == nil # 最初のファイルにフォーマットを合わせる
    in_chunks.each{|c|
      if c.name == 'data'
        if dataChunk == nil # 最初のファイルのデータチャンクを流用
          dataChunk = c
        else
          dataChunk.data += c.data # データチャンクに追記
        end
      end
    }
  }
}

puts format

out = open(out_file, "w")
WavFile::write(out, format, [dataChunk])
out.close


使ってみる。wavファイルは http://utm-game-web.hp.infoseek.co.jp/sound/01.htm からもらってきた。

ruby connectWavFiles.rb gun.wav pan2.wav sinpi4.wav out.wav
input gun.wav
input pan2.wav
input sinpi4.wav
フォーマットID: 1
チャンネル数: 1
サンプリングレート: 22050 (Hz)
byte per sec: 22050
bit per sample: 8 
ブロックサイズ: 1