Beispiel #1
0
    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
Beispiel #2
0
    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
Beispiel #3
0
    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