Tingyu
|
|
Group: Forum Members
Posts: 5,
Visits: 23
|
I am doing a research based on keystroke dynamics which needs to collect the keyboard input, press time and release time of every key input.
I wonder is there any method to collect the release time of a key input?
From previous discussion in the forum, I suppose I need to do by <trial> and now I can collect keyboard input and latency in a <trial>. But release time of each key input is still needed.
|
|
|
Dave
|
|
Group: Administrators
Posts: 13K,
Visits: 105K
|
+xI am doing a research based on keystroke dynamics which needs to collect the keyboard input, press time and release time of every key input. I wonder is there any method to collect the release time of a key input? From previous discussion in the forum, I suppose I need to do by <trial> and now I can collect keyboard input and latency in a <trial>. But release time of each key input is still needed. <values> / space_presslatency = -1 / space_releaselatency = -1 </values>
<block myblock> / trials = [1-4 = example] </block>
<trial example> / pretrialpause = 500 / stimulusframes = [1=mytext] / validresponse = (57, -57) / isvalidresponse = [ if (trial.example.response == 57) { // capture latency of spacebar press values.space_presslatency = trial.example.latency; // don't end the trial return false; } else if (trial.example.response == -57) { // capture latency of spacebar release values.space_releaselatency = trial.example.latency; // end the trial return true; }; ] </trial>
<text mytext> / items = ("Press and then release the spacebar.") </text>
<data> / columns = (date time subject group session blocknum blockcode trialnum trialcode response latency correct values.space_presslatency values.space_releaselatency) </data>
is how you can capture press and key release times. A key release is indicated by a negative keyboard scancode ( https://www.millisecond.com/support/docs/current/html/language/scancodes.htm ). To add: Generalizing the above to capture an arbitrary key's press and corresponding release would go along the following lines: <values> / key = 0 // scancode of the pressed key / char = "" // corresponding character / key_presslatency = -1 / key_releaselatency = -1 / key_pressduration = -1 </values>
<block myblock> / trials = [1-4 = example] </block>
<trial example> / ontrialbegin = [ values.key = 0; // reset key variable ] / pretrialpause = 500 / stimulusframes = [1=mytext] / isvalidresponse = [ // check if we have a key press if (trial.example.response > 0 && values.key == 0) { // capture which key was pressed (scancode) values.key = trial.example.response; // capture which key was pressed (character) values.char = trial.example.responsetext; // capture latency of key press values.key_presslatency = trial.example.latency; // don't end the trial return false; } // check for key's release else if (trial.example.response == -1*values.key) { // capture latency of key release values.key_releaselatency = trial.example.latency; // calculate key press duration (release time - press time) values.key_pressduration = values.key_releaselatency - values.key_presslatency; // end the trial return true; }; ] </trial>
<text mytext> / items = ("Press any key and then release it.") </text>
<data> / columns = (date time subject group session blocknum blockcode trialnum trialcode response latency correct values.char values.key values.key_presslatency values.key_releaselatency values.key_pressduration) </data>
|
|
|
Tingyu
|
|
Group: Forum Members
Posts: 5,
Visits: 23
|
+x+xI am doing a research based on keystroke dynamics which needs to collect the keyboard input, press time and release time of every key input. I wonder is there any method to collect the release time of a key input? From previous discussion in the forum, I suppose I need to do by <trial> and now I can collect keyboard input and latency in a <trial>. But release time of each key input is still needed. <values> / space_presslatency = -1 / space_releaselatency = -1 </values>
<block myblock> / trials = [1-4 = example] </block>
<trial example> / pretrialpause = 500 / stimulusframes = [1=mytext] / validresponse = (57, -57) / isvalidresponse = [ if (trial.example.response == 57) { // capture latency of spacebar press values.space_presslatency = trial.example.latency; // don't end the trial return false; } else if (trial.example.response == -57) { // capture latency of spacebar release values.space_releaselatency = trial.example.latency; // end the trial return true; }; ] </trial>
<text mytext> / items = ("Press and then release the spacebar.") </text>
<data> / columns = (date time subject group session blocknum blockcode trialnum trialcode response latency correct values.space_presslatency values.space_releaselatency) </data>
is how you can capture press and key release times. A key release is indicated by a negative keyboard scancode ( https://www.millisecond.com/support/docs/current/html/language/scancodes.htm ). To add: Generalizing the above to capture an arbitrary key's press and corresponding release would go along the following lines: <values> / key = 0 // scancode of the pressed key / char = "" // corresponding character / key_presslatency = -1 / key_releaselatency = -1 / key_pressduration = -1 </values>
<block myblock> / trials = [1-4 = example] </block>
<trial example> / ontrialbegin = [ values.key = 0; // reset key variable ] / pretrialpause = 500 / stimulusframes = [1=mytext] / isvalidresponse = [ // check if we have a key press if (trial.example.response > 0 && values.key == 0) { // capture which key was pressed (scancode) values.key = trial.example.response; // capture which key was pressed (character) values.char = trial.example.responsetext; // capture latency of key press values.key_presslatency = trial.example.latency; // don't end the trial return false; } // check for key's release else if (trial.example.response == -1*values.key) { // capture latency of key release values.key_releaselatency = trial.example.latency; // calculate key press duration (release time - press time) values.key_pressduration = values.key_releaselatency - values.key_presslatency; // end the trial return true; }; ] </trial>
<text mytext> / items = ("Press any key and then release it.") </text>
<data> / columns = (date time subject group session blocknum blockcode trialnum trialcode response latency correct values.char values.key values.key_presslatency values.key_releaselatency values.key_pressduration) </data> Thank you David, it really helps! By the way, if the input is expected to be in the flexible length, should I try to use /branch to control instead of setting the block(/trials = [1-4 = example])? I am working on it but have not made it work.
|
|
|
Dave
|
|
Group: Administrators
Posts: 13K,
Visits: 105K
|
+x+x+xI am doing a research based on keystroke dynamics which needs to collect the keyboard input, press time and release time of every key input. I wonder is there any method to collect the release time of a key input? From previous discussion in the forum, I suppose I need to do by <trial> and now I can collect keyboard input and latency in a <trial>. But release time of each key input is still needed. <values> / space_presslatency = -1 / space_releaselatency = -1 </values>
<block myblock> / trials = [1-4 = example] </block>
<trial example> / pretrialpause = 500 / stimulusframes = [1=mytext] / validresponse = (57, -57) / isvalidresponse = [ if (trial.example.response == 57) { // capture latency of spacebar press values.space_presslatency = trial.example.latency; // don't end the trial return false; } else if (trial.example.response == -57) { // capture latency of spacebar release values.space_releaselatency = trial.example.latency; // end the trial return true; }; ] </trial>
<text mytext> / items = ("Press and then release the spacebar.") </text>
<data> / columns = (date time subject group session blocknum blockcode trialnum trialcode response latency correct values.space_presslatency values.space_releaselatency) </data>
is how you can capture press and key release times. A key release is indicated by a negative keyboard scancode ( https://www.millisecond.com/support/docs/current/html/language/scancodes.htm ). To add: Generalizing the above to capture an arbitrary key's press and corresponding release would go along the following lines: <values> / key = 0 // scancode of the pressed key / char = "" // corresponding character / key_presslatency = -1 / key_releaselatency = -1 / key_pressduration = -1 </values>
<block myblock> / trials = [1-4 = example] </block>
<trial example> / ontrialbegin = [ values.key = 0; // reset key variable ] / pretrialpause = 500 / stimulusframes = [1=mytext] / isvalidresponse = [ // check if we have a key press if (trial.example.response > 0 && values.key == 0) { // capture which key was pressed (scancode) values.key = trial.example.response; // capture which key was pressed (character) values.char = trial.example.responsetext; // capture latency of key press values.key_presslatency = trial.example.latency; // don't end the trial return false; } // check for key's release else if (trial.example.response == -1*values.key) { // capture latency of key release values.key_releaselatency = trial.example.latency; // calculate key press duration (release time - press time) values.key_pressduration = values.key_releaselatency - values.key_presslatency; // end the trial return true; }; ] </trial>
<text mytext> / items = ("Press any key and then release it.") </text>
<data> / columns = (date time subject group session blocknum blockcode trialnum trialcode response latency correct values.char values.key values.key_presslatency values.key_releaselatency values.key_pressduration) </data> Thank you David, it really helps! By the way, if the input is expected to be in the flexible length, should I try to use /branch to control instead of setting the block(/trials = [1-4 = example])? I am working on it but have not made it work. Yeah, running as many trials as needed per /branch would be the way to go.
|
|
|
Tingyu
|
|
Group: Forum Members
Posts: 5,
Visits: 23
|
+x+x+x+xI am doing a research based on keystroke dynamics which needs to collect the keyboard input, press time and release time of every key input. I wonder is there any method to collect the release time of a key input? From previous discussion in the forum, I suppose I need to do by <trial> and now I can collect keyboard input and latency in a <trial>. But release time of each key input is still needed. <values> / space_presslatency = -1 / space_releaselatency = -1 </values>
<block myblock> / trials = [1-4 = example] </block>
<trial example> / pretrialpause = 500 / stimulusframes = [1=mytext] / validresponse = (57, -57) / isvalidresponse = [ if (trial.example.response == 57) { // capture latency of spacebar press values.space_presslatency = trial.example.latency; // don't end the trial return false; } else if (trial.example.response == -57) { // capture latency of spacebar release values.space_releaselatency = trial.example.latency; // end the trial return true; }; ] </trial>
<text mytext> / items = ("Press and then release the spacebar.") </text>
<data> / columns = (date time subject group session blocknum blockcode trialnum trialcode response latency correct values.space_presslatency values.space_releaselatency) </data>
is how you can capture press and key release times. A key release is indicated by a negative keyboard scancode ( https://www.millisecond.com/support/docs/current/html/language/scancodes.htm ). To add: Generalizing the above to capture an arbitrary key's press and corresponding release would go along the following lines: <values> / key = 0 // scancode of the pressed key / char = "" // corresponding character / key_presslatency = -1 / key_releaselatency = -1 / key_pressduration = -1 </values>
<block myblock> / trials = [1-4 = example] </block>
<trial example> / ontrialbegin = [ values.key = 0; // reset key variable ] / pretrialpause = 500 / stimulusframes = [1=mytext] / isvalidresponse = [ // check if we have a key press if (trial.example.response > 0 && values.key == 0) { // capture which key was pressed (scancode) values.key = trial.example.response; // capture which key was pressed (character) values.char = trial.example.responsetext; // capture latency of key press values.key_presslatency = trial.example.latency; // don't end the trial return false; } // check for key's release else if (trial.example.response == -1*values.key) { // capture latency of key release values.key_releaselatency = trial.example.latency; // calculate key press duration (release time - press time) values.key_pressduration = values.key_releaselatency - values.key_presslatency; // end the trial return true; }; ] </trial>
<text mytext> / items = ("Press any key and then release it.") </text>
<data> / columns = (date time subject group session blocknum blockcode trialnum trialcode response latency correct values.char values.key values.key_presslatency values.key_releaselatency values.key_pressduration) </data> Thank you David, it really helps! By the way, if the input is expected to be in the flexible length, should I try to use /branch to control instead of setting the block(/trials = [1-4 = example])? I am working on it but have not made it work. Yeah, running as many trials as needed per /branch would be the way to go. Thank you David! I met another problem. When people key in a sequence, sometimes the press of the second key is before the release of the first key. Considering this situation, I think collecting press and release of keys seperately (in 2 trials instead of 1 as what you show above) might be better. And I am trying to do that. Besides, Could I consider the time interval between two adjacent trials as 0? Then I can generate a complete keyboard input in time series.
|
|
|
Dave
|
|
Group: Administrators
Posts: 13K,
Visits: 105K
|
+x+x+x+x+xI am doing a research based on keystroke dynamics which needs to collect the keyboard input, press time and release time of every key input. I wonder is there any method to collect the release time of a key input? From previous discussion in the forum, I suppose I need to do by <trial> and now I can collect keyboard input and latency in a <trial>. But release time of each key input is still needed. <values> / space_presslatency = -1 / space_releaselatency = -1 </values>
<block myblock> / trials = [1-4 = example] </block>
<trial example> / pretrialpause = 500 / stimulusframes = [1=mytext] / validresponse = (57, -57) / isvalidresponse = [ if (trial.example.response == 57) { // capture latency of spacebar press values.space_presslatency = trial.example.latency; // don't end the trial return false; } else if (trial.example.response == -57) { // capture latency of spacebar release values.space_releaselatency = trial.example.latency; // end the trial return true; }; ] </trial>
<text mytext> / items = ("Press and then release the spacebar.") </text>
<data> / columns = (date time subject group session blocknum blockcode trialnum trialcode response latency correct values.space_presslatency values.space_releaselatency) </data>
is how you can capture press and key release times. A key release is indicated by a negative keyboard scancode ( https://www.millisecond.com/support/docs/current/html/language/scancodes.htm ). To add: Generalizing the above to capture an arbitrary key's press and corresponding release would go along the following lines: <values> / key = 0 // scancode of the pressed key / char = "" // corresponding character / key_presslatency = -1 / key_releaselatency = -1 / key_pressduration = -1 </values>
<block myblock> / trials = [1-4 = example] </block>
<trial example> / ontrialbegin = [ values.key = 0; // reset key variable ] / pretrialpause = 500 / stimulusframes = [1=mytext] / isvalidresponse = [ // check if we have a key press if (trial.example.response > 0 && values.key == 0) { // capture which key was pressed (scancode) values.key = trial.example.response; // capture which key was pressed (character) values.char = trial.example.responsetext; // capture latency of key press values.key_presslatency = trial.example.latency; // don't end the trial return false; } // check for key's release else if (trial.example.response == -1*values.key) { // capture latency of key release values.key_releaselatency = trial.example.latency; // calculate key press duration (release time - press time) values.key_pressduration = values.key_releaselatency - values.key_presslatency; // end the trial return true; }; ] </trial>
<text mytext> / items = ("Press any key and then release it.") </text>
<data> / columns = (date time subject group session blocknum blockcode trialnum trialcode response latency correct values.char values.key values.key_presslatency values.key_releaselatency values.key_pressduration) </data> Thank you David, it really helps! By the way, if the input is expected to be in the flexible length, should I try to use /branch to control instead of setting the block(/trials = [1-4 = example])? I am working on it but have not made it work. Yeah, running as many trials as needed per /branch would be the way to go. Thank you David! I met another problem. When people key in a sequence, sometimes the press of the second key is before the release of the first key. Considering this situation, I think collecting press and release of keys seperately (in 2 trials instead of 1 as what you show above) might be better. And I am trying to do that. Besides, Could I consider the time interval between two adjacent trials as 0? Then I can generate a complete keyboard input in time series. Not sure what you mean here. Be more specific about what, exactly, you want to do please
|
|
|
Tingyu
|
|
Group: Forum Members
Posts: 5,
Visits: 23
|
+x+x+x+x+x+xI am doing a research based on keystroke dynamics which needs to collect the keyboard input, press time and release time of every key input. I wonder is there any method to collect the release time of a key input? From previous discussion in the forum, I suppose I need to do by <trial> and now I can collect keyboard input and latency in a <trial>. But release time of each key input is still needed. <values> / space_presslatency = -1 / space_releaselatency = -1 </values>
<block myblock> / trials = [1-4 = example] </block>
<trial example> / pretrialpause = 500 / stimulusframes = [1=mytext] / validresponse = (57, -57) / isvalidresponse = [ if (trial.example.response == 57) { // capture latency of spacebar press values.space_presslatency = trial.example.latency; // don't end the trial return false; } else if (trial.example.response == -57) { // capture latency of spacebar release values.space_releaselatency = trial.example.latency; // end the trial return true; }; ] </trial>
<text mytext> / items = ("Press and then release the spacebar.") </text>
<data> / columns = (date time subject group session blocknum blockcode trialnum trialcode response latency correct values.space_presslatency values.space_releaselatency) </data>
is how you can capture press and key release times. A key release is indicated by a negative keyboard scancode ( https://www.millisecond.com/support/docs/current/html/language/scancodes.htm ). To add: Generalizing the above to capture an arbitrary key's press and corresponding release would go along the following lines: <values> / key = 0 // scancode of the pressed key / char = "" // corresponding character / key_presslatency = -1 / key_releaselatency = -1 / key_pressduration = -1 </values>
<block myblock> / trials = [1-4 = example] </block>
<trial example> / ontrialbegin = [ values.key = 0; // reset key variable ] / pretrialpause = 500 / stimulusframes = [1=mytext] / isvalidresponse = [ // check if we have a key press if (trial.example.response > 0 && values.key == 0) { // capture which key was pressed (scancode) values.key = trial.example.response; // capture which key was pressed (character) values.char = trial.example.responsetext; // capture latency of key press values.key_presslatency = trial.example.latency; // don't end the trial return false; } // check for key's release else if (trial.example.response == -1*values.key) { // capture latency of key release values.key_releaselatency = trial.example.latency; // calculate key press duration (release time - press time) values.key_pressduration = values.key_releaselatency - values.key_presslatency; // end the trial return true; }; ] </trial>
<text mytext> / items = ("Press any key and then release it.") </text>
<data> / columns = (date time subject group session blocknum blockcode trialnum trialcode response latency correct values.char values.key values.key_presslatency values.key_releaselatency values.key_pressduration) </data> Thank you David, it really helps! By the way, if the input is expected to be in the flexible length, should I try to use /branch to control instead of setting the block(/trials = [1-4 = example])? I am working on it but have not made it work. Yeah, running as many trials as needed per /branch would be the way to go. Thank you David! I met another problem. When people key in a sequence, sometimes the press of the second key is before the release of the first key. Considering this situation, I think collecting press and release of keys seperately (in 2 trials instead of 1 as what you show above) might be better. And I am trying to do that. Besides, Could I consider the time interval between two adjacent trials as 0? Then I can generate a complete keyboard input in time series. Not sure what you mean here. Be more specific about what, exactly, you want to do please There are actually two questions. Firstly, I also want to collect how long it takes between press of two keyboard input which are recorded by two trials in your example. For example, when typing in 'A' and 'B' seperately, now we have 'key_presslatency', 'key_releaselatency', 'key_pressduration' of A, B. Could I compute the time between two press just by ('key_presslatenccy' of B + 'key_pressduration' of A)? That's why I ask if there is no time interval or fixed time interval between trials because I think time between two press should also consider the time interval between two trials. Next question is from my testing. I found when typing 'AB', if I press 'B' before release of 'A' then this 'B' can not be recorded. So I adjuasted the script to collect press and release of a keyboard input seperately. Now what I have is a series of latency. If I want to calculate the press duration, it comes back to the first question -- I need to take time interval between two trials into consideration.
|
|
|
Dave
|
|
Group: Administrators
Posts: 13K,
Visits: 105K
|
+x+x+x+x+x+x+xI am doing a research based on keystroke dynamics which needs to collect the keyboard input, press time and release time of every key input. I wonder is there any method to collect the release time of a key input? From previous discussion in the forum, I suppose I need to do by <trial> and now I can collect keyboard input and latency in a <trial>. But release time of each key input is still needed. <values> / space_presslatency = -1 / space_releaselatency = -1 </values>
<block myblock> / trials = [1-4 = example] </block>
<trial example> / pretrialpause = 500 / stimulusframes = [1=mytext] / validresponse = (57, -57) / isvalidresponse = [ if (trial.example.response == 57) { // capture latency of spacebar press values.space_presslatency = trial.example.latency; // don't end the trial return false; } else if (trial.example.response == -57) { // capture latency of spacebar release values.space_releaselatency = trial.example.latency; // end the trial return true; }; ] </trial>
<text mytext> / items = ("Press and then release the spacebar.") </text>
<data> / columns = (date time subject group session blocknum blockcode trialnum trialcode response latency correct values.space_presslatency values.space_releaselatency) </data>
is how you can capture press and key release times. A key release is indicated by a negative keyboard scancode ( https://www.millisecond.com/support/docs/current/html/language/scancodes.htm ). To add: Generalizing the above to capture an arbitrary key's press and corresponding release would go along the following lines: <values> / key = 0 // scancode of the pressed key / char = "" // corresponding character / key_presslatency = -1 / key_releaselatency = -1 / key_pressduration = -1 </values>
<block myblock> / trials = [1-4 = example] </block>
<trial example> / ontrialbegin = [ values.key = 0; // reset key variable ] / pretrialpause = 500 / stimulusframes = [1=mytext] / isvalidresponse = [ // check if we have a key press if (trial.example.response > 0 && values.key == 0) { // capture which key was pressed (scancode) values.key = trial.example.response; // capture which key was pressed (character) values.char = trial.example.responsetext; // capture latency of key press values.key_presslatency = trial.example.latency; // don't end the trial return false; } // check for key's release else if (trial.example.response == -1*values.key) { // capture latency of key release values.key_releaselatency = trial.example.latency; // calculate key press duration (release time - press time) values.key_pressduration = values.key_releaselatency - values.key_presslatency; // end the trial return true; }; ] </trial>
<text mytext> / items = ("Press any key and then release it.") </text>
<data> / columns = (date time subject group session blocknum blockcode trialnum trialcode response latency correct values.char values.key values.key_presslatency values.key_releaselatency values.key_pressduration) </data> Thank you David, it really helps! By the way, if the input is expected to be in the flexible length, should I try to use /branch to control instead of setting the block(/trials = [1-4 = example])? I am working on it but have not made it work. Yeah, running as many trials as needed per /branch would be the way to go. Thank you David! I met another problem. When people key in a sequence, sometimes the press of the second key is before the release of the first key. Considering this situation, I think collecting press and release of keys seperately (in 2 trials instead of 1 as what you show above) might be better. And I am trying to do that. Besides, Could I consider the time interval between two adjacent trials as 0? Then I can generate a complete keyboard input in time series. Not sure what you mean here. Be more specific about what, exactly, you want to do please There are actually two questions. Firstly, I also want to collect how long it takes between press of two keyboard input which are recorded by two trials in your example. For example, when typing in 'A' and 'B' seperately, now we have 'key_presslatency', 'key_releaselatency', 'key_pressduration' of A, B. Could I compute the time between two press just by ('key_presslatenccy' of B + 'key_pressduration' of A)? That's why I ask if there is no time interval or fixed time interval between trials because I think time between two press should also consider the time interval between two trials. Next question is from my testing. I found when typing 'AB', if I press 'B' before release of 'A' then this 'B' can not be recorded. So I adjuasted the script to collect press and release of a keyboard input seperately. Now what I have is a series of latency. If I want to calculate the press duration, it comes back to the first question -- I need to take time interval between two trials into consideration. Don't use latency then, but script.elapsedtime. I.e., take script.elapsedtime when key "A" is pressed. Take script.elapsedtime when "B" is pressed. Same for releases. Time between keypresses A and B is keypress time B minus keypress time A. Key press duration of A is key release time of A minus key press time of A, and so forth. The script.elapsedtime is measure from the start of script execution, so it includes any "time interval between trials." https://www.millisecond.com/support/docs/current/html/language/properties/elapsedtime.htm
|
|
|