def parse(self, fp): """vsqファイルのマスタートラック部分をパースする Args: fp: vsqファイルポインタ or FakeFile インスタンス fpはマスタートラック部分までシークしておく必要がある """ #トラックチャンクヘッダの解析 data = { "MTrk": unpack(">4s", fp.read(4))[0], "size": unpack('>i', fp.read(4))[0], "metaevents": []} #MIDIイベントの解析 while True: dtime = tools.get_dtime(fp) midi = unpack('3B', fp.read(3)) mevent = { 'dtime': dtime, 'type': midi[1], 'len': midi[2], 'data': fp.read(midi[2])} data['metaevents'].append(mevent) t = mevent['type'] if t == 0x2f: # End of Trak break elif t == 0x51: # Tempo self.tempo = unpack('>I', '\x00' + mevent['data'])[0] elif t == 0x03: # Track Name self.name = mevent['data'] elif t == 0x58: # Beat self.beat = unpack('4b', mevent['data']) self.data = data
def parse(self, fp): """vsqファイルのマスタートラック部分をパースする Args: fp: vsqファイルポインタ or FakeFile インスタンス fpはマスタートラック部分までシークしておく必要がある """ # トラックチャンクヘッダの解析 data = { "MTrk": struct.unpack(">4s", fp.read(4))[0], "size": struct.unpack(">i", fp.read(4))[0], "metaevents": [], } # MIDIイベントの解析 while True: dtime = tools.get_dtime(fp) midi = struct.unpack("3B", fp.read(3)) mevent = {"dtime": dtime, "type": midi[1], "len": midi[2], "data": fp.read(midi[2])} data["metaevents"].append(mevent) t = mevent["type"] if t == 0x2F: # End of Trak break elif t == 0x51: # Tempo self.tempo = struct.unpack(">I", "\x00" + mevent["data"])[0] elif t == 0x03: # Track Name self.name = mevent["data"] elif t == 0x58: # Beat self.beat = struct.unpack("4b", mevent["data"]) self.data = data
def parse(self, fp): """vsqファイルのノーマルトラック部分をパースする Args: fp: vsqファイルポインタ or FakeFileインスタンス fpはノーマルトラックのところまでシークしておく必要がある """ #トラックチャンクヘッダの解析 data = { "MTrk": unpack(">4s", fp.read(4))[0], "size": unpack('>i', fp.read(4))[0], "text": '', "cc_data": []} #MIDIイベントの解析 while True: dtime = tools.get_dtime(fp) mevent = unpack('3B', fp.read(3)) if mevent[1] == 0x2f: data['eot'] = tools.dtime2binary(dtime) + '\xff\x2f\x00' break #Control Changeイベント if mevent[0] == 0xb0: data['cc_data'].append({'dtime': dtime, 'cc': mevent}) else: #TrackNameイベント if mevent[1] == 0x03: data['name'] = fp.read(mevent[2]) #Textイベント elif mevent[1] == 0x01: fp.read(8) # skip "DM:xxxx:" data['text'] += fp.read(mevent[2] - 8) data.update(self.__parse_text(data['text'])) anotes, singers = self.__pack_events(data['Events'], data['Details']) self.data = data self.anotes = anotes self.singers = singers