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