diff -r 000000000000 -r 4896b49e870a xmlChordAna.py --- /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