psychopy 2024.2.5__py3-none-any.whl → 2025.1.0__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 +2 -0
- 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 +1 -1
- 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 +16 -3
- 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 +534 -154
- 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/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 +2964 -558
- 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 +1 -1
- 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 +373 -200
- psychopy/web.py +1 -1
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/METADATA +9 -9
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/RECORD +644 -621
- 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.0.dist-info}/WHEEL +0 -0
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/entry_points.txt +0 -0
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/licenses/LICENSE +0 -0
psychopy/experiment/loops.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:
|
|
@@ -216,8 +216,15 @@ class TrialHandler(_BaseLoopHandler):
|
|
|
216
216
|
# then run the trials loop
|
|
217
217
|
code = "\nfor %s in %s:\n"
|
|
218
218
|
buff.writeIndentedLines(code % (self.thisName, self.params['name']))
|
|
219
|
-
# fetch parameter info from conditions
|
|
220
219
|
buff.setIndentLevel(1, relative=True)
|
|
220
|
+
# mark current trial as started
|
|
221
|
+
code = (
|
|
222
|
+
"%(name)s.status = STARTED\n"
|
|
223
|
+
"if hasattr(%(loopIndex)s, 'status'):\n"
|
|
224
|
+
" %(loopIndex)s.status = STARTED\n"
|
|
225
|
+
)
|
|
226
|
+
buff.writeIndentedLines(code % inits)
|
|
227
|
+
# fetch parameter info from conditions
|
|
221
228
|
code = (
|
|
222
229
|
"currentLoop = %(name)s\n"
|
|
223
230
|
"thisExp.timestampOnFlip(win, 'thisRow.t', format=globalClock.format)\n"
|
|
@@ -345,7 +352,28 @@ class TrialHandler(_BaseLoopHandler):
|
|
|
345
352
|
)
|
|
346
353
|
|
|
347
354
|
def writeLoopEndCode(self, buff):
|
|
348
|
-
#
|
|
355
|
+
# copy params so we can safely add to it
|
|
356
|
+
params = self.params.copy()
|
|
357
|
+
# add param for current trial name
|
|
358
|
+
params['thisName'] = self.thisName
|
|
359
|
+
# mark current trial as finished at end of each iteration
|
|
360
|
+
code = (
|
|
361
|
+
"# mark %(thisName)s as finished\n"
|
|
362
|
+
"if hasattr(%(thisName)s, 'status'):\n"
|
|
363
|
+
" %(thisName)s.status = FINISHED\n"
|
|
364
|
+
"# if awaiting a pause, pause now\n"
|
|
365
|
+
"if %(name)s.status == PAUSED:\n"
|
|
366
|
+
" thisExp.status = PAUSED\n"
|
|
367
|
+
" pauseExperiment(\n"
|
|
368
|
+
" thisExp=thisExp, \n"
|
|
369
|
+
" win=win, \n"
|
|
370
|
+
" timers=[globalClock], \n"
|
|
371
|
+
" )\n"
|
|
372
|
+
" # once done pausing, restore running status\n"
|
|
373
|
+
" %(name)s.status = STARTED"
|
|
374
|
+
)
|
|
375
|
+
buff.writeIndentedLines(code % params)
|
|
376
|
+
# just within the loop advance data line if loop is whole trials
|
|
349
377
|
if self.params['isTrials'].val == True:
|
|
350
378
|
buff.writeIndentedLines(
|
|
351
379
|
"thisExp.nextEntry()\n"
|
|
@@ -353,9 +381,13 @@ class TrialHandler(_BaseLoopHandler):
|
|
|
353
381
|
)
|
|
354
382
|
# end of the loop. dedent
|
|
355
383
|
buff.setIndentLevel(-1, relative=True)
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
384
|
+
# mark finished
|
|
385
|
+
code = (
|
|
386
|
+
"# completed %(nReps)s repeats of '%(name)s'\n"
|
|
387
|
+
"%(name)s.status = FINISHED\n"
|
|
388
|
+
"\n"
|
|
389
|
+
)
|
|
390
|
+
buff.writeIndentedLines(code % params)
|
|
359
391
|
# save data
|
|
360
392
|
if self.params['isTrials'].val:
|
|
361
393
|
# send final data to Liaison
|
|
@@ -385,7 +417,7 @@ class TrialHandler(_BaseLoopHandler):
|
|
|
385
417
|
" dataOut=['n','all_mean','all_std', 'all_raw'])\n")
|
|
386
418
|
buff.writeIndentedLines(code % self.params)
|
|
387
419
|
if saveCSV:
|
|
388
|
-
code = ("%(name)s.saveAsText(filename + '%(name)s.csv', "
|
|
420
|
+
code = ("%(name)s.saveAsText(filename + '_%(name)s.csv', "
|
|
389
421
|
"delim=',',\n"
|
|
390
422
|
" stimOut=params,\n"
|
|
391
423
|
" dataOut=['n','all_mean','all_std', 'all_raw'])\n")
|
|
@@ -574,7 +606,7 @@ class StairHandler(_BaseLoopHandler):
|
|
|
574
606
|
buff.writeIndented(code % self.params)
|
|
575
607
|
if self.exp.settings.params['Save csv file'].val:
|
|
576
608
|
code = ("%(name)s.saveAsText(filename + "
|
|
577
|
-
"'%(name)s.csv', delim=',')\n")
|
|
609
|
+
"'_%(name)s.csv', delim=',')\n")
|
|
578
610
|
buff.writeIndented(code % self.params)
|
|
579
611
|
|
|
580
612
|
def getType(self):
|
|
@@ -683,7 +715,8 @@ class MultiStairHandler(_BaseLoopHandler):
|
|
|
683
715
|
def writeLoopStartCode(self, buff):
|
|
684
716
|
# create a 'thisName' for use in "for thisTrial in trials:"
|
|
685
717
|
makeLoopIndex = self.exp.namespace.makeLoopIndex
|
|
686
|
-
|
|
718
|
+
makeLoopIndex(self.params['name'].val)
|
|
719
|
+
self.thisName = "condition"
|
|
687
720
|
# create the MultistairHander
|
|
688
721
|
code = ("\n# set up handler to look after randomisation of trials etc\n"
|
|
689
722
|
"conditions = data.importConditions(%(conditionsFile)s)\n"
|
|
@@ -833,7 +866,7 @@ class MultiStairHandler(_BaseLoopHandler):
|
|
|
833
866
|
code = "%(name)s.saveAsExcel(filename + '.xlsx')\n"
|
|
834
867
|
buff.writeIndented(code % self.params)
|
|
835
868
|
if self.exp.settings.params['Save csv file'].val:
|
|
836
|
-
code = ("%(name)s.saveAsText(filename + '%(name)s.csv', "
|
|
869
|
+
code = ("%(name)s.saveAsText(filename + '_%(name)s.csv', "
|
|
837
870
|
"delim=',')\n")
|
|
838
871
|
buff.writeIndented(code % self.params)
|
|
839
872
|
|
psychopy/experiment/params.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:
|
|
@@ -56,9 +56,11 @@ inputDefaults = {
|
|
|
56
56
|
# silence any "future version" warnings
|
|
57
57
|
legacyParams = [
|
|
58
58
|
# in 2021.1, we standardised colorSpace to be object-wide rather than param-specific
|
|
59
|
-
|
|
59
|
+
"lineColorSpace", "borderColorSpace", "fillColorSpace", "foreColorSpace",
|
|
60
60
|
# in 2024.2.0, we removed some superfluous params from the pupil labs backend
|
|
61
61
|
"plCompanionRecordingEnabled", "plPupilCaptureRecordingEnabled",
|
|
62
|
+
# from 2025.1, latency priority is handled by SpeakerDevice
|
|
63
|
+
"Audio latency priority",
|
|
62
64
|
]
|
|
63
65
|
|
|
64
66
|
|
|
@@ -137,7 +139,7 @@ class Param():
|
|
|
137
139
|
- code: Some code, will be compiled verbatim or translated to JS (no ")
|
|
138
140
|
- extendedCode: A block of code, will be compiled verbatim or translated to JS and
|
|
139
141
|
linebreaks will be preserved
|
|
140
|
-
- file: A file path, will be compiled like str but will replace unescaped
|
|
142
|
+
- file: A file path, will be compiled like str but will replace unescaped \\ with /
|
|
141
143
|
- list: A list of values, will be compiled like code but if there's no [] or () then
|
|
142
144
|
these are added
|
|
143
145
|
Note that, if value begins with a $, it will always be treated as code regardless of
|
|
@@ -178,7 +180,7 @@ class Param():
|
|
|
178
180
|
Mostly used by the test suite to check that params which should be used are used.
|
|
179
181
|
canBePath : bool
|
|
180
182
|
Is it possible for this parameter to be a path? Setting to False will disable
|
|
181
|
-
filepath sanitization (e.g. for textbox you may not want to replace
|
|
183
|
+
filepath sanitization (e.g. for textbox you may not want to replace \\ with /)
|
|
182
184
|
ctrlParams : dict
|
|
183
185
|
Extra information to pass to the control, such as the Excel template file to use in a
|
|
184
186
|
`table` control.
|
psychopy/experiment/plugins.py
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
from psychopy import logging
|
|
2
|
+
|
|
3
|
+
|
|
1
4
|
class PluginDevicesMixin:
|
|
2
5
|
"""
|
|
3
6
|
Mixin for Components and Routines which adds behaviour to get parameters and values from
|
|
@@ -78,6 +81,10 @@ class DeviceBackend:
|
|
|
78
81
|
deviceClasses = []
|
|
79
82
|
|
|
80
83
|
def __init_subclass__(cls):
|
|
84
|
+
logging.debug(
|
|
85
|
+
f"Registered backend for {cls.component.__name__}: {cls.label} ({cls.key}) from "
|
|
86
|
+
f"{cls.__module__}:{cls.__name__}"
|
|
87
|
+
)
|
|
81
88
|
# add class to list of backends for ButtonBoxComponent
|
|
82
89
|
cls.component.backends = cls.component.backends.copy()
|
|
83
90
|
cls.component.backends.append(cls)
|
|
@@ -106,7 +113,7 @@ class DeviceBackend:
|
|
|
106
113
|
"""
|
|
107
114
|
Add any required module/package imports for this backend
|
|
108
115
|
"""
|
|
109
|
-
|
|
116
|
+
return
|
|
110
117
|
|
|
111
118
|
def writeDeviceCode(self, buff):
|
|
112
119
|
"""
|
psychopy/experiment/py2js.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
|
"""Converting code parameters and components from python (PsychoPy)
|
|
@@ -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
|
import ast
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
6
|
# Part of the PsychoPy library
|
|
7
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
7
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
8
8
|
# Distributed under the terms of the GNU General Public License (GPL).
|
|
9
9
|
|
|
10
10
|
from importlib import import_module
|
|
@@ -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
|
|
@@ -30,6 +30,8 @@ class BaseStandaloneRoutine:
|
|
|
30
30
|
version = "0.0.0"
|
|
31
31
|
# is it still in beta?
|
|
32
32
|
beta = False
|
|
33
|
+
# hide this Component in Builder view?
|
|
34
|
+
hidden = False
|
|
33
35
|
|
|
34
36
|
def __init__(self, exp, name='',
|
|
35
37
|
stopType='duration (s)', stopVal='',
|
|
@@ -680,16 +682,6 @@ class Routine(list):
|
|
|
680
682
|
'\n# --- Run Routine "{name}" ---\n')
|
|
681
683
|
buff.writeIndentedLines(code.format(name=self.name,
|
|
682
684
|
clockName=self._clockName))
|
|
683
|
-
# check for the trials loop ending this Routine
|
|
684
|
-
if len(self.exp.flow._loopList):
|
|
685
|
-
loop = self.exp.flow._loopList[-1]
|
|
686
|
-
code = (
|
|
687
|
-
"# if trial has changed, end Routine now\n"
|
|
688
|
-
"if isinstance({name}, data.TrialHandler2) and {thisName}.thisN != {"
|
|
689
|
-
"name}.thisTrial.thisN:\n"
|
|
690
|
-
" continueRoutine = False\n"
|
|
691
|
-
).format(name=loop.name, thisName=loop.thisName)
|
|
692
|
-
buff.writeIndentedLines(code)
|
|
693
685
|
|
|
694
686
|
# initial value for forceRoutineEnded (needs to happen now as Code components will have executed
|
|
695
687
|
# their Begin Routine code)
|
|
@@ -705,6 +697,15 @@ class Routine(list):
|
|
|
705
697
|
buff.writeIndented(code)
|
|
706
698
|
|
|
707
699
|
buff.setIndentLevel(1, True)
|
|
700
|
+
# check for the trials loop ending this Routine
|
|
701
|
+
if len(self.exp.flow._loopList):
|
|
702
|
+
loop = self.exp.flow._loopList[-1]
|
|
703
|
+
code = (
|
|
704
|
+
"# if trial has changed, end Routine now\n"
|
|
705
|
+
"if hasattr({thisName}, 'status') and {thisName}.status == STOPPING:\n"
|
|
706
|
+
" continueRoutine = False\n"
|
|
707
|
+
).format(thisName=loop.thisName)
|
|
708
|
+
buff.writeIndentedLines(code)
|
|
708
709
|
# on each frame
|
|
709
710
|
code = ('# get current time\n'
|
|
710
711
|
't = {clockName}.getTime()\n'
|
|
@@ -720,8 +721,8 @@ class Routine(list):
|
|
|
720
721
|
for event in self:
|
|
721
722
|
if event.type == 'Static':
|
|
722
723
|
continue # we'll do those later
|
|
723
|
-
event.writeFrameCode(buff)
|
|
724
724
|
event.writeEachFrameValidationCode(buff)
|
|
725
|
+
event.writeFrameCode(buff)
|
|
725
726
|
# update static component code last
|
|
726
727
|
for event in self.getStatics():
|
|
727
728
|
event.writeFrameCode(buff)
|
|
@@ -741,27 +742,20 @@ class Routine(list):
|
|
|
741
742
|
" return\n"
|
|
742
743
|
)
|
|
743
744
|
buff.writeIndentedLines(code)
|
|
744
|
-
|
|
745
|
-
# handle pausing
|
|
746
|
-
playbackComponents = [
|
|
747
|
-
comp.name for comp in self
|
|
748
|
-
if type(comp).__name__ in ("MovieComponent", "SoundComponent")
|
|
749
|
-
]
|
|
750
|
-
playbackComponentsStr = ", ".join(playbackComponents)
|
|
745
|
+
# write code (work out playback and dispatch comps at runtime)
|
|
751
746
|
code = (
|
|
752
747
|
"# pause experiment here if requested\n"
|
|
753
748
|
"if thisExp.status == PAUSED:\n"
|
|
754
749
|
" pauseExperiment(\n"
|
|
755
750
|
" thisExp=thisExp, \n"
|
|
756
751
|
" win=win, \n"
|
|
757
|
-
" timers=[routineTimer], \n"
|
|
758
|
-
"
|
|
752
|
+
" timers=[routineTimer, globalClock], \n"
|
|
753
|
+
" currentRoutine=%(name)s,\n"
|
|
759
754
|
" )\n"
|
|
760
755
|
" # skip the frame we paused on\n"
|
|
761
756
|
" continue"
|
|
762
757
|
)
|
|
763
|
-
code
|
|
764
|
-
buff.writeIndentedLines(code)
|
|
758
|
+
buff.writeIndentedLines(code % self.params)
|
|
765
759
|
|
|
766
760
|
# are we done yet?
|
|
767
761
|
code = (
|
|
@@ -826,6 +820,8 @@ class Routine(list):
|
|
|
826
820
|
"t = 0;\n"
|
|
827
821
|
"frameN = -1;\n"
|
|
828
822
|
"continueRoutine = true; // until we're told otherwise\n"
|
|
823
|
+
"// keep track of whether this Routine was forcibly ended\n"
|
|
824
|
+
"routineForceEnded = false;\n"
|
|
829
825
|
% self.params)
|
|
830
826
|
buff.writeIndentedLines(code)
|
|
831
827
|
# can we use non-slip timing?
|
|
@@ -926,6 +922,7 @@ class Routine(list):
|
|
|
926
922
|
code = ("// check if the Routine should terminate\n"
|
|
927
923
|
"if (!continueRoutine) {"
|
|
928
924
|
" // a component has requested a forced-end of Routine\n"
|
|
925
|
+
" routineForceEnded = true;\n"
|
|
929
926
|
" return Scheduler.Event.NEXT;\n"
|
|
930
927
|
"}\n\n"
|
|
931
928
|
"continueRoutine = false; "
|
|
@@ -1016,7 +1013,9 @@ class Routine(list):
|
|
|
1016
1013
|
# reset routineTimer at the *very end* of all non-nonSlip routines
|
|
1017
1014
|
if useNonSlip:
|
|
1018
1015
|
code = (
|
|
1019
|
-
"if (
|
|
1016
|
+
"if (routineForceEnded) {{\n"
|
|
1017
|
+
" routineTimer.reset();"
|
|
1018
|
+
"}} else if (%(name)sMaxDurationReached) {{\n"
|
|
1020
1019
|
" %(name)sClock.add(%(name)sMaxDuration);\n"
|
|
1021
1020
|
"}} else {{\n"
|
|
1022
1021
|
" %(name)sClock.add({:f});\n"
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from psychopy.alerts._alerts import alert
|
|
6
|
+
from psychopy.experiment import Param
|
|
7
|
+
from psychopy.experiment.plugins import PluginDevicesMixin, DeviceBackend
|
|
8
|
+
from psychopy.experiment.components import getInitVals
|
|
9
|
+
from psychopy.experiment.routines import Routine, BaseValidatorRoutine
|
|
10
|
+
from psychopy.localization import _translate
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class AudioValidatorRoutine(BaseValidatorRoutine, PluginDevicesMixin):
|
|
14
|
+
"""
|
|
15
|
+
Use a sound sensor (voicekey or microphone) to confirm that audio stimuli are presented when they should be.
|
|
16
|
+
"""
|
|
17
|
+
targets = ['PsychoPy']
|
|
18
|
+
|
|
19
|
+
categories = ['Validation']
|
|
20
|
+
iconFile = Path(__file__).parent / 'audio_validator.png'
|
|
21
|
+
tooltip = _translate(
|
|
22
|
+
"Use a sound sensor to confirm that audio stimuli are presented when they should "
|
|
23
|
+
"be."
|
|
24
|
+
)
|
|
25
|
+
deviceClasses = ["psychopy.validation.voicekey.AudioValidator"]
|
|
26
|
+
version = "2025.1.0"
|
|
27
|
+
|
|
28
|
+
def __init__(
|
|
29
|
+
self,
|
|
30
|
+
# basic
|
|
31
|
+
exp, name='audioVal',
|
|
32
|
+
threshold=0.5,
|
|
33
|
+
# device
|
|
34
|
+
deviceLabel="", deviceBackend="microphone", channel="0",
|
|
35
|
+
):
|
|
36
|
+
|
|
37
|
+
self.exp = exp # so we can access the experiment if necess
|
|
38
|
+
self.params = {}
|
|
39
|
+
self.depends = []
|
|
40
|
+
super(AudioValidatorRoutine, self).__init__(exp, name=name)
|
|
41
|
+
self.order += []
|
|
42
|
+
self.type = 'AudioValidator'
|
|
43
|
+
|
|
44
|
+
exp.requirePsychopyLibs(["validation"])
|
|
45
|
+
|
|
46
|
+
# --- Basic ---
|
|
47
|
+
self.order += [
|
|
48
|
+
"threshold",
|
|
49
|
+
]
|
|
50
|
+
self.params['threshold'] = Param(
|
|
51
|
+
threshold, valType="code", inputType="single", categ="Basic",
|
|
52
|
+
label=_translate("Threshold"),
|
|
53
|
+
hint=_translate(
|
|
54
|
+
"Arbitrary volume threshold at which the sound sensor should register a positive, units go from 0 (least volume) to 1 (most volume)."
|
|
55
|
+
)
|
|
56
|
+
)
|
|
57
|
+
del self.params['stopType']
|
|
58
|
+
del self.params['stopVal']
|
|
59
|
+
|
|
60
|
+
# --- Device ---
|
|
61
|
+
self.order += [
|
|
62
|
+
"deviceLabel",
|
|
63
|
+
"deviceBackend",
|
|
64
|
+
"channel",
|
|
65
|
+
]
|
|
66
|
+
self.params['deviceLabel'] = Param(
|
|
67
|
+
deviceLabel, valType="str", inputType="single", categ="Device",
|
|
68
|
+
label=_translate("Device name"),
|
|
69
|
+
hint=_translate(
|
|
70
|
+
"A name to refer to this Component's associated hardware device by. If using the "
|
|
71
|
+
"same device for multiple components, be sure to use the same name here."
|
|
72
|
+
)
|
|
73
|
+
)
|
|
74
|
+
self.params['deviceBackend'] = Param(
|
|
75
|
+
deviceBackend, valType="code", inputType="choice", categ="Device",
|
|
76
|
+
allowedVals=self.getBackendKeys,
|
|
77
|
+
allowedLabels=self.getBackendLabels,
|
|
78
|
+
label=_translate("Sound sensor type"),
|
|
79
|
+
hint=_translate(
|
|
80
|
+
"Type of sound sensor to use."
|
|
81
|
+
),
|
|
82
|
+
direct=False
|
|
83
|
+
)
|
|
84
|
+
self.params['channel'] = Param(
|
|
85
|
+
channel, valType="code", inputType="single", categ="Device",
|
|
86
|
+
label=_translate("Sound sensor channel"),
|
|
87
|
+
hint=_translate(
|
|
88
|
+
"If relevant, a channel number attached to the sound sensor, to distinguish it "
|
|
89
|
+
"from other sound sensors on the same port. Leave blank to use the first sound sensor "
|
|
90
|
+
"which can detect the speaker."
|
|
91
|
+
)
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
self.loadBackends()
|
|
95
|
+
|
|
96
|
+
def writeDeviceCode(self, buff):
|
|
97
|
+
"""
|
|
98
|
+
Code to setup the CameraDevice for this component.
|
|
99
|
+
|
|
100
|
+
Parameters
|
|
101
|
+
----------
|
|
102
|
+
buff : io.StringIO
|
|
103
|
+
Text buffer to write code to.
|
|
104
|
+
"""
|
|
105
|
+
# do usual backend-specific device code writing
|
|
106
|
+
PluginDevicesMixin.writeDeviceCode(self, buff)
|
|
107
|
+
# get inits
|
|
108
|
+
inits = getInitVals(self.params)
|
|
109
|
+
# get device handle
|
|
110
|
+
code = (
|
|
111
|
+
"%(deviceLabelCode)s = deviceManager.getDevice(%(deviceLabel)s)\n"
|
|
112
|
+
"%(deviceLabelCode)s.setThreshold(%(threshold)s, channel=%(channel)s)\n"
|
|
113
|
+
)
|
|
114
|
+
buff.writeOnceIndentedLines(code % inits)
|
|
115
|
+
|
|
116
|
+
def writeMainCode(self, buff):
|
|
117
|
+
inits = getInitVals(self.params)
|
|
118
|
+
# get diode
|
|
119
|
+
code = (
|
|
120
|
+
"# diode object for %(name)s\n"
|
|
121
|
+
"%(name)sDevice = deviceManager.getDevice(%(deviceLabel)s)\n"
|
|
122
|
+
)
|
|
123
|
+
buff.writeIndentedLines(code % inits)
|
|
124
|
+
|
|
125
|
+
if self.params['threshold']:
|
|
126
|
+
code = (
|
|
127
|
+
"%(name)sDevice.setThreshold(%(threshold)s, channel=%(channel)s)\n"
|
|
128
|
+
)
|
|
129
|
+
buff.writeIndentedLines(code % inits)
|
|
130
|
+
# create validator object
|
|
131
|
+
code = (
|
|
132
|
+
"# validator object for %(name)s\n"
|
|
133
|
+
"%(name)s = validation.AudioValidator(\n"
|
|
134
|
+
" %(name)sDevice, %(channel)s,\n"
|
|
135
|
+
")\n"
|
|
136
|
+
)
|
|
137
|
+
buff.writeIndentedLines(code % inits)
|
|
138
|
+
# connect stimuli
|
|
139
|
+
for stim in self.findConnectedStimuli():
|
|
140
|
+
code = (
|
|
141
|
+
"# connect {stim} to %(name)s\n"
|
|
142
|
+
"%(name)s.connectStimulus({stim})\n"
|
|
143
|
+
).format(stim=stim.params['name'])
|
|
144
|
+
buff.writeIndentedLines(code % inits)
|
|
145
|
+
|
|
146
|
+
def writeRoutineStartValidationCode(self, buff, stim):
|
|
147
|
+
"""
|
|
148
|
+
Write the routine start code to validate a given stimulus using this validator.
|
|
149
|
+
|
|
150
|
+
Parameters
|
|
151
|
+
----------
|
|
152
|
+
buff : StringIO
|
|
153
|
+
String buffer to write code to.
|
|
154
|
+
stim : BaseComponent
|
|
155
|
+
Stimulus to validate
|
|
156
|
+
|
|
157
|
+
Returns
|
|
158
|
+
-------
|
|
159
|
+
int
|
|
160
|
+
Change in indentation level after writing
|
|
161
|
+
"""
|
|
162
|
+
# get starting indent level
|
|
163
|
+
startIndent = buff.indentLevel
|
|
164
|
+
|
|
165
|
+
# choose a clock to sync to according to component's params
|
|
166
|
+
if "syncScreenRefresh" in stim.params and stim.params['syncScreenRefresh']:
|
|
167
|
+
clockStr = ""
|
|
168
|
+
else:
|
|
169
|
+
clockStr = "clock=routineTimer"
|
|
170
|
+
# sync component start/stop timers with validator clocks
|
|
171
|
+
code = (
|
|
172
|
+
f"# synchronise device clock for %(name)s with Routine timer\n"
|
|
173
|
+
f"%(name)s.resetTimer({clockStr})\n"
|
|
174
|
+
)
|
|
175
|
+
buff.writeIndentedLines(code % self.params)
|
|
176
|
+
|
|
177
|
+
# return change in indent level
|
|
178
|
+
return buff.indentLevel - startIndent
|
|
179
|
+
|
|
180
|
+
def writeEachFrameValidationCode(self, buff, stim):
|
|
181
|
+
"""
|
|
182
|
+
Write the each frame code to validate a given stimulus using this validator.
|
|
183
|
+
|
|
184
|
+
Parameters
|
|
185
|
+
----------
|
|
186
|
+
buff : StringIO
|
|
187
|
+
String buffer to write code to.
|
|
188
|
+
stim : BaseComponent
|
|
189
|
+
Stimulus to validate
|
|
190
|
+
|
|
191
|
+
Returns
|
|
192
|
+
-------
|
|
193
|
+
int
|
|
194
|
+
Change in indentation level after writing
|
|
195
|
+
"""
|
|
196
|
+
# get starting indent level
|
|
197
|
+
startIndent = buff.indentLevel
|
|
198
|
+
|
|
199
|
+
# validate start time
|
|
200
|
+
code = (
|
|
201
|
+
"# validate {name} start time\n"
|
|
202
|
+
"if {name}.status == STARTED and %(name)s.status == STARTED:\n"
|
|
203
|
+
" %(name)s.tStart, %(name)s.tStartDelay = %(name)s.validate(state=True, t={name}.tStartRefresh)\n"
|
|
204
|
+
" if %(name)s.tStart is not None:\n"
|
|
205
|
+
" %(name)s.status = FINISHED\n"
|
|
206
|
+
)
|
|
207
|
+
if stim.params['saveStartStop']:
|
|
208
|
+
# save validated start time if stim requested
|
|
209
|
+
code += (
|
|
210
|
+
" thisExp.addData('{name}.%(name)s.started', %(name)s.tStart)\n"
|
|
211
|
+
" thisExp.addData('{name}.%(name)s.startDelay', %(name)s.tStartDelay)\n"
|
|
212
|
+
)
|
|
213
|
+
buff.writeIndentedLines(code.format(**stim.params) % self.params)
|
|
214
|
+
|
|
215
|
+
# validate stop time
|
|
216
|
+
code = (
|
|
217
|
+
"# validate {name} stop time\n"
|
|
218
|
+
"if {name}.status == FINISHED and %(name)s.status == STARTED:\n"
|
|
219
|
+
" %(name)s.tStop, %(name)s.tStopDelay = %(name)s.validate(state=False, t={name}.tStopRefresh)\n"
|
|
220
|
+
" if %(name)s.tStop is not None:\n"
|
|
221
|
+
" %(name)s.status = FINISHED\n"
|
|
222
|
+
)
|
|
223
|
+
if stim.params['saveStartStop']:
|
|
224
|
+
# save validated start time if stim requested
|
|
225
|
+
code += (
|
|
226
|
+
" thisExp.addData('{name}.%(name)s.stopped', %(name)s.tStop)\n"
|
|
227
|
+
" thisExp.addData('{name}.%(name)s.stopDelay', %(name)s.tStopDelay)\n"
|
|
228
|
+
)
|
|
229
|
+
buff.writeIndentedLines(code.format(**stim.params) % self.params)
|
|
230
|
+
|
|
231
|
+
# return change in indent level
|
|
232
|
+
return buff.indentLevel - startIndent
|
|
233
|
+
|
|
234
|
+
def findConnectedStimuli(self):
|
|
235
|
+
# list of linked components
|
|
236
|
+
stims = []
|
|
237
|
+
routines = []
|
|
238
|
+
# inspect each Routine
|
|
239
|
+
for emt in self.exp.flow:
|
|
240
|
+
# skip non-standard Routines
|
|
241
|
+
if not isinstance(emt, Routine):
|
|
242
|
+
continue
|
|
243
|
+
# inspect each Component
|
|
244
|
+
for comp in emt:
|
|
245
|
+
# get validators for this component
|
|
246
|
+
compValidator = comp.getValidator()
|
|
247
|
+
# look for self
|
|
248
|
+
if compValidator == self:
|
|
249
|
+
# if found, add the comp to the list
|
|
250
|
+
stims.append(comp)
|
|
251
|
+
# add to list of Routines containing comps
|
|
252
|
+
if emt not in routines:
|
|
253
|
+
routines.append(emt)
|
|
254
|
+
# if any rt has two validated comps, warn
|
|
255
|
+
if len(routines) < len(stims):
|
|
256
|
+
alert(3610, obj=self, strFields={'validator': self.name})
|
|
257
|
+
|
|
258
|
+
return stims
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
class MicrophoneSoundSensorValidatorBackend(DeviceBackend):
|
|
262
|
+
"""
|
|
263
|
+
Adds a microphone sound sensor emulation backend for AudioValidator, as well as acting as an
|
|
264
|
+
example for implementing other sound sensor device backends.
|
|
265
|
+
"""
|
|
266
|
+
|
|
267
|
+
key = "microphone"
|
|
268
|
+
label = _translate("Microphone")
|
|
269
|
+
component = AudioValidatorRoutine
|
|
270
|
+
deviceClasses = ["psychopy.hardware.soundsensor.MicrophoneSoundSensor"]
|
|
271
|
+
|
|
272
|
+
def getParams(self: AudioValidatorRoutine):
|
|
273
|
+
# define order
|
|
274
|
+
order = [
|
|
275
|
+
'microphone',
|
|
276
|
+
'dbRange',
|
|
277
|
+
'samplingWindow'
|
|
278
|
+
]
|
|
279
|
+
# define params
|
|
280
|
+
params = {}
|
|
281
|
+
def getDeviceIndices():
|
|
282
|
+
from psychopy.hardware.microphone import MicrophoneDevice
|
|
283
|
+
profiles = MicrophoneDevice.getAvailableDevices()
|
|
284
|
+
|
|
285
|
+
return [None] + [profile['index'] for profile in profiles]
|
|
286
|
+
|
|
287
|
+
def getDeviceNames():
|
|
288
|
+
from psychopy.hardware.microphone import MicrophoneDevice
|
|
289
|
+
profiles = MicrophoneDevice.getAvailableDevices()
|
|
290
|
+
|
|
291
|
+
return ["default"] + [profile['deviceName'] for profile in profiles]
|
|
292
|
+
|
|
293
|
+
params['microphone'] = Param(
|
|
294
|
+
None, valType='str', inputType="choice", categ="Device",
|
|
295
|
+
allowedVals=getDeviceIndices,
|
|
296
|
+
allowedLabels=getDeviceNames,
|
|
297
|
+
label=_translate("Microphone"),
|
|
298
|
+
hint=_translate(
|
|
299
|
+
"What microphone device to use?"
|
|
300
|
+
)
|
|
301
|
+
)
|
|
302
|
+
params['dbRange'] = Param(
|
|
303
|
+
(0, 1), valType="list", inputType="single", categ="Device",
|
|
304
|
+
label=_translate("Decibel range"),
|
|
305
|
+
hint=_translate(
|
|
306
|
+
"Range of possible decibels to expect mic responses to be in, by default (0, 1)"
|
|
307
|
+
)
|
|
308
|
+
)
|
|
309
|
+
params['samplingWindow'] = Param(
|
|
310
|
+
0.03, valType="code", inputType="single", categ="Device",
|
|
311
|
+
label=_translate("Sampling window"),
|
|
312
|
+
hint=_translate(
|
|
313
|
+
"How long (s) to average samples from the microphone across? Larger sampling "
|
|
314
|
+
"windows reduce the chance of random spikes, but also reduce sensitivity."
|
|
315
|
+
)
|
|
316
|
+
)
|
|
317
|
+
|
|
318
|
+
return params, order
|
|
319
|
+
|
|
320
|
+
def addRequirements(self):
|
|
321
|
+
# needs microphone
|
|
322
|
+
self.exp.requireImport(
|
|
323
|
+
importName="MicrophoneDevice",
|
|
324
|
+
importFrom="psychopy.hardware.microphone"
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
def writeDeviceCode(self: AudioValidatorRoutine, buff):
|
|
328
|
+
# get inits
|
|
329
|
+
inits = getInitVals(self.params)
|
|
330
|
+
# make MicrophoneVoiceKey object
|
|
331
|
+
code = (
|
|
332
|
+
"%(name)sDevice = MicrophoneDevice(\n"
|
|
333
|
+
" index=%(microphone)s\n"
|
|
334
|
+
")\n"
|
|
335
|
+
"deviceManager.addDevice(\n"
|
|
336
|
+
" deviceClass='psychopy.hardware.soundsensor.MicrophoneSoundSensor',\n"
|
|
337
|
+
" deviceName=%(deviceLabel)s,\n"
|
|
338
|
+
" device=%(name)sDevice, \n"
|
|
339
|
+
" dbRange=%(dbRange)s, \n"
|
|
340
|
+
" samplingWindow=%(samplingWindow)s, \n"
|
|
341
|
+
")\n"
|
|
342
|
+
)
|
|
343
|
+
buff.writeOnceIndentedLines(code % inits)
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|