LoginSignup
1
3

More than 1 year has passed since last update.

残プロ 第-50回 ~ターミナルでイコライザーを表示~

Posted at

イコライザーとは

音圧を周波数ごとに表示するやつです.

今回は,こういうの⇩をつくります.

Equalizer.gif

環境・使用ライブラリ

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で公開しています.お試しあれ.

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3