94 lines
No EOL
1.8 KiB
Python
94 lines
No EOL
1.8 KiB
Python
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):
|
|
|
|
self.end = endtick
|
|
self.endtick(endtick)
|
|
|
|
self.left = self.relay()
|
|
self.right = self.relay()
|
|
|
|
self.left.setpos(0, -0.3, 0, 0)
|
|
self.right.setpos(0, 0.3, 0, 0)
|
|
|
|
def add_node(self, name):
|
|
|
|
order = len(self.nodes)
|
|
node = SoundNode(self, order, name)
|
|
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):
|
|
|
|
node = self.add_node("")
|
|
self.act('create', 0, 0, node, None, [])
|
|
|
|
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("")
|
|
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('wire', 0, 0, src_node, trg_node, [])
|
|
|
|
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('air', 0, 0, src_node, trg_node, []) |