aboutsummaryrefslogtreecommitdiffstats
path: root/lib/osc.moon
blob: c459a66c2edd157047a81759032845a33e43d448 (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
import Op, ValueInput, EventInput, ColdInput, match from require 'core.base'
import pack from require 'osc'
import dns, udp from require 'socket'

unpack or= table.unpack

class connect extends Op
  @doc: "(osc/connect host port) - UDP remote definition"

  new: => super 'udp/socket'

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

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

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

class send extends Op
  @doc: "(osc/send socket path val) - send a value via OSC

sends a message only when val is dirty."

  setup: (inputs) =>
    { socket, path, value } = match 'udp/socket str any', inputs
    super
      socket: ColdInput socket
      path:   ColdInput path
      value:  EventInput 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

class send_state extends Op
  @doc: "(osc/send! socket path val) - synchronize a value via OSC

sends a whenever any parameter changes."

  setup: (inputs) =>
    { socket, path, value } = match 'udp/socket str any', inputs
    super
      socket: ValueInput socket
      path:   ValueInput path
      value:  ValueInput value

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

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