Пример #1
0
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
Пример #2
0
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)
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
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