wavファイルを左チャンネルのみ、右チャンネルのみにする

wavファイルをrubyでいじって、左チャンネルだけ消して右だけ聞こえるようにする。右を消して左だけにしたファイルも書き出す。
http://d.hatena.ne.jp/shokai/20091102/1257189122 のWavFile.rbを使う。


splitChannelWav.rb

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
# wavファイルを左だけ、右だけに分ける

require 'WavFile'

if ARGV.size < 2
  puts 'ruby splitChannelWav.rb input.rb output_left.wav output_right.wav'
  exit 1
end

f = open(ARGV.shift)
format, chunks = WavFile::readAll(f)
f.close

puts format.to_s

dataChunk = nil
chunks.each{|c|
  puts "#{c.name} #{c.size}"
  dataChunk = c if c.name == 'data' # 波形の入っているchunkを探す
}
if dataChunk == nil
  puts 'no data chunk'
  exit 1
end

bit = 's*' if format.bitPerSample == 16 # int16_t
bit = 'c*' if format.bitPerSample == 8 # signed char
wavs = dataChunk.data.unpack(bit) # 16bit or 8bitずつbinaryから読み出し

off = 32768 if format.bitPerSample == 16
off = 128 if format.bitPerSample == 8

for i in 0..1 do # LRそれぞれoffにして保存
  wavs_mono = wavs.dup
  for j in 0..wavs_mono.size-1 do
    if j%2 != i
      wavs_mono[j] = off # LRLRLR.. と交互なので
    end
  end
  dataChunk.data = wavs_mono.pack(bit)
  open(ARGV.shift, "w"){|out|
    WavFile::write(out, format, [dataChunk])
  }
end