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 OSC controls for Toonloop
27 """
28 from rats import osc
29
31 """
32 Simply prints to the console debug messages
33 """
34 print(text)
35
37 """
38 OSC callbacks and sends for Toonloop
39
40 == Sends: ==
41 * /toon/frame <i>
42 * /toon/sequence <i>
43 * /toon/framerate <i>
44 * /toon/writehead <i>
45 * /sampler/play/start <i>
46 * /sampler/play/stop <i>
47 * /sampler/record/start <i>
48 * /sampler/record/stop <i>
49
50 == Receives: ==
51 * /toon/frame/remove
52 * /toon/frame/add
53 * /toon/osc/subscribe <s> <i>
54 * /toon/clip/select <i>
55 """
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 - def __init__(self, toonloop, listen_port=7772, send_port=7770, send_host="localhost"):
71 self.toonloop = toonloop
72 self.listen_port = listen_port
73 self.send_port = send_port
74 self.send_host = send_host
75 self.osc_server = None
76 self.osc_sender = None
77 self.verbose = self.toonloop.config.osc_verbose
78
79 self._setup()
80
82 del self.osc_server
83 del self.osc_sender
84
86 """
87 Starts the server and registers the callbacks.
88 """
89 self.osc_server = osc.OscServer(self.listen_port)
90 self.osc_server.add_callback("/toon/frame/add", None, self._r_frame_add)
91 self.osc_server.add_callback("/toon/frame/remove", None, self._r_frame_remove)
92 self.osc_server.add_callback("/toon/osc/subscribe", "si", self._r_osc_subscribe)
93 self.osc_server.add_callback("/toon/clip/select", "i", self._r_clip_select)
94 self.osc_server.add_callback("/toon/clip/reset", None, self._r_clip_reset)
95 self.osc_server.add_callback("/toon/clip/save", None, self._r_clip_save)
96 self.osc_server.add_callback("/toon/pause", None, self._r_pause)
97 self.osc_server.add_callback("/toon/quit", None, self._r_quit)
98 self.osc_server.add_callback("/toon/config/set", "ss", self._r_config_set)
99 self.osc_server.add_callback("/toon/print/stats", None, self._r_print_stats)
100 self.osc_server.add_callback("/toon/framerate/increase", "i", self._r_framerate_increase)
101
102 self.osc_server.add_callback("/ping", None, self._r_ping)
103 self.osc_server.add_callback("/pong", None, self._r_pong)
104 self.osc_server.add_callback(None, None, self._r_fallback)
105 print("Will now start listening OSC server...")
106 self.osc_server.start()
107 print("OSC Server started. ")
108
109 client_addr = "osc.udp://%s:%d" % (self.send_host, self.send_port)
110 self.osc_sender = osc.OscClient(client_addr)
111
112
113
114 self.toonloop.signal_playhead.connect(self._slot_playhead)
115 self.toonloop.signal_writehead.connect(self._slot_writehead)
116 self.toonloop.signal_framerate.connect(self._slot_framerate)
117 self.toonloop.signal_clip.connect(self._slot_clip)
118
119
120
122 """
123 Slot which listens or a Toonloop's signal
124 :param index: int frame index
125 """
126
127
128 self._s("/toon/playhead", index)
129
131 """
132 Slot which listens for a Toonloop's signal
133 :param index: int frame index
134 """
135 if self.verbose:
136 print("writehead %s" % (index))
137 self._s("/toon/writehead", index)
138
140 """
141 Slot which listens for a Toonloop's signal
142 :param fps: int fps
143 """
144 if self.verbose:
145 print("fps %s" % (fps))
146 self._s("/toon/framerate", fps)
147
149 """
150 Slot which listens for a Toonloop's signal
151 :param index: int clip number
152 """
153 if self.verbose:
154 print("clip %s" % (index))
155 self._s("/toon/clip/index", index)
156
157
158
159
160
161
162
163
164
165
166
168 self._s("/sampler/record/start", buffer_index)
169
171 self._s("/sampler/record/stop", index)
172
174 self._s("/sampler/clear", index)
175
177 self.osc_sender.send_message("/sampler/play/start", ('i', player_id), ('i', buffer_id))
178
180 self._s("/sampler/play/stop", index)
181
182 - def _s(self, path, index):
183 """
184 wrapper for sending a osc message with an int arg.
185 """
186 self.osc_sender.send_message(path, ('i', index))
187
189 print("Got /toon/frame/add")
190 self.toonloop.frame_add()
191
193 print("Got /toon/pause")
194 self.toonloop.pause()
195
197 key = args[0]
198 value = args[1]
199 print("Got /toon/config/set %s %s" % (key, value))
200 self.toonloop.config_set(key, value)
201
203 print("Got /toon/clip/select")
204 self.toonloop.clip_select(args[0])
205
207
208 print("Got /toon/clip/reset")
209 self.toonloop.clip_reset()
210
212 dir = args[0]
213 print("got /toon/framerate/increase %d" % (dir))
214 self.toonloop.framerate_increase(dir)
215
217 print("Got /toon/clip/save")
218 self.toonloop.clip_save()
219
221 print("Got /toon/quit")
222 self.toonloop.quit()
223
225 print("Got /toon/print/stats")
226 self.toonloop.print_stats()
227
229 print("Got /toon/frame/remove")
230 self.toonloop.frame_remove()
231
233 print("Got /toon/osc/subscribe")
234 try:
235 self.send_host = args[0]
236 self.send_port = args[1]
237 except IndexError, e:
238 print(e.message)
239 else:
240 del self.osc_sender
241 client_addr = "osc.udp://%s:%d" % (self.send_host, self.send_port)
242 print("Now sending to %s" % (client_addr))
243 self.osc_sender = osc.OscClient(client_addr)
244
246 print("Got /ping. Sending /pong.")
247 self.osc_sender.send_message("/pong")
248
251
253 print("got unknown OSC message '%s' from '%s'" % (path, src.get_url()))
254 for a, t in zip(args, types):
255 print "argument of type '%s': %s" % (t, a)
256