csong@9
|
1
|
csong@13
|
2 from basic_functions import ceiling, string_to_sequence
|
csong@9
|
3
|
csong@13
|
4 import parameter_setter
|
csong@13
|
5 import rhythm_parser
|
csong@9
|
6
|
csong@9
|
7 class Note():
|
csong@9
|
8 def __init__(self, argstring):
|
csong@13
|
9 intlist = string_to_sequence(argstring)
|
csong@9
|
10 self.startTime = intlist[0]
|
csong@9
|
11 self.duration = intlist[1]
|
csong@9
|
12 self.velocity = intlist[2]
|
csong@9
|
13
|
csong@9
|
14 # toString()
|
csong@9
|
15
|
csong@9
|
16 # NoteSequence is a list of Note
|
csong@9
|
17 class NoteSequence(list):
|
csong@9
|
18 def __init__(self, noteSequenceString=None):
|
csong@9
|
19 if noteSequenceString!=None:
|
csong@9
|
20 self.string_to_note_sequence(noteSequenceString)
|
csong@9
|
21
|
csong@9
|
22 def string_to_note_sequence(self, noteSequenceString):
|
csong@13
|
23 noteSequenceString = rhythm_parser.discardSpaces(noteSequenceString)
|
csong@9
|
24 # try:
|
csong@9
|
25 # Turning "(1,2,3),(4,5,6),(7,8,9)" into ["1,2,3","4,5,6,","7,8,9"]
|
csong@9
|
26 listStrings = noteSequenceString[1:-1].split("),(")
|
csong@9
|
27 for localString in listStrings:
|
csong@9
|
28 self.append(Note(localString))
|
csong@9
|
29
|
csong@9
|
30 # toString()
|
csong@9
|
31
|
csong@9
|
32
|
csong@13
|
33 #print NoteSequence("(1,2,3),(4,5,6),(7,8,9)")
|
csong@13
|
34 class VelocitySequence(list):
|
csong@13
|
35 def __init__(self, noteSequenceString=None):
|
csong@13
|
36 if noteSequenceString!=None:
|
csong@13
|
37 self.string_to_note_sequence(noteSequenceString)
|
csong@9
|
38
|
csong@13
|
39 def string_to_note_sequence(self,inputString):
|
csong@13
|
40 self.extend(string_to_sequence(inputString))
|
csong@9
|
41
|
csong@9
|
42
|
csong@9
|
43 class BarList(list):
|
csong@9
|
44 def append(self,bar):
|
csong@9
|
45 if(len(self)>0):
|
csong@9
|
46 bar.set_previous_bar(self[-1])
|
csong@9
|
47 self[-1].set_next_bar(bar)
|
csong@9
|
48 super(BarList, self).append(bar)
|
csong@9
|
49
|
csong@9
|
50
|
csong@9
|
51
|
csong@13
|
52
|
csong@13
|
53
|
csong@9
|
54 class Bar:
|
csong@9
|
55
|
csong@9
|
56 def __init__(self, rhythmSequence, timeSignature, ticksPerQuarter=None, qpmTempo=None, nextBar=None, prevBar=None):
|
csong@9
|
57 if isinstance(rhythmSequence, NoteSequence):
|
csong@9
|
58 self.noteSequence = rhythmSequence
|
csong@9
|
59 self.velocitySequence = None
|
csong@9
|
60 elif isinstance(rhythmSequence, VelocitySequence):
|
csong@9
|
61 self.velocitySequence = rhythmSequence
|
csong@9
|
62 self.noteSequence = None
|
csong@9
|
63
|
csong@9
|
64 self.tpq = ticksPerQuarter
|
csong@9
|
65 self.qpm = qpmTempo
|
csong@18
|
66 self.timeSignature = TimeSignature(timeSignature)
|
csong@9
|
67 self.nextBar = nextBar
|
csong@9
|
68 self.prevBar = prevBar
|
csong@9
|
69
|
csong@9
|
70 def get_note_sequence(self):
|
csong@9
|
71 #if self.noteSequence==None:
|
csong@13
|
72 # self.noteSequence = velocity_sequence_to_notes(self.velocitySequence)
|
csong@9
|
73 return self.noteSequence
|
csong@9
|
74
|
csong@9
|
75 def get_velocity_sequence(self):
|
csong@9
|
76 if self.velocitySequence==None:
|
csong@13
|
77 self.velocitySequence = note_sequence_to_velocities(self.velocitySequence)
|
csong@9
|
78 return self.velocitySequence
|
csong@9
|
79
|
csong@9
|
80 def get_binary_sequence(self):
|
csong@9
|
81 return ceiling(self.get_velocity_sequence())
|
csong@9
|
82
|
csong@9
|
83 def get_next_bar(self):
|
csong@9
|
84 return self.nextBar
|
csong@9
|
85
|
csong@9
|
86 def get_previous_bar(self):
|
csong@9
|
87 return self.prevBar
|
csong@9
|
88
|
csong@9
|
89 def set_next_bar(self, bar):
|
csong@9
|
90 self.nextBar = bar
|
csong@9
|
91
|
csong@9
|
92 def set_previous_bar(self, bar):
|
csong@9
|
93 self.prevBar = bar
|
csong@9
|
94
|
csong@9
|
95 def get_subdivision_sequence(self):
|
csong@18
|
96 return self.timeSignature.get_subdivision_sequence()
|
csong@9
|
97
|
csong@9
|
98 def get_beat_level(self):
|
csong@20
|
99 return self.timeSignature.get_beat_level()
|
csong@9
|
100
|
csong@9
|
101 def get_time_signature(self):
|
csong@9
|
102 return self.timeSignature
|
csong@9
|
103
|
csong@9
|
104 def get_t_span(self):
|
csong@9
|
105 # return the length of a bar in time units
|
csong@9
|
106 return None # NEED TO IMPLEMENT
|
csong@9
|
107
|
csong@18
|
108 class TimeSignature():
|
csong@18
|
109 def __init__(self, inputString):
|
csong@20
|
110 if inputString in parameter_setter.read_time_signature():
|
csong@18
|
111 self.tsString = inputString
|
csong@18
|
112 else:
|
csong@18
|
113 print "Error: undefined time-signature ", inputString
|
csong@18
|
114 raise NullTimeSignatureError
|
csong@18
|
115
|
csong@18
|
116 def get_subdivision_sequence(self):
|
csong@20
|
117 return parameter_setter.timeSignatureBase[self.tsString][0]
|
csong@18
|
118
|
csong@18
|
119 def get_beat_level(self):
|
csong@20
|
120 return parameter_setter.timeSignatureBase[self.tsString][1]
|
csong@18
|
121
|
csong@18
|
122 def get_numerator(self):
|
csong@18
|
123 return int(self.tsString.split('/')[0])
|
csong@18
|
124
|
csong@18
|
125 def get_denominator(self):
|
csong@18
|
126 return int(self.tsString.split('/')[1])
|
csong@18
|
127
|
csong@18
|
128
|
csong@18
|
129
|