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'')
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)
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'))
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)
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)
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)
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'')
class ScriptCode(mrc.Block): instructions = mrc.ChunkField(LINGO_V4_MAP, 0x00, id_field=mrc.UInt8, id_enum=LingoV4, default_klass=Blank)
class Test( mrc.Block ): data = mrc.ChunkField( CHUNK_MAP, 0x00, stream_end=b'\x00', id_size=1 ) bonus = mrc.Bytes( mrc.EndOffset( 'data' ) )
class Outer(mrc.Block): CHUNK_MAP = {b'TEST': Inner} field = mrc.ChunkField(CHUNK_MAP, 0x00)