Class: PureData

Inherits:
Object
  • Object
show all
Defined in:
lib/puredata/canvas.rb,
lib/puredata/pd.rb,
lib/puredata/connection.rb,
lib/puredata/pdobject/dac.rb,
lib/puredata/pdobject/osc.rb,
lib/puredata/pdobject/receive.rb,
lib/puredata/pdobject/pdobject.rb

Overview

Ruby/PureData ojbect wrapper base class

Defined Under Namespace

Classes: Abstraction, Canvas, Dac, IOlet, Inlet, Osc, Outlet, PdObject, Receive

Constant Summary collapse

@@pdclass =
{}

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(opt = {}) ⇒ PureData

Returns a new instance of PureData.



28
29
30
# File 'lib/puredata/pd.rb', line 28

def initialize(opt={})
  @portno = (opt[:port] || 10002).to_i
end

Class Method Details

.attach(opt = {}, &blk) ⇒ Object



23
24
25
26
# File 'lib/puredata/pd.rb', line 23

def self.attach(opt={}, &blk)
  pd = self.new(opt)
  pd.start(opt, &blk)
end

.dispatch_object_class(klass, *args) ⇒ Object



15
16
17
18
19
# File 'lib/puredata/pdobject/pdobject.rb', line 15

def self.dispatch_object_class(klass, *args)
  cls = @@pdclass[klass.to_s]
  cls ||= PdObject
  cls
end

.register_pdobject(klass, *names) ⇒ Object



9
10
11
12
13
# File 'lib/puredata/pdobject/pdobject.rb', line 9

def self.register_pdobject(klass, *names)
  names.each do |n|
    @@pdclass[n] = klass
  end
end

.start(opt = {}, &blk) ⇒ Object



17
18
19
20
21
# File 'lib/puredata/pd.rb', line 17

def self.start(opt={}, &blk)
  pd = self.new(opt)
  pd.fork_pd(opt)
  pd.start(opt, &blk)
end

Instance Method Details

#abstraction(name, opt = {}, &blk) ⇒ Object



111
112
113
114
115
116
117
# File 'lib/puredata/pd.rb', line 111

def abstraction(name, opt={}, &blk)
  if blk
    Abstraction.create(self, name, opt, &blk)
  else
    Abstraction.new(self, name, opt)
  end
end

#bind(opt = {}) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/puredata/pd.rb', line 53

def bind(opt={})
  err = nil
  200.times do
    sleep 0.1
    begin
      @sock = TCPSocket.new("localhost", @portno)
      break
    rescue
      err = $!
    end
  end
  unless @sock
    $stderr.puts("connect to localhost:#{@portno} failed")
    raise err
  end
end

#canvas(name, opt = {}) ⇒ Object



107
108
109
# File 'lib/puredata/pd.rb', line 107

def canvas(name, opt={})
  Canvas.new(self, name, opt)
end

#dsp=(flag) ⇒ Object



119
120
121
122
123
124
125
# File 'lib/puredata/pd.rb', line 119

def dsp=(flag)
  if flag
    self.msg("pd", "dsp", 1)
  else
    self.msg("pd", "dsp", 0)
  end
end

#fork_pd(opt = {}) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/puredata/pd.rb', line 32

def fork_pd(opt={})
  path = opt[:pd_app_path] || @@pd_app_path
  pd_params = opt[:pd_params] || [] 
  if path.nil? or not File.executable?(path)
    raise "option :pd_app_path (Pd-extended executable) must be specified."
  end
  cmd = [
    path,
    pd_params,
    "-nogui",
    "-send", "pd filename ruby-pd.pd ./;",
    "-send", "#N canvas 10 10 200 200 10;",
    "-send", "#X pop 1;",
    "-send", "pd-ruby-pd.pd obj 50 50 netreceive #{@portno} 0 old;",
  ].flatten
  @pid = fork do
    Process.setsid
    exec(*cmd)
  end
end

#msg(*args) ⇒ Object



103
104
105
# File 'lib/puredata/pd.rb', line 103

def msg(*args)
  @sock.puts(args.map{|l| l.to_s}.join(" ") + ";")
end

#quitObject



127
128
129
# File 'lib/puredata/pd.rb', line 127

def quit
  self.msg("pd", "quit")
end

#start(opt = {}, &blk) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/puredata/pd.rb', line 70

def start(opt={}, &blk)
  begin
    bind(opt)
    if blk
      blk.call(self)
    end
  ensure
    if blk
      stop
    end
  end
end

#stopObject



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/puredata/pd.rb', line 83

def stop
  if @sock
    @sock.close unless @sock.closed?
    @sock = nil
  end

  return if @pid.nil?

  begin
    Process.kill(:TERM, -@pid)
  rescue Errno::ESRCH
  rescue Errno::EPERM
    raise "fail to kill process(#{@pid}): #{$!}"
  end
  Process.waitpid(@pid)
ensure
  @sock = nil
  @pid = nil
end