プログラム日記φ(..)

おもにPython関係のプログラムメモ

librosaで楽曲に含まれる12半音(クロマグラム)を表示してみる

しばらく、地図作成のことばかり書いてきましたが、音楽にも興味があるので、ちょっと地図の話は一旦中断し、

 

突然ですが、librosaで楽曲に含まれる12半音の頻度(クロマグラム)を表示してみる。

 

ピアノの鍵盤を見ると白鍵、黒鍵の1オクターブ12個のキーからなってますが、

 

f:id:memomemokun:20190322211124g:plain

 

クロマグラムとは、相異なる音名(クロマ)に対応する要素が音響信号にどのように含まれているか、簡単に言えば、オクターブ違いの音も含めて上の鍵盤のどのキー音がどのぐらいの分量で含まれているかをグラフ化したもので、パワースペクトルにバンドパスフィルタをかけて時間方向に積分。オクターブ違いの同じ音名は全て積算して求まるそうですが、とりあえず、

 

宇宙よりも遠い場所 ED  「ここから、ここから」という楽曲に含まれている

 

 

 

12半音の音がどのように含まれているかをマニュアルを見ながらプロットしてみました。

librosaで楽曲に含まれる12半音(クロマベクトル)を表示してみる

librosaで楽曲に含まれる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()