librosaで楽曲に含まれる12半音(クロマグラム)を表示してみる
しばらく、地図作成のことばかり書いてきましたが、音楽にも興味があるので、ちょっと地図の話は一旦中断し、
突然ですが、librosaで楽曲に含まれる12半音の頻度(クロマグラム)を表示してみる。
ピアノの鍵盤を見ると白鍵、黒鍵の1オクターブ12個のキーからなってますが、
クロマグラムとは、相異なる音名(クロマ)に対応する要素が音響信号にどのように含まれているか、簡単に言えば、オクターブ違いの音も含めて上の鍵盤のどのキー音がどのぐらいの分量で含まれているかをグラフ化したもので、パワースペクトルにバンドパスフィルタをかけて時間方向に積分。オクターブ違いの同じ音名は全て積算して求まるそうですが、とりあえず、
宇宙よりも遠い場所 ED 「ここから、ここから」という楽曲に含まれている
12半音の音がどのように含まれているかをマニュアルを見ながらプロットしてみました。
ということで、しばらく librosaなどで実際にソースを動かしてみて楽曲分析のお勉強をしてみようと思います。
ソース
import matplotlib.pyplot as plt import librosa import librosa.display # mp3読み込み y, sr = librosa.load('0.mp3') # 音声信号をハーモニーとパーカッシブに分離 y_harmonic, y_percussive = librosa.effects.hpss(y) # パワースペクトログラムからクロマグラムを計算 chroma_stft = librosa.feature.chroma_stft(y=y_harmonic, sr=sr, n_chroma=12, n_fft=4096) # Constant-Qからクロマグラムを計算 chroma_cq = librosa.feature.chroma_cqt(y=y_harmonic, sr=sr) # CENSからクロマグラムを計算 chroma_cens = librosa.feature.chroma_cens(y=y_harmonic, sr=sr) # chroma_stftのプロット plt.figure(figsize=(12,10)) plt.subplot(3,1,1) librosa.display.specshow(chroma_stft, y_axis='chroma') plt.title('chroma_stft') plt.colorbar() # chroma_cqtのプロット plt.subplot(3,1,2) librosa.display.specshow(chroma_cq, y_axis='chroma') plt.title('chroma_cqt') plt.colorbar() # chroma_censのプロット plt.subplot(3,1,3) librosa.display.specshow(chroma_cens, y_axis='chroma', x_axis='time') plt.title('chroma_cens') plt.colorbar() plt.tight_layout() #plt.savefig('2.jpg', dpi=72) plt.show()