annotate mirex2012-matlab/doMultiF0.m @ 167:416b555df3b2 finetune

More on returning fine tuning (but we're treating different shifts of the same pitch as different notes at the moment which is not right)
author Chris Cannam
date Tue, 20 May 2014 17:49:07 +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;