sonnum/pysonnum/sonnum.py
2025-09-17 16:19:02 +03:00

106 lines
No EOL
2.2 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('pin', 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('pin', 0, 0, src_node, trg_node, [0, 1])
def pin(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('pin', 0, 0, src_node, trg_node, [src_pin, trg_pin])