|
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) |