from types import StringTypes
from xml.dom.minidom import parse
from optparse import OptionParser
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
#from Song import Song
# Do4 <=> midi 60
divisions = int(_getNodeValue(measureNode, 'attributes/divisions', divisions))
for noteNode in measureNode.getElementsByTagName('note') :
note = Note(noteNode, divisions, previous)
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 :
+ self.notes.append(note)
+ try :
+ self.notes[noteIndex-1].next = note
+ except IndexError:
+ pass
+ else :
+ previous.addDuration(note)
+ continue
+
previous = note
noteIndex += 1
previous = note
noteIndex += 1
def __init__(self, node, divisions, previous) :
self.node = node
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.isRest = False
+ self.step = _getNodeValue(node, 'pitch/step', None)
+ if self.step is not None :
+ self.octave = int(_getNodeValue(node, 'pitch/octave'))
+ self.alter = int(_getNodeValue(node, 'pitch/alter', 0))
+ elif self.node.getElementsByTagName('rest') :
+ self.isRest = True
+ else :
+ NotImplementedError(self.node.toxml('utf-8'))
+
self._duration = float(_getNodeValue(node, 'duration'))
self.lyrics = []
for ly in node.getElementsByTagName('lyric') :
self._duration = float(_getNodeValue(node, 'duration'))
self.lyrics = []
for ly in node.getElementsByTagName('lyric') :
self.previous = previous
self.next = None
self.previous = previous
self.next = None
+ def addDuration(self, note) :
+ self._duration = self.duration + note.duration
+ self.divisions = 1
+
@property
def midi(self) :
mid = DIATO_SCALE[self.step]
@property
def midi(self) :
mid = DIATO_SCALE[self.step]