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

sound_test_test.m
nsn=7; % number of simultanoise notes

%fcs=[60 59];
% fcs=ceil(60*rand(nsn,1));
% fcsr=sort(fcsr);
tm=5000;

load('w.mat');
%load('wn.mat');

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

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;


L=nen-nst+1;
%fab=cell(L,1);
fab=cell(L,3);
fcs1=(nst:nen)+49;

n0=100;
n01=4096;
n02=n01/2;
L=nen-nst+1;

n0max=min(lca)-n01-1;
n0min=100;

fcs1=(nst:nen)+49;

% 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

    
i60=1:60;

                            ca1=0;
                            ia=0;
                            tm=5000;
                            hwb=waitbar(0,' ');
                            tic;
                            for tc=1:tm
                                
                                rp=randperm(60);
                                r60=i60(rp(1:nsn));
                                fcs=r60';
                                %fcs=ceil(60*rand(nsn,1));
                                fcs=sort(fcs);

% sum:
st=zeros(n01,1);
for fcsc=1:length(fcs)
    %nst+49 -start note
    n0=n0min+(n0max-n0min)*rand;
    n0=round(n0);
    st=st+ca{fcs(fcsc)+nst+49-1}(n0:n0+n01-1);
end
%sound(st,44100)

fca=fft(st);
fabt=abs(fca(fmni:fmxi));
%fabt=real(fca(fmni:fmxi));
%fabt=fca(fmni:fmxi);
%fabt=fabt/sum(fabt);
fabt=fabt/sqrt(sum(abs(fabt).^2));

% see covariations:
cmv=zeros(L,1);
for fc=1:L
    cmv(fc)=sum(w(:,fc).*fabt);
end

% plot(cmv,'xg');

[tmp ind]=sort(cmv, 'descend');
fcsr=ind(1:length(fcs));
fcsr=sort(fcsr);

if all(fcsr==fcs)
    ca1=ca1+1;
else
    ia=ia+1;
end


        jr=tc/tm;

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

        waitbar(jr,hwb,['ca: ' num2str(100*ca1/(ca1+ia),'%3.4f') ' %  ' '  et:' num2str(et,'%10.0f')]);
                            end

Contact us at files@mathworks.com