wolffd@0: function [orig during after] = miroptions(method,orig,specif,varg) wolffd@0: wolffd@0: DEFAULTFRAMELENGTH = .05; wolffd@0: DEFAULTFRAMEHOP = .5; wolffd@0: wolffd@0: % The options are determined during the bottom-up process design (see below). wolffd@0: wolffd@0: % During the following top-down evaluation initiation, the options being wolffd@0: % therefore already computed have simply been passed as fourth and fifth wolffd@0: % arguments of miroptions. wolffd@0: if not(isempty(varg)) && (isstruct(varg{1}) || isempty(varg{1})) wolffd@0: during = varg{1}; wolffd@0: if isstruct(varg{1}) wolffd@0: if isfield(during,'struct') wolffd@0: if isa(orig,'mirdesign') wolffd@0: orig = set(orig,'Struct',during.struct); wolffd@0: elseif iscell(orig) wolffd@0: for i = 1:length(orig) wolffd@0: if isa(orig{i},'mirdesign') wolffd@0: orig{i} = set(orig{i},'Struct',during.struct); wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: during = rmfield(during,'struct'); wolffd@0: end wolffd@0: end wolffd@0: if length(varg) > 1 wolffd@0: after = varg{2}; wolffd@0: else wolffd@0: after = []; wolffd@0: end wolffd@0: return wolffd@0: %elseif length(varg) > 1 && isstruct(varg{2}) wolffd@0: % during = varg{1}; wolffd@0: % after = varg{2}; wolffd@0: % return wolffd@0: %elseif length(varg) >= 1 && isempty(varg{1}) wolffd@0: % during = []; wolffd@0: % after = []; wolffd@0: % return wolffd@0: end wolffd@0: wolffd@0: wolffd@0: during = struct; wolffd@0: after = struct; wolffd@0: if isfield(specif,'option') wolffd@0: option = specif.option; wolffd@0: else wolffd@0: option = struct; wolffd@0: end wolffd@0: frame = []; wolffd@0: after = []; wolffd@0: fields = fieldnames(option); wolffd@0: persoframe = ''; wolffd@0: for i = 1:length(fields) wolffd@0: field = fields{i}; wolffd@0: if isfield(option.(field),'key') && ischar(option.(field).key) ... wolffd@0: && strcmpi(option.(field).key,'Frame') wolffd@0: persoframe = field; wolffd@0: during.(field).auto = 0; wolffd@0: end wolffd@0: if isfield(option.(field),'when') && ... wolffd@0: (strcmpi(option.(field).when,'After') || ... wolffd@0: strcmpi(option.(field).when,'Both')) wolffd@0: if isamir(orig,func2str(method)) ... wolffd@0: && not(strcmp(func2str(method),'miraudio')) wolffd@0: after.(field) = 0; wolffd@0: elseif strcmp(field,'detect') wolffd@0: %if haspeaks(orig) wolffd@0: % after.(field) = 0; wolffd@0: %else wolffd@0: after.(field) = 'Peaks'; wolffd@0: %end wolffd@0: elseif isfield(specif,'title') wolffd@0: if isa(orig,'mirdata') wolffd@0: title = get(orig,'Title'); wolffd@0: sameclass = (length(title) > length(specif.title) && ... wolffd@0: strcmp(title(1:length(specif.title)),specif.title)); wolffd@0: else wolffd@0: sameclass = strcmp(func2str(get(orig,'Method')),'mironsets'); wolffd@0: end wolffd@0: if sameclass wolffd@0: after.(field) = 0; wolffd@0: else wolffd@0: after.(field) = option.(field).default; wolffd@0: end wolffd@0: elseif isfield(option.(field),'default') wolffd@0: after.(field) = option.(field).default; wolffd@0: else wolffd@0: after.(field) = 0; wolffd@0: end wolffd@0: end wolffd@0: if not(isfield(option.(field),'when')) || strcmpi(option.(field).when,'Both') wolffd@0: if isfield(option.(field),'default') wolffd@0: if strcmpi(persoframe,field) wolffd@0: during.(field).length.val = option.(field).default(1); wolffd@0: during.(field).length.unit = 's'; wolffd@0: during.(field).hop.val = option.(field).default(2); wolffd@0: during.(field).hop.unit = '/1'; wolffd@0: else wolffd@0: during.(field) = option.(field).default; wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: i = 1; wolffd@0: while i <= length(varg) wolffd@0: arg = varg{i}; wolffd@0: if strcmpi(arg,'Frame') wolffd@0: frame.auto = isempty(persoframe); wolffd@0: frame.length.unit = 's'; wolffd@0: frame.hop.unit = '/1'; wolffd@0: if length(varg) > i && isnumeric(varg{i+1}) wolffd@0: i = i+1; wolffd@0: frame.length.val = varg{i}; wolffd@0: if length(varg) > i && ischar(varg{i+1}) && ... wolffd@0: (strcmpi(varg{i+1},'s') || strcmpi(varg{i+1},'sp')) wolffd@0: i = i+1; wolffd@0: frame.length.unit = varg{i}; wolffd@0: end wolffd@0: if length(varg) > i && isnumeric(varg{i+1}) wolffd@0: i = i+1; wolffd@0: frame.hop.val = varg{i}; wolffd@0: if length(varg) > i && ischar(varg{i+1}) && ... wolffd@0: (strcmpi(varg{i+1},'%') || strcmpi(varg{i+1},'/1') || ... wolffd@0: strcmpi(varg{i+1},'s') || strcmpi(varg{i+1},'sp')|| ... wolffd@0: strcmpi(varg{i+1},'Hz')) wolffd@0: i = i+1; wolffd@0: frame.hop.unit = varg{i}; wolffd@0: end wolffd@0: if not(frame.hop.val || strcmpi(frame.hop.unit,'Hz')) wolffd@0: mirerror(func2str(method),'The hop factor should be strictly positive.') wolffd@0: end wolffd@0: else wolffd@0: if not(isempty(persoframe)) wolffd@0: if isfield(option.(persoframe),'keydefault') wolffd@0: frame.hop.val = option.(persoframe).keydefault(2); wolffd@0: else wolffd@0: frame.hop.val = option.(persoframe).default(2); wolffd@0: end wolffd@0: elseif isfield(specif,'defaultframehop') wolffd@0: frame.hop.val = specif.defaultframehop; wolffd@0: else wolffd@0: frame.hop.val = DEFAULTFRAMEHOP; wolffd@0: end wolffd@0: end wolffd@0: else wolffd@0: if not(isempty(persoframe)) wolffd@0: if isfield(option.(persoframe),'keydefault') wolffd@0: frame.length.val = option.(persoframe).keydefault(1); wolffd@0: else wolffd@0: frame.length.val = option.(persoframe).default(1); wolffd@0: end wolffd@0: elseif isfield(specif,'defaultframelength') wolffd@0: frame.length.val = specif.defaultframelength; wolffd@0: else wolffd@0: frame.length.val = DEFAULTFRAMELENGTH; wolffd@0: end wolffd@0: if not(isempty(persoframe)) wolffd@0: if isfield(option.(persoframe),'keydefault') wolffd@0: frame.hop.val = option.(persoframe).keydefault(2); wolffd@0: else wolffd@0: frame.hop.val = option.(persoframe).default(2); wolffd@0: end wolffd@0: elseif isfield(specif,'defaultframehop') wolffd@0: frame.hop.val = specif.defaultframehop; wolffd@0: else wolffd@0: frame.hop.val = DEFAULTFRAMEHOP; wolffd@0: end wolffd@0: end wolffd@0: frame.eval = 0; wolffd@0: if not(isfield(option,'frame')) || ... wolffd@0: not(isfield(option.frame,'when')) || ... wolffd@0: strcmpi(option.frame.when,'Before') || ... wolffd@0: strcmpi(option.frame.when,'Both') wolffd@0: during.frame = frame; wolffd@0: end wolffd@0: if isfield(option,'frame') && ... wolffd@0: isfield(option.frame,'when') && ... wolffd@0: (strcmpi(option.frame.when,'After') || ... wolffd@0: strcmpi(option.frame.when,'Both')) wolffd@0: after.frame = frame; wolffd@0: end wolffd@0: else wolffd@0: match = 0; wolffd@0: k = 0; wolffd@0: while not(match) && k i && ... wolffd@0: (ischar(varg{i+1}) || varg{i+1} == 0) wolffd@0: if isfield(option.(field),'choice') wolffd@0: match2 = 0; wolffd@0: arg2 = varg{i+1}; wolffd@0: for j = option.(field).choice wolffd@0: if (ischar(j{1}) && strcmpi(arg2,j)) || ... wolffd@0: (not(ischar(j{1})) && isequal(arg2,j{1})) wolffd@0: match2 = 1; wolffd@0: i = i+1; wolffd@0: optionvalue = arg2; wolffd@0: end wolffd@0: end wolffd@0: if not(match2) wolffd@0: if isfield(option.(field),'keydefault') wolffd@0: optionvalue = option.(field).keydefault; wolffd@0: else wolffd@0: error(['SYNTAX ERROR IN ',func2str(method),... wolffd@0: ': Unexpected keyword after key ',arg'.']); wolffd@0: end wolffd@0: end wolffd@0: else wolffd@0: i = i+1; wolffd@0: optionvalue = varg{i}; wolffd@0: end wolffd@0: elseif isfield(option.(field),'keydefault') wolffd@0: optionvalue = option.(field).keydefault; wolffd@0: elseif isfield(option.(field),'default') wolffd@0: optionvalue = option.(field).default; wolffd@0: else wolffd@0: error(['SYNTAX ERROR IN ',func2str(method),... wolffd@0: ': A string should follow the key ',arg'.']); wolffd@0: end wolffd@0: elseif strcmpi(type,'Boolean') wolffd@0: if length(varg) > i && (isnumeric(varg{i+1}) || islogical(varg{i+1})) wolffd@0: i = i+1; wolffd@0: optionvalue = varg{i}; wolffd@0: elseif length(varg) > i && ischar(varg{i+1}) ... wolffd@0: && (strcmpi(varg{i+1},'on') || ... wolffd@0: strcmpi(varg{i+1},'yes')) wolffd@0: i = i+1; wolffd@0: optionvalue = 1; wolffd@0: elseif length(varg) > i && ischar(varg{i+1}) ... wolffd@0: && (strcmpi(varg{i+1},'off') || ... wolffd@0: strcmpi(varg{i+1},'no')) wolffd@0: i = i+1; wolffd@0: optionvalue = 0; wolffd@0: else wolffd@0: optionvalue = 1; wolffd@0: end wolffd@0: elseif strcmpi(type,'Integer') || strcmpi(type,'Integers') wolffd@0: if length(varg) > i && isnumeric(varg{i+1}) wolffd@0: i = i+1; wolffd@0: optionvalue = varg{i}; wolffd@0: elseif isfield(option.(field),'keydefault') wolffd@0: if strcmpi(type,'Integers') wolffd@0: optionvalue = option.(field).keydefault; wolffd@0: else wolffd@0: optionvalue = option.(field).keydefault(1); wolffd@0: end wolffd@0: elseif isfield(option.(field),'default') wolffd@0: if strcmpi(type,'Integers') wolffd@0: optionvalue = option.(field).default; wolffd@0: else wolffd@0: optionvalue = option.(field).default(1); wolffd@0: end wolffd@0: else wolffd@0: error(['SYNTAX ERROR IN ',func2str(method),... wolffd@0: ': An integer should follow the key ',arg'.']); wolffd@0: end wolffd@0: if isfield(option.(field),'number')... wolffd@0: && option.(field).number == 2 wolffd@0: if length(varg) > i && isnumeric(varg{i+1}) wolffd@0: i = i+1; wolffd@0: optionvalue = [optionvalue varg{i}]; wolffd@0: elseif isfield(option.(field),'keydefault') wolffd@0: optionvalue = [optionvalue option.(field).keydefault(2)]; wolffd@0: elseif isfield(option.(field),'default') wolffd@0: optionvalue = [optionvalue option.(field).default(2)]; wolffd@0: else wolffd@0: error(['SYNTAX ERROR IN ',func2str(method),... wolffd@0: ': Two integers should follow the key ',arg'.']); wolffd@0: end wolffd@0: end wolffd@0: if not(isempty(unit)) wolffd@0: if (strcmpi(unit{1},'s') || ... wolffd@0: strcmpi(unit{2},'s')) && ... wolffd@0: (strcmpi(unit{1},'Hz') || ... wolffd@0: strcmpi(unit{2},'Hz')) wolffd@0: if length(varg) > i && ... wolffd@0: ischar(varg{i+1}) && ... wolffd@0: (strcmpi(varg{i+1},'s') || ... wolffd@0: strcmpi(varg{i+1},'Hz')) wolffd@0: i = i+1; wolffd@0: if not(strcmpi(varg{i},defaultunit)) wolffd@0: if isfield(option.(field),'opposite') wolffd@0: field = option.(field).opposite; wolffd@0: end wolffd@0: optionvalue = 1/optionvalue; wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: if (strcmpi(unit{1},'s') || ... wolffd@0: strcmpi(unit{2},'s')) && ... wolffd@0: (strcmpi(unit{1},'sp') || ... wolffd@0: strcmpi(unit{2},'sp')) wolffd@0: if length(varg) > i && ... wolffd@0: ischar(varg{i+1}) && ... wolffd@0: (strcmpi(varg{i+1},'sp') || ... wolffd@0: strcmpi(varg{i+1},'s')) wolffd@0: i = i+1; wolffd@0: if strcmpi(varg{i},'sp') wolffd@0: optionvalue = [optionvalue 0]; wolffd@0: else wolffd@0: optionvalue = [optionvalue 1]; wolffd@0: end wolffd@0: else wolffd@0: optionvalue = [optionvalue 1]; wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: if not(isempty(from)) wolffd@0: if length(varg) > i && ... wolffd@0: ischar(varg{i+1}) && ... wolffd@0: (strcmpi(varg{i+1},'Start') || ... wolffd@0: strcmpi(varg{i+1},'Middle') || ... wolffd@0: strcmpi(varg{i+1},'End')) wolffd@0: i = i+1; wolffd@0: if strcmpi(varg{i},'Start') wolffd@0: optionvalue = [optionvalue 0]; wolffd@0: elseif strcmpi(varg{i},'Middle') wolffd@0: optionvalue = [optionvalue 1]; wolffd@0: elseif strcmpi(varg{i},'End') wolffd@0: optionvalue = [optionvalue 2]; wolffd@0: end wolffd@0: else wolffd@0: optionvalue = [optionvalue 0]; wolffd@0: end wolffd@0: if isa(orig,'mirdesign') wolffd@0: orig = set(orig,'Size',optionvalue); wolffd@0: end wolffd@0: end wolffd@0: else wolffd@0: if length(varg) > i wolffd@0: i = i+1; wolffd@0: optionvalue = varg{i}; wolffd@0: elseif isfield(option.(field),'keydefault') wolffd@0: optionvalue = option.(field).keydefault(1); wolffd@0: else wolffd@0: error(['SYNTAX ERROR IN ',func2str(method),... wolffd@0: ': Data should follow the key ',arg'.']); wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: else wolffd@0: if isfield(option.(field),'choice') wolffd@0: for j = option.(field).choice wolffd@0: if strcmpi(arg,j) wolffd@0: match = 1; wolffd@0: optionvalue = arg; wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: if not(match) wolffd@0: if isfield(option.(field),'position') wolffd@0: if i+1 == option.(field).position wolffd@0: match = 1; wolffd@0: optionvalue = arg; wolffd@0: end wolffd@0: %else wolffd@0: % error(['SYNTAX ERROR IN ',func2str(method),... wolffd@0: % ': Badly specified key ',arg'.']); wolffd@0: end wolffd@0: end wolffd@0: if match == 1 wolffd@0: match = 2; wolffd@0: if isfield(option.(field),'when') ... wolffd@0: && (strcmpi(option.(field).when,'After') || ... wolffd@0: strcmpi(option.(field).when,'Both')) wolffd@0: after.(field) = optionvalue; wolffd@0: end wolffd@0: if not(isfield(option.(field),'when')) ... wolffd@0: || strcmpi(option.(field).when,'Both') wolffd@0: during.(field) = optionvalue; wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: if not(match) wolffd@0: if isnumeric(arg) || islogical(arg) wolffd@0: arg = num2str(arg); wolffd@0: end wolffd@0: error(['SYNTAX ERROR IN ',func2str(method),... wolffd@0: ': Unknown parameter ',arg'.']); wolffd@0: end wolffd@0: end wolffd@0: i = i+1; wolffd@0: end