Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

Python:エフェクター(音響効果処理)を簡単に実装・リアルタイム再生できるクラスの作成

入出力の管理リアルタイム音響信号処理を使った身近な機器としては、ボーカルやギターなどの楽器で利用されているエフェクターが挙げられます。

エフェクターは信号処理としては簡単なのですが、実際にPCでプログラミングをして音を出力するのは準備が割と大変です

そこで本記事では、Pythonエフェクターをリアルタイム音響信号処理として簡単に実装可能&音としてすぐに聞けるクラスを作りました。

VSTなどのフレームワークのように audio_process(x, y)のような信号処理の関数を書くだけでエフェクターが実装・試聴できます。

使い方

以下のGithub上のPythonスクリプトの、Playerクラスを使います。

github.com

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です。

  1. effectorにセットする信号処理関数を実装
  2. オーディオファイルのパスと信号処理関数を引数として与え、Playerオブジェクトを生成
  3. player.start()で再生開始

という3stepなので簡単に信号処理を実装できます

また、コンソール上でオーディオファイルにエフェクトをかけて再生することができます

また、以下の関数で再生を制御できます。

  • player.stop() 再生を停止
  • player.save() 出力信号をオーディオファイルとして保存

@jitについては以下をご参考ください。

基本的には、for文を使う信号処理では@jitが必要になります。

www.wizard-notes.com

x_buf, y_bufは数秒分の信号のリングバッファのような構造*1となっているため、過去の信号を参照することができます。

Playerクラス実装の参考記事

www.wizard-notes.com

www.wizard-notes.com

*1:過去信号をn_buf*bufsizeサンプル分保存している