1
2
3
4
5
6
7
8
9
10 import common
11
12
13 module_debug=False
14
16 META_EVENT=0
17 SYSEX_EVENT=1
18 SYSEX1_EVENT=2
19 MIDI_EVENT=3
20 LAST_MIDI_EVENT=4
21 type_str=('Meta', 'SYSEX', 'SYSEX cont', 'MIDI', 'Last MIDI')
22
23 - def __init__(self, file, offset, last_cmd=None):
38
40 i=int(self.__f.GetByte(self.__ofs))
41 self.__ofs+=1
42 return i
43
48
50 t=0
51 b=self.__get_int()
52 while (b&0x80):
53 t=(t<<7)|(b&0x7f)
54 b=self.__get_int()
55 return (t<<7)|(b&0x7f)
56
66
79
81 if cmd&0x80:
82
83 i=cmd
84 self.__type=self.MIDI_EVENT
85 self.__param1=self.__get_int()
86 else:
87 i=last_cmd
88 self.__type=self.LAST_MIDI_EVENT
89 self.__param1=cmd
90 self.__cmd=(i&0xf0)>>4
91 self.__midi_channel=i&0x0f
92 if self.__cmd==0x0c or self.__cmd==0x0d:
93 self.__len=1
94 self.__param2=None
95 else:
96 self.__len=2
97 self.__param2=self.__get_int()
98
101 type=property(fget=__get_type)
102
104 return self.__time_delta
105 time_delta=property(fget=__get_time_delta)
106
108 return self.__total_len
109 total_len=property(fget=__get_total_len)
110
113 cmd=property(fget=__get_cmd)
114
116 return self.__midi_channel
117 midi_channel=property(fget=__get_midi_channel)
118
121 param_len=property(fget=__get_param_len)
122
124 return self.__param1, self.__param2
125 params=property(fget=__get_params)
126
128 if self.type==self.MIDI_EVENT or \
129 self.type==self.LAST_MIDI_EVENT:
130 return '0x%04x: %s cmd: 0x%x, Channel: %d, Len: %d'%\
131 (self.time_delta, self.type_str[self.type],
132 self.cmd, self.midi_channel, self.param_len)
133 else:
134 return '0x%04x: %s cmd: 0x%x, Len: %d'%\
135 (self.time_delta, self.type_str[self.type],
136 self.cmd, self.param_len)
137
140 self.__f=file
141 self.__ofs=offset
142 if module_debug:
143 print 'New Track @ ofs:', offset
144 if self.__f.GetBytes(self.__ofs, 4)!='MTrk':
145 raise TypeError, 'not an MIDI track'
146 self.__len=self.__f.GetMSBUint32(self.__ofs+4)
147 ofs=self.__ofs+8
148 ofs_end=ofs+self.__len
149 last_cmd=None
150 self.__time_delta=0
151 self.__mpqn=None
152 while ofs<ofs_end:
153 e=MIDIEvent(file, ofs, last_cmd)
154 if module_debug:
155 print e
156 ofs+=e.total_len
157 self.__time_delta+=e.time_delta
158 if e.type==e.META_EVENT:
159 if e.cmd==0x51:
160
161 p1, p2=e.params
162 self.__mpqn=(ord(p1[0])<<16)|(ord(p1[1])<<8)|ord(p1[2])
163 if e.type==e.MIDI_EVENT or e.type==e.LAST_MIDI_EVENT:
164 last_cmd=(e.cmd<<4)|e.midi_channel
165 else:
166 last_cmd=e.cmd
167 self.__total_len=ofs-self.__ofs
168 if module_debug:
169 print 'self.__ofs', self.__ofs+8, 'self.__len:', self.__len, 'ofs: ', ofs
170 print 'time delta:', self.__time_delta, 'MPQN: ', self.__mpqn
171
173 return self.__time_delta
174 time_delta=property(fget=__get_time_delta)
176 return self.__total_len
177 total_len=property(fget=__get_total_len)
180 mpqn=property(fget=__get_mpqn)
181
184 try:
185 self.__valid=False
186 self.__file=file_wraper
187 if self.__file.GetBytes(0, 4)!='MThd' or \
188 self.__file.GetMSBUint32(4)!=6:
189
190 return
191 self.__valid=True
192 self.__type=self.__file.GetMSBUint16(8)
193 self.__num_tracks=self.__file.GetMSBUint16(10)
194 self.__time_division=self.__file.GetMSBUint16(12)
195 self.__tracks=[]
196 self.__mpqn=2000000
197 file_ofs=14
198 time_delta=0
199 for i in range(self.__num_tracks):
200 trk=MIDITrack(self.__file, file_ofs)
201 self.__tracks.append(trk)
202 file_ofs+=trk.total_len
203 time_delta=max(time_delta, trk.time_delta)
204 if trk.mpqn is not None:
205 self.__mpqn=trk.mpqn
206 self.__duration=(self.__mpqn*time_delta/self.__time_division)/1000000.0
207 if module_debug:
208 print 'type:', self.__type
209 print 'time division:', self.__time_division
210 print 'num of tracks:', self.__num_tracks
211 print 'MPQN:', self.__mpqn
212 print 'longest time delta: ', time_delta
213 print 'duration:', self.__duration
214 except:
215 self.__valid=False
216
219 valid=property(fget=__get_valid)
220
223 type=property(fget=__get_type)
224
226 return self.__num_tracks
227 num_tracks=property(fget=__get_num_tracks)
228
230 return self.__duration
231 duration=property(fget=__get_duration)
232