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.