Création d'une classe Tone dont hérite Note.
[minwii.git] / src / songs / musicxmltosong.py
index 7f5c8bb..7eedf53 100755 (executable)
@@ -22,6 +22,20 @@ DIATO_SCALE = {'C' : 60,
                'A' : 69,
                'B' : 71}
 
+CHROM_SCALE = {  0 : ('C',  0),
+                 1 : ('C',  1),
+                 2 : ('D',  0),
+                 3 : ('E', -1),
+                 4 : ('E',  0),
+                 5 : ('F',  0),
+                 6 : ('F',  1),
+                 7 : ('G',  0),
+                 8 : ('G',  1),
+                 9 : ('A',  0),
+                10 : ('B', -1),
+                11 : ('B',  0)}
+
+
 FR_NOTES = {'C' : u'Do',
             'D' : u'Ré',
             'E' : u'Mi',
@@ -176,9 +190,56 @@ class Barline(object) :
         return '|'
 
     __repr__ = __str__
+
+
+class Tone(object) :
+    
+    @staticmethod
+    def midi_to_step_alter_octave(midi):
+        stepIndex = midi % 12
+        step, alter = CHROM_SCALE[stepIndex]
+        octave = midi / 12 - 1
+        return step, alter, octave
+    
+    
+    def __init__(self, *args) :
+        if len(args) == 3 :
+            self.step, self.alter, self.octave = args
+        elif len(args) == 1 :
+            midi = args[0]
+            self.step, self.alter, self.octave = Tone.midi_to_step_alter_octave(midi)
+
+    @property
+    def midi(self) :
+        mid = DIATO_SCALE[self.step]
+        mid = mid + (self.octave - OCTAVE_REF) * 12
+        mid = mid + self.alter
+        return mid
+
+    
+    @property
+    def name(self) :
+        name = '%s%d' % (self.step, self.octave)
+        if self.alter < 0 :
+            alterext = 'b'
+        else :
+            alterext = '#'
+        name = '%s%s' % (name, abs(self.alter) * alterext)
+        return name
+
+    @property
+    def nom(self) :
+        name = FR_NOTES[self.step]
+        if self.alter < 0 :
+            alterext = 'b'
+        else :
+            alterext = '#'
+        name = '%s%s' % (name, abs(self.alter) * alterext)
+        return name
+        
         
 
-class Note(object) :
+class Note(Tone) :
     scale = [55, 57, 59, 60, 62, 64, 65, 67, 69, 71, 72]
     
     def __init__(self, node, divisions, previous) :
@@ -212,36 +273,36 @@ class Note(object) :
         self._duration = self.duration + note.duration
         self.divisions = 1
     
-    @property
-    def midi(self) :
-        mid = DIATO_SCALE[self.step]
-        mid = mid + (self.octave - OCTAVE_REF) * 12
-        mid = mid + self.alter
-        return mid
+#    @property
+#    def midi(self) :
+#        mid = DIATO_SCALE[self.step]
+#        mid = mid + (self.octave - OCTAVE_REF) * 12
+#        mid = mid + self.alter
+#        return mid
     
     @property
     def duration(self) :
         return self._duration / self.divisions
     
-    @property
-    def name(self) :
-        name = '%s%d' % (self.step, self.octave)
-        if self.alter < 0 :
-            alterext = 'b'
-        else :
-            alterext = '#'
-        name = '%s%s' % (name, abs(self.alter) * alterext)
-        return name
-    
-    @property
-    def nom(self) :
-        name = FR_NOTES[self.step]
-        if self.alter < 0 :
-            alterext = 'b'
-        else :
-            alterext = '#'
-        name = '%s%s' % (name, abs(self.alter) * alterext)
-        return name
+#    @property
+#    def name(self) :
+#        name = '%s%d' % (self.step, self.octave)
+#        if self.alter < 0 :
+#            alterext = 'b'
+#        else :
+#            alterext = '#'
+#        name = '%s%s' % (name, abs(self.alter) * alterext)
+#        return name
+#    
+#    @property
+#    def nom(self) :
+#        name = FR_NOTES[self.step]
+#        if self.alter < 0 :
+#            alterext = 'b'
+#        else :
+#            alterext = '#'
+#        name = '%s%s' % (name, abs(self.alter) * alterext)
+#        return name
     
     @property
     def column(self):
@@ -303,6 +364,7 @@ def musicXml2Song(input, partIndex=0, printNotes=False) :
         part.pprint()
 
     return part
+
     
     
 def main() :