入出力の管理リアルタイム音響信号処理を使った身近な機器としては、ボーカルやギターなどの楽器で利用されているエフェクターが挙げられます。
エフェクターは信号処理としては簡単なのですが、実際にPCでプログラミングをして音を出力するのは準備が割と大変です。
そこで本記事では、Pythonでエフェクターをリアルタイム音響信号処理として簡単に実装可能&音としてすぐに聞けるクラスを作りました。
VSTなどのフレームワークのように audio_process(x, y)
のような信号処理の関数を書くだけでエフェクターが実装・試聴できます。
使い方
以下のGithub上のPythonスクリプトの、Player
クラスを使います。
Player
クラスは以下のように使います。
effect.py
@jit def effector(sr, blocksize, bufsize, x, y, x_buf, y_buf): # delay effect fo = 10 tau = sr // fo alpha = 0.6 for k in range(blocksize): if k >= tau: y[k] = x[k] - alpha * y[k - tau] else: y[k] = x[k] - alpha * y_buf[bufsize-1-tau+ k] filepath = "./audio.wav" player = Player(filepath, effector=effector) player.start() # player.stop() # player.save() import code console = code.InteractiveConsole(locals=locals()) # <- locals=locals() が重要 console.interact()
このスクリプトをpython effect.py
として実行すればOKです。
effector
にセットする信号処理関数を実装- オーディオファイルのパスと信号処理関数を引数として与え、
Player
オブジェクトを生成 player.start()
で再生開始
という3stepなので簡単に信号処理を実装できます。
また、コンソール上でオーディオファイルにエフェクトをかけて再生することができます。
また、以下の関数で再生を制御できます。
player.stop()
再生を停止player.save()
出力信号をオーディオファイルとして保存
@jit
については以下をご参考ください。
基本的には、for文を使う信号処理では@jit
が必要になります。
x_buf
, y_buf
は数秒分の信号のリングバッファのような構造*1となっているため、過去の信号を参照することができます。
Playerクラス実装の参考記事
*1:過去信号をn_buf*bufsizeサンプル分保存している