aboutsummaryrefslogtreecommitdiffstats
path: root/lib/osc.moon
blob: fe4eae4f289a28f8a2b061566be63793b0818e2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import Op, Value, Input, match from require 'core.base'
import pack from require 'osc'
import dns, udp from require 'socket'

unpack or= table.unpack

connect = Value.meta
  meta:
    name: 'connect'
    summary: "Create a UDP remote."
    examples: { '(osc/connect host port)' }

  value: class extends Op
    new: => super 'udp/socket'

    setup: (inputs) =>
      { host, port } = match 'str num', inputs
      super
        host: Input.value host
        port: Input.value port

    tick: =>
      { :host, :port } = @unwrap_all!
      ip = dns.toip host

      @out\set with sock = udp!
        \setpeername ip, port

send = Value.meta
  meta:
    name: 'send'
    summary: "Send a value via OSC."
    examples: { '(osc/send socket path val)' }
    description: "sends a message only when `val` is dirty."

  value: class extends Op
    setup: (inputs) =>
      { socket, path, value } = match 'udp/socket str any', inputs
      super
        socket: Input.cold socket
        path:   Input.cold path
        value:  Input.value value

    tick: =>
      if @inputs.value\dirty!
        { :socket, :path, :value } = @unwrap_all!
        msg = if 'table' == type value
          pack path, unpack value
        else
          pack path, value
        socket\send msg

send_state = Value.meta
  meta:
    name: 'send'
    summary: "Synchronize a value via OSC."
    examples: { '(osc/send! socket path val)' }
    description: "sends a message whenever any parameter is dirty."

  value: class extends Op
    setup: (inputs) =>
      { socket, path, value } = match 'udp/socket str any', inputs
      super
        socket: Input.value socket
        path:   Input.value path
        value:  Input.value value

    tick: =>
      { :socket, :path, :value } = @unwrap_all!
      msg = pack path, value
      socket\send msg

{
  :connect
  :send
  'send!': send_state
}