From: pin Date: Fri, 5 Feb 2010 16:12:52 +0000 (+0000) Subject: Ajout d'une classe "Part" en vue de la gestion des répétitions. X-Git-Url: https://svn.cri.ensmp.fr/git/minwii.git/commitdiff_plain/08410ed32a802e55e5421c6763fd11ea0e26be90?hp=a5a242616d9e5d20e507d810118ff562d7a277f1 Ajout d'une classe "Part" en vue de la gestion des répétitions. git-svn-id: https://svn.cri.ensmp.fr/svn/minwii/trunk@7 fe552daf-6dbe-4428-90eb-1537e0879342 --- diff --git a/src/songs/musicxmltosong.py b/src/songs/musicxmltosong.py index 3de33ca..25822b3 100755 --- a/src/songs/musicxmltosong.py +++ b/src/songs/musicxmltosong.py @@ -22,16 +22,50 @@ DIATO_SCALE = {'C' : 60, 'B' : 71} _marker = [] +class Part(object) : + + def __init__(self, node) : + self.node = node + self.notes = [] + self._parseMusic() + + def _parseMusic(self) : + divisions = 0 + + for measureNode in self.node.getElementsByTagName('measure') : + divisions = int(_getNodeValue(measureNode, 'attributes/divisions', divisions)) + next = previous = None + for i, noteNode in enumerate(measureNode.getElementsByTagName('note')) : + note = Note(noteNode, divisions, previous) + self.notes.append(note) + try : + self.notes[i-1].next = note + except IndexError: + pass + previous = note + + def pprint(self) : + for note in self.notes : + print note.name, note.midi, note.duration, note.lyrics + + + + class Note(object) : - def __init__(self, node, divisions) : + def __init__(self, node, divisions, previous) : + self.node = node 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.lyric = _getNodeValue(node, 'lyric/text', '') + self.lyrics = [] + for ly in node.getElementsByTagName('lyric') : + self.lyrics.append(Lyric(ly)) self.divisions = divisions + self.previous = previous + self.next = None @property def midi(self) : @@ -53,6 +87,17 @@ class Note(object) : alterext = '#' name = '%s%s' % (name, abs(self.alter) * alterext) return name + + +class Lyric(object) : + def __init__(self, node) : + self.node = node + self.syllabic = _getNodeValue(node, 'syllabic', 'single') + self.text = _getNodeValue(node, 'text') + + def __str__(self) : + return self.text.encode('utf-8') + __repr__ = __str__ @@ -81,26 +126,31 @@ def musicXml2Song(input, output, partIndex=0, printNotes=False) : parts = doc.getElementsByTagName('part') leadPart = parts[partIndex] + part = Part(leadPart) + + if printNotes : + part.pprint() + # 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) +# 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() :