PythonでWAVE
日記に使うつもりでブログを再開したわけではないのでそろそろコードを残しそうと思う。
Pythonでwavファイルを作成しようと思い、WAVEフォーマットの構造を見ることにした。
http://www.kk.iij4u.or.jp/~kondo/wave/
WAVEフォーマットの構造はここでだいたい理解。
んでもって書き込みは
ここを参考にstructモジュールを使って書き込んだ。
書き込むデータは440Hzの正弦波にした。
# -*- coding: utf-8 -*- import math import struct SAMPLING = 44100 # サンプリング周波数 CHANNEL = 2 # 1はモノラル , 2はステレオ GAIN = 440 # ラの音の周波数 SEC = 3 wf = open("sin_wave.wav","wb") for i in xrange(SEC): for j in xrange(SAMPLING): plot = 30000.0*math.sin(2*math.pi*GAIN/SAMPLING*j) a = math.floor(plot) # plot以下かつ最大の整数(要は床) # 8bitで書き込む if CHANNEL == 2: wf.write(struct.pack('h',a)) # 2チャンネルの場合左 wf.write(struct.pack('h',a)) # 2チャンネルの場合右 size=wf.tell() # 波形データのサイズを保存 wf.seek(0,0) # 書き込み場所をファイルの先頭に # ヘッダを書き込む wf.write("RIFF") wf.write(struct.pack('I',size+44)) # ヘッダのサイズは44バイト wf.write("WAVE") wf.write("fmt ") wf.write(struct.pack('I',16)) wf.write(struct.pack('H',1)) wf.write(struct.pack('H',CHANNEL)) wf.write(struct.pack('I',SAMPLING)) wf.write(struct.pack('I',SAMPLING*CHANNEL*2)) wf.write(struct.pack('H',2*CHANNEL)) wf.write(struct.pack('H',16)) wf.write("data") wf.write(struct.pack('I',size)) wf.close()
って感じに書くとポンとファイルが出来てめでたしめでたし