2012-04-19

  * Added the ability to automatically connect to other JACK or ALSA
    clients, using regex-based port name matching.
  * Most functions and units now check the types and values of their
    arguments, allowing for much more comprehensible error messages.
  * New dependency: The Python decorator module is now required to run
    mididings.
  * Much cleaner and more efficient conversion between Python and C++
    sequence and mapping types, implemented entirely in C++.
  * SysEx data is now passed to Python functions as a mutable bytearray
    object (or as list in Python 2.5).
  * Many SysEx-related bugfixes: SysEx() and SysExEvent() now work
    correctly when data_offset is 1, SysExFilter(manufacturer) works
    again, and Print() no longer raises an exception when it encounters
    a SysEx event.
  * AutoRestart() is now a little smarter when deciding which files to
    watch for changes.
  * Fixed the process_file() function (which apparently no one used in
    years...)
  * Replaced a gcc-ism: mididings can now be built with clang++ (version
    3.0 or later).

2012-03-12

  * Added methods apply(), invert() and negate() to filter objects, and
    made AndSelector and OrSelector public classes. Anything that can be
    done with funny overloaded operators is now also possible with regular
    functions and objects.
  * Added option -n to livedings, based on a patch by Aurélien.
  * Added SysExEvent() function in mididings.event module.
  * Added Restart() and Quit() in mididings.extra module.
  * Fixed PitchbendEvent(), thanks to Димон.
  * Fixed selector operators & and | for more than two filters.
  * Print correct note names when using Python 3.
  * Fixed operator != for comparing MidiEvent objects.
  * Fixed compilation on OS X, automatically disable ALSA backend on
    non-Linux platforms. Thanks to Sílvio Almeida for lots of valuable
    feedback.
  * Extended and reorganized unit tests.
  * Some documentation cleanup.

2010-11-19

  * Improved VoiceFilter() to make it much more usable for filtering
    voices other than the highest and lowest one, and added VoiceSplit()
    as a shortcut to route multiple voices through different patches.
  * Added engine.time() as a clock source that, unlike Python's
    time.time(), is guaranteed to be monotonic.
  * OSCInterface() and livedings no longer require port numbers to be
    specified, and simply default to 56418 and 56419.
  * Changed variable/parameter names referring to CC numbers from "param"
    to "ctrl", and removed the "get_" prefix from some function names in
    the engine module. In most places the old names still work to remain
    backward compatible.
  * Fixed build issues with certain Python and/or Boost versions.
  * Lots of cleanup and some minor fixes.

2010-06-02

  * Fixed the utterly broken CtrlRange() unit.
  * Added new PitchbendRange() unit.
  * Fixed PedalToNoteoff() when using sostenuto (releasing the pedal caused
    note-offs to be sent for keys which were still pressed).
  * Fixed a small error in the livedings/OSCInterface documentation (thanks
    to Christopher Arndt).

2010-05-16

  * Added CtrlCurve() unit and a shortcut version of Velocity() to specify
    multiply and offset at the same time.
  * Added generators for pitch bend and aftertouch events.
  * Fixed MidiEvent constructor to take data_offset setting into account.

2010-05-08

  * Include 64 bit library directories in the search for the correct boost
    library names (bug reported by Niels Mayer).
  * Added new examples skeleton.py and router.py.
  * Documented the mididings.event and mididings.engine submodules.

2010-04-13

  * Added support for Python 3.x (requires a recent Boost.Python built for
    Python 3, and most likely some manual fiddling with the setup.py
    script).
  * Fixed some compatibility issues with Python 2.5 (thanks to Moritz
    Firsching for the bug report).
  * Added support for SysEx messages larger than ALSA's buffer size.
  * Fixed a race condition that could lead to a crash when terminating
    mididings while an event is being processed.
  * Fixed the JACK backend so multiple input ports can be used.

2010-03-18

  * Added VoiceFilter() to filter individual voices from a chord.
  * The Output() unit can now send arbitrary control changes, and a new
    class OutputTemplate was added to simplify creating partially
    parametrized outputs.
  * Added lots of new examples to the documentation.
  * Several minor fixes and cleanup.

2010-03-07

  * Added livedings as a graphical frontend to mididings that allows
    monitoring and triggering scene changes.
  * Added SceneGroup() to make multiple subscenes accessible under a single
    program number.
  * Support floating split points using the new FloatingKeySplit() unit.
  * Added Panic() to send all-notes-off messages on all channels.
  * Several new OSC messages supported by mididings.extra.OSCInterface().
  * New module mididings.extra.gm containing constants for program and
    controller numbers defined in the General MIDI standard.
  * Enable realtime scheduling for MIDI processing with the 'jack' backend.

2010-02-02

  * Major documentation update, now including a tutorial and explaining
    some of the relevant Python basics.
  * Renamed a few units and parameters to keep names somewhat consistent.
  * Removed the types parameters from Fork() and Print(), the same result
    can be achieved using a selector.
  * The upper or lower limit for note ranges can now be omitted.
  * All splits now support an "else" rule. A patch with a key of None is
    used when none of the other filters match.
  * Added operator | (OR) for selectors.
  * Added LatchNotes() to hold notes until the key is pressed again.
  * Significant performance improvement when calling overloaded functions.

2010-01-12

  * Included a command line program "mididings" that allows running
    simple patches without writing full-fledged Python scripts.
    For example:
    $ mididings "Transpose(12) >> Velocity(fixed=64)"
  * A first attempt to support system exclusive, system realtime and
    system common messages. New units include SysEx(), SysExFilter() and
    SysExSplit(). Thanks to Christopher Arndt for some very helpful
    suggestions.
  * Added support for polyphonic aftertouch, untested for obvious
    reasons :(
  * Implemented a hook system to easily extend some of mididings'
    functionality.
  * Added hook objects MemorizeScene() (scene persistence between
    restarts), OSCInterface() (scene switching via OSC), and AutoRestart()
    (automatic restart when the script changes. Best. Feature. Ever.)
  * Unified run() and run_scenes(), as well as Print() and PrintString().
    The different functionality now depends only on keyword arguments.
  * Renamed Call() to Process(). Call() now offers the functionality of
    both CallAsync() and CallThread().
  * Renamed GenerateEvent() to Generator() and InitAction() to Init().
  * Changed semantics of CtrlFilter(), CtrlValueFilter(), ProgFilter() to
    block events of other types (again...).
  * Added parameter "curve" to Velocity(), applying an exponential curve.
  * New unit VelocityLimit().
  * New operator & to use multiple filters as a selector with operator %.

2009-11-10

  * New and clearer nomenclature to avoid different meanings of "patch":
    A "patch" is now always just a group of units, whereas you switch
    between "scenes" (which can in turn consist of a patch and optionally
    an init-patch). Function names changed accordingly, but for now the
    previous names still exist for backward compatibility.
  * Favor keyword arguments over different units with similar
    functionality, e.g. VelocityFixed(x) -> Velocity(fixed=x), etc.
  * Replaced VelocityGradient() with the new VelocitySlope(), which
    supports defining the velocity for an arbitrary number of notes.
  * PedalToNoteoff() can now act as either a sustain or a sostenuto pedal.

2009-10-03

  * Made all key or value ranges half-open (excluding the upper limit) for
    consistency with Python. This affects KeyFilter(), VelocityFilter(),
    CtrlValueFilter() and the related *Split units.
  * New compiler options to significantly reduce the size of the resulting
    _mididings.so binary.
  * Several bugfixes.

2009-01-14

  * Output() now supports sending volume changes (CC 7).

2009-01-13

  * New units in mididings.extra: MakeMonophonic() and LimitPolyphony().
  * Added event-type agnostic inversion operator - for filters.
  * VelocityFilter() can now be used with only an upper or lower limit when
    the other parameter is zero.

2008-11-23

  * Added support for reading and writing standard MIDI files, based on
    libsmf (disabled by default).
  * Allow patch numbers greater than 128.
  * Output() now supports sending bank select messages.

2008-11-22

  * Terminate threads properly on exit.
  * Aftertouch now actually works.
  * Added 3 argument version of CtrlValueSplit().

2008-11-09

  * Lots of changes and cleanup of the JACK backend, should now work
    properly with JACK 2.
  * Added support for channel aftertouch.
  * Implemented new operator % for filters.
  * Added parameters to run_patches() to specify the first patch to be
    selected, and a callback function to be called on every patch switch.
  * New function: mididings.extra.run_patches_memorize().
  * New units: NoteOn(), NoteOff(), CtrlSplit(), CtrlValueSplit(),
    ProgSplit().

2008-09-13

  * Added System() to run shell commands, as well as SendOSC() and
    SendDBUS() to send OSC or DBUS messages.
  * Do a lot more validity checking of function arguments.

2008-09-09

  * Fixed a bug that under certain circumstances caused events to not be
    processed properly.

2008-09-05

  * Implemented experimental support for JACK MIDI.
  * Added mididings.extra module for units with more advanced/specific
    functionality than what's included in the main mididings module. This
    includes, among other things, a diatonic harmonizer.
  * Updated documentation, completely rewritten example scripts.

2008-08-28

  * Allow Call() to return more than one MIDI event at the same time.

2008-08-17

  * Complete rewrite of some crucial parts of the code. Lots of cleanup and
    restructuring. This should not affect existing scripts, except for the
    changes noted below.
  * Filters no longer remove events of different types. For example, what
    used to be CtrlFilter(num) should now be written as
    Filter(CTRL) >> CtrlFilter(num).
  * When units connected in parallel result in identical copies of the same
    event, duplicates will be removed.
    For example, [ Pass(), Transpose(12) ] no longer outputs two events
    when receiving program or control changes.
  * Require Boost ≥ 1.34.1.
  * Many minor fixes.

2008-07-21

  * Added CallAsync() and CallThread(), to start Python functions without
    delaying event processing.
  * Made Print() prettier, more informative, and faster.
  * Added CtrlMap() and PrintString().
  * ALSA event queue is now cleared before starting MIDI processing, to
    ignore events received during start_delay.

2008-07-13

  * Added start_delay parameter to config().
  * Added switch_patch() function.
  * Init events for the first patch loaded at startup are now sent
    properly.
  * Don't allow note on events with velocity < 1. This has the (side-)
    effect that Velocity() and VelocityGradient() will never completely
    remove any events. Use an additional VelocityFilter() if that's what
    you want.

2008-04-16

  * Moved port parameters from run() to config(), allow ports to be
    specified by name rather than number.
  * Changed parameter order of CtrlRange(), making input range [0;127] the
    default.

2008-04-06

  * Added new Sanitize() unit to make sure MIDI events are valid. The same
    is done automatically before sending events to the output ports.
  * Added some more documentation.
