redone compiler
This commit is contained in:
parent
7562de0b6e
commit
60334da61c
5 changed files with 107 additions and 128 deletions
|
|
@ -1,6 +1,16 @@
|
||||||
import struct
|
import struct
|
||||||
from .instruction import OPCODES
|
|
||||||
|
|
||||||
|
OPCODES = {
|
||||||
|
|
||||||
|
'create': 0,
|
||||||
|
'wire': 1,
|
||||||
|
'air': 2,
|
||||||
|
'endtick': 3,
|
||||||
|
'relay': 4,
|
||||||
|
'setpos': 5,
|
||||||
|
'sine': 6,
|
||||||
|
}
|
||||||
|
|
||||||
class Activity:
|
class Activity:
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,12 @@
|
||||||
from .sonnum import Sonnum
|
from .sonnum import Sonnum
|
||||||
from .activity import Activity
|
from .activity import Activity
|
||||||
from .instruction import *
|
|
||||||
|
|
||||||
|
|
||||||
class SonnumCompiler:
|
class SonnumCompiler:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
||||||
self.sonnum = Sonnum() # {order: name}
|
self.sonnum = Sonnum(self) # {order: name}
|
||||||
self.activities = []
|
self.activities = []
|
||||||
|
|
||||||
def list_activities(self):
|
def list_activities(self):
|
||||||
|
|
@ -26,19 +25,9 @@ class SonnumCompiler:
|
||||||
|
|
||||||
a = Activity(self.sonnum, name, tick_start, tick_end, src_node, trg_node, operands)
|
a = Activity(self.sonnum, name, tick_start, tick_end, src_node, trg_node, operands)
|
||||||
self.activities.append(a)
|
self.activities.append(a)
|
||||||
|
|
||||||
def sanitize_operand(self, operand):
|
|
||||||
|
|
||||||
if operand.endswith('~sec'):
|
|
||||||
sec = operand[:-4]
|
|
||||||
return f'{sec}*44100'
|
|
||||||
|
|
||||||
try:
|
|
||||||
return str(float(operand))
|
|
||||||
except:
|
|
||||||
return str(operand)
|
|
||||||
|
|
||||||
def transpile_snm_to_py(self, snm_src):
|
def transpile_snm_to_py(self, snm_src):
|
||||||
|
return snm_src
|
||||||
|
|
||||||
py_src = []
|
py_src = []
|
||||||
|
|
||||||
|
|
@ -55,7 +44,7 @@ class SonnumCompiler:
|
||||||
|
|
||||||
if ln.endswith('*'):
|
if ln.endswith('*'):
|
||||||
|
|
||||||
name = ln[1:-1]
|
name = self.sanitize_operand(ln[1:-1])
|
||||||
ln = f"i_create_simple(self, self.sonnum, '{name}')"
|
ln = f"i_create_simple(self, self.sonnum, '{name}')"
|
||||||
|
|
||||||
elif ln.endswith('!'):
|
elif ln.endswith('!'):
|
||||||
|
|
@ -63,14 +52,9 @@ class SonnumCompiler:
|
||||||
ticklen = self.sanitize_operand(ln[1:-1])
|
ticklen = self.sanitize_operand(ln[1:-1])
|
||||||
ln = f"i_end_tick(self, self.sonnum, {ticklen})"
|
ln = f"i_end_tick(self, self.sonnum, {ticklen})"
|
||||||
|
|
||||||
elif ln.endswith('@@'):
|
|
||||||
|
|
||||||
name = ln[1:-2]
|
|
||||||
ln = f"i_create_accumulate(self, self.sonnum, '{name}')"
|
|
||||||
|
|
||||||
elif ln.endswith('@'):
|
elif ln.endswith('@'):
|
||||||
|
|
||||||
name = ln[1:-1]
|
name = self.sanitize_operand(ln[1:-1])
|
||||||
ln = f"i_create_relay(self, self.sonnum, '{name}')"
|
ln = f"i_create_relay(self, self.sonnum, '{name}')"
|
||||||
|
|
||||||
elif '=>' in ln:
|
elif '=>' in ln:
|
||||||
|
|
@ -115,6 +99,8 @@ class SonnumCompiler:
|
||||||
|
|
||||||
def run_transpiled_code(self, py_src):
|
def run_transpiled_code(self, py_src):
|
||||||
|
|
||||||
|
c = self
|
||||||
|
s = self.sonnum
|
||||||
exec(py_src)
|
exec(py_src)
|
||||||
|
|
||||||
def sort_activities(self):
|
def sort_activities(self):
|
||||||
|
|
|
||||||
|
|
@ -1,77 +0,0 @@
|
||||||
# Here, s stands for the sonnum object,
|
|
||||||
# c stands for compiler object
|
|
||||||
|
|
||||||
OPCODES = {
|
|
||||||
|
|
||||||
'create': 0,
|
|
||||||
'wire': 1,
|
|
||||||
'air': 2,
|
|
||||||
'endtick': 3,
|
|
||||||
'relay': 4,
|
|
||||||
'setpos': 5,
|
|
||||||
'sine': 6,
|
|
||||||
}
|
|
||||||
|
|
||||||
def i_create_simple(c, s, name):
|
|
||||||
# ;name*
|
|
||||||
|
|
||||||
node = s.add_node(name)
|
|
||||||
c.add_activity('create', 0, 0, node, None, [])
|
|
||||||
|
|
||||||
def i_create_relay(c, s, name):
|
|
||||||
# ;name@
|
|
||||||
|
|
||||||
node = s.add_node(name)
|
|
||||||
c.add_activity('create', 0, 0, node, None, [])
|
|
||||||
c.add_activity('relay', 0, s.g('endtick'), node, None, [])
|
|
||||||
|
|
||||||
|
|
||||||
def i_end_tick(c, s, endtick):
|
|
||||||
# ;endtick!
|
|
||||||
c.add_activity('endtick', 0, endtick, None, None, [])
|
|
||||||
s.s('endtick', endtick)
|
|
||||||
|
|
||||||
def i_wire(c, s, src_name, trg_name):
|
|
||||||
# ;name=>name
|
|
||||||
|
|
||||||
src_node = s.node_by_name(src_name)
|
|
||||||
trg_node = s.node_by_name(trg_name)
|
|
||||||
|
|
||||||
if src_node and trg_node:
|
|
||||||
c.add_activity('wire', 0, 0, src_node, trg_node, [])
|
|
||||||
|
|
||||||
def i_air(c, s, src_name, trg_name):
|
|
||||||
# ;name->name
|
|
||||||
|
|
||||||
src_node = s.node_by_name(src_name)
|
|
||||||
trg_node = s.node_by_name(trg_name)
|
|
||||||
|
|
||||||
if src_node and trg_node:
|
|
||||||
c.add_activity('air', 0, 0, src_node, trg_node, [])
|
|
||||||
|
|
||||||
def i_setpos(c, s, start_tick, end_tick, node_name, x, y, z):
|
|
||||||
|
|
||||||
node = s.node_by_name(node_name)
|
|
||||||
c.add_activity('setpos', start_tick, end_tick, node, None, [x, y, z])
|
|
||||||
|
|
||||||
def i_sine(c, s, start_tick, end_tick, node_name, freq, r_amp):
|
|
||||||
|
|
||||||
node = s.node_by_name(node_name)
|
|
||||||
c.add_activity('sine', start_tick, end_tick, node, None, [freq, r_amp])
|
|
||||||
|
|
||||||
def i_triangle(c, s, start_tick, end_tick, node_name, harmonics_q, freq, r_amp):
|
|
||||||
|
|
||||||
node = s.node_by_name(node_name)
|
|
||||||
c.add_activity('reset', 0, 0, node, None, [])
|
|
||||||
|
|
||||||
for i in range(0, int(harmonics_q)):
|
|
||||||
|
|
||||||
har_freq = freq*(i*2 + 1)
|
|
||||||
|
|
||||||
if i%2 == 0:
|
|
||||||
m = 1
|
|
||||||
else:
|
|
||||||
m = -1
|
|
||||||
|
|
||||||
c.add_activity('setfreq', start_tick, end_tick, node, None, [har_freq, m * r_amp / float((i*2 + 1)**2)])
|
|
||||||
|
|
||||||
|
|
@ -1,47 +1,79 @@
|
||||||
class SoundNode:
|
from .soundnode import SoundNode
|
||||||
|
|
||||||
def __init__(self, order, name):
|
|
||||||
|
|
||||||
self.order = order
|
|
||||||
self.name = name
|
|
||||||
self.properties = dict() # {k: v}
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return f'{self.order}:{self.name}'
|
|
||||||
|
|
||||||
def g(self, k):
|
|
||||||
return self.properties.get(k)
|
|
||||||
|
|
||||||
def s(self, k, v):
|
|
||||||
self.properties[k] = v
|
|
||||||
|
|
||||||
class Sonnum:
|
class Sonnum:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, compiler):
|
||||||
|
|
||||||
self.nodes = dict() # {order: name}
|
self.c = compiler
|
||||||
|
self.nodes = [] # {order: name}
|
||||||
self.properties = dict() # {k: v}
|
self.properties = dict() # {k: v}
|
||||||
|
|
||||||
def add_node(self, name):
|
def add_node(self, name):
|
||||||
|
|
||||||
order = len(self.nodes)
|
order = len(self.nodes)
|
||||||
self.nodes[name] = SoundNode(order, name)
|
node = SoundNode(self, order, name)
|
||||||
|
self.nodes.append(node)
|
||||||
|
|
||||||
return self.nodes[name]
|
return node
|
||||||
|
|
||||||
def node_by_name(self, name):
|
|
||||||
|
|
||||||
for order, node in self.nodes.items():
|
|
||||||
|
|
||||||
if node.name == name:
|
|
||||||
return node
|
|
||||||
|
|
||||||
def node_by_order(self, order):
|
def node_by_order(self, order):
|
||||||
|
|
||||||
return self.nodes.get(order)
|
for node in self.nodes:
|
||||||
|
if node.order == order:
|
||||||
|
return node
|
||||||
|
|
||||||
def g(self, k):
|
def g(self, k):
|
||||||
return self.properties.get(k)
|
return self.properties.get(k)
|
||||||
|
|
||||||
def s(self, k, v):
|
def s(self, k, v):
|
||||||
self.properties[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 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, [])
|
||||||
28
pysonnum/soundnode.py
Normal file
28
pysonnum/soundnode.py
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
class SoundNode:
|
||||||
|
|
||||||
|
def __init__(self, sonnum, order, name):
|
||||||
|
|
||||||
|
self.order = order
|
||||||
|
self.s = sonnum
|
||||||
|
self.c = sonnum.c
|
||||||
|
self.name = name
|
||||||
|
self.properties = dict() # {k: v}
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f'{self.order}:{self.name}'
|
||||||
|
|
||||||
|
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 setpos(self, start_tick, x, y, z):
|
||||||
|
self.act('setpos', start_tick, start_tick, self, None, [x, y, z])
|
||||||
|
|
||||||
|
def sine(self, start_tick, end_tick, freq, r_amp):
|
||||||
|
self.act('sine', start_tick, end_tick, self, None, [freq, r_amp])
|
||||||
|
|
||||||
Loading…
Add table
Reference in a new issue