def VoiceFilter(voice='highest', time=0.1, retrigger=False): """ Filter individual voices from a chord. :param voice: The voice to be filtered. This can be ``'highest'``, ``'lowest'``, or an integer index (positive or negative, the same way Python lists are indexed, with 0 being the lowest voice and -1 the highest). :param time: The period in seconds for which a newly played note may still be unassigned from the selected voice, when additional notes are played. :param retrigger: If true, a new note-on event will be sent when a note is reassigned to the selected voice as a result of another note being released. """ if voice == 'highest': voice = -1 elif voice == 'lowest': voice = 0 return _m.Filter(_m.NOTE) % _m.Process( _PerChannel(lambda: _VoiceFilter(voice, time, retrigger)))
def SuppressPC(): """ Filter out program changes if the same program has already been selected on the same port/channel. """ return (_m.Filter(_m.PROGRAM) % _m.Process(_PerChannel(_SuppressPC)))
def VoiceFilter(voice='highest', time=0.1, retrigger=False): """ Filter individual voices from a chord. :param voice: The voice to be filtered. This can be ``'highest'``, ``'lowest'``, or an integer index (positive or negative, the same way Python lists are indexed, with 0 being the lowest voice and -1 the highest). :param time: The period in seconds for which a newly played note may still be unassigned from the selected voice, when additional notes are played. :param retrigger: If true, a new note-on event will be sent when a note is reassigned to the selected voice as a result of another note being released. """ if voice == 'highest': voice = -1 elif voice == 'lowest': voice = 0 return _m.Filter(_m.NOTE) % _m.Process(_PerChannel( lambda: _VoiceFilter(voice, time, retrigger)) )
def MakeMonophonic(): """ Make the MIDI signal monophonic, i.e. only one note can be played at any given time. When one note is released while another is still held (but silent), the previous one will be retriggered. """ return (_m.Filter(_m.NOTE) % _m.Process(_PerChannel(_MakeMonophonic)))
def PedalToNoteoff(ctrl=64, sostenuto=False): """ Convert sustain pedal control changes to note-off events, by delaying note-offs until the pedal is released. :param ctrl: The pedal's controller number. :param sostenuto: If true act like a sostenuto pedal, instead of a regular sustain pedal. """ if sostenuto: proc = _m.Process(_PerChannel(lambda: _SostenutoToNoteoff(ctrl))) else: proc = _m.Process(_PerChannel(lambda: _SustainToNoteoff(ctrl))) return (_m.Filter(_m.NOTE) | _m.CtrlFilter(_m.CTRL)) % proc
def PedalToNoteoff(ctrl=64, sostenuto=False): """ Convert sustain pedal control changes to note-off events, by delaying note-offs until the pedal is released. :param ctrl: The pedal's controller number. :param sostenuto: If true act like a sostenuto pedal, instead of a regular sustain pedal. """ if sostenuto: proc = _m.Process(_PerChannel(lambda: _SostenutoToNoteoff(ctrl))) else: proc = _m.Process(_PerChannel(lambda: _SustainToNoteoff(ctrl))) return (_m.Filter(_m.NOTE) | _m.CtrlFilter(ctrl)) % proc
def LatchNotes(polyphonic=False, reset=None): """ Makes notes latching, so they will keep playing when the key is released. :param polyphonic: If true, each note can be stopped individually by pressing the corresponding key again. Otherwise pressing a key will automatically turn off any previous notes. :param reset: a note (name/number) that acts as a reset key, stopping all currently playing notes. """ return (_m.Filter(_m.NOTE) % _m.Process(_PerChannel(lambda: _LatchNotes(polyphonic, reset))))
def LatchNotes(polyphonic=False, reset=None): """ Makes notes latching, so they will keep playing when the key is released. :param polyphonic: If true, each note can be stopped individually by pressing the corresponding key again. Otherwise pressing a key will automatically turn off any previous notes. :param reset: a note (name/number) that acts as a reset key, stopping all currently playing notes. """ return (_m.Filter(_m.NOTE) % _m.Process(_PerChannel( lambda: _LatchNotes(polyphonic, reset))))
def LimitPolyphony(max_polyphony, remove_oldest=True): """ Limit the "MIDI polyphony". :param max_polyphony: The maximum number of simultaneous notes. :param remove_oldest: If true, the oldest notes will be stopped when the maximum polyphony is exceeded. If false, no new notes are accepted while *max_polyphony* notes are already held. Note that the actual polyphony of a connected synthesizer can still be higher than the limit set here, e.g. due to a long release phase. """ return (_m.Filter(_m.NOTE) % _m.Process( _PerChannel(lambda: _LimitPolyphony(max_polyphony, remove_oldest))))
def LimitPolyphony(max_polyphony, remove_oldest=True): """ Limit the "MIDI polyphony". :param max_polyphony: The maximum number of simultaneous notes. :param remove_oldest: If true, the oldest notes will be stopped when the maximum polyphony is exceeded. If false, no new notes are accepted while *max_polyphony* notes are already held. Note that the actual polyphony of a connected synthesizer can still be higher than the limit set here, e.g. due to a long release phase. """ return (_m.Filter(_m.NOTE) % _m.Process(_PerChannel( lambda: _LimitPolyphony(max_polyphony, remove_oldest))))