class Sample(bin.Structure): title = bin.FixedLengthString(size=13, encoding='ascii', padding='\x00') size = bin.PositiveInteger(size=4) loop_start = bin.PositiveInteger(size=4, default_value=0) loop_end = bin.PositiveInteger(size=4, default_value=0xFFFFF) @property def data(self): index = self.get_parent().samples.index(self) return self.get_parent().sample_data[index] def __unicode__(self): return self.title
class Note(bin.PackedStructure): pitch = bin.PositiveInteger(size=6) sample = bin.PositiveInteger(size=6) volume = bin.PositiveInteger(size=4) command = bin.PositiveInteger(size=4) command_value = bin.PositiveInteger(size=4) @sample.getter def sample(self, index): return self.get_parent().samples[index] @sample.setter def sample(self, sample): return self.get_parent().samples.index(sample)
class Note(bin.PackedStructure): sample_hi = bin.PositiveInteger(size=4) period = bin.PositiveInteger(size=12) sample_lo = bin.PositiveInteger(size=4) effect = bin.PositiveInteger(size=12) @property def sample(self): index = self.sample_hi << 4 + self.sample_lo return self.get_parent().samples[index] @sample.setter def sample(self, sample): index = self.get_parent().samples.index(sample) self.sample_hi = index >> 4 self.sample_lo = index & 0xF
class _669(bin.File): marker = bin.FixedString('if') message = bin.List(bin.String(size=36, encoding='ascii', padding=' '), size=3) sample_count = bin.PositiveInteger(size=1, max_value=64) pattern_count = bin.PositiveInteger(size=1, max_value=128) restart_position = bin.PositiveInteger(size=1) pattern_order = bin.List(bin.PositiveInteger(size=1, max_value=128), size=128) pattern_tempos = bin.List(bin.PositiveInteger(size=1), size=128) pattern_breaks = bin.List(bin.PositiveInteger(size=1), size=128) samples = bin.List(Sample, size=sample_count) patterns = bin.List(Pattern, size=pattern_count) sample_data = bin.ByteString(size=bin.REMAINDER) @sample_data.getter def sample_data(self, data): offset = 0 output = [] for info in self.samples: output.append(data[offset:offset + info.size]) offset += info.size return output @sample_data.setter def sample_data(self, data_list): return ''.join(data_list) def __iter__(self): for index in self.pattern_order: yield self.patterns[index] def __unicode__(self): return self.message[0] class Options: endianness = bin.LittleEndian
class MOD(bin.File): channels = 4 title = bin.FixedLengthString(size=20) samples = bin.List(Sample, size=15) order_count = bin.PositiveInteger(size=1) restart_position = bin.PositiveInteger(size=1) pattern_order = bin.List(bin.PositiveInteger(size=1), size=128) marker = bin.FixedString('M.K.') patterns = bin.List(Pattern, size=lambda self: max(self.pattern_order) + 1) sample_data = bin.ByteString(size=bin.REMAINDER) @property def pattern_count(self): return max(self.order) + 1 @sample_data.getter def sample_data(self, data): offset = 0 output = [] for info in self.samples: output.append(data[offset:offset + info.size]) offset += info.size return output @sample_data.setter def sample_data(self, data_list): return ''.join(data_list) def __iter__(self): for index in self.pattern_order: yield self.patterns[index] def __unicode__(self): return self.title class Options: endianness = bin.BigEndian
class Sample(bin.Structure): name = bin.FixedLengthString(size=22) size = SampleLength(size=2) finetune = bin.SubStructure(FineTune) volume = bin.PositiveInteger(size=1) loop_start = SampleLength(size=2, default_value=0) loop_length = SampleLength(size=2, default_value=0) @property def loop_end(self): return self.loop_start + self.loop_length @property def data(self): index = self.get_parent().samples.index(self) return self.get_parent().sample_data[index] def __unicode__(self): return self.name