Mercurial > hg > silvet
diff mirex2012-matlab/doMultiF0.m @ 2:8017dd4a650d
Add MIREX 2012 code
author | Chris Cannam |
---|---|
date | Wed, 19 Mar 2014 09:09:23 +0000 |
parents | |
children | e92376d450b0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mirex2012-matlab/doMultiF0.m Wed Mar 19 09:09:23 2014 +0000 @@ -0,0 +1,57 @@ +function [] = doMultiF0(inputFile,outputFile) + + +% Transcribe file +fprintf('%s',['Preprocessing............']); +[ph pz sumY] = transcriptionMultipleTemplates(inputFile,12,1.1,1.3); +fprintf('\n'); +fprintf('%s',['Postprocessing...........']); +pianoRoll = repmat(sumY,88,1).*pz(1:88,:); +pianoRoll = pianoRoll'; +for j=[1:15 74:88] pianoRoll(:,j)=0; end; +pianoRoll = medfilt1(pianoRoll,3); + + +% Max polyphony 5 +[B,IX] =sort(pianoRoll,2,'descend'); +tempPianoRoll = zeros(size(pianoRoll,1),88); +for j=1:size(pianoRoll,1) for k=1:5 tempPianoRoll(j,IX(j,k)) = B(j,k); end; end; +pianoRoll = tempPianoRoll; + + +% Expand piano-roll and perform thresholding +expandedPianoRoll = zeros(4*size(pianoRoll,1),88); +for j=1:4*size(pianoRoll,1) + expandedPianoRoll(j,:) = pianoRoll(floor((j-1)/4)+1,:); +end; +finalPianoRoll = (expandedPianoRoll>4.8)'; + + +% Create output and perform minimum duration pruning +auxPianoRoll = diff([zeros(1,88); finalPianoRoll'; zeros(1,88);],1); k=0; +for i=1:88 + onsets = find(auxPianoRoll(:,i)==1); + offsets = find(auxPianoRoll(:,i)==-1); + for j=1:length(onsets) + if((offsets(j)/100-0.01) - (onsets(j)/100) > 0.05) + k=k+1; + nmat(k,1) = onsets(j)/100; + nmat(k,2) = offsets(j)/100-0.01; + nmat(k,3) = 27.5*2.^((( i-1)*10 )/120); + end; + end; +end; +nmat = sortrows(nmat,1); + + +% Print output +fid=fopen(outputFile,'w'); +for i=1:size(nmat,1) + fprintf(fid,'%.2f\t%.2f\t%.2f\n',nmat(i,1),nmat(i,2),nmat(i,3)); +end; +fclose(fid); +fprintf('%s','done'); +fprintf('\n'); + + +exit;