+# -*- coding: utf-8 -*-
"""
converstion d'un fichier musicxml en objet song minwii.
from types import StringTypes
from xml.dom.minidom import parse
from optparse import OptionParser
+from Song import Song
# Do4 <=> midi 60
OCTAVE_REF = 4
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.lyric = _getNodeValue(node, 'lyric/text')
+
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) :
- return self._duration / self.divisions
+ return self._duration / self.divisions
else :
return default
-def musicXml2Song(input, output) :
+def musicXml2Song(input, output, partIndex=0) :
if isinstance(input, StringTypes) :
input = open(input, 'r')
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
+ 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)
- 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)
+ op.add_option("-i", "--part-index", dest="partIndex"
+ , default = 0
+ , help = "Index de la partie qui contient le champ.")
options, args = op.parse_args()
+
if len(args) != 2 :
raise SystemExit(op.format_help())