火曜日, 1月 02, 2007

num2snd(python)

あけましておめでとうございます。初詣で「プログラミングができますように」って祈ったらわかりました。pythonでwaveファイルを書き出します。参考にしたのはこことその中でも紹介されてる千葉大のppt。違うところはprepare_list(n)関数のところ。元々はarrayオブジェクトを使っていたんだけど、どうやら今のマシン(ハードディスクがクラッシュしたので友達のを借りてる)だとバージョンが2.3.5で2.4とかとは挙動が異なるみたい。のせいなのか実行できなかったので、単純にサンプリング周波数と秒数分の配列を作ってみました。その方法はここで。あとはほぼ同じ。
max/mspでpeek~使ってインデックスと数値を与えて音を生成したように、data[i]にひたすら数値を入れてあげれば音が出る訳だ...こういうのってやっぱその道の人からすれば当然で別に面白くも何ともないことなのでしょうか。


import wave, math
SAMPFREQ = 44100
LENGTH = 3

def wave_init(fileName, sampFreq):
file = wave.open(fileName, 'w')
file.setnchannels(1)
file.setsampwidth(2)
file.setframerate(sampFreq)
file.setcomptype('NONE', 'not compressed')
return file

def prepare_list(n):
data = range(n)
return data

def wave_write(out, samples):
out.writeframesraw(samples)
out.close()

def sin_wave(fileName, freq):
out = wave_init(fileName, SAMPFREQ)
samples = prepare_list(SAMPFREQ * LENGTH)
a = math.pi * 2.0 * float(freq) / float(SAMPFREQ)
for i in range(SAMPFREQ * LENGTH):
ft = int(math.sin(a * float(i)) * 30000.0)
samples[i] = ft
wave_write(out, samples)

sin_wave('newyear.wav', 2007)


ちなみにpythonで音を作るならpysndobj, pyaudioあたりが要注目です。あと、pdのエクスターナル書いたり。

0 件のコメント: