X-Git-Url: https://scm.cri.ensmp.fr/git/minwii.git/blobdiff_plain/1711aaae1c2b3397d739a0669df124e0534711b0..3d19c4c7382064272244502a02e1c0985648b0e1:/src/songs/musicxmltosong.py diff --git a/src/songs/musicxmltosong.py b/src/songs/musicxmltosong.py index 1724fc4..068017f 100755 --- a/src/songs/musicxmltosong.py +++ b/src/songs/musicxmltosong.py @@ -9,7 +9,8 @@ import sys from types import StringTypes from xml.dom.minidom import parse from optparse import OptionParser -from Song import Song +from itertools import cycle +#from Song import Song # Do4 <=> midi 60 OCTAVE_REF = 4 @@ -20,10 +21,23 @@ DIATO_SCALE = {'C' : 60, 'G' : 67, 'A' : 69, 'B' : 71} + +FR_NOTES = {'C' : u'Do', + 'D' : u'Ré', + 'E' : u'Mi', + 'F' : u'Fa', + 'G' : u'Sol', + 'A' : u'La', + 'B' : u'Si'} + _marker = [] class Part(object) : + requiresExtendedScale = False + scale = [55, 57, 59, 60, 62, 64, 65, 67, 69, 71, 72] + quarterNoteLength = 400 + def __init__(self, node, autoDetectChorus=True) : self.node = node self.notes = [] @@ -36,20 +50,24 @@ class Part(object) : def _parseMusic(self) : divisions = 0 - noteIndex = 0 - next = previous = None + previous = None + for measureNode in self.node.getElementsByTagName('measure') : + measureNotes = [] # divisions de la noire divisions = int(_getNodeValue(measureNode, 'attributes/divisions', divisions)) for noteNode in measureNode.getElementsByTagName('note') : note = Note(noteNode, divisions, previous) - self.notes.append(note) - try : - self.notes[noteIndex-1].next = note - except IndexError: - pass + if not note.isRest : + measureNotes.append(note) + if previous : + previous.next = note + else : + previous.addDuration(note) + continue previous = note - noteIndex += 1 + + self.notes.extend(measureNotes) def _findChorus(self): """ le refrain correspond aux notes pour lesquelles @@ -81,13 +99,16 @@ class Part(object) : def iterNotes(self) : "exécution de la chanson avec l'alternance couplets / refrains" for verse in self.verses : + print "---partie---" repeats = len(verse[0].lyrics) if repeats > 1 : for i in range(repeats) : # couplet + print "---couplet%d---" % i for note in verse : yield note, i # refrain + print "---refrain---" for note in self.chorus : yield note, 0 else : @@ -96,16 +117,50 @@ class Part(object) : def pprint(self) : for note, verseIndex in self.iterNotes() : - print note.name, note.midi, note.duration, note.lyrics[verseIndex] + print note, note.lyrics[verseIndex] + + + def assignNotesFromMidiNoteNumbers(self): + # TODO faire le mapping bande hauteur midi + for i in range(len(self.midiNoteNumbers)): + noteInExtendedScale = 0 + while self.midiNoteNumbers[i] > self.scale[noteInExtendedScale] and noteInExtendedScale < len(self.scale)-1: + noteInExtendedScale += 1 + if self.midiNoteNumbers[i]