import struct OPCODES = { 'create': 0, 'wire': 1, 'air': 2, 'endtick': 3, 'relay': 4, 'setpos': 5, 'setbasefreq': 6, 'setgain': 7, 'setphase': 8, 'sine': 9, 'triangle': 10, 'square': 11, 'sawtooth': 12, 'setskew': 13, 'skewsine': 14, 'slidebasefreq': 15, 'slidegain': 16, 'slidephase': 17, 'slideskew': 18, 'slidepos': 19, 'pulse': 20, } class Activity: def __repr__(self): return f'{self.name.rjust(20)} | {OPCODES[self.name]} {self.tick_start} {self.tick_end} {self.src_node.order if self.src_node else 0} {self.trg_node.order if self.trg_node else 0} '+' '.join(str(op) for op in self.operands) def __init__(self, sonnum, name, tick_start, tick_end, src_node, trg_node, operands): self.sonnum = sonnum self.name = name self.tick_start = tick_start self.tick_end = tick_end self.src_node = src_node self.trg_node = trg_node self.operands = operands def to_bytes(self): if self.name in OPCODES: b_opcode = OPCODES[self.name].to_bytes(2, byteorder="big") b_tick_start = int(self.tick_start).to_bytes(4, byteorder="big") b_tick_end = int(self.tick_end).to_bytes(4, byteorder="big") if not self.src_node: b_src_node = b'\x00' * 2 else: b_src_node = self.src_node.order.to_bytes(2, byteorder="big") if not self.trg_node: b_trg_node = b'\x00' * 2 else: b_trg_node = self.trg_node.order.to_bytes(2, byteorder="big") b_operands = [struct.pack('>d', 0.0)] * 6 for i in range(0, 6): if len(self.operands) > i: b_operands[i] = struct.pack('>d', self.operands[i]) return b_opcode + b_tick_start + b_tick_end + b_src_node + b_trg_node + b''.join(b_operands) else: return b''