annotate mirex2012-matlab/doMultiF0.m @ 135:8db5e4ab56ce

Ground-truth data in CSV and lab format, converted from the MIDI using Sonic Visualiser and then to lab using the script here
author Chris Cannam
date Thu, 08 May 2014 12:59:09 +0100
parents e92376d450b0
children
rev   line source
Chris@2 1 function [] = doMultiF0(inputFile,outputFile)
Chris@2 2
Chris@2 3
Chris@2 4 % Transcribe file
Chris@2 5 fprintf('%s',['Preprocessing............']);
Chris@2 6 [ph pz sumY] = transcriptionMultipleTemplates(inputFile,12,1.1,1.3);
Chris@2 7 fprintf('\n');
Chris@45 8
Chris@2 9 fprintf('%s',['Postprocessing...........']);
Chris@2 10 pianoRoll = repmat(sumY,88,1).*pz(1:88,:);
Chris@45 11
Chris@45 12 pfid = fopen('pitchmatrix.lab','w');
Chris@45 13 for i=1:size(pianoRoll,2)
Chris@45 14 fprintf(pfid, '%.2f ', pianoRoll(1:88,i));
Chris@45 15 fprintf(pfid, '\n');
Chris@45 16 end;
Chris@45 17 fclose(pfid);
Chris@45 18
Chris@2 19 pianoRoll = pianoRoll';
Chris@2 20 for j=[1:15 74:88] pianoRoll(:,j)=0; end;
Chris@2 21 pianoRoll = medfilt1(pianoRoll,3);
Chris@2 22
Chris@2 23
Chris@2 24 % Max polyphony 5
Chris@2 25 [B,IX] =sort(pianoRoll,2,'descend');
Chris@2 26 tempPianoRoll = zeros(size(pianoRoll,1),88);
Chris@2 27 for j=1:size(pianoRoll,1) for k=1:5 tempPianoRoll(j,IX(j,k)) = B(j,k); end; end;
Chris@2 28 pianoRoll = tempPianoRoll;
Chris@2 29
Chris@2 30
Chris@2 31 % Expand piano-roll and perform thresholding
Chris@2 32 expandedPianoRoll = zeros(4*size(pianoRoll,1),88);
Chris@2 33 for j=1:4*size(pianoRoll,1)
Chris@2 34 expandedPianoRoll(j,:) = pianoRoll(floor((j-1)/4)+1,:);
Chris@2 35 end;
Chris@2 36 finalPianoRoll = (expandedPianoRoll>4.8)';
Chris@2 37
Chris@2 38
Chris@2 39 % Create output and perform minimum duration pruning
Chris@2 40 auxPianoRoll = diff([zeros(1,88); finalPianoRoll'; zeros(1,88);],1); k=0;
Chris@2 41 for i=1:88
Chris@2 42 onsets = find(auxPianoRoll(:,i)==1);
Chris@2 43 offsets = find(auxPianoRoll(:,i)==-1);
Chris@2 44 for j=1:length(onsets)
Chris@2 45 if((offsets(j)/100-0.01) - (onsets(j)/100) > 0.05)
Chris@2 46 k=k+1;
Chris@2 47 nmat(k,1) = onsets(j)/100;
Chris@2 48 nmat(k,2) = offsets(j)/100-0.01;
Chris@2 49 nmat(k,3) = 27.5*2.^((( i-1)*10 )/120);
Chris@2 50 end;
Chris@2 51 end;
Chris@2 52 end;
Chris@2 53 nmat = sortrows(nmat,1);
Chris@2 54
Chris@2 55
Chris@2 56 % Print output
Chris@2 57 fid=fopen(outputFile,'w');
Chris@2 58 for i=1:size(nmat,1)
Chris@2 59 fprintf(fid,'%.2f\t%.2f\t%.2f\n',nmat(i,1),nmat(i,2),nmat(i,3));
Chris@2 60 end;
Chris@2 61 fclose(fid);
Chris@2 62 fprintf('%s','done');
Chris@2 63 fprintf('\n');
Chris@2 64
Chris@2 65
Chris@2 66 exit;