MWorks 0.12 released

April 12, 2023 Posted by Christopher Stawarz


MWorks 0.12 is now available for Mac and iPad. Highlights of this release include:

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.


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

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



  • Expression parser functions refresh_rate, next_frame_time, and display_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)


  • Updated Mac app icons to match current macOS style


  • 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


  • 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, which provides pure-Python tools for reading MWK2 files (more info)

  • Added get_version and require_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


  • 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