image thumbnail
from Piano notes recognition research by Maxim Vedenyov
try to define notes from its sound

improve_w.m
global L fc fab ind

nsn=4; % number of simultanoise notes

nst=-24; % start note
nen=35; % end note

load('w.mat');

disp(' ');
disp('range:');
disp([number2note(nst) '   ' number2note(nen)]);
disp(['note numbers: ' num2str(nst) '  ' num2str(nen)]);
disp(['note order numbers: ' num2str(nst+49) '  ' num2str(nen+49)]);

Fs=44100;
dr=dir('*.wav');
if length(dr)>0
    nm=[];
    for fc=1:length(dr)
        fln=dr(fc).name;
        lfln=length(fln);
        ns=fln(1:lfln-4);
        nm=[nm str2num(ns)];
    end
    [nms ind]=sort(nm);

    L=length(dr);
    ca=cell(L,1);
    lca=zeros(L,1);
    for fc=1:length(dr)
        [s1 Fs1]=wavread(dr(ind(fc)).name);
        s=resample(s1,2,1);
        ca{fc}=s;
        lca(fc)=length(s);
     
    end
    %soundsc(ca,44100);
    
end

Fs=Fs1*2;

% make equal length specters
%t01=0.1;
%n01=round(t01*Fs);
n01=4096;
n02=n01/2;

% for spectrum cut (not need all):
fmx=440*2^((nen+1)/12); % maximal frequency
fmxi=round(n02*fmx/(Fs/2)); % maximal index
fmn=440*2^((nst-1)/12); % maximal frequency
fmni=round(n02*fmn/(Fs/2)); % minimal index
nfi=fmxi-fmni+1; % number of elements in cuted spectrum

%n0=8000;
n00=100;
n0=100;
L=nen-nst+1;
%fab=cell(L,1);
fab=cell(L,3);
fcs=(nst:nen)+49;
for sc=1:3
    fc11=1;
    for fc=fcs
        i1=n00+1+(sc-1)*n01;
        i2=n00+sc*n01;
        lcat=length(ca{fc});
        if i2>lcat;
            i2=lcat;
            i1=i2-n01+1;
        end
        %catmp=ca{fc}(n0:n0+n01-1);
        catmp=ca{fc}(i1:i2);
        %catmp=ca{fc}(n0:n0+n01-1);
        fca=fft(catmp);
        %fabt=abs(fca(1:(n01/2)));
        fabt=abs(fca(fmni:fmxi));
        fab{fc11,sc}=fabt/sum(fabt);

        fc11=fc11+1;
    end
end

cl=[1 0 0;
    0 1 0;
    0 0 1;
    0 0 0;
    0.5 0.5 0];

% ii=1:nsnc; % start position of indexes, array(ind(ii(...)))
% hps=zeros(1,nsnc);
% for n1=1:nsnc
%     hps(n1)=plot(ii(n1),0,'x');
%     hold on;
%     set(hps(n1),'color',cl(n1,:));
% end
% xlim([0 L]);
% drawnow;

smc=0; % simullar counter
nv=1; % number of variants
nvm=25852861;
hwb=waitbar(0,' ');
tic;
sma=cell(1,nsn-1); % simular notes
%sma{1} 2-simulatniuse
%sma{2} 3-simulatniuse
%sma{3} 4-simulatniuse
for nsnc=2:nsn % 2-simulatniuse, 3-simulatniuse, 4-simulatniuse
    sma{nsnc-1}=[];
    %for nsnc=2
    for fc=1:L
        ind=find((1:L)~=fc); % exclude itself

        
        ow=sum(w(:,fc).*fab{fc,1});
        
        ii=1:nsnc; % start position of indexes, array(ind(ii(...)))
        while true
            
            % processing:
            % sum:
            st=zeros(n01,1);
            for inds=ind(ii)
                %nst+49 -start note
                %n0=n0min+(n0max-n0min)*rand;
                %n0=round(n0);
                st=st+ca{inds+nst+49-1}(n0:n0+n01-1);
            end
            
            fca=fft(st);
            fabt=abs(fca(fmni:fmxi));
            fabt=fabt/sum(fabt);
            
            nw=sum(w(:,fc).*fabt);
            if nw>ow
                smc=smc+1;
                sma{nsnc-1}=[sma{nsnc-1};   [fc  ind(ii)  ow  nw]];
            end
            
            
            
            
            if mod(nv,5000)==0
                jr=nv/nvm;

                toc1=toc;
                v=jr/toc1; % velosity
                et=(1-jr)/v; % estimated time

                waitbar(jr,hwb,['jr: ' num2str(100*jr,'%3.2f') ' %  ' '  et:' num2str(et,'%10.0f') '  ' 'smc:' num2str(smc) '  ' 'nsnc:' num2str(nsnc)]);
            end
            
            nv=nv+1;
            %%if ii(1)>=45
            %    for n1=1:nsnc
            %        set(hps(n1),'XData',ii(n1));
            %    end
            %   %pause(0.01);
            %    drawnow;
            %%end
            
            
            
            % cange indexes:
            if ii(end)~=(L-1)
                ii(end)=ii(end)+1;
            else
                gbr=false; % global break
                for nb=(nsnc-1):-1:1
                    if (ii(nb+1)-ii(nb))>=2
                        % has space
                        ii(nb)=ii(nb)+1;
                        ii(nb+1)=ii(nb)+1; % return
                        break;
                    else
                        % no space:
                        if nb==1
                            gbr=true;
                            break;
                        end
                    end
                end
                if gbr
                    break;
                end
            end
        end
        
    end
end
jr=nv/nvm;
toc1=toc;
v=jr/toc1; % velosity
et=(1-jr)/v; % estimated time
waitbar(jr,hwb,['jr: ' num2str(100*jr,'%3.2f') ' %  ' '  et:' num2str(et,'%10.0f') '  ' 'smc:' num2str(smc) '  ' 'nsnc:' num2str(nsnc)]);

toc
nv

save('sma.mat','sma');

Contact us at files@mathworks.com