from .soundnode import SoundNode from .notes import * class Sonnum: def __init__(self, compiler): self.c = compiler self.nodes = [] # {order: name} self.properties = dict() # {k: v} def setup(self, endtick): endtick = self.sec(endtick) self.end = endtick self.endtick(endtick) self.left = self.relay() self.right = self.relay() self.left.act("setpos", 0, 0, self.left, None, [-0.3, 0, 0]) self.right.act("setpos", 0, 0, self.right, None, [0.3, 0, 0]) def add_node(self, name, freq_q): order = len(self.nodes) node = SoundNode(self, order, name) node.freq_q = freq_q self.nodes.append(node) return node def node_by_order(self, order): for node in self.nodes: if node.order == order: return node def g(self, k): return self.properties.get(k) def s(self, k, v): self.properties[k] = v def act(self, *args): self.c.add_activity(*args) def node(self, freq_q = 1): node = self.add_node("", freq_q) fakenode = SoundNode(self, freq_q, '') self.act('create', 0, 0, node, fakenode, []) return node def sec(self, seconds): return seconds * 44100 def note(self, note): return note_to_freq(note) def relay(self): node = self.add_node("", 0) self.act('create', 0, 0, node, None, []) self.act('relay', 0, self.g('endtick'), node, None, []) return node def endtick(self, endtick): self.act('endtick', 0, endtick, None, None, []) self.s('endtick', endtick) def wire(self, src_nodes, trg_nodes): if not isinstance(src_nodes, list): src_nodes = [src_nodes] if not isinstance(trg_nodes, list): trg_nodes = [trg_nodes] for src_node in src_nodes: for trg_node in trg_nodes: self.act('feed', 0, 0, src_node, trg_node, [0, 0]) def air(self, src_nodes, trg_nodes): if not isinstance(src_nodes, list): src_nodes = [src_nodes] if not isinstance(trg_nodes, list): trg_nodes = [trg_nodes] for src_node in src_nodes: for trg_node in trg_nodes: self.act('feed', 0, 0, src_node, trg_node, [0, 1]) def feed(self, src_nodes, src_pin, trg_nodes, trg_pin): if not isinstance(src_nodes, list): src_nodes = [src_nodes] if not isinstance(trg_nodes, list): trg_nodes = [trg_nodes] for src_node in src_nodes: for trg_node in trg_nodes: self.act('feed', 0, 0, src_node, trg_node, [src_pin, trg_pin])