+def get_voice (channel, events):
+ debug ('channel: ' + str (channel) + '\n')
+ music = parse_events (events)
+ return unthread_notes (music)
+
+class Channel:
+ def __init__ (self, number):
+ self.number = number
+ self.events = []
+ def add (self, event):
+ self.events.append (event)
+ return self
+ def get_voice (self):
+ return get_voice (self.number, self.events)
+
+class Track:
+ def __init__ (self):
+ self.name = None
+ self.events = []
+ self.channels = {}
+ def _add (self, event):
+ if isinstance (event, Text) and event.type == midi.SEQUENCE_TRACK_NAME:
+ self.name = event.text
+ self.events.append (event)
+ def add (self, event, channel=None):
+ if channel == None:
+ self._add (event)
+ else:
+# self.channels[channel] = self.channels.get (channel, Channel (channel)).add (event)
+ self.channels[channel] = self.channels.get (channel, Channel (channel))
+ self.channels[channel].add (event)
+ def get_voice (self):
+ return get_voice (None, self.events)
+ def get_voices (self):
+ return ([self.get_voice ()]
+ + [self.channels[k].get_voice ()
+ for k in sorted (self.channels.keys ())])
+
+def parse_track (events):
+ track = Track ()
+ for e in events: