Newer
Older
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
78
79
#N struct IR-blobs float x float y symbol s;
#N struct NC-stick float x float y;
#N struct CL-L-stick float x float y;
#N struct CL-R-stick float x float y;
#N canvas 141 50 872 633 10;
#X msg 6 388 disconnect;
#X msg 27 87 discover;
#X obj 187 186 tgl 25 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
1;
#X obj 109 186 tgl 25 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
1;
#X msg 187 216 reportAcceleration \$1;
#X msg 109 216 reportIR \$1;
#N canvas 25 33 700 644 \$0-accelerometer-stuff 0;
#X obj 218 12 inlet;
#X obj 366 221 unpack 0 0 0;
#X obj 92 612 expr sqrt(pow($f1 \, 2) + pow($f2 \, 2) + pow($f3 \,
2));
#X obj 357 280 atan;
#X obj 357 259 expr $f1 / $f2;
#X obj 389 304 expr if ($f1 > 0 \, 3.14159 \, -3.14159);
#X obj 357 331 pack 0 0 0;
#X obj 357 353 expr if ($f3 <= 0 \, $f1 + $f2 \, $f1);
#X obj 357 375 * -1;
#X obj 328 61 unpack 0 0 0;
#X obj 42 443 s \$0-wii-pitch-set;
#X obj 357 445 s \$0-wii-roll-set;
#X obj 407 81 s \$0-wii-accZ-set;
#X obj 367 100 s \$0-wii-accY-set;
#X obj 328 119 s \$0-wii-accX-set;
#X text 75 514 The pitch and roll are only accurate if there are no
extra accelerations due to hand movement. We can check if the total
acceleration is close to gravity and only use pitch and roll in that
case. The total acceleration is given by:;
#X text 340 39 raw accerlation:;
#X obj 31 221 unpack 0 0 0;
#X obj 42 280 atan;
#X obj 42 259 expr $f1 / $f2;
#X obj 74 304 expr if ($f1 > 0 \, 3.14159 \, -3.14159);
#X obj 42 331 pack 0 0 0;
#X obj 42 353 expr if ($f3 <= 0 \, $f1 + $f2 \, $f1);
#X obj 42 375 * -1;
#X obj 225 578 unpack 0 0 0;
#X connect 0 0 9 0;
#X connect 0 0 17 0;
#X connect 0 0 1 0;
#X connect 1 0 4 0;
#X connect 1 0 5 0;
#X connect 1 2 4 1;
#X connect 1 2 6 2;
#X connect 3 0 6 0;
#X connect 4 0 3 0;
#X connect 5 0 6 1;
#X connect 6 0 7 0;
#X connect 7 0 8 0;
#X connect 8 0 11 0;
#X connect 9 0 14 0;
#X connect 9 1 13 0;
#X connect 9 2 12 0;
#X connect 17 1 19 0;
#X connect 17 1 20 0;
#X connect 17 2 19 1;
#X connect 17 2 21 2;
#X connect 18 0 21 0;
#X connect 19 0 18 0;
#X connect 20 0 21 1;
#X connect 21 0 22 0;
#X connect 22 0 23 0;
#X connect 23 0 10 0;
#X connect 24 0 2 0;
#X connect 24 1 2 1;
#X connect 24 2 2 2;
#X restore 47 486 pd \$0-accelerometer-stuff;
#N canvas 0 0 652 563 \$0-IR-stuff 0;
#X obj 134 18 inlet;
#X obj 122 510 pointer;
#X msg 122 488 traverse pd-IR-data \, next;
#X obj 134 63 route 0 1 2 3;
#X obj 23 482 unpack 0 0 0;
#X floatatom 483 44 5 0 0 0 IR-Blob: - -, f 5;
#X floatatom 522 44 5 0 0 0 - - -, f 5;
#X floatatom 562 44 5 0 0 0 - - -, f 5;
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#X obj 15 533 set IR-blobs x y;
#X obj 231 400 pointer;
#X obj 132 372 unpack 0 0 0;
#X obj 124 423 set IR-blobs x y;
#X msg 231 378 traverse pd-IR-data \, next \, next;
#X obj 231 357 loadbang;
#X obj 122 467 loadbang;
#X obj 320 289 pointer;
#X obj 221 261 unpack 0 0 0;
#X obj 213 312 set IR-blobs x y;
#X obj 320 246 loadbang;
#X msg 320 267 traverse pd-IR-data \, next \, next \, next;
#X obj 380 177 pointer;
#X obj 281 149 unpack 0 0 0;
#X obj 273 200 set IR-blobs x y;
#X obj 380 134 loadbang;
#X msg 380 155 traverse pd-IR-data \, next \, next \, next \, next
;
#X connect 0 0 3 0;
#X connect 1 0 8 2;
#X connect 2 0 1 0;
#X connect 3 0 4 0;
#X connect 3 1 10 0;
#X connect 3 2 16 0;
#X connect 3 3 21 0;
#X connect 4 0 8 0;
#X connect 4 1 8 1;
#X connect 9 0 11 2;
#X connect 10 0 11 0;
#X connect 10 1 11 1;
#X connect 12 0 9 0;
#X connect 13 0 12 0;
#X connect 14 0 2 0;
#X connect 15 0 17 2;
#X connect 16 0 17 0;
#X connect 16 1 17 1;
#X connect 18 0 19 0;
#X connect 19 0 15 0;
#X connect 20 0 22 2;
#X connect 21 0 22 0;
#X connect 21 1 22 1;
#X connect 23 0 24 0;
#X connect 24 0 20 0;
#X restore 77 465 pd \$0-IR-stuff;
#X text 89 87 <- Or you can try to automatically detect a wiimote.
;
#X obj 325 186 tgl 25 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
1;
#X text 191 588 You can also specify the address as a creation argument:
;
#X text 203 602 (make sure to enable discover mode before creation)
;
#N canvas 4 136 920 244 \$0-nunchuck-stuff 0;
#X obj 559 61 inlet;
#X obj 672 134 pointer;
#X obj 672 91 loadbang;
#X obj 559 96 unpack 0 0;
#X obj 565 179 set NC-stick x y;
#X obj 49 71 inlet;
#X text 42 32 inlet #1: BUTTONS;
#X text 294 35 inlet #2: ACCELERATION;
#X obj 304 72 inlet;
#X obj 304 105 unpack 0 0 0;
#X obj 383 125 s \$0-nc-accZ-set;
#X obj 343 144 s \$0-nc-accY-set;
#X obj 304 163 s \$0-nc-accX-set;
#X text 567 32 inlet #3: STICK;
#X obj 49 117 s \$0-nc-btn-set;
#X msg 672 112 traverse pd-NC-data \, next;
#X connect 0 0 3 0;
#X connect 1 0 4 2;
#X connect 2 0 15 0;
#X connect 3 0 4 0;
#X connect 3 1 4 1;
#X connect 5 0 14 0;
#X connect 8 0 9 0;
#X connect 9 0 12 0;
#X connect 9 1 11 0;
#X connect 9 2 10 0;
#X connect 15 0 1 0;
#X restore 106 444 pd \$0-nunchuck-stuff;
#X obj 579 406 cnv 15 275 230 empty empty Expansion: 10 15 0 14 -228992
-355 0;
#X floatatom 718 468 7 0 0 1 - #0-nc-accX-set #0-nc-accX, f 7;
#X floatatom 718 482 7 0 0 1 - #0-nc-accY-set #0-nc-accY, f 7;
#X floatatom 718 496 7 0 0 1 - #0-nc-accZ-set #0-nc-accZ, f 7;
#X obj 588 468 hsl 128 14 -1 1 0 0 \$0-nc-accX \$0-nc-accX-set X 4
8 0 10 -261681 -1 -1 0 1;
#X obj 588 482 hsl 128 14 -1 1 0 0 \$0-nc-accY \$0-nc-accY-set Y 4
8 0 10 -261681 -1 -1 0 1;
#X obj 588 496 hsl 128 14 -1 1 0 0 \$0-nc-accZ \$0-nc-accZ-set Z 4
8 0 10 -261681 -1 -1 0 1;
#X obj 723 530 nbx 3 16 -1e+37 1e+37 0 0 empty \$0-nc-btn-set empty
#X text 584 452 Acceleration:;
#N canvas 154 209 610 221 NC-stick 0;
#X obj 39 34 struct NC-stick float x float y;
#X obj 44 71 filledpolygon 900 20 0 5 -5 0 -20 -5 -5 -20 0 -5 5 0 20
5 5 20 0;
#X restore 768 548 pd NC-stick;
#X text 714 512 Buttons:;
#X text 785 452 Stick:;
#X obj 579 5 cnv 15 275 400 empty empty Wiimote: 10 15 0 14 -261689
-143491 0;
#X floatatom 742 80 7 0 0 1 _X #0-wii-accX-set #0-wii-accX, f 7;
#X floatatom 742 94 7 0 0 1 _Y #0-wii-accY-set #0-wii-accY, f 7;
#X floatatom 742 108 7 0 0 1 _Z #0-wii-accZ-set #0-wii-accZ, f 7;
#X obj 612 80 hsl 128 14 -1 1 0 0 \$0-wii-accX \$0-wii-accX-set empty
-2 -8 0 10 -225271 -1 -1 0 1;
#X obj 612 94 hsl 128 14 -1 1 0 0 \$0-wii-accY \$0-wii-accY-set empty
-2 -8 0 10 -225271 -1 -1 0 1;
#X obj 612 108 hsl 128 14 -1 1 0 0 \$0-wii-accZ \$0-wii-accZ-set empty
-2 -8 0 10 -225271 -1 -1 0 1;
#N canvas 526 148 481 416 IR-data 0;
#X scalar IR-blobs 616 680 blob1 \;;
Ivica Bukvic
committed
#X scalar IR-blobs 211 368 blob2 \;;
Ivica Bukvic
committed
#X scalar IR-blobs 419 760 blob4 \;;
#X coords 0 0 1024 768 256 196 1;
#X restore 590 183 pd IR-data;
#X obj 39 34 struct IR-blobs float x float y symbol s;
#X obj 39 71 filledcurve 9 30 0 0 -30 -30 0 0 30 30 0;
Ivica Bukvic
committed
#X obj 63 109 drawsymbol s -35 -75 0 24 blob;
#X restore 776 384 pd IR-blobs;
#X text 648 166 IR Blobs (1024x768):;
#X floatatom 742 128 7 0 0 1 _PITCH #0-wii-pitch-set #0-wii-pitch,
f 7;
#X obj 612 128 hsl 128 14 -3.14156 3.14159 0 0 \$0-wii-pitch \$0-wii-pitch-set
empty -2 -8 0 10 -225280 -1 -1 0 1;
#X floatatom 742 142 7 0 0 1 _ROLL #0-wii-roll-set #0-wii-roll, f
7;
#X obj 612 142 hsl 128 14 -3.14156 3.14159 0 0 \$0-wii-roll \$0-wii-roll-set
empty -2 -8 0 10 -225280 -1 -1 0 1;
#X text 608 64 Acceleration (-1 to 1):;
#X obj 779 23 nbx 2 16 -1e+37 1e+37 0 0 empty \$0-wii-btn01-set empty
#X obj 814 23 nbx 2 16 -1e+37 1e+37 0 0 empty \$0-wii-btn02-set empty
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
#N canvas 0 0 330 216 \$0-button-stuff 0;
#X obj 41 33 inlet;
#X obj 41 86 unpack 0 0;
#X obj 41 140 s \$0-wii-btn01-set;
#X obj 106 120 s \$0-wii-btn02-set;
#X connect 0 0 1 0;
#X connect 1 0 2 0;
#X connect 1 1 3 0;
#X restore 21 506 pd \$0-button-stuff;
#X text 783 5 Buttons:;
#N canvas 185 133 481 416 NC-data 0;
#X scalar NC-stick 0 0 \;;
#X coords 0 256 256 0 80 80 1 0 0;
#X restore 768 468 pd NC-data;
#X obj -5 611 print;
#X obj 15 203 tgl 25 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
1;
#X text -4 254 Enable metro to get accelerometer uppdates;
#X obj 117 365 disis_wiimote;
#X obj -5 589 disis_wiimote 00:19:1D:BE:6A:66;
#X obj 231 333 tgl 25 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
1;
#X text 212 357 connection;
#X text 217 367 indicator;
#X text 276 472 TO CONNECT:;
#X text 277 484 1 click on connect or discover;
#X text 277 495 2 press 1&2 on the wiimote;
#X text 277 506 3 upon connect wiimote will vibrate;
#X text 288 517 if wiimote fails to connect check;
#X text 289 539 (e.g. using shell command "hcitool scan");
#X obj 423 240 cnv 15 150 150 empty empty Feedback 6 12 0 10 -233017
-66577 0;
#X obj 479 336 tgl 25 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
1;
#X msg 479 366 setRumble \$1;
#X msg 478 313 setLED \$1;
#X obj 478 264 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
1;
#X obj 502 264 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
1;
#X obj 526 264 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
1;
#X obj 550 264 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
1;
#X text 440 263 LEDs:;
#N canvas 0 0 409 401 bytemask 0;
#X obj 269 332 outlet;
#X obj 269 279 float;
#X obj 318 183 |;
#X obj 110 239 -;
#X obj 110 204 float;
#X obj 110 184 trigger bang float;
#X obj 231 204 &;
#X obj 183 142 route 0 1;
#X msg 36 56 \$1 1;
#X msg 106 56 \$1 2;
#X msg 176 56 \$1 4;
#X msg 246 56 \$1 8;
#X obj 36 15 inlet;
#X obj 106 15 inlet;
#X obj 176 15 inlet;
#X obj 246 15 inlet;
#X obj 36 35 change;
#X obj 106 35 change;
#X obj 176 35 change;
#X obj 246 35 change;
#X connect 1 0 2 1;
#X connect 1 0 4 1;
#X connect 1 0 6 1;
#X connect 1 0 0 0;
#X connect 2 0 1 0;
#X connect 3 0 1 0;
#X connect 4 0 3 0;
#X connect 5 0 4 0;
#X connect 5 1 6 0;
#X connect 6 0 3 1;
#X connect 7 0 5 0;
#X connect 7 1 2 0;
#X connect 8 0 7 0;
#X connect 9 0 7 0;
#X connect 10 0 7 0;
#X connect 11 0 7 0;
#X connect 12 0 16 0;
#X connect 13 0 17 0;
#X connect 14 0 18 0;
#X connect 15 0 19 0;
#X connect 16 0 8 0;
#X connect 17 0 9 0;
#X connect 18 0 10 0;
#X connect 19 0 11 0;
#X restore 478 290 pd bytemask;
#X text 430 337 RUMBLE:;
#X text 277 551 4 start metro and enable "reportAcceleration";
#X text -4 294 NB: setting metro below 20 makes little sense as even
at max rate I was unable to get more than 50 updates/second from the
bluetooth stack.;
#X text -5 265 (buttons \, xyz wiimote \, xyz nunchuk \, ir).;
#X obj 585 560 unpack 0 0 0;
#X obj 658 583 hsl 180 15 0 16000 0 0 empty empty empty -2 -8 0 10
-261681 -1 -1 0 1;
#X obj 658 598 hsl 180 15 0 16000 0 0 empty empty empty -2 -8 0 10
-261681 -1 -1 0 1;
#X obj 658 613 hsl 180 15 0 16000 0 0 empty empty empty -2 -8 0 10
-261681 -1 -1 0 1;
#X text 660 581 up/down;
#X text 659 611 left/right;
#X text 659 596 rotate around y axis (wrist);
#X text 277 562 5 connect nunchuk and enable "reportExtension";
#X text 594 439 NUNCHUK;
#X text 586 543 MOTION PLUS;
#X text -16 2 Threaded implementation of Wiimote object by DISIS &
L2Ork by Ivica Ico Bukvic <ico@vt.edu> <http://disis.music.vt.edu>
<http://l2ork.music.vt.edu>;
#X text 119 122 By default \, the wiimote does not report acceleration
data \, IR data \, or any data from an attached extension (eg \, nunchuck).
You must specifically enable each reporting mode.;
#X msg 325 216 reportExpansion \$1;
#N canvas 0 0 1143 249 unpack_messages 0;
#X obj 181 15 inlet;
#X obj 61 103 outlet;
#X obj 105 103 outlet;
#X obj 195 171 outlet;
#X obj 256 171 outlet;
#X obj 317 171 outlet;
#X obj 195 148 route button acceleration stick;
#X obj 390 148 route angle_rate low_speed;
#X obj 390 171 outlet;
#X obj 466 171 outlet;
#X obj 555 171 outlet;
#X obj 624 171 outlet;
#X obj 693 171 outlet;
#X obj 840 171 outlet;
#X obj 912 171 outlet;
#X obj 985 171 outlet;
#X obj 1058 171 outlet;
#X obj 1142 148 outlet;
#X obj 840 148 route right_top right_bottom left_top left_bottom;
#X obj 181 37 route button acceleration ir nunchuk motionplus classic
balance battery;
#X obj 149 103 outlet;
#X obj 555 148 route left_stick right_stick button;
#X connect 0 0 19 0;
#X connect 6 0 3 0;
#X connect 6 1 4 0;
#X connect 6 2 5 0;
#X connect 7 0 8 0;
#X connect 7 1 9 0;
#X connect 18 0 13 0;
#X connect 18 1 14 0;
#X connect 18 2 15 0;
#X connect 18 3 16 0;
#X connect 19 0 1 0;
#X connect 19 1 2 0;
#X connect 19 2 20 0;
#X connect 19 3 6 0;
#X connect 19 4 7 0;
#X connect 19 5 21 0;
#X connect 19 6 18 0;
#X connect 19 7 17 0;
#X connect 21 0 10 0;
#X connect 21 1 11 0;
#X connect 21 2 12 0;
#X restore 117 386 pd unpack_messages;
#X text 166 63 <- You can connect to a specific address;
#X msg 6 366 status;
#X msg 6 344 debug;
#X floatatom 317 409 5 0 0 0 - - -, f 5;
#X floatatom 317 427 5 0 0 0 - - -, f 5;
#X floatatom 283 409 5 0 0 0 - - -, f 5;
#X floatatom 283 427 5 0 0 0 - - -, f 5;
#X floatatom 391 407 5 0 0 0 - - -, f 5;
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
#X text 263 441 balance board (kg);
#X text 425 400 battery level;
#X text 423 412 (click on the status msg);
#X obj 391 428 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
-1 -1;
#X obj 445 186 tgl 25 0 empty empty empty 17 7 0 10 -262144 -1 -1 0
1;
#X msg 445 216 togglePassthrough \$1;
#X msg 4 64 connect 00:19:1D:CA:73:29;
#X obj 15 234 metro 100;
#X text 289 528 console and your bluetooth settings;
#N canvas 35 30 815 233 \$0-classic 0;
#X obj 60 -20 inlet;
#X obj 690 -19 inlet;
#X text 47 -38 left stick;
#X text 340 -38 right stick;
#X text 684 -37 buttons;
#N canvas 154 209 610 221 CL-L-stick 0;
#X obj 39 34 struct CL-L-stick float x float y;
#X obj 44 71 filledpolygon 900 8 0 2 -2 0 -8 -2 -2 -8 0 -2 2 0 8 2
2 8 0;
#X restore 59 173 pd CL-L-stick;
#N canvas 185 133 481 416 CL-L-data 0;
#X scalar CL-L-stick 32 30 \;;
#X coords 0 60 60 0 80 80 1 0 0;
#X restore 60 93 pd CL-L-data;
#X obj 165 46 pointer;
#X obj 165 3 loadbang;
#X obj 60 47 unpack 0 0;
#X obj 60 69 set CL-L-stick x y;
#X msg 165 24 traverse pd-CL-L-data \, next;
#X obj 357 -19 inlet;
#X obj 462 47 pointer;
#X obj 462 4 loadbang;
#X obj 357 48 unpack 0 0;
#X msg 462 25 traverse pd-CL-R-data \, next;
#X obj 357 70 set CL-R-stick x y;
#N canvas 476 329 610 221 CL-R-stick 0;
#X obj 39 34 struct CL-R-stick float x float y;
#X obj 44 71 filledpolygon 900 4 0 1 -1 0 -4 -1 -1 -4 0 -1 1 0 4 1
1 4 0;
#X restore 356 174 pd CL-R-stick;
#X obj 690 3 unpack 0 0;
#X floatatom 690 25 5 0 0 0 - - -, f 5;
#X floatatom 747 25 5 0 0 0 - - -, f 5;
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
#N canvas 185 133 481 416 CL-R-data 0;
#X scalar CL-R-stick 15 15 \;;
#X coords 0 30 30 0 80 80 1 0 0;
#X restore 357 94 pd CL-R-data;
#X connect 0 0 9 0;
#X connect 1 0 19 0;
#X connect 7 0 10 2;
#X connect 8 0 11 0;
#X connect 9 0 10 0;
#X connect 9 1 10 1;
#X connect 11 0 7 0;
#X connect 12 0 15 0;
#X connect 13 0 17 2;
#X connect 14 0 16 0;
#X connect 15 0 17 0;
#X connect 15 1 17 1;
#X connect 16 0 13 0;
#X connect 19 0 20 0;
#X connect 19 1 21 0;
#X restore 182 422 pd \$0-classic;
#X connect 0 0 48 0;
#X connect 1 0 48 0;
#X connect 2 0 4 0;
#X connect 3 0 5 0;
#X connect 4 0 48 0;
#X connect 5 0 48 0;
#X connect 9 0 85 0;
#X connect 46 0 102 0;
#X connect 48 0 86 0;
#X connect 48 1 50 0;
#X connect 49 0 45 0;
#X connect 60 0 61 0;
#X connect 61 0 48 0;
#X connect 62 0 48 0;
#X connect 63 0 68 0;
#X connect 64 0 68 1;
#X connect 65 0 68 2;
#X connect 66 0 68 3;
#X connect 68 0 62 0;
#X connect 73 0 74 0;
#X connect 73 1 75 0;
#X connect 73 2 76 0;
#X connect 85 0 48 0;
#X connect 86 0 42 0;
#X connect 86 1 6 0;
#X connect 86 2 7 0;
#X connect 86 3 12 0;
#X connect 86 4 12 1;
#X connect 86 5 12 2;
#X connect 86 6 73 0;
#X connect 86 8 104 0;
#X connect 86 9 104 1;
#X connect 86 10 104 2;
#X connect 86 11 90 0;
#X connect 86 12 91 0;
#X connect 86 13 92 0;
#X connect 86 14 93 0;
#X connect 86 15 94 0;
#X connect 88 0 48 0;
#X connect 89 0 48 0;
#X connect 94 0 98 0;
#X connect 99 0 100 0;
#X connect 100 0 48 0;
#X connect 101 0 48 0;
#X connect 102 0 48 0;