From 10b3fead00db11665f678639101e2c7653687140 Mon Sep 17 00:00:00 2001 From: Thomas O Fredericks Date: Tue, 22 Sep 2009 22:52:14 +0000 Subject: Almost ready for a release svn path=/trunk/externals/tof/; revision=12429 --- test/param-abs.pd | 33 ++++++++++ test/param-help.pd | 185 ++++++++++++++++++++++++----------------------------- test/param.c | 27 ++++---- test/param.h | 85 ++++++++++++------------ test/param2-abs.pd | 24 +++++++ test/paramDump.c | 2 + test/paramFile.c | 8 +-- test/paramGui.pd | 64 +++++++++--------- 8 files changed, 233 insertions(+), 195 deletions(-) create mode 100644 test/param-abs.pd create mode 100644 test/param2-abs.pd (limited to 'test') diff --git a/test/param-abs.pd b/test/param-abs.pd new file mode 100644 index 0000000..42a8146 --- /dev/null +++ b/test/param-abs.pd @@ -0,0 +1,33 @@ +#N canvas 1024 0 1018 716 10; +#X obj 222 468 outlet~; +#X obj 55 21 inlet; +#X obj 55 66 paramRoute; +#X text 179 26 This abstraction is an example for the param external. +; +#X floatatom 223 247 0 0 0 0 - - -; +#X obj 223 317 +~; +#X text 153 168 carrier; +#X text 152 186 frequency; +#X obj 224 359 osc~; +#X obj 56 97 print PARAM_NOTFOUND; +#X obj 223 171 loadbang; +#X obj 229 418 *~; +#X obj 298 421 line~; +#X msg 299 397 \$1 100; +#X obj 300 346 loadbang; +#X obj 300 370 param /volume 0 /gui slider 0 1; +#X obj 223 202 param /carrier 800 /gui slider 200 2000; +#X obj 261 302 param2-abs /id modulation; +#X connect 1 0 2 0; +#X connect 2 0 9 0; +#X connect 4 0 5 0; +#X connect 5 0 8 0; +#X connect 8 0 11 0; +#X connect 10 0 16 0; +#X connect 11 0 0 0; +#X connect 12 0 11 1; +#X connect 13 0 12 0; +#X connect 14 0 15 0; +#X connect 15 0 13 0; +#X connect 16 0 4 0; +#X connect 17 0 5 1; diff --git a/test/param-help.pd b/test/param-help.pd index d6f0b39..26d99b0 100644 --- a/test/param-help.pd +++ b/test/param-help.pd @@ -1,108 +1,89 @@ -#N canvas 1024 0 1018 716 10; -#X obj 42 514 dac~; -#X obj 47 192 nbx 5 14 -1e+37 1e+37 0 0 /wow/OSC1/freq /wow/OSC1/freq_ -/wow/OSC1/freq 0 -8 0 10 -262144 -1 -1 0 256; -#X obj 161 190 hsl 128 15 0 1 0 0 /wow/OSC1/amp /wow/OSC1/amp_ /wow/OSC1/amp --2 -8 0 10 -262144 -1 -1 0 1; -#X obj 49 231 nbx 5 14 -1e+37 1e+37 0 0 /wow/OSC2/freq /wow/OSC2/freq_ -/wow/OSC2/freq 0 -8 0 10 -262144 -1 -1 0 256; -#X obj 163 229 hsl 128 15 0 1 0 0 /wow/OSC2/amp /wow/OSC2/amp_ /wow/OSC2/amp --2 -8 0 10 -262144 -1 -1 0 1; -#X obj 387 215 print PARAM; -#X floatatom 52 304 5 0 0 0 - - -; -#X msg 52 334 /OSC1/freq \$1; -#X obj 387 187 spigot; -#X obj -23 22 cnv 15 400 100 empty empty empty 20 12 0 14 -249661 -66577 +#N canvas 1024 0 1018 688 10; +#X floatatom 477 321 5 0 0 0 - - -; +#X obj -23 2 cnv 15 400 100 empty empty empty 20 12 0 14 -249661 -66577 0; -#X text -18 74 author: mrtoftrash@gmail.com; -#X text -19 95 version: 2009-04-14 (initial release); -#X obj 480 172 tgl 15 0 empty empty listen 17 7 0 10 -262144 -1 -1 -0 1; -#X text -18 21 description: param is a state saving and message routing +#X text -18 54 author: mrtoftrash@gmail.com; +#X text -18 1 description: param is a state saving and message routing system.; -#X obj 387 160 receive PARAM; -#X text 544 140 -- listening stream --; -#X text 586 266 -- saving and loading --; -#X text 11 248 Open the properties dialog of the above gui objects -to examine how they are linked to the abstraction below.; -#X floatatom 73 453 5 0 0 0 - - -; -#X obj 52 475 *~ 0; -#X obj 73 401 loadbang; -#N canvas 0 0 450 300 more_about_hierachy 0; -#X restore 607 532 pd more_about_hierachy; -#X obj 49 158 hsl 128 15 0 1 0 0 /masterVolume /masterVolume_ /masterVolume --2 -8 0 10 -262144 -1 -1 0 1; -#X text 605 488 -- the /ID keyword --; -#X text 107 124 -- example --; -#X text 468 202 You can "listen" to the param "stream" by receiving -PARAM messages. Enable(click) the "listen" toggle then change the value -of some the example's sliders or number boxes to print out this stream. +#X text -19 75 version: 2009-09-19 (localized release); +#X text -19 33 tags: state routing param; +#X obj 33 546 paramFile; +#X obj 555 541 paramDump; +#X obj 557 620 paramGui; +#X obj 32 592 paramRoute; +#X text 3 389 /id keyword:; +#X obj 14 127 param /my_name my_value; +#X text 169 122 argument 1: param name (must start with a slash); +#X text 169 139 argument 2...: param value (can be a list); +#X obj 525 126 param /number 30 /gui nbx; +#X text 578 181 nbx: creates a numberbox; +#X text 577 200 slider min max: creates a slider with the indicated +minimum and maximum; +#X text 577 229 bng: creates a bang; +#X text 577 247 tgl: creates a toggle; +#X text 579 265 symbolatom: creates a symbol box; +#X text 68 355 (\$0)/abstraction's name/.../param's name; +#X text 5 210 If the param object is created directly in the root patch +(as the my_name example above) \, its path is as follows:; +#X text 7 172 A param object creates a storage area for anything. This +data can be accessed through a unique symbolic path.; +#X text 60 245 (\$0)/param's name; +#X text 7 279 If the param is inside an abstraction (or inside an abstraction +contained inside another abstraction an so forth) \, the path starts +at the root and follows every child patch (abstraction) until it reaches +the param object \, at which point the param's name is appended:; +#X text 623 617 Build a PD gui for all params that have values for +the "/gui" keyword.; +#X text 100 590 Sends values to params using a relative path.; +#X text 624 538 Dumps all params children of the root patch.; +#X obj 34 620 OSCToParam; +#X text 107 620 Routes OSC messages to matching params; +#X text 515 166 /gui options:; +#X text 526 81 When you create a param \, you can optinally use the +"/gui" keyword to flag the param with gui options.; +#X text 40 414 If an abstraction's arguments contains the "/id" keyword +\, the symbol following the "/id" keyword \, instead of the abstraction's +name \, will be used to build the path. See an example to the right. ; -#X text 531 461 -- implementing params in your own abstractions -- -; -#X text 606 508 -- default values --; -#X text 528 433 DOCUMENTATION TODO:; -#X obj 685 598 paramDump; -#X obj 685 571 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 --1 -1; -#X obj 685 626 print; -#X text 121 553 -- linking with OSC and MIDI --; -#X text -19 53 tags: state routing gui; -#X msg 771 560 values /wow; -#X msg 772 584 values /; -#X msg 802 509 values *; -#X msg 586 595 ------; -#X msg 797 617 guis *; -#X msg 801 643 guis /; -#X obj 492 528 paramGui; -#X floatatom 180 404 5 0 0 0 - - -; -#X obj 581 61 ./examples/param-generator /id me; -#X obj 492 497 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 +#X text 99 541 Saves and restores all params chilren of the root patch +to/from a file with optionnal presets.; +#X obj 557 599 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; -#X obj 73 430 param /masterVolume 0 /gui slider 0 1; -#X msg 520 495 /wow; -#X msg 615 643 guis /wow; -#X msg 621 25 save; -#X msg 810 79 save; -#X obj 742 116 paramRoute; -#X obj 32 587 OSCToParam 7493; -#X text 134 583 OSCToParam can send all icomming OSC message to matching -parameters. For example \, the OSC message '/masterVolume 0.56' on -port 7493 will be forwarded to the parameter '/masterVolume' that will -then take the value '0.56'.; -#X obj 422 366 print yeah; -#X obj 399 339 param /t_test 0 /gui tgl; -#X obj 676 343 paramFile; -#X obj 678 296 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 +#X obj 33 519 bng 15 250 50 0 empty empty save 17 7 0 10 -262144 -1 +-1; +#X obj 99 518 bng 15 250 50 0 empty empty load 17 7 0 10 -262144 -1 +-1; +#X floatatom 525 146 5 0 0 0 - - -; +#X obj 555 519 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; -#X msg 613 564 guis; -#X obj 51 366 examples/param-synth /id tom /OSC1/freq 320; -#X obj 440 117 ./examples/boubou; -#X connect 6 0 7 0; -#X connect 7 0 57 0; -#X connect 8 0 5 0; -#X connect 12 0 8 1; -#X connect 14 0 8 0; -#X connect 18 0 19 1; -#X connect 19 0 0 0; -#X connect 19 0 0 1; -#X connect 20 0 44 0; -#X connect 29 0 31 0; -#X connect 30 0 29 0; -#X connect 34 0 29 0; -#X connect 35 0 29 0; -#X connect 36 0 29 0; -#X connect 37 0 31 0; -#X connect 38 0 29 0; -#X connect 39 0 29 0; -#X connect 41 0 44 0; -#X connect 43 0 40 0; -#X connect 44 0 18 0; -#X connect 45 0 40 0; -#X connect 46 0 29 0; -#X connect 47 0 42 0; +#X obj 555 569 print DUMP; +#X text 268 490 --------------------- SEE ALSO ----------------------- +; +#X obj 477 414 param-abs /id FM_MOD; +#X obj 472 448 dac~; +#X obj 690 364 hsl 100 15 0 1 0 0 \$0/FM_MOD/volume \$0/FM_MOD/volume_ +/FM_MOD/volume 105 7 0 10 -262144 -1 -1 624 1; +#X obj 690 384 hsl 100 15 200 2000 0 0 \$0/FM_MOD/carrier \$0/FM_MOD/carrier_ +/FM_MOD/carrier 105 7 0 10 -262144 -1 -1 400 1; +#X obj 688 423 nbx 5 14 -1e+37 1e+37 0 0 \$0/FM_MOD/modulation/index +\$0/FM_MOD/modulation/index_ /FM_MOD/modulation/index 57 7 0 10 -262144 +-1 -1 16 256; +#X obj 688 404 nbx 5 14 -1e+37 1e+37 0 0 \$0/FM_MOD/modulation/freq +\$0/FM_MOD/modulation/freq_ /FM_MOD/modulation/freq 57 7 0 10 -262144 +-1 -1 66 256; +#X msg 477 343 modulation/index \$1; +#X obj 517 367 hsl 128 15 0 1 0 0 empty empty empty -2 -8 0 10 -262144 +-1 -1 800 1; +#X msg 514 389 volume \$1; +#X connect 0 0 47 0; +#X connect 7 0 39 0; +#X connect 14 0 37 0; +#X connect 34 0 8 0; +#X connect 35 0 6 0; +#X connect 36 0 6 1; +#X connect 38 0 7 0; +#X connect 41 0 42 0; +#X connect 41 0 42 1; +#X connect 47 0 41 0; #X connect 48 0 49 0; -#X connect 53 0 52 0; -#X connect 55 0 54 0; -#X connect 56 0 29 0; -#X connect 57 0 19 0; +#X connect 49 0 41 0; diff --git a/test/param.c b/test/param.c index 787fa38..00b2fe8 100644 --- a/test/param.c +++ b/test/param.c @@ -56,16 +56,16 @@ static void param_bang(t_param *x) if ( x->x_param) { param_output(x->x_param,x->x_obj.ob_outlet); - //param_send_prepend(x->x_param, x->s_PARAM ,x->x_param->path ); - //if(x->x_param->selector != &s_bang ) param_send_prepend(x->x_param, x->x_param->send ,x->s_set ); + //if (PARAMECHO) param_send_prepend(x->x_param, x->s_PARAM ,x->x_param->path ); + if(x->x_param->selector != &s_bang ) param_send_prepend(x->x_param, x->x_param->send ,x->s_set ); } } static void param_anything(t_param *x, t_symbol *s, int ac, t_atom *av) { - + #ifdef PARAMDEBUG post("RECEIVING SOMETHING"); - + #endif if ( x->x_param) set_param_anything(x->x_param,s,ac,av); param_bang(x); @@ -138,17 +138,18 @@ static void *param_new(t_symbol *s, int ac, t_atom *av) t_canvas * before = tof_get_canvas_before_root(canvas); tof_get_canvas_arguments(before,&ac_c , &av_c); - param_find_value(name, ac_c, av_c,&ac_p,&av_p); + tof_find_tagged_argument('/',name, ac_c, av_c,&ac_p,&av_p); // B. I object's arguments if ( ac_p == 0 && ac > 1) { - int start = 1; - int count = 0; - tof_get_tagged_argument('/',ac,av,&start,&count); - if (count > 0) { - ac_p = count; - av_p = av + start; - } + int ac_a = 0; + t_atom* av_a = NULL; + tof_find_tagged_argument('/',name, ac, av,&ac_p,&av_p); + //tof_get_tagged_argument('/',ac,av,&start,&count); + //if (count > 1) { + // ac_p = ac_a; + // av_p = av_a + 1; + //} } @@ -158,7 +159,7 @@ static void *param_new(t_symbol *s, int ac, t_atom *av) int ac_g = 0; t_atom* av_g = NULL; // There could be a problem if the the name is also /gui - param_find_value(gensym("/gui"), ac, av,&ac_g,&av_g); + tof_find_tagged_argument('/',gensym("/gui"), ac, av,&ac_g,&av_g); x->x_param = param_register(root,path,ac_p,av_p,ac_g,av_g); diff --git a/test/param.h b/test/param.h index 7a383db..9113840 100644 --- a/test/param.h +++ b/test/param.h @@ -1,10 +1,12 @@ -#define PARAMDEBUG +//#define PARAMDEBUG #include char param_buf_temp_a[MAXPDSTRING]; char param_buf_temp_b[MAXPDSTRING]; char* separator = "/"; +//char PARAMECHO = 0; + struct param { @@ -38,7 +40,7 @@ struct paramroot* paramroots; static void set_param_anything( struct param* p, t_symbol* s, int ac, t_atom *av) { - if ( s == &s_bang ) { + if ( s == &s_bang || ac == 0 ) { p->ac = 0; p->selector = s; } else { @@ -61,35 +63,7 @@ static void set_param( struct param* p, int ac, t_atom *av) { } -static void param_find_value(t_symbol *name, int ac, t_atom *av, int *ac_r,t_atom** av_r) { - - int i; - int j = 0; - for (i=0;is_name); - if ( IS_A_SYMBOL(av,i) && name == atom_getsymbol(av+i) && (i+1)s_name[0] == '/' ) { - //j = j-1; - break; - } - } - break; - } - } - j = j-i; - //post("i:%d j:%d",i,j); - - - if ( j > 0) { - *ac_r = j; - *av_r = av+i; - } else { - *ac_r = 0; - } - } + /* @@ -245,21 +219,21 @@ static t_symbol* param_get_path( t_canvas* i_canvas, t_symbol* name) { tof_get_canvas_arguments(i_canvas,&i_ac, &i_av); id_temp=tof_get_canvas_name(i_canvas); //id_temp= canvas_realizedollar(i_canvas, gensym("$0")); - int start = 0; - int count = 0; + int ac_a = 0; + t_atom* av_a = NULL; + int iter = 0; //found_id_flag = 0; - while( tof_get_tagged_argument(*separator,i_ac,i_av,&start,&count) ) { + while( tof_next_tagged_argument(*separator,i_ac,i_av,&ac_a,&av_a,&iter) ) { - if ( IS_A_SYMBOL(i_av,start) - && (id_s == (i_av+start)->a_w.w_symbol) - && (count > 1) ) { - id_temp = atom_getsymbol(i_av+start+1); + if ( IS_A_SYMBOL(av_a,0) + && (id_s == av_a->a_w.w_symbol) + && (ac_a > 1) ) { + id_temp = atom_getsymbol(av_a+1); //id_canvas = i_canvas; //found_id_flag = 1; break; } - start= start + count; } // if ever an /id is missing, this param is not saveable //if (found_id_flag == 0) saveable = 0; @@ -614,9 +588,8 @@ static void param_output(struct param *p, t_outlet* outlet) { // SHOULD I COPY THIS DATA BEFORE SENDING IT OUT? // OR IS THE NORM TO ONLY COPY ON INPUT? if (p) { - if((p->selector == &s_bang) ) { - outlet_bang(outlet); - } else { + if(!(p->selector == &s_bang) ) { + outlet_anything(outlet, p->selector, p->ac, p->av); } } @@ -637,6 +610,8 @@ static void param_output_prepend(struct param* p, t_outlet* outlet, t_symbol* s) SETSYMBOL(av, p->selector); outlet_anything(outlet,s,ac,av); freebytes(av, ac*sizeof(t_atom)); + } else if (p->selector == &s_bang) { + outlet_anything(outlet,s,0,NULL); } } @@ -713,9 +688,31 @@ static int param_read(t_canvas* canvas, t_symbol* filename) #ifdef PARAMDEBUG post("Restoring:%s",s->s_name); #endif - if ( s->s_thing) pd_forwardmess(s->s_thing, ac-1, av+1); - + // STUPID SYMBOL WITH SPACES MANAGEMENT + if ( s->s_thing && ac > 3 && IS_A_SYMBOL(av,1) && atom_getsymbol(av+1) == &s_symbol) { + // This whole block is simply to convert symbols saved with spaces to complete symbols + + t_binbuf *bbuf_stupid = binbuf_new(); + binbuf_add(bbuf_stupid, ac-2, av+2); + + char *char_buf; + int char_length; + binbuf_gettext(bbuf_stupid, &char_buf, &char_length); + char_buf = resizebytes(char_buf, char_length, char_length+1); + char_buf[char_length] = 0; + t_symbol* stupid_symbol = gensym(char_buf); + //post("STUPID: %s",stupid_symbol->s_name); + freebytes(char_buf, char_length+1); + binbuf_free(bbuf_stupid); + t_atom* stupid_atom = getbytes(sizeof(*stupid_atom)); + SETSYMBOL(stupid_atom, stupid_symbol); + pd_typedmess(s->s_thing, &s_symbol, 1, stupid_atom); + freebytes(stupid_atom, sizeof(*stupid_atom)); + + } else { + if ( s->s_thing) pd_forwardmess(s->s_thing, ac-1, av+1); + } } ac = 0; diff --git a/test/param2-abs.pd b/test/param2-abs.pd new file mode 100644 index 0000000..f793907 --- /dev/null +++ b/test/param2-abs.pd @@ -0,0 +1,24 @@ +#N canvas 1228 134 711 410 10; +#X text 84 2 This abstraction is an example for the param external. +; +#X obj 175 232 *~; +#X floatatom 175 147 0 0 0 0 - - -; +#X floatatom 237 200 0 0 0 0 - - -; +#X text 64 127 frequency; +#X text 63 114 modulation; +#X text 278 216 index; +#X text 280 197 modulation; +#X obj 175 172 osc~; +#X obj 163 341 outlet~; +#X obj 237 172 param /index 20 /gui nbx; +#X obj 174 122 param /freq 3 /gui nbx; +#X obj 172 99 loadbang; +#X obj 238 148 loadbang; +#X connect 1 0 9 0; +#X connect 2 0 8 0; +#X connect 3 0 1 1; +#X connect 8 0 1 0; +#X connect 10 0 3 0; +#X connect 11 0 2 0; +#X connect 12 0 11 0; +#X connect 13 0 10 0; diff --git a/test/paramDump.c b/test/paramDump.c index af7bd16..a236533 100644 --- a/test/paramDump.c +++ b/test/paramDump.c @@ -106,11 +106,13 @@ static void paramDump_bang(t_paramDump *x) { struct param* pp = get_param_list(x->root); + #ifdef PARAMDEBUG if (pp == NULL) { post("No params found"); } else { post("Found params"); } + #endif while (pp) { //if (pp->root == x->root) { param_output_prepend(pp,x->outlet,pp->path); diff --git a/test/paramFile.c b/test/paramFile.c index 181048a..328eb51 100644 --- a/test/paramFile.c +++ b/test/paramFile.c @@ -32,9 +32,9 @@ static t_symbol* paramFile_makefilename(t_symbol* basename, t_float f) { if ( f > 127) f = 127; int i = (int) f; - int length = strlen(basename->s_name)+10; + int length = strlen(basename->s_name)+11; char* buf = getbytes( length * sizeof (*buf)); - sprintf(buf,"%s%03d.param",basename->s_name,i); + sprintf(buf,"%s-%03d.param",basename->s_name,i); //strcpy(buf,basename->s_name); //strcat(buf,".param"); t_symbol* filename = gensym(buf); @@ -48,7 +48,7 @@ static void paramFile_write(t_paramFile *x, t_float f) { t_symbol* filename = paramFile_makefilename(x->basename,f); - post("Writing to:%s",filename->s_name); + post("Writing: %s",filename->s_name); if ( param_write(x->canvas,filename) ) pd_error(x,"%s: write failed", filename->s_name); } @@ -58,7 +58,7 @@ static void paramFile_read(t_paramFile *x, t_float f) { t_symbol* filename = paramFile_makefilename(x->basename,f); - post("Reading from:%s",filename->s_name); + post("Reading: %s",filename->s_name); if (param_read(x->canvas, filename)) pd_error(x, "%s: read failed", filename->s_name); diff --git a/test/paramGui.pd b/test/paramGui.pd index fc9ae97..2103791 100644 --- a/test/paramGui.pd +++ b/test/paramGui.pd @@ -1,5 +1,5 @@ #N canvas 1027 0 997 703 10; -#N canvas 425 135 450 315 \$0target 0; +#N canvas 438 313 450 315 \$0target 0; #X restore 77 109 pd \$0target; #X obj 260 140 list split 1; #X obj 101 566 s pd-\$0target; @@ -18,10 +18,8 @@ #X obj -62 285 + 20; #X obj 434 277 list split 1; #X obj 394 374 list; -#X msg 729 492 text 0 \$1 Unknown gui type for \$2; #X obj 294 -79 symbol *; #X obj 384 423 route bng nbx slider symbolatom tgl; -#X obj 469 389 print; #X msg 272 57 guis \$1; #X obj 0 302 zexy/makesymbol %s%s%s; #X msg 0 278 list $ 0 \$1; @@ -42,50 +40,52 @@ INTERFACES INSIDE THE ROOT PATCH OR INSIDE A SUBPATCH OF THE ROOT PATCH OR THEY WILL NOT WORK!; #X msg 419 159 50; -#X connect 1 0 27 0; +#X msg 612 151 vis 0 \, clear; +#X msg 649 499 text 0 \$1 OUPS! Unknown gui type for param \$4; +#X connect 1 0 25 0; #X connect 1 1 16 0; #X connect 3 0 17 0; -#X connect 4 0 21 0; -#X connect 4 0 20 0; +#X connect 4 0 19 0; #X connect 6 0 7 0; -#X connect 7 0 28 0; +#X connect 7 0 26 0; #X connect 7 1 15 0; #X connect 9 0 1 0; #X connect 10 0 11 0; -#X connect 11 0 19 0; +#X connect 11 0 18 0; #X connect 11 1 12 0; #X connect 12 0 13 0; #X connect 13 0 14 0; -#X connect 13 1 22 0; -#X connect 13 2 35 0; -#X connect 13 3 34 0; +#X connect 13 1 20 0; +#X connect 13 2 33 0; +#X connect 13 3 32 0; #X connect 14 0 2 0; #X connect 15 0 6 0; #X connect 16 0 3 1; #X connect 16 1 17 1; #X connect 17 0 4 0; -#X connect 18 0 2 0; -#X connect 19 0 13 0; -#X connect 20 0 29 0; -#X connect 20 1 30 0; -#X connect 20 2 31 0; -#X connect 20 3 33 0; -#X connect 20 4 32 0; -#X connect 20 5 18 0; -#X connect 22 0 9 0; -#X connect 23 0 28 1; -#X connect 24 0 23 0; -#X connect 25 0 26 0; -#X connect 26 0 28 2; -#X connect 27 0 6 0; -#X connect 27 1 24 0; -#X connect 27 2 25 0; -#X connect 27 3 28 3; -#X connect 28 0 3 0; +#X connect 18 0 13 0; +#X connect 19 0 27 0; +#X connect 19 1 28 0; +#X connect 19 2 29 0; +#X connect 19 3 31 0; +#X connect 19 4 30 0; +#X connect 19 5 35 0; +#X connect 20 0 9 0; +#X connect 21 0 26 1; +#X connect 22 0 21 0; +#X connect 23 0 24 0; +#X connect 24 0 26 2; +#X connect 25 0 6 0; +#X connect 25 1 22 0; +#X connect 25 2 23 0; +#X connect 25 3 26 3; +#X connect 26 0 3 0; +#X connect 27 0 2 0; +#X connect 28 0 2 0; #X connect 29 0 2 0; #X connect 30 0 2 0; #X connect 31 0 2 0; -#X connect 32 0 2 0; -#X connect 33 0 2 0; +#X connect 32 0 8 0; +#X connect 33 0 5 0; #X connect 34 0 8 0; -#X connect 35 0 5 0; +#X connect 35 0 2 0; -- cgit v1.2.1