diff Functions/HashFunctions.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/HashFunctions.py	Mon May 04 22:53:31 2015 +0200
@@ -0,0 +1,123 @@
+'''
+@organization: Lancaster University & University of Leeds
+@version: 1.0
+Created on 11/12/2014
+
+@author: Victor Padilla
+@contact: v.padilla@lancaster.ac.uk
+
+Functions to manipulate and convert to Hash array
+the scores. 
+
+It is useful for aligning measures (not single notes)
+
+'''
+from music21 import stream
+from music21 import note
+from music21 import omr
+# FastAlignmentArrays is a Cython library
+from Alignment import FastAlignmentArrays
+from MeasureFunctions import MeasureFunctions
+
+class HashFunctions:
+    
+    def alignHash(self,hashArray):
+        '''
+        Returns two hash arrays aligned
+        
+        Uses the needleman-wunsh algorithm evaluating the differences between measures
+        '''
+        faa=FastAlignmentArrays()
+        hashOrdered=faa.needleman_wunsch(hashArray[0], hashArray[1],False)[0]
+        hashArray[0]=hashOrdered[0]
+        hashArray[1]=hashOrdered[1]
+        return hashArray
+    
+    def getHash(self,OMR):
+        '''
+        Returns hash from a group of OMR parts
+        '''
+        print "...Obtaining Hash of measures..."
+        hashArray=[]
+        for i in range(len(OMR)):
+            hashArray.append(self.getHashArrayFromPart(OMR[i].parts[0]))
+        return hashArray
+    
+    def getGapsFromHashArray(self,hashArray):
+        '''
+        Returns the gap index array from a group of hash parts
+        '''
+        gapsArrays=[]
+        for i in range(len(hashArray)):
+            gapsArray=[]
+            for j in range(len(hashArray[i])):
+                symbol=hashArray[i][j]
+                if symbol=="*":
+                    gapsArray.append(j)
+            
+            gapsArrays.append(gapsArray)   
+        return gapsArrays
+    
+         
+ 
+        
+    def reconstructHash(self,OMR,hashArray):  
+        '''
+        Returns a group of single parts ordered by hashArray (gaps)
+        '''
+        scores=[]
+        gapsArr=[]
+        mf=MeasureFunctions()
+        for i in range(len(OMR)):
+            print len(hashArray[i])
+            partReconstruct,gaps=mf.reconstructScore(OMR[i].parts[0], hashArray[i])
+            sc=stream.Score()
+            sc.append(partReconstruct)
+            scores.append(sc)
+            gapsArr.append(gaps)
+        return scores,gapsArr
+        
+    
+      
+
+    def removeHashGaps(self,partHash):
+        '''
+        Removes gaps in a part
+        '''
+        newHash=[]
+        for i in range(len(partHash)):
+            if(partHash[i]!="*"):
+                newHash.append(partHash[i])
+        return newHash
+    
+    def addHashGaps(self,partHash,gaps):
+        '''
+        Insert gaps in a part
+        '''
+        for gap in gaps:
+            partHash.insert(gap,"")
+        return partHash    
+    
+        
+    def getHashArrayFromPart(self,part):
+        '''
+        get Hash string of a Part (music21)
+        '''
+        hashArray=[]
+        lengthArray=len(part.getElementsByClass(stream.Measure))
+        for i in range(lengthArray):
+            measure=part.getElementsByClass(stream.Measure)[i]
+            hashMeasure=self.getHashFromMeasure(measure)
+            pitchArr=""
+            for mynote in measure.flat.getElementsByClass(note.Note):
+                pitchArr+=str(mynote.pitch.name)
+            hashArray.append(pitchArr+"_"+hashMeasure)
+        return hashArray
+    
+    def getHashFromMeasure(self,measure):
+        '''
+        get Hash string of a measure. Library correctors.py of Michael Scott Cuthbert. Project OMR
+        '''
+        mh=omr.correctors.MeasureHash(measure).getHashString()
+        return mh
+    
\ No newline at end of file