view listeningTest/launch.m @ 15:24be5e9ce25b tip

Update README
author Brecht De Man <brecht.deman@bcu.ac.uk>
date Thu, 20 Sep 2018 12:23:20 +0200
parents 3c26ad251043
children
line wrap: on
line source
function launch(sesScript,noTst)
% launch a session script composed of a succession of single tests
% sesScript: session script name if recalling old script (optional)
% noTst:     start from specified test (optional)
% 
% by Brecht De Man at Centre for Digital Music, 12 January 2014

% make sure you are in listening test folder
cdFolder = which('launch');
cdFolder = cdFolder(1:end-8); % remove 'launch.m' from string
cd(cdFolder);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Interface
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
cd0=cd; % save path

% Choose Session
if ~exist('sesScript', 'file')  % if sesScript was not provided or doesn't exist
   [sesScript,cdScript]=uigetfile('*.txt','Please enter a session script');
   if ~sesScript        % if still not provided
       return           % exit
   end
else
   cdScript=cd0; % folder of script is same as folder of listening test
end


% Enter name and check ID is not already used...
ASK=1;
reREAD=0;
while ASK
   prompt={'Please enter your name or any ID : '};
   def={'myID'};
   title='ID';
   lineNo=1;
   answer=inputdlg(prompt,title,lineNo,def);
   if isempty(answer)	
       return
   end
   id=answer{1}; % from cell to string
   
   % make robust
   % if first character is a number:
   if id(1) >= '0' && id(1) <= '9'
        id = strcat('NUM', id);   
   end
   % if it contains spaces or special characters: 
   id = strrep(id, ' ', '_'); 
   id = strrep(id, '/', 'SLASH');
   id = strrep(id, '\', 'BACKSLASH');
   id = strrep(id, ':', 'COLON');
   id = strrep(id, '.', 'DOT');
   id = strrep(id, ',', 'COMMA');
   id = strrep(id, '?', 'QMARK');
   id = strrep(id, ';', 'SEMICOLON');
   id = strrep(id, '!', 'EXCLMARK');
   id = strrep(id, '(', 'OBRACKET');
   id = strrep(id, ')', 'CBRACKET');
   
   % if name already present, return to former test
   d=dir('responses');
   ASK=0;
   for noF=1:length(d)
      name=strtok(d(noF).name,'.');
      if strcmp(name,answer)
         switch lower(questdlg('This ID is already used. Do you wish to re-use it?'))
         case 'yes'
            cd('responses');
            ASK=0;
            expre=sprintf('load %s',id);
            eval(expre);
            expre=sprintf('tstDat=%s.tstDat;',id); % read mat-file
            eval(expre);
            reREAD=1;
            cd('../');
            break;
         case {'no','cancel'}
            ASK=1;
            break;
         end
      end
   end
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Read the script and create tstdat
% IF THE TEST WAS DONE ALREADY ONCE, THE .MAT FILE IS USED INSTEAD (see above)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
RANDOMORDER = 0; 
if ~reREAD
   cd(cdScript);
   tstDat=[];
   fid=fopen(sesScript,'r');
   while ~feof(fid) % read until end of session file
      lin=fgetl(fid);
      [fil1,COUNT,ERRMSG,NEXTINDEX] = sscanf(lin,'%s',1);
      if COUNT
         if ~strcmp(fil1(1),'%') % if not a comment
             if ~sum(strfind(lower(fil1), 'random'))
                 [fil2,COUNT,ERRMSG,NEXTINDEX] = sscanf(lin(NEXTINDEX:end),'%s',1);
                 tstDat{end+1}.tstType=fil1;     % what type of test?
                 tstDat{end}.tstFile=fil2;       % test file?
             else
                 RANDOMORDER = 1;
             end
         end
      end
   end
   fclose(fid);
   
   % ensure even length (sound list for every test)
   if mod(length(tstDat),2)
       warning('Uneven number of lines in session script. ');
   % randomise order of tests
   else
        if RANDOMORDER
           testPerm = randperm(length(tstDat)/2);
           tstDatCopy = tstDat;
           for t = 1:length(tstDat)/2
               tstDat{2*t-1} = tstDatCopy{2*testPerm(t)-1};
               tstDat{2*t}   = tstDatCopy{2*testPerm(t)};
           end
       end
   end
end

cd(cd0); % back to listening test folder

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Set session variables
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

sesDat.sesScript=sesScript;
sesDat.id=id;
sesDat.tstDat=tstDat;
sesDat.reREAD=reREAD;
sesDat.noTst=1;
sesDat.nbTst=length(tstDat);
sesDat.date=datestr(now);
sesDat.cuSndListFile=[];
sesDat.cuSndList=[];

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Start test
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% load the sndlist
if sesDat.noTst>1 % where were we? 
   sesDat.noTst=noTst-1; % IS THIS RIGHT?
   sndList(sesDat);
else % always start with first test (allow changing earlier stuff if desired)
   expr=sprintf('%s(sesDat);',tstDat{1}.tstType);
   eval(expr);
end