|
csong@9
|
1 '''
|
|
csong@9
|
2 Author: Chunyang Song
|
|
csong@9
|
3 Institution: Centre for Digital Music, Queen Mary University of London
|
|
csong@9
|
4 '''
|
|
csong@9
|
5
|
|
csong@9
|
6 # Set the parameters: subdivision_seq, weight_seq, L_max, strong_beat_level
|
|
csong@9
|
7
|
|
csong@9
|
8 # {'key': time-signature} :
|
|
csong@9
|
9 # {'value': [subdivision_seq, theoretical beat-level represented by index in the subdivision_seq list]}
|
|
csong@19
|
10 timeSignatureBase = {
|
|
csong@20
|
11 '2/2': [[1,2,2,2,2,2],1],
|
|
csong@20
|
12 '3/2': [[1,3,2,2,2,2],1],
|
|
csong@20
|
13 '4/2': [[1,2,2,2,2,2],1],
|
|
csong@20
|
14 '2/4': [[1,2,2,2,2,2],1],
|
|
csong@20
|
15 '3/4': [[1,3,2,2,2,2],1],
|
|
csong@20
|
16 '4/4': [[1,2,2,2,2,2],2],
|
|
csong@20
|
17 '5/4': [[1,5,2,2,2,2],1],
|
|
csong@20
|
18 '7/4': [[1,7,2,2,2,2],1],
|
|
csong@20
|
19 '3/8': [[1,3,2,2,2,2],1],
|
|
csong@20
|
20 '5/8': [[1,5,2,2,2,2],1],
|
|
csong@20
|
21 '6/8': [[1,2,3,2,2,2],1],
|
|
csong@20
|
22 '9/8': [[1,3,3,2,2,2],1],
|
|
csong@20
|
23 '12/8':[[1,2,2,3,2,2],2],
|
|
csong@9
|
24 }
|
|
csong@9
|
25
|
|
csong@19
|
26 def add_time_signature(timeSignature, subdivisionSequence, beatLevel):
|
|
csong@19
|
27 if is_time_signature_valid(timeSignature,subdivisionSequence,beatLevel):
|
|
csong@19
|
28 if timeSignature in timesigBase:
|
|
csong@9
|
29 print 'This time-signature is existed already.'
|
|
csong@9
|
30 else:
|
|
csong@19
|
31 timeSignatureBase[timeSignature] = [subdivisionSequence, beatLevel]
|
|
csong@19
|
32 write_time_signature()
|
|
csong@9
|
33
|
|
csong@19
|
34 def update_time_signature(timeSignature, subdivisionSequence, beatLevel):
|
|
csong@19
|
35 if is_time_signature_valid(timeSignature,subdivisionSequence,beatLevel):
|
|
csong@19
|
36 if timeSignature in timeSignatureBase:
|
|
csong@19
|
37 print 'Original settings for ', timeSignature, ':',timeSignatureBase[timeSignature]
|
|
csong@19
|
38 timeSignatureBase[timeSignature] = [subdivisionSequence, beatLevel]
|
|
csong@19
|
39 print 'Changed into:',timeSignatureBase[timeSignature]
|
|
csong@19
|
40 write_time_signature()
|
|
csong@9
|
41
|
|
csong@19
|
42 def is_time_signature_valid(timeSignature, subdivisionSequence, beatLevel):
|
|
csong@9
|
43 isValid = False
|
|
csong@19
|
44 if ('/' not in timeSignature) or (not timeSignature.split('/')[0].isdigit()) or (not timeSignature.split('/')[1].isdigit()):
|
|
csong@9
|
45 print 'Error: invalid time-signature. Please indicate in the form of fraction, e.g. 4/4, 6/8 or 3/4.'
|
|
csong@19
|
46 elif subdivisionSequence != [s for s in subdivisionSequence if isinstance(s,int)]:
|
|
csong@9
|
47 print 'Error: invalid subdivision sequence. Please indicate in the form of list of numbers, e.g [1,2,2,2,2].'
|
|
csong@19
|
48 elif beatLevel >= len(subdivisionSequence):
|
|
csong@9
|
49 print 'Error: beat-level exceeds the range of subdivision sequence list.'
|
|
csong@9
|
50 else:
|
|
csong@9
|
51 isValid = True
|
|
csong@9
|
52 return isValid
|
|
csong@9
|
53
|
|
csong@19
|
54 def write_time_signature():
|
|
csong@9
|
55 import cPickle as pickle
|
|
csong@19
|
56 timeSigFile = open('TimeSignature.pkl', 'wb')
|
|
csong@19
|
57 pickle.dump(timeSignatureBase, timeSigFile)
|
|
csong@19
|
58 timeSigFile.close()
|
|
csong@9
|
59
|
|
csong@19
|
60 def read_time_signature():
|
|
csong@9
|
61 import cPickle as pickle
|
|
csong@19
|
62 timeSigFile = open('TimeSignature.pkl','rb')
|
|
csong@19
|
63 data = pickle.load(timeSigFile)
|
|
csong@9
|
64 return data
|
|
csong@19
|
65 timeSigFile.close()
|
|
csong@9
|
66
|
|
csong@19
|
67 def print_time_signature_base():
|
|
csong@19
|
68 data = read_time_signature()
|
|
csong@19
|
69 for timeSignature, settings in data.items():
|
|
csong@19
|
70 print timeSignature, settings
|
|
csong@9
|
71
|
|
csong@19
|
72 # def get_subdivision_seq(timeSignature):
|
|
csong@19
|
73 # if timeSignature in readTimesig():
|
|
csong@19
|
74 # return timesigBase[timesig][0]
|
|
csong@19
|
75 # else:
|
|
csong@19
|
76 # print 'Error: the subdivision sequence for this time-signature is not defined.'
|
|
csong@19
|
77 # return None
|
|
csong@9
|
78
|
|
csong@19
|
79 # def get_beat_level(timesig):
|
|
csong@19
|
80 # if timesig in readTimesig():
|
|
csong@19
|
81 # return timesigBase[timesig][1]
|
|
csong@19
|
82 # else:
|
|
csong@19
|
83 # print 'Error: the subdivision sequence for this time-signature is not defined.'
|
|
csong@19
|
84 # return None
|