MWorks 0.9 released

May 13, 2019 Posted by Christopher Stawarz


MWorks 0.9 is now available for macOS and iOS. Highlights of this release include:

  • Layer and mask stimuli
  • Embedded Python execution on iOS
  • EyeLink tracker-driven calibration and blink, saccade, and fixation events
  • New event file format (MWK2)
  • XML-to-MWEL converter
  • Support for macOS Dark Mode

MWorks 0.9 requires a Mac running macOS Sierra (10.12) or later or an iPad running iOS 12.2 or later.

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


  • Added xml2mwel script for converting XML experiment files into MWEL

  • Variable declarations are now a special case of component declaration and therefore can include parameters and/or children

  • Statement macro invocations can now include a default value with = (as long as the macro body is a single variable declaration that does not include a default value)

  • Added support for nestable, multiline comments delimited by /* and */

  • Parser now expands all enclosing macro parameters in children attached to macro invocations

  • Improved error reporting for unterminated string literals

  • mwel2xml now accepts --omit-metadata as a command-line option, which inhibits the inclusion of location info and experiment source in the generated XML


Visual Stimuli

  • Added layer and mask stimuli

  • Movie and frame list stimuli can now have their frames attached as children (instead of being contained in a stimulus group)

  • Image file stimulus now prevents image color values from being altered when color management is disabled

  • Drifting grating

    • Added support for using a grating as a mask

    • Added smoothing to discontinuous edges in square and sawtooth gratings

    • inverted parameter now applies to all grating types

  • Moving dots

  • Stimulus display is now backed by Metal (always on iOS, and on Macs running macOS 10.13 or later that support Metal)

  • Added support for setting the stimulus display’s gamma function (only on macOS, and only if color management is disabled)

  • Added support for making the main stimulus display window non-opaque (mirror window is still always opaque)

  • Stimulus display is now created only if the experiment uses it

  • Update Stimulus Display action now issues a warning if it takes more than two display refresh cycles to complete

  • Dropped support for render_at_full_resolution key of #mainScreenInfo. Stimuli are now always rendered at the full, native resolution of the display.

I/O Devices

  • Added word output and digital input pullup channels for Firmata devices

  • EyeLink

    • Added support for tracker-driven calibration

    • Enabled reporting of EyeLink blink, saccade, and fixation events

    • tracking_dist is now required only when eye_x, eye_y, and/or eye_z are specified

    • Error messages now include EyeLink error message (if available)


    • Improvements to analog output voltage channels

      • All waveform parameters can now be modified at run time. Changes take effect after the device is stopped and restarted.
      • Parameter offset is now optional and defaults to zero
      • Added optional parameters amplitude and mean
    • Added analog_output_enabled parameter

    • When stopping device, all digital output lines are now set to low, and all (non-waveform) analog output voltage channels are set to zero

    • Added workaround for bug in NI-DAQmx Base that manifests in 64-bit processes on macOS 10.12 and later

    • Now requires 64-bit variant of NI-DAQmx Base (i.e. version 14.0 or later)


  • New on-disk format for event files (MWK2)

  • Expression parser now supports multiplication of strings and lists by integers. Multiplying a list or string by integer n results in the concatenation of n copies of the list or string, e.g.

      [1, 2, 3] * 2 == [1, 2, 3, 1, 2, 3]
      3 * 'abc' == 'abcabcabc'


  • New app icons

  • Version info for all apps now includes the build date

  • MWClient and MWServer now support Dark Mode

  • macOS installer now backs up existing MWorks installation silently (without popping up a dialog box)

  • MWServer and MWClient now preserve the location of their preferences windows between sessions

  • iOS MWorks app now supports hiding the “Choose experiment” button


  • New user interface icons

  • Eliminated some spurious connection failures

  • Calibrator and reward window’s action buttons now end editing in all fields (thereby committing any pending changes) before performing their task

  • Eye window now presents its options in a panel (instead of a drawer)


  • Added code to prevent App Nap from delaying response to client connection requests

  • Now preserves the selected preferences window tab between sessions

Python and MATLAB Tools

  • Python and MATLAB data tools now transparently support both MWK and MWK2 files

  • Python plugin is now available on iOS. Includes all features available on macOS (run file and run string actions, Python file resources, and the expression parser functions py_eval and py_call).

  • Functions message, warning, and error are now available to code executed by the Python plugin

  • Python plugin now embeds Python 3.7 (instead of 2.7). In addition, the plugin now includes its own copies of Python and NumPy (no external Python installation required).

  • Removed MWKStream class from Python data tools

  • Python tools now support Python 2.7 and 3.7. (Python 3.6 is no longer supported.)

  • MATLAB tools now require MATLAB R2016b or later

Documentation and Examples


  • Upgraded to new versions of several supporting libraries:

    • boost: 1.66.0 ➞ 1.69.0
    • zeromq: 4.2.3 ➞ 4.3.1
    • msgpack: 2.1.5 ➞ 3.1.1
  • Added OpenSSL 1.1.1b, Python 3.7.3, NumPy 1.16.2, and SQLite 3.27.2 to supporting libs

  • All code is now compiled using the C++14 and C11 language standards

  • Added support for stimuli with child components

  • BasicTransformStimulus now enables blending when drawing; subclasses can override the blend equation

  • Added new MacOSOpenGLContextManager (used only on systems running macOS 10.13 or later that support Metal). Old MacOSOpenGLContextManager is now called LegacyMacOSOpenGLContextManager.

  • IOSOpenGLContextManager, MacOSOpenGLContextManager, and LegacyMacOSOpenGLContextManager are now private to MWorksCore. Plugins that need access to platform-specific resources should use AppleOpenGLContextManager.