X-Git-Url: https://scm.cri.mines-paristech.fr/git/minwii.git/blobdiff_plain/58f8fcfb15531fc052f9cdd02543cafe93428698..a111b5a9b605b9c5c40933c5a8d5b3a5b42a03ae:/src/songs/musicxmltosong.py?ds=sidebyside diff --git a/src/songs/musicxmltosong.py b/src/songs/musicxmltosong.py index 39df188..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$ @@ -9,6 +9,7 @@ import sys from types import StringTypes from xml.dom.minidom import parse from optparse import OptionParser +from itertools import cycle #from Song import Song # Do4 <=> midi 60 @@ -33,9 +34,14 @@ _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 = [] + self.repeats = [] self._parseMusic() self.verses = [[]] self.chorus = [] @@ -45,20 +51,35 @@ class Part(object) : def _parseMusic(self) : divisions = 0 - noteIndex = 0 - next = previous = None + previous = None + 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') : 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) + + # 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 @@ -87,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 : @@ -107,17 +133,66 @@ class Part(object) : yield note, 0 def pprint(self) : - for note, verseIndex in self.iterNotes() : - print note.nom, note.name, note.midi, note.duration, note.lyrics[verseIndex] - + for note, verseIndex in self.iterNotes(indefinitely=False) : + 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]