aboutsummaryrefslogtreecommitdiff
path: root/unit-test-frame.pd
blob: eb872b1e60e1e445f2f0c09694d6df45204b2ae4 (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
78
79
80
81
82
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
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
388
389
390
391
392
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
436
437
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
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
#N canvas 66 59 710 662 10;
#X obj 620 302 bng 50 250 50 0 empty empty list 5 25 0 14 -203904 -262144
-1;
#X obj 315 301 bng 50 250 50 0 empty empty list 5 25 0 14 -203904 -262144
-1;
#X obj 100 300 bng 50 250 50 0 empty empty list 5 25 0 14 -203904 -262144
-1;
#X obj 621 239 bng 50 250 50 0 empty empty ? 15 25 0 30 -260097 -262144
-1;
#X obj 474 302 hsl 130 50 0 127 0 0 \$0-dummysend \$0-stddev-label
STDDEV-ZERO 4 35 0 10 -203904 -203904 -1 0 1;
#X floatatom 477 309 18 0 0 0 - #0-stddev -;
#X obj 256 301 bng 50 250 50 0 empty empty test 5 25 0 14 -260097 -262144
-1;
#X obj 40 300 bng 50 250 50 0 empty empty write 4 25 0 14 -260097 -262144
-1;
#X obj 43 239 hsl 195 50 0 112 0 0 \$0-dummysend \$0-dummyreceive empty
-2 -8 0 10 -203904 -203904 -203904 0 1;
#X symbolatom 45 247 25 0 0 0 - #0-refname #0-dummysend;
#X text 44 267 reference;
#N canvas 607 182 376 522 std.deviation 0;
#X obj 80 127 until;
#X obj 95 155 + 1;
#X obj 80 180 f;
#X obj 80 99 t f b;
#X msg 122 163 0;
#X obj 107 310 +;
#X floatatom 107 337 8 0 0 0 - - -;
#X obj 92 361 f;
#X text 153 163 clear sums;
#X obj 52 234 == 511;
#X obj 52 258 sel 1;
#X obj 80 203 t f f;
#X obj 107 261 t f f;
#X obj 107 286 *;
#X obj 92 386 / 512;
#X obj 92 410 sqrt;
#X obj 92 439 outlet;
#X text 137 441 stddev;
#X obj 186 439 s \$0-stddev;
#X obj 107 233 tabread \$0-difference;
#X obj 191 58 + 1;
#X obj 80 75 f 512;
#X floatatom 202 10 5 0 0 0 - - -;
#X obj 263 -16 r \$0-test-delay;
#X obj 263 30 + 10;
#X floatatom 272 8 5 0 0 0 - - -;
#X obj 80 47 delay 10;
#X obj 191 -16 r \$0-index;
#X obj 80 -16 r \$0-test-prepare;
#X connect 0 0 2 0;
#X connect 1 0 2 1;
#X connect 2 0 1 0;
#X connect 2 0 11 0;
#X connect 3 0 0 0;
#X connect 3 1 4 0;
#X connect 4 0 2 1;
#X connect 4 0 5 1;
#X connect 5 0 6 0;
#X connect 6 0 5 1;
#X connect 6 0 7 1;
#X connect 7 0 14 0;
#X connect 9 0 10 0;
#X connect 10 0 7 0;
#X connect 11 0 9 0;
#X connect 11 1 19 0;
#X connect 12 0 13 0;
#X connect 12 1 13 1;
#X connect 13 0 5 0;
#X connect 14 0 15 0;
#X connect 15 0 16 0;
#X connect 15 0 18 0;
#X connect 19 0 12 0;
#X connect 20 0 14 1;
#X connect 20 0 21 1;
#X connect 21 0 3 0;
#X connect 23 0 24 0;
#X connect 23 0 25 0;
#X connect 24 0 26 1;
#X connect 26 0 21 0;
#X connect 27 0 9 1;
#X connect 27 0 20 0;
#X connect 27 0 22 0;
#X connect 28 0 26 0;
#X restore 327 123 pd std.deviation;
#X obj 39 23 inlet;
#X obj 328 27 inlet;
#X obj 630 22 inlet;
#X obj 238 628 outlet;
#X obj 286 628 outlet;
#X obj 335 629 outlet;
#X obj 238 555 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
-1 -1;
#X msg 288 508 const 0;
#X obj 288 531 s \$0-system-under-test;
#X obj 39 49 unpack s f;
#X obj 96 78 s \$0-test-delay;
#N canvas 568 53 379 248 table 0;
#X obj 45 199 tabwrite \$0-system-under-test;
#X obj 216 70 f;
#X obj 245 70 + 1;
#X obj 45 53 t f b;
#X msg 231 45 0;
#X obj 45 22 inlet;
#X obj 62 172 tabwrite \$0-difference;
#X obj 77 119 tabread \$0-reference;
#X obj 77 87 t f f;
#X obj 231 21 r \$0-test-prepare;
#X obj 237 135 s \$0-index;
#X obj 62 145 -;
#X obj 237 108 moses 512;
#X connect 1 0 2 0;
#X connect 1 0 8 0;
#X connect 1 0 0 1;
#X connect 1 0 12 0;
#X connect 2 0 1 1;
#X connect 3 0 0 0;
#X connect 3 0 11 0;
#X connect 3 1 1 0;
#X connect 4 0 1 1;
#X connect 5 0 3 0;
#X connect 7 0 11 1;
#X connect 8 0 7 0;
#X connect 8 1 6 1;
#X connect 9 0 4 0;
#X connect 11 0 6 0;
#X connect 12 0 10 0;
#X restore 328 85 pd table;
#X obj 238 509 t b b b;
#N canvas 0 22 256 269 view-system 0;
#X obj 39 39 inlet;
#X msg 39 75 arrayviewlistnew;
#X obj 39 174 s \$0-system-under-test;
#X obj 67 118 r \$0-test-prepare;
#X msg 67 144 arrayviewclose;
#X connect 0 0 1 0;
#X connect 1 0 2 0;
#X connect 3 0 4 0;
#X connect 4 0 2 0;
#X restore 351 507 pd view-system;
#N canvas 695 50 264 263 view-difference 0;
#X obj 39 39 inlet;
#X obj 39 180 s \$0-difference;
#X msg 39 75 arrayviewlistnew;
#X obj 57 108 r \$0-test-prepare;
#X msg 57 135 arrayviewclose;
#X connect 0 0 2 0;
#X connect 2 0 1 0;
#X connect 3 0 4 0;
#X connect 4 0 1 0;
#X restore 584 520 pd view-difference;
#N canvas 453 143 231 283 view-reference 0;
#X obj 27 31 inlet;
#X msg 27 59 arrayviewlistnew;
#X obj 27 144 s \$0-reference;
#X obj 42 88 r \$0-test-prepare;
#X msg 42 114 arrayviewclose;
#X connect 0 0 1 0;
#X connect 1 0 2 0;
#X connect 3 0 4 0;
#X connect 4 0 2 0;
#X restore 100 507 pd view-reference;
#N canvas 739 28 261 427 test-result-messages 0;
#X obj 32 23 inlet;
#X obj 59 310 stdout;
#X obj 32 84 sel 0;
#X obj 89 166 r \$0-refname;
#X obj 89 193 symbol;
#X obj 32 56 moses 1e-05;
#X obj 32 277 t b a;
#X msg 32 336 UNIT-TEST-DONE;
#X obj 32 373 stdout;
#X obj 32 221 pack s f s;
#X obj 112 309 print unit-test;
#X obj 85 373 print unit-test;
#X obj 32 249 list trim;
#X msg 59 113 STDDEV-SMALL \$1;
#X msg 32 141 STDDEV-ZERO 0;
#X msg 95 84 STDDEV-LARGE \$1;
#N canvas 49 312 252 304 stddev-label 0;
#X obj 40 29 inlet;
#X obj 40 92 sel 0;
#X obj 40 64 moses 1e-05;
#X msg 103 92 STDDEV-LARGE;
#X msg 67 121 STDDEV-SMALL;
#X msg 40 149 STDDEV-ZERO;
#X msg 40 221 label \$1;
#X obj 40 191 symbol;
#X obj 40 250 s \$0-stddev-label;
#X connect 0 0 2 0;
#X connect 1 0 5 0;
#X connect 1 1 4 0;
#X connect 2 0 1 0;
#X connect 2 1 3 0;
#X connect 3 0 7 0;
#X connect 4 0 7 0;
#X connect 5 0 7 0;
#X connect 6 0 8 0;
#X connect 7 0 6 0;
#X restore 126 50 pd stddev-label;
#X connect 0 0 5 0;
#X connect 0 0 16 0;
#X connect 2 0 14 0;
#X connect 2 1 13 0;
#X connect 3 0 4 0;
#X connect 4 0 9 2;
#X connect 5 0 2 0;
#X connect 5 1 15 0;
#X connect 6 0 7 0;
#X connect 6 1 1 0;
#X connect 6 1 10 0;
#X connect 7 0 8 0;
#X connect 7 0 11 0;
#X connect 9 0 12 0;
#X connect 12 0 6 0;
#X connect 13 0 9 0;
#X connect 14 0 9 0;
#X connect 15 0 9 0;
#X restore 327 164 pd test-result-messages;
#X floatatom 203 247 5 0 0 0 - #0-test-delay -;
#X text 201 269 delay;
#N canvas 628 152 504 542 list-drip 0;
#X obj 68 94 t a a;
#X obj 68 251 spigot;
#X obj 101 159 bang;
#X obj 101 185 1;
#X obj 207 160 route bang;
#X obj 170 160 bang;
#X obj 170 186 0;
#X obj 101 124 list split 2;
#X obj 134 348 list split;
#X obj 191 297 list length;
#X obj 191 319 >> 1;
#X obj 68 280 t a a a a;
#X obj 68 439 list split;
#X obj 125 391 list length;
#X obj 125 416 >> 1;
#X obj 41 29 inlet;
#X obj 264 186 outlet;
#X text 83 29 Copyright 2009 by Mathieu Bouchard;
#X obj 41 63 t b a;
#X obj 328 80 outlet;
#X text 383 82 signal end of list;
#X text 35 502 made compatible with [list-drip]: fbar 2009;
#X connect 0 0 1 0;
#X connect 0 1 7 0;
#X connect 1 0 11 0;
#X connect 2 0 3 0;
#X connect 3 0 1 1;
#X connect 4 1 16 0;
#X connect 5 0 6 0;
#X connect 6 0 1 1;
#X connect 7 0 2 0;
#X connect 7 2 4 0;
#X connect 7 2 5 0;
#X connect 8 0 0 0;
#X connect 9 0 10 0;
#X connect 10 0 8 1;
#X connect 11 0 12 0;
#X connect 11 1 13 0;
#X connect 11 2 8 0;
#X connect 11 3 9 0;
#X connect 12 1 0 0;
#X connect 13 0 14 0;
#X connect 14 0 12 1;
#X connect 15 0 18 0;
#X connect 18 0 19 0;
#X connect 18 1 0 0;
#X restore 328 52 pd list-drip;
#X obj 257 555 s \$0-test-prepare;
#X obj 256 208 r \$0-do-test;
#N canvas 716 407 203 281 index0-511 0;
#X obj 41 49 inlet;
#X obj 41 224 outlet;
#X obj 41 139 until;
#X msg 41 107 512;
#X obj 41 169 f;
#X obj 72 169 + 1;
#X obj 41 79 t b b;
#X msg 80 139 0;
#X connect 0 0 6 0;
#X connect 2 0 4 0;
#X connect 3 0 2 0;
#X connect 4 0 5 0;
#X connect 4 0 1 0;
#X connect 5 0 4 1;
#X connect 6 0 3 0;
#X connect 6 1 7 0;
#X connect 7 0 4 1;
#X restore 335 605 pd index0-511;
#X obj 43 371 hsl 195 100 0 127 0 0 empty empty empty -2 -8 0 10 -203904
-203904 -1 0 1;
#N canvas 0 22 450 300 (subpatch) 0;
#X array \$0-reference 512 float 0;
#X coords 0 1 511 -1 200 100 1;
#X restore 40 371 graph;
#X obj 473 371 hsl 195 100 0 127 0 0 empty empty empty -2 -8 0 10 -203904
-203904 -1 0 1;
#N canvas 0 22 450 300 (subpatch) 0;
#X array \$0-difference 512 float 0;
#X coords 0 1 511 -1 200 100 1;
#X restore 470 371 graph;
#X obj 258 371 hsl 195 100 0 127 0 0 empty empty empty -2 -8 0 10 -203904
-203904 -1 0 1;
#N canvas 0 22 450 300 (subpatch) 0;
#X array \$0-system-under-test 512 float 0;
#X coords 0 1 511 -1 200 100 1;
#X restore 255 371 graph;
#X obj 256 239 bng 50 250 50 0 \$0-dummysend \$0-dummyreceive empty
17 7 0 10 -203904 -204786 -203904;
#X obj 256 239 bng 50 1000 50 0 \$0-dummysend \$0-dummyreceive done
7 25 0 14 -203904 -1 -203904;
#X text 588 21 dummy;
#X text 73 23 reference name + delay;
#X text 367 25 floats & lists;
#X text 40 481 test-bang out;
#X text 589 481 test-bang out;
#X text 405 481 index 0 - 511 out;
#X obj 467 237 cnv 15 100 20 empty empty [unit-test-frame] 2 12 0 14
-262144 -66577 0;
#X msg 540 520 vis 1;
#X obj 540 548 s pd-info-unit-test\$0;
#N canvas 473 125 566 541 info-unit-test\$0 0;
#X text 144 474 STDDEV-ZERO 0;
#X text 144 516 STDDEV-LARGE <stddev>;
#X text 144 494 STDDEV-SMALL <stddev>;
#X text 296 495 when standard deviation < 1e-05;
#X text 296 516 when standard deviation >= 1e-05;
#X text 296 474 when standard deviation = 0;
#X text 129 46 ------------------------------------------------------------
;
#X text 127 378 ------------------------------------------------------------
;
#X text 126 538 ------------------------------------------------------------
;
#X text 131 808 Katja Vetter & Fred Jan Kraan \, October 2011;
#X text 127 556 The reference file must be in the same directory as
the test. If it is not found when the patch is loaded \, an error is
reported to the Pd window and stdout:;
#X text 122 821 ------------------------------------------------------------
;
#X text 129 67 1: Test arguments must be sent as a list into the first
inlet:;
#X text 149 606 REFERENCE-FILE-ERROR reference file not found: <reference>
;
#X text 128 398 The test is automatically executed when the patch is
loaded \, and can also be started with button 'test'. Difference between
signal under test and reference is graphed \, and standard deviation
is computed. A test result message is sent to the Pd window and stdout:
;
#X text 124 779 ------------------------------------------------------------
;
#X text 26 19 arguments;
#X obj 29 39 loadbang;
#X obj 32 407 bng 50 250 50 0 empty empty test 5 25 0 14 -260097 -262144
-1;
#X obj 33 555 bng 50 250 50 0 empty empty write 4 25 0 14 -260097 -262144
-1;
#X text 124 714 ------------------------------------------------------------
;
#X obj 29 94 loadbang;
#X text 130 98 - reference name \, matching the name of the test patch
;
#X text 130 22 how to use [unit-test-frame.pd] in unit test patches
;
#X msg 29 66 sqrt 0;
#X msg 29 121 pipe 100;
#X text 130 116 - delaytime between test trigger and test snapshot.
;
#X text 129 137 2: Messages from the object(s) under test must be sent
into the second inlet. Floats and lists are both accepted. When testing
an external object \, consider instantiating it with namespace \, like
[zexy/wrap].;
#X text 127 631 A reference file can be created from the content of
\$0-signal-under-test \, using a Pd which is known to work well (the
latest release). Use button 'write'. The file will have 512 samples
in 32 bit .wav format. Even though the test output is not a signal
\, this is a good format to write.;
#X text 130 203 Use a bang from one of [unit-test-frame.pd] outlets
to trigger the object(s) when the test starts. Or use the index 0 -
511 outlet to generate a series of output values.;
#X text 131 255 Normalization of the object output (within interval
0 to 1 or -1 to 1) is useful. It gives a good graph and a meaningful
stddev. Also note that large numbers are unprecise. Example: the difference
between 1e+12 in single precision and 1e+12 in double precision is
27968! Try this on:;
#X text 149 345 http://www.h-schmidt.net/FloatApplet/IEEE754.html;
#X text 124 733 Apart from [ggee/getdir] \, [unit-test-frame.pd] uses
only vanilla Pd classes. For testing external classes \, consider using
namespaces like in [zexy/wrap].;
#X connect 17 0 24 0;
#X connect 21 0 25 0;
#X restore 555 165 pd info-unit-test\$0;
#X obj 428 531 s \$0-difference;
#X obj 384 629 outlet;
#X obj 238 577 t b b b b;
#X text 209 481 test-bang out;
#X obj 39 183 s \$0-refname;
#X obj 39 74 symbol;
#N canvas 673 76 412 506 load-reference 0;
#X obj 36 27 inlet;
#X obj 36 203 soundfiler;
#X obj 81 112 f \$0;
#X obj 36 136 pack s f;
#X obj 36 94 t a b;
#X obj 36 461 s \$0-do-test;
#X obj 75 375 pack s s s s s s;
#X obj 168 297 r \$0-refname;
#X obj 75 432 stdout;
#X obj 36 235 sel 512;
#X obj 36 60 spigot 1;
#X msg 81 27 0;
#X text 119 29 at load \, try to read reference file and do test;
#X msg 75 271 REFERENCE-FILE-ERROR reference file not found:;
#X msg 168 324 \$1.wav;
#X obj 168 349 symbol;
#X obj 75 402 list trim;
#X obj 127 432 print unit-test;
#X msg 125 135 read ./\$1.wav \$2-reference;
#X msg 36 173 read \$1.wav \$2-reference;
#X connect 0 0 10 0;
#X connect 1 0 9 0;
#X connect 2 0 3 1;
#X connect 3 0 19 0;
#X connect 4 0 3 0;
#X connect 4 1 2 0;
#X connect 6 0 16 0;
#X connect 7 0 14 0;
#X connect 9 0 5 0;
#X connect 9 1 13 0;
#X connect 10 0 4 0;
#X connect 10 0 11 0;
#X connect 11 0 10 1;
#X connect 13 0 6 0;
#X connect 14 0 15 0;
#X connect 15 0 6 5;
#X connect 16 0 8 0;
#X connect 16 0 17 0;
#X connect 19 0 1 0;
#X restore 58 155 pd load-reference;
#N canvas 405 322 429 358 prepend-path 0;
#X obj 21 13 inlet;
#X obj 48 131 ggee/getdir 2;
#X obj 48 104 t b a;
#X obj 21 283 spigot 1;
#X msg 66 235 0;
#X obj 21 45 t a a;
#X obj 21 169 pack s s;
#X msg 21 200 \$1/\$2;
#X msg 102 235 1;
#X obj 102 266 pipe 100;
#X obj 21 314 outlet;
#X text 76 11 Try to prepend absolute path of the abstraction's parent.
If [ggee/getdir] is not present \, the path is relative to the abstraction.
;
#X msg 21 75 .;
#X connect 0 0 5 0;
#X connect 1 0 6 0;
#X connect 2 0 1 0;
#X connect 2 1 6 1;
#X connect 3 0 4 0;
#X connect 3 0 8 0;
#X connect 3 0 10 0;
#X connect 4 0 3 1;
#X connect 5 0 12 0;
#X connect 5 1 2 0;
#X connect 6 0 7 0;
#X connect 7 0 3 0;
#X connect 8 0 9 0;
#X connect 9 0 3 1;
#X connect 12 0 6 0;
#X restore 58 101 pd prepend-path;
#X obj 71 130 s \$0-refpath;
#N canvas 240 70 389 572 write-reference 1;
#X obj 51 436 soundfiler;
#X obj 51 379 list;
#X obj 50 16 inlet;
#X floatatom 82 470 5 0 0 0 - - -;
#X text 90 16 bang;
#X obj 51 124 r \$0-do-write-reference;
#X obj 143 152 r \$0-abort-write-reference;
#X obj 51 471 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
-1;
#X obj 51 532 s \$0-do-test;
#X obj 72 153 delay 500;
#X msg 257 46 \$1.wav;
#X obj 257 71 symbol;
#X obj 257 99 s \$0-ref-wav-name;
#N canvas 574 380 410 288 write-reference-popup\$0 0;
#X obj 97 197 bng 60 400 50 0 \$0-do-write-reference empty continue
2 28 0 12 -260097 -262144 -1;
#X obj 231 197 bng 60 300 50 0 \$0-abort-write-reference empty abort
8 28 0 12 -204786 -262144 -1;
#X obj 29 67 hsl 350 100 0 127 0 0 \$0-dummysend \$0-dummyreceive empty
-2 -8 0 10 -262144 -262144 -1 0 1;
#X symbolatom 33 85 30 0 0 0 - #0-refname #0-dummysend;
#X symbolatom 33 127 30 0 0 0 - #0-ref-wav-name #0-dummysend;
#X text 31 67 reference name:;
#X text 31 108 file name:;
#X text 24 11 This action will overwrite your reference .wav file with
the content of \$0-signal-under-test. The action can not be undone!
;
#X restore 51 95 pd write-reference-popup\$0;
#X obj 50 68 s pd-write-reference-popup\$0;
#X msg 50 43 vis 1;
#X obj 72 230 s pd-write-reference-popup\$0;
#X msg 72 205 vis 0;
#X obj 143 177 delay 200;
#X obj 72 264 r \$0-refpath;
#X obj 72 292 t a b;
#X obj 99 321 f \$0;
#X obj 72 350 pack s f;
#X msg 51 407 write -wave -bytes 4 \$1 \$2-system-under-test;
#X obj 257 20 r \$0-refname;
#N canvas 0 22 282 435 copy-to-reference 0;
#X obj 36 50 inlet;
#X msg 36 105 512;
#X obj 36 136 until;
#X obj 36 198 f;
#X obj 68 198 + 1;
#X obj 36 80 t b b;
#X msg 51 169 0;
#X obj 55 270 tabread \$0-system-under-test;
#X obj 55 307 tabwrite \$0-reference;
#X obj 36 332 == 511;
#X obj 36 236 t f f f;
#X obj 36 363 outlet;
#X connect 0 0 5 0;
#X connect 1 0 2 0;
#X connect 2 0 3 0;
#X connect 3 0 4 0;
#X connect 3 0 10 0;
#X connect 4 0 3 1;
#X connect 5 0 1 0;
#X connect 5 1 6 0;
#X connect 6 0 3 1;
#X connect 7 0 8 0;
#X connect 9 0 11 0;
#X connect 10 0 9 0;
#X connect 10 1 7 0;
#X connect 10 2 8 1;
#X restore 51 499 pd copy-to-reference;
#X connect 0 0 3 0;
#X connect 0 0 7 0;
#X connect 1 0 23 0;
#X connect 2 0 15 0;
#X connect 5 0 1 0;
#X connect 5 0 9 0;
#X connect 6 0 18 0;
#X connect 7 0 25 0;
#X connect 9 0 17 0;
#X connect 10 0 11 0;
#X connect 11 0 12 0;
#X connect 15 0 14 0;
#X connect 17 0 16 0;
#X connect 18 0 17 0;
#X connect 19 0 20 0;
#X connect 20 0 22 0;
#X connect 20 1 21 0;
#X connect 21 0 22 1;
#X connect 22 0 1 1;
#X connect 23 0 0 0;
#X connect 24 0 10 0;
#X connect 25 0 8 0;
#X restore 39 208 pd write-reference;
#X connect 0 0 26 0;
#X connect 1 0 25 0;
#X connect 2 0 27 0;
#X connect 3 0 50 0;
#X connect 6 0 24 0;
#X connect 7 0 62 0;
#X connect 11 0 28 0;
#X connect 11 0 42 0;
#X connect 12 0 21 0;
#X connect 13 0 31 0;
#X connect 18 0 55 0;
#X connect 19 0 20 0;
#X connect 19 0 53 0;
#X connect 21 0 58 0;
#X connect 21 1 22 0;
#X connect 24 0 18 0;
#X connect 24 1 32 0;
#X connect 24 2 19 0;
#X connect 31 0 23 0;
#X connect 33 0 6 0;
#X connect 34 0 17 0;
#X connect 50 0 51 0;
#X connect 55 0 15 0;
#X connect 55 1 16 0;
#X connect 55 2 34 0;
#X connect 55 3 54 0;
#X connect 58 0 57 0;
#X connect 58 0 60 0;
#X connect 60 0 59 0;
#X connect 60 0 61 0;
#X coords 0 -1 1 1 650 270 2 30 230;