【日曜大工】FUZZをプログラミングしてみよう(Google colab + Pythonでデジタルエフェクター作成)

Contents

はじめに

こんにちは。Tepoです。

今回は、どんな音声にもファズをかけちゃう「どこでもファズ」をGoogle Colab+Pythonで構築したいと思います。

ファズとは、言わずと知れた歪系のエフェクターであり、ベースでもよく使われます。

また、回路構成が非常にシンプルなため、初めてのエフェクター自作で題材として多く取り上げられます。

今回は、アナログ回路ではなくGoogle Colab+Pythonでwavファイルを入力し、それをプログラムで加工することによってファズの波形を作り出したいと思います。

ファズの動作原理について

ファズの歪みの音の正体は「波形をつぶす」ことです。

では、どうやって波形をつぶすのでしょうか?

よくある方法は、アンプが「もう無理~・・・」というまでのインプットゲインをフルテンにして、アンプの許容する入力以上の入力を与えることです。

これは、アンプの能力の限界値を利用して強制的に波形をつぶす方法です。

機会を動かすことをよく「ドライブ」といいますが、許容範囲を超えて、すなわち「オーバー」して「ドライブ」させるので「オーバードライブ」の原理です。

ファズについて、ファズも上記のとおり、波形をつぶすことによって歪音を生み出します。

ファズでは、波形をつぶすために「クリッピング」という現象を利用しています。

クリップとは英語で切り取るという意味です。

アナログ回路でエフェクターを自作する場合は、ダイオードという素子を使って、波形がある値を超えると、それ以上は大きくならないように制御をすることによって、波形をつぶしています。

今回は、プログラムによってこれを実現するので、「ある値以上になったらそれ以上の値にならないようにする」というシンプルなif文を使って構成してみました。

作成したプログラム

今回はGoogle colabを使ってPythonでプログラムを構築しました。

初期環境構築については、こちらにて紹介しておりますので、初めてGoogle colabを使われる方はまずこちらをご覧ください。

では、さっそくプログラムです。

import wave
import numpy as np
import matplotlib.pyplot as plt
import IPython.display                        #オーディオを表示させるのに必要なライブラリ

samplingrate_hz = 44100                       #サンプリング周波数を設定

wav_file = wave.open("ファイルのパスを指定" , "r" )
buf = wav_file.readframes(wav_file.getnframes())
data = np.frombuffer(buf, dtype="int32")

clipper = 200000000                           #これ以上大きく(小さく)なったら切り取る

fuzz_dat = [-clipper if i < -clipper else i for i in data]    #下側切り取り
fuzz_data = [clipper if i > clipper else i for i in fuzz_dat] #上側切り取り

print(wav_file.getnchannels()) # オーディオチャンネル数(モノラルなら 1 、ステレオなら 2 )
print(wav_file.getframerate()) # サンプリングレート.普通のCDは44100
print(wav_file.getsampwidth()) # 1サンプルあたりのバイト数.2なら2bytes(16bit), 3なら24bit
print(wav_file.getnframes())  # データの個数


plt.subplot(211)               # 元波形描画
plt.plot(data)

plt.subplot(212)               # FUZZ波形描画
plt.plot(fuzz_data)

plt.ylim([-1500000000, 1500000000])
plt.show()

IPython.display.Audio(fuzz_data, rate = samplingrate_hz)  #FUZZ音声出力

“ファイルのパスを指定"の箇所は、FUZZをかけたいファイルのパスを指定してください。

clipperという変数で、クリップする値を決めています。

これを小さくすると、より小さい音でも歪む、すなわちFUZZが強くなります。

今回のテスト音源は、ベースにベースを重ねて適当に録音してみました。

では、プログラムを実行してみましょう。

下の図の上が元波形、下が本プログラムでFUZZをかけた波形となります。

いい感じに、上側と下側がクリッピングされているのが見て取れます。

それでは、実際の音声を聞いてみましょう。

FUZZってます!!!

まとめ

今回は日曜大工的に、どこでもFUZZを作ってみました。

Pythonは何でも簡単にサクッと作れてすごいですね・・・