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: L_max = 5 csong@9: csong@9: # {'key': time-signature} : csong@9: # {'value': [subdivision_seq, theoretical beat-level represented by index in the subdivision_seq list]} csong@9: timesigBase = { 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@9: csong@9: def addTimesig(timesig, subdivision_seq, beat_level): csong@9: if isTSValid(timesig,subdivision_seq,beat_level): csong@9: if timesig in timesigBase: csong@9: print 'This time-signature is existed already.' csong@9: else: csong@9: timesigBase[timesig] = [subdivision_seq, beat_level] csong@9: writeTimesig() csong@9: csong@9: def updateTimesig(timesig, subdivision_seq, beat_level): csong@9: if isTSValid(timesig,subdivision_seq,beat_level): csong@9: if timesig in timesigBase: csong@9: print 'Original settings for', timesig, ':',timesigBase[timesig] csong@9: timesigBase[timesig] = [subdivision_seq, beat_level] csong@9: print 'Changed into:',timesigBase[timesig] csong@9: writeTimesig() csong@9: csong@9: def isTSValid(timesig, subdivision_seq, beat_level): csong@9: isValid = False csong@9: if ('/' not in timesig) or (not timesig.split('/')[0].isdigit()) or (not timesig.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@9: elif subdivision_seq != [s for s in subdivision_seq 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@9: elif beat_level >= len(subdivision_seq): 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@9: def writeTimesig(): csong@9: import cPickle as pickle csong@9: timesigFile = open('TimeSignature.pkl', 'wb') csong@9: pickle.dump(timesigBase, timesigFile) csong@9: timesigFile.close() csong@9: csong@9: def readTimesig(): csong@9: import cPickle as pickle csong@9: timesigFile = open('TimeSignature.pkl','rb') csong@9: data = pickle.load(timesigFile) csong@9: return data csong@9: timesigFile.close() csong@9: csong@9: def viewTimesigBase(): csong@9: data = readTimesig() csong@9: for timesig, settings in data.items(): csong@9: print timesig, settings csong@9: csong@9: def set_L_max(number): csong@9: L_max = number csong@9: csong@9: def get_subdivision_seq(timesig): csong@9: if timesig in readTimesig(): csong@9: return timesigBase[timesig][0] csong@9: else: csong@9: print 'Error: the subdivision sequence for this time-signature is not defined.' csong@9: return None csong@9: csong@9: def get_beat_level(timesig): csong@9: if timesig in readTimesig(): csong@9: return timesigBase[timesig][1] csong@9: else: csong@9: print 'Error: the subdivision sequence for this time-signature is not defined.' csong@9: return None