色々な波形を作ってみる(矩形波、三角波、鋸波)
このブログの記事は以下のサイトに移転しました。
より詳細な記事やプログラムの実装方法などは移設先のHPを参照ください。
teckonestep.com
この記事では様々な形の周期波形を作成してみます。
作成した波形はそれぞれ特徴的な音色をしており、その違いが楽しめると思います。
※音声を再生する際は音量に注意してください。
事前準備
作成した波形データを可視化、保存するためのメソッドを定義します。
基本パラメータ
#振幅 A1=1 #基本周波数 f1 =330 #サンプリング周波数 fs = 44100 #時間(秒) sec = 5 #サンプリングした時の時間軸 t = np.arange(0.0, sec, 1 / fs)
グラフ化
def plot_wav(wave_data,t): scale=0.01#描画範囲の設定(s) fs = 44100#サンプリング周波数 q=int(scale*fs) plt.plot(t[0:q], wave_data[0:q]) plt.show()
ファイル保存
def create_wave(file_name,wave_data,fs): #16bit符号付き整数に変換 wave_data = [int(x * 32767.0) for x in wave_data] #バイナリ化 binwave = struct.pack("h" * len(wave_data), *wave_data) #wavファイルとして書き出し wf = wave.Wave_write(filename) wf.setparams(( 1, # channel 2, # byte width fs, # sampling rate len(data), # number of frames "NONE", "not compressed" # no compression )) wf.writeframes(binwave) wf.close()
正弦波
波形と言えばこの形です。耳触りの良い綺麗な音色をしています。
プログラムで表現するのも容易で、Pythonではたった数行でデータ配列を生成することができます。
#正弦波 def sin_wave(A,f0,t): #振幅A,基本周波数f0,録音時間t sinwav = A * np.sin(np.pi * f0 * t) plot_wav(sinwav,t) return sinwav #サイン波の描画 サンプル sinwav=sin_wave(A1,f1,t) create_wave('sinwav_test',sinwav, fs)
矩形波
矩形波は電気的に発生するのが容易であるため、ゲームの音楽でもよく使用されてきました。ファミコンのピコピコ音はこの矩形波が使われているからです。
#矩形波 def square_wave(A,f0,t): squarewav=np.array([0.0 for i in range(len(t))]) for i in range(len(t)): if np.sin(np.pi*f0*t[i])>0: squarewav[i]=1*A elif np.sin(np.pi*f0*t[i])==0: squarewav[i]=0*A elif np.sin(np.pi*f0*t[i])<0: squarewav[i]=-1*A plot_wav(squarewav,t) return squarewav #矩形波の描画 サンプル squarewav=square_wave(A1,f1,t) create_wave('squarewav_test',squarewav, fs)
三角波
#三角波 def triangle_wave(A,f0,t,fs): trianglewave = np.array([0.0 for i in range(len(t))]) filtersize = fs//f0//2 trianglefilter = np.arange(0,filtersize) trianglefilter = trianglefilter[:]/(filtersize-1) for i in range(len(t)//filtersize): for j in range(filtersize): index_num = i*filtersize + j if i%2==0: trianglewave[index_num] = trianglefilter[j] else: trianglewave[index_num] = trianglefilter[j*(-1)-1] trianglewave[:] -= 0.5 trianglewave[:] *= 2 plot_wav(trianglewave,t) return trianglewave #三角波の描画 サンプル trianglewave=triangle_wave(A1,f1,t,fs) create_wave('triangle_wave',trianglewave, fs)
鋸波
パソコンのビープ音のような音色です。
#のこぎり波 def sawtooth_wave(A,f0,t,fs): sawtoothwave=np.arange(0,len(t)) for i in range(len(t)): sawtoothwave[i]=i%((fs//f0)-1) sawtoothwave = sawtoothwave[:]/((fs//f0)-1)-0.5 sawtoothwave = sawtoothwave[:]*2 plot_wav(sawtoothwave,t) return sawtoothwave #のこぎり波の描画 サンプル sawtoothwave=sawtooth_wave(A1,f1,t,fs) create_wave('sawtooth_wave',sawtoothwave, fs)