aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas O Fredericks <mrtof@users.sourceforge.net>2009-09-22 22:52:14 +0000
committerThomas O Fredericks <mrtof@users.sourceforge.net>2009-09-22 22:52:14 +0000
commit10b3fead00db11665f678639101e2c7653687140 (patch)
tree1ec8ab3647e2406f84ee5933d22d16b66a675107
parentdcbd2547e31e9fd6f2c736bea8ffd082eded7c97 (diff)
Almost ready for a release
svn path=/trunk/externals/tof/; revision=12429
-rw-r--r--test/param-abs.pd33
-rw-r--r--test/param-help.pd185
-rw-r--r--test/param.c27
-rw-r--r--test/param.h85
-rw-r--r--test/param2-abs.pd24
-rw-r--r--test/paramDump.c2
-rw-r--r--test/paramFile.c8
-rw-r--r--test/paramGui.pd64
8 files changed, 233 insertions, 195 deletions
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 <stdio.h>
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;i<ac;i++) {
- //if ( IS_A_SYMBOL(av,i)) post("analyzing %s",atom_getsymbol(av+i)->s_name);
- if ( IS_A_SYMBOL(av,i) && name == atom_getsymbol(av+i) && (i+1)<ac ) {
- //post("matches");
- i=i+1;
- for (j=i;j<ac;j++) {
- if ( IS_A_SYMBOL(av,j) && (atom_getsymbol(av+j))->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;