diff listeningTest/multiComp/multiComp.m @ 0:4fd284285159

Adding listening test plus some helpful functions and scripts.
author Brecht <b.deman@qmul.ac.uk>
date Thu, 24 Apr 2014 23:53:31 +0100
parents
children 5e72201496c8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/listeningTest/multiComp/multiComp.m	Thu Apr 24 23:53:31 2014 +0100
@@ -0,0 +1,235 @@
+function multiComp(sesDat)
+
+% multiple comparison test on several 1D scale
+% see readMultiComp for a description of specifications
+
+UIControl_FontSize_bak = get(0, 'DefaultUIControlFontSize');
+set(0, 'DefaultUIControlFontSize', 20);
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% copy useful variables
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+reREAD=sesDat.reREAD;
+noTst=sesDat.noTst;
+nbTst=sesDat.nbTst;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% read the test file
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+test=readMultiComp(sesDat.tstDat{noTst}.tstFile);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Set the test screen
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+hf=figure;	
+set(hf,'units','normalized');
+set(hf,'position',[0.1 .15 .80 1.0]); % TODO make automatic % [left, bottom, width, height]
+set(hf,'closereq',[]);
+set(hf,'numbertitle','off');
+set(hf,'menubar','none');
+if (nbTst-noTst)/2 > 1
+    titlestr = sprintf('%d screens left',(nbTst-noTst)/2);
+else if (nbTst-noTst) > 1
+        titlestr = 'One screen left after this';
+    else 
+        titlestr = 'Last screen';
+    end
+end
+set(hf,'name',titlestr);
+set(gca,'position',[0 0 1 1]);
+axis([0 1 0 1]);
+set(gca,'yticklabel',[]);
+set(gca,'xticklabel',[]);
+grid off;
+hp=gca;
+
+set(hp,'color',[.7 .7 .7]);	% gray background
+
+% Figure-event properties
+set(hf,'windowbuttonmotionfcn',sprintf('MmoveW(%d)',hf));
+set(hf,'keypressfcn',sprintf('TpushKey(%d)',hf));
+
+% Define Scales and SonIcons
+
+nbScale=length(test.scale);
+dY=1/(nbScale+3);	% vertical space for each scale+text (used to be +1, now +3)
+dX=1;
+dyy=dY/2;		% vertical space for scale and text
+dxx=1/30;		% vertical margins of the scale
+small=dyy/10;
+
+% create sonicons
+nbSnd=test.nbComb;
+
+% RANDOM POSITIONS and ALREADY PLAYED
+if reREAD && isfield(sesDat.tstDat{noTst}, 'rsl')
+    permVec = sesDat.tstDat{noTst}.rsl.permVec;
+    playVec = sesDat.tstDat{noTst}.rsl.playVec;
+else
+    permVec = randperm(nbSnd);
+    playVec = zeros(nbSnd,1);
+end
+
+fidInd=['responses/' sesDat.id,'_',sesDat.sesScript]; % print permutation in response log
+fid=fopen(fidInd,'a');
+fprintf(fid,'\n%s\n', 'Random permutation mapping (comments): ');
+for noSnd = 1: nbSnd
+   fprintf(fid,'%d  ', permVec(noSnd));
+end
+fprintf(fid,'\n%s\n', ' ');
+
+
+for noScale=1:nbScale
+   
+   y=1-noScale*dY;	% bottom line
+   dyt=dyy; % was 3/2*
+   %display text
+   h='horizontalAlignment';
+   v='verticalAlignment';
+   text(.5,y+dyt,test.scale(noScale).name,h,'center',v,'bottom', 'FontSize', 24);	% Scale name
+   % Level names
+   text(0+small,y+dyt,test.scale(noScale).level{1},h,'left',v,'bottom', 'FontSize', 24); % MINIMUM
+   text(1-small,y+dyt,test.scale(noScale).level{3},h,'right',v,'bottom', 'FontSize', 24); % MAXIMUM
+   
+   % Display 1D rules
+   y0=y;
+   y1=y+dyy;
+   hold on;
+   fill([dxx dxx 1-dxx 1-dxx],[y1 y0 y0 y1],[.8 .8 .8]);
+   
+   
+   for noSnd=1:nbSnd
+       
+      dl=(1-2*dxx)/5; %BDM used to be /nbsnd
+      xI=dl*noSnd/2;
+      dxI=dl/10;		% width of a sonicon
+      posIc=[xI y+small dxI dyy-2*small];
+      
+      % position the icons on the default position
+      % check if the individual data contains already some past results
+      % 
+      if reREAD && isfield(sesDat.tstDat{noTst}, 'rsl')
+         posComb=sesDat.tstDat{noTst}.rsl.mat(noScale,noSnd);
+      else
+         posComb=test.posComb(noSnd,noScale);
+         fidInd=['responses/' sesDat.id,'_',sesDat.sesScript]; % print initial placing
+         fid=fopen(fidInd,'a');
+         fprintf(fid,'%f  ', test.posComb(noSnd,noScale));
+      end
+      
+      % Calculate Icon position relative to the screen units
+      minx=test.scale(noScale).minn;
+      maxx=test.scale(noScale).maxx;
+      a=(1-2*dxx)/(maxx-minx);
+      b=dxx-a*minx;
+      posIc(1)=posComb*a+b-dxI/2;
+      
+      % set handles      
+      hIc=uicontrol('style','text','string',num2str(permVec(noSnd)),'units','normalized','position',posIc); % changed by Brecht: randperm
+      set(hIc,'buttondownfcn',sprintf('MpushIc(%d)',hf));
+      set(hIc,'backgroundcolor', [.6 .9 .6]); % set colour to green
+      
+      %%%%%%%%%%%%%%%%%%% ENABLING
+      set(hIc,'enable','inactive');
+      set(hIc,'tag','sonicon');
+      
+      sndId=test.comb(noSnd);
+      set(hIc,'userdata',sndId);
+      hIcon(noScale,noSnd)=hIc;
+      
+   end
+   fprintf(fid,'%s\n', ' ');
+   %shIc= set(hIc); %??? what is this here for? suppress output. 
+
+   % set the un-movable references
+   nbRef=length(test.sndRef);
+   for noRef=1:nbRef
+      sndRef=test.sndRef(noRef);
+      %%%%%%%%%%%%%%%%%%%%%% ENABLING...
+      set(hIcon(noScale,sndRef),'enable','off');		%% for MAC! may be 'off' for PC??
+      set(hIcon(noScale,sndRef),'string','ref');
+   end
+   
+   
+end
+
+
+% create Comments 
+hcom = struct([]); % create empty struct for comments
+if reREAD && isfield(sesDat.tstDat{noTst}, 'rsl')
+    for noSnd = 1:nbSnd % a comment per sample
+        posCom=[dxx 6*dY/(nbSnd+2)+3*dY/(nbSnd+2)*(nbSnd - noSnd) 10/15 3*dY/(nbSnd+2)-small]; % [left, bottom, width, height]
+        commentstr = sesDat.tstDat{noTst}.rsl.hcom{noSnd};
+        hcom{noSnd} = uicontrol('style','edit','max',2,'string',commentstr, ...
+            'units','normalized','position',posCom, ...
+            'HorizontalAlignment', 'left');
+    end
+    
+    posCom=[dxx small 10/15 6*dY/(nbSnd+2)-small]; % general comments
+    commentstr = sesDat.tstDat{noTst}.rsl.gcom;
+    gcom=uicontrol('style','edit','max',2,'string',commentstr, ...
+        'units','normalized','position',posCom, 'HorizontalAlignment', 'left');
+    
+    
+else % recall comments
+    for noSnd = 1:nbSnd % a comment per sample
+        posCom=[dxx 6*dY/(nbSnd+2)+3*dY/(nbSnd+2)*(nbSnd - noSnd) 10/15 3*dY/(nbSnd+2)-small]; % [left, bottom, width, height]
+        commentstr = sprintf('%d: ', noSnd);
+        hcom{noSnd} = uicontrol('style','edit','max',2,'string',commentstr, ... 
+                                'units','normalized','position',posCom, ...
+                                'HorizontalAlignment', 'left');
+    end
+
+    posCom=[dxx small 10/15 6*dY/(nbSnd+2)-small]; % general comments
+    commentstr = sprintf('%s: ', 'General comments');
+    gcom=uicontrol('style','edit','max',2,'string',commentstr, ...
+        'units','normalized','position',posCom, 'HorizontalAlignment', 'left');
+    
+end
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% "Stop audio" button
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+posFin=[11/15 3*dY/2 3/15 3*(dY-small)/2]; % [left, bottom, width, height]
+hFin=uicontrol('style','pushbutton','string','Stop audio','units','normalized','position',posFin);
+set(hFin,'callback',sprintf('MpushIc(%d)',hf));
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% "Finished" button
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+posFin=[11/15 small 3/15 3*(dY-small)/2]; % [left, bottom, width, height]
+hFin=uicontrol('style','pushbutton','string','Finished','units','normalized','position',posFin);
+set(hFin,'callback',sprintf('endMultiComp(%d)',hf)); 
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Test timer
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+dat.t0=clock;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Send useful datas
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+dat.dxx     = dxx; %?
+dat.dxI     = dxI; %?
+dat.hf      = hf;
+dat.hcom    = hcom; % individual comments
+dat.gcom    = gcom; % general comments
+dat.hIcon   = hIcon;
+dat.drag    = 0;
+dat.test    = test;
+dat.sesDat  = sesDat;
+dat.playVec = playVec;
+dat.permVec = permVec;
+dat.nbScale = nbScale; 
+dat.nbSnd   = nbSnd; 
+set(hf,'userdata',dat)
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% clean up
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+clear all;
\ No newline at end of file