Chaîne vide si pas de parole pour une note.
[minwii.git] / src / songs / musicxmltosong.py
index 0db98be..3de33ca 100755 (executable)
@@ -27,8 +27,9 @@ class Note(object) :
     def __init__(self, node, divisions) :
         self.step = _getNodeValue(node, 'pitch/step')
         self.octave = int(_getNodeValue(node, 'pitch/octave'))
     def __init__(self, node, divisions) :
         self.step = _getNodeValue(node, 'pitch/step')
         self.octave = int(_getNodeValue(node, 'pitch/octave'))
+        self.alter = int(_getNodeValue(node, 'pitch/alter', 0))
         self._duration = float(_getNodeValue(node, 'duration'))
         self._duration = float(_getNodeValue(node, 'duration'))
-        self.lyric = _getNodeValue(node, 'lyric/text')
+        self.lyric = _getNodeValue(node, 'lyric/text', '')
 
         self.divisions = divisions
     
 
         self.divisions = divisions
     
@@ -36,11 +37,23 @@ class Note(object) :
     def midi(self) :
         mid = DIATO_SCALE[self.step]
         mid = mid + (self.octave - OCTAVE_REF) * 12
     def midi(self) :
         mid = DIATO_SCALE[self.step]
         mid = mid + (self.octave - OCTAVE_REF) * 12
+        mid = mid + self.alter
         return mid
     
     @property
     def duration(self) :
         return mid
     
     @property
     def duration(self) :
-        return self._duration / self.divisions        
+        return self._duration / self.divisions
+    
+    @property
+    def name(self) :
+        name = '%s%d' % (self.step, self.octave)
+        if self.alter < 0 :
+            alterext = 'b'
+        else :
+            alterext = '#'
+        name = '%s%s' % (name, abs(self.alter) * alterext)
+        return name
+        
         
 
 
         
 
 
@@ -55,7 +68,7 @@ def _getNodeValue(node, path, default=_marker) :
         else :
             return default
 
         else :
             return default
 
-def musicXml2Song(input, output, partIndex=0) :
+def musicXml2Song(input, output, partIndex=0, printNotes=False) :
     if isinstance(input, StringTypes) :
         input = open(input, 'r')
     
     if isinstance(input, StringTypes) :
         input = open(input, 'r')
     
@@ -76,6 +89,8 @@ def musicXml2Song(input, output, partIndex=0) :
         divisions = int(_getNodeValue(measureNode, 'attributes/divisions', divisions))
         for noteNode in measureNode.getElementsByTagName('note') :
             note = Note(noteNode, divisions)
         divisions = int(_getNodeValue(measureNode, 'attributes/divisions', divisions))
         for noteNode in measureNode.getElementsByTagName('note') :
             note = Note(noteNode, divisions)
+            if printNotes :
+                print note.name, note.midi, note.duration, note.lyric
             midiNotes.append(note.midi)
             durations.append(note.duration)
             lyrics.append(note.lyric)
             midiNotes.append(note.midi)
             durations.append(note.duration)
             lyrics.append(note.lyric)
@@ -94,13 +109,17 @@ def main() :
     op.add_option("-i", "--part-index", dest="partIndex"
                  , default = 0
                  , help = "Index de la partie qui contient le champ.")
     op.add_option("-i", "--part-index", dest="partIndex"
                  , default = 0
                  , help = "Index de la partie qui contient le champ.")
+    op.add_option("-p", '--print', dest='printNotes'
+                  , action="store_true"
+                  , default = False
+                  , help = "Affiche les notes sur la sortie standard (debug)")
     
     options, args = op.parse_args()
     
     if len(args) != 2 :
         raise SystemExit(op.format_help())
     
     
     options, args = op.parse_args()
     
     if len(args) != 2 :
         raise SystemExit(op.format_help())
     
-    musicXml2Song(*args)
+    musicXml2Song(args[0], args[1], partIndex=options.partIndex, printNotes=options.printNotes)