psychopy 2024.2.5__py3-none-any.whl → 2025.1.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.
- psychopy/CHANGELOG.txt +4 -4
- psychopy/GIT_SHA +1 -1
- psychopy/LICENSE.txt +1 -1
- psychopy/VERSION +1 -1
- psychopy/__init__.py +10 -7
- psychopy/alerts/__init__.py +1 -1
- psychopy/alerts/_alerts.py +53 -17
- psychopy/alerts/_errorHandler.py +3 -4
- psychopy/alerts/alertsCatalogue/3210.yaml +27 -0
- psychopy/alerts/alertsCatalogue/3610.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4130.yaml +19 -0
- psychopy/alerts/alertsCatalogue/alertCategories.yaml +8 -1
- psychopy/alerts/alertsCatalogue/alertmsg.py +1 -1
- psychopy/alerts/alerttools.py +0 -16
- psychopy/app/Resources/betasplash.png +0 -0
- psychopy/app/Resources/betasplash@2x.png +0 -0
- psychopy/app/Resources/classic/case.png +0 -0
- psychopy/app/Resources/classic/case@2x.png +0 -0
- psychopy/app/Resources/classic/fileaudio.png +0 -0
- psychopy/app/Resources/classic/fileaudio@2x.png +0 -0
- psychopy/app/Resources/classic/filecss.png +0 -0
- psychopy/app/Resources/classic/filecss@2x.png +0 -0
- psychopy/app/Resources/classic/filecsv.png +0 -0
- psychopy/app/Resources/classic/filecsv@2x.png +0 -0
- psychopy/app/Resources/classic/filedesign.png +0 -0
- psychopy/app/Resources/classic/filedesign@2x.png +0 -0
- psychopy/app/Resources/classic/filefont.png +0 -0
- psychopy/app/Resources/classic/filefont@2x.png +0 -0
- psychopy/app/Resources/classic/filegit.png +0 -0
- psychopy/app/Resources/classic/filegit@2x.png +0 -0
- psychopy/app/Resources/classic/filehtml.png +0 -0
- psychopy/app/Resources/classic/filehtml@2x.png +0 -0
- psychopy/app/Resources/classic/fileimage.png +0 -0
- psychopy/app/Resources/classic/fileimage@2x.png +0 -0
- psychopy/app/Resources/classic/fileinfo.png +0 -0
- psychopy/app/Resources/classic/fileinfo@2x.png +0 -0
- psychopy/app/Resources/classic/filejs.png +0 -0
- psychopy/app/Resources/classic/filejs@2x.png +0 -0
- psychopy/app/Resources/classic/filejson.png +0 -0
- psychopy/app/Resources/classic/filejson@2x.png +0 -0
- psychopy/app/Resources/classic/filepkg.png +0 -0
- psychopy/app/Resources/classic/filepkg@2x.png +0 -0
- psychopy/app/Resources/classic/filepsyexp.png +0 -0
- psychopy/app/Resources/classic/filepsyexp@2x.png +0 -0
- psychopy/app/Resources/classic/filepy.png +0 -0
- psychopy/app/Resources/classic/filepy@2x.png +0 -0
- psychopy/app/Resources/classic/filetxt.png +0 -0
- psychopy/app/Resources/classic/filetxt@2x.png +0 -0
- psychopy/app/Resources/classic/fileunknown.png +0 -0
- psychopy/app/Resources/classic/fileunknown@2x.png +0 -0
- psychopy/app/Resources/classic/filevideo.png +0 -0
- psychopy/app/Resources/classic/filevideo@2x.png +0 -0
- psychopy/app/Resources/classic/find.png +0 -0
- psychopy/app/Resources/classic/find@2x.png +0 -0
- psychopy/app/Resources/classic/loop.png +0 -0
- psychopy/app/Resources/classic/loop@2x.png +0 -0
- psychopy/app/Resources/classic/regex.png +0 -0
- psychopy/app/Resources/classic/regex@2x.png +0 -0
- psychopy/app/Resources/dark/case.png +0 -0
- psychopy/app/Resources/dark/case@2x.png +0 -0
- psychopy/app/Resources/dark/fileaudio.png +0 -0
- psychopy/app/Resources/dark/fileaudio@2x.png +0 -0
- psychopy/app/Resources/dark/filecss.png +0 -0
- psychopy/app/Resources/dark/filecss@2x.png +0 -0
- psychopy/app/Resources/dark/filecsv.png +0 -0
- psychopy/app/Resources/dark/filecsv@2x.png +0 -0
- psychopy/app/Resources/dark/filedesign.png +0 -0
- psychopy/app/Resources/dark/filedesign@2x.png +0 -0
- psychopy/app/Resources/dark/filefont.png +0 -0
- psychopy/app/Resources/dark/filefont@2x.png +0 -0
- psychopy/app/Resources/dark/filegit.png +0 -0
- psychopy/app/Resources/dark/filegit@2x.png +0 -0
- psychopy/app/Resources/dark/filehtml.png +0 -0
- psychopy/app/Resources/dark/filehtml@2x.png +0 -0
- psychopy/app/Resources/dark/fileimage.png +0 -0
- psychopy/app/Resources/dark/fileimage@2x.png +0 -0
- psychopy/app/Resources/dark/fileinfo.png +0 -0
- psychopy/app/Resources/dark/fileinfo@2x.png +0 -0
- psychopy/app/Resources/dark/filejs.png +0 -0
- psychopy/app/Resources/dark/filejs@2x.png +0 -0
- psychopy/app/Resources/dark/filejson.png +0 -0
- psychopy/app/Resources/dark/filejson@2x.png +0 -0
- psychopy/app/Resources/dark/filepkg.png +0 -0
- psychopy/app/Resources/dark/filepkg@2x.png +0 -0
- psychopy/app/Resources/dark/filepsyexp.png +0 -0
- psychopy/app/Resources/dark/filepsyexp@2x.png +0 -0
- psychopy/app/Resources/dark/filepy.png +0 -0
- psychopy/app/Resources/dark/filepy@2x.png +0 -0
- psychopy/app/Resources/dark/filetxt.png +0 -0
- psychopy/app/Resources/dark/filetxt@2x.png +0 -0
- psychopy/app/Resources/dark/fileunknown.png +0 -0
- psychopy/app/Resources/dark/fileunknown@2x.png +0 -0
- psychopy/app/Resources/dark/filevideo.png +0 -0
- psychopy/app/Resources/dark/filevideo@2x.png +0 -0
- psychopy/app/Resources/dark/find.png +0 -0
- psychopy/app/Resources/dark/find@2x.png +0 -0
- psychopy/app/Resources/dark/loop.png +0 -0
- psychopy/app/Resources/dark/loop@2x.png +0 -0
- psychopy/app/Resources/dark/regex.png +0 -0
- psychopy/app/Resources/dark/regex@2x.png +0 -0
- psychopy/app/Resources/light/case.png +0 -0
- psychopy/app/Resources/light/case@2x.png +0 -0
- psychopy/app/Resources/light/fileaudio.png +0 -0
- psychopy/app/Resources/light/fileaudio@2x.png +0 -0
- psychopy/app/Resources/light/filecss.png +0 -0
- psychopy/app/Resources/light/filecss@2x.png +0 -0
- psychopy/app/Resources/light/filecsv.png +0 -0
- psychopy/app/Resources/light/filecsv@2x.png +0 -0
- psychopy/app/Resources/light/filedesign.png +0 -0
- psychopy/app/Resources/light/filedesign@2x.png +0 -0
- psychopy/app/Resources/light/filefont.png +0 -0
- psychopy/app/Resources/light/filefont@2x.png +0 -0
- psychopy/app/Resources/light/filegit.png +0 -0
- psychopy/app/Resources/light/filegit@2x.png +0 -0
- psychopy/app/Resources/light/filehtml.png +0 -0
- psychopy/app/Resources/light/filehtml@2x.png +0 -0
- psychopy/app/Resources/light/fileimage.png +0 -0
- psychopy/app/Resources/light/fileimage@2x.png +0 -0
- psychopy/app/Resources/light/fileinfo.png +0 -0
- psychopy/app/Resources/light/fileinfo@2x.png +0 -0
- psychopy/app/Resources/light/filejs.png +0 -0
- psychopy/app/Resources/light/filejs@2x.png +0 -0
- psychopy/app/Resources/light/filejson.png +0 -0
- psychopy/app/Resources/light/filejson@2x.png +0 -0
- psychopy/app/Resources/light/filepkg.png +0 -0
- psychopy/app/Resources/light/filepkg@2x.png +0 -0
- psychopy/app/Resources/light/filepsyexp.png +0 -0
- psychopy/app/Resources/light/filepsyexp@2x.png +0 -0
- psychopy/app/Resources/light/filepy.png +0 -0
- psychopy/app/Resources/light/filepy@2x.png +0 -0
- psychopy/app/Resources/light/filetxt.png +0 -0
- psychopy/app/Resources/light/filetxt@2x.png +0 -0
- psychopy/app/Resources/light/fileunknown.png +0 -0
- psychopy/app/Resources/light/fileunknown@2x.png +0 -0
- psychopy/app/Resources/light/filevideo.png +0 -0
- psychopy/app/Resources/light/filevideo@2x.png +0 -0
- psychopy/app/Resources/light/find.png +0 -0
- psychopy/app/Resources/light/find@2x.png +0 -0
- psychopy/app/Resources/light/loop.png +0 -0
- psychopy/app/Resources/light/loop@2x.png +0 -0
- psychopy/app/Resources/light/regex.png +0 -0
- psychopy/app/Resources/light/regex@2x.png +0 -0
- psychopy/app/Resources/routine_templates/Basic.psyexp +0 -1
- psychopy/app/Resources/routine_templates/Misc.psyexp +0 -1
- psychopy/app/Resources/routine_templates/Online.psyexp +0 -2
- psychopy/app/Resources/routine_templates/Trials.psyexp +0 -1
- psychopy/app/Resources/splash.png +0 -0
- psychopy/app/Resources/splash@2x.png +0 -0
- psychopy/app/__init__.py +49 -8
- psychopy/app/__main__.py +3 -0
- psychopy/app/_psychopyApp.py +134 -125
- psychopy/app/builder/builder.py +42 -22
- psychopy/app/builder/dialogs/__init__.py +44 -11
- psychopy/app/builder/dialogs/dlgsCode.py +1 -1
- psychopy/app/builder/dialogs/dlgsConditions.py +1 -1
- psychopy/app/builder/dialogs/findDlg.py +106 -20
- psychopy/app/builder/dialogs/paramCtrls.py +42 -1
- psychopy/app/builder/validators.py +1 -1
- psychopy/app/coder/codeEditorBase.py +8 -8
- psychopy/app/coder/coder.py +32 -29
- psychopy/app/coder/fileBrowser.py +68 -22
- psychopy/app/coder/folding.py +1 -1
- psychopy/app/coder/psychoParser.py +1 -1
- psychopy/app/coder/repl.py +1 -1
- psychopy/app/coder/sourceTree.py +1 -1
- psychopy/app/connections/__init__.py +1 -1
- psychopy/app/connections/news.py +1 -1
- psychopy/app/connections/sendusage.py +1 -1
- psychopy/app/connections/updates.py +1 -1
- psychopy/app/console.py +1 -1
- psychopy/app/errorDlg.py +1 -1
- psychopy/app/frametracker.py +1 -1
- psychopy/app/idle.py +1 -1
- psychopy/app/jobs.py +5 -2
- psychopy/app/linuxconfig/__init__.py +1 -1
- psychopy/app/locale/ar_001/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ar_001/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/da_DK/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/de_DE/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/de_DE/LC_MESSAGE/messages.po +3 -3
- psychopy/app/locale/el_GR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/en_NZ/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/en_US/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_CO/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_CO/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/es_ES/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_ES/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/es_US/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_US/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/et_EE/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/et_EE/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/fa_IR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/fa_IR/LC_MESSAGE/messages.po +1 -1
- psychopy/app/locale/fi_FI/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/fr_FR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/fr_FR/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/he_IL/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/he_IL/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/hi_IN/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/hi_IN/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/hu_HU/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/it_IT/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/it_IT/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/ja_JP/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ja_JP/LC_MESSAGE/messages.po +3421 -2396
- psychopy/app/locale/ko_KR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ms_MY/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ms_MY/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/nl_NL/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/nn_NO/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/pl_PL/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/pt_PT/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/pt_PT/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/ro_RO/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ru_RU/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/sv_SE/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/sv_SE/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/tr_TR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/tr_TR/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/zh_CN/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/zh_CN/LC_MESSAGE/messages.po +3 -3
- psychopy/app/locale/zh_TW/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/zh_TW/LC_MESSAGE/messages.po +2 -2
- psychopy/app/{builder/localizedStrings.py → localizedStrings.py} +173 -26
- psychopy/app/pavlovia_ui/__init__.py +1 -1
- psychopy/app/pavlovia_ui/_base.py +1 -1
- psychopy/app/pavlovia_ui/functions.py +1 -1
- psychopy/app/pavlovia_ui/menu.py +1 -1
- psychopy/app/pavlovia_ui/project.py +1 -1
- psychopy/app/pavlovia_ui/search.py +1 -1
- psychopy/app/pavlovia_ui/sync.py +1 -1
- psychopy/app/pavlovia_ui/user.py +1 -1
- psychopy/app/plugin_manager/dialog.py +34 -96
- psychopy/app/plugin_manager/packages.py +10 -14
- psychopy/app/plugin_manager/plugins.py +64 -4
- psychopy/app/preferencesDlg.py +12 -37
- psychopy/app/psychopyApp.py +130 -44
- psychopy/app/ribbon.py +1 -0
- psychopy/app/runner/runner.py +19 -7
- psychopy/app/runner/scriptProcess.py +11 -6
- psychopy/app/stdout/stdOutRich.py +9 -2
- psychopy/app/themes/fonts.py +1 -1
- psychopy/app/themes/icons.py +2 -38
- psychopy/app/ui/__init__.py +1 -1
- psychopy/app/utils.py +3 -3
- psychopy/assets/default.mp3 +0 -0
- psychopy/assets/fonts/NotoSans-Bold.ttf +0 -0
- psychopy/assets/fonts/NotoSans-BoldItalic.ttf +0 -0
- psychopy/assets/fonts/NotoSans-Italic.ttf +0 -0
- psychopy/assets/fonts/NotoSans-Regular.ttf +0 -0
- psychopy/assets/voicekeyThresholdStim.wav +0 -0
- psychopy/clock.py +4 -1
- psychopy/colors.py +12 -5
- psychopy/core.py +1 -1
- psychopy/data/base.py +1 -1
- psychopy/data/experiment.py +151 -46
- psychopy/data/routine.py +27 -1
- psychopy/data/staircase.py +2 -1
- psychopy/data/trial.py +62 -14
- psychopy/data/utils.py +2 -2
- psychopy/demos/builder/Design Templates/branchedExperiment/branchedExperiment.psyexp +333 -218
- psychopy/demos/builder/Design Templates/psychophysicsStaircase/psychophysicsStaircase.psyexp +261 -239
- psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/psychophysicsStaircaseInterleaved.psyexp +319 -180
- psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks.psyexp +204 -116
- psychopy/demos/builder/Experiments/BART/assets/background.jpg +0 -0
- psychopy/demos/builder/Experiments/BART/assets/blueBalloon.png +0 -0
- psychopy/demos/builder/Experiments/BART/assets/greenBalloon.png +0 -0
- psychopy/demos/builder/Experiments/BART/assets/redBalloon.png +0 -0
- psychopy/demos/builder/Experiments/BART/bart.psyexp +779 -866
- psychopy/demos/builder/Experiments/BigFiveInventory/BFI.psyexp +242 -180
- psychopy/demos/builder/Experiments/GoNoGo/gng.psyexp +419 -406
- psychopy/demos/builder/Experiments/dragAndDrop/README.md +2 -37
- psychopy/demos/builder/Experiments/dragAndDrop/drag_and_drop.psyexp +460 -1204
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/blank_grid.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/make_shapes.psyexp +221 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/readme.md +4 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_1.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_10.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_2.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_3.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_4.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_5.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_6.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_7.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_8.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_9.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solutions.xlsx +0 -0
- psychopy/demos/builder/Experiments/mentalRotation/MentalRotation.psyexp +583 -542
- psychopy/demos/builder/Experiments/navon/NavonTask.psyexp +458 -427
- psychopy/demos/builder/Experiments/sternberg/sternberg.psyexp +588 -550
- psychopy/demos/builder/Experiments/stroop/stroop.psyexp +303 -207
- psychopy/demos/builder/Experiments/stroopExtended/stroop.psyexp +390 -215
- psychopy/demos/builder/Experiments/stroopExtended/stroopReverse.psyexp +390 -215
- psychopy/demos/builder/Experiments/stroopVoice/stroopVoice.psyexp +357 -331
- psychopy/demos/builder/Feature Demos/buttonBox/buttonBoxDemo.psyexp +3 -2
- psychopy/demos/builder/Feature Demos/counterbalance/counterbalance.psyexp +287 -277
- psychopy/demos/builder/Feature Demos/gratings/gratings.psyexp +370 -320
- psychopy/demos/builder/Feature Demos/noise/noise.psyexp +452 -399
- psychopy/demos/builder/Feature Demos/panorama/panorama.psyexp +168 -133
- psychopy/demos/builder/Feature Demos/pilotMode/pilotMode.psyexp +4 -3
- psychopy/demos/builder/Feature Demos/progress/progressBar.psyexp +420 -392
- psychopy/demos/builder/Feature Demos/sliders/sliders.psyexp +917 -871
- psychopy/demos/builder/Feature Demos/visualValidator/readme.md +7 -0
- psychopy/demos/builder/Feature Demos/visualValidator/visualValidator.psyexp +200 -0
- psychopy/demos/builder/Hardware/EEG_parallel_component/EEG_triggers_parallel_comp.psyexp +25 -9
- psychopy/demos/builder/Hardware/EEG_serial_code/EEG_triggers_serial_code.psyexp +372 -361
- psychopy/demos/builder/Hardware/EEG_serial_component/EEG_triggers_serial_comp.psyexp +25 -9
- psychopy/demos/builder/Hardware/EGI_netstation/stroop.psyexp +320 -235
- psychopy/demos/builder/Hardware/Eyetracking_visual_search/visualSearch.psyexp +790 -651
- psychopy/demos/builder/Hardware/camera/camera.psyexp +326 -246
- psychopy/demos/builder/Hardware/eyetracking/eyetracking.psyexp +432 -327
- psychopy/demos/builder/Hardware/eyetracking_custom_cal/eyetracking_custom_cal.psyexp +440 -321
- psychopy/demos/builder/Hardware/fMRI/fMRI_demo.psyexp +190 -181
- psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo.psyexp +323 -312
- psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy.psyexp +360 -0
- psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy_legacy.psyexp +312 -0
- psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy.psyexp +329 -273
- psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy.psyexp +360 -0
- psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy_legacy.psyexp +312 -0
- psychopy/demos/builder/Hardware/microphone/microphone.psyexp +450 -404
- psychopy/demos/builder/Hardware/pump/pump.psyexp +593 -329
- psychopy/demos/builder/Helper Tools/achorVSalignment/FlowCircular-Regular.ttf +0 -0
- psychopy/demos/builder/Helper Tools/achorVSalignment/anchorAlignment.psyexp +336 -274
- psychopy/demos/builder/Helper Tools/clockFace/clockFace.psyexp +200 -149
- psychopy/demos/builder/Helper Tools/colors/colors.psyexp +300 -279
- psychopy/demos/builder/Helper Tools/drawPolygon/drawPolygon.psyexp +677 -564
- psychopy/demos/builder/Helper Tools/keyNameFinder/keyNameFinder.psyexp +214 -158
- psychopy/demos/builder/Helper Tools/spatialUnits/unitDemo.psyexp +195 -146
- psychopy/demos/coder/experiment control/runtimeInfo.py +1 -1
- psychopy/devices/__init__.py +1 -1
- psychopy/event.py +1 -1
- psychopy/exceptions.py +1 -1
- psychopy/experiment/__init__.py +1 -1
- psychopy/experiment/_experiment.py +30 -9
- psychopy/experiment/components/__init__.py +1 -6
- psychopy/experiment/components/_base.py +44 -19
- psychopy/experiment/components/aperture/__init__.py +1 -1
- psychopy/experiment/components/brush/__init__.py +2 -2
- psychopy/experiment/components/button/__init__.py +24 -28
- psychopy/experiment/components/camera/__init__.py +38 -39
- psychopy/experiment/components/code/__init__.py +1 -1
- psychopy/experiment/components/dots/__init__.py +1 -1
- psychopy/experiment/components/eyetracker_record/__init__.py +7 -3
- psychopy/experiment/components/form/__init__.py +3 -3
- psychopy/experiment/components/grating/__init__.py +1 -1
- psychopy/experiment/components/image/__init__.py +1 -1
- psychopy/experiment/components/joyButtons/__init__.py +2 -2
- psychopy/experiment/components/joyButtons/virtualJoyButtons.py +1 -1
- psychopy/experiment/components/joystick/__init__.py +3 -3
- psychopy/experiment/components/joystick/virtualJoystick.py +1 -1
- psychopy/experiment/components/keyboard/__init__.py +98 -122
- psychopy/experiment/components/microphone/__init__.py +54 -98
- psychopy/experiment/components/mouse/__init__.py +92 -93
- psychopy/experiment/components/movie/__init__.py +28 -50
- psychopy/experiment/components/parallelOut/__init__.py +3 -3
- psychopy/experiment/components/polygon/__init__.py +2 -3
- psychopy/experiment/components/roi/__init__.py +2 -2
- psychopy/experiment/components/routineSettings/__init__.py +2 -0
- psychopy/experiment/components/serialOut/__init__.py +7 -7
- psychopy/experiment/components/settings/__init__.py +317 -313
- psychopy/experiment/components/settings/eyetracking.py +108 -0
- psychopy/experiment/components/slider/__init__.py +5 -5
- psychopy/experiment/components/sound/__init__.py +168 -78
- psychopy/experiment/components/soundsensor/__init__.py +361 -0
- psychopy/experiment/components/soundsensor/classic/soundsensor.png +0 -0
- psychopy/experiment/components/soundsensor/classic/soundsensor@2x.png +0 -0
- psychopy/experiment/components/soundsensor/dark/soundsensor.png +0 -0
- psychopy/experiment/components/soundsensor/dark/soundsensor@2x.png +0 -0
- psychopy/experiment/components/soundsensor/light/soundsensor.png +0 -0
- psychopy/experiment/components/soundsensor/light/soundsensor@2x.png +0 -0
- psychopy/experiment/components/static/__init__.py +59 -33
- psychopy/experiment/components/text/__init__.py +2 -6
- psychopy/experiment/components/textbox/__init__.py +3 -7
- psychopy/experiment/components/unknown/__init__.py +2 -0
- psychopy/experiment/components/unknownPlugin/__init__.py +2 -0
- psychopy/experiment/exports.py +1 -1
- psychopy/experiment/flow.py +2 -2
- psychopy/experiment/localization.py +1 -1
- psychopy/experiment/loops.py +43 -10
- psychopy/experiment/params.py +6 -4
- psychopy/experiment/plugins.py +8 -1
- psychopy/experiment/py2js.py +1 -1
- psychopy/experiment/py2js_transpiler.py +1 -1
- psychopy/experiment/routines/__init__.py +1 -1
- psychopy/experiment/routines/_base.py +23 -24
- psychopy/experiment/routines/audioValidator/__init__.py +343 -0
- psychopy/experiment/routines/audioValidator/classic/audio_validator.png +0 -0
- psychopy/experiment/routines/audioValidator/classic/audio_validator@2x.png +0 -0
- psychopy/experiment/routines/audioValidator/dark/audio_validator.png +0 -0
- psychopy/experiment/routines/audioValidator/dark/audio_validator@2x.png +0 -0
- psychopy/experiment/routines/audioValidator/light/audio_validator.png +0 -0
- psychopy/experiment/routines/audioValidator/light/audio_validator@2x.png +0 -0
- psychopy/experiment/routines/eyetracker_calibrate/__init__.py +76 -17
- psychopy/experiment/routines/eyetracker_validate/__init__.py +1 -1
- psychopy/experiment/routines/unknown/__init__.py +2 -0
- psychopy/experiment/routines/{photodiodeValidator → visualValidator}/__init__.py +89 -120
- psychopy/experiment/routines/visualValidator/classic/visual_validator.png +0 -0
- psychopy/experiment/routines/visualValidator/classic/visual_validator@2x.png +0 -0
- psychopy/experiment/routines/visualValidator/dark/visual_validator.png +0 -0
- psychopy/experiment/routines/visualValidator/dark/visual_validator@2x.png +0 -0
- psychopy/experiment/routines/visualValidator/light/visual_validator.png +0 -0
- psychopy/experiment/routines/visualValidator/light/visual_validator@2x.png +0 -0
- psychopy/experiment/utils.py +1 -1
- psychopy/gui/__init__.py +1 -1
- psychopy/gui/qtgui.py +15 -6
- psychopy/gui/wxgui.py +1 -1
- psychopy/hardware/__init__.py +0 -1
- psychopy/hardware/base.py +147 -16
- psychopy/hardware/bbtk/__init__.py +10 -16
- psychopy/hardware/brainproducts.py +7 -13
- psychopy/hardware/button.py +21 -2
- psychopy/hardware/buttonbox/__init__.py +1 -1
- psychopy/hardware/camera/__init__.py +18 -5
- psychopy/hardware/cedrus.py +5 -16
- psychopy/hardware/crs/__init__.py +1 -1
- psychopy/hardware/crs/bits.py +36 -33
- psychopy/hardware/crs/colorcal.py +8 -11
- psychopy/hardware/crs/optical.py +7 -10
- psychopy/hardware/crs/shaders.py +18 -5
- psychopy/hardware/emotiv.py +1 -1
- psychopy/hardware/emulator.py +11 -5
- psychopy/hardware/exceptions.py +86 -0
- psychopy/hardware/forp.py +18 -23
- psychopy/hardware/gammasci.py +8 -3
- psychopy/hardware/iolab.py +8 -19
- psychopy/hardware/joystick/__init__.py +865 -266
- psychopy/hardware/joystick/_base.py +251 -0
- psychopy/hardware/joystick/backend_glfw.py +306 -0
- psychopy/hardware/joystick/backend_pyglet.py +309 -0
- psychopy/hardware/joystick/mappings.py +287 -0
- psychopy/hardware/keyboard.py +4 -2
- psychopy/hardware/labhackers.py +1 -1
- psychopy/hardware/labjacks.py +9 -13
- psychopy/hardware/{photodiode.py → lightsensor.py} +146 -203
- psychopy/hardware/listener.py +9 -8
- psychopy/hardware/manager.py +24 -35
- psychopy/hardware/microphone.py +535 -155
- psychopy/hardware/minolta.py +14 -4
- psychopy/hardware/mouse/__init__.py +1 -1
- psychopy/hardware/photometer/__init__.py +2 -2
- psychopy/hardware/pr.py +14 -4
- psychopy/hardware/qmix.py +18 -27
- psychopy/hardware/serialdevice.py +43 -12
- psychopy/hardware/soundsensor.py +473 -0
- psychopy/hardware/spatial/__init__.py +231 -0
- psychopy/hardware/speaker.py +298 -36
- psychopy/hardware/triggerbox/__init__.py +1 -1
- psychopy/hardware/triggerbox/base.py +1 -1
- psychopy/hardware/triggerbox/parallel.py +1 -1
- psychopy/info.py +1 -1
- psychopy/iohub/devices/eyetracker/__init__.py +10 -18
- psychopy/iohub/devices/eyetracker/calibration/procedure.py +15 -33
- psychopy/iohub/devices/eyetracker/hw/gazepoint/__init__.py +2 -2
- psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/__init__.py +1 -0
- psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/eyetracker.py +10 -0
- psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/__init__.py +1 -0
- psychopy/iohub/devices/mouse/linux2.py +2 -1
- psychopy/layout.py +1 -1
- psychopy/liaison.py +91 -39
- psychopy/locale_setup.py +11 -1
- psychopy/localization/__init__.py +1 -1
- psychopy/localization/_localization.py +1 -1
- psychopy/localization/messages.pot +2 -2
- psychopy/logging.py +14 -12
- psychopy/microphone.py +4 -3
- psychopy/misc.py +1 -1
- psychopy/monitors/MonitorCenter.py +3 -3
- psychopy/monitors/__init__.py +1 -1
- psychopy/monitors/calibData.py +1 -1
- psychopy/monitors/calibTools.py +3 -2
- psychopy/platform_specific/__init__.py +1 -1
- psychopy/platform_specific/darwin.py +1 -1
- psychopy/platform_specific/linux.py +1 -1
- psychopy/platform_specific/win32.py +1 -1
- psychopy/plugins/__init__.py +26 -17
- psychopy/plugins/util.py +65 -0
- psychopy/preferences/Darwin.spec +11 -3
- psychopy/preferences/FreeBSD.spec +11 -3
- psychopy/preferences/Linux.spec +11 -3
- psychopy/preferences/Windows.spec +11 -3
- psychopy/preferences/__init__.py +1 -1
- psychopy/preferences/baseNoArch.spec +11 -3
- psychopy/preferences/hints.py +78 -61
- psychopy/preferences/preferences.py +82 -13
- psychopy/projects/__init__.py +1 -1
- psychopy/projects/pavlovia.py +29 -13
- psychopy/scripts/psyexpCompile.py +1 -1
- psychopy/session.py +81 -8
- psychopy/sound/__init__.py +25 -10
- psychopy/sound/_base.py +134 -34
- psychopy/sound/audioclip.py +38 -15
- psychopy/sound/audiodevice.py +1 -1
- psychopy/sound/backend_ptb.py +53 -321
- psychopy/sound/backend_pygame.py +7 -3
- psychopy/sound/backend_pyo.py +53 -22
- psychopy/sound/backend_pysound.py +10 -27
- psychopy/sound/backend_sounddevice.py +33 -21
- psychopy/sound/exceptions.py +1 -1
- psychopy/sound/microphone.py +83 -5
- psychopy/sound/transcribe.py +3 -3
- psychopy/tests/data/test_basic_run.py +1 -0
- psychopy/tests/data/test_sounds/default_16000.wav +0 -0
- psychopy/tests/data/test_sounds/default_192000.wav +0 -0
- psychopy/tests/data/test_sounds/default_22050.wav +0 -0
- psychopy/tests/data/test_sounds/default_32000.wav +0 -0
- psychopy/tests/data/test_sounds/default_44100.wav +0 -0
- psychopy/tests/data/test_sounds/default_48000.wav +0 -0
- psychopy/tests/data/test_sounds/default_8000.wav +0 -0
- psychopy/tests/data/test_sounds/default_96000.wav +0 -0
- psychopy/tests/test_alerts/test_alerttools.py +2 -1
- psychopy/tests/test_app/test_command_line.py +65 -0
- psychopy/tests/test_data/test_TrialHandler2.py +18 -7
- psychopy/tests/test_demos/test_builder_demos.py +1 -1
- psychopy/tests/test_experiment/needs_wx/componsTemplate.txt +5238 -4188
- psychopy/tests/test_experiment/needs_wx/test_components.py +1 -1
- psychopy/tests/test_experiment/test_components/test_RoutineSettingsComponent.py +16 -0
- psychopy/tests/test_experiment/test_components/test_all_components.py +1 -1
- psychopy/tests/test_experiment/test_components/test_base_components.py +26 -17
- psychopy/tests/test_experiment/test_loops.py +12 -4
- psychopy/tests/test_experiment/test_params.py +17 -4
- psychopy/tests/test_experiment/test_routines/test_PhotodiodeValidationRoutine.py +2 -2
- psychopy/tests/test_hardware/test_photodiode.py +66 -0
- psychopy/tests/test_liaison/test_Liaison.py +4 -4
- psychopy/tests/test_misc/test_clock.py +2 -0
- psychopy/tests/test_misc/test_color.py +2 -0
- psychopy/tests/test_misc/test_event.py +1 -0
- psychopy/tests/test_plugins/__init__.py +0 -0
- psychopy/tests/test_plugins/test_plugin_stubs.py +125 -0
- psychopy/tests/test_sound/test_sound.py +111 -40
- psychopy/tests/test_tools/test_colorspacetools.py +24 -23
- psychopy/tests/test_tools/test_mathtools.py +9 -9
- psychopy/tests/test_tools/test_viewtools.py +101 -0
- psychopy/tests/test_validators/__init__.py +0 -0
- psychopy/tests/test_validators/test_voicekeyValidator.py +95 -0
- psychopy/tests/test_visual/test_all_stimuli.py +2 -2
- psychopy/tests/test_visual/test_basevisual.py +37 -7
- psychopy/tests/test_visual/test_button.py +2 -2
- psychopy/tests/test_visual/test_circle.py +10 -2
- psychopy/tests/test_visual/test_dots.py +1 -1
- psychopy/tests/test_visual/test_form.py +13 -13
- psychopy/tests/test_visual/test_gamma.py +3 -3
- psychopy/tests/test_visual/test_image.py +2 -2
- psychopy/tests/test_visual/test_progress.py +2 -2
- psychopy/tests/test_visual/test_roi.py +8 -2
- psychopy/tests/test_visual/test_shape.py +2 -2
- psychopy/tests/test_visual/test_slider.py +2 -2
- psychopy/tests/test_visual/test_target.py +2 -2
- psychopy/tests/test_visual/test_textbox.py +6 -8
- psychopy/tests/test_visual/test_winScalePos.py +6 -5
- psychopy/tests/test_visual/test_window.py +17 -0
- psychopy/tests/utils.py +51 -1
- psychopy/tools/__init__.py +1 -1
- psychopy/tools/arraytools.py +2 -2
- psychopy/tools/attributetools.py +52 -1
- psychopy/tools/audiotools.py +4 -1
- psychopy/tools/colorspacetools.py +6 -4
- psychopy/tools/coordinatetools.py +1 -1
- psychopy/tools/fileerrortools.py +21 -9
- psychopy/tools/filetools.py +2 -2
- psychopy/tools/fontmanager.py +47 -28
- psychopy/tools/gltools.py +2967 -559
- psychopy/tools/imagetools.py +1 -1
- psychopy/tools/mathtools.py +997 -127
- psychopy/tools/monitorunittools.py +7 -1
- psychopy/tools/movietools.py +1 -2
- psychopy/tools/pkgtools.py +157 -127
- psychopy/tools/plottools.py +1 -1
- psychopy/tools/rifttools.py +1 -1
- psychopy/tools/stereotools.py +1 -1
- psychopy/tools/stimulustools.py +172 -2
- psychopy/tools/stringtools.py +22 -2
- psychopy/tools/systemtools.py +1 -1
- psychopy/tools/typetools.py +1 -1
- psychopy/tools/unittools.py +1 -1
- psychopy/tools/versionchooser.py +3 -1
- psychopy/tools/viewtools.py +54 -70
- psychopy/tools/wizard.py +2 -2
- psychopy/validation/__init__.py +6 -0
- psychopy/validation/audio.py +74 -0
- psychopy/validation/visual.py +115 -0
- psychopy/visual/__init__.py +1 -4
- psychopy/visual/aperture.py +9 -6
- psychopy/visual/backends/__init__.py +1 -1
- psychopy/visual/backends/_base.py +1 -1
- psychopy/visual/backends/gamma.py +1 -1
- psychopy/visual/backends/glfwbackend.py +8 -12
- psychopy/visual/backends/pygamebackend.py +1 -1
- psychopy/visual/backends/pygletbackend.py +32 -11
- psychopy/visual/basevisual.py +93 -13
- psychopy/visual/brush.py +1 -1
- psychopy/visual/bufferimage.py +90 -10
- psychopy/visual/button.py +1 -1
- psychopy/visual/circle.py +12 -20
- psychopy/visual/custommouse.py +1 -1
- psychopy/visual/dot.py +80 -14
- psychopy/visual/elementarray.py +84 -10
- psychopy/visual/filters.py +1 -1
- psychopy/visual/form.py +43 -28
- psychopy/visual/grating.py +105 -25
- psychopy/visual/helpers.py +4 -2
- psychopy/visual/image.py +98 -20
- psychopy/visual/line.py +15 -25
- psychopy/visual/movie.py +1 -1
- psychopy/visual/movie2.py +4 -3
- psychopy/visual/movie3.py +4 -3
- psychopy/visual/movies/__init__.py +1 -1
- psychopy/visual/movies/frame.py +1 -1
- psychopy/visual/movies/metadata.py +1 -1
- psychopy/visual/movies/players/__init__.py +1 -1
- psychopy/visual/movies/players/_base.py +1 -1
- psychopy/visual/movies/players/ffpyplayer_player.py +2 -3
- psychopy/visual/nnlvs.py +9 -6
- psychopy/visual/noise.py +4 -16
- psychopy/visual/patch.py +4 -3
- psychopy/visual/pie.py +3 -14
- psychopy/visual/polygon.py +21 -28
- psychopy/visual/radial.py +4 -18
- psychopy/visual/ratingscale.py +4 -3
- psychopy/visual/rect.py +16 -25
- psychopy/visual/rift.py +8 -2
- psychopy/visual/secondorder.py +4 -16
- psychopy/visual/shaders.py +620 -286
- psychopy/visual/shape.py +281 -90
- psychopy/visual/simpleimage.py +1 -1
- psychopy/visual/slider.py +78 -25
- psychopy/visual/stim3d.py +5 -608
- psychopy/visual/text.py +13 -3
- psychopy/visual/textbox2/textbox2.py +188 -56
- psychopy/visual/vlcmoviestim.py +1 -1
- psychopy/visual/window.py +374 -201
- psychopy/web.py +1 -1
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/METADATA +13 -12
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/RECORD +647 -624
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/WHEEL +1 -1
- psychopy/.DS_Store +0 -0
- psychopy/__init__.py.orig +0 -65
- psychopy/app/.DS_Store +0 -0
- psychopy/app/Resources/.DS_Store +0 -0
- psychopy/app/Resources/classic/filecsv16.png +0 -0
- psychopy/app/Resources/classic/fileimage16.png +0 -0
- psychopy/app/Resources/classic/fileunknown16.png +0 -0
- psychopy/app/Resources/dark/filecsv16.png +0 -0
- psychopy/app/Resources/dark/filecsv16@2x.png +0 -0
- psychopy/app/Resources/dark/fileimage16.png +0 -0
- psychopy/app/Resources/dark/fileimage16@2x.png +0 -0
- psychopy/app/Resources/dark/fileunknown16.png +0 -0
- psychopy/app/Resources/dark/fileunknown16@2x.png +0 -0
- psychopy/app/Resources/fonts/OpenSans-Bold.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-BoldItalic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-ExtraBold.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-ExtraBoldItalic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-Italic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-Light.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-LightItalic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-Regular.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-SemiBold.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-SemiBoldItalic.ttf +0 -0
- psychopy/app/Resources/light/filecsv16.png +0 -0
- psychopy/app/Resources/light/filecsv16@2x.png +0 -0
- psychopy/app/Resources/light/fileimage16.png +0 -0
- psychopy/app/Resources/light/fileimage16@2x.png +0 -0
- psychopy/app/Resources/light/fileunknown16.png +0 -0
- psychopy/app/Resources/light/fileunknown16@2x.png +0 -0
- psychopy/app/Resources/psychopySplash.png +0 -0
- psychopy/app/Resources/psychopySplash@2x.png +0 -0
- psychopy/app/builder/builder.py.orig +0 -3932
- psychopy/app/builder/dialogs/__init__.py.orig +0 -1679
- psychopy/app/builder/dialogs/paramCtrls.py.orig +0 -713
- psychopy/app/colorpicker/__init__.py.orig +0 -411
- psychopy/app/locale/ar_001/.DS_Store +0 -0
- psychopy/app/locale/ar_001/LC_MESSAGE/.DS_Store +0 -0
- psychopy/core.py.orig +0 -169
- psychopy/demos/builder/.DS_Store +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks_lastrun.py +0 -330
- psychopy/demos/builder/Experiments/.DS_Store +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/archived_conditions.xlsx +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/draw grid stim.py +0 -61
- psychopy/demos/builder/Experiments/dragAndDrop/shapeMaker.psyexp +0 -91
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_1.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_10.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_2.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_3.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_4.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_5.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_6.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_7.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_8.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_9.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/updated_conditions.xlsx +0 -0
- psychopy/demos/builder/Tools/.DS_Store +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/.DS_Store +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/data/.DS_Store +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.csv +0 -38
- psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.log +0 -3418
- psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.psydat +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.csv +0 -2
- psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.log +0 -15
- psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.psydat +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/gamma_correction_visual_lastrun.py +0 -562
- psychopy/demos/coder/.DS_Store +0 -0
- psychopy/demos/coder/experiment control/info_gamma.pickle +0 -0
- psychopy/demos/coder/iohub/.iohpid +0 -1
- psychopy/demos/coder/iohub/eyetracking/.iohpid +0 -1
- psychopy/demos/coder/iohub/wintab/.DS_Store +0 -0
- psychopy/demos/coder/stimuli/.DS_Store +0 -0
- psychopy/experiment/_experiment.py.orig +0 -1032
- psychopy/experiment/components/.DS_Store +0 -0
- psychopy/experiment/components/_base.py.orig +0 -823
- psychopy/experiment/components/form/.DS_Store +0 -0
- psychopy/experiment/components/microphone/__init__.py.orig +0 -490
- psychopy/experiment/components/settings/__init__.py.orig +0 -1337
- psychopy/experiment/components/textbox/__init__.py.orig +0 -310
- psychopy/experiment/components/webcam/.DS_Store +0 -0
- psychopy/experiment/components/webcam/light/.DS_Store +0 -0
- psychopy/experiment/loops.py.orig +0 -829
- psychopy/experiment/params.py.orig +0 -408
- psychopy/experiment/routine.py.orig +0 -503
- psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator@2x.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator@2x.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator@2x.png +0 -0
- psychopy/hardware/.DS_Store +0 -0
- psychopy/hardware/brainproducts.py.orig +0 -680
- psychopy/hardware/iolab.py.orig +0 -238
- psychopy/iohub/datastore/__init__.py.orig +0 -443
- psychopy/iohub/datastore/util.py.orig +0 -692
- psychopy/iohub/devices/mouse/darwin.py.orig +0 -427
- psychopy/iohub/devices/mouse/linux2.py.orig +0 -198
- psychopy/preferences/.DS_Store +0 -0
- psychopy/projects/pavlovia.py.orig +0 -1295
- psychopy/tests/.DS_Store +0 -0
- psychopy/tests/data/.DS_Store +0 -0
- psychopy/tests/data/TestCircle_fill_local.png +0 -0
- psychopy/tests/data/aperture1_normHexbackground_local.png +0 -0
- psychopy/tests/data/aperture1_norm_local.png +0 -0
- psychopy/tests/data/aperture2_normHexbackground_local.png +0 -0
- psychopy/tests/data/beatandrcos_height_local.png +0 -0
- psychopy/tests/data/beatandrcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/beatandrcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/beatandrcos_norm_local.png +0 -0
- psychopy/tests/data/beatandrcos_stencil_local.png +0 -0
- psychopy/tests/data/blend_add_height_local.png +0 -0
- psychopy/tests/data/blend_add_normAddBlend_local.png +0 -0
- psychopy/tests/data/blend_add_normHexbackground_local.png +0 -0
- psychopy/tests/data/blend_add_normNoShade_local.png +0 -0
- psychopy/tests/data/blend_add_norm_local.png +0 -0
- psychopy/tests/data/blend_add_stencil_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_height_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_normAddBlend_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_normHexbackground_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_normNoShade_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_norm_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_stencil_local.png +0 -0
- psychopy/tests/data/circleHex_height_local.png +0 -0
- psychopy/tests/data/circleHex_normAddBlend_local.png +0 -0
- psychopy/tests/data/circleHex_normHexbackground_local.png +0 -0
- psychopy/tests/data/circleHex_normNoShade_local.png +0 -0
- psychopy/tests/data/circleHex_norm_local.png +0 -0
- psychopy/tests/data/circleHex_stencil_local.png +0 -0
- psychopy/tests/data/color_comparison_local.png +0 -0
- psychopy/tests/data/correctScript/.DS_Store +0 -0
- psychopy/tests/data/dots_height_local.png +0 -0
- psychopy/tests/data/dots_normAddBlend_local.png +0 -0
- psychopy/tests/data/dots_normHexbackground_local.png +0 -0
- psychopy/tests/data/dots_normNoShade_local.png +0 -0
- psychopy/tests/data/dots_norm_local.png +0 -0
- psychopy/tests/data/dots_stencil_local.png +0 -0
- psychopy/tests/data/elarray1_height_local.png +0 -0
- psychopy/tests/data/elarray1_normAddBlend_local.png +0 -0
- psychopy/tests/data/elarray1_normHexbackground_local.png +0 -0
- psychopy/tests/data/elarray1_norm_local.png +0 -0
- psychopy/tests/data/elarray1_stencil_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_height_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_norm_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_stencil_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_height_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_norm_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_stencil_local.png +0 -0
- psychopy/tests/data/gabor1_height_local.png +0 -0
- psychopy/tests/data/gabor1_normAddBlend_local.png +0 -0
- psychopy/tests/data/gabor1_normHexbackground_local.png +0 -0
- psychopy/tests/data/gabor1_normNoShade_local.png +0 -0
- psychopy/tests/data/gabor1_norm_local.png +0 -0
- psychopy/tests/data/gabor1_stencil_local.png +0 -0
- psychopy/tests/data/greyscale_normHexbackground_local.png +0 -0
- psychopy/tests/data/imageAndGauss_height_local.png +0 -0
- psychopy/tests/data/imageAndGauss_normAddBlend_local.png +0 -0
- psychopy/tests/data/imageAndGauss_normHexbackground_local.png +0 -0
- psychopy/tests/data/imageAndGauss_normNoShade_local.png +0 -0
- psychopy/tests/data/imageAndGauss_norm_local.png +0 -0
- psychopy/tests/data/imageAndGauss_stencil_local.png +0 -0
- psychopy/tests/data/movFrame1_stencil_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_height_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_normNoShade_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_norm_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_stencil_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_height_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_normNoShade_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_norm_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_stencil_local.png +0 -0
- psychopy/tests/data/numpyImage_height_local.png +0 -0
- psychopy/tests/data/numpyImage_normAddBlend_local.png +0 -0
- psychopy/tests/data/numpyImage_normHexbackground_local.png +0 -0
- psychopy/tests/data/numpyImage_normNoShade_local.png +0 -0
- psychopy/tests/data/numpyImage_norm_local.png +0 -0
- psychopy/tests/data/numpyImage_stencil_local.png +0 -0
- psychopy/tests/data/shape2_1_normAddBlend_local.png +0 -0
- psychopy/tests/data/shape2_1_normHexbackground_local.png +0 -0
- psychopy/tests/data/shape2_1_normNoShade_local.png +0 -0
- psychopy/tests/data/shape2_1_norm_local.png +0 -0
- psychopy/tests/data/shape2_1_stencil_local.png +0 -0
- psychopy/tests/data/text1_height_local.png +0 -0
- psychopy/tests/data/text1_normAddBlend_local.png +0 -0
- psychopy/tests/data/text1_normHexbackground_local.png +0 -0
- psychopy/tests/data/text1_norm_local.png +0 -0
- psychopy/tests/data/text1_stencil_local.png +0 -0
- psychopy/tests/data/wedge1_height_local.png +0 -0
- psychopy/tests/data/wedge1_normAddBlend_local.png +0 -0
- psychopy/tests/data/wedge1_normHexbackground_local.png +0 -0
- psychopy/tests/data/wedge1_normNoShade_local.png +0 -0
- psychopy/tests/data/wedge1_norm_local.png +0 -0
- psychopy/tests/data/wedge1_stencil_local.png +0 -0
- psychopy/tests/test_app/.DS_Store +0 -0
- psychopy/tests/test_app/test_builder/.DS_Store +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.log +0 -177
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.psydat +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.xlsx +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.log +0 -168
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.psydat +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.xlsx +0 -0
- psychopy/tests/test_data/.DS_Store +0 -0
- psychopy/tests/test_hardware/test_CRS_BitsSharp.py +0 -67
- psychopy/tests/test_hardware/test_CRS_BitsSharp.py.orig +0 -68
- psychopy/tests/test_hardware/test_CRS_bitsShaders.py +0 -110
- psychopy/tests/test_visual/test_image.py.orig +0 -219
- psychopy/visual/basevisual.py.orig +0 -1723
- psychopy/visual/form.py.orig +0 -1181
- psychopy/visual/text.py.orig +0 -752
- psychopy/visual/textbox2/textbox2.py.orig +0 -1315
- psychopy/visual/windowwarp.py.orig +0 -463
- /psychopy/{app/cortex.log → alerts/alertsCatalogue/3600.yaml} +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-Bold.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-BoldItalic.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-Italic.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-Regular.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/DejaVuSerif.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/IndieFlower-Regular.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/JetBrainsMono-VariableFont_wght.ttf +0 -0
- /psychopy/demos/builder/Experiments/{GoNoGo → goNoGo}/readme.md +0 -0
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/entry_points.txt +0 -0
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from psychopy.experiment.components import BaseComponent, BaseDeviceComponent, Param, getInitVals
|
|
3
|
+
from psychopy.experiment.plugins import PluginDevicesMixin, DeviceBackend
|
|
4
|
+
from psychopy.localization import _translate
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SoundSensorComponent(BaseDeviceComponent, PluginDevicesMixin):
|
|
8
|
+
"""
|
|
9
|
+
Component for getting button presses from a button box device.
|
|
10
|
+
"""
|
|
11
|
+
categories = ['Responses'] # which section(s) in the components panel
|
|
12
|
+
targets = ['PsychoPy']
|
|
13
|
+
iconFile = Path(__file__).parent / 'soundsensor.png'
|
|
14
|
+
tooltip = _translate('Voice Key: Get input from a microphone as simple true/false values')
|
|
15
|
+
beta = True
|
|
16
|
+
|
|
17
|
+
def __init__(
|
|
18
|
+
self, exp, parentName,
|
|
19
|
+
# basic
|
|
20
|
+
name='soundSensor',
|
|
21
|
+
startType='time (s)', startVal=0.0,
|
|
22
|
+
stopType='duration (s)', stopVal=1.0,
|
|
23
|
+
startEstim='', durationEstim='',
|
|
24
|
+
forceEndRoutine=True,
|
|
25
|
+
# device
|
|
26
|
+
deviceLabel="",
|
|
27
|
+
deviceBackend="microphone",
|
|
28
|
+
# data
|
|
29
|
+
registerOn=True,
|
|
30
|
+
store='first',
|
|
31
|
+
storeCorrect=False,
|
|
32
|
+
correctAns="",
|
|
33
|
+
# testing
|
|
34
|
+
disabled=False,
|
|
35
|
+
):
|
|
36
|
+
# initialise base class
|
|
37
|
+
BaseDeviceComponent.__init__(
|
|
38
|
+
self, exp, parentName,
|
|
39
|
+
name=name,
|
|
40
|
+
startType=startType, startVal=startVal,
|
|
41
|
+
stopType=stopType, stopVal=stopVal,
|
|
42
|
+
startEstim=startEstim, durationEstim=durationEstim,
|
|
43
|
+
deviceLabel=deviceLabel,
|
|
44
|
+
disabled=disabled
|
|
45
|
+
)
|
|
46
|
+
self.type = "SoundSensor"
|
|
47
|
+
|
|
48
|
+
self.exp.requireImport(
|
|
49
|
+
importName="SoundSensor",
|
|
50
|
+
importFrom="psychopy.hardware.soundsensor"
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
# --- Basic params ---
|
|
54
|
+
self.order += [
|
|
55
|
+
"forceEndRoutine"
|
|
56
|
+
]
|
|
57
|
+
self.params['forceEndRoutine'] = Param(
|
|
58
|
+
forceEndRoutine, valType='bool', inputType="bool", categ='Basic',
|
|
59
|
+
hint=_translate(
|
|
60
|
+
"Should a response force the end of the Routine (e.g end the trial)?"
|
|
61
|
+
),
|
|
62
|
+
label=_translate("Force end of Routine"))
|
|
63
|
+
|
|
64
|
+
# --- Data params ---
|
|
65
|
+
self.order += [
|
|
66
|
+
"registerOn",
|
|
67
|
+
"store",
|
|
68
|
+
"allowedButtons",
|
|
69
|
+
"storeCorrect",
|
|
70
|
+
"correctAns",
|
|
71
|
+
]
|
|
72
|
+
self.params['registerOn'] = Param(
|
|
73
|
+
registerOn, valType='code', inputType='choice', categ='Data',
|
|
74
|
+
allowedVals=[True, False],
|
|
75
|
+
allowedLabels=[_translate("Press"), _translate("Release")],
|
|
76
|
+
hint=_translate(
|
|
77
|
+
"When should the response be registered? When the sound starts, or when it stops?"
|
|
78
|
+
),
|
|
79
|
+
label=_translate("Register button press on...")
|
|
80
|
+
)
|
|
81
|
+
self.params['store'] = Param(
|
|
82
|
+
store, valType='str', inputType="choice", categ='Data',
|
|
83
|
+
allowedVals=['last', 'first', 'all', 'nothing'],
|
|
84
|
+
allowedLabels=[_translate("Last response"), _translate("First response"), _translate(
|
|
85
|
+
"All responses"), _translate("Nothing")],
|
|
86
|
+
updates='constant', direct=False,
|
|
87
|
+
hint=_translate(
|
|
88
|
+
"Choose which (if any) responses to store at the end of a trial"
|
|
89
|
+
),
|
|
90
|
+
label=_translate("Store"))
|
|
91
|
+
self.params['storeCorrect'] = Param(
|
|
92
|
+
storeCorrect, valType='bool', inputType="bool", categ='Data',
|
|
93
|
+
updates='constant',
|
|
94
|
+
hint=_translate(
|
|
95
|
+
"Do you want to save the response as correct/incorrect?"
|
|
96
|
+
),
|
|
97
|
+
label=_translate("Store correct"))
|
|
98
|
+
self.depends.append(
|
|
99
|
+
{
|
|
100
|
+
"dependsOn": "storeCorrect", # if...
|
|
101
|
+
"condition": f"== True", # meets...
|
|
102
|
+
"param": "correctAns", # then...
|
|
103
|
+
"true": "show", # should...
|
|
104
|
+
"false": "hide", # otherwise...
|
|
105
|
+
}
|
|
106
|
+
)
|
|
107
|
+
self.params['correctAns'] = Param(
|
|
108
|
+
correctAns, valType='code', inputType="single", categ='Data',
|
|
109
|
+
hint=_translate(
|
|
110
|
+
"What is the 'correct' response (True/False)? Might be helpful to add a correctAns column and use "
|
|
111
|
+
"$correctAns to compare to the response. "
|
|
112
|
+
),
|
|
113
|
+
label=_translate("Correct answer"), direct=False)
|
|
114
|
+
|
|
115
|
+
# --- Device params ---
|
|
116
|
+
self.order += [
|
|
117
|
+
"deviceBackend",
|
|
118
|
+
]
|
|
119
|
+
|
|
120
|
+
self.params['deviceBackend'] = Param(
|
|
121
|
+
deviceBackend, valType="str", inputType="choice", categ="Device",
|
|
122
|
+
allowedVals=self.getBackendKeys,
|
|
123
|
+
allowedLabels=self.getBackendLabels,
|
|
124
|
+
label=_translate("Device backend"),
|
|
125
|
+
hint=_translate(
|
|
126
|
+
"What kind of sound sensor is it? What package/plugin should be used to talk to it?"
|
|
127
|
+
),
|
|
128
|
+
direct=False
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
# add params for any backends
|
|
132
|
+
self.loadBackends()
|
|
133
|
+
|
|
134
|
+
def writeInitCode(self, buff):
|
|
135
|
+
inits = getInitVals(self.params)
|
|
136
|
+
# code to create object
|
|
137
|
+
code = (
|
|
138
|
+
"%(name)s = SoundSensor(\n"
|
|
139
|
+
" device=%(deviceLabel)s\n"
|
|
140
|
+
")\n"
|
|
141
|
+
)
|
|
142
|
+
buff.writeIndentedLines(code % inits)
|
|
143
|
+
|
|
144
|
+
def writeRoutineStartCode(self, buff):
|
|
145
|
+
# choose a clock to sync to according to component's params
|
|
146
|
+
if "syncScreenRefresh" in self.params and self.params['syncScreenRefresh']:
|
|
147
|
+
clockStr = ""
|
|
148
|
+
else:
|
|
149
|
+
clockStr = "clock=routineTimer"
|
|
150
|
+
# sync component start/stop timers with validator clocks
|
|
151
|
+
code = (
|
|
152
|
+
f"# synchronise device clock for %(name)s with Routine timer\n"
|
|
153
|
+
f"%(name)s.resetTimer({clockStr})\n"
|
|
154
|
+
)
|
|
155
|
+
buff.writeIndentedLines(code % self.params)
|
|
156
|
+
# clear keys
|
|
157
|
+
code = (
|
|
158
|
+
"# clear %(name)s button presses\n"
|
|
159
|
+
"%(name)s.times = []\n"
|
|
160
|
+
"%(name)s.corr = []\n"
|
|
161
|
+
)
|
|
162
|
+
buff.writeIndentedLines(code % self.params)
|
|
163
|
+
|
|
164
|
+
def writeFrameCode(self, buff):
|
|
165
|
+
params = self.params
|
|
166
|
+
code = (
|
|
167
|
+
"\n"
|
|
168
|
+
"# *%(name)s* updates\n"
|
|
169
|
+
)
|
|
170
|
+
buff.writeIndentedLines(code % params)
|
|
171
|
+
# writes an if statement to determine whether to draw etc
|
|
172
|
+
indented = self.writeStartTestCode(buff)
|
|
173
|
+
if indented:
|
|
174
|
+
# dispatch and clear messages
|
|
175
|
+
code = (
|
|
176
|
+
"# clear any messages from before starting\n"
|
|
177
|
+
"%(name)s.responses = []\n"
|
|
178
|
+
"%(name)s.clearResponses()\n"
|
|
179
|
+
)
|
|
180
|
+
buff.writeIndentedLines(code % params)
|
|
181
|
+
# to get out of the if statement
|
|
182
|
+
buff.setIndentLevel(-indented, relative=True)
|
|
183
|
+
|
|
184
|
+
# test for started (will update parameters each frame as needed)
|
|
185
|
+
indented = self.writeActiveTestCode(buff)
|
|
186
|
+
if indented:
|
|
187
|
+
# write code to get messages
|
|
188
|
+
code = (
|
|
189
|
+
"# ask for messages from %(name)s device this frame\n"
|
|
190
|
+
"for _thisResp in %(name)s.getResponses(\n"
|
|
191
|
+
" state=%(registerOn)s, clear=True\n"
|
|
192
|
+
"):\n"
|
|
193
|
+
)
|
|
194
|
+
if self.params['store'] == "all":
|
|
195
|
+
# if storing all, append
|
|
196
|
+
code += (
|
|
197
|
+
" %(name)s.times.append(_thisResp.t)\n"
|
|
198
|
+
)
|
|
199
|
+
# include code to get correct
|
|
200
|
+
if self.params['storeCorrect']:
|
|
201
|
+
code += (
|
|
202
|
+
" if bool(_thisResp.value) is bool(%(correctAns)s):\n"
|
|
203
|
+
" %(name)s.corr.append(1)\n"
|
|
204
|
+
" else:\n"
|
|
205
|
+
" %(name)s.corr.append(0)\n"
|
|
206
|
+
)
|
|
207
|
+
elif self.params['store'] == "last":
|
|
208
|
+
# if storing last, replace
|
|
209
|
+
code += (
|
|
210
|
+
" %(name)s.times = _thisResp.t\n"
|
|
211
|
+
)
|
|
212
|
+
# include code to get correct
|
|
213
|
+
if self.params['storeCorrect']:
|
|
214
|
+
code += (
|
|
215
|
+
" if bool(_thisResp.value) is bool(%(correctAns)s):\n"
|
|
216
|
+
" %(name)s.corr = 1\n"
|
|
217
|
+
" else:\n"
|
|
218
|
+
" %(name)s.corr = 0\n"
|
|
219
|
+
)
|
|
220
|
+
elif self.params['store'] == "first":
|
|
221
|
+
# if storing first, replace but only if empty
|
|
222
|
+
code += (
|
|
223
|
+
" if not %(name)s.buttons:\n"
|
|
224
|
+
" %(name)s.times = _thisResp.t\n"
|
|
225
|
+
)
|
|
226
|
+
# include code to get correct
|
|
227
|
+
if self.params['storeCorrect']:
|
|
228
|
+
code += (
|
|
229
|
+
" if bool(_thisResp.value) is bool(%(correctAns)s):\n"
|
|
230
|
+
" %(name)s.corr = 1\n"
|
|
231
|
+
" else:\n"
|
|
232
|
+
" %(name)s.corr = 0\n"
|
|
233
|
+
)
|
|
234
|
+
else:
|
|
235
|
+
code = "pass\n"
|
|
236
|
+
|
|
237
|
+
buff.writeIndentedLines(code % params)
|
|
238
|
+
# code to end Routine
|
|
239
|
+
if self.params['forceEndRoutine']:
|
|
240
|
+
code = (
|
|
241
|
+
"# end Routine if %(name)s got response\n"
|
|
242
|
+
"if %(name)s.times:\n"
|
|
243
|
+
" continueRoutine = False\n"
|
|
244
|
+
)
|
|
245
|
+
buff.writeIndentedLines(code % params)
|
|
246
|
+
|
|
247
|
+
# to get out of the if statement
|
|
248
|
+
buff.setIndentLevel(-indented, relative=True)
|
|
249
|
+
|
|
250
|
+
# test for stop (only if there was some setting for duration or stop)
|
|
251
|
+
indented = self.writeStopTestCode(buff)
|
|
252
|
+
if indented:
|
|
253
|
+
# to get out of the if statement
|
|
254
|
+
buff.setIndentLevel(-indented, relative=True)
|
|
255
|
+
|
|
256
|
+
def writeRoutineEndCode(self, buff):
|
|
257
|
+
BaseComponent.writeRoutineEndCode(self, buff)
|
|
258
|
+
params = self.params
|
|
259
|
+
|
|
260
|
+
# write code to save responses
|
|
261
|
+
code = (
|
|
262
|
+
"# store data from %(name)s\n"
|
|
263
|
+
"thisExp.addData('%(name)s.times', %(name)s.times)\n"
|
|
264
|
+
"thisExp.addData('%(name)s.corr', %(name)s.corr)\n"
|
|
265
|
+
)
|
|
266
|
+
buff.writeIndentedLines(code % params)
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
class MicrophoneSoundSensorBackend(DeviceBackend):
|
|
270
|
+
"""
|
|
271
|
+
Adds a basic microphone emulation backend for SoundSensorComponent, as well as acting as an example
|
|
272
|
+
for implementing other SoundSensorBackends.
|
|
273
|
+
"""
|
|
274
|
+
|
|
275
|
+
key = "microphone"
|
|
276
|
+
label = _translate("Microphone emulator")
|
|
277
|
+
component = SoundSensorComponent
|
|
278
|
+
deviceClasses = ['psychopy.hardware.soundsensor.MicrophoneSoundSensorEmulator']
|
|
279
|
+
|
|
280
|
+
def getParams(self: SoundSensorComponent):
|
|
281
|
+
# define order
|
|
282
|
+
order = [
|
|
283
|
+
"meMicrophone",
|
|
284
|
+
"meThreshold",
|
|
285
|
+
"meRange",
|
|
286
|
+
"meSamplingWindow",
|
|
287
|
+
]
|
|
288
|
+
# define params
|
|
289
|
+
params = {}
|
|
290
|
+
def getDeviceIndices():
|
|
291
|
+
from psychopy.hardware.microphone import MicrophoneDevice
|
|
292
|
+
profiles = MicrophoneDevice.getAvailableDevices()
|
|
293
|
+
|
|
294
|
+
return [None] + [profile['index'] for profile in profiles]
|
|
295
|
+
|
|
296
|
+
def getDeviceNames():
|
|
297
|
+
from psychopy.hardware.microphone import MicrophoneDevice
|
|
298
|
+
profiles = MicrophoneDevice.getAvailableDevices()
|
|
299
|
+
|
|
300
|
+
return ["default"] + [profile['deviceName'] for profile in profiles]
|
|
301
|
+
|
|
302
|
+
params['meMicrophone'] = Param(
|
|
303
|
+
None, valType="str", inputType="choice", categ="Device",
|
|
304
|
+
updates="constant", allowedUpdates=None,
|
|
305
|
+
allowedVals=getDeviceIndices,
|
|
306
|
+
allowedLabels=getDeviceNames,
|
|
307
|
+
label=_translate("Microphone"),
|
|
308
|
+
hint=_translate(
|
|
309
|
+
"What microphone device to take volume readings from?"
|
|
310
|
+
)
|
|
311
|
+
)
|
|
312
|
+
params['meThreshold'] = Param(
|
|
313
|
+
0.5, valType="code", inputType="single", categ="Device",
|
|
314
|
+
updates="constant", allowedUpdates=None,
|
|
315
|
+
label=_translate("Threshold (0-1)"),
|
|
316
|
+
hint=_translate(
|
|
317
|
+
"Threshold volume (0 for min value in dB range, 1 for max value) above which to "
|
|
318
|
+
"register a sound sensor response"
|
|
319
|
+
)
|
|
320
|
+
)
|
|
321
|
+
params['meRange'] = Param(
|
|
322
|
+
(0, 1), valType="list", inputType="single", categ="Device",
|
|
323
|
+
updates="constant", allowedUpdates=None,
|
|
324
|
+
label=_translate("Decibel range"),
|
|
325
|
+
hint=_translate(
|
|
326
|
+
"What kind of values (dB) would you expect to receive from this device? In other "
|
|
327
|
+
"words, how many dB does a threshold of 0 and of 255 correspond to?"
|
|
328
|
+
)
|
|
329
|
+
)
|
|
330
|
+
params['meSamplingWindow'] = Param(
|
|
331
|
+
0.03, valType="code", inputType="single", categ="Device",
|
|
332
|
+
updates="constant", allowedUpdates=None,
|
|
333
|
+
label=_translate("Sampling window (s)"),
|
|
334
|
+
hint=_translate(
|
|
335
|
+
"How many seconds to average volume readings across? Bigger windows are less "
|
|
336
|
+
"precise, but also less subject to random noise."
|
|
337
|
+
)
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
return params, order
|
|
341
|
+
|
|
342
|
+
def addRequirements(self: SoundSensorComponent):
|
|
343
|
+
self.exp.requireImport(
|
|
344
|
+
importName="microphone", importFrom="psychopy.hardware"
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
def writeDeviceCode(self: SoundSensorComponent, buff):
|
|
348
|
+
# get inits
|
|
349
|
+
inits = getInitVals(self.params)
|
|
350
|
+
# make ButtonGroup object
|
|
351
|
+
code = (
|
|
352
|
+
"deviceManager.addDevice(\n"
|
|
353
|
+
" deviceClass='psychopy.hardware.soundsensor.MicrophoneSoundSensorEmulator',\n"
|
|
354
|
+
" deviceName=%(deviceLabel)s,\n"
|
|
355
|
+
" device=%(meMicrophone)s,\n"
|
|
356
|
+
" threshold=%(meThreshold)s, \n"
|
|
357
|
+
" dbRange=%(meRange)s, \n"
|
|
358
|
+
" samplingWindow=%(meSamplingWindow)s, \n"
|
|
359
|
+
")\n"
|
|
360
|
+
)
|
|
361
|
+
buff.writeOnceIndentedLines(code % inits)
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
"""
|
|
5
5
|
Part of the PsychoPy library
|
|
6
|
-
Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
6
|
+
Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
7
7
|
Distributed under the terms of the GNU General Public License (GPL).
|
|
8
8
|
"""
|
|
9
9
|
|
|
@@ -26,10 +26,18 @@ class StaticComponent(BaseComponent):
|
|
|
26
26
|
tooltip = _translate('Static: Static screen period (e.g. an ISI). '
|
|
27
27
|
'Useful for pre-loading stimuli.')
|
|
28
28
|
|
|
29
|
-
def __init__(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
def __init__(
|
|
30
|
+
self, exp, parentName,
|
|
31
|
+
# basic
|
|
32
|
+
name='ISI',
|
|
33
|
+
startType='time (s)', startVal=0.0,
|
|
34
|
+
stopType='duration (s)', stopVal=0.5,
|
|
35
|
+
startEstim='', durationEstim='',
|
|
36
|
+
# custom
|
|
37
|
+
code="",
|
|
38
|
+
# data
|
|
39
|
+
saveData=False
|
|
40
|
+
):
|
|
33
41
|
BaseComponent.__init__(
|
|
34
42
|
self, exp, parentName, name=name,
|
|
35
43
|
startType=startType, startVal=startVal,
|
|
@@ -39,11 +47,26 @@ class StaticComponent(BaseComponent):
|
|
|
39
47
|
self.updatesList = [] # a list of dicts {compParams, fieldName}
|
|
40
48
|
self.type = 'Static'
|
|
41
49
|
self.url = "https://www.psychopy.org/builder/components/static.html"
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
50
|
+
# --- Custom params ---
|
|
51
|
+
self.order += [
|
|
52
|
+
"code",
|
|
53
|
+
"saveData",
|
|
54
|
+
]
|
|
55
|
+
self.params['code'] = Param(
|
|
56
|
+
code, valType='code', inputType="multi", categ='Custom',
|
|
57
|
+
label=_translate("Custom code"),
|
|
58
|
+
hint=_translate(
|
|
59
|
+
"Custom code to be run during the static period (after updates)"
|
|
60
|
+
)
|
|
61
|
+
)
|
|
62
|
+
self.params['saveData'] = Param(
|
|
63
|
+
saveData, valType="code", inputType="bool", categ="Custom",
|
|
64
|
+
label=_translate("Save data during"),
|
|
65
|
+
hint=_translate(
|
|
66
|
+
"While the frame loop is paused, should we take the opportunity to save data now? "
|
|
67
|
+
"This is only relevant locally, online data saving is either periodic or on close."
|
|
68
|
+
)
|
|
69
|
+
)
|
|
47
70
|
|
|
48
71
|
def addComponentUpdate(self, routine, compName, fieldName):
|
|
49
72
|
self.updatesList.append({'compName': compName,
|
|
@@ -157,7 +180,10 @@ class StaticComponent(BaseComponent):
|
|
|
157
180
|
buff.writeIndented("# *%s* period\n" % (self.params['name']))
|
|
158
181
|
needsUnindent = BaseComponent.writeStartTestCode(self, buff)
|
|
159
182
|
if needsUnindent:
|
|
160
|
-
if self.params['
|
|
183
|
+
if self.params['stopVal'] in ("", "-1", "None", None):
|
|
184
|
+
# if duration is infinite, set it to extremely long and warn the user
|
|
185
|
+
durationSecsStr = "FOREVER"
|
|
186
|
+
elif self.params['stopType'].val == 'time (s)':
|
|
161
187
|
durationSecsStr = "%(stopVal)s-t" % (self.params)
|
|
162
188
|
elif self.params['stopType'].val == 'duration (s)':
|
|
163
189
|
durationSecsStr = "%(stopVal)s" % (self.params)
|
|
@@ -169,9 +195,21 @@ class StaticComponent(BaseComponent):
|
|
|
169
195
|
msg = ("Couldn't deduce end point for startType=%(startType)s, "
|
|
170
196
|
"stopType=%(stopType)s")
|
|
171
197
|
raise Exception(msg % self.params)
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
198
|
+
# save data
|
|
199
|
+
if self.params['saveData']:
|
|
200
|
+
code = (
|
|
201
|
+
"# take the opportunity to save data file now (to be updated later)\n"
|
|
202
|
+
"_%(name)sLastFileNames = thisExp.save()\n"
|
|
203
|
+
"thisExp.queueNextCollision('overwrite', fileName=_%(name)sLastFileNames)\n"
|
|
204
|
+
)
|
|
205
|
+
buff.writeIndentedLines(code % self.params)
|
|
206
|
+
# start static
|
|
207
|
+
code = (
|
|
208
|
+
"# start the static period\n"
|
|
209
|
+
"%(name)s.start({})\n"
|
|
210
|
+
).format(durationSecsStr)
|
|
211
|
+
buff.writeIndentedLines(code % self.params)
|
|
212
|
+
|
|
175
213
|
return needsUnindent
|
|
176
214
|
|
|
177
215
|
def writeStopTestCode(self, buff):
|
|
@@ -182,28 +220,16 @@ class StaticComponent(BaseComponent):
|
|
|
182
220
|
buff.writeIndented(code % self.params)
|
|
183
221
|
buff.setIndentLevel(+1, relative=True) # entered an if statement
|
|
184
222
|
self.writeParamUpdates(buff)
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
elif self.params['stopType'].val == 'duration (frames)':
|
|
193
|
-
code = "%(name)s.tStop = %(name)s.tStart + %(stopVal)s*frameDur # record stop time\n"
|
|
194
|
-
elif self.params['stopType'].val == 'frame N':
|
|
195
|
-
code = "%(name)s.tStop = %(stopVal)s*frameDur # record stop time\n"
|
|
196
|
-
else:
|
|
197
|
-
msg = ("Couldn't deduce end point for startType=%(startType)s, "
|
|
198
|
-
"stopType=%(stopType)s")
|
|
199
|
-
raise Exception(msg % self.params)
|
|
200
|
-
# Store stop time
|
|
201
|
-
buff.writeIndented(code % self.params)
|
|
223
|
+
# finish
|
|
224
|
+
code = (
|
|
225
|
+
"# finish the static period and store its duration\n"
|
|
226
|
+
"%(name)s.complete()\n"
|
|
227
|
+
"%(name)s.tStop = %(name)s.tStart + %(name)s.getDuration()\n"
|
|
228
|
+
)
|
|
229
|
+
buff.writeIndentedLines(code % self.params)
|
|
202
230
|
# to get out of the if statement
|
|
203
231
|
buff.setIndentLevel(-1, relative=True)
|
|
204
232
|
|
|
205
|
-
# pass # the clock.StaticPeriod class handles its own stopping
|
|
206
|
-
|
|
207
233
|
def writeParamUpdates(self, buff, updateType=None, paramNames=None, target="PsychoPy"):
|
|
208
234
|
"""Write updates. Unlike most components, which us this method
|
|
209
235
|
to update themselves, the Static Component uses this to update
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
3
|
|
|
4
4
|
# Part of the PsychoPy library
|
|
5
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
5
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
6
6
|
# Distributed under the terms of the GNU General Public License (GPL).
|
|
7
7
|
|
|
8
8
|
from pathlib import Path
|
|
@@ -54,7 +54,7 @@ class TextComponent(BaseVisualComponent):
|
|
|
54
54
|
canBePath=False,
|
|
55
55
|
label=_translate("Text"))
|
|
56
56
|
self.params['font'] = Param(
|
|
57
|
-
font, valType='str', inputType="
|
|
57
|
+
font, valType='str', inputType="font", allowedTypes=[], categ='Formatting',
|
|
58
58
|
updates='constant', allowedUpdates=_allow3[:], # copy the list
|
|
59
59
|
hint=_translate("The font name (e.g. Comic Sans)"),
|
|
60
60
|
label=_translate("Font"))
|
|
@@ -188,7 +188,3 @@ class TextComponent(BaseVisualComponent):
|
|
|
188
188
|
code = (" %sdepth: %.1f \n"
|
|
189
189
|
"});\n\n" % (flipStr, depth))
|
|
190
190
|
buff.writeIndentedLines(code)
|
|
191
|
-
|
|
192
|
-
def integrityCheck(self):
|
|
193
|
-
super().integrityCheck() # run parent class checks first
|
|
194
|
-
alerttools.testFont(self) # Test whether font is available locally
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
3
|
|
|
4
4
|
# Part of the PsychoPy library
|
|
5
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
5
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
6
6
|
# Distributed under the terms of the GNU General Public License (GPL).
|
|
7
7
|
|
|
8
8
|
from pathlib import Path
|
|
@@ -19,7 +19,7 @@ class TextboxComponent(BaseVisualComponent):
|
|
|
19
19
|
version = "2020.2.0"
|
|
20
20
|
iconFile = Path(__file__).parent / 'textbox.png'
|
|
21
21
|
tooltip = _translate('Textbox: present text stimuli but cooler')
|
|
22
|
-
beta =
|
|
22
|
+
beta = False
|
|
23
23
|
|
|
24
24
|
def __init__(self, exp, parentName, name='textbox',
|
|
25
25
|
# effectively just a display-value
|
|
@@ -85,7 +85,7 @@ class TextboxComponent(BaseVisualComponent):
|
|
|
85
85
|
hint=_translate("Placeholder text to show when there is no text contents."),
|
|
86
86
|
label=_translate("Placeholder text"))
|
|
87
87
|
self.params['font'] = Param(
|
|
88
|
-
font, valType='str', inputType="
|
|
88
|
+
font, valType='str', inputType="font", allowedTypes=[], categ='Formatting',
|
|
89
89
|
updates='constant', allowedUpdates=_allow3[:], # copy the list
|
|
90
90
|
hint=_translate("The font name (e.g. Comic Sans)"),
|
|
91
91
|
label=_translate("Font"))
|
|
@@ -334,7 +334,3 @@ class TextboxComponent(BaseVisualComponent):
|
|
|
334
334
|
buff.writeIndentedLines(f"psychoJS.experiment.addData('{name}.text',{name}.text)\n")
|
|
335
335
|
# get parent to write code too (e.g. store onset/offset times)
|
|
336
336
|
super().writeRoutineEndCodeJS(buff)
|
|
337
|
-
|
|
338
|
-
def integrityCheck(self):
|
|
339
|
-
super().integrityCheck() # run parent class checks first
|
|
340
|
-
alerttools.testFont(self) # Test whether font is available locally
|
|
@@ -20,6 +20,8 @@ class UnknownComponent(BaseComponent):
|
|
|
20
20
|
tooltip = _translate('Unknown: A component that is not known by the current '
|
|
21
21
|
'installed version of PsychoPy\n(most likely from the '
|
|
22
22
|
'future)')
|
|
23
|
+
# hide from the Components panel
|
|
24
|
+
hidden = True
|
|
23
25
|
|
|
24
26
|
def __init__(self, exp, parentName, name='', compType="UnknownComponent"):
|
|
25
27
|
self.exp = exp # so we can access the experiment if necess
|
|
@@ -18,6 +18,8 @@ class UnknownPluginComponent(BaseComponent):
|
|
|
18
18
|
targets = ['PsychoPy']
|
|
19
19
|
iconFile = Path(__file__).parent / 'unknownPlugin.png'
|
|
20
20
|
tooltip = _translate('Unknown: A component which comes from a plugin which you do not have installed & activated.')
|
|
21
|
+
# hide from the Components panel
|
|
22
|
+
hidden = True
|
|
21
23
|
|
|
22
24
|
def __init__(self, exp, parentName, name='', compType="UnknownPluginComponent"):
|
|
23
25
|
self.exp = exp # so we can access the experiment if necess
|
psychopy/experiment/exports.py
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
3
|
|
|
4
4
|
# Part of the PsychoPy library
|
|
5
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
5
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
6
6
|
# Distributed under the terms of the GNU General Public License (GPL).
|
|
7
7
|
|
|
8
8
|
"""Experiment classes:
|
psychopy/experiment/flow.py
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
3
|
|
|
4
4
|
# Part of the PsychoPy library
|
|
5
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
5
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
6
6
|
# Distributed under the terms of the GNU General Public License (GPL).
|
|
7
7
|
|
|
8
8
|
"""Describes the Flow of an experiment
|
|
@@ -456,7 +456,7 @@ class Flow(list):
|
|
|
456
456
|
name = resource.split('/')[-1]
|
|
457
457
|
elif 'surveyId' in resource:
|
|
458
458
|
name = 'surveyId'
|
|
459
|
-
elif 'name' in resource
|
|
459
|
+
elif 'name' in resource:
|
|
460
460
|
name = resource['name']
|
|
461
461
|
elif 'rel' in resource:
|
|
462
462
|
name = resource['rel']
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
3
|
|
|
4
4
|
# Part of the PsychoPy library
|
|
5
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
5
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
6
6
|
# Distributed under the terms of the GNU General Public License (GPL).
|
|
7
7
|
|
|
8
8
|
"""These are probably going to get used a lot so translate them once and reuse
|