イコライザーとは
音圧を周波数ごとに表示するやつです.
今回は,こういうの⇩をつくります.
環境・使用ライブラリ
Windows 10
コマンドプロンプト
Python 3.8.10
- pyaudio
- numpy
音楽の再生
pyaudioを使用します.詳しくは前回記事をご覧ください.
なお,今回の対象ファイルはwavファイルのみです.
音圧(amp)と周波数(freq)の計算
numpyのfft(高速フーリエ変換)を利用すると簡単に求められます.
音圧の代わりとして,フーリエ変換後の振幅スペクトルを使用しました.(音圧と振幅スペクトルの関係に詳しい方はコメントで教えてください...)
f = np.fft.rfft(data)
freq = np.fft.rfftfreq(data.shape[0], d=1.0/framerate)
amp = np.abs(f)
イコライザーの表示
いつも通り,ANSIエスケープシーケンスを利用しましょう!
ANSIエスケープシーケンスは第-38回や第-39回でも利用しているので,ぜひ参考にしてください.
下記コードでは,周波数ごとの音圧をリストで表現し,上から順にプリントしています.
print("\033[18F")
for i in range(15, 0, -1):
color = "\033[35m" if i<=3 else "\033[36m" if i<=6 else "\033[32m" if i<=9 else "\033[33m" if i<=12 else "\033[31m"
level = ["\033[0m "+color+"|" if a>=i else "\033[0m " for a in amp_by_freq]
print("\033[0m "+"".join(level))
ソースコード
githubで公開しています.お試しあれ.