segLibB40.py
author wim
Mon, 25 May 2020 13:11:59 +0200
changeset 3 b89a27b9bd9e
parent 1 7fd6cac1a69d
child 6 193999e56a90
permissions -rw-r--r--
- add readme
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
     1
'''B40 versie
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
     2
bevat B40lib, b40ana en b40krumm
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
     3
zie ook b40krumm.py voor uitleg van b40 keyalgoritme.
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
     4
'''
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
     5
import re, math
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
     6
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
     7
major = [6.35, 2.23, 3.48, 2.33, 4.38, 4.09, 2.52, 5.19, 2.39, 3.66, 2.29, 2.88]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
     8
minor = [6.33, 2.68, 3.52, 5.38, 2.60, 3.53, 2.54, 4.75, 3.98, 2.69, 3.34, 3.17]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
     9
base_templates = [(0,12,23),(0,12,23,34),(0,11,23),(0,11,22,33),(0,11,22,34),(0,11,22)]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    10
base_names = ['maj','dom7','min','fdim','hdim','dim']
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    11
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    12
def avg (xs):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    13
    return sum (xs) / len (xs)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    14
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    15
tab = [1,10,11,0,1,2,3,0,1,2,3,4,1,2,3,4,5,6,3,4,5,6,7,4,5,6,7,8,9,6,7,8,9,10,11,8,9,10,11,0]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    16
acs = [2,-2,-1,0,1,2,0,-2,-1,0,1,2,0,-2,-1,0,1,2,-2,-1,0,1,2,0,-2,-1,0,1,2,0,-2,-1,0,1,2,0,-2,-1,0,1]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    17
def b40pcHst (b40Hst):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    18
    pcHst = [0.0 for i in range (12)]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    19
    nacc = 0
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    20
    for ix, b40 in enumerate (b40Hst):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    21
        if b40 == 0: continue
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    22
        pcHst [tab [ix]] += float (b40) # soms valt een Dbb op een C b.v. ex14, maat 5, 3e tel
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    23
        nacc += acs [ix] * b40
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    24
    return pcHst, nacc
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    25
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    26
# de b40 nummers van de 12 pitches [3,[4,8],9,[10,14],15,20,[21,25],26,[27,31],32,[33,37],38]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    27
b12b40 = [3,4,9,10,15,20,21,26,27,32,33,38]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    28
dkeus = {}.fromkeys ([1,3,6,8,10], 1)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    29
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    30
def keyCor (b40Hst):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    31
    pcHst, nacc = b40pcHst (b40Hst)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    32
    pcHst [0] += 0.0001
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    33
    pc_mean = avg (pcHst)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    34
    maj_mean = avg (major)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    35
    min_mean = avg (minor)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    36
    maj_dif_sq = sum ([(m - maj_mean)**2 for m in major])
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    37
    min_dif_sq = sum ([(m - min_mean)**2 for m in minor])
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    38
    pc_dif_sq  = sum ([(m -  pc_mean)**2 for m in pcHst])
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    39
    maj_noemer = math.sqrt (maj_dif_sq * pc_dif_sq)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    40
    min_noemer = math.sqrt (min_dif_sq * pc_dif_sq)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    41
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    42
    cor_maj = []; cor_min = []
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    43
    for i in range (12):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    44
        maj_cor = min_cor = 0
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    45
        for j in range (12):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    46
            k = (i + j) % 12
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    47
            maj_cor += (major[j] - maj_mean) * (pcHst[k] - pc_mean)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    48
            min_cor += (minor[j] - min_mean) * (pcHst[k] - pc_mean)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    49
        cor_maj.append (maj_cor / maj_noemer)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    50
        cor_min.append (min_cor / min_noemer)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    51
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    52
    ks = [(c,i,0) for i,c in enumerate (cor_maj)] + [(c,i,1) for i,c in enumerate (cor_min)]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    53
    ks.sort ()
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    54
    ks.reverse ()
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    55
    ksb40 = []
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    56
    for c,b12,mnr in ks:
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    57
        b40 = b12b40 [b12]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    58
        if b12 in dkeus and nacc < 0: # er zijn meer mollen dan kruisen
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    59
            b40 += 4                  # C# => Db (4 => 8) etc.
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    60
        ksb40.append ((c, b40, mnr))
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    61
    return ksb40
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    62
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    63
# the note names on the line of fifth in order of sharpness. The sharpness of the notes is:
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    64
# -13 (Fbb), -12, -11, ... 0 (Bb), 1, 2 (=C) , ... 21 (B##)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    65
Lof = ['Fbb','Cbb','Gbb','Dbb','Abb','Ebb','Bbb','Fb','Cb','Gb','Db','Ab','Eb','Bb',
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    66
       'F','C','G','D','A','E','B','F#','C#','G#','D#','A#','E#','B#',
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    67
       'F##','C##','G##','D##','A##','E##','B##']
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    68
       
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    69
# returns the base40 number of a note (between 1 and 40) given the sharpness (between -13 and 21)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    70
def loftobase40 (lof):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    71
    return (lof + 12) * 23 % 40 + 1
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    72
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    73
# returns the sharpness of a note given the base40 number
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    74
def base40tolof (b40):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    75
    return (b40 * 7 - 1) % 40 - 18
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    76
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    77
# returns the name of a b40 note number
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    78
def b40nm (b40):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    79
    if b40 in [6,12,23,29,35]: name = '' # no note on these positions
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    80
    else:
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    81
        ix = base40tolof (b40) # the sharpness
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    82
        name = Lof [ix+13]     # +13 -> index in the line of fifth table
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    83
    return name
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    84
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    85
rc = re.compile (r'([-A-GX][b#]*)(.*)')
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    86
def splitCh (chnm):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    87
    ro = rc.match (chnm)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    88
    if not ro: raise '%s matcht niet' % chnm
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    89
    return ro.group (1), ro.group (2)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    90
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    91
def mkTemplates ():
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    92
    global templates, accNames, freqTab
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    93
    templates = []
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    94
    accNames = []
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    95
    freqTab = [] # template index -> frequentie index = (5..0), 5 meest voorkomend type, 0 minst voorkomend
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    96
    for sh in range (-6,15):   # sharpness of 'Fb','Cb', Gb, ... F, C, G, ... D#, A#, E#, B#
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    97
        b40 = loftobase40 (sh) # base40 number = roots of chords
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    98
        for it, t in enumerate (base_templates):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
    99
            tx = tuple( [(ival + b40) % 40 for ival in t] )      # the b40 notes of the chord
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   100
            ex = tuple( [n for n in range (40) if not n in tx] ) # the notes notes not in the chord
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   101
            templates.append ((tx, ex))
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   102
            accNames.append (b40nm (b40) + base_names[it])
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   103
    for acc in accNames:
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   104
        chroot, type = splitCh (acc)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   105
        freqIx = len (base_names) - base_names.index (type) # hoogste index voor meestvoorkomende chordtype
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   106
        freqTab.append (freqIx)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   107
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   108
def score (iseg, jseg):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   109
    w = getSegment (iseg, jseg)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   110
    scores = []
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   111
    nseg = jseg - iseg + 1
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   112
    for it, (tx, ex) in enumerate (templates):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   113
        notes = [w[i] for i in tx]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   114
        fout = [w[i] for i in ex]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   115
        mis = sum ([1 for n in notes if n == 0])
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   116
        s = sum (notes) - sum (fout) - mis
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   117
        #~ ps = [n for n in notes if n > 0]  # noot histogram van segment
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   118
        #~ if ps and min (ps) < nseg * 0.3: s -= 2 # niet gewogen (oud), bevoordeelt s01 t.o.v. s0 + s1
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   119
        #~ if ps and min (ps) * 4 < nseg: s -= int (round (0.1 * nseg)) # nieuw, gewogen
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   120
        rootw = notes[0] # root weight voor tie-break
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   121
        acc = accNames [it]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   122
        freqIx = freqTab [it]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   123
        scores.append ((s, rootw, freqIx, acc))
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   124
    scores.sort ()
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   125
    scores.reverse () # hoogste score, hoogste root-weight, hoogste freqIx komt bovenaan
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   126
    highest, _, _, acc = scores[0]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   127
    return highest, acc, scores[:5] # score, acc-name
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   128
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   129
def readEvents (events, resolution=2): # list of [time, +/- midi note number]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   130
    #~ events.sort ()
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   131
    tgroep = events[0][0]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   132
    groep = []
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   133
    merged = []
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   134
    for t, p in events:
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   135
        if t - tgroep < resolution:
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   136
            groep.append (p)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   137
            tgroep = t
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   138
        else:
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   139
            merged.append ((tgroep, groep))
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   140
            tgroep = t
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   141
            groep = [p]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   142
    merged.append ((tgroep, groep))
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   143
    klinkt = []
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   144
    kgroep = []
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   145
    for t, g in merged:
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   146
        for p in g:
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   147
            if p > 0: klinkt.append (p)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   148
            elif -p in klinkt: klinkt.remove (-p)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   149
            else: print 'unmatched off-message'
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   150
        kgroep.append ((t, klinkt[:]))
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   151
    return kgroep
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   152
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   153
def mkWeights (kgroep):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   154
    global weights
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   155
    weights = [[] for i in range (len (kgroep))]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   156
    for ix, (t, g) in enumerate (kgroep):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   157
        w = 40 * [0]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   158
        for n in g: w [n % 40] += 1
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   159
        weights [ix] = w
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   160
    return weights
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   161
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   162
def getSegment (i, j):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   163
    wtot = 40 * [0]
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   164
    for ws in weights [i:j+1]:
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   165
        for i, w in enumerate (ws):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   166
            wtot [i] += w
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   167
    return wtot
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   168
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   169
def analyseK (kgroep, debug=0):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   170
    if debug: print 'aantal segmenten', len (kgroep)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   171
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   172
    #~ mkWeights (kgroep)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   173
    #~ mkTemplates ()
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   174
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   175
    j0, j1, j2 = 0,1,2
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   176
    s0, acc0, xs0 = score (j0, j0)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   177
    s1, acc1, xs1 = score (j1, j1)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   178
    s01, acc01, xs01 = score (j0, j1)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   179
    segs = []
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   180
    while j1 < len (weights):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   181
        s2, acc2, xs2 = score (j2, j2)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   182
        s12, acc12, xs12 = score (j1, j2)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   183
        s012, acc012, xs012 = score (j0, j2)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   184
        left = max ([s0+s12, s0+s1+s2])
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   185
        right = max ([s012, s01+s2])
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   186
        if left <= right:
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   187
            j1, j2 = j2, j2 + 1
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   188
            s0, acc0, xs0 = s01, acc01, xs01
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   189
            s01, acc01, xs01 = s012, acc012, xs012
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   190
        else:
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   191
            segs.append ((j0,j1,s0,acc0,xs0))
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   192
            if debug: print j0, j1, s0, acc0
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   193
            j0, j1, j2 = j1, j2, j2 + 1
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   194
            s0, acc0, xs0 = s1, acc1, xs1
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   195
            s01, acc01, xs01 = s12, acc12, xs12
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   196
        s1, acc1, xs1 = s2, acc2, xs2
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   197
    if j0 < len (weights):
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   198
        segs.append ((j0,j1,s0,acc0,xs0))
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   199
        if debug: print j0, j1, s0, acc0
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   200
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   201
    return segs, kgroep
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   202
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   203
if __name__ == '__main__':
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   204
    f = open ('mids/bwv539p.b40')
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   205
    xs = f.readlines ()
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   206
    f.close ()
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   207
    def toint (xs): return map (lambda x: int (x), xs)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   208
    events = map (lambda x: toint (x.strip().split()), xs)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   209
    kgroep = readEvents (events)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   210
    mkWeights (kgroep)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   211
    mkTemplates ()
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   212
    segs, kgroep = analyseK (kgroep, debug=0)
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   213
    print '%d segs, %d groepen' % (len (segs), len (kgroep))
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   214
    for iseg, jseg, score, acc, rest in segs:
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   215
        print '---', acc, score
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   216
        for t, ns in kgroep [iseg:jseg]:
7fd6cac1a69d - hard link to segLibB40 added
wim
parents:
diff changeset
   217
            print t, ', '.join (map (b40nm, ns))