+
+class Note(object) :
+ def __init__(self, node, divisions) :
+ self.name = _getNodeValue(node, 'pitch/step')
+ self.octave = int(_getNodeValue(node, 'pitch/octave'))
+ self._duration = float(_getNodeValue(node, 'duration'))
+ self.divisions = divisions
+
+ @property
+ def midi(self) :
+ mid = DIATO_SCALE[self.name]
+ mid = mid + (self.octave - OCTAVE_REF) * 12
+ return mid
+
+ @property
+ def duration(self) :
+ return self._duration / self.divisions
+
+
+
+def _getNodeValue(node, path, default=_marker) :
+ try :
+ for name in path.split('/') :
+ node = node.getElementsByTagName(name)[0]
+ return node.firstChild.nodeValue
+ except :
+ if default is _marker :
+ raise
+ else :
+ return default
+
+def musicXml2Song(input, output) :
+ if isinstance(input, StringTypes) :
+ input = open(input, 'r')
+
+ d = parse(input)
+ doc = d.documentElement
+
+ # TODO conversion préalable score-timewise -> score-partwise
+ assert doc.nodeName == u'score-partwise'
+
+ parts = doc.getElementsByTagName('part')
+ # on suppose que la première partie est le chant
+ leadPart = parts[0]
+
+ # divisions de la noire
+ divisions = 0
+ for measureNode in leadPart.getElementsByTagName('measure') :
+ divisions = int(_getNodeValue(measureNode, 'attributes/divisions', divisions))
+ for noteNode in measureNode.getElementsByTagName('note') :
+ note = Note(noteNode, divisions)
+ print note.name, note.octave, note.midi, note.duration
+
+