xmlChordAna.py
author wim
Mon, 25 May 2020 10:39:18 +0200
changeset 1 7fd6cac1a69d
parent 0 4896b49e870a
child 2 775a1d0d3be6
permissions -rw-r--r--
- hard link to segLibB40 added

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)