How to control when recording starts when using "input device = voicerecord"


Author
Message
Musashi Jason
Musashi Jason
Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)
Group: Forum Members
Posts: 61, Visits: 158
Dave - Tuesday, June 12, 2018
Musashi Jason - Tuesday, June 12, 2018
Dave - Tuesday, June 12, 2018
Dave - Tuesday, June 12, 2018
Musashi Jason - Tuesday, June 12, 2018
Dave - Friday, June 8, 2018
Musashi Jason - Thursday, June 7, 2018

Dave,

I'm thinking you may not be able to easily see the overall flow of my experiment from the above snippets so I'm pasting the entire thing here. Hopefully, this will make it clearer. Also, in addition to getting the correct response recognized in trial2, I want to next add two trials with negative primes (incongruent photo and audio file match) but don't quite understand how to accomplish that with /not attribute...

I continue to be extremely appreciative of your assistance.

Jason

**************************************************************************************************************
**************************************************************************************************************
DEFAULTS
**************************************************************************************************************
**************************************************************************************************************
script requires Inquisit 5.0.0.0 or higher

<parameters>
/fontheight = 10%

/responsekeyleft = 30
/responsekeyleft_label = "A"
/responsekeyright = 40
/responsekeyright_label = "'"
</parameters>

<defaults>
/ screencolor = white
/ voicekeythreshold = 15
/ minimumversion = "5.0.0.0"
/ fontstyle = ("Arial", 3.5%, false, false, false, false, 5, 1)
</defaults>

<item instructions>

/1 = "This is a timed selection task. GO AS FAST AS YOU CAN but try not to make mistakes.

A series of asterisks, like the following, ******** will be displayed on the screen followed by a quick flash.

You will then see two words.

After the two words appear, you will hear a word.

Repeat the word you hear outloud immediately after you hear the word."

/2 = "For the second part of this test, use the A and ' keys to select the correct option.

A series of asterisks, like the following, ******** will be displayed on the screen followed by a quick flash.

You will then see two words.

After the two words appear, you will hear a word.

Use the A (on the left side of the keyboard) and ' (on the right side of the keyboard) to select the correct option that appears on the left or right of the screen."

</item>

***************************VALUES**********************
<values>
/selectContinue = 1
/target = ""
</values>
***************************VALUES*********************

<item continue>
/1 = "Press the SPACE BAR to begin"
</item>

<picture mypicture>
/ items = pictureitems
</picture>

<item pictureitems>
/ 1 = "dog.jpg"
/ 2 = "cat.jpg"
/ 3 = "apple.jpg"
/ 4 = "house.jpg"
/ 5 = "ball.jpg"
/ 6 = "banana.jpg"
/ 7 = "boat.jpg"
/ 8 = "snail.jpg"
/ 9 = "tree.jpg"
/10 = "boat.jpg"
</item>

<sound mysound>
/ items = sounditems
/ select = picture.mypicture.currentindex
/ erase = false
</sound>

<item sounditems>
/ 1 = "dog.wav"
/ 2 = "cat.wav"
/ 3 = "apple.wav"
/ 4 = "house.wav"
/ 5 = "ball.wav"
/ 6 = "banana.wav"
/ 7 = "boat.wav"
/ 8 = "snail.wav"
/ 9 = "tree.wav"
/ 10 = "car.wav"
</item>

<text correctoption>
/ items = correctitems
/ select = picture.mypicture.currentindex
/ vposition = 50%
/ fontstyle = ("Courier", parameters.fontheight, false, false, false, false, 5, 1)
/ hposition = list.hpos.nextvalue
</text>

<item correctitems>
/ 1 = "Dog"
/ 2 = "Cat"
/ 3 = "Apple"
/ 4 = "House"
/ 5 = "Ball"
/ 6 = "Banana"
/ 7 = "Boat"
/ 8 = "Snail"
/ 9 = "Tree"
/ 10 = "Car"
</item>

<text distractoroption>
/ items = distractoritems
/ select = picture.mypicture.currentindex
/ vposition = 50%
/ fontstyle = ("Courier", parameters.fontheight, false, false, false, false, 5, 1)
/ hposition = list.hpos.nextvalue
</text>

<item distractoritems>
/ 1 = "Cat"
/ 2 = "Dog"
/ 3 = "House"
/ 4 = "Apple"
/ 5 = "Banana"
/ 6 = "Ball"
/ 7 = "Snail"
/ 8 = "Boat"
/ 9 = "Car"
/ 10 = "Tree"
</item>

<item mask>
/1="*******
*******"
</item>

<text mask>
/items = mask
/select = 1
/ fontstyle = ("Courier", parameters.fontheight, false, false, false, false, 5, 1)
/ txcolor = black
/txbgcolor = white
/position = (50%, 50%)
</text>

<text maskeraser>
/items = mask
/select = 1
/ fontstyle = ("Courier", parameters.fontheight, false, false, false, false, 5, 1)
/ txcolor = white
/txbgcolor = white
/position = (50%, 50%)
</text>

// randomize the left-right position of the two response options
<list hpos>
/ items = (30%, 70%)
/ selectionrate = always
</list>

<text instructions>
/ items = item.instructions
/ hjustify = center
/ size = (90%, 60%)
/ position = (50%, 85%)
/ valign = bottom
/ txcolor = black
/ select = sequence
/ resetinterval = 20
</text>

<text spacebar>
/ items = continue
/ select = values.selectContinue
/ position = (50%, 95%)
/ valign = bottom
</text>

<trial firstinstructions>
/ stimulustimes = [1=instructions, spacebar]
/ correctresponse = (" ")
/ errormessage = false
/ recorddata = false
</trial>

<trial secondinstructions>
/ stimulustimes = [2=instructions, spacebar]
/ correctresponse = (" ")
/ errormessage = false
/ recorddata = false
</trial>

<trial micset>
/ validresponse = (anyresponse)
/ inputdevice = voicerecord
/ errormessage = false
/ recorddata = false
</trial>

<trial firsttrial>
/ stimulustimes = [0= mask; 500=mypicture; 515=clearscreen; 516=mask; 1015=clearscreen; 1700=correctoption, distractoroption; 2200=mysound]
/ validresponse = (anyresponse)
/ beginresponsetime = 2000
/ inputdevice = voicerecord
/ responseinterrupt = frames
/ trialduration = 6000
/ recorddata = true
</trial>

<trial secondtrial>
/ ontrialbegin = [
values.target = text.correctoption.currentitem;
]
/ stimulustimes = [0= mask; 500=mypicture; 515=clearscreen; 516=mask; 1015=clearscreen; 1700=correctoption, distractoroption; 2200=mysound]
/ inputdevice = keyboard
/ validresponse = (parameters.responsekeyleft, parameters.responsekeyright)
/ correctresponse = (values.target)
/ recorddata = true
</trial>

<block myblock>
/ trials = [1 = firstinstructions; 2 = micset; 3-12 = firsttrial; 13 = secondinstructions; 14-23 = secondtrial;]
</block>



What you need to do is set values.target to the keyboard scancode corresponding to the either the left or right key, and that will depend on _where_ text.correctoption is _positioned_, not on text.correctoption's current item. In other words, if text.correctoption is on the left in the given trial, values.target needs to be set to 30. If text.correctoption is on the right in the current trial, then values.target out to be set to 40.

I.e.

<trial secondtrial>
/ ontrialbegin = [
    values.correcth = list.hpos.nextvalue;
    values.distractorh = list.hpos.nextvalue;
]
/ ontrialbegin = [
    if (values.correcth == 30%) values.target = 30 else values.target = 40;
]

/ stimulustimes = [0= mask; 500=mypicture; 515=clearscreen; 516=mask; 1015=clearscreen; 1700=correctoption, distractoroption; 2200=mysound]
/ inputdevice = keyboard
/ validresponse = (parameters.responsekeyleft, parameters.responsekeyright)
/ correctresponse = (values.target)
/ recorddata = true
</trial>

with

<text correctoption>
/ items = correctitems
/ select = text.mypicture.currentindex
/ vposition = 50%
/ fontstyle = ("Courier", parameters.fontheight, false, false, false, false, 5, 1)
/ hposition = values.correcth
</text>

...

<text distractoroption>
/ items = distractoritems
/ select = text.mypicture.currentindex
/ vposition = 50%
/ fontstyle = ("Courier", parameters.fontheight, false, false, false, false, 5, 1)
/ hposition = values.distractorh
</text>

As for the 2nd -- mismatched -- trial type, you need to set up separate stimulus elements. You cannot use the same ones that are already used by the 1st -- matched -- trial type.

Dave,

Thank you very much for the explanation. Just to clarify, the 30% corresponds to the left position, correct? And, so I can make sure I understand the syntax, double equal signs == is for comparison, correct? So I'm checking to see if correcth is 30 and if so I assign that to values.target and if not I assign 40 to values.target. :-)

Thanks again for your help. Hopefully I'll, sometime soon, be able to stand on my own. :-)

Regards

Jason 

Yes, 30 is the keyboard scan code for the "A" key (on a standard English QWERTY keyboard). See Tools -> Keyboard Scancodes in the Inquisit Lab menu and/or the "Keyboard Scancodes" topic in the documentation: https://www.millisecond.com/support/docs/v5/html/language/scancodes.htm

In your script, you have that information in the <parameters> element, too,

<parameters>
/fontheight = 10%

/responsekeyleft = 30
/responsekeyleft_label = "A"

/responsekeyright = 40
/responsekeyright_label = "'"
</parameters>

so the actually more elegant -- arguably better -- way to program the <trial>s would be

<trial secondtrial>
/ ontrialbegin = [
    values.correcth = list.hpos.nextvalue;
    values.distractorh = list.hpos.nextvalue;
]
/ ontrialbegin = [
    if (values.correcth == 30%) values.target = parameters.responsekeyleft else values.target = parameters.responsekeyright;
]

/ stimulustimes = [0= mask; 500=mypicture; 515=clearscreen; 516=mask; 1015=clearscreen; 1700=correctoption, distractoroption; 2200=mysound]
/ inputdevice = keyboard
/ validresponse = (parameters.responsekeyleft, parameters.responsekeyright)
/ correctresponse = (values.target)
/ recorddata = true
</trial>

That way, if you decide to change the keys you want to use in the <parameters> element, no changes to the <trial> are necessary.

As for operators, you are correct:

"==" is a logical comparison operator (equality), i.e. what you use in situations where you want to know if a statement is true or false.

4 == 4 -> true
3 == 5 -> false

"=" on the other hand is the assignment operator, i.e. what you use to assign a value to a variable.

The various operators are covered in the "Operators" topic: https://www.millisecond.com/support/docs/v5/html/language/expressions/operators.htm

Hope this helps!

<values>
/correcth = ""
/distractorh = ''
</values>

You can initialize them like so, or you can do

<values>
/correcth = 0%
/distractorh = 0%
</values>

It is important, however, that you you have the code in the <trial> correct, too:

<trial secondtrial>
/ ontrialbegin = [
    values.correcth = list.hpos.nextvalue;
    values.distractorh = list.hpos.nextvalue;
]
/ ontrialbegin = [
    if (values.correcth == 30%) values.target = parameters.responsekeyleft else values.target = parameters.responsekeyright;
]
/ stimulustimes = [0= mask; 500=mypicture; 515=clearscreen; 516=mask; 1015=clearscreen; 1700=correctoption, distractoroption; 2200=mysound]
/ inputdevice = keyboard
/ validresponse = (parameters.responsekeyleft, parameters.responsekeyright)
/ correctresponse = (values.target)
/ recorddata = true
</trial>

The highlighted bit you wiil also need in <tral firsttrial> for the _entire_ script to work properly, not just <trial secondtrial>:

<trial firsttrial>
/ ontrialbegin = [
    values.correcth = list.hpos.nextvalue;
    values.distractorh = list.hpos.nextvalue;
]

/ stimulustimes = [0= mask; 500=mypicture; 515=clearscreen; 516=mask; 1015=clearscreen; 1700=correctoption, distractoroption; 2200=mysound]
/ validresponse = (anyresponse)
/ beginresponsetime = 2000
/ inputdevice = voicerecord
/ responseinterrupt = frames
/ trialduration = 6000
/ recorddata = true
</trial>

Dave,

Thanks again. I've made those changes but now am having a different positioning problem. I get one of my prompts (apple, for example) on the screen but cannot see the other one at all. I ran through the entire experiement and can note that the correct option is usally not appearing....but on some runs through the trial two options appear on top of each other. It seems the changes I've made have somehow made the followoing part of the script function differently:

// randomize the left-right position of the two response options
<list hpos>
/ items = (30%, 70%)
/ selectionrate = always

This is what I had adjusted, quite some time back, to get the prompts positioned as desired. 


Check the /hposition attributes in

<text correctoption>
/ items = correctitems
/ select = text.mypicture.currentindex
/ vposition = 50%
/ fontstyle = ("Courier", parameters.fontheight, false, false, false, false, 5, 1)
/ hposition = values.correcth
</text>

and

<text distractoroption>
/ items = distractoritems
/ select = text.mypicture.currentindex
/ vposition = 50%
/ fontstyle = ("Courier", parameters.fontheight, false, false, false, false, 5, 1)
/ hposition = values.distractorh
</text>

Make sure they're referencing the correct values. Also make sure the <list> is still set to selectionrate = always, and that you have the /ontrialbegin logic I explained in my previous reply correct and present in the <trial> elements.

<trial firsttrial>
/ ontrialbegin = [
    values.correcth = list.hpos.nextvalue;
    values.distractorh = list.hpos.nextvalue;
]
...
</trial>

Dave,

Thanks...I had one set incorrectly (probably because of copy/paste - shame on me). Both attributes were set to values.correth which was, of course, the root of my problem. 

Sorry for taking your time but thanks for your patience and assistance. 

Jason
Musashi Jason
Musashi Jason
Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)
Group: Forum Members
Posts: 61, Visits: 158
Musashi Jason - Tuesday, June 12, 2018
Dave - Tuesday, June 12, 2018
Musashi Jason - Tuesday, June 12, 2018
Dave - Tuesday, June 12, 2018
Dave - Tuesday, June 12, 2018
Musashi Jason - Tuesday, June 12, 2018
Dave - Friday, June 8, 2018
Musashi Jason - Thursday, June 7, 2018

Dave,

I'm thinking you may not be able to easily see the overall flow of my experiment from the above snippets so I'm pasting the entire thing here. Hopefully, this will make it clearer. Also, in addition to getting the correct response recognized in trial2, I want to next add two trials with negative primes (incongruent photo and audio file match) but don't quite understand how to accomplish that with /not attribute...

I continue to be extremely appreciative of your assistance.

Jason

**************************************************************************************************************
**************************************************************************************************************
DEFAULTS
**************************************************************************************************************
**************************************************************************************************************
script requires Inquisit 5.0.0.0 or higher

<parameters>
/fontheight = 10%

/responsekeyleft = 30
/responsekeyleft_label = "A"
/responsekeyright = 40
/responsekeyright_label = "'"
</parameters>

<defaults>
/ screencolor = white
/ voicekeythreshold = 15
/ minimumversion = "5.0.0.0"
/ fontstyle = ("Arial", 3.5%, false, false, false, false, 5, 1)
</defaults>

<item instructions>

/1 = "This is a timed selection task. GO AS FAST AS YOU CAN but try not to make mistakes.

A series of asterisks, like the following, ******** will be displayed on the screen followed by a quick flash.

You will then see two words.

After the two words appear, you will hear a word.

Repeat the word you hear outloud immediately after you hear the word."

/2 = "For the second part of this test, use the A and ' keys to select the correct option.

A series of asterisks, like the following, ******** will be displayed on the screen followed by a quick flash.

You will then see two words.

After the two words appear, you will hear a word.

Use the A (on the left side of the keyboard) and ' (on the right side of the keyboard) to select the correct option that appears on the left or right of the screen."

</item>

***************************VALUES**********************
<values>
/selectContinue = 1
/target = ""
</values>
***************************VALUES*********************

<item continue>
/1 = "Press the SPACE BAR to begin"
</item>

<picture mypicture>
/ items = pictureitems
</picture>

<item pictureitems>
/ 1 = "dog.jpg"
/ 2 = "cat.jpg"
/ 3 = "apple.jpg"
/ 4 = "house.jpg"
/ 5 = "ball.jpg"
/ 6 = "banana.jpg"
/ 7 = "boat.jpg"
/ 8 = "snail.jpg"
/ 9 = "tree.jpg"
/10 = "boat.jpg"
</item>

<sound mysound>
/ items = sounditems
/ select = picture.mypicture.currentindex
/ erase = false
</sound>

<item sounditems>
/ 1 = "dog.wav"
/ 2 = "cat.wav"
/ 3 = "apple.wav"
/ 4 = "house.wav"
/ 5 = "ball.wav"
/ 6 = "banana.wav"
/ 7 = "boat.wav"
/ 8 = "snail.wav"
/ 9 = "tree.wav"
/ 10 = "car.wav"
</item>

<text correctoption>
/ items = correctitems
/ select = picture.mypicture.currentindex
/ vposition = 50%
/ fontstyle = ("Courier", parameters.fontheight, false, false, false, false, 5, 1)
/ hposition = list.hpos.nextvalue
</text>

<item correctitems>
/ 1 = "Dog"
/ 2 = "Cat"
/ 3 = "Apple"
/ 4 = "House"
/ 5 = "Ball"
/ 6 = "Banana"
/ 7 = "Boat"
/ 8 = "Snail"
/ 9 = "Tree"
/ 10 = "Car"
</item>

<text distractoroption>
/ items = distractoritems
/ select = picture.mypicture.currentindex
/ vposition = 50%
/ fontstyle = ("Courier", parameters.fontheight, false, false, false, false, 5, 1)
/ hposition = list.hpos.nextvalue
</text>

<item distractoritems>
/ 1 = "Cat"
/ 2 = "Dog"
/ 3 = "House"
/ 4 = "Apple"
/ 5 = "Banana"
/ 6 = "Ball"
/ 7 = "Snail"
/ 8 = "Boat"
/ 9 = "Car"
/ 10 = "Tree"
</item>

<item mask>
/1="*******
*******"
</item>

<text mask>
/items = mask
/select = 1
/ fontstyle = ("Courier", parameters.fontheight, false, false, false, false, 5, 1)
/ txcolor = black
/txbgcolor = white
/position = (50%, 50%)
</text>

<text maskeraser>
/items = mask
/select = 1
/ fontstyle = ("Courier", parameters.fontheight, false, false, false, false, 5, 1)
/ txcolor = white
/txbgcolor = white
/position = (50%, 50%)
</text>

// randomize the left-right position of the two response options
<list hpos>
/ items = (30%, 70%)
/ selectionrate = always
</list>

<text instructions>
/ items = item.instructions
/ hjustify = center
/ size = (90%, 60%)
/ position = (50%, 85%)
/ valign = bottom
/ txcolor = black
/ select = sequence
/ resetinterval = 20
</text>

<text spacebar>
/ items = continue
/ select = values.selectContinue
/ position = (50%, 95%)
/ valign = bottom
</text>

<trial firstinstructions>
/ stimulustimes = [1=instructions, spacebar]
/ correctresponse = (" ")
/ errormessage = false
/ recorddata = false
</trial>

<trial secondinstructions>
/ stimulustimes = [2=instructions, spacebar]
/ correctresponse = (" ")
/ errormessage = false
/ recorddata = false
</trial>

<trial micset>
/ validresponse = (anyresponse)
/ inputdevice = voicerecord
/ errormessage = false
/ recorddata = false
</trial>

<trial firsttrial>
/ stimulustimes = [0= mask; 500=mypicture; 515=clearscreen; 516=mask; 1015=clearscreen; 1700=correctoption, distractoroption; 2200=mysound]
/ validresponse = (anyresponse)
/ beginresponsetime = 2000
/ inputdevice = voicerecord
/ responseinterrupt = frames
/ trialduration = 6000
/ recorddata = true
</trial>

<trial secondtrial>
/ ontrialbegin = [
values.target = text.correctoption.currentitem;
]
/ stimulustimes = [0= mask; 500=mypicture; 515=clearscreen; 516=mask; 1015=clearscreen; 1700=correctoption, distractoroption; 2200=mysound]
/ inputdevice = keyboard
/ validresponse = (parameters.responsekeyleft, parameters.responsekeyright)
/ correctresponse = (values.target)
/ recorddata = true
</trial>

<block myblock>
/ trials = [1 = firstinstructions; 2 = micset; 3-12 = firsttrial; 13 = secondinstructions; 14-23 = secondtrial;]
</block>



What you need to do is set values.target to the keyboard scancode corresponding to the either the left or right key, and that will depend on _where_ text.correctoption is _positioned_, not on text.correctoption's current item. In other words, if text.correctoption is on the left in the given trial, values.target needs to be set to 30. If text.correctoption is on the right in the current trial, then values.target out to be set to 40.

I.e.

<trial secondtrial>
/ ontrialbegin = [
    values.correcth = list.hpos.nextvalue;
    values.distractorh = list.hpos.nextvalue;
]
/ ontrialbegin = [
    if (values.correcth == 30%) values.target = 30 else values.target = 40;
]

/ stimulustimes = [0= mask; 500=mypicture; 515=clearscreen; 516=mask; 1015=clearscreen; 1700=correctoption, distractoroption; 2200=mysound]
/ inputdevice = keyboard
/ validresponse = (parameters.responsekeyleft, parameters.responsekeyright)
/ correctresponse = (values.target)
/ recorddata = true
</trial>

with

<text correctoption>
/ items = correctitems
/ select = text.mypicture.currentindex
/ vposition = 50%
/ fontstyle = ("Courier", parameters.fontheight, false, false, false, false, 5, 1)
/ hposition = values.correcth
</text>

...

<text distractoroption>
/ items = distractoritems
/ select = text.mypicture.currentindex
/ vposition = 50%
/ fontstyle = ("Courier", parameters.fontheight, false, false, false, false, 5, 1)
/ hposition = values.distractorh
</text>

As for the 2nd -- mismatched -- trial type, you need to set up separate stimulus elements. You cannot use the same ones that are already used by the 1st -- matched -- trial type.

Dave,

Thank you very much for the explanation. Just to clarify, the 30% corresponds to the left position, correct? And, so I can make sure I understand the syntax, double equal signs == is for comparison, correct? So I'm checking to see if correcth is 30 and if so I assign that to values.target and if not I assign 40 to values.target. :-)

Thanks again for your help. Hopefully I'll, sometime soon, be able to stand on my own. :-)

Regards

Jason 

Yes, 30 is the keyboard scan code for the "A" key (on a standard English QWERTY keyboard). See Tools -> Keyboard Scancodes in the Inquisit Lab menu and/or the "Keyboard Scancodes" topic in the documentation: https://www.millisecond.com/support/docs/v5/html/language/scancodes.htm

In your script, you have that information in the <parameters> element, too,

<parameters>
/fontheight = 10%

/responsekeyleft = 30
/responsekeyleft_label = "A"

/responsekeyright = 40
/responsekeyright_label = "'"
</parameters>

so the actually more elegant -- arguably better -- way to program the <trial>s would be

<trial secondtrial>
/ ontrialbegin = [
    values.correcth = list.hpos.nextvalue;
    values.distractorh = list.hpos.nextvalue;
]
/ ontrialbegin = [
    if (values.correcth == 30%) values.target = parameters.responsekeyleft else values.target = parameters.responsekeyright;
]

/ stimulustimes = [0= mask; 500=mypicture; 515=clearscreen; 516=mask; 1015=clearscreen; 1700=correctoption, distractoroption; 2200=mysound]
/ inputdevice = keyboard
/ validresponse = (parameters.responsekeyleft, parameters.responsekeyright)
/ correctresponse = (values.target)
/ recorddata = true
</trial>

That way, if you decide to change the keys you want to use in the <parameters> element, no changes to the <trial> are necessary.

As for operators, you are correct:

"==" is a logical comparison operator (equality), i.e. what you use in situations where you want to know if a statement is true or false.

4 == 4 -> true
3 == 5 -> false

"=" on the other hand is the assignment operator, i.e. what you use to assign a value to a variable.

The various operators are covered in the "Operators" topic: https://www.millisecond.com/support/docs/v5/html/language/expressions/operators.htm

Hope this helps!

<values>
/correcth = ""
/distractorh = ''
</values>

You can initialize them like so, or you can do

<values>
/correcth = 0%
/distractorh = 0%
</values>

It is important, however, that you you have the code in the <trial> correct, too:

<trial secondtrial>
/ ontrialbegin = [
    values.correcth = list.hpos.nextvalue;
    values.distractorh = list.hpos.nextvalue;
]
/ ontrialbegin = [
    if (values.correcth == 30%) values.target = parameters.responsekeyleft else values.target = parameters.responsekeyright;
]
/ stimulustimes = [0= mask; 500=mypicture; 515=clearscreen; 516=mask; 1015=clearscreen; 1700=correctoption, distractoroption; 2200=mysound]
/ inputdevice = keyboard
/ validresponse = (parameters.responsekeyleft, parameters.responsekeyright)
/ correctresponse = (values.target)
/ recorddata = true
</trial>

The highlighted bit you wiil also need in <tral firsttrial> for the _entire_ script to work properly, not just <trial secondtrial>:

<trial firsttrial>
/ ontrialbegin = [
    values.correcth = list.hpos.nextvalue;
    values.distractorh = list.hpos.nextvalue;
]

/ stimulustimes = [0= mask; 500=mypicture; 515=clearscreen; 516=mask; 1015=clearscreen; 1700=correctoption, distractoroption; 2200=mysound]
/ validresponse = (anyresponse)
/ beginresponsetime = 2000
/ inputdevice = voicerecord
/ responseinterrupt = frames
/ trialduration = 6000
/ recorddata = true
</trial>

Dave,

Thanks again. I've made those changes but now am having a different positioning problem. I get one of my prompts (apple, for example) on the screen but cannot see the other one at all. I ran through the entire experiement and can note that the correct option is usally not appearing....but on some runs through the trial two options appear on top of each other. It seems the changes I've made have somehow made the followoing part of the script function differently:

// randomize the left-right position of the two response options
<list hpos>
/ items = (30%, 70%)
/ selectionrate = always

This is what I had adjusted, quite some time back, to get the prompts positioned as desired. 


Check the /hposition attributes in

<text correctoption>
/ items = correctitems
/ select = text.mypicture.currentindex
/ vposition = 50%
/ fontstyle = ("Courier", parameters.fontheight, false, false, false, false, 5, 1)
/ hposition = values.correcth
</text>

and

<text distractoroption>
/ items = distractoritems
/ select = text.mypicture.currentindex
/ vposition = 50%
/ fontstyle = ("Courier", parameters.fontheight, false, false, false, false, 5, 1)
/ hposition = values.distractorh
</text>

Make sure they're referencing the correct values. Also make sure the <list> is still set to selectionrate = always, and that you have the /ontrialbegin logic I explained in my previous reply correct and present in the <trial> elements.

<trial firsttrial>
/ ontrialbegin = [
    values.correcth = list.hpos.nextvalue;
    values.distractorh = list.hpos.nextvalue;
]
...
</trial>

Dave,

Thanks...I had one set incorrectly (probably because of copy/paste - shame on me). Both attributes were set to values.correth which was, of course, the root of my problem. 

Sorry for taking your time but thanks for your patience and assistance. 

Jason

Dave,

Continuing to bug you here...regarding the mismatch setup, am I correct in understanding that I can simply make a new trial using the text, image, audio, and items already specified in my script?  So, for example, I could make a new trial, like:

<trial firsttrialnomatch>
/ ontrialbegin = [
values.correcth = list.hpos.nextvalue;
values.distractorh = list.hpos.nextvalue;
]
/ stimulustimes = [0= mask; 500=mypicture; 515=clearscreen; 516=mask; 1015=clearscreen; 1700=correctoption, distractoroption; 2200=mysound]
/ validresponse = (anyresponse)
/ beginresponsetime = 2000
/ inputdevice = voicerecord
/ responseinterrupt = frames
/ trialduration = 6000
/ recorddata = true

and then modify it (somehow) to present incongruous mypicture and mysound?  Or do I need to make adjustments elsewhere to make the items present in a different order? I feel like the latter is the case but am not sure where to start.

Regards

Jason


Dave
Dave
Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)
Group: Administrators
Posts: 12K, Visits: 98K
Musashi Jason - Tuesday, June 12, 2018

Dave,

Continuing to bug you here...regarding the mismatch setup, am I correct in understanding that I can simply make a new trial using the text, image, audio, and items already specified in my script?  So, for example, I could make a new trial, like:

<trial firsttrialnomatch>
/ ontrialbegin = [
values.correcth = list.hpos.nextvalue;
values.distractorh = list.hpos.nextvalue;
]
/ stimulustimes = [0= mask; 500=mypicture; 515=clearscreen; 516=mask; 1015=clearscreen; 1700=correctoption, distractoroption; 2200=mysound]
/ validresponse = (anyresponse)
/ beginresponsetime = 2000
/ inputdevice = voicerecord
/ responseinterrupt = frames
/ trialduration = 6000
/ recorddata = true

and then modify it (somehow) to present incongruous mypicture and mysound?  Or do I need to make adjustments elsewhere to make the items present in a different order? I feel like the latter is the case but am not sure where to start.

Regards

Jason


No, you need to set up new/additional <picture>, <sound> and <text> elements for the mismatch <trial>.

The already existing ones are _paired for matches_

<picture mypicture>
/ items = pictureitems
</picture>

<item pictureitems>
/ 1 = "dog.jpg"
/ 2 = "cat.jpg"
/ 3 = "apple.jpg"
/ 4 = "house.jpg"
/ 5 = "ball.jpg"
/ 6 = "banana.jpg"
/ 7 = "boat.jpg"
/ 8 = "snail.jpg"
/ 9 = "tree.jpg"
/10 = "boat.jpg"
</item>

<sound mysound>
/ items = sounditems
/ select = picture.mypicture.currentindex
/ erase = false
</sound>

<item sounditems>
/ 1 = "dog.wav"
/ 2 = "cat.wav"
/ 3 = "apple.wav"
/ 4 = "house.wav"
/ 5 = "ball.wav"
/ 6 = "banana.wav"
/ 7 = "boat.wav"
/ 8 = "snail.wav"
/ 9 = "tree.wav"
/ 10 = "car.wav"
</item>

etc.

You need additional ones that are _paired for mismatches_

Edited 6 Years Ago by Dave
Musashi Jason
Musashi Jason
Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)
Group: Forum Members
Posts: 61, Visits: 158
Dave - Tuesday, June 12, 2018
Musashi Jason - Tuesday, June 12, 2018

Dave,

Continuing to bug you here...regarding the mismatch setup, am I correct in understanding that I can simply make a new trial using the text, image, audio, and items already specified in my script?  So, for example, I could make a new trial, like:

<trial firsttrialnomatch>
/ ontrialbegin = [
values.correcth = list.hpos.nextvalue;
values.distractorh = list.hpos.nextvalue;
]
/ stimulustimes = [0= mask; 500=mypicture; 515=clearscreen; 516=mask; 1015=clearscreen; 1700=correctoption, distractoroption; 2200=mysound]
/ validresponse = (anyresponse)
/ beginresponsetime = 2000
/ inputdevice = voicerecord
/ responseinterrupt = frames
/ trialduration = 6000
/ recorddata = true

and then modify it (somehow) to present incongruous mypicture and mysound?  Or do I need to make adjustments elsewhere to make the items present in a different order? I feel like the latter is the case but am not sure where to start.

Regards

Jason


No, you need to set up new/additional <picture>, <sound> and <text> elements for the mismatch <trial>.

The already existing ones are _paired for matches_

<picture mypicture>
/ items = pictureitems
</picture>

<item pictureitems>
/ 1 = "dog.jpg"
/ 2 = "cat.jpg"
/ 3 = "apple.jpg"
/ 4 = "house.jpg"
/ 5 = "ball.jpg"
/ 6 = "banana.jpg"
/ 7 = "boat.jpg"
/ 8 = "snail.jpg"
/ 9 = "tree.jpg"
/10 = "boat.jpg"
</item>

<sound mysound>
/ items = sounditems
/ select = picture.mypicture.currentindex
/ erase = false
</sound>

<item sounditems>
/ 1 = "dog.wav"
/ 2 = "cat.wav"
/ 3 = "apple.wav"
/ 4 = "house.wav"
/ 5 = "ball.wav"
/ 6 = "banana.wav"
/ 7 = "boat.wav"
/ 8 = "snail.wav"
/ 9 = "tree.wav"
/ 10 = "car.wav"
</item>

etc.

You need additional ones that are _paired for mismatches_

Dave,

Thanks for your help. Ok, I understand that I need a new set to run through with a mismatched pairing...but how do I accomplish the mismatch? I'm guessing it is in the line you've bolded:

/select = picture.mypicture.currentindex

and that I need to use something other than currentindex so as to get a different image but, as I continue to be painfully ignorant of the syntax, I'm not sure what to use. I toggled through the options that are presented when I type the period after mypicture but none appears to provide a 'random' select type function. 

To review my understanding of the logic:

selectionrate, in the <list hpos> section ensures that options are randomly placed on either the left or right of the screen, right? (I think my understanding is correct here, hopefully)

In addition, I was hoping that distractor items selected each time would be random...but upon further inspection I now see that that is not the case. The correctitems and distractor items (1, 2, 3, etc.) are paired when presented... I've made an embarrassing realization about how the script is functioning vs how I thought it was functioning. But that's a step forward in terms of my knowledge base. ;-)

So if I simply renumber my items (to have mismatches between picture and sound files) I should be able to accomplish what I want, correct?

So I basically make a new 'routine' (maybe not the most accurate terminology), using different variable names (e.g. mypictureincong, pictureitemsincong, mysoundincong, correctoptionincong, distractoritemincong, etc.) and then call those from a trial as is done in what I have now? But I can still use the same root files (pictures, audio)...I just need to label them differently as items, text, sound, etc. Hopefully, my logic is all in order here...?

Or, (sorry I'm typing as I think here) maybe I can just make new <text> labeling items (correctoptionincong for example) differently and then call them in a random method...or not. 

Maybe I should just be asking if there is a way to select randomly instead of the current index?

Hopefully, I can get my head around the logic here before too long and, in the not too distant future, be able to stop bugging you. :-)

Regards

Jason
Musashi Jason
Musashi Jason
Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)
Group: Forum Members
Posts: 61, Visits: 158
Musashi Jason - Wednesday, June 13, 2018
Dave - Tuesday, June 12, 2018
Musashi Jason - Tuesday, June 12, 2018

Dave,

Continuing to bug you here...regarding the mismatch setup, am I correct in understanding that I can simply make a new trial using the text, image, audio, and items already specified in my script?  So, for example, I could make a new trial, like:

<trial firsttrialnomatch>
/ ontrialbegin = [
values.correcth = list.hpos.nextvalue;
values.distractorh = list.hpos.nextvalue;
]
/ stimulustimes = [0= mask; 500=mypicture; 515=clearscreen; 516=mask; 1015=clearscreen; 1700=correctoption, distractoroption; 2200=mysound]
/ validresponse = (anyresponse)
/ beginresponsetime = 2000
/ inputdevice = voicerecord
/ responseinterrupt = frames
/ trialduration = 6000
/ recorddata = true

and then modify it (somehow) to present incongruous mypicture and mysound?  Or do I need to make adjustments elsewhere to make the items present in a different order? I feel like the latter is the case but am not sure where to start.

Regards

Jason


No, you need to set up new/additional <picture>, <sound> and <text> elements for the mismatch <trial>.

The already existing ones are _paired for matches_

<picture mypicture>
/ items = pictureitems
</picture>

<item pictureitems>
/ 1 = "dog.jpg"
/ 2 = "cat.jpg"
/ 3 = "apple.jpg"
/ 4 = "house.jpg"
/ 5 = "ball.jpg"
/ 6 = "banana.jpg"
/ 7 = "boat.jpg"
/ 8 = "snail.jpg"
/ 9 = "tree.jpg"
/10 = "boat.jpg"
</item>

<sound mysound>
/ items = sounditems
/ select = picture.mypicture.currentindex
/ erase = false
</sound>

<item sounditems>
/ 1 = "dog.wav"
/ 2 = "cat.wav"
/ 3 = "apple.wav"
/ 4 = "house.wav"
/ 5 = "ball.wav"
/ 6 = "banana.wav"
/ 7 = "boat.wav"
/ 8 = "snail.wav"
/ 9 = "tree.wav"
/ 10 = "car.wav"
</item>

etc.

You need additional ones that are _paired for mismatches_

Dave,

Thanks for your help. Ok, I understand that I need a new set to run through with a mismatched pairing...but how do I accomplish the mismatch? I'm guessing it is in the line you've bolded:

/select = picture.mypicture.currentindex

and that I need to use something other than currentindex so as to get a different image but, as I continue to be painfully ignorant of the syntax, I'm not sure what to use. I toggled through the options that are presented when I type the period after mypicture but none appears to provide a 'random' select type function. 

To review my understanding of the logic:

selectionrate, in the <list hpos> section ensures that options are randomly placed on either the left or right of the screen, right? (I think my understanding is correct here, hopefully)

In addition, I was hoping that distractor items selected each time would be random...but upon further inspection I now see that that is not the case. The correctitems and distractor items (1, 2, 3, etc.) are paired when presented... I've made an embarrassing realization about how the script is functioning vs how I thought it was functioning. But that's a step forward in terms of my knowledge base. ;-)

So if I simply renumber my items (to have mismatches between picture and sound files) I should be able to accomplish what I want, correct?

So I basically make a new 'routine' (maybe not the most accurate terminology), using different variable names (e.g. mypictureincong, pictureitemsincong, mysoundincong, correctoptionincong, distractoritemincong, etc.) and then call those from a trial as is done in what I have now? But I can still use the same root files (pictures, audio)...I just need to label them differently as items, text, sound, etc. Hopefully, my logic is all in order here...?

Or, (sorry I'm typing as I think here) maybe I can just make new <text> labeling items (correctoptionincong for example) differently and then call them in a random method...or not. 

Maybe I should just be asking if there is a way to select randomly instead of the current index?

Hopefully, I can get my head around the logic here before too long and, in the not too distant future, be able to stop bugging you. :-)

Regards

Jason

Dave,

Sorry, I'm trying hard to wrap my head around all this. It appears that seledtionmode is no longer a valid attribute. Is that correct? Much of the online documentation refers to it but in experimenting with it I'm getting a "not a valid attribute" error.

Jason
Dave
Dave
Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)
Group: Administrators
Posts: 12K, Visits: 98K
Musashi Jason - Wednesday, June 13, 2018
Musashi Jason - Wednesday, June 13, 2018
Dave - Tuesday, June 12, 2018
Musashi Jason - Tuesday, June 12, 2018

Dave,

Continuing to bug you here...regarding the mismatch setup, am I correct in understanding that I can simply make a new trial using the text, image, audio, and items already specified in my script?  So, for example, I could make a new trial, like:

<trial firsttrialnomatch>
/ ontrialbegin = [
values.correcth = list.hpos.nextvalue;
values.distractorh = list.hpos.nextvalue;
]
/ stimulustimes = [0= mask; 500=mypicture; 515=clearscreen; 516=mask; 1015=clearscreen; 1700=correctoption, distractoroption; 2200=mysound]
/ validresponse = (anyresponse)
/ beginresponsetime = 2000
/ inputdevice = voicerecord
/ responseinterrupt = frames
/ trialduration = 6000
/ recorddata = true

and then modify it (somehow) to present incongruous mypicture and mysound?  Or do I need to make adjustments elsewhere to make the items present in a different order? I feel like the latter is the case but am not sure where to start.

Regards

Jason


No, you need to set up new/additional <picture>, <sound> and <text> elements for the mismatch <trial>.

The already existing ones are _paired for matches_

<picture mypicture>
/ items = pictureitems
</picture>

<item pictureitems>
/ 1 = "dog.jpg"
/ 2 = "cat.jpg"
/ 3 = "apple.jpg"
/ 4 = "house.jpg"
/ 5 = "ball.jpg"
/ 6 = "banana.jpg"
/ 7 = "boat.jpg"
/ 8 = "snail.jpg"
/ 9 = "tree.jpg"
/10 = "boat.jpg"
</item>

<sound mysound>
/ items = sounditems
/ select = picture.mypicture.currentindex
/ erase = false
</sound>

<item sounditems>
/ 1 = "dog.wav"
/ 2 = "cat.wav"
/ 3 = "apple.wav"
/ 4 = "house.wav"
/ 5 = "ball.wav"
/ 6 = "banana.wav"
/ 7 = "boat.wav"
/ 8 = "snail.wav"
/ 9 = "tree.wav"
/ 10 = "car.wav"
</item>

etc.

You need additional ones that are _paired for mismatches_

Dave,

Thanks for your help. Ok, I understand that I need a new set to run through with a mismatched pairing...but how do I accomplish the mismatch? I'm guessing it is in the line you've bolded:

/select = picture.mypicture.currentindex

and that I need to use something other than currentindex so as to get a different image but, as I continue to be painfully ignorant of the syntax, I'm not sure what to use. I toggled through the options that are presented when I type the period after mypicture but none appears to provide a 'random' select type function. 

To review my understanding of the logic:

selectionrate, in the <list hpos> section ensures that options are randomly placed on either the left or right of the screen, right? (I think my understanding is correct here, hopefully)

In addition, I was hoping that distractor items selected each time would be random...but upon further inspection I now see that that is not the case. The correctitems and distractor items (1, 2, 3, etc.) are paired when presented... I've made an embarrassing realization about how the script is functioning vs how I thought it was functioning. But that's a step forward in terms of my knowledge base. ;-)

So if I simply renumber my items (to have mismatches between picture and sound files) I should be able to accomplish what I want, correct?

So I basically make a new 'routine' (maybe not the most accurate terminology), using different variable names (e.g. mypictureincong, pictureitemsincong, mysoundincong, correctoptionincong, distractoritemincong, etc.) and then call those from a trial as is done in what I have now? But I can still use the same root files (pictures, audio)...I just need to label them differently as items, text, sound, etc. Hopefully, my logic is all in order here...?

Or, (sorry I'm typing as I think here) maybe I can just make new <text> labeling items (correctoptionincong for example) differently and then call them in a random method...or not. 

Maybe I should just be asking if there is a way to select randomly instead of the current index?

Hopefully, I can get my head around the logic here before too long and, in the not too distant future, be able to stop bugging you. :-)

Regards

Jason

Dave,

Sorry, I'm trying hard to wrap my head around all this. It appears that seledtionmode is no longer a valid attribute. Is that correct? Much of the online documentation refers to it but in experimenting with it I'm getting a "not a valid attribute" error.

Jason

Jason,

The script works like this:

<picture mypicture>
/ items = pictureitems
</picture>

selects from its items randomly without replacement. That's the default behavior. The items are ordered like this:

<item pictureitems>
/ 1 = "dog.jpg"
/ 2 = "cat.jpg"
/ 3 = "apple.jpg"
/ 4 = "house.jpg"
/ 5 = "ball.jpg"
/ 6 = "banana.jpg"
/ 7 = "boat.jpg"
/ 8 = "snail.jpg"
/ 9 = "tree.jpg"
/10 = "boat.jpg"
</item>

The remaining "matched" stimulus elements, like

<sound mysound>
/ items = sounditems
/ select = picture.mypicture.currentindex
/ erase = false
</sound>

are then simply instructed to select the _same_ item index number as <picture mypicture> has selected randomly. That's how you get the matching pairs, because the existing <sound> and various <text> elements' items are ordered in the same way:

<item pictureitems>
/ 1 = "dog.jpg"
/ 2 = "cat.jpg"
/ 3 = "apple.jpg"
/ 4 = "house.jpg"
/ 5 = "ball.jpg"
/ 6 = "banana.jpg"
/ 7 = "boat.jpg"
/ 8 = "snail.jpg"
/ 9 = "tree.jpg"
/10 = "boat.jpg"
</item>

dog is the 1st item in the <picture mypicture> element, and it's also the 1st item in the corresponding <sound> element:

<item sounditems>
/ 1 = "dog.wav"
/ 2 = "cat.wav"
/ 3 = "apple.wav"
/ 4 = "house.wav"
/ 5 = "ball.wav"
/ 6 = "banana.wav"
/ 7 = "boat.wav"
/ 8 = "snail.wav"
/ 9 = "tree.wav"
/ 10 = "car.wav"
</item>

and so forth. If the 5th item is randomly selected in <picture mypicture>, the 5th item will also be selected in <sound mysound> in the given trial.

The <list hpos> has nothing to do with this. It's merely responsible for randomizing the on-screen position of the response options in the trials.

Now, to produce mismatches, you go about it in the same way IF you want SPECIFIC mismatches, you simply order the items differently. Suppose you want the picture of a dog paired with the sound of a cat, then you do

<picture mypicture2>
/ items = pictureitems2
</picture>

<item pictureitems2>
/ 1 = "dog.jpg"
...
</item>

with

<sound mysound2>
/ items = sounditems2
/ select = picture.mypicture2.currentindex
/ erase = false
</sound>

<item sounditems2>
/ 1 = "cat.wav"
...
</item>

If you want some sort of _random_ matches, you would work with <list> elements holding item numbers and /not attributes in those <list>s instead.


Dave
Dave
Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)
Group: Administrators
Posts: 12K, Visits: 98K
Musashi Jason - Wednesday, June 13, 2018

Dave,

Sorry, I'm trying hard to wrap my head around all this. It appears that seledtionmode is no longer a valid attribute. Is that correct? Much of the online documentation refers to it but in experimenting with it I'm getting a "not a valid attribute" error.

Jason

As for /selectionmode, that attribute has only ever been valid for <list> elements. It does not apply to stimulus elements like <picture>, <text>, or <sound>. The attribute determining selection in stimulus elements is /select.

Musashi Jason
Musashi Jason
Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)Distinguished Member (4K reputation)
Group: Forum Members
Posts: 61, Visits: 158
Dave - Wednesday, June 13, 2018
Musashi Jason - Wednesday, June 13, 2018

Dave,

Sorry, I'm trying hard to wrap my head around all this. It appears that seledtionmode is no longer a valid attribute. Is that correct? Much of the online documentation refers to it but in experimenting with it I'm getting a "not a valid attribute" error.

Jason

As for /selectionmode, that attribute has only ever been valid for <list> elements. It does not apply to stimulus elements like <picture>, <text>, or <sound>. The attribute determining selection in stimulus elements is /select.

Dave,

Thanks again for your help. I need to back up a bit and read through the online documentation some more. Your flow explanation here help emensly though. I'll try and study some more for a while before burdening you with more inquiries. ;-)

Regards

Jason
GO

Merge Selected

Merge into selected topic...



Merge into merge target...



Merge into a specific topic ID...




Reading This Topic

Explore
Messages
Mentions
Search