view Syncopation models/parameter_setter.py @ 23:df1e7c378ee0

fixed KTH, and WNBD
author csong <csong@eecs.qmul.ac.uk>
date Sun, 12 Apr 2015 13:06:17 +0100
parents b959c2acb927
children 5de1cb45c145
line wrap: on
line source
'''
Author: Chunyang Song
Institution: Centre for Digital Music, Queen Mary University of London
'''

# Set the parameters: subdivision_seq, weight_seq, L_max, strong_beat_level

# {'key': time-signature} :  
# {'value': [subdivision_seq, theoretical beat-level represented by index in the subdivision_seq list]}
timeSignatureBase = {
	'2/2': [[1,2,2,2,2,2],1],
	'3/2': [[1,3,2,2,2,2],1],
	'4/2': [[1,2,2,2,2,2],1],
	'2/4': [[1,2,2,2,2,2],1],
	'3/4': [[1,3,2,2,2,2],1],
	'4/4': [[1,2,2,2,2,2],2],
	'5/4': [[1,5,2,2,2,2],1],
	'7/4': [[1,7,2,2,2,2],1],
	'3/8': [[1,3,2,2,2,2],1],
	'5/8': [[1,5,2,2,2,2],1],
	'6/8': [[1,2,3,2,2,2],1],
	'9/8': [[1,3,3,2,2,2],1],
	'12/8':[[1,2,2,3,2,2],2],	
}

def add_time_signature(timeSignature, subdivisionSequence, beatLevel):
	if is_time_signature_valid(timeSignature,subdivisionSequence,beatLevel):
		if timeSignature in timesigBase:
			print 'This time-signature is existed already.'
		else:
			timeSignatureBase[timeSignature] = [subdivisionSequence, beatLevel]
			write_time_signature()

def update_time_signature(timeSignature, subdivisionSequence, beatLevel):
	if is_time_signature_valid(timeSignature,subdivisionSequence,beatLevel):
		if timeSignature in timeSignatureBase:
			print 'Original settings for ', timeSignature, ':',timeSignatureBase[timeSignature] 
			timeSignatureBase[timeSignature] = [subdivisionSequence, beatLevel]
			print 'Changed into:',timeSignatureBase[timeSignature]
			write_time_signature()

def is_time_signature_valid(timeSignature, subdivisionSequence, beatLevel):
	isValid = False
	if ('/' not in timeSignature) or (not timeSignature.split('/')[0].isdigit()) or (not timeSignature.split('/')[1].isdigit()):
		print 'Error: invalid time-signature. Please indicate in the form of fraction, e.g. 4/4, 6/8 or 3/4.'
	elif subdivisionSequence != [s for s in subdivisionSequence if isinstance(s,int)]:
		print 'Error: invalid subdivision sequence. Please indicate in the form of list of numbers, e.g [1,2,2,2,2].'
	elif beatLevel >= len(subdivisionSequence):
		print 'Error: beat-level exceeds the range of subdivision sequence list.'
	else:
		isValid = True
	return isValid

def write_time_signature():
	import cPickle as pickle
	timeSigFile = open('TimeSignature.pkl', 'wb')
	pickle.dump(timeSignatureBase, timeSigFile)
	timeSigFile.close()

def read_time_signature():
	import cPickle as pickle
	timeSigFile = open('TimeSignature.pkl','rb')
	data = pickle.load(timeSigFile)
	return data
	timeSigFile.close()

def print_time_signature_base():
	data = read_time_signature()
	for timeSignature, settings in data.items():
		print timeSignature, settings

# def get_subdivision_seq(timeSignature):
# 	if timeSignature in readTimesig():
# 		return timesigBase[timesig][0]
# 	else:
# 		print 'Error: the subdivision sequence for this time-signature is not defined.'
# 		return None

# def get_beat_level(timesig):
# 	if timesig in readTimesig():
# 		return timesigBase[timesig][1]
# 	else:
# 		print 'Error: the subdivision sequence for this time-signature is not defined.'
# 		return None