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