X-Git-Url: https://scm.cri.mines-paristech.fr/git/minwii.git/blobdiff_plain/3d19c4c7382064272244502a02e1c0985648b0e1..c9bd8f475f8fb2bce0e96a300d50c3c7e3ffd23b:/src/songs/musicxmltosong.py diff --git a/src/songs/musicxmltosong.py b/src/songs/musicxmltosong.py index 068017f..7f5c8bb 100755 --- a/src/songs/musicxmltosong.py +++ b/src/songs/musicxmltosong.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -converstion d'un fichier musicxml en objet song minwii. +conversion d'un fichier musicxml en objet song minwii. $Id$ $URL$ @@ -41,6 +41,7 @@ class Part(object) : def __init__(self, node, autoDetectChorus=True) : self.node = node self.notes = [] + self.repeats = [] self._parseMusic() self.verses = [[]] self.chorus = [] @@ -54,6 +55,8 @@ class Part(object) : for measureNode in self.node.getElementsByTagName('measure') : measureNotes = [] + + # iteration sur les notes # divisions de la noire divisions = int(_getNodeValue(measureNode, 'attributes/divisions', divisions)) for noteNode in measureNode.getElementsByTagName('note') : @@ -66,8 +69,17 @@ class Part(object) : previous.addDuration(note) continue previous = note - self.notes.extend(measureNotes) + + # barres de reprises + try : + barlineNode = measureNode.getElementsByTagName('barline')[0] + except IndexError : + continue + + barline = Barline(barlineNode, measureNotes) + if barline.repeat : + self.repeats.append(barline) def _findChorus(self): """ le refrain correspond aux notes pour lesquelles @@ -96,9 +108,14 @@ class Part(object) : verse.append(self.notes[-1]) - def iterNotes(self) : + def iterNotes(self, indefinitely=True) : "exécution de la chanson avec l'alternance couplets / refrains" - for verse in self.verses : + print 'indefinitely', indefinitely + if indefinitely == False : + iterable = self.verses + else : + iterable = cycle(self.verses) + for verse in iterable : print "---partie---" repeats = len(verse[0].lyrics) if repeats > 1 : @@ -116,7 +133,7 @@ class Part(object) : yield note, 0 def pprint(self) : - for note, verseIndex in self.iterNotes() : + for note, verseIndex in self.iterNotes(indefinitely=False) : print note, note.lyrics[verseIndex] @@ -133,17 +150,32 @@ class Part(object) : class Barline(object) : - def __init__(self, node) : + def __init__(self, node, measureNotes) : self.node = node - self.location = node.getAttribute('location') + location = self.location = node.getAttribute('location') or 'right' try : - repeat = node.getElementsByTagName('repeat')[0] - repeat = {'direction' : repeat.getAttribute('direction'), - 'times' : int(repeat.getAttribute('times') or 1)} + repeatN = node.getElementsByTagName('repeat')[0] + repeat = {'direction' : repeatN.getAttribute('direction'), + 'times' : int(repeatN.getAttribute('times') or 1)} + if location == 'left' : + repeat['note'] = measureNotes[0] + elif location == 'right' : + repeat['note'] = measureNotes[-1] + else : + raise ValueError(location) self.repeat = repeat except IndexError : self.repeat = None - + + def __str__(self) : + if self.repeat : + if self.location == 'left' : + return '|:' + elif self.location == 'right' : + return ':|' + return '|' + + __repr__ = __str__ class Note(object) : @@ -173,7 +205,8 @@ class Note(object) : def __str__(self) : return (u'%5s %2s %2d %4s' % (self.nom, self.name, self.midi, round(self.duration, 2))).encode('utf-8') - __repr__ = __str__ + def __repr__(self) : + return self.name.encode('utf-8') def addDuration(self, note) : self._duration = self.duration + note.duration @@ -229,9 +262,12 @@ class Lyric(object) : self.syllabic = _getNodeValue(node, 'syllabic', 'single') self.text = _getNodeValue(node, 'text') - def __str__(self) : + def syllabus(self, encoding='utf-8'): text = self._syllabicModifiers[self.syllabic] % self.text - return text.encode('utf-8') + return text.encode(encoding) + + def __str__(self) : + return self.syllabus() __repr__ = __str__ @@ -267,32 +303,10 @@ def musicXml2Song(input, partIndex=0, printNotes=False) : part.pprint() return part - - - # 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) -# if printNotes : -# print note.name, note.midi, note.duration, note.lyric -# 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]" + usage = "%prog musicXmlFile.xml [options]" op = OptionParser(usage) op.add_option("-i", "--part-index", dest="partIndex" , default = 0