diff options
| author | s-ol <s+removethis@s-ol.nu> | 2022-02-04 16:11:29 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2025-03-02 14:24:49 +0000 |
| commit | 6b2a58f017529b0491ce7b639974f549a4f14889 (patch) | |
| tree | 126bada6853c060385a11d6c3b3bd557c322e8da | |
| parent | add Dummy AST node (diff) | |
| download | alive-6b2a58f017529b0491ce7b639974f549a4f14889.tar.gz alive-6b2a58f017529b0491ce7b639974f549a4f14889.zip | |
lib: use Op:update_out
| -rw-r--r-- | alv-lib/_midi.moon | 4 | ||||
| -rw-r--r-- | alv-lib/love.moon | 4 | ||||
| -rw-r--r-- | alv-lib/midi.moon | 7 | ||||
| -rw-r--r-- | alv-lib/osc.moon | 5 | ||||
| -rw-r--r-- | alv-lib/random.moon | 4 | ||||
| -rw-r--r-- | alv-lib/rhythm.moon | 4 | ||||
| -rw-r--r-- | alv-lib/time.moon | 64 | ||||
| -rw-r--r-- | alv-lib/util.moon | 2 | ||||
| -rw-r--r-- | alv-lib/vis.moon | 14 | ||||
| -rw-r--r-- | alv/base/op.moon | 9 | ||||
| -rw-r--r-- | alv/builtins.moon | 8 |
11 files changed, 48 insertions, 77 deletions
diff --git a/alv-lib/_midi.moon b/alv-lib/_midi.moon index fe70af9..6d665a5 100644 --- a/alv-lib/_midi.moon +++ b/alv-lib/_midi.moon @@ -81,10 +81,8 @@ class PortOp extends Op else error "no port opened" - if not @out or @out.type != type - @out = type\mk_sig! - @state or= {} + @update_out '~', type tick: => if @inputs.inp and @inputs.inp\dirty! diff --git a/alv-lib/love.moon b/alv-lib/love.moon index cb53d1a..ff0b55b 100644 --- a/alv-lib/love.moon +++ b/alv-lib/love.moon @@ -358,7 +358,7 @@ mouse_down = Constant.meta press: Input.hot COPILOT.mouse_presses release: Input.hot COPILOT.mouse_releases - @out or= T.bool\mk_sig false + @update_out '~', T.bool, false poll: => @@ -466,7 +466,7 @@ key_down = Constant.meta press: Input.hot COPILOT.key_presses release: Input.hot COPILOT.key_releases - @out or= T.bool\mk_sig false + @update_out '~', T.bool, false poll: => diff --git a/alv-lib/midi.moon b/alv-lib/midi.moon index 4d95163..d0bccf3 100644 --- a/alv-lib/midi.moon +++ b/alv-lib/midi.moon @@ -12,7 +12,6 @@ gate = Constant.meta pattern = -sig['midi/in'] + sig.num -sig.num setup: (inputs, scope) => { port, note, chan } = pattern\match inputs - @out or= T.bool\mk_sig! super port: Input.cold port or scope\get '*midi*' note: Input.hot note @@ -20,6 +19,8 @@ gate = Constant.meta internal: Input.hot T.bool\mk_sig! + @update_out '~', T.bool + poll: => { :port, :note, :chan, :internal } = @inputs @@ -54,7 +55,7 @@ trig = Constant.meta pattern = -sig['midi/in'] + sig.num -sig.num setup: (inputs, scope) => { port, note, chan } = pattern\match inputs - @out or= T.bang\mk_evt! + @out = T.bang\mk_evt! super port: Input.cold port or scope\get '*midi*' note: Input.cold note @@ -106,7 +107,7 @@ cc = Constant.meta internal: Input.hot T.bang\mk_evt! @state or= 0 - @out or= T.num\mk_sig apply_range @inputs.range, @state + @update_out '~', T.num, apply_range @inputs.range, @state poll: => { :port, :cc, :chan, :internal } = @inputs diff --git a/alv-lib/osc.moon b/alv-lib/osc.moon index a75c22f..e397544 100644 --- a/alv-lib/osc.moon +++ b/alv-lib/osc.moon @@ -1,4 +1,4 @@ -import Op, PureOp, Constant, SigStream, Input, T, sig, any from require 'alv.base' +import Op, PureOp, Constant, Input, T, sig, any from require 'alv.base' import new_message, add_item from require 'alv-lib._osc' import dns, udp from require 'socket' @@ -13,12 +13,13 @@ connect = Constant.meta value: class extends Op pattern = sig.str + sig.num setup: (inputs) => - @out or= SigStream T['udp/socket'] { host, port } = pattern\match inputs super host: Input.hot host port: Input.hot port + @update_out '~', T['udp/socket'] + tick: => { :host, :port } = @unwrap_all! ip = dns.toip host diff --git a/alv-lib/random.moon b/alv-lib/random.moon index 0345542..c0bf8c5 100644 --- a/alv-lib/random.moon +++ b/alv-lib/random.moon @@ -36,7 +36,7 @@ num = Constant.meta value: class extends Op new: (...) => super ... - @out or= T.num\mk_sig! + @update_out '~', T.num @state or @gen! gen: => @state = math.random! @@ -64,7 +64,7 @@ vec = (n) -> value: class extends Op new: (...) => super ... - @out or= typ\mk_sig! + @update_out '~', typ @state or @gen! gen: => @state = for i=1,n do math.random! diff --git a/alv-lib/rhythm.moon b/alv-lib/rhythm.moon index 2b92fdc..d59f797 100644 --- a/alv-lib/rhythm.moon +++ b/alv-lib/rhythm.moon @@ -50,7 +50,7 @@ When fed a num~ or num! stream, outputs a bang if the corresponding step is on." setup: (inputs) => { trig, n, k } = pattern\match inputs - @out or= T.bang\mk_evt! + @out = T.bang\mk_evt! if trig\type! == T.bang @state or= 1 @@ -95,7 +95,7 @@ When fed a num~ or num! stream, outputs a bang if the corresponding step is on." setup: (inputs) => { trig, steps } = pattern\match inputs - @out or= T.bang\mk_evt! + @out = T.bang\mk_evt! super trig: Input.hot trig diff --git a/alv-lib/time.moon b/alv-lib/time.moon index e0eecff..f8ec7a2 100644 --- a/alv-lib/time.moon +++ b/alv-lib/time.moon @@ -14,16 +14,14 @@ frame rate. - `fps` has to be a num= constant and defaults to `60` if omitted." value: class extends Op - new: (...) => - super ... - @out or= T.clock\mk_evt! - setup: (inputs) => fps = (-sig.num)\match inputs super fps: Input.cold fps or Constant.num 60 io: Input.hot T.bang\mk_evt! + @update_out '!', T.clock + poll: => time = monotime! @state or= time @@ -60,10 +58,6 @@ scale_time = Constant.meta and the stream be passed as a dynamic definition in `*clock*` instead. - `scale` should be a num~ stream." value: class extends Op - new: (...) => - super ... - @out or= T.clock\mk_evt! - pattern = -evt.clock + sig.num + -sig.str setup: (inputs, scope) => { clock, scale } = pattern\match inputs @@ -71,6 +65,8 @@ scale_time = Constant.meta clock: Input.hot clock or scope\get '*clock*' scale: Input.cold scale + @update_out '!', T.clock + tick: => { :clock, :scale } = @unwrap_all! @out\set {k, v*scale for k,v in pairs clock} @@ -90,11 +86,6 @@ lfo = Constant.meta - `'saw'` - `'tri'`" value: class extends Op - new: (...) => - super ... - @state or= 0 - @out or= T.num\mk_sig! - default_wave = Constant.str 'sin' pattern = -evt.clock + sig.num + -sig.str setup: (inputs, scope) => @@ -104,6 +95,9 @@ lfo = Constant.meta freq: Input.cold freq wave: Input.hot wave or default_wave + @state or= 0 + @update_out '~', T.num + tau = math.pi * 2 tick: => if tick = @inputs.clock! @@ -133,11 +127,6 @@ ramp = Constant.meta - `period` should be a num~ stream. - `max` should be a num~ stream and defaults to `period` if omitted." value: class extends Op - new: (...) => - super ... - @state or= 0 - @out or= T.num\mk_sig 0 - pattern = -evt.clock + sig.num + -sig.num setup: (inputs, scope) => { clock, period, max } = pattern\match inputs @@ -146,6 +135,9 @@ ramp = Constant.meta period: Input.cold period max: max and Input.cold max + @state or= 0 + @update_out '~', T.num, 0 + tick: => { :clock, :period, :max } = @unwrap_all! max or= period @@ -175,11 +167,6 @@ tick = Constant.meta - `period` should be a num~ stream. - returns a `num~` stream that increases by 1 every `period`." value: class extends Op - new: (...) => - super ... - @state or= { phase: 0, count: 0 } - @out or= T.num\mk_sig @state.count - pattern = -evt.clock + sig.num setup: (inputs, scope) => { clock, period } = pattern\match inputs @@ -187,6 +174,9 @@ tick = Constant.meta clock: Input.hot clock or scope\get '*clock*' period: Input.cold period + @state or= { phase: 0, count: 0 } + @update_out '~', T.num, @state.count + tick: => { :clock, :period } = @unwrap_all! return if period == 0 @@ -212,10 +202,6 @@ every = Constant.meta - `evt` can be a value of any type. It defaults to `bang`. - the return type will be an event stream with the same type as `evt`." value: class extends Op - new: (...) => - super ... - @state or= 0 - pattern = -evt.clock + sig.num + -sig! setup: (inputs, scope) => { clock, period, evt } = pattern\match inputs @@ -223,7 +209,9 @@ every = Constant.meta clock: Input.hot clock or scope\get '*clock*' period: Input.cold period evt: Input.cold evt or T.bang\mk_const true - @out = @inputs.evt\type!\mk_evt! + + @state or= 0 + @update_out '!', @inputs.evt\type! tick: => { :clock, :period, :evt } = @unwrap_all! @@ -263,12 +251,14 @@ Emits `evt1`, `evt2`, … as events with delays `delay0`, `delay1`, … in betwe setup: (inputs, scope) => { clock, first, steps } = pattern\match inputs - @out = steps[1].value\type!\mk_evt! table.insert steps, 1, { delay: first } + super clock: Input.hot clock or scope\get '*clock*' steps: [inputify step for step in *steps] + @update_out '!', steps[1].value\type! + tick: => if tick = @inputs.clock! @state.t += tick.dt @@ -344,10 +334,6 @@ Creates smooth transitions when `value` changes. - `rate` is a num~ or num= value." value: class extends Op - new: (...) => - super ... - @out = T.num\mk_sig! - pattern = -evt.clock + sig.num + any.num setup: (inputs, scope) => { clock, rate, value } = pattern\match inputs @@ -357,7 +343,7 @@ Creates smooth transitions when `value` changes. rate: Input.cold rate value: Input.cold value - @out\set @inputs.value! unless @.out! + @update_out '~', T.num, @inputs.value! tick: => { :clock, :rate, :value } = @unwrap_all! @@ -381,10 +367,6 @@ Delays incoming `evt`s by `delay`. - `evt` is a !-stream." value: class extends Op - new: (...) => - super ... - @state = {} - pattern = -evt.clock + any.num + any! setup: (inputs, scope) => { clock, delay, evt } = pattern\match inputs @@ -394,12 +376,10 @@ Delays incoming `evt`s by `delay`. delay: Input.cold delay evt: Input.hot evt - if @out and @out.type != @inputs.evt\type! - -- clear queue if type is not compatible + @state or= {} + if @update_out '!', @inputs.evt\type! @state = {} - @out = @inputs.evt\type!\mk_evt! - tick: => clock = @inputs.clock! if clock and #@state > 0 diff --git a/alv-lib/util.moon b/alv-lib/util.moon index 11c2c7e..55b0c4b 100644 --- a/alv-lib/util.moon +++ b/alv-lib/util.moon @@ -8,9 +8,9 @@ edge = Constant.meta value: class extends Op setup: (inputs) => - @out or= T.bang\mk_evt! value = sig.bool\match inputs super value: Input.hot value + @out = T.bang\mk_evt! tick: => now = @inputs.value! diff --git a/alv-lib/vis.moon b/alv-lib/vis.moon index 941f9e4..ea739de 100644 --- a/alv-lib/vis.moon +++ b/alv-lib/vis.moon @@ -17,16 +17,13 @@ Visualizes `val` as a bar with range `min, max`. if not max min, max = nil, min - @out = if val.result.metatype ~= '!' - val\type!\mk_sig! - else - val\type!\mk_evt! - super val: Input.hot val min: Input.cold min or Constant.num 0 max: Input.cold max or Constant.num 1 + @update_out val.result.metatype, val\type! + tick: => { :val, :min, :max } = @unwrap_all! delta = max - min @@ -57,15 +54,12 @@ Visualizes `val` as an RGB(A) color with each component in range `0 - range`. setup: (inputs, scope) => { val, max } = pattern\match inputs - @out = if val.result.metatype ~= '!' - val\type!\mk_sig! - else - val\type!\mk_evt! - super val: Input.hot val max: Input.cold max or Constant.num 1 + @update_out val.result.metatype, val\type! + tick: => { :val, :max } = @unwrap_all! @out\set val diff --git a/alv/base/op.moon b/alv/base/op.moon index e751145..4153a52 100644 --- a/alv/base/op.moon +++ b/alv/base/op.moon @@ -170,16 +170,13 @@ class Op -- @tparam Type type -- @tparam[opt] any val initial value update_out: (metatype, type, val) => - same_type = @out and @out.type == type - if same_type and @out.metatype == metatype + if @out and @out.type == type and @out.metatype == metatype -- we can just keep it. do nothing. - return - - -- prefer last value if applicable - val = same_type and @.out! or val + return false ResultType = if metatype == '!' then EvtStream else SigStream @out = ResultType type, val + true --- `\unwrap` all `Input`s in `@inputs` and return a table with the same -- shape. diff --git a/alv/builtins.moon b/alv/builtins.moon index 5fe5e99..622a59e 100644 --- a/alv/builtins.moon +++ b/alv/builtins.moon @@ -441,9 +441,9 @@ to_const = Constant.meta value: class extends Op setup: (inputs) => - super {} input = const!\match inputs - @out = input\type!\mk_const input.result! + super value: Input.hot input + @out = input.result to_sig = Constant.meta meta: @@ -492,7 +492,7 @@ to_evt = Constant.meta else super sig: Input.hot sig_ - @out = @inputs.sig\type!\mk_evt! + @update_out '!', @inputs.sig\type! tick: (setup) => return if setup @@ -514,7 +514,7 @@ In case of collisions, the event that comes first in the argument list wins." setup: (inputs) => values = pattern\match inputs super [Input.hot v for v in *values] - @out = @inputs[1]\type!\mk_evt! + @update_out '!', @inputs[1]\type! tick: => for input in *@inputs |
