idamnjanovic@8: function reconstructed=SMALL_midiGenerate(V, Problem) ivan@155: %% Reconstruction of midi file from representation in the given dictionary ivan@128: % ivan@128: % SMALL_midiGenerate is a part of SMALLbox and can be use to reconstruct ivan@128: % a midi file given representation of the training set (V) in the ivan@128: % dictionary Problem.A. ivan@128: % Output is reconstructed structure with two fields: ivan@128: % - reconstructed.notes - matrix with transcribed notes ivan@128: % - reconstructed.midi - midi representation of transcription ivan@128: idamnjanovic@24: % idamnjanovic@24: % Centre for Digital Music, Queen Mary, University of London. idamnjanovic@24: % This file copyright 2009 Ivan Damnjanovic. idamnjanovic@24: % idamnjanovic@24: % This program is free software; you can redistribute it and/or idamnjanovic@24: % modify it under the terms of the GNU General Public License as idamnjanovic@24: % published by the Free Software Foundation; either version 2 of the idamnjanovic@24: % License, or (at your option) any later version. See the file idamnjanovic@24: % COPYING included with this distribution for more information. idamnjanovic@24: %% idamnjanovic@8: U=Problem.A; % Dictionary used for representation idamnjanovic@8: fs=Problem.fs; % Sampling rate idamnjanovic@8: f=Problem.f; % vector of frequencies at wihch spectrogram is computed idamnjanovic@8: ivan@155: ts=(Problem.windowSize*(1-Problem.overlap))/fs; %size of an analysis frame in seconds idamnjanovic@8: idamnjanovic@8: %% idamnjanovic@8: % Components pitch estimation using modified SWIPE algorithm by Arthuro idamnjanovic@8: % Camacho idamnjanovic@8: % idamnjanovic@8: % Columns of matrix U are spectrograms of the notes learned from the idamnjanovic@8: % training set. We are estimating pitches of these notes by also idamnjanovic@8: % restricting pitch values to the one of the 88 piano notes. idamnjanovic@8: idamnjanovic@8: pitch=zeros(size(U,2),1); idamnjanovic@8: idamnjanovic@8: for i=1:size(U,2) idamnjanovic@8: idamnjanovic@8: pitch(i) = SMALL_swipe(U(:,i),fs, f, [27.50 8192], 1/12); idamnjanovic@8: idamnjanovic@8: end idamnjanovic@8: idamnjanovic@8: %% idamnjanovic@8: % If some of columns of U have the same pitch, their contribution to the idamnjanovic@8: % score (matrix V) is summed. idamnjanovic@8: idamnjanovic@8: [Ps,idx]=sort(pitch); idamnjanovic@8: ndp=1; idamnjanovic@8: Pd(ndp)=Ps(1); idamnjanovic@8: Vnew(ndp,:)=V(idx(1),:); idamnjanovic@8: for i=2:88 idamnjanovic@8: if Ps(i)> Ps(i-1) idamnjanovic@8: idamnjanovic@8: ndp=ndp+1; idamnjanovic@8: Vnew(ndp,:)=V(idx(i),:); idamnjanovic@8: Pd(ndp)=Ps(i); idamnjanovic@8: idamnjanovic@8: else idamnjanovic@8: Vnew(ndp,:)=Vnew(ndp,:)+V(idx(i),:); idamnjanovic@8: end idamnjanovic@8: end idamnjanovic@8: %% idamnjanovic@8: % Generate midi matrix idamnjanovic@8: idamnjanovic@8: midx=0; idamnjanovic@8: for i=1:ndp idamnjanovic@8: idamnjanovic@8: % Threshold for finding onsets and offsets of notes idamnjanovic@8: idamnjanovic@8: thr=mean(Vnew(i,:));%+std(Vnew(i,:)); idamnjanovic@8: idamnjanovic@8: if(Pd(i)~=0) idamnjanovic@8: for j=1:size(Vnew,2) idamnjanovic@8: if Vnew(i,j)1) idamnjanovic@8: if (Vnew(i,j-1)==1) idamnjanovic@8: try idamnjanovic@8: M(midx,6)=(j-1)*ts; idamnjanovic@8: if (M(midx,6)-M(midx,5))<2*ts idamnjanovic@8: midx=midx-1; idamnjanovic@8: end idamnjanovic@8: catch idamnjanovic@8: pause; idamnjanovic@8: end idamnjanovic@8: end idamnjanovic@8: end idamnjanovic@8: else idamnjanovic@8: Vnew(i,j)=1; idamnjanovic@8: if(j>1) idamnjanovic@8: if (Vnew(i,j-1)==0) idamnjanovic@8: midx=midx+1; idamnjanovic@8: M(midx,1)=1; idamnjanovic@8: M(midx,2)=1; idamnjanovic@8: M(midx,3)=69 +round( 12 *log2(Pd(i)/440)); idamnjanovic@8: M(midx,4)=80; idamnjanovic@8: M(midx,5)=(j-1)*ts; idamnjanovic@8: end idamnjanovic@8: else idamnjanovic@8: midx=midx+1; idamnjanovic@8: M(midx,1)=1; idamnjanovic@8: M(midx,2)=1; idamnjanovic@8: M(midx,3)=69 + round(12 *log2(Pd(i)/440)); idamnjanovic@8: M(midx,4)=80; idamnjanovic@8: M(midx,5)=0; idamnjanovic@8: end idamnjanovic@8: end idamnjanovic@8: end idamnjanovic@8: if M(midx,6)==0 idamnjanovic@8: M(midx,6)=(j-1)*ts; idamnjanovic@8: end idamnjanovic@8: end idamnjanovic@8: end idamnjanovic@8: idamnjanovic@8: M=sortrows(M,5); idamnjanovic@8: reconstructed.notes=M; idamnjanovic@8: reconstructed.midi = matrix2midi(M);