psychopy 2025.1.0__py3-none-any.whl → 2025.2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of psychopy might be problematic. Click here for more details.

Files changed (226) hide show
  1. psychopy/VERSION +1 -1
  2. psychopy/alerts/alertsCatalogue/4810.yaml +19 -0
  3. psychopy/alerts/alertsCatalogue/alertCategories.yaml +4 -0
  4. psychopy/alerts/alertsCatalogue/alertmsg.py +15 -1
  5. psychopy/alerts/alertsCatalogue/generateAlertmsg.py +2 -2
  6. psychopy/app/Resources/classic/add_many.png +0 -0
  7. psychopy/app/Resources/classic/add_many@2x.png +0 -0
  8. psychopy/app/Resources/classic/devices.png +0 -0
  9. psychopy/app/Resources/classic/devices@2x.png +0 -0
  10. psychopy/app/Resources/classic/photometer.png +0 -0
  11. psychopy/app/Resources/classic/photometer@2x.png +0 -0
  12. psychopy/app/Resources/dark/add_many.png +0 -0
  13. psychopy/app/Resources/dark/add_many@2x.png +0 -0
  14. psychopy/app/Resources/dark/devices.png +0 -0
  15. psychopy/app/Resources/dark/devices@2x.png +0 -0
  16. psychopy/app/Resources/dark/photometer.png +0 -0
  17. psychopy/app/Resources/dark/photometer@2x.png +0 -0
  18. psychopy/app/Resources/light/add_many.png +0 -0
  19. psychopy/app/Resources/light/add_many@2x.png +0 -0
  20. psychopy/app/Resources/light/devices.png +0 -0
  21. psychopy/app/Resources/light/devices@2x.png +0 -0
  22. psychopy/app/Resources/light/photometer.png +0 -0
  23. psychopy/app/Resources/light/photometer@2x.png +0 -0
  24. psychopy/app/_psychopyApp.py +35 -13
  25. psychopy/app/builder/builder.py +88 -35
  26. psychopy/app/builder/dialogs/__init__.py +69 -220
  27. psychopy/app/builder/dialogs/dlgsCode.py +29 -8
  28. psychopy/app/builder/dialogs/paramCtrls.py +1468 -904
  29. psychopy/app/builder/validators.py +25 -17
  30. psychopy/app/coder/coder.py +12 -1
  31. psychopy/app/coder/repl.py +5 -2
  32. psychopy/app/colorpicker/__init__.py +1 -1
  33. psychopy/app/deviceManager/__init__.py +1 -0
  34. psychopy/app/deviceManager/addDialog.py +218 -0
  35. psychopy/app/deviceManager/dialog.py +185 -0
  36. psychopy/app/deviceManager/panel.py +191 -0
  37. psychopy/app/deviceManager/utils.py +60 -0
  38. psychopy/app/idle.py +7 -0
  39. psychopy/app/locale/ar_001/LC_MESSAGE/messages.mo +0 -0
  40. psychopy/app/locale/ar_001/LC_MESSAGE/messages.po +12695 -10592
  41. psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.mo +0 -0
  42. psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.po +10199 -24
  43. psychopy/app/locale/da_DK/LC_MESSAGE/messages.mo +0 -0
  44. psychopy/app/locale/da_DK/LC_MESSAGE/messages.po +10199 -24
  45. psychopy/app/locale/de_DE/LC_MESSAGE/messages.mo +0 -0
  46. psychopy/app/locale/de_DE/LC_MESSAGE/messages.po +11221 -9712
  47. psychopy/app/locale/el_GR/LC_MESSAGE/messages.mo +0 -0
  48. psychopy/app/locale/el_GR/LC_MESSAGE/messages.po +10200 -25
  49. psychopy/app/locale/en_NZ/LC_MESSAGE/messages.mo +0 -0
  50. psychopy/app/locale/en_NZ/LC_MESSAGE/messages.po +10200 -25
  51. psychopy/app/locale/en_US/LC_MESSAGE/messages.mo +0 -0
  52. psychopy/app/locale/en_US/LC_MESSAGE/messages.po +10195 -18
  53. psychopy/app/locale/es_CO/LC_MESSAGE/messages.mo +0 -0
  54. psychopy/app/locale/es_CO/LC_MESSAGE/messages.po +11917 -9101
  55. psychopy/app/locale/es_ES/LC_MESSAGE/messages.mo +0 -0
  56. psychopy/app/locale/es_ES/LC_MESSAGE/messages.po +11924 -9103
  57. psychopy/app/locale/es_US/LC_MESSAGE/messages.mo +0 -0
  58. psychopy/app/locale/es_US/LC_MESSAGE/messages.po +11917 -9101
  59. psychopy/app/locale/et_EE/LC_MESSAGE/messages.mo +0 -0
  60. psychopy/app/locale/et_EE/LC_MESSAGE/messages.po +11084 -9569
  61. psychopy/app/locale/fa_IR/LC_MESSAGE/messages.mo +0 -0
  62. psychopy/app/locale/fa_IR/LC_MESSAGE/messages.po +11590 -5806
  63. psychopy/app/locale/fi_FI/LC_MESSAGE/messages.mo +0 -0
  64. psychopy/app/locale/fi_FI/LC_MESSAGE/messages.po +10199 -24
  65. psychopy/app/locale/fr_FR/LC_MESSAGE/messages.mo +0 -0
  66. psychopy/app/locale/fr_FR/LC_MESSAGE/messages.po +11091 -9577
  67. psychopy/app/locale/he_IL/LC_MESSAGE/messages.mo +0 -0
  68. psychopy/app/locale/he_IL/LC_MESSAGE/messages.po +11072 -9549
  69. psychopy/app/locale/hi_IN/LC_MESSAGE/messages.mo +0 -0
  70. psychopy/app/locale/hi_IN/LC_MESSAGE/messages.po +11071 -9559
  71. psychopy/app/locale/hu_HU/LC_MESSAGE/messages.mo +0 -0
  72. psychopy/app/locale/hu_HU/LC_MESSAGE/messages.po +10200 -25
  73. psychopy/app/locale/it_IT/LC_MESSAGE/messages.mo +0 -0
  74. psychopy/app/locale/it_IT/LC_MESSAGE/messages.po +11072 -9560
  75. psychopy/app/locale/ja_JP/LC_MESSAGE/messages.mo +0 -0
  76. psychopy/app/locale/ja_JP/LC_MESSAGE/messages.po +1485 -1137
  77. psychopy/app/locale/ko_KR/LC_MESSAGE/messages.mo +0 -0
  78. psychopy/app/locale/ko_KR/LC_MESSAGE/messages.po +10199 -24
  79. psychopy/app/locale/ms_MY/LC_MESSAGE/messages.mo +0 -0
  80. psychopy/app/locale/ms_MY/LC_MESSAGE/messages.po +11463 -8757
  81. psychopy/app/locale/nl_NL/LC_MESSAGE/messages.mo +0 -0
  82. psychopy/app/locale/nl_NL/LC_MESSAGE/messages.po +10200 -25
  83. psychopy/app/locale/nn_NO/LC_MESSAGE/messages.mo +0 -0
  84. psychopy/app/locale/nn_NO/LC_MESSAGE/messages.po +10200 -25
  85. psychopy/app/locale/pl_PL/LC_MESSAGE/messages.mo +0 -0
  86. psychopy/app/locale/pl_PL/LC_MESSAGE/messages.po +10200 -25
  87. psychopy/app/locale/pt_PT/LC_MESSAGE/messages.mo +0 -0
  88. psychopy/app/locale/pt_PT/LC_MESSAGE/messages.po +11288 -9434
  89. psychopy/app/locale/ro_RO/LC_MESSAGE/messages.mo +0 -0
  90. psychopy/app/locale/ro_RO/LC_MESSAGE/messages.po +10200 -25
  91. psychopy/app/locale/ru_RU/LC_MESSAGE/messages.mo +0 -0
  92. psychopy/app/locale/ru_RU/LC_MESSAGE/messages.po +10199 -24
  93. psychopy/app/locale/sv_SE/LC_MESSAGE/messages.mo +0 -0
  94. psychopy/app/locale/sv_SE/LC_MESSAGE/messages.po +11441 -8747
  95. psychopy/app/locale/tr_TR/LC_MESSAGE/messages.mo +0 -0
  96. psychopy/app/locale/tr_TR/LC_MESSAGE/messages.po +11069 -9545
  97. psychopy/app/locale/zh_CN/LC_MESSAGE/messages.mo +0 -0
  98. psychopy/app/locale/zh_CN/LC_MESSAGE/messages.po +12085 -8268
  99. psychopy/app/locale/zh_TW/LC_MESSAGE/messages.mo +0 -0
  100. psychopy/app/locale/zh_TW/LC_MESSAGE/messages.po +11929 -8022
  101. psychopy/app/plugin_manager/dialog.py +12 -3
  102. psychopy/app/plugin_manager/packageIndex.py +303 -0
  103. psychopy/app/plugin_manager/packages.py +203 -63
  104. psychopy/app/plugin_manager/plugins.py +120 -240
  105. psychopy/app/preferencesDlg.py +6 -1
  106. psychopy/app/psychopyApp.py +16 -4
  107. psychopy/app/runner/runner.py +10 -2
  108. psychopy/app/runner/scriptProcess.py +8 -3
  109. psychopy/app/stdout/stdOutRich.py +11 -4
  110. psychopy/app/themes/icons.py +3 -0
  111. psychopy/app/utils.py +61 -0
  112. psychopy/colors.py +10 -5
  113. psychopy/data/experiment.py +133 -23
  114. psychopy/data/routine.py +12 -0
  115. psychopy/data/staircase.py +42 -20
  116. psychopy/data/trial.py +20 -12
  117. psychopy/data/utils.py +43 -3
  118. psychopy/demos/builder/Experiments/dragAndDrop/drag_and_drop.psyexp +22 -5
  119. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solutions.xlsx +0 -0
  120. psychopy/demos/builder/Experiments/stroopVoice/stroopVoice.psyexp +2 -12
  121. psychopy/demos/builder/Feature Demos/buttonBox/buttonBoxDemo.psyexp +3 -8
  122. psychopy/demos/builder/Feature Demos/movies/movie.psyexp +220 -0
  123. psychopy/demos/builder/Feature Demos/movies/readme.md +3 -0
  124. psychopy/demos/builder/Feature Demos/visualValidator/visualValidator.psyexp +1 -2
  125. psychopy/demos/builder/Hardware/camera/camera.psyexp +3 -16
  126. psychopy/demos/builder/Hardware/microphone/microphone.psyexp +3 -16
  127. psychopy/demos/coder/hardware/hdf5_extract.py +133 -0
  128. psychopy/event.py +20 -15
  129. psychopy/experiment/_experiment.py +86 -10
  130. psychopy/experiment/components/__init__.py +3 -10
  131. psychopy/experiment/components/_base.py +9 -20
  132. psychopy/experiment/components/button/__init__.py +1 -1
  133. psychopy/experiment/components/buttonBox/__init__.py +50 -54
  134. psychopy/experiment/components/camera/__init__.py +137 -359
  135. psychopy/experiment/components/keyboard/__init__.py +17 -24
  136. psychopy/experiment/components/microphone/__init__.py +61 -110
  137. psychopy/experiment/components/movie/__init__.py +2 -3
  138. psychopy/experiment/components/serialOut/__init__.py +192 -93
  139. psychopy/experiment/components/settings/__init__.py +45 -27
  140. psychopy/experiment/components/sound/__init__.py +82 -73
  141. psychopy/experiment/components/soundsensor/__init__.py +43 -80
  142. psychopy/experiment/devices.py +303 -0
  143. psychopy/experiment/exports.py +20 -18
  144. psychopy/experiment/flow.py +7 -0
  145. psychopy/experiment/loops.py +47 -29
  146. psychopy/experiment/monitor.py +74 -0
  147. psychopy/experiment/params.py +48 -10
  148. psychopy/experiment/plugins.py +28 -108
  149. psychopy/experiment/py2js_transpiler.py +1 -1
  150. psychopy/experiment/routines/__init__.py +1 -1
  151. psychopy/experiment/routines/_base.py +59 -24
  152. psychopy/experiment/routines/audioValidator/__init__.py +19 -155
  153. psychopy/experiment/routines/visualValidator/__init__.py +25 -25
  154. psychopy/hardware/__init__.py +20 -57
  155. psychopy/hardware/button.py +15 -2
  156. psychopy/hardware/camera/__init__.py +2237 -1394
  157. psychopy/hardware/joystick/__init__.py +1 -1
  158. psychopy/hardware/keyboard.py +5 -8
  159. psychopy/hardware/listener.py +4 -1
  160. psychopy/hardware/manager.py +75 -35
  161. psychopy/hardware/microphone.py +53 -7
  162. psychopy/hardware/monitor.py +144 -0
  163. psychopy/hardware/photometer/__init__.py +156 -117
  164. psychopy/hardware/serialdevice.py +16 -2
  165. psychopy/hardware/soundsensor.py +4 -1
  166. psychopy/iohub/devices/deviceConfigValidation.py +2 -1
  167. psychopy/iohub/devices/eyetracker/hw/gazepoint/__init__.py +2 -2
  168. psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/__init__.py +1 -0
  169. psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/eyetracker.py +10 -0
  170. psychopy/iohub/devices/keyboard/darwin.py +8 -5
  171. psychopy/iohub/util/__init__.py +7 -8
  172. psychopy/localization/generateTranslationTemplate.py +208 -116
  173. psychopy/localization/messages.pot +4305 -3502
  174. psychopy/monitors/MonitorCenter.py +174 -74
  175. psychopy/plugins/__init__.py +6 -4
  176. psychopy/preferences/devices.py +80 -0
  177. psychopy/preferences/generateHints.py +2 -1
  178. psychopy/preferences/preferences.py +35 -11
  179. psychopy/scripts/psychopy-pkgutil.py +969 -0
  180. psychopy/scripts/psyexpCompile.py +1 -1
  181. psychopy/session.py +34 -38
  182. psychopy/sound/__init__.py +6 -260
  183. psychopy/sound/audioclip.py +164 -0
  184. psychopy/sound/backend_ptb.py +8 -0
  185. psychopy/sound/backend_pygame.py +10 -0
  186. psychopy/sound/backend_pysound.py +9 -0
  187. psychopy/sound/backends/__init__.py +0 -0
  188. psychopy/sound/microphone.py +3 -0
  189. psychopy/sound/sound.py +58 -0
  190. psychopy/tests/data/correctScript/python/correctNoiseStimComponent.py +1 -1
  191. psychopy/tests/data/duplicateHeaders.csv +2 -0
  192. psychopy/tests/test_app/test_builder/test_BuilderFrame.py +22 -7
  193. psychopy/tests/test_app/test_builder/test_CompileFromBuilder.py +0 -2
  194. psychopy/tests/test_data/test_utils.py +5 -1
  195. psychopy/tests/test_experiment/test_components/test_ButtonBoxComponent.py +22 -2
  196. psychopy/tests/test_hardware/test_ports.py +0 -12
  197. psychopy/tests/test_tools/test_stringtools.py +1 -1
  198. psychopy/tools/attributetools.py +12 -5
  199. psychopy/tools/fontmanager.py +17 -14
  200. psychopy/tools/gltools.py +4 -2
  201. psychopy/tools/movietools.py +43 -2
  202. psychopy/tools/stringtools.py +33 -8
  203. psychopy/tools/versionchooser.py +1 -1
  204. psychopy/validation/audio.py +5 -1
  205. psychopy/validation/visual.py +5 -1
  206. psychopy/visual/basevisual.py +8 -7
  207. psychopy/visual/circle.py +2 -2
  208. psychopy/visual/helpers.py +3 -1
  209. psychopy/visual/image.py +29 -109
  210. psychopy/visual/movies/__init__.py +1800 -313
  211. psychopy/visual/polygon.py +4 -0
  212. psychopy/visual/shape.py +2 -2
  213. psychopy/visual/window.py +35 -12
  214. psychopy/voicekey/__init__.py +41 -669
  215. psychopy/voicekey/labjack_vks.py +7 -48
  216. psychopy/voicekey/parallel_vks.py +7 -42
  217. psychopy/voicekey/vk_tools.py +114 -263
  218. {psychopy-2025.1.0.dist-info → psychopy-2025.2.1.dist-info}/METADATA +20 -13
  219. {psychopy-2025.1.0.dist-info → psychopy-2025.2.1.dist-info}/RECORD +222 -190
  220. {psychopy-2025.1.0.dist-info → psychopy-2025.2.1.dist-info}/WHEEL +1 -1
  221. psychopy/visual/movies/players/__init__.py +0 -62
  222. psychopy/visual/movies/players/ffpyplayer_player.py +0 -1401
  223. psychopy/voicekey/demo_vks.py +0 -12
  224. psychopy/voicekey/signal.py +0 -42
  225. {psychopy-2025.1.0.dist-info → psychopy-2025.2.1.dist-info}/entry_points.txt +0 -0
  226. {psychopy-2025.1.0.dist-info → psychopy-2025.2.1.dist-info}/licenses/LICENSE +0 -0
psychopy/data/utils.py CHANGED
@@ -181,6 +181,35 @@ def indicesFromString(indsString):
181
181
  pass
182
182
 
183
183
 
184
+ def dictFromString(val):
185
+ # return as-is if already a dict
186
+ if isinstance(val, dict):
187
+ return val
188
+ # stringify
189
+ if not isinstance(val, str):
190
+ val = str(val)
191
+ # strip spaces
192
+ val = val.strip()
193
+ # make sure we have curly braces
194
+ if not val.startswith("{") and val.endswith("}"):
195
+ val = f"{{{val}}}"
196
+ # try to evaluate with ast (works for simple values)
197
+ try:
198
+ iterable = ast.literal_eval(val)
199
+ assert isinstance(iterable, dict)
200
+ return iterable
201
+ except (ValueError, SyntaxError, AssertionError):
202
+ pass # e.g. "yes, no" won't work. We'll go on and try another way
203
+ # try manually if ast fails
204
+ parsed = {}
205
+ for item in val[1:-1].split(","):
206
+ if ":" in item:
207
+ key, val = item.split(":", maxsplit=1)
208
+ parsed[key.strip()] = val.strip()
209
+
210
+ return parsed
211
+
212
+
184
213
  def listFromString(val, excludeEmpties=False):
185
214
  """Take a string that looks like a list (with commas and/or [] and make
186
215
  an actual python list"""
@@ -191,8 +220,7 @@ def listFromString(val, excludeEmpties=False):
191
220
  elif type(val) == list:
192
221
  return list(val) # nothing to do
193
222
  elif type(val) != str:
194
- raise ValueError("listFromString requires a string as its input not {}"
195
- .format(repr(val)))
223
+ return [val]
196
224
  # try to evaluate with ast (works for "'yes,'no'" or "['yes', 'no']")
197
225
  try:
198
226
  iterable = ast.literal_eval(val)
@@ -277,6 +305,10 @@ def importConditions(fileName, returnFieldNames=False, selection=""):
277
305
  thisAttempt = pd.read_csv(
278
306
  fileName, encoding='utf-8-sig', sep=sep, decimal=dec
279
307
  )
308
+ # read in the headers separately to bypass pandas sanitization
309
+ thisAttempt.columns = pd.read_csv(
310
+ fileName, encoding='utf-8-sig', sep=sep, decimal=dec, header=None, nrows=1
311
+ ).iloc[0, :]
280
312
  # if there's only one header, check that it doesn't contain delimiters
281
313
  # (one column with delims probably means it's parsed without error but not
282
314
  # recognised columns correctly)
@@ -335,12 +367,20 @@ def importConditions(fileName, returnFieldNames=False, selection=""):
335
367
  names are OK, return silently; else raise with msg
336
368
  """
337
369
  fileName = pathToString(fileName)
370
+ # make sure all columns are named
338
371
  if not all(fieldNames):
339
372
  raise exceptions.ConditionsImportError(
340
373
  "Conditions file %s: Missing parameter name(s); empty cell(s) in the first row?" % fileName,
341
374
  translated=_translate("Conditions file %s: Missing parameter name(s); empty cell(s) in the first row?") % fileName
342
375
  )
376
+ # check each name
343
377
  for name in fieldNames:
378
+ # is this name duplicated?
379
+ if sum([otherName == name for otherName in fieldNames]) > 1:
380
+ raise exceptions.ConditionsImportError(_translate(
381
+ "Duplicate column name '{}'"
382
+ ).format(name))
383
+ # is this name a valid variable name?
344
384
  OK, msg, translated = isValidVariableName(name)
345
385
  if not OK:
346
386
  # tailor message to importConditions
@@ -389,7 +429,7 @@ def importConditions(fileName, returnFieldNames=False, selection=""):
389
429
  if val.startswith('[') and val.endswith(']'):
390
430
  # val = eval('%s' %unicode(val.decode('utf8')))
391
431
  val = eval(val)
392
- elif type(val) == np.string_:
432
+ elif type(val) == np.bytes_:
393
433
  val = str(val.decode('utf-8-sig'))
394
434
  # if it looks like a list, convert it:
395
435
  if val.startswith('[') and val.endswith(']'):
@@ -1,5 +1,5 @@
1
1
  <?xml version="1.0" ?>
2
- <PsychoPy2experiment encoding="utf-8" version="2025.1.0">
2
+ <PsychoPy2experiment encoding="utf-8" version="2025.2.0">
3
3
  <Settings>
4
4
  <Param val="ptb" valType="str" updates="None" name="Audio lib"/>
5
5
  <Param val="" valType="str" updates="None" name="Completed URL"/>
@@ -258,7 +258,7 @@
258
258
  <Param val="True" valType="bool" updates="constant" name="bold"/>
259
259
  <Param val="None" valType="color" updates="constant" name="borderColor"/>
260
260
  <Param val="0" valType="num" updates="constant" name="borderWidth"/>
261
- <Param val="# each square is correct if it's within 0.1 units of target position&amp;#10;whiteSquareCorr = (&amp;#10; whiteSquarePos[0] - 0.1 &lt; whiteSquare.pos[0] &lt; whiteSquarePos[0] + 0.1&amp;#10; and whiteSquarePos[1] - 0.1 &lt; whiteSquare.pos[1] &lt; whiteSquarePos[1] + 0.1&amp;#10;)&amp;#10;pinkSquareCorr = (&amp;#10; pinkSquarePos[0] - 0.1 &lt; pinkSquare.pos[0] &lt; pinkSquarePos[0] + 0.1&amp;#10; and pinkSquarePos[1] - 0.1 &lt; pinkSquare.pos[1] &lt; pinkSquarePos[1] + 0.1&amp;#10;)&amp;#10;# trial is correct if both squares are correct&amp;#10;corr = whiteSquareCorr and pinkSquareCorr&amp;#10;# save positions and correct&amp;#10;thisExp.addData(&quot;whiteSquare.pos&quot;, whiteSquare.pos)&amp;#10;thisExp.addData(&quot;pinkSquare.pos&quot;, pinkSquare.pos)&amp;#10;thisExp.addData(&quot;whiteSquare.corr&quot;, whiteSquareCorr)&amp;#10;thisExp.addData(&quot;pinkSquare.corr&quot;, pinkSquareCorr)&amp;#10;# store time taken&amp;#10;timeTaken = t" valType="extendedCode" updates="constant" name="callback"/>
261
+ <Param val="# store time taken&amp;#10;timeTaken = t" valType="extendedCode" updates="constant" name="callback"/>
262
262
  <Param val="white" valType="color" updates="constant" name="color"/>
263
263
  <Param val="rgb" valType="str" updates="constant" name="colorSpace"/>
264
264
  <Param val="1" valType="num" updates="constant" name="contrast"/>
@@ -292,12 +292,12 @@
292
292
  <CodeComponent name="onlineChanges" plugin="None">
293
293
  <Param val="" valType="extendedCode" updates="constant" name="Before Experiment"/>
294
294
  <Param val="" valType="extendedCode" updates="constant" name="Before JS Experiment"/>
295
- <Param val="mouse = core.Mouse(win=win)" valType="extendedCode" updates="constant" name="Begin Experiment"/>
295
+ <Param val="" valType="extendedCode" updates="constant" name="Begin Experiment"/>
296
296
  <Param val="// create a Mouse to listen for drags&amp;#10;mouse = new core.Mouse({&quot;win&quot;: psychoJS.window});" valType="extendedCode" updates="constant" name="Begin JS Experiment"/>
297
- <Param val="// make sure the answers are read in as numbers rather than strings&amp;#10;for (let i in whiteSquarePos) { whiteSquarePos[i] = parseFloat(whiteSquarePos[i]); }&amp;#10;for (let i in pinkSquarePos) { pinkSquarePos[i] = parseFloat(pinkSquarePos[i]); }" valType="extendedCode" updates="constant" name="Begin JS Routine"/>
297
+ <Param val="" valType="extendedCode" updates="constant" name="Begin JS Routine"/>
298
298
  <Param val="" valType="extendedCode" updates="constant" name="Begin Routine"/>
299
299
  <Param val="JS" valType="str" updates="None" name="Code Type"/>
300
- <Param val="if mouse.isPressedIn(whiteSquare):&amp;#10; whiteSquare.setPos(&amp;#10; mouse.getPos()&amp;#10; )&amp;#10;if mouse.isPressedIn(pinkSquare):&amp;#10; pinkSquare.setPos(&amp;#10; mouse.getPos()&amp;#10; )" valType="extendedCode" updates="constant" name="Each Frame"/>
300
+ <Param val="" valType="extendedCode" updates="constant" name="Each Frame"/>
301
301
  <Param val="// drag each square if clicked on this frame&amp;#10;if (mouse.isPressedIn(whiteSquare)) {&amp;#10; whiteSquare.setPos(mouse.getPos());&amp;#10;}&amp;#10;if (mouse.isPressedIn(pinkSquare)) {&amp;#10; pinkSquare.setPos(mouse.getPos());&amp;#10;}&amp;#10;" valType="extendedCode" updates="constant" name="Each JS Frame"/>
302
302
  <Param val="" valType="extendedCode" updates="constant" name="End Experiment"/>
303
303
  <Param val="" valType="extendedCode" updates="constant" name="End JS Experiment"/>
@@ -306,6 +306,23 @@
306
306
  <Param val="False" valType="bool" updates="None" name="disabled"/>
307
307
  <Param val="onlineChanges" valType="code" updates="None" name="name"/>
308
308
  </CodeComponent>
309
+ <CodeComponent name="calculateCorrect" plugin="None">
310
+ <Param val="" valType="extendedCode" updates="constant" name="Before Experiment"/>
311
+ <Param val="" valType="extendedCode" updates="constant" name="Before JS Experiment"/>
312
+ <Param val="" valType="extendedCode" updates="constant" name="Begin Experiment"/>
313
+ <Param val="" valType="extendedCode" updates="constant" name="Begin JS Experiment"/>
314
+ <Param val="" valType="extendedCode" updates="constant" name="Begin JS Routine"/>
315
+ <Param val="" valType="extendedCode" updates="constant" name="Begin Routine"/>
316
+ <Param val="Both" valType="str" updates="None" name="Code Type"/>
317
+ <Param val="" valType="extendedCode" updates="constant" name="Each Frame"/>
318
+ <Param val="" valType="extendedCode" updates="constant" name="Each JS Frame"/>
319
+ <Param val="" valType="extendedCode" updates="constant" name="End Experiment"/>
320
+ <Param val="" valType="extendedCode" updates="constant" name="End JS Experiment"/>
321
+ <Param val="// make sure correct answers were read as floats&amp;#10;targetPos = {&amp;#10; white: whiteSquarePos.map(parseFloat),&amp;#10; pink: pinkSquarePos.map(parseFloat)&amp;#10;}&amp;#10;// do same as in Python, but with targetPos.___ rather than ___SquarePos&amp;#10;whiteSquareCorr = ((((targetPos.white[0] - 0.1) &lt; whiteSquare.pos[0]) &amp;&amp; (whiteSquare.pos[0] &lt; (targetPos.white[0] + 0.1))) &amp;&amp; (((targetPos.white[1] - 0.1) &lt; whiteSquare.pos[1]) &amp;&amp; (whiteSquare.pos[1] &lt; (targetPos.white[1] + 0.1))));&amp;#10;pinkSquareCorr = ((((targetPos.pink[0] - 0.1) &lt; pinkSquare.pos[0]) &amp;&amp; (pinkSquare.pos[0] &lt; (targetPos.pink[0] + 0.1))) &amp;&amp; (((targetPos.pink[1] - 0.1) &lt; pinkSquare.pos[1]) &amp;&amp; (pinkSquare.pos[1] &lt; (targetPos.pink[1] + 0.1))));&amp;#10;corr = (whiteSquareCorr &amp;&amp; pinkSquareCorr);&amp;#10;psychoJS.experiment.addData(&quot;whiteSquare.pos&quot;, whiteSquare.pos);&amp;#10;psychoJS.experiment.addData(&quot;pinkSquare.pos&quot;, pinkSquare.pos);&amp;#10;psychoJS.experiment.addData(&quot;whiteSquare.corr&quot;, whiteSquareCorr);&amp;#10;psychoJS.experiment.addData(&quot;pinkSquare.corr&quot;, pinkSquareCorr);&amp;#10;" valType="extendedCode" updates="constant" name="End JS Routine"/>
322
+ <Param val="# each square is correct if it's within 0.1 units of target position&amp;#10;whiteSquareCorr = (&amp;#10; whiteSquarePos[0] - 0.1 &lt; whiteSquare.pos[0] &lt; whiteSquarePos[0] + 0.1&amp;#10; and whiteSquarePos[1] - 0.1 &lt; whiteSquare.pos[1] &lt; whiteSquarePos[1] + 0.1&amp;#10;)&amp;#10;pinkSquareCorr = (&amp;#10; pinkSquarePos[0] - 0.1 &lt; pinkSquare.pos[0] &lt; pinkSquarePos[0] + 0.1&amp;#10; and pinkSquarePos[1] - 0.1 &lt; pinkSquare.pos[1] &lt; pinkSquarePos[1] + 0.1&amp;#10;)&amp;#10;# trial is correct if both squares are correct&amp;#10;corr = whiteSquareCorr and pinkSquareCorr&amp;#10;# save positions and correct&amp;#10;thisExp.addData(&quot;whiteSquare.pos&quot;, whiteSquare.pos)&amp;#10;thisExp.addData(&quot;pinkSquare.pos&quot;, pinkSquare.pos)&amp;#10;thisExp.addData(&quot;whiteSquare.corr&quot;, whiteSquareCorr)&amp;#10;thisExp.addData(&quot;pinkSquare.corr&quot;, pinkSquareCorr)" valType="extendedCode" updates="constant" name="End Routine"/>
323
+ <Param val="False" valType="bool" updates="None" name="disabled"/>
324
+ <Param val="calculateCorrect" valType="code" updates="None" name="name"/>
325
+ </CodeComponent>
309
326
  </Routine>
310
327
  <Routine name="feedback_corr">
311
328
  <RoutineSettingsComponent name="feedback_corr" plugin="None">
@@ -1,7 +1,6 @@
1
1
  <?xml version="1.0" ?>
2
- <PsychoPy2experiment encoding="utf-8" version="2025.1.0">
2
+ <PsychoPy2experiment encoding="utf-8" version="2025.2.0">
3
3
  <Settings>
4
- <Param val="use prefs" valType="str" updates="None" name="Audio latency priority"/>
5
4
  <Param val="use prefs" valType="str" updates="None" name="Audio lib"/>
6
5
  <Param val="" valType="str" updates="None" name="Completed URL"/>
7
6
  <Param val="auto" valType="str" updates="None" name="Data file delimiter"/>
@@ -13,7 +12,6 @@
13
12
  <Param val="True" valType="bool" updates="None" name="Full-screen window"/>
14
13
  <Param val="" valType="str" updates="None" name="HTML path"/>
15
14
  <Param val="" valType="str" updates="None" name="Incomplete URL"/>
16
- <Param val="packaged" valType="str" updates="None" name="JS libs"/>
17
15
  <Param val="testMonitor" valType="str" updates="None" name="Monitor"/>
18
16
  <Param val="['conditions.xlsx']" valType="list" updates="None" name="Resources"/>
19
17
  <Param val="False" valType="bool" updates="None" name="Save csv file"/>
@@ -63,9 +61,7 @@
63
61
  <Param val="0.5" valType="num" updates="None" name="mgSaccade"/>
64
62
  <Param val="neon.local" valType="str" updates="None" name="plCompanionAddress"/>
65
63
  <Param val="8080" valType="num" updates="None" name="plCompanionPort"/>
66
- <Param val="True" valType="bool" updates="None" name="plCompanionRecordingEnabled"/>
67
64
  <Param val="0.6" valType="num" updates="None" name="plConfidenceThreshold"/>
68
- <Param val="True" valType="bool" updates="None" name="plPupilCaptureRecordingEnabled"/>
69
65
  <Param val="" valType="str" updates="None" name="plPupilCaptureRecordingLocation"/>
70
66
  <Param val="127.0.0.1" valType="str" updates="None" name="plPupilRemoteAddress"/>
71
67
  <Param val="50020" valType="num" updates="None" name="plPupilRemotePort"/>
@@ -142,17 +138,12 @@
142
138
  <Param val="" valType="code" updates="None" name="validator"/>
143
139
  </TextboxComponent>
144
140
  <MicrophoneComponent name="micResp" plugin="None">
145
- <Param val="mono" valType="str" updates="None" name="channels"/>
146
- <Param val="default" valType="str" updates="None" name="device"/>
147
- <Param val="" valType="str" updates="None" name="deviceLabel"/>
141
+ <Param val="demoMicrophone" valType="device" updates="None" name="deviceLabel"/>
148
142
  <Param val="False" valType="bool" updates="None" name="disabled"/>
149
143
  <Param val="" valType="code" updates="None" name="durationEstim"/>
150
- <Param val="False" valType="code" updates="None" name="exclusive"/>
151
- <Param val="24000" valType="num" updates="None" name="maxSize"/>
152
144
  <Param val="micResp" valType="code" updates="None" name="name"/>
153
145
  <Param val="default" valType="code" updates="None" name="outputType"/>
154
146
  <Param val="warn" valType="str" updates="set every repeat" name="policyWhenFull"/>
155
- <Param val="DVD Audio (48kHz)" valType="num" updates="None" name="sampleRate"/>
156
147
  <Param val="True" valType="bool" updates="None" name="saveStartStop"/>
157
148
  <Param val="True" valType="bool" updates="None" name="speakTimes"/>
158
149
  <Param val="" valType="code" updates="None" name="startEstim"/>
@@ -190,7 +181,6 @@
190
181
  <KeyboardComponent name="ready" plugin="None">
191
182
  <Param val="" valType="list" updates="constant" name="allowedKeys"/>
192
183
  <Param val="thisTrial.corrAns" valType="str" updates="constant" name="correctAns"/>
193
- <Param val="" valType="str" updates="None" name="deviceLabel"/>
194
184
  <Param val="False" valType="bool" updates="None" name="disabled"/>
195
185
  <Param val="True" valType="bool" updates="constant" name="discard previous"/>
196
186
  <Param val="" valType="code" updates="None" name="durationEstim"/>
@@ -1,7 +1,6 @@
1
1
  <?xml version="1.0" ?>
2
- <PsychoPy2experiment encoding="utf-8" version="2025.1.0">
2
+ <PsychoPy2experiment encoding="utf-8" version="2025.2.0">
3
3
  <Settings>
4
- <Param val="3" valType="str" updates="None" name="Audio latency priority"/>
5
4
  <Param val="ptb" valType="str" updates="None" name="Audio lib"/>
6
5
  <Param val="" valType="str" updates="None" name="Completed URL"/>
7
6
  <Param val="auto" valType="str" updates="None" name="Data file delimiter"/>
@@ -62,9 +61,7 @@
62
61
  <Param val="0.5" valType="num" updates="None" name="mgSaccade"/>
63
62
  <Param val="neon.local" valType="str" updates="None" name="plCompanionAddress"/>
64
63
  <Param val="8080" valType="num" updates="None" name="plCompanionPort"/>
65
- <Param val="True" valType="bool" updates="None" name="plCompanionRecordingEnabled"/>
66
64
  <Param val="0.6" valType="num" updates="None" name="plConfidenceThreshold"/>
67
- <Param val="True" valType="bool" updates="None" name="plPupilCaptureRecordingEnabled"/>
68
65
  <Param val="" valType="str" updates="None" name="plPupilCaptureRecordingLocation"/>
69
66
  <Param val="127.0.0.1" valType="str" updates="None" name="plPupilRemoteAddress"/>
70
67
  <Param val="50020" valType="num" updates="None" name="plPupilRemotePort"/>
@@ -101,12 +98,11 @@
101
98
  <ButtonBoxComponent name="buttonBox" plugin="None">
102
99
  <Param val="" valType="list" updates="None" name="allowedButtons"/>
103
100
  <Param val="" valType="list" updates="None" name="correctAns"/>
104
- <Param val="keyboard" valType="str" updates="None" name="deviceBackend"/>
105
- <Param val="demoButtonBox" valType="str" updates="None" name="deviceLabel"/>
101
+ <Param val="demoButtonBox" valType="device" updates="None" name="deviceLabel"/>
106
102
  <Param val="False" valType="bool" updates="None" name="disabled"/>
103
+ <Param val="True" valType="bool" updates="constant" name="discardPrevious"/>
107
104
  <Param val="" valType="code" updates="None" name="durationEstim"/>
108
105
  <Param val="False" valType="bool" updates="None" name="forceEndRoutine"/>
109
- <Param val="'q', 'w', 'e', 'r', 't'" valType="list" updates="None" name="kbButtonAliases"/>
110
106
  <Param val="buttonBox" valType="code" updates="None" name="name"/>
111
107
  <Param val="True" valType="code" updates="None" name="registerOn"/>
112
108
  <Param val="True" valType="bool" updates="None" name="saveStartStop"/>
@@ -351,7 +347,6 @@
351
347
  <KeyboardComponent name="ender" plugin="None">
352
348
  <Param val="'return'" valType="list" updates="constant" name="allowedKeys"/>
353
349
  <Param val="" valType="str" updates="constant" name="correctAns"/>
354
- <Param val="" valType="str" updates="None" name="deviceLabel"/>
355
350
  <Param val="False" valType="bool" updates="None" name="disabled"/>
356
351
  <Param val="True" valType="bool" updates="constant" name="discard previous"/>
357
352
  <Param val="" valType="code" updates="None" name="durationEstim"/>
@@ -0,0 +1,220 @@
1
+ <?xml version="1.0" ?>
2
+ <PsychoPy2experiment encoding="utf-8" version="2025.2.0">
3
+ <Settings>
4
+ <Param val="ptb" valType="str" updates="None" name="Audio lib"/>
5
+ <Param val="" valType="str" updates="None" name="Completed URL"/>
6
+ <Param val="auto" valType="str" updates="None" name="Data file delimiter"/>
7
+ <Param val="u'data/%s_%s_%s' % (expInfo['participant'], expName, expInfo['date'])" valType="code" updates="None" name="Data filename"/>
8
+ <Param val="True" valType="bool" updates="None" name="Enable Escape"/>
9
+ <Param val="Thank you for your patience." valType="str" updates="None" name="End Message"/>
10
+ <Param val="{'participant':'f&quot;{randint(0, 999999):06.0f}&quot;', 'session':'&quot;001&quot;'}" valType="code" updates="None" name="Experiment info"/>
11
+ <Param val="True" valType="bool" updates="None" name="Force stereo"/>
12
+ <Param val="True" valType="bool" updates="None" name="Full-screen window"/>
13
+ <Param val="" valType="str" updates="None" name="HTML path"/>
14
+ <Param val="" valType="str" updates="None" name="Incomplete URL"/>
15
+ <Param val="testMonitor" valType="str" updates="None" name="Monitor"/>
16
+ <Param val="[]" valType="list" updates="None" name="Resources"/>
17
+ <Param val="False" valType="bool" updates="None" name="Save csv file"/>
18
+ <Param val="False" valType="bool" updates="None" name="Save excel file"/>
19
+ <Param val="False" valType="bool" updates="None" name="Save hdf5 file"/>
20
+ <Param val="True" valType="bool" updates="None" name="Save log file"/>
21
+ <Param val="True" valType="bool" updates="None" name="Save psydat file"/>
22
+ <Param val="True" valType="bool" updates="None" name="Save wide csv file"/>
23
+ <Param val="1" valType="num" updates="None" name="Screen"/>
24
+ <Param val="True" valType="bool" updates="None" name="Show info dlg"/>
25
+ <Param val="False" valType="bool" updates="None" name="Show mouse"/>
26
+ <Param val="height" valType="str" updates="None" name="Units"/>
27
+ <Param val="" valType="str" updates="None" name="Use version"/>
28
+ <Param val="(1024, 768)" valType="list" updates="None" name="Window size (pixels)"/>
29
+ <Param val="none" valType="str" updates="None" name="backgroundFit"/>
30
+ <Param val="" valType="str" updates="None" name="backgroundImg"/>
31
+ <Param val="avg" valType="str" updates="None" name="blendMode"/>
32
+ <Param val="float" valType="str" updates="None" name="clockFormat"/>
33
+ <Param val="{'thisRow.t': 'priority.CRITICAL', 'expName': 'priority.LOW'}" valType="dict" updates="None" name="colPriority"/>
34
+ <Param val="$[0,0,0]" valType="color" updates="None" name="color"/>
35
+ <Param val="rgb" valType="str" updates="None" name="colorSpace"/>
36
+ <Param val="warning" valType="code" updates="None" name="consoleLoggingLevel"/>
37
+ <Param val="default" valType="str" updates="None" name="ecSampleRate"/>
38
+ <Param val="100.1.1.1" valType="str" updates="None" name="elAddress"/>
39
+ <Param val="FILTER_LEVEL_2" valType="str" updates="None" name="elDataFiltering"/>
40
+ <Param val="FILTER_LEVEL_OFF" valType="str" updates="None" name="elLiveFiltering"/>
41
+ <Param val="EYELINK 1000 DESKTOP" valType="str" updates="None" name="elModel"/>
42
+ <Param val="ELLIPSE_FIT" valType="str" updates="None" name="elPupilAlgorithm"/>
43
+ <Param val="PUPIL_AREA" valType="str" updates="None" name="elPupilMeasure"/>
44
+ <Param val="1000" valType="num" updates="None" name="elSampleRate"/>
45
+ <Param val="False" valType="bool" updates="None" name="elSimMode"/>
46
+ <Param val="RIGHT_EYE" valType="str" updates="None" name="elTrackEyes"/>
47
+ <Param val="PUPIL_CR_TRACKING" valType="str" updates="None" name="elTrackingMode"/>
48
+ <Param val="movie" valType="str" updates="None" name="expName"/>
49
+ <Param val="" valType="str" updates="None" name="expVersion"/>
50
+ <Param val="on Sync" valType="str" updates="None" name="exportHTML"/>
51
+ <Param val="None" valType="str" updates="None" name="eyetracker"/>
52
+ <Param val="" valType="code" updates="None" name="frameRate"/>
53
+ <Param val="Attempting to measure frame rate of screen, please wait..." valType="str" updates="None" name="frameRateMsg"/>
54
+ <Param val="127.0.0.1" valType="str" updates="None" name="gpAddress"/>
55
+ <Param val="4242" valType="num" updates="None" name="gpPort"/>
56
+ <Param val="PsychToolbox" valType="str" updates="None" name="keyboardBackend"/>
57
+ <Param val="info" valType="code" updates="None" name="logging level"/>
58
+ <Param val="True" valType="bool" updates="None" name="measureFrameRate"/>
59
+ <Param val="MIDDLE_BUTTON" valType="list" updates="None" name="mgBlink"/>
60
+ <Param val="CONTINUOUS" valType="str" updates="None" name="mgMove"/>
61
+ <Param val="0.5" valType="num" updates="None" name="mgSaccade"/>
62
+ <Param val="neon.local" valType="str" updates="None" name="plCompanionAddress"/>
63
+ <Param val="8080" valType="num" updates="None" name="plCompanionPort"/>
64
+ <Param val="0.6" valType="num" updates="None" name="plConfidenceThreshold"/>
65
+ <Param val="" valType="str" updates="None" name="plPupilCaptureRecordingLocation"/>
66
+ <Param val="127.0.0.1" valType="str" updates="None" name="plPupilRemoteAddress"/>
67
+ <Param val="50020" valType="num" updates="None" name="plPupilRemotePort"/>
68
+ <Param val="1000" valType="num" updates="None" name="plPupilRemoteTimeoutMs"/>
69
+ <Param val="False" valType="bool" updates="None" name="plPupillometryOnly"/>
70
+ <Param val="psychopy_iohub_surface" valType="str" updates="None" name="plSurfaceName"/>
71
+ <Param val="0" valType="code" updates="None" name="runMode"/>
72
+ <Param val="False" valType="bool" updates="None" name="rush"/>
73
+ <Param val="time" valType="str" updates="None" name="sortColumns"/>
74
+ <Param val="" valType="str" updates="None" name="tbLicenseFile"/>
75
+ <Param val="" valType="str" updates="None" name="tbModel"/>
76
+ <Param val="60" valType="num" updates="None" name="tbSampleRate"/>
77
+ <Param val="" valType="str" updates="None" name="tbSerialNo"/>
78
+ <Param val="pyglet" valType="str" updates="None" name="winBackend"/>
79
+ </Settings>
80
+ <Routines>
81
+ <Routine name="movie_playback">
82
+ <RoutineSettingsComponent name="movie_playback" plugin="None">
83
+ <Param val="none" valType="str" updates="None" name="backgroundFit"/>
84
+ <Param val="" valType="str" updates="None" name="backgroundImg"/>
85
+ <Param val="$[0,0,0]" valType="color" updates="None" name="color"/>
86
+ <Param val="rgb" valType="str" updates="None" name="colorSpace"/>
87
+ <Param val="Contains a Movie Component and controls for its playback." valType="str" updates="constant" name="desc"/>
88
+ <Param val="False" valType="bool" updates="None" name="disabled"/>
89
+ <Param val="" valType="code" updates="None" name="durationEstim"/>
90
+ <Param val="False" valType="code" updates="None" name="forceNonSlip"/>
91
+ <Param val="movie_playback" valType="code" updates="None" name="name"/>
92
+ <Param val="True" valType="bool" updates="None" name="saveStartStop"/>
93
+ <Param val="" valType="code" updates="constant" name="skipIf"/>
94
+ <Param val="duration (s)" valType="str" updates="None" name="stopType"/>
95
+ <Param val="" valType="code" updates="constant" name="stopVal"/>
96
+ <Param val="False" valType="bool" updates="None" name="useWindowParams"/>
97
+ </RoutineSettingsComponent>
98
+ <MovieComponent name="movie" plugin="None">
99
+ <Param val="False" valType="bool" updates="None" name="No audio"/>
100
+ <Param val="center" valType="str" updates="constant" name="anchor"/>
101
+ <Param val="ffpyplayer" valType="str" updates="None" name="backend"/>
102
+ <Param val="1" valType="num" updates="constant" name="contrast"/>
103
+ <Param val="False" valType="bool" updates="None" name="disabled"/>
104
+ <Param val="" valType="code" updates="None" name="durationEstim"/>
105
+ <Param val="True" valType="bool" updates="constant" name="forceEndRoutine"/>
106
+ <Param val="False" valType="bool" updates="None" name="loop"/>
107
+ <Param val="default.mp4" valType="file" updates="constant" name="movie"/>
108
+ <Param val="movie" valType="code" updates="None" name="name"/>
109
+ <Param val="" valType="num" updates="constant" name="opacity"/>
110
+ <Param val="0" valType="num" updates="constant" name="ori"/>
111
+ <Param val="(0, 0)" valType="list" updates="constant" name="pos"/>
112
+ <Param val="True" valType="bool" updates="None" name="saveStartStop"/>
113
+ <Param val="(0.5, 0.5)" valType="list" updates="constant" name="size"/>
114
+ <Param val="" valType="code" updates="None" name="startEstim"/>
115
+ <Param val="time (s)" valType="str" updates="None" name="startType"/>
116
+ <Param val="0.0" valType="code" updates="None" name="startVal"/>
117
+ <Param val="duration (s)" valType="str" updates="None" name="stopType"/>
118
+ <Param val="" valType="code" updates="constant" name="stopVal"/>
119
+ <Param val="True" valType="bool" updates="constant" name="stopWithRoutine"/>
120
+ <Param val="True" valType="bool" updates="None" name="syncScreenRefresh"/>
121
+ <Param val="from exp settings" valType="str" updates="None" name="units"/>
122
+ <Param val="" valType="code" updates="None" name="validator"/>
123
+ <Param val="1" valType="num" updates="None" name="volume"/>
124
+ </MovieComponent>
125
+ <SliderComponent name="navbar" plugin="None">
126
+ <Param val="darkgrey" valType="color" updates="constant" name="borderColor"/>
127
+ <Param val="" valType="color" updates="constant" name="color"/>
128
+ <Param val="rgb" valType="str" updates="constant" name="colorSpace"/>
129
+ <Param val="1" valType="num" updates="constant" name="contrast"/>
130
+ <Param val="False" valType="bool" updates="None" name="disabled"/>
131
+ <Param val="" valType="code" updates="None" name="durationEstim"/>
132
+ <Param val="white" valType="color" updates="constant" name="fillColor"/>
133
+ <Param val="False" valType="bool" updates="constant" name="flip"/>
134
+ <Param val="Noto Sans" valType="str" updates="constant" name="font"/>
135
+ <Param val="False" valType="bool" updates="constant" name="forceEndRoutine"/>
136
+ <Param val="0" valType="num" updates="constant" name="granularity"/>
137
+ <Param val="0" valType="code" updates="None" name="initVal"/>
138
+ <Param val="&quot;&quot;, &quot;&quot;" valType="list" updates="constant" name="labels"/>
139
+ <Param val="0.05" valType="num" updates="constant" name="letterHeight"/>
140
+ <Param val="navbar" valType="code" updates="None" name="name"/>
141
+ <Param val="" valType="num" updates="constant" name="opacity"/>
142
+ <Param val="0" valType="num" updates="constant" name="ori"/>
143
+ <Param val="(0.1, -0.4)" valType="list" updates="constant" name="pos"/>
144
+ <Param val="False" valType="bool" updates="constant" name="readOnly"/>
145
+ <Param val="True" valType="bool" updates="None" name="saveStartStop"/>
146
+ <Param val="(0.9, 0.1)" valType="list" updates="constant" name="size"/>
147
+ <Param val="" valType="code" updates="None" name="startEstim"/>
148
+ <Param val="time (s)" valType="str" updates="None" name="startType"/>
149
+ <Param val="0.0" valType="code" updates="None" name="startVal"/>
150
+ <Param val="condition" valType="str" updates="None" name="stopType"/>
151
+ <Param val="" valType="code" updates="constant" name="stopVal"/>
152
+ <Param val="False" valType="bool" updates="constant" name="storeHistory"/>
153
+ <Param val="True" valType="bool" updates="constant" name="storeRating"/>
154
+ <Param val="True" valType="bool" updates="constant" name="storeRatingTime"/>
155
+ <Param val="[]" valType="list" updates="constant" name="styleTweaks"/>
156
+ <Param val="slider" valType="str" updates="constant" name="styles"/>
157
+ <Param val="True" valType="bool" updates="None" name="syncScreenRefresh"/>
158
+ <Param val="(0, 1)" valType="list" updates="constant" name="ticks"/>
159
+ <Param val="from exp settings" valType="str" updates="None" name="units"/>
160
+ <Param val="" valType="code" updates="None" name="validator"/>
161
+ </SliderComponent>
162
+ <ButtonComponent name="button" plugin="None">
163
+ <Param val="center" valType="str" updates="constant" name="anchor"/>
164
+ <Param val="True" valType="bool" updates="constant" name="bold"/>
165
+ <Param val="" valType="color" updates="constant" name="borderColor"/>
166
+ <Param val="0" valType="num" updates="constant" name="borderWidth"/>
167
+ <Param val="if movie.isPlaying:&amp;#10; movie.pause()&amp;#10;else:&amp;#10; movie.play()" valType="extendedCode" updates="constant" name="callback"/>
168
+ <Param val="white" valType="color" updates="constant" name="color"/>
169
+ <Param val="rgb" valType="str" updates="constant" name="colorSpace"/>
170
+ <Param val="1" valType="num" updates="constant" name="contrast"/>
171
+ <Param val="False" valType="bool" updates="None" name="disabled"/>
172
+ <Param val="" valType="code" updates="None" name="durationEstim"/>
173
+ <Param val="darkgrey" valType="color" updates="constant" name="fillColor"/>
174
+ <Param val="JetBrains Mono" valType="str" updates="constant" name="font"/>
175
+ <Param val="False" valType="bool" updates="constant" name="forceEndRoutine"/>
176
+ <Param val="False" valType="bool" updates="constant" name="italic"/>
177
+ <Param val="0.04" valType="num" updates="constant" name="letterHeight"/>
178
+ <Param val="button" valType="code" updates="None" name="name"/>
179
+ <Param val="True" valType="bool" updates="constant" name="oncePerClick"/>
180
+ <Param val="" valType="num" updates="constant" name="opacity"/>
181
+ <Param val="0" valType="num" updates="constant" name="ori"/>
182
+ <Param val="" valType="num" updates="constant" name="padding"/>
183
+ <Param val="(-0.45, -0.4)" valType="list" updates="constant" name="pos"/>
184
+ <Param val="every click" valType="str" updates="None" name="save"/>
185
+ <Param val="True" valType="bool" updates="None" name="saveStartStop"/>
186
+ <Param val="(0.1, 0.1)" valType="list" updates="constant" name="size"/>
187
+ <Param val="" valType="code" updates="None" name="startEstim"/>
188
+ <Param val="time (s)" valType="str" updates="None" name="startType"/>
189
+ <Param val="0" valType="code" updates="None" name="startVal"/>
190
+ <Param val="duration (s)" valType="str" updates="None" name="stopType"/>
191
+ <Param val="" valType="code" updates="constant" name="stopVal"/>
192
+ <Param val="True" valType="bool" updates="None" name="syncScreenRefresh"/>
193
+ <Param val="$&quot;||&quot; if movie.isPlaying else &quot;▶&quot;" valType="str" updates="set every frame" name="text"/>
194
+ <Param val="button onset" valType="str" updates="constant" name="timeRelativeTo"/>
195
+ <Param val="from exp settings" valType="str" updates="None" name="units"/>
196
+ <Param val="" valType="code" updates="None" name="validator"/>
197
+ </ButtonComponent>
198
+ <CodeComponent name="playbackCode" plugin="None">
199
+ <Param val="" valType="extendedCode" updates="constant" name="Before Experiment"/>
200
+ <Param val="" valType="extendedCode" updates="constant" name="Before JS Experiment"/>
201
+ <Param val="" valType="extendedCode" updates="constant" name="Begin Experiment"/>
202
+ <Param val="" valType="extendedCode" updates="constant" name="Begin JS Experiment"/>
203
+ <Param val="" valType="extendedCode" updates="constant" name="Begin JS Routine"/>
204
+ <Param val="" valType="extendedCode" updates="constant" name="Begin Routine"/>
205
+ <Param val="Auto-&gt;JS" valType="str" updates="None" name="Code Type"/>
206
+ <Param val="if navbar._dragging:&amp;#10; # pause the movie while the navbar is being dragged&amp;#10; movie.pause()&amp;#10;elif navbar.rating is not None:&amp;#10; # if slider has been set, navigate to that point in the video then resume&amp;#10; movie.seek(&amp;#10; navbar.rating * movie.duration&amp;#10; )&amp;#10; movie.play()&amp;#10; # reset slider&amp;#10; navbar.reset()&amp;#10;else:&amp;#10; # update slider with movie timestamp each frame&amp;#10; navbar.markerPos = movie.pts / max(movie.duration, 0.0001)" valType="extendedCode" updates="constant" name="Each Frame"/>
207
+ <Param val="if (navbar._dragging) {&amp;#10; movie.pause();&amp;#10;} else {&amp;#10; if ((navbar.rating !== null)) {&amp;#10; movie.seek((navbar.rating * movie.duration));&amp;#10; movie.play();&amp;#10; navbar.reset();&amp;#10; } else {&amp;#10; navbar.markerPos = (movie.pts / Math.max(movie.duration, 0.0001));&amp;#10; }&amp;#10;}&amp;#10;" valType="extendedCode" updates="constant" name="Each JS Frame"/>
208
+ <Param val="" valType="extendedCode" updates="constant" name="End Experiment"/>
209
+ <Param val="" valType="extendedCode" updates="constant" name="End JS Experiment"/>
210
+ <Param val="" valType="extendedCode" updates="constant" name="End JS Routine"/>
211
+ <Param val="" valType="extendedCode" updates="constant" name="End Routine"/>
212
+ <Param val="False" valType="bool" updates="None" name="disabled"/>
213
+ <Param val="playbackCode" valType="code" updates="None" name="name"/>
214
+ </CodeComponent>
215
+ </Routine>
216
+ </Routines>
217
+ <Flow>
218
+ <Routine name="movie_playback"/>
219
+ </Flow>
220
+ </PsychoPy2experiment>
@@ -0,0 +1,3 @@
1
+ # Movie Component Demo
2
+
3
+ This simple demo shows how to create a Movie Component, including some custom playback controls to show how playback of a movie can be manipulated in code.
@@ -1,5 +1,5 @@
1
1
  <?xml version="1.0" ?>
2
- <PsychoPy2experiment encoding="utf-8" version="2025.1.0">
2
+ <PsychoPy2experiment encoding="utf-8" version="2025.2.0">
3
3
  <Settings>
4
4
  <Param val="ptb" valType="str" updates="None" name="Audio lib"/>
5
5
  <Param val="" valType="str" updates="None" name="Completed URL"/>
@@ -169,7 +169,6 @@
169
169
  </Routine>
170
170
  <VisualValidatorRoutine name="visualVal">
171
171
  <Param name="channel" updates="None" val="0" valType="code"/>
172
- <Param name="deviceBackend" updates="None" val="screenbuffer" valType="code"/>
173
172
  <Param name="deviceLabel" updates="None" val="demoLightSensor" valType="str"/>
174
173
  <Param name="disabled" updates="None" val="False" valType="bool"/>
175
174
  <Param name="findSensor" updates="None" val="True" valType="code"/>
@@ -1,7 +1,6 @@
1
1
  <?xml version="1.0" ?>
2
- <PsychoPy2experiment encoding="utf-8" version="2025.1.0">
2
+ <PsychoPy2experiment encoding="utf-8" version="2025.2.0">
3
3
  <Settings>
4
- <Param val="use prefs" valType="str" updates="None" name="Audio latency priority"/>
5
4
  <Param val="use prefs" valType="str" updates="None" name="Audio lib"/>
6
5
  <Param val="" valType="str" updates="None" name="Completed URL"/>
7
6
  <Param val="auto" valType="str" updates="None" name="Data file delimiter"/>
@@ -63,7 +62,6 @@
63
62
  <Param val="neon.local" valType="str" updates="None" name="plCompanionAddress"/>
64
63
  <Param val="8080" valType="num" updates="None" name="plCompanionPort"/>
65
64
  <Param val="0.6" valType="num" updates="None" name="plConfidenceThreshold"/>
66
- <Param val="True" valType="bool" updates="None" name="plPupilCaptureRecordingEnabled"/>
67
65
  <Param val="" valType="str" updates="None" name="plPupilCaptureRecordingLocation"/>
68
66
  <Param val="127.0.0.1" valType="str" updates="None" name="plPupilRemoteAddress"/>
69
67
  <Param val="50020" valType="num" updates="None" name="plPupilRemotePort"/>
@@ -98,22 +96,11 @@
98
96
  <Param val="False" valType="bool" updates="None" name="useWindowParams"/>
99
97
  </RoutineSettingsComponent>
100
98
  <CameraComponent name="cam" plugin="None">
101
- <Param val="ffpyplayer" valType="str" updates="None" name="cameraLib"/>
102
- <Param val="default" valType="str" updates="None" name="device"/>
103
- <Param val="" valType="str" updates="None" name="deviceLabel"/>
104
- <Param val="" valType="code" updates="None" name="deviceManual"/>
99
+ <Param val="demoCamera" valType="device" updates="None" name="deviceLabel"/>
105
100
  <Param val="False" valType="bool" updates="None" name="disabled"/>
106
101
  <Param val="" valType="code" updates="None" name="durationEstim"/>
107
- <Param val="" valType="int" updates="None" name="frameRate"/>
108
- <Param val="" valType="int" updates="None" name="frameRateManual"/>
109
- <Param val="Default" valType="str" updates="None" name="mic"/>
110
- <Param val="auto" valType="str" updates="None" name="micChannels"/>
111
- <Param val="" valType="str" updates="None" name="micDeviceLabel"/>
112
- <Param val="24000" valType="num" updates="None" name="micMaxRecSize"/>
113
- <Param val="DVD Audio (48kHz)" valType="num" updates="None" name="micSampleRate"/>
102
+ <Param val="demoMicrophone" valType="str" updates="None" name="micDeviceLabel"/>
114
103
  <Param val="cam" valType="code" updates="None" name="name"/>
115
- <Param val="" valType="list" updates="None" name="resolution"/>
116
- <Param val="" valType="list" updates="None" name="resolutionManual"/>
117
104
  <Param val="False" valType="bool" updates="None" name="saveFile"/>
118
105
  <Param val="True" valType="bool" updates="None" name="saveStartStop"/>
119
106
  <Param val="" valType="code" updates="None" name="startEstim"/>