Ça exporte en smwi mais, peu de chances que ça marche.
[minwii.git] / src / songs / musicxmltosong.py
index 016593a..0db98be 100755 (executable)
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 """
 converstion d'un fichier musicxml en objet song minwii.
 
 """
 converstion d'un fichier musicxml en objet song minwii.
 
@@ -8,6 +9,7 @@ import sys
 from types import StringTypes
 from xml.dom.minidom import parse
 from optparse import OptionParser
 from types import StringTypes
 from xml.dom.minidom import parse
 from optparse import OptionParser
+from Song import Song
 
 # Do4 <=> midi 60
 OCTAVE_REF = 4
 
 # Do4 <=> midi 60
 OCTAVE_REF = 4
@@ -23,20 +25,22 @@ _marker = []
 
 class Note(object) :
     def __init__(self, node, divisions) :
 
 class Note(object) :
     def __init__(self, node, divisions) :
-        self.name = _getNodeValue(node, 'pitch/step')
+        self.step = _getNodeValue(node, 'pitch/step')
         self.octave = int(_getNodeValue(node, 'pitch/octave'))
         self._duration = float(_getNodeValue(node, 'duration'))
         self.octave = int(_getNodeValue(node, 'pitch/octave'))
         self._duration = float(_getNodeValue(node, 'duration'))
+        self.lyric = _getNodeValue(node, 'lyric/text')
+
         self.divisions = divisions
     
     @property
     def midi(self) :
         self.divisions = divisions
     
     @property
     def midi(self) :
-        mid = DIATO_SCALE[self.name]
+        mid = DIATO_SCALE[self.step]
         mid = mid + (self.octave - OCTAVE_REF) * 12
         return mid
     
     @property
     def duration(self) :
         mid = mid + (self.octave - OCTAVE_REF) * 12
         return mid
     
     @property
     def duration(self) :
-        return self._duration / self.divisions
+        return self._duration / self.divisions        
         
 
 
         
 
 
@@ -51,7 +55,7 @@ def _getNodeValue(node, path, default=_marker) :
         else :
             return default
 
         else :
             return default
 
-def musicXml2Song(input, output) :
+def musicXml2Song(input, output, partIndex=0) :
     if isinstance(input, StringTypes) :
         input = open(input, 'r')
     
     if isinstance(input, StringTypes) :
         input = open(input, 'r')
     
@@ -62,23 +66,37 @@ def musicXml2Song(input, output) :
     assert doc.nodeName == u'score-partwise'
     
     parts = doc.getElementsByTagName('part')
     assert doc.nodeName == u'score-partwise'
     
     parts = doc.getElementsByTagName('part')
-    # on suppose que la première partie est le chant
-    leadPart = parts[0]
+    leadPart = parts[partIndex]
     
     # divisions de la noire
     divisions = 0
     
     # divisions de la noire
     divisions = 0
+    midiNotes, durations, lyrics = [], [], []
+
     for measureNode in leadPart.getElementsByTagName('measure') :
         divisions = int(_getNodeValue(measureNode, 'attributes/divisions', divisions))
         for noteNode in measureNode.getElementsByTagName('note') :
             note = Note(noteNode, divisions)
     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
+            midiNotes.append(note.midi)
+            durations.append(note.duration)
+            lyrics.append(note.lyric)
+    
+    song = Song(None,
+                midiNoteNumbers = midiNotes,
+                noteLengths = durations,
+                lyrics = lyrics,
+                notesInExtendedScale=None)
+    song.save(output)
     
     
 def main() :
     usage = "%prog musicXmlFile.xml outputSongFile.smwi [options]"
     op = OptionParser(usage)
     
     
 def main() :
     usage = "%prog musicXmlFile.xml outputSongFile.smwi [options]"
     op = OptionParser(usage)
+    op.add_option("-i", "--part-index", dest="partIndex"
+                 , default = 0
+                 , help = "Index de la partie qui contient le champ.")
     
     options, args = op.parse_args()
     
     options, args = op.parse_args()
+    
     if len(args) != 2 :
         raise SystemExit(op.format_help())
     
     if len(args) != 2 :
         raise SystemExit(op.format_help())