DMDX Help.
Zillion One Response Keyword
<ZillionOneResponse [N]>
<zor [N]>
MDSP bit 10000 modifier, the bit that makes
zillion responses only take a single response out of many possible. Reset if N = 0, otherwise set. All MDSP modifiers are both parameters and switches. If N is missing the bit is set and the mode is active. For a discussion
on running rating tasks see the Rating
Section in the built in
introduction (simpler multiple responses are covered in the the 1 of N
Responses section).
This is implemented for ratings, the individual ratings keys should be specifically mapped with <ValidZillionKey>.
If a one of many response scheme is to be setup where one (or more) response(s) is correct and the others are wrong then <MapNegativeResponse> and <MapPositiveResponse> will have to be used in conjunction with <UnMapNegativeResponse> and <UnMapPositiveResponse> to correctly identify to DMDX what are the correct keys are for any given item.
For example, assuming we have one of three numeric responses at the beginning of the item file you'll want to specify all the possible keys:
<zil> <zor> <vzk +1> <vzk +2> <vzk +3>
You won't need to map the spacebar as a valid zillion key so the request can get through, it is handled automatically. Then whenever the correct response changes you'll want to clear any mappings with <umnr> and <umpr> and remap which key is correct, if say the 1 key is correct you'll need <mpr +1> and all the negative ones <mnr +2> and <mnr +3>:
+1 <umnr><umpr><mpr +1><mnr +2><mnr +3> * "one two or three?";
This could get tedious if you have a large number of responses so macros are a good solution, however having just thought about this you'll have to use the old format for macro definitions, I don't think you can have keywords embeddable within a keyword as of version 1.1.10. You can use the old syntax for a macro definition though:
m1=<umnr><umpr><mpr +1><mnr +2><mnr +3>=
m2=<umnr><umpr><mpr +2><mnr +1><mnr +3>=
m3=<umnr><umpr><mpr +3><mnr +2><mnr +1>=
The items then become:
+1 ~1 * "one two or three?";
NOTE:- If you are going to disallow
one button from one trial to the next it is not sufficient is merely unmap it
with <umpr> or <umb> for
example. You have to invalidate it with
<InvalidateZillionKey>
and then validate it again when it's wanted to be used with
<vzk>. The problem comes about because <zor>
operates at a lower level of input than the mapping keywords and once the <zor>
code sees one response (ie one that's in the list of valid zillion keys), that's
it, it's seen it's one response regardless of whether that key was mapped as a
response or not and it's going to terminate the response phase of the trial.
Removing the key from the list of valid zillion keys means the item will hang
around until one of the desired responses is made. So whereas the
technique when using an <azk> output file is to map
and unmap buttons to switch them in and out as they are needed the technique
using <zil> <zor> is to map the keys once with
<mpr> and so on but then validate and invalidate
them as they are needed. Assuming you're not toggling whether a given key
is a positive response or a negative response of course in which case you'll
need to both map and unmap and validate and invalidate...
Somebody wanted feedback on a rating based experiment so I came up with a couple of methods to do it. One of them doesn't involve using <zil> and <zor> and the other does.
The first rating solution is to use the standard response gathering mode but to bind all rating keys to the positive response and then call a subroutine based on the keystroke generating additional output by emitting a counter's value and also providing feedback based on the particular branch taken:
<ep> <nfb> F10 <id "keyboard">
<umpr> <umnr> <mpr +1><mpr +2><mpr +3><mpr +4><mpr +5><mpr +6>
<mpr +7><mpr +8><mpr +9><mpr +0> <eop>
0 "Rating Example" <bu 1000>
mC#<mwc +1,-101, +2,-102, +3,-103, +4,-104, +5,-105, +6,-106,
+7,-107, +8,-108, +9,-109, +0,-110, cinr,-100>#;
100 "No Response." <return>;
101 <set 1,1> <emit 1> d2 "1" <return>;
102 <set 1,2> <emit 1> d2 "2" <return>;
103 <set 1,3> <emit 1> d2 "3" <return>;
104 <set 1,4> <emit 1> d2 "4" <return>;
105 <set 1,5> <emit 1> d2 "5" <return>;
106 <set 1,6> <emit 1> d2 "6" <return>;
107 <set 1,7> <emit 1> d2 "7" <return>;
108 <set 1,8> <emit 1> d2 "8" <return>;
109 <set 1,9> <emit 1> d2 "9" <return>;
110 <set 1,10> <emit 1> d2 "10" <return>;
+1000 * "target" ~c c;
+1000 * "target" ~c c;
0 "end" l;
The second solution was to use the <zor> method of <zil> doing away with the counter shenanigans. All keys are still bound to the positive response so the output file doesn't have No Response all over the place:
<ep> <vm 1024 768 768 16 0> <nfb> F10 <id "keyboard">
<zil> <zor> <vzk +1><vzk +2><vzk +3><vzk +4><vzk +5><vzk +6>
<vzk +7><vzk +8><vzk +9><vzk +0>
<umpr> <umnr> <mpr +1><mpr +2><mpr +3><mpr +4><mpr +5><mpr +6>
<mpr +7><mpr +8><mpr +9><mpr +0> <eop>
0 "Rating Example" <bu 1000>
mC#<mwc +1,-101, +2,-102, +3,-103, +4,-104, +5,-105, +6,-106,
+7,-107, +8,-108, +9,-109, +0,-110, cinr,-100>#;
100 "No Response." <return>;
101 d2 "1" <return>;
102 d2 "2" <return>;
103 d2 "3" <return>;
104 d2 "4" <return>;
105 d2 "5" <return>;
106 d2 "6" <return>;
107 d2 "7" <return>;
108 d2 "8" <return>;
109 d2 "9" <return>;
110 d2 "10" <return>;
+1000 * "target" ~c c;
+1000 * "target" ~c c;
0 "end" l;
The next solution provides feedback as well allowing the subject to change their mind. The space is validated and invalidated as a zillion key so that the subject can't initially respond with a space but once they have made one rating can signal their intent to continue with a space. The feedback is additionally displayed on a separate line using the option to only clear behind the displayed text thus leaving the target on the screen:
<ep> <nfb> F10 <id "keyboard"> d-2
<zil> <zor> <vzk +1><vzk +2><vzk +3><vzk +4><vzk +5><vzk +6><vzk +7>
<vzk +8><vzk +9><vzk +0> <umpr> <umnr> <mpr +1><mpr +2><mpr +3><mpr +4>
<mpr +5><mpr +6><mpr +7><mpr +8><mpr +9><mpr +0> t4000 <eop>
0 "Rating Example with",
@1"Change of Rating allowed" <bu 1000>
mc#<izk +space> <mwc +1,-101, +2,-102, +3,-103, +4,-104, +5,-105,
+6,-106, +7,-107, +8,-108, +9,-109, +0,-110, cinr,-100>#
mr#<vzk +space> <mwb +1,-101, +2,-102, +3,-103, +4,-104, +5,-105,
+6,-106, +7,-107, +8,-108, +9,-109, +0,-110, +space,111, binr,112>#;
100 @2 <ocb> "No Response." <return>;
+101 @2 <ocb> "1" * ~r c;
+102 @2 <ocb> "2" * ~r c;
+103 @2 <ocb> "3" * ~r c;
+104 @2 <ocb> "4" * ~r c;
+105 @2 <ocb> "5" * ~r c;
+106 @2 <ocb> "6" * ~r c;
+107 @2 <ocb> "7" * ~r c;
+108 @2 <ocb> "8" * ~r c;
+109 @2 <ocb> "9" * ~r c;
+110 @2 <ocb> "0" * ~r c;
~111 <return>;
112 <return>;
+1000 * "target1" ~c c;
+1000 * "target2" ~c c;
0 "end" l;
This is a stroop
task variant of the second example with a five minute timeout, you'll want to
duplicate items 1001 to 4004 enough times such that no one can do them all in
five minutes. numpad 4 = blue, 5 = green, 6 = red, enter = yellow.
<ep> s1 <vm 1024,768,16,60> <cr> <nfb> F10 <id "keyboard">
<zil> <zor> <umpr> <umnr>
<vzk "+numpad 4"> <vzk "+numpad 5"> <vzk "+numpad 6"> <vzk "+numpad
enter">
<mpr "+numpad 4"> <mpr "+numpad 5"> <mpr "+numpad 6"> <mpr "+numpad
enter">
<eop>
$
0 "Stroop Example" <bu 1000> ;
100 d2 "No Response." <emit No Response> <bi 999, millisectime .gt. 300000>
<return>;
101 d2 "Correct" <emit Correct> <bi 999, millisectime .gt. 300000> <return>;
102 d2 "Wrong" <emit Wrong> <bi 999, millisectime .gt. 300000> <return>;
~1000; $
+1001 * "blue"
<mwc "+numpad 4",-101, "+numpad 5",-102, "+numpad 6",-102, "+numpad
enter",-102, cinr,-100>;
+1002 * "blue"
<mwc "+numpad 4",-102, "+numpad 5",-101, "+numpad 6",-102, "+numpad
enter",-102, cinr,-100>;
+1003 * "blue"
<mwc "+numpad 4",-102, "+numpad 5",-102, "+numpad 6",-101, "+numpad
enter",-102, cinr,-100>;
+1004 * "blue"
<mwc "+numpad 4",-102, "+numpad 5",-102, "+numpad 6",-102, "+numpad
enter",-101, cinr,-100>;
+2001 * "green"
<mwc "+numpad 4",-101, "+numpad 5",-102, "+numpad 6",-102, "+numpad
enter",-102, cinr,-100>;
+2002 * "green"
<mwc "+numpad 4",-102, "+numpad 5",-101, "+numpad 6",-102, "+numpad
enter",-102, cinr,-100>;
+2003 * "green"
<mwc "+numpad 4",-102, "+numpad 5",-102, "+numpad 6",-101, "+numpad
enter",-102, cinr,-100>;
+2004 * "green"
<mwc "+numpad 4",-102, "+numpad 5",-102, "+numpad 6",-102, "+numpad
enter",-101, cinr,-100>;
+3001 * "red"
<mwc "+numpad 4",-101, "+numpad 5",-102, "+numpad 6",-102, "+numpad
enter",-102, cinr,-100>;
+3002 * "red"
<mwc "+numpad 4",-102, "+numpad 5",-101, "+numpad 6",-102, "+numpad
enter",-102, cinr,-100>;
+3003 * "red"
<mwc "+numpad 4",-102, "+numpad 5",-102, "+numpad 6",-101, "+numpad
enter",-102, cinr,-100>;
+3004 * "red"
<mwc "+numpad 4",-102, "+numpad 5",-102, "+numpad 6",-102, "+numpad
enter",-101, cinr,-100>;
+4001 * "yellow"
<mwc "+numpad 4",-101, "+numpad 5",-102, "+numpad 6",-102, "+numpad
enter",-102, cinr,-100>;
+4002 * "yellow"
<mwc "+numpad 4",-102, "+numpad 5",-101, "+numpad 6",-102, "+numpad
enter",-102, cinr,-100>;
+4003 * "yellow"
<mwc "+numpad 4",-102, "+numpad 5",-102, "+numpad 6",-101, "+numpad
enter",-102, cinr,-100>;
+4004 * "yellow"
<mwc "+numpad 4",-102, "+numpad 5",-102, "+numpad 6",-102, "+numpad
enter",-101, cinr,-100>;
$
999 "end" l;$
This variant of the previous stroop
task uses more normal sorts of Dmastr feedback (in fact it doesn't even have to
be a <zil> <zor> item file at all) and data mechanisms and the macro
mechanism referenced earlier:
<ep> s1 <vm 1024,768,16,60> <cr> F10 <id "keyboard">
<zil> <zor> <umpr> <umnr>
<vzk "+numpad 4"> <vzk "+numpad 5"> <vzk "+numpad 6"> <vzk "+numpad
enter"> <eop>
$
0 "Stroop Example"
m1# <umpr> <umnr>
<mpr "+numpad 4"> <mnr "+numpad 5"> <mnr "+numpad 6"> <mnr "+numpad
enter"> <bi 999, millisectime .gt. 300000>#
m2# <umpr> <umnr>
<mnr "+numpad 4"> <mpr "+numpad 5"> <mnr "+numpad 6"> <mnr "+numpad
enter"> <bi 999, millisectime .gt. 300000>#
m3# <umpr> <umnr>
<mnr "+numpad 4"> <mnr "+numpad 5"> <mpr "+numpad 6"> <mnr "+numpad
enter"> <bi 999, millisectime .gt. 300000>#
m4#<umpr> <umnr>
<mnr "+numpad 4"> <mnr "+numpad 5"> <mnr "+numpad 6"> <mpr "+numpad
enter"> <bi 999, millisectime .gt. 300000>#; $
+1001 * "blue" ~1;
+1002 * "blue" ~2;
+1003 * "blue" ~3;
+1004 * "blue" ~4;
+2001 * "green" ~1;
+2002 * "green" ~2;
+2003 * "green" ~3;
+2004 * "green" ~4;
+3001 * "red" ~1;
+3002 * "red" ~2;
+3003 * "red" ~3;
+3004 * "red" ~4;
+4001 * "yellow" ~1;
+4002 * "yellow" ~2;
+4003 * "yellow" ~3;
+4004 * "yellow" ~4;
$
999 "end" l;$
DMDX Index.