annotate mirex2012-matlab/doMultiF0.m @ 372:af71cbdab621 tip

Update bqvec code
author Chris Cannam
date Tue, 19 Nov 2019 10:13:32 +0000
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;