--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/xmlChordAna.py Mon May 25 10:10:32 2020 +0200
@@ -0,0 +1,45 @@
+import fractions as F
+import xml2b40
+import segLibB40 as S
+
+def keySeg (iseg,jseg):
+ hist = S.getSegment (iseg, jseg)
+ ks = S.keyCor (hist)
+ c1, key, m = ks [0] # correlation coeff, key, major/minor
+ c2, _, _ = ks [1] # second best key
+ conf = 300 * (c1 - c2) / c2
+ if conf > 100: conf = 10
+ return conf, S.b40nm (key) + (m and 'm' or ' ')
+
+def mkAna (events, fnm):
+ kgroep = S.readEvents (events)
+ tikkenPerKwart = 384
+ S.mkWeights (kgroep)
+ conf, key = keySeg (0, len (kgroep)-1)
+ tonalcentre = key[:2] if key[1] in 'b#' else key[:1] # cut minor from key
+ S.mkTemplates ()
+ segs, kgroep = S.analyseK (kgroep, debug=0)
+ regels = []
+ regels.append ('File: %s, ticks per quarternote: %d' % (fnm, tikkenPerKwart))
+ regels.append ('%d note groups, %d chord segments' % (len (kgroep), len (segs)))
+ regels.append ('Key: %s, confidence: %.0f%%' % (key, conf))
+ for (kb, ke, score, chord, _) in segs:
+ grpsInSeg = kgroep [kb:ke]
+ totNotes = sum ([len (ns) for ts, ns in grpsInSeg])
+ percnt = 100. * score / totNotes
+ regels.append ('---- chord %s, score: %.0f%%' % (chord, percnt))
+ for tikken, noten in grpsInSeg:
+ noten = ', '.join ([S.b40nm (n) + str(n / 40) for n in noten])
+ x = F.Fraction (tikken, tikkenPerKwart)
+ n, d = x.numerator, x.denominator
+ t = n / d
+ r = x - t
+ if r == 0: r = ''
+ regels.append ('%4d %3s %s' % (t, r, noten))
+ return regels
+
+if __name__ == '__main__':
+ fnm = 'mids/bwv539p_arr.xml'
+ noten = xml2b40.xml2b40 (fnm)
+ regels = mkAna (noten, fnm)
+ print '\n'.join (regels)
\ No newline at end of file