aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormusil <tmusil@users.sourceforge.net>2006-11-28 18:37:46 +0000
committermusil <tmusil@users.sourceforge.net>2006-11-28 18:37:46 +0000
commita4706489501b418a1a0f2c41bb32a3c416fa2a08 (patch)
tree690e61f195b8c1eace8453625aecbb0ed1691369
parentd2a273ebc92f3d1336212f01891a070bf4a31b41 (diff)
change to binary 1
svn path=/trunk/externals/iem/iem_bin_ambi/; revision=6496
-rw-r--r--help/ambi_reduced_decode_fft2-help.pd241
-rw-r--r--help/ambi_reduced_decode_fir2-help.pd264
2 files changed, 264 insertions, 241 deletions
diff --git a/help/ambi_reduced_decode_fft2-help.pd b/help/ambi_reduced_decode_fft2-help.pd
deleted file mode 100644
index d0a1260..0000000
--- a/help/ambi_reduced_decode_fft2-help.pd
+++ /dev/null
@@ -1,241 +0,0 @@
-#N canvas 90 10 884 683 10;
-#X text 795 99 1.arg: <float> ambisonic order;
-#X text 880 255 ambisonic-order = n_ao;
-#X text 1068 330 ambisonic-order-group;
-#X text 856 371 -90 <= delta <= +90;
-#X text 856 383 -180 <= phi <= +180;
-#X text 797 330 input: <ambi_weight> one mul-factor for each;
-#X text 797 279 input: <ls> index + phi [degree] .. 2-dimensional;
-#X text 797 289 input: <ls> index + delta + phi [degree] .. 3-dimensional
-;
-#X text 797 303 input: <phls> index + phi [degree .. 2-dimensional
-;
-#X text 797 314 input: <phls> index + delta + phi [degree] .. 3-dimensional
-;
-#X text 821 461 <float> n_col = (2*n_ao+1) = number of ambisonic-channels
-;
-#X text 809 470 + <float> n_row = (n_ls) = number of loudspeakers;
-#X text 1049 256 number of loudspeakers = n_ls;
-#X text 812 530 + <float> n_row = (n_ls) = number of loudspeakers;
-#X text 797 511 output in case of 3d: <matrix> ((n_ao+1)*(n_ao+1)*n_ls+2)
-;
-#X text 795 450 output in case of 2d: <matrix> ((2*n_ao+1)*n_ls+2)
-;
-#X text 1142 511 <float> :;
-#X text 1099 449 <float> :;
-#X text 1039 521 number of ambisonic-channels;
-#X text 824 521 <float> n_col = (n_ao+1)*(n_ao+1) =;
-#X text 1010 540 <float> elements of a matrix;
-#X text 812 540 + (n_ao + 1) * (n_ao + 1) * n_ls;
-#X text 809 480 + (2*n_ao + 1) * n_ls <float> elements of a matrix
-;
-#X text 790 403 input: <pinv> calculates the pseudo-inverse of the
-encoded;
-#X text 846 414 loudspeaker-positions (+ the phantom-speakers);
-#X text 860 425 and output a matrix-message;
-#X text 871 360 1 <= index <= n_ao;
-#X text 885 211 a regular matrix to inverse it);
-#X text 958 342 to suppress the side-lobe-phenomena;
-#X text 808 201 (it is sometimes necessary to add phantom-ls. for achieving
-;
-#X text 810 117 (1 .. 5 in case of 3 dimensional);
-#X text 810 108 (1 .. 12 in case of 2 dimensional);
-#X text 796 139 3.arg: <float> number of independent loudspeakers;
-#X text 795 127 2.arg: <float> dimension (2 or 3);
-#X text 795 190 5.arg: <float> number of canceled phantom_loudspeakers
-;
-#X text 796 151 4.arg: <float> number of merged and mirrored loudspeakers
-;
-#X text 842 164 (the merged loudspeakers are at the border of the arc
-;
-#X text 855 176 or the hemisphere \, the mirrored loudspeakers are
-;
-#X obj 18 350 soundfiler;
-#X obj 27 188 unpack s s;
-#X msg 18 329 read -skip \$1 \$2 \$3;
-#X obj 358 278 pp element;
-#X obj 45 284 mergefilename /;
-#X text 357 316 multiplexer control indices;
-#X text 353 327 for spec2_matrix_bundle_stat~;
-#X text 423 76 1.arg: <float> unique-number used as table-name-prefix
-;
-#X text 423 86 2.arg: <symbol> left HRIR-table-name;
-#X text 423 96 3.arg: <symbol> real HRTF-table-name;
-#X text 423 106 4.arg: <symbol> imag HRTF-table-name;
-#X text 423 116 5.arg: <symbol> HRIR-fadeout-window-table-name;
-#X obj 18 308 pack f s s;
-#X text 423 126 6.arg: <float> ambisonic order;
-#X text 423 136 7.arg: <float> ambisonic dimension;
-#X text 423 146 8.arg: <float> number of real loudspeakers;
-#X text 423 156 9.arg: <float> number of phantom loudspeakers;
-#X text 417 166 10.arg: <float> FFT-size = 2 x effective HRIR-length
-;
-#X obj 94 108 bin_ambi_reduced_decode_fft2 \$0 HRIR HRTF_re HRTF_im
-fadeout 1 2 4 0 256;
-#X obj 14 473 table \$0_fadeout 256;
-#X obj 45 236 symbol .;
-#X obj 27 211 t b b s;
-#X obj 45 258 pack s s;
-#X obj 18 245 f 0;
-#X obj 94 60 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
--1;
-#X obj 357 299 print;
-#X obj 13 387 table \$0_1_HRIR 256;
-#X obj 249 382 table \$0_1_HRTF_re 256;
-#X obj 389 382 table \$0_1_HRTF_im 256;
-#X obj 13 447 table \$0_4_HRIR 256;
-#X obj 13 427 table \$0_3_HRIR 256;
-#X obj 13 407 table \$0_2_HRIR 256;
-#X obj 249 402 table \$0_2_HRTF_re 256;
-#X obj 249 422 table \$0_3_HRTF_re 256;
-#X obj 389 422 table \$0_3_HRTF_im 256;
-#X obj 389 402 table \$0_2_HRTF_im 256;
-#N canvas 26 6 959 718 input_messages 0;
-#X obj 42 641 outlet;
-#X text 33 659 to bin_ambi_reduced_decode;
-#X msg 715 529 calc_reduced \$1;
-#X msg 372 418 calc_pinv;
-#X msg 444 454 check_HRIR_arrays \$1;
-#X msg 581 491 check_HRTF_arrays \$1;
-#X msg 818 545 calc_sym;
-#X obj 134 154 pp pht_ls;
-#X obj 64 110 pp real_ls;
-#X obj 23 60 pp load_HRIR;
-#X obj 444 434 for++ 1 4 10;
-#X obj 444 414 del 10;
-#X obj 581 451 del 10;
-#X obj 581 471 for++ 1 3 10;
-#X obj 715 488 del 10;
-#X obj 715 508 for++ 1 3 10;
-#X obj 818 525 del 10;
-#X msg 23 37 1 L0e045a.wav \, 2 L0e135a.wav \, 3 L0e225a.wav \, 4 L0e315a.wav
-;
-#X obj 197 202 pp ipht_ireal_muladd;
-#X obj 294 336 pp ambi_weight;
-#X obj 240 271 pp sing_range;
-#X msg 134 134 1 -90 0;
-#X msg 240 251 1e-010;
-#X text 403 31 <list> : <float> loudspeaker-index + <symbol> left-ear-HRIR-wav
-\, index beginning with one;
-#X text 272 81 <list> : <float> loudspeaker-index + <float> elevation
-in degree + <float> azimuth in degree \, index beginning with one \,
-elevation geodetical \, azimuth counterclockwise positiv;
-#X text 699 37 list of HRIRs;
-#X text 645 93 list of the real loudspeaker-coordinates;
-#X text 570 147 list of the phantom loudspeaker-coordinates;
-#X text 200 130 <list> : <float> loudspeaker-index + <float> elevation
-in degree + <float> azimuth in degree \, index beginning with one \,
-elevation geodetical \, azimuth counterclockwise positiv;
-#X msg 197 181 1 4 0.707;
-#X text 330 170 <list> : <float> phantom-loudspeaker-index + <float>
-real-loudspeaker-index + <float> mirror-weight \, both index beginning
-greater zero \, mul-factor should be the cosine of the elevation-angle-difference
-;
-#X text 326 239 <float> singularity-range: when calculating the inverse
-of the loudspeaker-matrix \, we use gauss-algorithm. if we divide a
-matrix-element by a number less then this range \, we say \, this matrix
-is not regulary.;
-#X obj 372 397 del 10;
-#X obj 323 292 del 10;
-#X obj 116 63 del 10;
-#X obj 24 7 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1
-;
-#X msg 305 314 1 1;
-#X obj 65 4 inlet;
-#X msg 64 90 1 45 \, 2 135 \, 3 225 \, 4 315;
-#X text 156 74 this is 2-d case;
-#X connect 2 0 0 0;
-#X connect 3 0 0 0;
-#X connect 4 0 0 0;
-#X connect 5 0 0 0;
-#X connect 6 0 0 0;
-#X connect 7 0 0 0;
-#X connect 8 0 0 0;
-#X connect 9 0 0 0;
-#X connect 10 0 4 0;
-#X connect 10 1 12 0;
-#X connect 11 0 10 0;
-#X connect 12 0 13 0;
-#X connect 13 0 5 0;
-#X connect 13 1 14 0;
-#X connect 14 0 15 0;
-#X connect 15 0 2 0;
-#X connect 15 1 16 0;
-#X connect 16 0 6 0;
-#X connect 17 0 9 0;
-#X connect 18 0 0 0;
-#X connect 19 0 0 0;
-#X connect 20 0 0 0;
-#X connect 21 0 7 0;
-#X connect 22 0 20 0;
-#X connect 29 0 18 0;
-#X connect 32 0 3 0;
-#X connect 32 0 11 0;
-#X connect 33 0 32 0;
-#X connect 33 0 36 0;
-#X connect 34 0 38 0;
-#X connect 34 0 33 0;
-#X connect 35 0 17 0;
-#X connect 35 0 34 0;
-#X connect 36 0 19 0;
-#X connect 37 0 35 0;
-#X connect 38 0 8 0;
-#X restore 94 83 pd input_messages;
-#X text 21 12 ambi_reduced_decode_fft2;
-#X text 215 9 calculates a reduced set of HRTF-spectras;
-#N canvas 0 0 461 380 init 0;
-#X obj 124 23 loadbang;
-#X obj 124 45 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
--1;
-#X obj 124 73 for++ 0 127;
-#X obj 124 144 t b;
-#X msg 124 164 1;
-#X obj 124 123 moses 95;
-#X obj 167 144 - 95;
-#X obj 167 166 / 32;
-#X obj 167 220 * 3.14159;
-#X obj 167 264 t f f;
-#X obj 172 286 *;
-#X obj 172 317 tabwrite \$0_fadeout;
-#X obj 270 162 + 128;
-#X msg 270 185 0 \$1;
-#X obj 153 97 t f f f;
-#X obj 167 241 cos;
-#X obj 167 199 / 2;
-#X connect 0 0 1 0;
-#X connect 1 0 2 0;
-#X connect 2 0 14 0;
-#X connect 3 0 4 0;
-#X connect 4 0 11 0;
-#X connect 5 0 3 0;
-#X connect 5 1 6 0;
-#X connect 6 0 7 0;
-#X connect 7 0 16 0;
-#X connect 8 0 15 0;
-#X connect 9 0 10 0;
-#X connect 9 1 10 1;
-#X connect 10 0 11 0;
-#X connect 12 0 13 0;
-#X connect 13 0 11 0;
-#X connect 14 0 5 0;
-#X connect 14 1 11 1;
-#X connect 14 2 12 0;
-#X connect 15 0 9 0;
-#X connect 16 0 8 0;
-#X restore 92 496 pd init;
-#X connect 39 0 59 0;
-#X connect 39 1 50 2;
-#X connect 40 0 38 0;
-#X connect 41 0 63 0;
-#X connect 42 0 50 1;
-#X connect 50 0 40 0;
-#X connect 56 0 39 0;
-#X connect 56 1 41 0;
-#X connect 58 0 60 0;
-#X connect 59 0 61 0;
-#X connect 59 1 58 0;
-#X connect 59 2 60 1;
-#X connect 60 0 42 0;
-#X connect 61 0 50 0;
-#X connect 62 0 74 0;
-#X connect 74 0 56 0;
diff --git a/help/ambi_reduced_decode_fir2-help.pd b/help/ambi_reduced_decode_fir2-help.pd
new file mode 100644
index 0000000..df9c8ee
--- /dev/null
+++ b/help/ambi_reduced_decode_fir2-help.pd
@@ -0,0 +1,264 @@
+#N canvas 87 6 810 646 10;
+#X obj 29 365 soundfiler;
+#X obj 38 203 unpack s s;
+#X msg 29 344 read -skip \$1 \$2 \$3;
+#X obj 387 335 pp element;
+#X obj 56 299 mergefilename /;
+#X text 386 373 multiplexer control indices;
+#X text 382 384 for spec2_matrix_bundle_stat~;
+#X text 407 133 1.arg: <float> unique-number used as table-name-prefix
+;
+#X obj 29 323 pack f s s;
+#X obj 56 251 symbol .;
+#X obj 38 226 t b b s;
+#X obj 56 273 pack s s;
+#X obj 29 260 f 0;
+#X obj 38 60 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 387 356 print;
+#X text 407 143 2.arg: <symbol> last part of left HRIR table name;
+#N canvas 0 0 469 388 init_fadeout 0;
+#X obj 124 23 loadbang;
+#X obj 124 45 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X obj 124 73 for++ 0 127;
+#X obj 124 144 t b;
+#X msg 124 164 1;
+#X obj 124 123 moses 95;
+#X obj 167 144 - 95;
+#X obj 167 166 / 32;
+#X obj 167 220 * 3.14159;
+#X obj 167 264 t f f;
+#X obj 172 286 *;
+#X obj 172 317 tabwrite \$0_fadeout;
+#X obj 270 162 + 128;
+#X msg 270 185 0 \$1;
+#X obj 153 97 t f f f;
+#X obj 167 241 cos;
+#X obj 167 199 / 2;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
+#X connect 2 0 14 0;
+#X connect 3 0 4 0;
+#X connect 4 0 11 0;
+#X connect 5 0 3 0;
+#X connect 5 1 6 0;
+#X connect 6 0 7 0;
+#X connect 7 0 16 0;
+#X connect 8 0 15 0;
+#X connect 9 0 10 0;
+#X connect 9 1 10 1;
+#X connect 10 0 11 0;
+#X connect 12 0 13 0;
+#X connect 13 0 11 0;
+#X connect 14 0 5 0;
+#X connect 14 1 11 1;
+#X connect 14 2 12 0;
+#X connect 15 0 9 0;
+#X connect 16 0 8 0;
+#X restore 157 510 pd init_fadeout;
+#X text 87 585 IEM KUG;
+#X text 71 573 musil;
+#X text 101 573 @;
+#X text 107 573 iem.at;
+#X text 70 595 Graz \, Austria;
+#X text 22 562 (c) Thomas Musil 2000 - 2006;
+#X text 211 40 up to 12.Order 2-dimensional;
+#X text 208 28 up to 5.Order 3-dimensional or;
+#X text 220 14 AMBISONIC BINAURAL DECODING;
+#X text 429 20 calculates a reduced set;
+#X obj 39 112 cnv 15 102 15 empty empty empty 20 12 0 14 -260818 -66577
+0;
+#N canvas 0 5 998 715 input_messages 0;
+#X obj 197 645 outlet;
+#X msg 67 401 calc_pinv;
+#X msg 14 615 calc_sym;
+#X obj 93 273 pp pht_ls;
+#X obj 107 218 pp real_ls;
+#X obj 120 174 pp load_HRIR;
+#X msg 120 154 1 L0e045a.wav \, 2 L0e135a.wav \, 3 L0e225a.wav \, 4
+L0e315a.wav;
+#X obj 80 336 pp ipht_ireal_muladd;
+#X obj 133 130 pp ambi_weight;
+#X obj 147 86 pp sing_range;
+#X msg 93 253 1 -90 0;
+#X msg 147 66 1e-010;
+#X msg 80 315 1 4 0.707;
+#X obj 14 26 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
+-1;
+#X msg 133 110 1 1;
+#X obj 14 5 inlet;
+#X msg 107 198 1 45 \, 2 135 \, 3 225 \, 4 315;
+#X text 670 112 -180 <= phi <= +180;
+#X text 231 115 input: <ambi_weight> one mul-factor for each;
+#X text 655 12 n_ao = ambisonic-order;
+#X text 667 49 all angles in degree;
+#X text 276 126 ambisonic order group to suppress the side-lobe-phenomena
+;
+#X text 273 388 of all (real + phantom) loudspeaker positions \,;
+#X text 274 412 and calculates the pseudo inverse.;
+#X text 277 400 multiplicates the ambi order weight;
+#X text 536 304 mirror_weight;
+#X text 275 330 phantom speaker with the factor "mirror_weight" and
+adds;
+#X text 231 38 input: <sing_range> singularity range;
+#X text 274 49 when calculating the inverse of the matrix by gauss
+;
+#X text 274 59 algorithm \, you have to divide a row by a certain number
+\,;
+#X text 274 79 outside of this range (> sing_range \, or < -sing_range).
+;
+#X text 274 91 Otherwise we say \, this matrix is singular.;
+#X text 274 69 to achieve the identity matrix. This number has to be
+;
+#X text 640 23 n_re_ls = number of real loudspeakers;
+#X text 640 35 n_vi_ls = number of virtual phantom loudspeakers;
+#X text 271 197 input: <real_ls> re_ls_index + phi .. 2-dimensional
+;
+#X text 271 208 input: <real_ls> re_ls_index + theta + phi .. 3-dimensional
+;
+#X text 231 241 input: <pht_ls> vi_ls_index + phi .. 2-dimensional
+;
+#X text 231 252 input: <pht_ls> vi_ls_index + theta + phi .. 3-dimensional
+;
+#X text 670 100 -90 <= theta <= +90;
+#X text 662 76 1 <= re_ls_index <= n_re_ls;
+#X text 662 87 1 <= vi_ls_index <= n_vi_ls;
+#X text 313 219 encodes the re_ls_index row of a matrix;
+#X text 274 264 encodes the (re_ls_index + vi_ls_index) row of a matrix
+;
+#X text 275 275 we need them to achieve a nonsingular matrix;
+#X obj 14 45 t b b b b b b b b b b b;
+#X obj 27 584 pp calc_reduced;
+#X msg 27 562 1 \, 2 \, 3;
+#X msg 40 506 1 \, 2 \, 3;
+#X msg 53 454 1 \, 2 \, 3 \, 4;
+#X obj 53 475 pp check_HRIR_arrays;
+#X text 481 150 input: <load_HRIR> : re_ls_index + left_ear_HRIR_wav_file
+;
+#X text 230 377 input: <calc_pinv> starts the encoding;
+#X text 230 304 input: <ipht_ireal_muladd> vi_ls_index re_ls_index
+;
+#X text 276 317 multiplies the column "vi_ls_index + re_ls_index" of
+;
+#X text 274 343 this column to the column "re_ls_index" of real speaker
+;
+#X text 230 442 input: <check_HRIR_arrays> re_ls_index;
+#X text 275 468 index of the HRIR from loudspeaker to the left ear.
+;
+#X text 274 455 checks the existence of the table with the "re_ls_index"-th
+;
+#X text 274 509 checks the existence of the reduced decoder table;
+#X text 275 522 with the "ambi_ch_index"-th index.;
+#X text 273 534 [1 .. (2*n_ao+1)] 2d;
+#X text 421 534 [1 .. (n_ao+1)*(n_ao+1)] 3d;
+#X text 230 561 input: <calc_reduced> ambi_ch_index;
+#X text 275 574 multiplies the matrix of HRIR with the "ambi_ch_index"-th
+;
+#X text 26 663 to bin_ambi_reduced_decode_fft2;
+#X text 524 162 and outputs on the left 2 symbols (table + wav);
+#X text 230 611 input: <calc_sym> outputs a list of 2 floats;
+#X text 273 622 second float is the index \, first float is one or
+two;
+#X text 273 633 one means symmetric \, two means asymmetric column
+of;
+#X text 273 644 reduced decoder matrix. (message is especially for
+;
+#X text 253 223 ____________________________________________________________
+;
+#X text 253 279 ____________________________________________________________
+;
+#X text 253 347 ____________________________________________________________
+;
+#X text 253 416 ____________________________________________________________
+;
+#X text 253 473 ____________________________________________________________
+;
+#X text 253 539 ____________________________________________________________
+;
+#X text 253 592 ____________________________________________________________
+;
+#X text 253 662 ____________________________________________________________
+;
+#X text 255 95 ____________________________________________________________
+;
+#X text 496 168 ____________________________________________________________
+;
+#X text 636 58 _________________________________________________;
+#X text 636 121 _________________________________________________;
+#X text 66 24 in this order;
+#X text 275 655 matrix object "spec2_matrix_bundle_stat~";
+#X obj 40 527 pp check_HRIR_RED_arrays;
+#X text 230 496 input: <check_HRIR_RED_arrays> ambi_ch_index;
+#X text 273 587 column of the decoder matrix;
+#X connect 1 0 0 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
+#X connect 6 0 5 0;
+#X connect 7 0 0 0;
+#X connect 8 0 0 0;
+#X connect 9 0 0 0;
+#X connect 10 0 3 0;
+#X connect 11 0 9 0;
+#X connect 12 0 7 0;
+#X connect 13 0 45 0;
+#X connect 14 0 8 0;
+#X connect 15 0 13 0;
+#X connect 16 0 4 0;
+#X connect 45 0 2 0;
+#X connect 45 1 47 0;
+#X connect 45 2 48 0;
+#X connect 45 3 49 0;
+#X connect 45 4 1 0;
+#X connect 45 7 16 0;
+#X connect 45 8 6 0;
+#X connect 45 9 14 0;
+#X connect 45 10 11 0;
+#X connect 46 0 0 0;
+#X connect 47 0 46 0;
+#X connect 48 0 85 0;
+#X connect 49 0 50 0;
+#X connect 50 0 0 0;
+#X connect 85 0 0 0;
+#X restore 38 111 pd input_messages;
+#X text 108 203 load control of Head Related;
+#X text 108 215 Impulse Responses;
+#X text 21 12 ambi_reduced_decode_fir2;
+#X text 446 33 of HRIRs;
+#X obj 29 423 table \$0_1_HRIR 128;
+#X obj 29 443 table \$0_2_HRIR 128;
+#X obj 29 463 table \$0_3_HRIR 128;
+#X obj 29 483 table \$0_4_HRIR 128;
+#X obj 30 509 table \$0_fadeout 128;
+#X obj 265 418 table \$0_1_HRIR_RED 128;
+#X obj 265 438 table \$0_2_HRIR_RED 128;
+#X obj 265 458 table \$0_3_HRIR_RED 128;
+#X text 407 203 8.arg: <float> number of phantom loudspeakers;
+#X text 407 193 7.arg: <float> number of real loudspeakers;
+#X text 407 183 6.arg: <float> ambisonic dimension;
+#X text 407 173 5.arg: <float> ambisonic order;
+#X text 407 163 4.arg: <symbol> last part of HRIR fadeout window table
+name;
+#X text 407 153 3.arg: <symbol> last part of reduced HRIR table name
+;
+#X text 407 213 9.arg: <float> FIR-size = effective HRIR-length;
+#X obj 38 165 bin_ambi_reduced_decode_fir2 \$0 HRIR HRIR_RED fadeout
+1 2 4 0 128;
+#X connect 1 0 10 0;
+#X connect 1 1 8 2;
+#X connect 2 0 0 0;
+#X connect 3 0 14 0;
+#X connect 4 0 8 1;
+#X connect 8 0 2 0;
+#X connect 9 0 11 0;
+#X connect 10 0 12 0;
+#X connect 10 1 9 0;
+#X connect 10 2 11 1;
+#X connect 11 0 4 0;
+#X connect 12 0 8 0;
+#X connect 13 0 28 0;
+#X connect 28 0 48 0;
+#X connect 48 0 1 0;
+#X connect 48 1 3 0;