csong@9: ''' csong@9: Author: Chunyang Song csong@9: Institution: Centre for Digital Music, Queen Mary University of London csong@9: ''' csong@9: csong@9: # Set the parameters: subdivision_seq, weight_seq, L_max, strong_beat_level csong@9: csong@9: # {'key': time-signature} : csong@9: # {'value': [subdivision_seq, theoretical beat-level represented by index in the subdivision_seq list]} csong@19: timeSignatureBase = { csong@9: '2/2': [[1,2,2,2,2],1], csong@9: '3/2': [[1,3,2,2,2],1], csong@9: '4/2': [[1,2,2,2,2],1], csong@9: '2/4': [[1,2,2,2,2],1], csong@9: '3/4': [[1,3,2,2,2],1], csong@9: '4/4': [[1,2,2,2,2],2], csong@9: '5/4': [[1,5,2,2,2],1], csong@9: '7/4': [[1,7,2,2,2],1], csong@9: '3/8': [[1,3,2,2,2],1], csong@9: '5/8': [[1,5,2,2,2],1], csong@9: '6/8': [[1,2,3,2,2],1], csong@9: '9/8': [[1,3,3,2,2],1], csong@9: '12/8':[[1,2,2,3,2],2], csong@9: } csong@9: csong@19: def add_time_signature(timeSignature, subdivisionSequence, beatLevel): csong@19: if is_time_signature_valid(timeSignature,subdivisionSequence,beatLevel): csong@19: if timeSignature in timesigBase: csong@9: print 'This time-signature is existed already.' csong@9: else: csong@19: timeSignatureBase[timeSignature] = [subdivisionSequence, beatLevel] csong@19: write_time_signature() csong@9: csong@19: def update_time_signature(timeSignature, subdivisionSequence, beatLevel): csong@19: if is_time_signature_valid(timeSignature,subdivisionSequence,beatLevel): csong@19: if timeSignature in timeSignatureBase: csong@19: print 'Original settings for ', timeSignature, ':',timeSignatureBase[timeSignature] csong@19: timeSignatureBase[timeSignature] = [subdivisionSequence, beatLevel] csong@19: print 'Changed into:',timeSignatureBase[timeSignature] csong@19: write_time_signature() csong@9: csong@19: def is_time_signature_valid(timeSignature, subdivisionSequence, beatLevel): csong@9: isValid = False csong@19: if ('/' not in timeSignature) or (not timeSignature.split('/')[0].isdigit()) or (not timeSignature.split('/')[1].isdigit()): csong@9: print 'Error: invalid time-signature. Please indicate in the form of fraction, e.g. 4/4, 6/8 or 3/4.' csong@19: elif subdivisionSequence != [s for s in subdivisionSequence if isinstance(s,int)]: csong@9: print 'Error: invalid subdivision sequence. Please indicate in the form of list of numbers, e.g [1,2,2,2,2].' csong@19: elif beatLevel >= len(subdivisionSequence): csong@9: print 'Error: beat-level exceeds the range of subdivision sequence list.' csong@9: else: csong@9: isValid = True csong@9: return isValid csong@9: csong@19: def write_time_signature(): csong@9: import cPickle as pickle csong@19: timeSigFile = open('TimeSignature.pkl', 'wb') csong@19: pickle.dump(timeSignatureBase, timeSigFile) csong@19: timeSigFile.close() csong@9: csong@19: def read_time_signature(): csong@9: import cPickle as pickle csong@19: timeSigFile = open('TimeSignature.pkl','rb') csong@19: data = pickle.load(timeSigFile) csong@9: return data csong@19: timeSigFile.close() csong@9: csong@19: def print_time_signature_base(): csong@19: data = read_time_signature() csong@19: for timeSignature, settings in data.items(): csong@19: print timeSignature, settings csong@9: csong@19: # def get_subdivision_seq(timeSignature): csong@19: # if timeSignature in readTimesig(): csong@19: # return timesigBase[timesig][0] csong@19: # else: csong@19: # print 'Error: the subdivision sequence for this time-signature is not defined.' csong@19: # return None csong@9: csong@19: # def get_beat_level(timesig): csong@19: # if timesig in readTimesig(): csong@19: # return timesigBase[timesig][1] csong@19: # else: csong@19: # print 'Error: the subdivision sequence for this time-signature is not defined.' csong@19: # return None