Waveファイルを作る

44100Hz、8bit、モノラルで2秒間、ノコギリウェーブを鳴らします。
ノコギリウェーブって言葉の響きが面白い。

音程は適当。えーと周期が256サンプルだから(44100/256)Hzになるのかな。
しかしWaveファイルって結構簡単に作れるのね。

open("b.wav", 'w'){|f|
  rate = 44100 #Hz
  sample = 8   #bit
  ch = 1
  sec = 2

  speed = rate*sample*ch/8 #bytes per sec
  size = speed * sec
  fileSize = size + 36
  fmtSize = 16

  f.print("RIFF",
          [fileSize].pack('V'),
          "WAVE",
          "fmt ",
          [fmtSize].pack('V'),

          [1].pack('v'),          #pcm
          [ch].pack('v'),
          [rate].pack('V'),
          [speed].pack('V'),
          [sample*ch/8].pack('v'),#block(byte)
          [sample].pack('v'),     #sample(bit)
          "data");

  wave = []
  size.to_i.times{|i|
    wave[i] = i % 256
  }

  f.print([wave.size].pack('V'),
          wave.pack("C*"));
}