Fetching contributors…
Cannot retrieve contributors at this time
434 lines (306 sloc) 14.3 KB


For details and minor changes, please see the version control log messages.

(not released yet) version 1.2.0

Enhancements / Changes:
  • Updated RtMidi sources to upstream commit cadfcf6.
  • Added get_rtmidi_version module-level function.
  • Added set_client_name and set_port_name methods to MidiIn's and MidiOut's base class.
  • Added a bunch of new custom exceptions, all derived from RtMidiError.
  • A default error handler callback is now set for MidiIn and MidiOut instances, which maps C++ level errors into custom Python exceptions.
  • Restructured tests in test_rtmidi and added tests for new methods.

2018-10-10 version 1.1.2

Project infrastructure:
  • Added bagdes and link to documentation to README visible on GitHub page.
  • Tweaked project description wording.
  • Updated copyright year in various documentation files.
  • Binary wheels for Windows and OS X for Python 2.7, 3.5 (only Windows), 3.6, and 3.7 are automatically built on AppVeyor resp. Travis CI and uploaded to PyPI when a new release tag is pushed to GitHub.

    Thanks to Benoit Pierre for the PR (#36).

  • Upload Gzip'ed instead Bzip'ed tarballs for source distributions to PyPI.

  • python test now runs tox, so tests_require in is empty now. We want dependencies to be only handled by pip, never by setuptools.

  • Minor additions, updates, fixes and wording tweaks.

2018-08-06 version 1.1.1

  • Rebuild src/_rtmidi.cpp with current Cython for Python 3.7 compatibility.
  • Remove testing with Python 3.3 environment from tox.ini and add Python 3.6 and 3.7.
  • Update dev requirements for Python 3.7 compatibility.
  • Upload releases with twine.
  • Python 3.3 is not officially tested or supported anymore.

2017-04-21 version 1.1.0

Project infrastructure:
  • Updated project homepage URL; copyright year and link to docs in readme.
  • Added script to automate updating github pages docs.
Enhancements / Changes:
  • Synced with upstream RtMidi (2.1.1-907a94c).
  • Applied patch from This means that when using the ALSA API port names are reported in the form <client name>:<port name> <port id> (this change was actually already in version 1.0.0).
  • Added new MidiIn / MidiOut method is_port_open.
  • MidiIn / MidiOut constructors and open_port / open_virtual_port methods now raise TypeError when an invalid type is passed as the client resp. port name.
  • Various small documentation improvements.
  • Basic examples: some clean-up, more comments, updated API usage.
  • Added new advanced example script
  • Added new advanced example script
  • added command line param to set controller number.
  • midi2command: Fixed wrong mock lru_cache substitution for Python < 3.2.

2016-11-07 version 1.0.0

Project infrastructure:
  • Added automatic documentation publishing on
  • Added auto docs for MidiIn/MidiOut classes to sphinx docs.
  • Removed pre-release related information from installation docs.
  • Added generated INSTALL.rst to repo to make ReadTheDocs integration work.
  • Added new example script

2016-10-09 version 1.0.0rc1

Project infrastructure:
  • Moved repository to Github.
  • midiutil.open_midiport:
    • Correctly report and log I/O direction and instance type.
    • Fix naming of virtual port.
Enhancements / Changes:
  • Synced with upstream RtMidi (2.1.1-399a8ee).
  • midiutil:
    • The function midiutil.open_port has been renamed to open_midiport.
    • Added convenience functions open_midiinput and open_midioutput, which wrap open_midiport.
    • RtMidi API to use can be specified via the RTMIDI_API environment variable. Only used when API_UNSPECIFIED is passed for the api argument. Value should be one of the API_* constant names with out the API_ prefix, e.g. UNIX_JACK for the Jack API.
  • Cython wrapper class hierarchy restructured to better match the underlying C++ classes and remove code duplication.
  • Some source code re-ordering was done.
  • Added basic structure and initial content of Sphinx documentation.
  • Documented exceptions raised by MidiIn/Out.open_[virtual_]port().
  • Some docstring corrections and formatting fixes.
  • Simplified by throwing out old compatibility stuff.
  • Explicitly call PyEval_InitThreads from Cython code instead of using undocumented compiler macro.
  • Moved osc2midi example into its own repository at
  • Add new sequencer example.
  • Add new noteon2osc example.
  • midifilter:
    • Moved to, removed old code and fixed command line args access.
    • Streamlined event matching.
    • Added CCToBankChange filter.
    • Queue module renamed to queue in Python 3.
    • Fixed opening of output port erroneously used "input".
    • Fixed positional command line args handling.
    • Set command name for argparse.
  • midi2command:
    • Added README.
    • Added command line option to select backend API.
    • Catch errors when opening port.
    • Set client and port name.
    • Cache command lookup (Python 3.2+ only).
  • sysexsaver:
    • Moved to, some refactoring.
    • Fixed wrong entry for manufacturer (0, 32, 81).
    • Moved module level code into main function.
    • Include model name in output file, if possible.
  • drumseq:
    • Fixed global access in Sequencer class.
    • Use args.FileType for pattern command line args.

2014-06-11 version 0.5b1

  • Synced RtMidi code with git repo @ 2c7a6664d6, which fixed several issues (see
  • MidiIn/Out.open_virtual_port returns self for context manager support, consistent with MidiIn/Out.open_port.
  • Fix Python <= 2.6 incompatible encode method call (python-rtmidi officially only supports Python >= 2.7). Thanks to Michiel Overtoom for reporting this.
  • Respect passed MIDI api when requesting MidiOut instance from midiutil.open_midiport.
Enhancements / Changes:
  • Support for Windows Kernel Streaming API was removed in RtMidi (it was broken anyway) and consequently in python-rtmidi as well.
  • Raise RtMidiError exception when trying to open a (virtual) port on a MidiIn/Out instance that already has an open (virtual) port.
  • Add some common synonyms for MIDI events and controllers and some source comments about controller usage to midiconstants module.
  • Fix and clarify queue_size_limit default value in docstrings
  • Various docstring consistency improvements and minor fixes.
  • New example script, which executes external commands on reception of configurable MIDI events, with example configuration.
  • New example directory drumseq with a simple drum pattern sequencer and example drum patterns. Thanks to Michiel Overtoom for the original script!

2013-11-10 version 0.4.3b1

  • Add numeric suffix to version number to comply with PEP 440.
  • Add missing to source distribution.
  • Set default setuptools version in to 1.3.2, which contains fix for bug #99 mentioned below.
  • Add note to installation guide about required --pre option with pip.

2013-11-07 version 0.4.2b

  • Add missing API_* constant to list of exported names of _rtmidi module.
Enhancements / Changes:
  • Change default value of encoding argument of get_ports and get_port_name methods to "auto", which selects appropriate encoding based on system and backend API used.
  • Add api parameter to midiutil.open_midiport function to select backend API.
  • Make client name for MidiOut and `` MidiIn`` different again, because some backend APIs might require unique client names.
  • Include workaround for setuptools bug (see bitbucket issue #99) in setup file.
  • Add custom distutils command to fill placeholders in template with release meta data.
  • Setuptools is now required, pure distutils won't work anymore, so removing the fallback import of setup from distutils.

2013-11-05 version 0.4.1b

  • Include missing _rtmidi.cpp file in source distribution.
  • Fill in release data placeholders in INSTALL.rst.

2013-11-05 version 0.4b

  • Fix string conversion in constructors and open_* methods.
  • Change default value queue_size_limit argument to MidiIn constructor to 1024.
  • Update version number in RtMidi.cpp/h to reflect actual code state.
Enhancements / Changes:
  • Elevated development status to beta.
  • Allow MidiIn/Out.open_port methods to be used with the with statement and the port will be closed at the end of the block.
  • MidiIn/MidiOut and open*() methods: allow to specify None as client or port name to get the default names.
  • Move midiconstants module from examples into rtmidi package and added midiutil module.
  • midiutils.open_midiport:
    • Allow to pass (substring of) port name as alternative to port number.
    • Re-raise EOFError and KeyboardInterrupt instead of using sys.exit().
    • Add client_name and port_name arguments.
    • Add use_virtual argument (default False) to request opening of a virtual MIDI port.
    • Add interactive keyword argument (default True) to disable interactive prompt for port.
  • Raise NotImplemented error when trying to open a virtual port with Windows MultiMedia API.
  • Change default name of virtual ports.
  • Re-organize package description and installation instructions into several files and add separate text files with changelog and license information.
  • Add detailed instructions for compiling from source on Windows
  • Add docstrings to all methods and functions in _rtmidi module.
  • Add docstring for midiutils.open_midiport function.
  • Add new example package osc2midi, a simple, uni-directional OSC to MIDI mapper.
  • New example script to demonstrate sending of MIDI system exclusive messages.
  • New example script to demonstrate sending of MIDI control change messages.
  • New sysexsaver example.
  • Convert midifilter example script into a package.
  • Upgrade from optparse to argparse in example scripts.
  • Enable logging in test scripts.
  • Switch from distribute back to setuptools.
  • Include in source distribution.
  • Include examples in source distribution.
  • Install osc2midi example as package and command line script.
  • Enable C++ exceptions on Windows build.

2013-01-23 version 0.3.1a

  • Increase sysex input buffer size for WinMM API again to 8192 (8k) bytes. Requested by Martin Tarenskeen.

2013-01-14 version 0.3a

Bug fixes:
  • Add encoding parameter to get_port_name methods of MidiIn and MidiOut to be able to handle non-UTF-8 port names, e.g. on Windows (reported by Pierre Castellotti).
  • Add encoding parameter to get_ports method as well and pass it through to get_port_name. Use it in the test scripts.
  • Increase sysex input buffer size for WinMM API to 4096 bytes.
  • Add new example script.
  • Add setuptools/distribute support.

2012-07-22 version 0.2a

Bug fixes:
  • Fix uninitialized pointer bug in RtMidi.cpp in 'MidiOutJack' class, which caused a warning in the jack process callback when creating a MidiOut instance with the JACK API.
  • testmidiin_*.py: fix superfluous decoding of port name (caused error with Python 3).
  • Simplify some code, some things gleaned from rtmidi_python.
  • Documentation typo fixes and more information on Windows compilation.
  • Enhancements in test scripts:
    • Catch exceptions when creating port.
    • test_midiin_*.py:
      • Better error message for missing/invalid port number.
      • Show how to convert event delta time into absolute time when receiving input.
  • Building on OS X 10.6.9 with CoreMIDI and JACK for OS X successfully tested and test run without errors.
  • WinMM support now compiles with Visual Studio 2008 Express and tests work under Windows XP SP3 32-bit.
  • Add command line option to exclude WinMM or WinKS API from compilation.
  • Add missing extra_compile_args to Extension kwargs in setup file.
  • Add library_dirs to Extension kwargs in setup file.
  • Use -frtti compiler option on OS X (neccessary on 10.7?).
  • Fix file name conflict on case-insensitive file systems by prefixing rtmidi.{pyx,cpp} with an underscore
  • Provide correct compiler flags for compiling with Windows MultiMedia API.
  • Adapt windows library and include path for Visual Studio 2008 Express.
  • add support for compiling with Windows Kernel Streaming API (does not not compile due to syntax errors in RtMidi.cpp yet).

2012-07-13 version 0.1a

First public release.