def render(score, segmentation, hmm, f_discretization=10, e_discretization=30, subset=None, sensitivity=5):
    # Extract scorefeatures
    features = sf.vanDerWeijFeatures(score, segmentation)
    # Discretize
    features = normalize(preprocess(sf.vanDerWeijFeatures(score, segmentation), subset), hmm.normalizations)
    observations = [tuple(discretize(f, f_discretization, 'linear')) for f in features]
    print('Observations:\n{0}'.format(observations))
    # Find the best expressive explanation for these features
    print("Finding best fitting expression")
    (p, states) = hmm.viterbi(observations)
    print(p, states)
    expression = []
    for state in states:
        expression.append(undiscretize_expression(state, e_discretization, sensitivity=sensitivity))
    print('Expression states:\n{0}'.format(states))

    return (p, expression)
예제 #2
0
def train(trainset):

    expression = {}
    features = {}
    const = 0
    Max = 0
    Min = None
    count = 0
    print(">>> Loading scores and deviations, this will take hours and may eat all you memory")

    for query in trainset:
        print(">>> Loading: {0}".format(query))
        score = db.getScore1(query)
        deviations = db.getDeviation1(query)
        alignment = Alignment(score, deviations)
        melody = alignment.melody()
        #segments = structure.newSegmentation(tools.parseScore(melody))
        segments = structure.noteLevel(tools.parseScore(melody))
        const += len(segments)
        lengths = sum([len(s) for s in segments])
        m = max([len(s) for s in segments])
        mi = min([len(s) for s in segments])
        if m > Max:
            Max = m
        if not Min:
            Min = mi
        if mi < Min:
            Min = mi
        print('>>> Extracting features')
        expression[query] = performancefeatures.vanDerWeijExpression(alignment, segments)
        features[query] = scorefeatures.vanDerWeijFeatures(melody, segments)
        count += 1
        print('{0}/{1} done'.format(count, len(trainset)))

    print("Done, {0} segments found with an average length of: {1} (min: {2} max: {3})".format(const, lengths / float(const), Min, Max))
    tools.saveFeatures(features, expression)
 elif a[1] == 'corpora':
     for x in tools.datasets():
         print('Name:\t[{0}]\tInfo:\t{1}'.format(x, tools.corpusInfo(x)))
     exit(0)
 elif a[1] == 'corpusinfo':
     choice = util.menu("Select corpus", tools.datasets())
     print(tools.corpusInfo(tools.datasets()[choice]))
     tools.extendedCorpusInfo(tools.datasets()[choice])
     exit(0)
 elif a[1] == 'features':
     s = db.select()
     score = Score(db.getScore1(s))
     melodyscore = score.melody()
     melody = tools.parseScore(melodyscore)
     segmentation = structure.reasonableSegmentation(melody)
     f = sf.vanDerWeijFeatures(melodyscore, segmentation)
     for x in f:
         #(dPitch, abs_dPitch, dDuration, abs_dDuration, silence, ddPitch, abs_ddPitch, pitch_direction)
         print('dpitch: {0} abs_dPitch: {1} dDuration: {2} abs_dDuration: {3} silence: {4}'.format(x[0], x[1], x[2], x[3], x[4]))
         print('ddPitch: {0} abs_ddPitch: {1} : pitch_direction: {2}'.format(x[5], x[6], x[7]))
     exit(0)
 elif a[1] == 'merge':
     # Merge datasets
     choice = -1
     datasets = []
     while True:
         choice = util.menu('Choose datasets', ['Done'] + tools.datasets())
         if choice == 0: break
         datasets.append(tools.loadFeatures(tools.datasets()[choice-1]))
     features = {}
     expression = {}
예제 #4
0
import database as db
from sequencer import *
from alignment import *
import structure, tools
import scorefeatures as sf
import performancefeatures as pf
import perform

s = db.select()
a = Alignment(db.getScore1(s), db.getDeviation1(s))
melodyscore = a.melody()
melody = tools.parseScore(melodyscore)
onset = structure.groupings(structure.list_to_tree(structure.first_order_tree(structure.onset, melody, 0.1)), 1)
score = sf.vanDerWeijFeatures(melodyscore, onset)
performance = pf.vanDerWeijExpression(a, onset)

print(score)
print(performance)

seq = Sequencer()
seq.play(perform.vanDerWeijPerformSimple(a.score, melodyscore, onset, performance, bpm=a.deviations.bpm, converter=melody))