sonnum/pysonnum/instruction.py

83 lines
No EOL
1.9 KiB
Python

# 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_create_accumulate(c, s, name):
# ;name@
node = s.add_node(name)
c.add_activity('create', 0, 0, node, None, [])
c.add_activity('accumulate', 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)])