diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2020-07-15 09:42:39 +0000 |
|---|---|---|
| committer | s-ol <s-ol@users.noreply.github.com> | 2020-07-15 09:42:39 +0000 |
| commit | 5c794916dcfecb6f54fdd28bbc1e119b596fce7f (patch) | |
| tree | df5bdeddeae5b7f6dd65e9f83187894cd320aaed | |
| parent | add vis field to Ops (diff) | |
| download | alive-5c794916dcfecb6f54fdd28bbc1e119b596fce7f.tar.gz alive-5c794916dcfecb6f54fdd28bbc1e119b596fce7f.zip | |
Op: vis method instead of field
| -rw-r--r-- | alv-lib/midi.moon | 9 | ||||
| -rw-r--r-- | alv-lib/time.moon | 27 | ||||
| -rw-r--r-- | alv/base/op.moon | 34 | ||||
| -rw-r--r-- | alv/builtins.moon | 12 | ||||
| -rw-r--r-- | alv/copilot/udp.moon | 2 |
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' |
