MWorks 0.11 released

February 16, 2022 Posted by Christopher Stawarz


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

Please note: This is the last MWorks release that will support ITC-18 and NI-DAQ devices.

MWorks 0.11 requires a Mac running macOS Mojave (10.14.6) or later or an iPad running iPadOS 14.7 or later.

For a full list of changes in this release, please see the release notes below.

Apple Silicon Support

MWorks now provides native support for the arm64 (aka Apple silicon) processor architecture on macOS. All macOS applications, plugins, and tools now include native binaries for both arm64 and x86_64 (Intel) processors, except for the following components, which depend on Intel-only external libraries:

Native arm64 versions of these components will be added in a future release if/when arm64 versions of the required libraries become available.


Visual Stimuli

  • All standard stimulus types have been reimplemented using Apple’s Metal API. Existing OpenGL-based stimuli are still supported and can be used alongside Metal-based stimuli, but this support will likely end in the next MWorks release.

  • The transition to Metal necessitated changes (mostly minor) to some stimulus types:

  • Added support for stimulus display frame capture (more info)

  • Added Python image stimulus

  • Added central_starting_phase parameter to drifting grating

  • Normalized Gaussian mask values are now clamped to [0,1]. This fixes an issue where the mask could produce unintended colors when blending with a non-grayscale background. Applies to both the mask and drifting grating stimuli.

  • Fixed a rendering error that produced unintended edge effects in text stimulus

  • Attempts to create a video stimulus from an audio-only file are now handled properly

  • Image file stimulus no longer uses mipmaps, as they consume GPU resources and seem unlikely to offer any benefit in actual usage

  • The display update thread now gets a brief “warm up” interval before the experiment starts. This seems to eliminate the single “update_stimulus_display action took more than two display refresh cycles” warning often seen when an experiment starts on iOS.

  • Reduced lock contention between main state system thread and stimulus display update thread, which could lead to serious performance issues on iOS

I/O Devices



  • Addressed some UI issues on macOS 11 and 12

  • On iOS, don’t block the first-run dialog asking for permission to use the local network

  • Clarified MWServer’s “Use color management” preference


  • Python bridge window now alerts the user if the script fails to launch (e.g. because the selected Python executable doesn’t exist)

  • Variables window now permits selection of group headings

  • Variables window now discards input that contains only whitespace

Python and MATLAB Tools

  • Python plugin now embeds Python 3.9 (instead of 3.8)

  • Python tools now require Python 3.6 or later

  • Python conduits

    • Added CachingIPCClientConduit, which receives events for all codes and caches the most recent data for each (more info)

    • Added register_callback_for_all_events method

    • register_callback_for_code now actually works in all situations

  • MATLAB tools now require MATLAB R2018b or later


  • Upgraded to new versions of many supporting libraries:

    • boost: 1.73.0 ➞ 1.77.0
    • libffi: 3.3 ➞ 3.4.2
    • libusb: 1.0.23 ➞ 1.0.24
    • libxslt: 1.1.29 ➞ 1.1.34
    • msgpack: 3.3.0 ➞ 4.0.3
    • numpy: 1.19.1 ➞ 1.21.4
    • openssl: 1.1.1g ➞ 1.1.1l
    • python: 3.8.5 ➞ 3.9.9
    • sqlite: 3.32.3 ➞ 3.37.0
    • zeromq: 4.3.2 ➞ 4.3.4
  • StimulusDisplay, OpenGLContextManager, and their subclasses have been significantly reworked as part of the transition from OpenGL to Metal

  • Stimulus classes must now declare their required rendering mode by implementing (or inheriting) the method getRenderingMode

  • Removed support for OpenGL on iOS

  • Datum instances can now be marked non-compressible, which prevents MWK2Writer from trying to compress their serialized representation

  • All standard conduits (server, client, and Python) now use ZeroMQ for event transport (instead of shared-memory IPC)

  • The directories /Library/Application Support/MWorks/Developer/include and /Library/Application Support/MWorks/Developer/lib now contain architecture-specific subdirectories for arm64 and x86_64