import util
import NMF
import chord
import NoteTemplate
import numpy as np
import warnings
warnings.simplefilter("ignore")
"PianoChord-70bpm.wav"のコードを解析してみます。
import IPython.display
IPython.display.Audio("PianoChord-70bpm.wav")
1.ピアノ音のテンプレートを、ノート音声から学習します。(ここではC1からB4までの4オクターブに限定します)
W = NoteTemplate.getNoteTemplates("audio_notes")
util.PlotTemplates(W)
2.コード解析したい音声をスペクトログラムに変換します。
S = util.LoadAudio("PianoChord-70bpm.wav")
util.PlotSpec(S[:1024,:])
3.行列Wを固定し、NMFアルゴリズムで行列Hを推定します。
_,H = NMF.nmf_beta(S,48,W.T,beta=0.5,iteration=50)
util.PlotPianoroll(H)
(しきい値でHを二値化してみます)
H_binary = (H / np.max(H)) > 0.2
util.PlotPianoroll(H_binary)
4.Hをビート単位で分割して、それぞれのコードを判定します。
segments = [np.sum(seg,axis=1) for seg in util.SegmentByBeat(H,70,4*4)]
chords = [chord.match_chord(seg/seg.max()) for seg in segments]
chords
['C:', 'C:', 'G:/B', 'G:/B', 'A:min', 'A:min', 'E:min/G', 'E:min/G', 'D:min', 'D:min', 'C#:aug', 'C#:aug', 'F:/C', 'F:/C', 'G:7', 'G:7']