diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2020-05-09 14:49:08 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2025-03-02 14:23:21 +0000 |
| commit | 61eb86951287667ca0ee305baa5c3cd6ad29ba36 (patch) | |
| tree | 7551d6b9c8af01c049adab0ee027dbad68f28808 /alv-lib | |
| parent | more internal doc fixes (diff) | |
| download | alive-61eb86951287667ca0ee305baa5c3cd6ad29ba36.tar.gz alive-61eb86951287667ca0ee305baa5c3cd6ad29ba36.zip | |
add types.T, fix spec + docs
Diffstat (limited to 'alv-lib')
| -rw-r--r-- | alv-lib/logic.moon | 24 | ||||
| -rw-r--r-- | alv-lib/math.moon | 53 | ||||
| -rw-r--r-- | alv-lib/midi.moon | 22 | ||||
| -rw-r--r-- | alv-lib/midi/core.moon | 14 | ||||
| -rw-r--r-- | alv-lib/midi/launchctl.moon | 22 | ||||
| -rw-r--r-- | alv-lib/osc.moon | 10 | ||||
| -rw-r--r-- | alv-lib/pilot.moon | 8 | ||||
| -rw-r--r-- | alv-lib/random.moon | 23 | ||||
| -rw-r--r-- | alv-lib/sc.moon | 6 | ||||
| -rw-r--r-- | alv-lib/string.moon | 6 | ||||
| -rw-r--r-- | alv-lib/time.moon | 42 | ||||
| -rw-r--r-- | alv-lib/util.moon | 22 |
12 files changed, 129 insertions, 123 deletions
diff --git a/alv-lib/logic.moon b/alv-lib/logic.moon index 3c893df..c3cc66f 100644 --- a/alv-lib/logic.moon +++ b/alv-lib/logic.moon @@ -1,4 +1,4 @@ -import Op, ValueStream, Input, Error, val from require 'alv.base' +import Op, SigStream, Constant, Input, Error, T, val from require 'alv.base' all_same = (first, list) -> for v in *list @@ -17,7 +17,7 @@ tobool = (val) -> class ReduceOp extends Op pattern = val! + val! * 0 setup: (inputs) => - @out or= ValueStream 'bool' + @out or= SigStream T.bool { first, rest } = pattern\match inputs super first: Input.hot first @@ -31,7 +31,7 @@ class ReduceOp extends Op @out\set accum -eq = ValueStream.meta +eq = Constant.meta meta: name: 'eq' summary: "Check for equality." @@ -41,7 +41,7 @@ eq = ValueStream.meta value: class extends Op pattern = val! + val! * 0 setup: (inputs) => - @out or= ValueStream 'bool', false + @out or= SigStream T.bool, false { first, rest } = pattern\match inputs same = all_same first\type!, [i\type! for i in *rest] @@ -68,7 +68,7 @@ eq = ValueStream.meta @out\set equal -not_eq = ValueStream.meta +not_eq = Constant.meta meta: name: 'not-eq' summary: "Check for inequality." @@ -77,7 +77,7 @@ not_eq = ValueStream.meta value: class extends Op setup: (inputs) => - @out or= ValueStream 'bool', false + @out or= SigStream T.bool, false assert #inputs > 1, Error 'argument', "need at least two values" super [Input.hot v for v in *inputs] @@ -97,7 +97,7 @@ not_eq = ValueStream.meta @out\set diff -and_ = ValueStream.meta +and_ = Constant.meta meta: name: 'and' summary: "Logical AND." @@ -105,7 +105,7 @@ and_ = ValueStream.meta value: class extends ReduceOp fn: (a, b) -> a and b -or_ = ValueStream.meta +or_ = Constant.meta meta: name: 'or' summary: "Logical OR." @@ -113,7 +113,7 @@ or_ = ValueStream.meta value: class extends ReduceOp fn: (a, b) -> a or b -not_ = ValueStream.meta +not_ = Constant.meta meta: name: 'not' summary: "Logical NOT." @@ -121,14 +121,14 @@ not_ = ValueStream.meta value: class extends Op setup: (inputs) => - @out or= ValueStream 'bool', false + @out or= SigStream T.bool, false value = val!\match inputs super value: Input.hot value tick: => @out\set not tobool @inputs.value! -bool = ValueStream.meta +bool = Constant.meta meta: name: 'bool' summary: "Cast value to bool." @@ -137,7 +137,7 @@ bool = ValueStream.meta value: class extends Op setup: (inputs) => - @out or= ValueStream 'bool' + @out or= SigStream T.bool value = val!\match inputs super value: Input.hot value diff --git a/alv-lib/math.moon b/alv-lib/math.moon index 2cf8e5d..8037e8a 100644 --- a/alv-lib/math.moon +++ b/alv-lib/math.moon @@ -1,10 +1,10 @@ -import Op, ValueStream, Error, Input, val from require 'alv.base' +import Op, Constant, SigStream, Error, Input, T, val from require 'alv.base' unpack or= table.unpack class ReduceOp extends Op pattern = val.num + val.num*0 setup: (inputs) => - @out or= ValueStream 'num' + @out or= SigStream T.num { first, rest } = pattern\match inputs super first: Input.hot first @@ -21,14 +21,16 @@ func_op = (func, pattern) -> class extends Op setup: (inputs) => - @out or= ValueStream 'num' + @out or= SigStream T.num + params = pattern\match inputs super [Input.hot p for p in *params] + tick: => @out\set func unpack @unwrap_all! func_def = (name, args, func, summary, pattern) -> - ValueStream.meta + Constant.meta meta: :name :summary @@ -39,17 +41,17 @@ evenodd_op = (remainder) -> class extends Op pattern = val.num + -val.num setup: (inputs) => - @out or= ValueStream 'bool' + @out or= SigStream T.bool { val, div } = pattern\match inputs super val: Input.hot val - div: Input.hot div or ValueStream.num 2 + div: Input.hot div or SigStream.num 2 tick: => { :val, :div } = @unwrap_all! @out\set (val % div) == remainder -add = ValueStream.meta +add = Constant.meta meta: name: 'add' summary: "Add values." @@ -58,7 +60,7 @@ add = ValueStream.meta value: class extends ReduceOp fn: (a, b) -> a + b -sub = ValueStream.meta +sub = Constant.meta meta: name: 'sub' summary: "Subtract values." @@ -67,7 +69,7 @@ sub = ValueStream.meta value: class extends ReduceOp fn: (a, b) -> a - b -mul = ValueStream.meta +mul = Constant.meta meta: name: 'mul' summary: "Multiply values." @@ -75,7 +77,7 @@ mul = ValueStream.meta value: class extends ReduceOp fn: (a, b) -> a * b -div = ValueStream.meta +div = Constant.meta meta: name: 'div' summary: "Divide values." @@ -84,7 +86,7 @@ div = ValueStream.meta value: class extends ReduceOp fn: (a, b) -> a / b -pow = ValueStream.meta +pow = Constant.meta meta: name: 'pow' summary: "Raise to a power." @@ -93,7 +95,7 @@ pow = ValueStream.meta value: class extends ReduceOp fn: (a, b) -> a ^ b -mod = ValueStream.meta +mod = Constant.meta meta: name: 'mod' summary: 'Modulo operator.' @@ -101,7 +103,7 @@ mod = ValueStream.meta description: "Calculate remainder of division by `div`." value: func_op ((a, b) -> a % b), val.num + val.num -even = ValueStream.meta +even = Constant.meta meta: name: 'even' summary: 'Check whether val is even.' @@ -110,7 +112,7 @@ even = ValueStream.meta `div` defaults to 2." value: evenodd_op 0 -odd = ValueStream.meta +odd = Constant.meta meta: name: 'odd' summary: 'Check whether val is odd.' @@ -119,7 +121,7 @@ odd = ValueStream.meta `div` defaults to 2." value: evenodd_op 1 -mix = ValueStream.meta +mix = Constant.meta meta: name: 'mix' summary: 'Linearly interpolate.' @@ -127,7 +129,7 @@ mix = ValueStream.meta description: "Interpolate between `a` and `b` using `i` in range 0-1." value: func_op ((a, b, i) -> i*b + (1-i)*a), val.num + val.num + val.num -min = ValueStream.meta +min = Constant.meta meta: name: 'min' summary: "Find the minimum." @@ -135,7 +137,7 @@ min = ValueStream.meta description: "Return the lowest of arguments." value: func_op math.min, val.num*0 -max = ValueStream.meta +max = Constant.meta meta: name: 'max' summary: "Find the maximum." @@ -176,12 +178,17 @@ sqrt = func_def 'sqrt', 'val', math.sqrt, "Square root function." :mix :min, :max - pi: with ValueStream.wrap math.pi - .meta = summary: 'The pi constant.' - tau: with ValueStream.wrap math.pi*2 - .meta = summary: 'The tau constant.' - huge: with ValueStream.wrap math.huge - .meta = summary: 'Positive infinity constant.' + pi: Constant.meta + value: math.pi + meta: summary: 'The pi constant.' + + tau: Constant.meta + value: math.pi*2 + meta: summary: 'The tau constant.' + + huge: Constant.meta + value: math.huge + meta: summary: 'Positive infinity constant.' :sin, :cos, :tan :asin, :acos, :atan, :atan2 diff --git a/alv-lib/midi.moon b/alv-lib/midi.moon index 88d9547..e3bbe01 100644 --- a/alv-lib/midi.moon +++ b/alv-lib/midi.moon @@ -1,7 +1,7 @@ -import ValueStream, EventStream, Op, Input, val, evt from require 'alv.base' +import Constant, Op, Input, T, val, evt from require 'alv.base' import input, output, inout, apply_range from require 'alv-lib.midi.core' -gate = ValueStream.meta +gate = Constant.meta meta: name: 'gate' summary: "gate from note-on and note-off messages." @@ -10,12 +10,12 @@ gate = ValueStream.meta value: class extends Op pattern = -evt['midi/port'] + val.num -val.num setup: (inputs, scope) => - @out or= ValueStream 'bool' + @out or= T.bool\mk_sig! { port, note, chan } = pattern\match inputs super port: Input.hot port or scope\get '*midi*' note: Input.hot note - chan: Input.hot chan or ValueStream.num -1 + chan: Input.hot chan or Constant.num -1 tick: => { :port, :note, :chan } = @inputs @@ -31,7 +31,7 @@ gate = ValueStream.meta elseif msg.status == 'note-off' @out\set false -trig = ValueStream.meta +trig = Constant.meta meta: name: 'trig' summary: "`bang`s from note-on messages." @@ -40,12 +40,12 @@ trig = ValueStream.meta value: class extends Op pattern = -evt['midi/port'] + val.num -val.num setup: (inputs, scope) => - @out or= EventStream 'bang' + @out or= T.bang\mk_evt! { port, note, chan } = pattern\match inputs super port: Input.hot port or scope\get '*midi*' note: Input.cold note - chan: Input.cold chan or ValueStream.num -1 + chan: Input.cold chan or Constant.num -1 tick: => { :port, :note, :chan } = @inputs @@ -55,7 +55,7 @@ trig = ValueStream.meta if msg.status == 'note-on' @out\add true -cc = ValueStream.meta +cc = Constant.meta meta: name: 'cc' summary: "`num` from cc-change messages." @@ -76,10 +76,10 @@ cc = ValueStream.meta super port: Input.hot port or scope\get '*midi*' cc: Input.cold cc - chan: Input.cold chan or ValueStream.num -1 - range: Input.cold range or ValueStream.str 'uni' + chan: Input.cold chan or Constant.num -1 + range: Input.cold range or Constant.str 'uni' - @out or= ValueStream 'num', apply_range @inputs.range, 0 + @out or= T.num\mk_sig apply_range @inputs.range, 0 tick: => { :port, :cc, :chan, :range } = @inputs diff --git a/alv-lib/midi/core.moon b/alv-lib/midi/core.moon index 3adc401..71d1e9f 100644 --- a/alv-lib/midi/core.moon +++ b/alv-lib/midi/core.moon @@ -1,4 +1,4 @@ -import ValueStream, IOStream, Op, Input, Error, val from require 'alv.base' +import Constant, IOStream, Op, Input, T, Error, val from require 'alv.base' import RtMidiIn, RtMidiOut, RtMidi from require 'luartmidi' bit = do @@ -31,7 +31,7 @@ find_port = (Klass, name) -> \openport id class MidiPort extends IOStream - new: => super 'midi/port' + new: => super T['midi/port'] setup: (inp, out) => @inp = inp and find_port RtMidiIn, inp @@ -63,7 +63,7 @@ class PortOp extends Op { :inp, :out } = @unwrap_all! @out\setup inp, out -input = ValueStream.meta +input = Constant.meta meta: name: 'input' summary: "Create a MIDI input port." @@ -74,7 +74,7 @@ input = ValueStream.meta name = val.str\match inputs super inp: Input.hot name -output = ValueStream.meta +output = Constant.meta meta: name: 'output' summary: "Create a MIDI output port." @@ -85,7 +85,7 @@ output = ValueStream.meta name = val.str\match inputs super out: Input.hot name -inout = ValueStream.meta +inout = Constant.meta meta: name: 'inout' summary: "Create a bidirectional MIDI port." @@ -99,7 +99,7 @@ inout = ValueStream.meta out: Input.hot out apply_range = (range, val) -> - if range\type! == 'str' + if range\type! == T.str switch range! when 'raw' then val when 'uni' then val / 128 @@ -108,7 +108,7 @@ apply_range = (range, val) -> when 'deg' then val / 128 * 360 else error Error 'argument', "unknown range '#{range!}'" - elseif range.type == 'num' + elseif range.type == T.num val / 128 * range! else error Error 'argument', "range has to be a string or number" diff --git a/alv-lib/midi/launchctl.moon b/alv-lib/midi/launchctl.moon index 90e8956..3f47a5d 100644 --- a/alv-lib/midi/launchctl.moon +++ b/alv-lib/midi/launchctl.moon @@ -1,10 +1,10 @@ -import ValueStream, EventStream, Op, Input, val, evt from require 'alv.base' +import Constant, Op, Input, T, val, evt from require 'alv.base' import apply_range, bit from require 'alv-lib.midi.core' import bor, lshift from bit color = (r, g) -> bit.bor 12, r, (bit.lshift g, 4) -cc_seq = ValueStream.meta +cc_seq = Constant.meta meta: name: 'cc-seq' summary: "MIDI CC-Sequencer." @@ -32,11 +32,11 @@ range can be one of: i: Input.hot i start: Input.hot start chan: Input.hot chan - steps: Input.hot steps or ValueStream.num 8 - range: Input.hot range or ValueStream.str 'uni' + steps: Input.hot steps or Constant.num 8 + range: Input.hot range or Constant.str 'uni' @state or= {} - @out or= ValueStream 'num', apply_range @inputs.range, 0 + @out or= T.num\mk_sig apply_range @inputs.range, 0 tick: => { :port, :i, :start, :chan, :steps, :range } = @inputs @@ -60,7 +60,7 @@ range can be one of: else @out\set apply_range range, @state[curr_i+1] -gate_seq = ValueStream.meta +gate_seq = Constant.meta meta: name: 'gate-seq' summary: "MIDI Gate-Sequencer." @@ -72,7 +72,7 @@ Send `true` or `false` for the `i`-th note-button (MIDI-notes starting from value: class extends Op pattern = -evt['midi/port'] + val.num + val.num + val.num + -val.num setup: (inputs, scope) => - @out or= ValueStream 'bool' + @out or= T.bool\mk_sig! @state or= {} { port, i, start, chan, steps } = pattern\match inputs @@ -81,7 +81,7 @@ Send `true` or `false` for the `i`-th note-button (MIDI-notes starting from i: Input.hot i start: Input.hot start chan: Input.hot chan - steps: Input.hot steps or ValueStream.num 8 + steps: Input.hot steps or Constant.num 8 light = (set, active) -> set = if set then 'S' else ' ' @@ -123,7 +123,7 @@ Send `true` or `false` for the `i`-th note-button (MIDI-notes starting from @out\set @state[curr_i+1] -trig_seq = ValueStream.meta +trig_seq = Constant.meta meta: name: 'trig-seq' summary: "MIDI Trigger-Sequencer." @@ -135,7 +135,7 @@ Send bangs for the `i`-th note-button (MIDI-notes starting from `start`). value: class extends Op pattern = -evt['midi/port'] + val.num + val.num + val.num + -val.num setup: (inputs, scope) => - @out or= EventStream 'bang' + @out or= T.bang\mk_evt! @state or= {} { port, i, start, chan, steps } = pattern\match inputs @@ -144,7 +144,7 @@ Send bangs for the `i`-th note-button (MIDI-notes starting from `start`). i: Input.hot i start: Input.hot start chan: Input.hot chan - steps: Input.hot steps or ValueStream.num 8 + steps: Input.hot steps or Constant.num 8 light = (set, active) -> set = if set then 'S' else ' ' diff --git a/alv-lib/osc.moon b/alv-lib/osc.moon index b7e25e7..bbf07a1 100644 --- a/alv-lib/osc.moon +++ b/alv-lib/osc.moon @@ -1,10 +1,10 @@ -import Op, ValueStream, Input, val, evt from require 'alv.base' +import Op, Constant, SigStream, Input, T, val, evt from require 'alv.base' import pack from require 'osc' import dns, udp from require 'socket' unpack or= table.unpack -connect = ValueStream.meta +connect = Constant.meta meta: name: 'connect' summary: "Create a UDP remote." @@ -13,7 +13,7 @@ connect = ValueStream.meta value: class extends Op pattern = val.str + val.num setup: (inputs) => - @out or= ValueStream 'udp/socket' + @out or= SigStream T['udp/socket'] { host, port } = pattern\match inputs super host: Input.hot host @@ -26,7 +26,7 @@ connect = ValueStream.meta @out\set with sock = udp! \setpeername ip, port -send = ValueStream.meta +send = Constant.meta meta: name: 'send' summary: "Send events via OSC." @@ -52,7 +52,7 @@ send = ValueStream.meta msg = pack path, if 'table' == type val then unpack val else val socket\send msg -sync = ValueStream.meta +sync = Constant.meta meta: name: 'sync' summary: "Synchronize a value via OSC." diff --git a/alv-lib/pilot.moon b/alv-lib/pilot.moon index 0d6eefb..e2103c6 100644 --- a/alv-lib/pilot.moon +++ b/alv-lib/pilot.moon @@ -1,4 +1,4 @@ -import Op, ValueStream, Input, val, evt from require 'alv.base' +import Op, Constant, Input, val, evt from require 'alv.base' import udp from require 'socket' local conn @@ -22,7 +22,7 @@ send = (...) -> arg = val.num / val.str -play = ValueStream.meta +play = Constant.meta meta: name: 'play' summary: "Play a note when a bang arrives." @@ -41,7 +41,7 @@ play = ValueStream.meta for _ in *trig! send [a! for a in *@inputs.args] -play_ = ValueStream.meta +play_ = Constant.meta meta: name: 'play!' summary: "Play a note when a note arrives." @@ -63,7 +63,7 @@ play_ = ValueStream.meta for note in *note! send { chan!, octv!, note }, args -effect = ValueStream.meta +effect = Constant.meta meta: name: 'effect' summary: "Set effect parameters." diff --git a/alv-lib/random.moon b/alv-lib/random.moon index 8c4d096..a2e4c60 100644 --- a/alv-lib/random.moon +++ b/alv-lib/random.moon @@ -1,7 +1,7 @@ -import ValueStream, Error, Op, Input, val, evt from require 'alv.base' +import Constant, Error, Op, Input, T, Array, val, evt from require 'alv.base' apply_range = (range, val) -> - if range\type! == 'str' + if range\type! == T.str switch range! when 'uni' then val when 'bip' then val*2 - 1 @@ -9,7 +9,7 @@ apply_range = (range, val) -> when 'deg' then val * 360 else error Error 'argument', "unknown range '#{range!}'" - elseif range\type! == 'num' + elseif range\type! == T.num val * range! else error Error 'argument', "range has to be a string or number" @@ -24,7 +24,7 @@ range can be one of: pattern = -evt.bang + -(val.num / val.str) -num = ValueStream.meta +num = Constant.meta meta: name: 'num' summary: 'Generate a random number.' @@ -35,7 +35,7 @@ num = ValueStream.meta value: class extends Op new: (...) => super ... - @out or= ValueStream 'num' + @out or= T.num\mk_sig! @state or @gen! gen: => @state = math.random! @@ -44,25 +44,26 @@ num = ValueStream.meta { trig, range } = pattern\match inputs super trig: trig and Input.hot trig - range: Input.hot range or ValueStream.str 'uni' + range: Input.hot range or Constant.str 'uni' tick: => @gen! if @inputs.trig and @inputs.trig\dirty! @out\set apply_range @inputs.range, @state vec = (n) -> - ValueStream.meta + typ = Array n, T.num + Constant.meta meta: name: "vec#{n}" summary: 'Generate a random vector.' examples: { '(random/vec#{n} [trigger] [range]))' } - description: "Generate a random vec#{n} in `range` when created and on `trig`. + description: "Generate a random #{typ} in `range` when created and on `trig`. #{range_doc}" value: class extends Op new: (...) => super ... - @out or= ValueStream "vec#{n}" + @out or= typ\mk_sig! @state or @gen! gen: => @state = for i=1,n do math.random! @@ -71,9 +72,9 @@ vec = (n) -> { trig, range } = pattern\match inputs super trig: trig and Input.hot trig - range: Input.hot range or ValueStream.str 'uni' + range: Input.hot range or Constant.str 'uni' - tick: => + tick: (setup) => @gen! if @inputs.trig and @inputs.trig\dirty! @out\set [apply_range @inputs.range, v for v in *@state] diff --git a/alv-lib/sc.moon b/alv-lib/sc.moon index 2857392..7e4c711 100644 --- a/alv-lib/sc.moon +++ b/alv-lib/sc.moon @@ -1,10 +1,10 @@ -import Op, ValueStream, Input, val, evt from require 'alv.base' +import Op, Constant, Input, val, evt from require 'alv.base' import pack from require 'osc' import dns, udp from require 'socket' unpack or= table.unpack -play = ValueStream.meta +play = Constant.meta meta: name: 'play' summary: 'Play a SuperCollider SynthDef on bangs.' @@ -39,7 +39,7 @@ Plays the synth `synth` on the `udp/socket` `socket` whenever `trig` is live. msg = pack '/s_new', synth, -1, 0, 1, unpack ctrls socket\send msg -play_ = ValueStream.meta +play_ = Constant.meta meta: name: 'play!' summary: 'Play a SuperCollider SynthDef on events.' diff --git a/alv-lib/string.moon b/alv-lib/string.moon index 5f54b07..9f09f10 100644 --- a/alv-lib/string.moon +++ b/alv-lib/string.moon @@ -1,13 +1,13 @@ -import Op, ValueStream, Input from require 'alv.base' +import Op, Constant, SigStream, Input, T from require 'alv.base' -str = ValueStream.meta +str = Constant.meta meta: name: 'str' summary: "Concatenate/stringify values." examples: { '(.. v1 [v2…])', '(str v1 [v2…])' } value: class extends Op setup: (inputs) => - @out or= ValueStream 'str' + @out or= SigStream T.str super [Input.hot v for v in *inputs] tick: => diff --git a/alv-lib/time.moon b/alv-lib/time.moon index ba7aa4a..86d7e4c 100644 --- a/alv-lib/time.moon +++ b/alv-lib/time.moon @@ -1,12 +1,10 @@ -import - ValueStream, EventStream, IOStream, - Error, Op, Input, val, evt -from require 'alv.base' +import Constant, EvtStream, IOStream, Error, Op, Input, T, val, evt + from require 'alv.base' import monotime from require 'system' class Clock extends IOStream new: (@frametime) => - super 'clock' + super T.clock return unless monotime @last = monotime! @@ -19,11 +17,11 @@ class Clock extends IOStream @add { dt: @dt, :time } @last = time -class ScaledClock extends EventStream +class ScaledClock extends EvtStream set: (val) => @value unwrap: => @value -clock = ValueStream.meta +clock = Constant.meta meta: name: 'clock' summary: "Create a clock source." @@ -41,13 +39,13 @@ frame rate. setup: (inputs) => fps = (-val.num)\match inputs - super fps: Input.hot fps or ValueStream.num 60 + super fps: Input.hot fps or Constant.num 60 @out.frametime = 1 / @inputs.fps! tick: => @out.frametime = 1 / @inputs.fps! -scale_time = ValueStream.meta +scale_time = Constant.meta meta: name: 'scale-time' summary: "Scale clock time." @@ -60,7 +58,7 @@ scale_time = ValueStream.meta value: class extends Op new: (...) => super ... - @out or= EventStream 'clock' + @out or= EvtStream T.clock pattern = -evt.clock + val.num + -val.str setup: (inputs, scope) => @@ -74,7 +72,7 @@ scale_time = ValueStream.meta for evt in *@inputs.clock! @out\add {k, v*scale for k,v in pairs evt} -lfo = ValueStream.meta +lfo = Constant.meta meta: name: 'lfo' summary: "Low-frequency oscillator." @@ -92,9 +90,9 @@ lfo = ValueStream.meta new: (...) => super ... @state or= 0 - @out or= ValueStream 'num' + @out or= T.num\mk_sig! - default_wave = ValueStream.str 'sin' + default_wave = Constant.str 'sin' pattern = -evt.clock + val.num + -val.str setup: (inputs, scope) => { clock, freq, wave } = pattern\match inputs @@ -114,7 +112,7 @@ lfo = ValueStream.meta when 'tri' then math.abs (2*@state % 2) - 1 else error Error 'argument', "unknown wave type '#{wave}'" -ramp = ValueStream.meta +ramp = Constant.meta meta: name: 'ramp' summary: "Sawtooth LFO." @@ -129,7 +127,7 @@ ramp = ValueStream.meta new: (...) => super ... @state or= 0 - @out or= ValueStream 'num' + @out or= T.num\mk_sig! pattern = -evt.clock + val.num + -val.num setup: (inputs, scope) => @@ -150,7 +148,7 @@ ramp = ValueStream.meta @out\set @phase * max -tick = ValueStream.meta +tick = Constant.meta meta: name: 'tick' summary: "Count ticks." @@ -165,7 +163,7 @@ tick = ValueStream.meta new: (...) => super ... @state or= { phase: 0, count: 0 } - @out or= ValueStream 'num', @state.count + @out or= T.num\mk_sig! @state.count pattern = -evt.clock + val.num setup: (inputs, scope) => @@ -183,7 +181,7 @@ tick = ValueStream.meta @state.count += 1 @out\set @state.count -every = ValueStream.meta +every = Constant.meta meta: name: 'every' summary: "Emit events regularly." @@ -206,8 +204,8 @@ every = ValueStream.meta super clock: Input.hot clock or scope\get '*clock*' period: Input.cold period - evt: Input.cold evt or ValueStream 'bang', true - @out = EventStream @inputs.evt\type! + evt: Input.cold evt or Constant.bang, true + @out = @inputs.evt\type!\mk_evt! tick: => for tick in *@inputs.clock! @@ -217,7 +215,7 @@ every = ValueStream.meta @state -= 1 @out\add @inputs.evt! -sequence = ValueStream.meta +sequence = Constant.meta meta: name: 'sequence' summary: "Emit a sequence of values as events over time." @@ -246,7 +244,7 @@ Emits `evt1`, `evt2`, … as events with delays `delay0`, `delay1`, … in betwe setup: (inputs, scope) => { clock, first, steps } = pattern\match inputs - @out = EventStream steps[1].value\type! + @out = EvtStream steps[1].value\type! table.insert steps, 1, { delay: first } super clock: Input.hot clock or scope\get '*clock*' diff --git a/alv-lib/util.moon b/alv-lib/util.moon index abb49c0..512d74d 100644 --- a/alv-lib/util.moon +++ b/alv-lib/util.moon @@ -1,4 +1,4 @@ -import Op, ValueStream, EventStream, Input, val, evt from require 'alv.base' +import Constant, Op, Input, T, val, evt from require 'alv.base' all_same = (list) -> for v in *list[2,] @@ -7,7 +7,7 @@ all_same = (list) -> list[1] -switch_ = ValueStream.meta +switch_ = Constant.meta meta: name: 'switch' summary: "Switch between multiple inputs." @@ -24,12 +24,12 @@ switch_ = ValueStream.meta setup: (inputs) => { i, values } = pattern\match inputs - @state = values[1].value.__class == ValueStream + @state = values[1].value.metatype == '~' @out = if @state - ValueStream values[1]\type! + values[1]\type!\mk_sig! else - EventStream values[1]\type! + values[1]\type!\mk_evt! super i: Input.hot i @@ -52,7 +52,7 @@ switch_ = ValueStream.meta for event in *active! @out\add event -edge = ValueStream.meta +edge = Constant.meta meta: name: 'edge' summary: "Convert rising edges to bangs." @@ -60,7 +60,7 @@ edge = ValueStream.meta value: class extends Op setup: (inputs) => - @out or= EventStream 'bang' + @out or= T.bang\mk_evt! value = val.bool\match inputs super value: Input.hot value @@ -70,7 +70,7 @@ edge = ValueStream.meta @out\add true @state = now -change = ValueStream.meta +change = Constant.meta meta: name: 'change' summary: "Convert value changes to events." @@ -79,7 +79,7 @@ change = ValueStream.meta value: class extends Op setup: (inputs) => value = val!\match inputs - @out or= EventStream value\type! + @out or= value\type!\mk_evt! super value: Input.hot value tick: => @@ -88,7 +88,7 @@ change = ValueStream.meta @out\add @inputs.value! @state = now -hold = ValueStream.meta +hold = Constant.meta meta: name: 'hold' summary: "Convert events to value changes." @@ -97,7 +97,7 @@ hold = ValueStream.meta value: class extends Op setup: (inputs) => event = evt!\match inputs - @out or= ValueStream event\type! + @out or= event\type!\mk_sig! super event: Input.hot event tick: => |
