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