diff Functions/AddingXMLSingleMeasures.py @ 1:0f7f611deca4

Functions
author Victor Padilla <victor.padilla.mc@gmail.com>
date Mon, 04 May 2015 22:53:31 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Functions/AddingXMLSingleMeasures.py	Mon May 04 22:53:31 2015 +0200
@@ -0,0 +1,111 @@
+'''
+Created on 24/09/2014
+
+@author: victor
+
+Class for adding and joining measures
+(It is under development)
+'''
+import os
+from music21 import stream
+from music21 import converter
+from music21 import meter
+from music21 import key
+from music21 import clef
+from music21 import note
+from music21 import interval
+
+class AddingXMLSingleMeasures:
+    def getAllFiles(self,path):
+        omr_files=[]
+        dir_content = os.listdir(path)
+        dir_content.sort()
+        for myfile in dir_content:
+            directory = os.path.join(path,myfile)
+            omr_files.append(os.path.abspath(directory))
+        print omr_files
+        return omr_files
+    
+    def runViewJoinXML(self,dirname):
+        path = dirname
+        files=self.getAllFiles(path)
+        filesM21=self.getFilesM21(files,path)
+        part=stream.Part()
+        ks_array=[]
+        for f in filesM21:
+            measure=f.parts[0].getElementsByClass(stream.Measure)[0]
+            if len(part)==0:
+                ks_array=self.getKeySignatureArray(measure)
+                
+            if len(part)>0:
+                measure=self.removeTimeSignature(measure)
+                measure=self.removeKeySignature(measure)
+                measure=self.removeClef(measure)
+#                 measure=self.transpose(measure,-10)
+            part.append(measure)
+#         part=self.correctKeySignature(part,["C "])  
+        # the correct key signature
+        part=self.correctKeySignature(part,ks_array)       
+        part.show()
+    def transpose(self,measure,semitones):
+        newMeasure=stream.Measure()
+        for element in measure:
+                if isinstance(element,note.Note):  
+                    element=element.transpose(interval.Interval(semitones))
+                newMeasure.append(element)
+        return newMeasure
+    def getKeySignatureArray(self,measure):
+        ks_array=[]
+        for element in measure:
+            if isinstance(element,key.KeySignature):
+                for p in element.alteredPitches:
+                    ks_array.append(str(p))
+                return ks_array                
+    def correctKeySignature(self,part,altered):
+        newPart=stream.Part()
+        for measure in part.getElementsByClass(stream.Measure):
+            newMeasure=stream.Measure()
+            for element in measure:
+                if isinstance(element,note.Note):
+                    for alter in altered:
+                        print element.pitch.name,alter
+                        if element.pitch.name[0:1]==alter[0:1] and alter[1:2]=="#":
+                            element.accidental=1
+                        if element.pitch.name[0:1]==alter[0:1] and alter[1:2]=="-":
+                            element.accidental=-1
+                        if element.pitch.name[0:1]==alter[0:1] and alter[1:2]==" ":
+                            element.accidental=0
+                newMeasure.append(element)
+            newPart.append(newMeasure)
+        return newPart
+        
+    def removeTimeSignature(self,measure):
+        newmeasure=stream.Measure()
+        for element in measure:
+            if not isinstance(element,meter.TimeSignature):
+                newmeasure.append(element)
+        return newmeasure       
+    def removeKeySignature(self,measure):
+        newmeasure=stream.Measure()
+        for element in measure:
+            if not isinstance(element,key.KeySignature):
+                newmeasure.append(element)
+        return newmeasure   
+    def removeClef(self,measure):
+        newmeasure=stream.Measure()
+        for element in measure:
+            if not isinstance(element,clef.GClef) and not isinstance(element,clef.NoClef) :
+                newmeasure.append(element)
+        return newmeasure                          
+            
+      
+        
+            
+    def getFilesM21(self,files,path):
+        filesM21=[]
+        print "---Converting Files---"
+        for i in range(len(files)):
+            f=path+"\M"+str(i+1)+".xml"
+            f_m21=converter.parse(f)
+            filesM21.append(f_m21)
+        return filesM21
\ No newline at end of file