MWorks 0.12 released
MWorks 0.12 is now available for Mac and iPad. Highlights of this release include:
- Major overhaul and modernization of audio stimuli
- Support for multiple stimulus displays in a single experiment
- Parametric shape stimulus
- Support for LabJack T4 and T7 devices
- Support for TRACKPixx3 eye trackers
- Support for the UW Quad Channel Laser Modulator (QCUALOR)
- Conditional inclusion and required macros in MWEL
- Pure-Python MWK2 file reader (for analyzing event files on non-Mac systems)
MWorks 0.12 requires a Mac running macOS Big Sur (11.0) or later or an iPad running iPadOS 16.0 or later. It was tested on macOS 11, 12, and 13 and iPadOS 16.
For a full list of changes in this release, please see the release notes below.
Core
Audio Stimuli
MWorks’ support for audio stimuli has undergone a major overhaul and modernization:
-
Audio File Stimulus (formerly Sound Stimulus) now supports any audio file format readable by the operating system
-
Audio files can now be configured to loop indefinitely or repeat a fixed number of times
-
Added Tone Stimulus for generating simple tones
-
Audio stimuli now support dynamic changes to volume and stereo panning and can notify the experiment when they have ended
-
Play Sound now supports specifying a start time for playback, which enables synchronization of playback start with other sounds or events in the experiment
-
Audio stimuli can now be loaded and unloaded by a running experiment
-
Audio stimuli can now be placed in a Sound Group, which should make it easier to manage large sets of stimuli
For more information, see this discussion.
Visual Stimuli
-
Added support for using multiple, independent stimulus displays in a single experiment (more info)
-
Fixation point stimuli (both rectangular and circular) now report active fixation only when on screen
-
Stimuli and display-related actions (e.g. Update Stimulus Display) can now specify the display with which they are associated (required when using multiple displays)
-
Exceptions raised during Load Stimulus execution no longer cause the experiment to stop or crash
-
Stimulus Display device now supports setting custom update and capture variables
-
On macOS, fixed a bug that prevented color management from being fully disabled
I/O Devices
-
Added support for LabJack LJM devices (specifically the T4 and T7)
-
Added support for the University of Washington Quad Channel Laser Modulator (QCUALOR)
-
Added support for TRACKPixx3 eye trackers
-
DATAPixx devices are now compatible with the VPixx Device Server. An unfortunate consequence of this is that the MWorks’ DATAPixx interface now supports only x86_64 (Intel) processors. Support for arm64 (Apple silicon) processors will be re-added if/when the underlying libraries support it.
-
ISCAN devices now handle omission of the serial_port parameter correctly
-
Added
display
parameter to EyeLink, mouse input, and touch input devices (required when using multiple stimulus displays) -
XIMEA camera now supports both arm64 (Apple silicon) and x86_64 (Intel) processors
-
Removed support for ITC-18 and NI-DAQ devices, because their vendor-provided drivers are incompatible with macOS 11 and later
-
Removed legacy MSSWGamepad plugin, as it crashed MWServer on recent macOS releases and is fully replaced by the USB HID device
MWEL
-
Added support for conditional code inclusion
-
Added support for requiring macro definitions
-
%define x
is now accepted as shorthand for%define x = true
-
Parser now waits to load included files until after the entire including file has been parsed
Other
-
Expression parser functions
refresh_rate
,next_frame_time
, anddisplay_bounds
now support non-default displays -
Added support for component parameter name aliases
- Variable parameter “persistant” is now named persistent; “persistant” and “saved” are accepted as aliases
- Audio file parameter “amplitude” is now named volume; “amplitude” is still accepted as an alias
-
Experiment-defined variables and selection variables can now include descriptions (more info)
-
Improved run-time descriptions of system variables
-
Warnings and non-fatal errors are now silenced when evaluating expressions at load time
-
#mainScreenInfo is no longer required to contain the key
refresh_rate_hz
(which is currently unused)
Applications
- Updated Mac app icons to match current macOS style
MWServer
-
Display-selection menu now shows localized display names (e.g. “Built-in Retina Display”, “LED Cinema Display”) instead of generic names (e.g. “Main display”, “Display 2”)
-
Mirror window location is now preserved between sessions
MWClient
-
Eye calibrator window now supports preserving hidden parameters on update
-
Variables window now uses variable descriptions as tooltips for variable names
Python and MATLAB Tools
-
Python plugin now embeds Python 3.10 (instead of 3.9)
-
Python tools now require Python 3.7 or later
-
Added mwk2reader.py, which provides pure-Python tools for reading MWK2 files (more info)
-
Added
get_version
andrequire_version
functions and__version__
attribute to Python mworks module (more info) -
MATLAB tools now require MATLAB R2020b or later
-
Added MATLAB MWKFile class, which supports extracting events from an event file one at a time in order to avoid filling up system memory
Internals/Development
-
Upgraded to new versions of many supporting libraries:
- boost: 1.77.0 ➞ 1.81.0
- libffi: 3.4.2 ➞ 3.4.4
- libusb: 1.0.24 ➞ 1.0.26
- msgpack: 4.0.3 ➞ 4.1.1
- numpy: 1.21.4 ➞ 1.23.3
- openssl: 1.1.1l ➞ 3.0.7
- python: 3.9.9 ➞ 3.10.7
- sqlite: 3.37.0 ➞ 3.40.0
-
C++ code is now compiled using the C++20 language standard
-
The default C/C++ optimization level is now “3” (instead of “s”)
-
Moved most of Sound’s implementation into new LegacySound class. OpenALSound now derives from LegacySound.
-
Moved contents of StandardSounds.h and StandardSounds.cpp into corresponding LegacySounds.* files.
-
Added MWClientPluginViewControllerFactory protocol and MWClientPluginViewController class to MWorksCocoa
-
Client plugin window controllers can now subclass NSViewController (in addition to NSWindowController)
-
MWorksCocoa can now be imported as a module