aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2020-07-15 09:42:39 +0000
committers-ol <s-ol@users.noreply.github.com>2020-07-15 09:42:39 +0000
commit5c794916dcfecb6f54fdd28bbc1e119b596fce7f (patch)
treedf5bdeddeae5b7f6dd65e9f83187894cd320aaed
parentadd vis field to Ops (diff)
downloadalive-5c794916dcfecb6f54fdd28bbc1e119b596fce7f.tar.gz
alive-5c794916dcfecb6f54fdd28bbc1e119b596fce7f.zip
Op: vis method instead of field
-rw-r--r--alv-lib/midi.moon9
-rw-r--r--alv-lib/time.moon27
-rw-r--r--alv/base/op.moon34
-rw-r--r--alv/builtins.moon12
-rw-r--r--alv/copilot/udp.moon2
5 files changed, 53 insertions, 31 deletions
diff --git a/alv-lib/midi.moon b/alv-lib/midi.moon
index 30acc33..3f9eedd 100644
--- a/alv-lib/midi.moon
+++ b/alv-lib/midi.moon
@@ -80,7 +80,6 @@ cc = Constant.meta
range: Input.cold range or Constant.str 'uni'
@out or= T.num\mk_sig apply_range @inputs.range, 0
- @vis.bar = 0
tick: =>
{ :port, :cc, :chan, :range } = @inputs
@@ -88,8 +87,14 @@ cc = Constant.meta
if msg.status == 'control-change' and
(chan! == -1 or msg.chan == chan!) and
msg.a == cc!
+ @state = msg.b / 128
@out\set apply_range range, msg.b
- @vis.bar = msg.b / 127
+
+ vis: =>
+ {
+ type: 'bar'
+ bar: @state
+ }
{
:input
diff --git a/alv-lib/time.moon b/alv-lib/time.moon
index aeab467..85145b4 100644
--- a/alv-lib/time.moon
+++ b/alv-lib/time.moon
@@ -110,7 +110,12 @@ lfo = Constant.meta
when 'saw' then @state % 1
when 'tri' then math.abs (2*@state % 2) - 1
else error Error 'argument', "unknown wave type '#{wave}'"
- @vis.bar = @out!
+
+ vis: =>
+ {
+ type: 'bar'
+ bar: @.out!
+ }
ramp = Constant.meta
meta:
@@ -145,9 +150,14 @@ ramp = Constant.meta
while @state >= 1
@state -= 1
- @vis.bar = @state
@out\set @state * max
+ vis: =>
+ {
+ type: 'bar'
+ bar: @state
+ }
+
tick = Constant.meta
meta:
name: 'tick'
@@ -164,7 +174,6 @@ tick = Constant.meta
super ...
@state or= { phase: 0, count: 0 }
@out or= T.num\mk_sig @state.count
- @vis.onchange = true
pattern = -evt.clock + sig.num
setup: (inputs, scope) =>
@@ -181,6 +190,8 @@ tick = Constant.meta
@state.count += 1
@out\set @state.count
+ vis: => type: 'event'
+
every = Constant.meta
meta:
name: 'every'
@@ -231,7 +242,6 @@ Emits `evt1`, `evt2`, … as events with delays `delay0`, `delay1`, … in betwe
new: (...) =>
super ...
@state or= { i: 1, t: 0 }
- @vis.step = @state.i
pair = (sig! + sig.num)\named('value', 'delay')
pattern = -evt.clock + sig.num + pair*0
@@ -260,7 +270,6 @@ Emits `evt1`, `evt2`, … as events with delays `delay0`, `delay1`, … in betwe
if @state.t >= current.delay!
@state.t -= current.delay!
@state.i = 1 + (@state.i % #@inputs.steps)
- @vis.step = @state.i
change = true
else
break
@@ -268,6 +277,8 @@ Emits `evt1`, `evt2`, … as events with delays `delay0`, `delay1`, … in betwe
if current.value and (change or current.value\dirty!)
@out\set current.value!
+ vis: => step: @state.i
+
bang_seq = Constant.meta
meta:
name: 'bang-seq'
@@ -285,7 +296,6 @@ Emits `bang!`s with delays `delay0`, `delay1`, … in between.
super ...
@out = T.bang\mk_evt!
@state or= { i: 1, t: 0 }
- @vis.step = @state.i
pattern = -evt.clock + sig.num*0
setup: (inputs, scope) =>
@@ -305,13 +315,14 @@ Emits `bang!`s with delays `delay0`, `delay1`, … in between.
if @state.t >= current
@state.t -= current
@state.i = 1 + (@state.i % #@inputs.steps)
- @vis.step = @state.i
bang = true
else
break
if bang
- @out\set true
+ @out
+
+ vis: => step: @state.i\set true
{
:clock
diff --git a/alv/base/op.moon b/alv/base/op.moon
index 625e1a8..f20518d 100644
--- a/alv/base/op.moon
+++ b/alv/base/op.moon
@@ -3,6 +3,7 @@
--
-- @classmod Op
import deep_copy, deep_iter, deep_map from require 'alv.util'
+import T from require 'alv.type'
class Op
--- members
@@ -22,8 +23,7 @@ class Op
fork: =>
out = if @out then @out\fork!
state = if @state then deep_copy @state
- vis = if @vis then deep_copy @vis
- @@ out, state, vis
+ @@ out, state
--- internal state of this Op.
--
@@ -32,16 +32,6 @@ class Op
--
-- @tfield table state
- --- visualisation data of this Op.
- --
- -- This may be any simple Lua value, including Lua tables, as long as it has
- -- no metatables, multiple references/loops, userdata etc.
- --
- -- This value is exposed to alv editors in order to render realtime
- -- visualisations overlaid onto the program text.
- --
- -- @tfield table vis
-
--- `Result` instance representing this Op's computed output value.
--
-- Must be set to a `Result` instance once `setup` finishes. Must not change
@@ -105,6 +95,23 @@ class Op
--- called when the Op is destroyed (optional).
destroy: =>
+ --- collect visualisation data (optional).
+ --
+ -- This may return any simple Lua value, including Lua tables, as long as it
+ -- has no metatables, multiple references/loops, userdata etc.
+ --
+ -- This value is exposed to alv editors in order to render realtime
+ -- visualisations overlaid onto the program text.
+ --
+ -- @treturn table vis
+ vis: =>
+ if @out and @out.metatype == '!'
+ { type: 'event' }
+ elseif @out and @out.type == T.bool
+ { type: 'bool' }
+ else
+ {}
+
--- implementation utilities.
--
-- super-methods and utilities for use by implementations.
@@ -118,8 +125,7 @@ class Op
-- @classmethod
-- @tparam ?Result out `out`
-- @tparam ?table state `state`
- -- @tparam ?table vis `vis`
- new: (@out, @state, @vis={}) =>
+ new: (@out, @state) =>
do_setup = (old, cur) ->
for k, cur_val in pairs cur
diff --git a/alv/builtins.moon b/alv/builtins.moon
index 12e78ba..d5d729c 100644
--- a/alv/builtins.moon
+++ b/alv/builtins.moon
@@ -309,8 +309,6 @@ switch_ = Constant.meta
if i\type! == T.bang
@state or= 1
- else
- @state = nil
super
i: Input.hot i
@@ -319,20 +317,22 @@ switch_ = Constant.meta
tick: =>
{ :i, :values } = @inputs
- ii = if i\type! == T.bang
+ if i\type! == T.bang
if i\dirty!
@state += 1
while @state >= #values
@state -= #values
@state
else
- switch i!
+ @state = switch i!
when true then 0
when false then 1
else (math.floor i!) % #values
+ @state
+
+ @out\set if v = values[@state + 1] then v!
- @vis.step = ii
- @out\set if v = values[ii + 1] then v!
+ vis: => step: @state
trace_ = Constant.meta
meta:
diff --git a/alv/copilot/udp.moon b/alv/copilot/udp.moon
index 5bf2ad4..7058b40 100644
--- a/alv/copilot/udp.moon
+++ b/alv/copilot/udp.moon
@@ -45,7 +45,7 @@ class UDPServer
if builtin and builtin.__class.__name ~= 'DummyReg'
res.head_meta = builtin.head.meta
res.result = encode_res builtin.node.result
- res.vis = if builtin.op then builtin.op.vis
+ res.vis = if builtin.op then builtin.op\vis!
res.kind = switch builtin.__class
when op_invoke then 'op'
when fn_invoke then 'fn'