sonnum/pysonnum/activity.py

84 lines
No EOL
1.8 KiB
Python

import struct
OPCODES = {
'create': 0,
'pin': 1,
'endtick': 2,
'setpin': 3,
'relay': 4,
'bridge': 5,
'printstate': 9,
'setpos': 10,
'sine': 50,
'triangle': 51,
'square': 52,
'sawtooth': 53,
'skewsine': 54,
'pulse': 55,
'singenN': 100,
'setskew': 12,
'slidebasefreq': 15,
'slidegain': 16,
'slidephase': 17,
'slideskew': 18,
'slidepos': 19,
'fmsetup': 21,
'fm': 22,
'am': 23,
'mute': 24,
'whitenoise': 25,
'setadsrgain': 26,
'setadsrsustain': 27,
'adsr': 28,
}
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''