Пример #1
0
class VGM150(mrc.Block):
    magic = mrc.Const(mrc.Bytes(0x00, length=0x04, default=b'Vgm '), b'Vgm ')
    eof_offset = mrc.UInt32_LE(0x04)
    version = mrc.UInt32_LE(0x08)
    sn76489_clock = mrc.UInt32_LE(0x0c)
    ym2413_clock = mrc.UInt32_LE(0x10)
    gd3_offset = mrc.UInt32_LE(0x14)
    total_sample_count = mrc.UInt32_LE(0x18)
    loop_offset = mrc.UInt32_LE(0x1c)
    loop_sample_count = mrc.UInt32_LE(0x20)
    rate = mrc.UInt32_LE(0x24)
    sn76489_feedback = mrc.UInt16_LE(0x28)
    sn76489_shiftwidth = mrc.UInt8(0x2a)
    sn76489_flags = mrc.UInt8(0x2b)
    ym2612_clock = mrc.UInt32_LE(0x2c)
    ym2151_clock = mrc.UInt32_LE(0x30)
    vgm_data_offset_raw = mrc.UInt32_LE(0x34)
    header_extra = mrc.Bytes(0x38, length=0x08, default=b'\x00' * 8)

    @property
    def vgm_data_offset(self):
        if self.version >= 0x150:
            return self.vgm_data_offset_raw + 0x34
        return 0x40

    vgm_data = mrc.ChunkField(COMMAND_MAP,
                              mrc.Ref('vgm_data_offset'),
                              id_field=mrc.UInt8,
                              id_enum=Command,
                              default_klass=mrc.Unknown,
                              stream_end=b'\x66')
    extra = mrc.Bytes(mrc.EndOffset('vgm_data'), default=b'')
Пример #2
0
class VOC(mrc.Block):
    magic = mrc.Const(mrc.Bytes(0x00, length=0x14), b'Creative Voice File\x1a')
    header_size = mrc.UInt16_LE(0x14)
    version = mrc.Bytes(0x16, length=2)
    checksum = mrc.Bytes(0x18, length=2)

    chunks = mrc.ChunkField(VOC_CHUNK_MAP,
                            0x1a,
                            stream=True,
                            id_field=mrc.UInt8,
                            length_field=mrc.UInt24_LE,
                            stream_end=b'\x00')

    @property
    def audio_chunk(self):
        # TODO: this is pretty cheap theatrics
        test = [x for x in self.chunks if x.id == 1]
        if test:
            return test[0].obj
        return None

    def __init__(self, *args, **kwargs):
        self.audio = aud.Wave(self,
                              mrc.Ref('audio_chunk.data'),
                              channels=1,
                              sample_rate=mrc.Ref('audio_chunk.sample_rate'),
                              format_type=int,
                              field_size=mrc.Ref('audio_chunk.sample_width'),
                              signedness=mrc.Ref('audio_chunk.signedness'),
                              endian='little')
        super().__init__(*args, **kwargs)
Пример #3
0
 class Test(mrc.Block):
     data = mrc.ChunkField(CHUNK_MAP,
                           0x00,
                           stream_end=b'\xff',
                           id_field=mrc.UInt8,
                           length_field=mrc.UInt8,
                           fill=b'\x00')
     bonus = mrc.Bytes(mrc.EndOffset('data'))
Пример #4
0
class RIFXMap(mrc.Block):
    CHUNK_MAP = {}
    form_type = mrc.Bytes(0x00, length=4)
    stream = mrc.ChunkField(mrc.Ref('CHUNK_MAP'),
                            0x04,
                            id_field=mrc.UInt32_P,
                            length_field=mrc.UInt32_P,
                            alignment=2,
                            fill=b'',
                            default_klass=mrc.Unknown)
Пример #5
0
class World(mrc.Block):
    BLOCK_MAP = {
        b'HEAD': HEAD,
        b'ANIM': ANIM,
    }

    chunks = mrc.ChunkField(BLOCK_MAP,
                            0x00,
                            id_size=4,
                            length_field=mrc.UInt32_BE,
                            default_klass=mrc.Unknown)
Пример #6
0
class RIFF(mrc.Block):
    CHUNK_MAP = {}

    magic = mrc.Const(mrc.Bytes(0x00, length=4), b'RIFF')
    size = mrc.UInt32_LE(0x04)
    form_type = mrc.Bytes(0x08, length=4)
    stream = mrc.ChunkField(mrc.Ref('CHUNK_MAP'),
                            0x0c,
                            length=mrc.Ref('size'),
                            id_field=mrc.UInt32_BE,
                            length_field=mrc.UInt32_LE,
                            alignment=2,
                            default_klass=mrc.Unknown)
Пример #7
0
class MV93_V5(mrc.Block):
    _endian = 'big'
    CHUNK_MAP_CLASS = DirectorV5Map.CHUNK_MAP

    magic = mrc.Const(mrc.Bytes(0x00, length=4), b'RIFX')
    data_length = mrc.UInt32_P(0x04)
    magic2 = mrc.Const(mrc.Bytes(0x08, length=4), b'MV93')
    stream = mrc.ChunkField(CHUNK_MAP_CLASS,
                            0x0c,
                            stream=True,
                            id_field=mrc.UInt32_P,
                            length_field=mrc.UInt32_P,
                            default_klass=mrc.Unknown,
                            alignment=0x2,
                            fill=b'')
Пример #8
0
class ScriptCode(mrc.Block):
    instructions = mrc.ChunkField(LINGO_V4_MAP,
                                  0x00,
                                  id_field=mrc.UInt8,
                                  id_enum=LingoV4,
                                  default_klass=Blank)
Пример #9
0
 class Test( mrc.Block ):
     data = mrc.ChunkField( CHUNK_MAP, 0x00, stream_end=b'\x00', id_size=1 )
     bonus = mrc.Bytes( mrc.EndOffset( 'data' ) )
Пример #10
0
 class Outer(mrc.Block):
     CHUNK_MAP = {b'TEST': Inner}
     field = mrc.ChunkField(CHUNK_MAP, 0x00)