PythonでWAVE

日記に使うつもりでブログを再開したわけではないのでそろそろコードを残しそうと思う。

Pythonでwavファイルを作成しようと思い、WAVEフォーマットの構造を見ることにした。

http://www.kk.iij4u.or.jp/~kondo/wave/

WAVEフォーマットの構造はここでだいたい理解。

んでもって書き込みは

komaken.me

ここを参考に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()

って感じに書くとポンとファイルが出来てめでたしめでたし