[linux-audio-user] alsa midi processor again

Peter Brinkmann brinkman at math.TU-Berlin.DE
Mon Jul 18 17:57:44 EDT 2005


Atte,
> I'm not gonna promise anything, but if someone could shoot mi in the 
> right direction regarding alsa, API, example code, documentation, I'm 
> willing to give it a shot...
I've cobbled together a very simple bit of code that splits MIDI events
according to note values. I wouldn't use it in this form in any serious
way, but it should be enough to give you an idea as to how to build MIDI
routers with Python.

In order to use it, say something like
    python midisplit.py 36 60 84
Now midisplit.py will create one MIDI input port and four output ports.
Connect the output ports to soft synths or so, and the input port to a
keyboard. If you hit a key on the keyboard, then midisplit.py will send
it via its first port if the note is between 0 and 35, to the second port
if the note is between 36 and 59, etc. Generally speaking, if you list
n numbers on the command line, you get n+1 output ports, unless you give
no arguments, in which case midisplit will revert to its default behavior
of splitting at note 60.

This code uses MidiKinesis libraries, available at
     http://www.math.tu-berlin.de/~brinkman/software/midikinesis/
Hope this helps,
    Peter

-------------- next part --------------
from pyseq import *

class MidiSplit(PySeq):
    def init(self, sp=None):
        if sp:
            self.splitPoints=sp[:]
        else:
            self.splitPoints=[60]
        self.outports=[]
        for i in range(len(self.splitPoints)+1):
            self.outports.append(self.createOutPort())
        self.inport=self.createInPort()
    def callback(self, ev):
        if ev.type==SND_SEQ_EVENT_NOTEON or ev.type==SND_SEQ_EVENT_NOTEOFF:
            note=ev.getData().note
            index=len([x for x in self.splitPoints if note>=x])
            ev.sendNow(self, self.outports[index])
        return 1

if __name__=='__main__':
    import sys
    seq=MidiSplit('MidiSplit', [int(s) for s in sys.argv[1:]])   
    MidiThread(seq).start()
    raw_input('press return to finish')


More information about the Linux-audio-user mailing list