#!/usr/bin/env python # coding: utf-8 # In[1]: import util import NMF import chord import NoteTemplate import numpy as np import warnings warnings.simplefilter("ignore") # "PianoChord-70bpm.wav"のコードを解析してみます。 # In[2]: import IPython.display IPython.display.Audio("PianoChord-70bpm.wav") # 1.ピアノ音のテンプレートを、ノート音声から学習します。(ここではC1からB4までの4オクターブに限定します) # In[3]: W = NoteTemplate.getNoteTemplates("audio_notes") util.PlotTemplates(W) # 2.コード解析したい音声をスペクトログラムに変換します。 # In[4]: S = util.LoadAudio("PianoChord-70bpm.wav") util.PlotSpec(S[:1024,:]) # 3.行列Wを固定し、NMFアルゴリズムで行列Hを推定します。 # In[5]: _,H = NMF.nmf_beta(S,48,W.T,beta=0.5,iteration=50) util.PlotPianoroll(H) # (しきい値でHを二値化してみます) # In[6]: H_binary = (H / np.max(H)) > 0.2 util.PlotPianoroll(H_binary) # 4.Hをビート単位で分割して、それぞれのコードを判定します。 # In[7]: 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] # In[8]: chords