diff toolboxes/MIRtoolbox1.3.2/MIRToolbox/mireval.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/MIRtoolbox1.3.2/MIRToolbox/mireval.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,498 @@
+function v = mireval(d,file,single,export)
+%   mireval(d,filename) applies the mirdesign object d to the audio file
+%       named filename.
+%   mireval(d,'Folder') applied the mirdesign object to each audio files in
+%       the current directory.
+%   mireval(d,'Folders') applied the mirdesign object recursively to the
+%       subfolders.
+%   Optional argument: mireval(...,'Single') only keeps the first
+%       output when several output are returned for a given mirdesign
+%       object.
+
+% mireval performs the actual evaluation of the design flowchart.
+%   If 'Folder' is used, the evaluation is carried out for each audio file
+%       successively.
+%   If d is a structure or a cell array, evaluate each component
+%       separately.
+%   The evaluation starts with a top-down traversal of the design flowchart
+%       (evaleach).
+
+%if not(isa(d,'mirdesign'))
+%    error('ERROR IN MIREVAL: the first input should be a flowchart (using ''Design'')')
+%end
+if not(ischar(file))
+    error('ERROR IN MIREVAL: the second input should be a file name or ''Folder''')
+end
+
+if nargin<3
+    single = [];
+end
+if nargin<4
+    export = [];
+end
+
+% First, let's look at the content of the file(s): size, sampling rate,
+% etc.
+w = [];    % Array containing the index positions of the starting and ending dates.
+s = getsize(d);
+ch = 1;
+if strcmpi(file,'Folder') || strcmpi(file,'Folders')
+    [l w sr a] = evalfolder('',s,0,[],[],{},strcmpi(file,'Folders'));
+    if l == 0
+        disp('No sound file detected in this folder.')
+    end
+elseif length(file)>3 && strcmpi(file(end-3:end),'.txt')
+    a = importdata(file);
+    l = length(a);
+    for i = 1:l
+        [di,tpi,fpi,fi] = mirread([],a{i},0,0,0);
+        if not(isempty(s))
+            interval = s(1:2);
+            if s(3)
+                interval = round(interval*fi)+1;
+            end
+            if s(4) == 1
+                interval = interval+round(di/2);
+            elseif s(4) == 2
+                interval = interval+di;
+            end
+            w(:,i) = min(max(interval,1),di);
+        else
+            w(:,i) = [1;di];
+        end
+        if getsampling(d)
+            sr(i) = getsampling(d);
+        else
+            sr(i) = fi;
+        end
+    end
+else
+    l = 1;
+    [d1,tp1,fp1,f1,b,n,ch] = mirread([],file,0,0,0);
+    if length(s)>1
+        interval = s(1:2)';
+        if s(3)
+            interval = round(interval*f1)+1;
+        end
+        if s(4) == 1
+            interval = interval+round(d1/2);
+        elseif s(4) == 2
+            interval = interval+d1;
+        end
+        if d1 < interval(2)
+            warning('WARNING IN MIRAUDIO: The temporal region to be extracted exceeds the temporal extent of the whole audio file.'); 
+        end
+        w = min(max(interval,1),d1);
+    else
+        w = [1;d1];
+    end
+    if isa(d,'mirdesign') && getsampling(d)
+        sr = getsampling(d);
+    else
+        sr = f1;
+    end
+    a = {file};
+end
+
+if not(l)
+    v = [];
+    return
+end
+
+if isempty(export)
+    y = cell(1,l);
+end
+order = 1:l;
+if isa(d,'mirdesign') && isequal(get(d,'Method'),@mirplay)
+    op = get(d,'Option');
+    if isfield(op,'inc')
+        if not(isnumeric(op.inc))
+            op.inc = mirgetdata(op.inc);
+        end
+        [unused order] = sort(op.inc);
+    elseif isfield(op,'dec')
+        if not(isnumeric(op.inc))
+            op.inc = mirgetdata(op.inc);
+        end
+        [unused order] = sort(op.dec,'descend');
+    end
+    if isfield(op,'every')
+        order = order(1:op.every:end);
+    end
+    order = order(:)';
+end
+
+parallel = 0;
+if mirparallel
+    try
+        matlabpool;
+        parallel = 1;
+        mirwaitbar(0)
+        mirverbose(0)
+    end
+end
+
+if parallel
+    %   The evaluation is carried out for each audio file successively
+    %       (or in parallel).
+    parfor i = 1:l
+        if l > 1
+            fprintf('\n')
+            display(['*** File # ',num2str(i),'/',num2str(l),': ',a{i}]);
+        end
+        tic
+        yi = evalaudiofile(d,a{i},sr(i),w(:,i),{},0,i,single,'',ch);
+        toc
+        y{i} = yi;
+        if not(isempty(export))
+            if strncmpi(export,'Separately',10)
+                filename = a{i};
+                filename(filename == '/') = '.';
+                filename = [filename export(11:end)];
+                if i == 1
+                    mkdir('Backup');
+                end
+                mirexport(filename,yi);
+            elseif i==1
+                mirexport(export,yi);
+            else
+                mirexport(export,yi,'#add');
+            end
+        end
+        clear yi
+    end
+else
+    %   The evaluation is carried out for each audio file successively.
+    isstat = isfield(d,'Stat');
+    for i = 1:length(order)
+        f = order(i);
+        if l > 1
+            fprintf('\n')
+            display(['*** File # ',num2str(i),'/',num2str(l),': ',a{f}]);
+        end
+        tic
+        yf = evalaudiofile(d,a{f},sr(f),w(:,f),{},0,f,single,'',ch);
+        toc
+        y{f} = yf;
+        if not(isempty(export))
+            if strncmpi(export,'Separately',10)
+                filename = a{f};
+                filename(filename == '/') = '.';
+                filename = ['Backup/' filename export(11:end)];
+                if i == 1
+                    mkdir('Backup');
+                end
+                mirexport(filename,yf);
+            elseif i==1
+                mirexport(export,yf);
+            else
+                mirexport(export,yf,'#add');
+            end
+        end
+        clear yf
+    end
+end
+
+%if isempty(export)
+    v = combineaudiofile(a,isstat,y{:});
+%else
+%    v = [];
+%end
+    
+
+function v = evalaudiofile(d,file,sampling,size,struc,istmp,index,single,name,ch)
+% Now let's perform the analysis (or analyses) on the different files.
+%   If d is a structure or a cell array, evaluate each component
+%       separately.
+if isstruct(d)
+    v = struct;
+    if istmp
+        struc.tmp = struct;
+    end
+    isstat = isfield(d,'Stat');
+    if isstat
+        d = rmfield(d,'Stat');
+    end
+    fields = fieldnames(d);
+    for fi = 1:length(fields)
+        fieldname = fields{fi};
+        field = d.(fieldname);
+        display(['*******',fieldname,'******']);
+        if isstat
+            if isa(field,'mirstruct')
+                field = set(field,'Stat',1);
+            elseif isa(field,'mirdesign')
+                field = mirstat(field,'FileNames',0);
+            else
+                field.Stat = 1;
+            end
+        end
+        res = evalaudiofile(field,file,sampling,size,struc,istmp,index,...
+                                                     single,fieldname,ch);
+        if not(isempty(single)) && not(isequal(single,0)) && ...
+                iscell(res) && isa(field,'mirdesign')
+            res = res{1};
+        end
+        v.(fieldname) = res;
+        if istmp
+            struc.tmp.(fieldname) = res;
+        end
+        if fi == 1
+            if isfield(res,'Class')
+                v.Class = res.Class;
+                v.(fieldname) = rmfield(res,'Class');
+            end
+        end
+    end
+    if isfield(v,'tmp')
+        v = rmfield(v,'tmp');
+    end
+elseif iscell(d)
+    l = length(d);
+    v = cell(1,l);
+    for j = 1:l
+        v{j} = evalaudiofile(d{j},file,sampling,size,struc,istmp,index,...
+                                       single,[name,num2str(j)],ch);
+    end
+elseif isa(d,'mirstruct') && isempty(get(d,'Argin'))
+    mirerror('MIRSTRUCT','You should always use tmp fields when using mirstruct. Else, just use struct.');
+else
+    if get(d,'SeparateChannels')
+        v = cell(1,ch);
+        for i = 1:ch
+            d = set(d,'File',file,'Sampling',sampling,'Size',size,...
+                      'Eval',1,'Index',index,'Struct',struc,'Channel',i);
+            % For that particular file or this particular feature, let's begin the
+            % actual evaluation process.
+            v{i} = evaleach(d,single,name);    
+            % evaleach performs a top-down traversal of the design flowchart.
+        end
+        v = combinechannels(v);
+    else
+        d = set(d,'File',file,'Sampling',sampling,'Size',size,...
+                  'Eval',1,'Index',index,'Struct',struc);
+        % For that particular file or this particular feature, let's begin the
+        % actual evaluation process.
+        v = evaleach(d,single,name);    
+        % evaleach performs a top-down traversal of the design flowchart.
+    end
+end
+
+
+function y = combinechannels(c)
+y = c{1};
+v = get(y,'Data');
+for h = 2:length(c)
+    d = get(c{h},'Data');
+    for i = 1:length(d)
+        if isa(y,'mirmidi')
+            d{i}(:,3) = h;
+            v{i} = sortrows([v{i};d{i}]);
+        else
+            for j = 1:length(d{i})
+                v{i}{j}(:,:,h) = d{i}{j};
+            end
+        end
+    end
+end
+y = set(y,'Data',v);
+
+
+function c = combineaudiofile(filename,isstat,varargin) % Combine output from several audio files into one single
+c = varargin{1};    % The (series of) input(s) related to the first audio file
+if isempty(c)
+    return
+end
+if isstruct(c)
+    %fields = fieldnames(c);
+    for j = 1:length(varargin)
+        if j == 1
+            fields = fieldnames(varargin{1});
+        else
+            fields = union(fields,fieldnames(varargin{j}));
+        end
+    end
+    for i = 1:length(fields)
+        field = fields{i};
+        v = {};
+        for j = 1:length(varargin)
+            if isfield(varargin{j},field)
+                v{j} = varargin{j}.(field);
+            else
+                v{j} = NaN;
+            end
+        end
+        c.(field) = combineaudiofile('',isstat,v{:});
+        if strcmp(field,'Class')
+            c.Class = c.Class{1};
+        end
+    end
+    if not(isempty(filename)) && isstat
+        c.FileNames = filename;
+    end
+    return
+end
+if ischar(c)
+    c = varargin;
+    return
+end
+if (not(iscell(c)) && not(isa(c,'mirdata')))
+    for j = 1:length(varargin)
+        if j == 1
+            lv = size(varargin{j},1);
+        else
+            lv = max(lv,size(varargin{j},1));
+        end
+    end
+    c = NaN(lv,length(varargin));
+    for i = 1:length(varargin)
+        if not(isempty(varargin{i}))
+            c(1:length(varargin{i}),i) = varargin{i};
+        end
+    end
+    return
+end
+if (iscell(c) && not(isa(c{1},'mirdata')))
+    for i = 1:length(c)
+        v = cell(1,nargin-2);
+        for j = 1:nargin-2
+            v{j} = varargin{j}{i};
+        end
+        c{i} = combineaudiofile(filename,isstat,v{:});
+    end
+    return
+end
+if not(iscell(c))
+    c = {c};
+end
+nv = length(c); % The number of input variables for each different audio file
+for j = 1:nv % Combine files for each different input variable
+    v = varargin;
+    for i = 1:length(varargin)
+        if iscell(v{i})
+            v{i} = v{i}{j};
+        end
+    end
+    if not(isempty(v)) && not(isempty(v{1}))
+        c{j} = combine(v{:});
+    end
+end
+
+
+function s = getsize(d)
+if isa(d,'mirstruct')
+    d = get(d,'Data');
+    if isempty(d)
+        error('ERROR in MIREVAL: Your mirstruct object does not have any field (besides tmp).');
+        s = 0;
+    else
+        s = getsize(d{1});
+    end
+elseif isstruct(d)
+    fields = fieldnames(d);
+    s = getsize(d.(fields{1}));
+elseif iscell(d)
+    s = getsize(d{1});
+else
+    s = get(d,'Size');  % Starting and ending dates in seconds.
+end
+
+
+function d2 = sortnames(d,d2,n)
+if length(n) == 1
+    d2(end+1) = d(1);
+    return
+end
+first = zeros(1,length(n));
+for i = 1:length(n)
+    if isempty(n{i})
+        first(i) = -Inf;
+    else
+        ni = n{i}{1};
+        if ischar(ni)
+            first(i) = ni-10058;
+        else
+            first(i) = ni;
+        end
+    end
+end
+[o i] = sort(first);
+n = {n{i}};
+d = d(i);
+i = 0;
+while i<length(n)
+    i = i+1;
+    if isempty(n{i})
+        d2(end+1) = d(i);
+    else
+        dmp = (d(i));
+        tmp = {n{i}(2:end)};
+        while i+1<=length(n) && n{i+1}{1} == n{i}{1};
+            i = i+1;
+            dmp(end+1) = d(i);
+            tmp{end+1} = n{i}(2:end);
+        end
+        d2 = sortnames(dmp,d2,tmp);
+    end
+end
+
+
+function [l w sr a] = evalfolder(path,s,l,w,sr,a,folders)
+if not(isempty(path))
+    path = [path '/'];
+end
+dd = dir;
+dn = {dd.name};
+nn = cell(1,length(dn));  % Modified file names
+for i = 1:length(dn)      % Each file name is considered
+    j = 0;
+    while j<length(dn{i})   % Each successive character is modified if necessary
+        j = j+1;
+        tmp = dn{i}(j) - '0';
+        if tmp>=0 && tmp<=9
+            while j+1<length(dn{i}) && dn{i}(j+1)>='0' && dn{i}(j+1)<='9'
+                j = j+1;
+                tmp = tmp*10 + (dn{i}(j)-'0');
+            end
+        else
+            tmp = dn{i}(j);
+        end
+        nn{i}{end+1} = tmp;
+    end
+end
+dd = sortnames(dd,[],nn);
+for i = 1:length(dd);
+    nf = dd(i).name;
+    if folders && dd(i).isdir
+        if not(strcmp(nf(1),'.'))
+            cd(dd(i).name)
+            [l w sr a] = evalfolder([path nf],s,l,w,sr,a,1);
+            %l = l + l2;
+            %w = [w w2];
+            %sr = [sr sr2];
+            %a = [a a2];
+            cd ..
+        end
+    else
+        [di,tpi,fpi,fi,bi,ni] = mirread([],nf,0,1,0);
+        if not(isempty(ni))
+            l = l+1;
+            if not(isempty(s))
+                interval = s(1:2);
+                if s(3)
+                    interval = round(interval*fi)+1;
+                end
+                if s(4) == 1
+                    interval = interval+round(di/2);
+                elseif s(4) == 2
+                    interval = interval+di;
+                end
+                w(:,l) = min(max(interval,1),di);
+            else
+                w(:,l) = [1;di];
+            end
+            sr(l) = fi;
+            a{l} = [path ni];
+        end
+    end
+end
\ No newline at end of file