xmlChordAna.py
changeset 0 4896b49e870a
child 2 775a1d0d3be6
equal deleted inserted replaced
-1:000000000000 0:4896b49e870a
       
     1 import fractions as F
       
     2 import xml2b40
       
     3 import segLibB40 as S
       
     4 
       
     5 def keySeg (iseg,jseg):
       
     6     hist = S.getSegment (iseg, jseg)
       
     7     ks = S.keyCor (hist)
       
     8     c1, key, m = ks [0] # correlation coeff, key, major/minor
       
     9     c2, _, _ = ks [1]   # second best key
       
    10     conf = 300 * (c1 - c2) / c2
       
    11     if conf > 100: conf = 10
       
    12     return conf, S.b40nm (key) + (m and 'm' or ' ')
       
    13 
       
    14 def mkAna (events, fnm):
       
    15     kgroep = S.readEvents (events)
       
    16     tikkenPerKwart = 384
       
    17     S.mkWeights (kgroep)
       
    18     conf, key = keySeg (0, len (kgroep)-1)
       
    19     tonalcentre = key[:2] if key[1] in 'b#' else key[:1]  # cut minor from key
       
    20     S.mkTemplates ()
       
    21     segs, kgroep = S.analyseK (kgroep, debug=0)
       
    22     regels = []
       
    23     regels.append ('File: %s, ticks per quarternote: %d' % (fnm, tikkenPerKwart))
       
    24     regels.append ('%d note groups, %d chord segments' % (len (kgroep), len (segs)))
       
    25     regels.append ('Key: %s, confidence: %.0f%%' % (key, conf))
       
    26     for (kb, ke, score, chord, _) in segs:
       
    27         grpsInSeg = kgroep [kb:ke]
       
    28         totNotes = sum ([len (ns) for ts, ns in grpsInSeg])
       
    29         percnt = 100. * score / totNotes
       
    30         regels.append ('---- chord %s, score: %.0f%%' % (chord, percnt))
       
    31         for tikken, noten in grpsInSeg:
       
    32             noten = ', '.join ([S.b40nm (n) + str(n / 40) for n in noten])
       
    33             x = F.Fraction (tikken, tikkenPerKwart)
       
    34             n, d = x.numerator, x.denominator
       
    35             t = n / d
       
    36             r = x - t
       
    37             if r == 0: r = ''
       
    38             regels.append ('%4d %3s %s' % (t, r, noten))
       
    39     return regels    
       
    40 
       
    41 if __name__ == '__main__':
       
    42     fnm = 'mids/bwv539p_arr.xml'
       
    43     noten = xml2b40.xml2b40 (fnm)
       
    44     regels = mkAna (noten, fnm)
       
    45     print '\n'.join (regels)