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)
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 = {}
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))