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.
