From f050a65077f49966a1abbcbe561c482cf0d502c4 Mon Sep 17 00:00:00 2001
From: porres
Date: Sun, 10 Apr 2022 04:41:46 -0300
Subject: [PATCH 001/450] "-float" f;ag to [oscparse] so it parses float
addresses
[oscparse] always parses addresses as symbols, even if they lok like floats, which make it really hard to use [route]. This flag turns addresses that look like floats ito floats.
closes https://github.com/pure-data/pure-data/issues/1299
---
src/x_misc.c | 25 ++++++++++++++++++++++---
1 file changed, 22 insertions(+), 3 deletions(-)
diff --git a/src/x_misc.c b/src/x_misc.c
index 5601ce4f9..093af4218 100644
--- a/src/x_misc.c
+++ b/src/x_misc.c
@@ -10,6 +10,7 @@
#include
#include
#include
+#include
#ifdef _WIN32
#include
#include
@@ -289,7 +290,8 @@ static t_class *oscparse_class;
typedef struct _oscparse
{
- t_object x_obj;
+ t_object x_obj;
+ t_int x_flag;
} t_oscparse;
#define ROUNDUPTO4(x) (((x) + 3) & (~3))
@@ -385,8 +387,20 @@ static void oscparse_list(t_oscparse *x, t_symbol *s, int argc, t_atom *argv)
/* post("outc %d, typeonset %d, dataonset %d, nfield %d", outc, typeonset,
dataonset, nfield); */
for (i = j = 0; i < typeonset-1 && argv[i].a_w.w_float != 0 &&
- j < outc; j++)
- SETSYMBOL(outv+j, grabstring(argc, argv, &i, 1));
+ j < outc; j++)
+ {
+ if(x->x_flag)
+ {
+ t_symbol *sym = grabstring(argc, argv, &i, 1);
+ t_float f = 0.0f;
+ char *str_end = NULL;
+ f = strtod(sym->s_name, &str_end);
+ if (f == 0 && sym->s_name == str_end)
+ SETSYMBOL(outv+j, sym);
+ else SETFLOAT(outv+j, f);
+ }
+ else SETSYMBOL(outv+j, grabstring(argc, argv, &i, 1));
+ }
for (i = typeonset, k = dataonset; i < typeonset + nfield; i++)
{
union
@@ -467,6 +481,11 @@ static void oscparse_list(t_oscparse *x, t_symbol *s, int argc, t_atom *argv)
static t_oscparse *oscparse_new(t_symbol *s, int argc, t_atom *argv)
{
t_oscparse *x = (t_oscparse *)pd_new(oscparse_class);
+ x->x_flag = 0;
+ if (argc && argv[0].a_w.w_symbol == gensym("-float"))
+ {
+ x->x_flag = 1;
+ }
outlet_new(&x->x_obj, gensym("list"));
return (x);
}
From c496b3ae48af4c3975711c75138452b5e353df50 Mon Sep 17 00:00:00 2001
From: porres
Date: Sun, 10 Apr 2022 12:46:01 -0300
Subject: [PATCH 002/450] fixes issues and renames flag to -n
according to the discussion from https://github.com/pure-data/pure-data/pull/1623
---
src/x_misc.c | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/src/x_misc.c b/src/x_misc.c
index 093af4218..a632eff6e 100644
--- a/src/x_misc.c
+++ b/src/x_misc.c
@@ -290,8 +290,8 @@ static t_class *oscparse_class;
typedef struct _oscparse
{
- t_object x_obj;
- t_int x_flag;
+ t_object x_obj;
+ int x_flag;
} t_oscparse;
#define ROUNDUPTO4(x) (((x) + 3) & (~3))
@@ -392,12 +392,12 @@ static void oscparse_list(t_oscparse *x, t_symbol *s, int argc, t_atom *argv)
if(x->x_flag)
{
t_symbol *sym = grabstring(argc, argv, &i, 1);
- t_float f = 0.0f;
- char *str_end = NULL;
- f = strtod(sym->s_name, &str_end);
- if (f == 0 && sym->s_name == str_end)
- SETSYMBOL(outv+j, sym);
- else SETFLOAT(outv+j, f);
+ t_float f = 0.0f;
+ char *str_end = NULL;
+ f = strtod(sym->s_name, &str_end);
+ if (f == 0 && sym->s_name == str_end)
+ SETSYMBOL(outv+j, sym);
+ else SETFLOAT(outv+j, f);
}
else SETSYMBOL(outv+j, grabstring(argc, argv, &i, 1));
}
@@ -482,7 +482,7 @@ static t_oscparse *oscparse_new(t_symbol *s, int argc, t_atom *argv)
{
t_oscparse *x = (t_oscparse *)pd_new(oscparse_class);
x->x_flag = 0;
- if (argc && argv[0].a_w.w_symbol == gensym("-float"))
+ if (argc && argv[0].a_w.w_symbol == gensym("-n"))
{
x->x_flag = 1;
}
From d77c8bfe4ba5b4295b66db7cb9de818c3bb85291 Mon Sep 17 00:00:00 2001
From: porres
Date: Thu, 14 Apr 2022 07:35:00 -0300
Subject: [PATCH 003/450] add outlet to oscparse to give us "split point"
add outlet that gives the index in the output list that splits the address from the data, discussion in https://github.com/pure-data/pure-data/pull/1623#issuecomment-1097181342
---
src/x_misc.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/x_misc.c b/src/x_misc.c
index a632eff6e..191b0e700 100644
--- a/src/x_misc.c
+++ b/src/x_misc.c
@@ -291,6 +291,7 @@ static t_class *oscparse_class;
typedef struct _oscparse
{
t_object x_obj;
+ t_outlet *x_address_n;
int x_flag;
} t_oscparse;
@@ -386,6 +387,7 @@ static void oscparse_list(t_oscparse *x, t_symbol *s, int argc, t_atom *argv)
dataonset = ROUNDUPTO4(i + 1);
/* post("outc %d, typeonset %d, dataonset %d, nfield %d", outc, typeonset,
dataonset, nfield); */
+ int address_n;
for (i = j = 0; i < typeonset-1 && argv[i].a_w.w_float != 0 &&
j < outc; j++)
{
@@ -400,6 +402,7 @@ static void oscparse_list(t_oscparse *x, t_symbol *s, int argc, t_atom *argv)
else SETFLOAT(outv+j, f);
}
else SETSYMBOL(outv+j, grabstring(argc, argv, &i, 1));
+ address_n = j + 1;
}
for (i = typeonset, k = dataonset; i < typeonset + nfield; i++)
{
@@ -472,6 +475,7 @@ static void oscparse_list(t_oscparse *x, t_symbol *s, int argc, t_atom *argv)
(int)(argv[i].a_w.w_float), (int)(argv[i].a_w.w_float));
}
}
+ outlet_float(x->x_address_n, address_n);
outlet_list(x->x_obj.ob_outlet, 0, j, outv);
return;
tooshort:
@@ -487,6 +491,7 @@ static t_oscparse *oscparse_new(t_symbol *s, int argc, t_atom *argv)
x->x_flag = 1;
}
outlet_new(&x->x_obj, gensym("list"));
+ x->x_address_n = outlet_new((t_object *)x, &s_float);
return (x);
}
From 5b4f707848389ac00fbf7c9e8f150f336447abfb Mon Sep 17 00:00:00 2001
From: Claude Heiland-Allen
Date: Tue, 8 Jan 2019 11:46:53 +0000
Subject: [PATCH 004/450] emscripten behaves similarly to linux
---
src/x_misc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/x_misc.c b/src/x_misc.c
index 290833e5d..6329884d4 100644
--- a/src/x_misc.c
+++ b/src/x_misc.c
@@ -22,7 +22,7 @@
#if defined (__APPLE__) || defined (__FreeBSD__)
#define CLOCKHZ CLK_TCK
#endif
-#if defined (__linux__) || defined (__CYGWIN__) || defined (ANDROID)
+#if defined (__linux__) || defined (__CYGWIN__) || defined (ANDROID) || defined(__EMSCRIPTEN__)
#define CLOCKHZ sysconf(_SC_CLK_TCK)
#endif
#if defined (__FreeBSD_kernel__) || defined(__GNU__) || defined(__OpenBSD__) \
From 5349c2b69482164c1b3d56a6272fbe65ddcda8d3 Mon Sep 17 00:00:00 2001
From: Claude Heiland-Allen
Date: Wed, 11 Aug 2021 12:30:00 +0100
Subject: [PATCH 005/450] noise~ does not take any argument
otherwise emscripten complains when
function pointers are used at the wrong type
---
src/d_osc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/d_osc.c b/src/d_osc.c
index a24c2d0a8..dbe8a36ac 100644
--- a/src/d_osc.c
+++ b/src/d_osc.c
@@ -491,7 +491,7 @@ static void noise_float(t_noise *x, t_float f)
static void noise_setup(void)
{
noise_class = class_new(gensym("noise~"), (t_newmethod)noise_new, 0,
- sizeof(t_noise), 0, A_DEFFLOAT, 0);
+ sizeof(t_noise), 0, 0);
class_addmethod(noise_class, (t_method)noise_dsp,
gensym("dsp"), A_CANT, 0);
class_addmethod(noise_class, (t_method)noise_float,
From ef8653e3e171aaf67d7e964d80fb8405a41cfaaf Mon Sep 17 00:00:00 2001
From: Claude Heiland-Allen
Date: Wed, 11 Aug 2021 12:32:00 +0100
Subject: [PATCH 006/450] samplerate~ does not take any argument
otherwise emscripten complains when
function pointers are used at the wrong type
---
src/d_ugen.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/d_ugen.c b/src/d_ugen.c
index 6ddf25163..368c16e98 100644
--- a/src/d_ugen.c
+++ b/src/d_ugen.c
@@ -1453,7 +1453,7 @@ static void samplerate_tilde_bang(t_samplerate *x)
outlet_float(x->x_obj.ob_outlet, canvas_getsr(x->x_canvas));
}
-static void *samplerate_tilde_new(t_symbol *s)
+static void *samplerate_tilde_new(void)
{
t_samplerate *x = (t_samplerate *)pd_new(samplerate_tilde_class);
outlet_new(&x->x_obj, &s_float);
From ef9d4a8c86f45af6b93c02d844d33c0a5bfb8465 Mon Sep 17 00:00:00 2001
From: Claude Heiland-Allen
Date: Wed, 11 Aug 2021 12:33:23 +0100
Subject: [PATCH 007/450] bang_new2() should not take any argument
otherwise emscripten complains when
function pointers are used at the wrong type
---
src/x_connective.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/x_connective.c b/src/x_connective.c
index 6cf38b7d7..6c7a472e4 100644
--- a/src/x_connective.c
+++ b/src/x_connective.c
@@ -204,7 +204,7 @@ static void *bang_new(t_pd *dummy)
return (x);
}
-static void *bang_new2(t_bang f)
+static void *bang_new2(void)
{
return (bang_new(0));
}
From 316afc4755fc8762a22311f38f04d79b2c911e7d Mon Sep 17 00:00:00 2001
From: Claude Heiland-Allen
Date: Tue, 8 Jan 2019 11:54:27 +0000
Subject: [PATCH 008/450] explicitly forward bang methods
otherwise emscripten complains about mismatching function pointer types
---
src/x_connective.c | 23 +++++++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/src/x_connective.c b/src/x_connective.c
index 6c7a472e4..ee9e9fae6 100644
--- a/src/x_connective.c
+++ b/src/x_connective.c
@@ -214,16 +214,31 @@ static void bang_bang(t_bang *x)
outlet_bang(x->x_obj.ob_outlet);
}
+static void bang_float(t_bang *x, t_float dummy)
+{
+ bang_bang(x);
+}
+
+static void bang_symbol(t_bang *x, t_symbol *dummy)
+{
+ bang_bang(x);
+}
+
+static void bang_gimme(t_bang *x, t_symbol *s, int argc, t_atom *argv)
+{
+ bang_bang(x);
+}
+
void bang_setup(void)
{
bang_class = class_new(gensym("bang"), (t_newmethod)bang_new, 0,
sizeof(t_bang), 0, 0);
class_addcreator((t_newmethod)bang_new2, gensym("b"), 0);
class_addbang(bang_class, bang_bang);
- class_addfloat(bang_class, bang_bang);
- class_addsymbol(bang_class, bang_bang);
- class_addlist(bang_class, bang_bang);
- class_addanything(bang_class, bang_bang);
+ class_addfloat(bang_class, bang_float);
+ class_addsymbol(bang_class, bang_symbol);
+ class_addlist(bang_class, bang_gimme);
+ class_addanything(bang_class, bang_gimme);
}
/* -------------------- send ------------------------------ */
From 57e6b727c999d8980e81a94273ab70c5786d1229 Mon Sep 17 00:00:00 2001
From: Claude Heiland-Allen
Date: Tue, 8 Jan 2019 11:55:20 +0000
Subject: [PATCH 009/450] remove unused exceptfds in select()
it is unsupported by emscripten
---
src/s_inter.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/src/s_inter.c b/src/s_inter.c
index 915afd599..ad3fabd6f 100644
--- a/src/s_inter.c
+++ b/src/s_inter.c
@@ -223,15 +223,14 @@ static int sys_domicrosleep(int microsec)
timeout.tv_usec = 0;
if (INTER->i_nfdpoll)
{
- fd_set readset, writeset, exceptset;
+ fd_set readset, writeset;
FD_ZERO(&writeset);
FD_ZERO(&readset);
- FD_ZERO(&exceptset);
for (fp = INTER->i_fdpoll,
i = INTER->i_nfdpoll; i--; fp++)
FD_SET(fp->fdp_fd, &readset);
if(select(INTER->i_maxfd+1,
- &readset, &writeset, &exceptset, &timeout) < 0)
+ &readset, &writeset, NULL, &timeout) < 0)
perror("microsleep select");
INTER->i_fdschanged = 0;
for (i = 0; i < INTER->i_nfdpoll &&
From 1d574b7b10a46d17fb6e174bfc5d87440426482f Mon Sep 17 00:00:00 2001
From: Claude Heiland-Allen
Date: Tue, 8 Jan 2019 11:57:03 +0000
Subject: [PATCH 010/450] add typedefs for methods that return a pointer
instead of void
---
src/m_imp.h | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/src/m_imp.h b/src/m_imp.h
index 5f746094c..68dbb14c3 100644
--- a/src/m_imp.h
+++ b/src/m_imp.h
@@ -27,6 +27,13 @@ typedef void (*t_symbolmethod)(t_pd *x, t_symbol *s);
typedef void (*t_listmethod)(t_pd *x, t_symbol *s, int argc, t_atom *argv);
typedef void (*t_anymethod)(t_pd *x, t_symbol *s, int argc, t_atom *argv);
+typedef void* (*t_bangmethodr)(t_pd *x);
+typedef void* (*t_pointermethodr)(t_pd *x, t_gpointer *gp);
+typedef void* (*t_floatmethodr)(t_pd *x, t_float f);
+typedef void* (*t_symbolmethodr)(t_pd *x, t_symbol *s);
+typedef void* (*t_listmethodr)(t_pd *x, t_symbol *s, int argc, t_atom *argv);
+typedef void* (*t_anymethodr)(t_pd *x, t_symbol *s, int argc, t_atom *argv);
+
struct _class
{
t_symbol *c_name; /* name (mostly for error reporting) */
From 7c307303045594d8167c356c2d434e41fd2f1e0a Mon Sep 17 00:00:00 2001
From: Claude Heiland-Allen
Date: Tue, 8 Jan 2019 12:00:35 +0000
Subject: [PATCH 011/450] deprivatize b/f/s/l constructors and redeclare in
m_class.c
---
src/m_class.c | 5 +++++
src/x_connective.c | 6 +++---
src/x_list.c | 2 +-
3 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/src/m_class.c b/src/m_class.c
index 3c63603b6..adb036d4e 100644
--- a/src/m_class.c
+++ b/src/m_class.c
@@ -955,6 +955,11 @@ typedef t_pd *(*t_fun5)(t_int i1, t_int i2, t_int i3, t_int i4, t_int i5,
typedef t_pd *(*t_fun6)(t_int i1, t_int i2, t_int i3, t_int i4, t_int i5, t_int i6,
t_floatarg d1, t_floatarg d2, t_floatarg d3, t_floatarg d4, t_floatarg d5);
+void *bang_new(t_pd *dummy);
+void *pdfloat_new(t_pd *dummy, t_float f);
+void *pdsymbol_new(t_pd *dummy, t_symbol *s);
+void *list_new(t_pd *dummy, t_symbol *s, int argc, t_atom *argv);
+
void pd_typedmess(t_pd *x, t_symbol *s, int argc, t_atom *argv)
{
t_method *f;
diff --git a/src/x_connective.c b/src/x_connective.c
index ee9e9fae6..31ab0146c 100644
--- a/src/x_connective.c
+++ b/src/x_connective.c
@@ -74,7 +74,7 @@ typedef struct _pdfloat
they're created by short-circuited messages to the "new"
object which are handled specially in pd_typedmess(). */
-static void *pdfloat_new(t_pd *dummy, t_float f)
+void *pdfloat_new(t_pd *dummy, t_float f)
{
t_pdfloat *x = (t_pdfloat *)pd_new(pdfloat_class);
x->x_f = f;
@@ -138,7 +138,7 @@ typedef struct _pdsymbol
t_symbol *x_s;
} t_pdsymbol;
-static void *pdsymbol_new(t_pd *dummy, t_symbol *s)
+void *pdsymbol_new(t_pd *dummy, t_symbol *s)
{
t_pdsymbol *x = (t_pdsymbol *)pd_new(pdsymbol_class);
x->x_s = s;
@@ -196,7 +196,7 @@ typedef struct _bang
t_object x_obj;
} t_bang;
-static void *bang_new(t_pd *dummy)
+void *bang_new(t_pd *dummy)
{
t_bang *x = (t_bang *)pd_new(bang_class);
outlet_new(&x->x_obj, &s_bang);
diff --git a/src/x_list.c b/src/x_list.c
index 31b267e83..77226de2d 100644
--- a/src/x_list.c
+++ b/src/x_list.c
@@ -822,7 +822,7 @@ static void list_tosymbol_setup(void)
/* ------------- list ------------------- */
-static void *list_new(t_pd *dummy, t_symbol *s, int argc, t_atom *argv)
+void *list_new(t_pd *dummy, t_symbol *s, int argc, t_atom *argv)
{
if (!argc || argv[0].a_type != A_SYMBOL)
pd_this->pd_newest = list_append_new(s, argc, argv);
From e4521e131f6c8dfaa25f97dee55bc479c90474b3 Mon Sep 17 00:00:00 2001
From: Claude Heiland-Allen
Date: Wed, 11 Aug 2021 13:46:49 +0100
Subject: [PATCH 012/450] Typecheck both int (probably pointer) and float args
separately.
Emscripten doesn't let you call function pointers with the wrong type.
To avoid copy/paste errors, the dispatcher code is generated.
Edit the generator instead of the generated files.
The generated files are checked into the repository with this commit;
they will hopefully change very rarely, and complicating the build
system seems even worse.
---
src/m_class.c | 59 ++++---------
src/m_class_dispatcher.c | 164 +++++++++++++++++++++++++++++++++++++
src/m_class_dispatcher_1.h | 43 ++++++++++
src/m_class_dispatcher_2.h | 58 +++++++++++++
4 files changed, 283 insertions(+), 41 deletions(-)
create mode 100644 src/m_class_dispatcher.c
create mode 100644 src/m_class_dispatcher_1.h
create mode 100644 src/m_class_dispatcher_2.h
diff --git a/src/m_class.c b/src/m_class.c
index adb036d4e..66202a6ac 100644
--- a/src/m_class.c
+++ b/src/m_class.c
@@ -937,23 +937,17 @@ t_pd *pd_newest(void)
/* horribly, we need prototypes for each of the artificial function
calls in typedmess(), to keep the compiler quiet. */
+ /* Even more horribly, function pointers must be called at their
+ exact type in Emscripten, including return type, which makes the
+ number of cases explode. The required typedefs and dispatcher code
+ are generated by m_class_dispatcher.c, which see. */
+
typedef t_pd *(*t_newgimme)(t_symbol *s, int argc, t_atom *argv);
typedef void(*t_messgimme)(t_pd *x, t_symbol *s, int argc, t_atom *argv);
+typedef void*(*t_messgimmer)(t_pd *x, t_symbol *s, int argc, t_atom *argv);
-typedef t_pd *(*t_fun0)(
- t_floatarg d1, t_floatarg d2, t_floatarg d3, t_floatarg d4, t_floatarg d5);
-typedef t_pd *(*t_fun1)(t_int i1,
- t_floatarg d1, t_floatarg d2, t_floatarg d3, t_floatarg d4, t_floatarg d5);
-typedef t_pd *(*t_fun2)(t_int i1, t_int i2,
- t_floatarg d1, t_floatarg d2, t_floatarg d3, t_floatarg d4, t_floatarg d5);
-typedef t_pd *(*t_fun3)(t_int i1, t_int i2, t_int i3,
- t_floatarg d1, t_floatarg d2, t_floatarg d3, t_floatarg d4, t_floatarg d5);
-typedef t_pd *(*t_fun4)(t_int i1, t_int i2, t_int i3, t_int i4,
- t_floatarg d1, t_floatarg d2, t_floatarg d3, t_floatarg d4, t_floatarg d5);
-typedef t_pd *(*t_fun5)(t_int i1, t_int i2, t_int i3, t_int i4, t_int i5,
- t_floatarg d1, t_floatarg d2, t_floatarg d3, t_floatarg d4, t_floatarg d5);
-typedef t_pd *(*t_fun6)(t_int i1, t_int i2, t_int i3, t_int i4, t_int i5, t_int i6,
- t_floatarg d1, t_floatarg d2, t_floatarg d3, t_floatarg d4, t_floatarg d5);
+/* this file is generated by m_class_dispatcher.c */
+#include "m_class_dispatcher_1.h"
void *bang_new(t_pd *dummy);
void *pdfloat_new(t_pd *dummy, t_float f);
@@ -969,7 +963,8 @@ void pd_typedmess(t_pd *x, t_symbol *s, int argc, t_atom *argv)
int i;
t_int ai[MAXPDARG+1], *ap = ai;
t_floatarg ad[MAXPDARG+1], *dp = ad;
- int narg = 0;
+ int niarg = 0;
+ int nfarg = 0;
t_pd *bonzo;
/* check for messages that are handled by fixed slots in the class
@@ -1027,7 +1022,7 @@ void pd_typedmess(t_pd *x, t_symbol *s, int argc, t_atom *argv)
return;
}
if (argc > MAXPDARG) argc = MAXPDARG;
- if (x != &pd_objectmaker) *(ap++) = (t_int)x, narg++;
+ if (x != &pd_objectmaker) *(ap++) = (t_int)x, niarg++;
while ((wanttype = *wp++))
{
switch (wanttype)
@@ -1042,7 +1037,7 @@ void pd_typedmess(t_pd *x, t_symbol *s, int argc, t_atom *argv)
argc--;
argv++;
}
- narg++;
+ niarg++;
ap++;
break;
case A_FLOAT:
@@ -1057,6 +1052,7 @@ void pd_typedmess(t_pd *x, t_symbol *s, int argc, t_atom *argv)
argc--;
argv++;
}
+ nfarg++;
dp++;
break;
case A_SYMBOL:
@@ -1078,36 +1074,17 @@ void pd_typedmess(t_pd *x, t_symbol *s, int argc, t_atom *argv)
argc--;
argv++;
}
- narg++;
+ niarg++;
ap++;
break;
default:
goto badarg;
}
}
- switch (narg)
- {
- case 0 : bonzo = (*(t_fun0)(m->me_fun))
- (ad[0], ad[1], ad[2], ad[3], ad[4]); break;
- case 1 : bonzo = (*(t_fun1)(m->me_fun))
- (ai[0], ad[0], ad[1], ad[2], ad[3], ad[4]); break;
- case 2 : bonzo = (*(t_fun2)(m->me_fun))
- (ai[0], ai[1], ad[0], ad[1], ad[2], ad[3], ad[4]); break;
- case 3 : bonzo = (*(t_fun3)(m->me_fun))
- (ai[0], ai[1], ai[2], ad[0], ad[1], ad[2], ad[3], ad[4]); break;
- case 4 : bonzo = (*(t_fun4)(m->me_fun))
- (ai[0], ai[1], ai[2], ai[3],
- ad[0], ad[1], ad[2], ad[3], ad[4]); break;
- case 5 : bonzo = (*(t_fun5)(m->me_fun))
- (ai[0], ai[1], ai[2], ai[3], ai[4],
- ad[0], ad[1], ad[2], ad[3], ad[4]); break;
- case 6 : bonzo = (*(t_fun6)(m->me_fun))
- (ai[0], ai[1], ai[2], ai[3], ai[4], ai[5],
- ad[0], ad[1], ad[2], ad[3], ad[4]); break;
- default: bonzo = 0;
- }
- if (x == &pd_objectmaker)
- pd_this->pd_newest = bonzo;
+
+/* this file is generated by m_class_dispatcher.c */
+#include "m_class_dispatcher_2.h"
+
return;
}
(*c->c_anymethod)(x, s, argc, argv);
diff --git a/src/m_class_dispatcher.c b/src/m_class_dispatcher.c
new file mode 100644
index 000000000..f26bb5054
--- /dev/null
+++ b/src/m_class_dispatcher.c
@@ -0,0 +1,164 @@
+/*
+This program generates the files
+- m_class_dispatcher_1.h, containing typedefs
+- m_class_dispatcher_2.h, containing the dispatcher
+
+Function pointers must be called at their exact type in Emscripten,
+including return type, which makes the number of cases explode (42
+instead of 6). This is not checked at compile time, but wrong usage
+crashes at runtime. The naming pattern is t_funMN for M t_int args
+and N t_floatarg args returning t_pd *, with t_vfunMN for the void-
+returning variants. The versions with a t_pd * are for pd_objectmaker,
+which returns the new object from the method, c.f. pd_newest support.
+For the same reason, bang_new() and similar can't be private in
+Emscripten, because their return type is different (as pd_objectmaker
+methods) vs regular bang methods, so they need special treatment in the
+dispatcher: the dispatcher checks explicitly for pd_objectmaker and
+calls the method at the correct type.
+*/
+
+#include
+#include
+
+#define MAXMAXARGS 16
+
+const char *warning =
+ "/* IMPORTANT: EDIT m_class_dispatcher.c INSTEAD OF THIS FILE */\n";
+
+int main(int argc, char **argv)
+{
+ const char *rettype[2] = { "void ", "t_pd *" };
+ int MAXARGS, ret, args, iargs, fargs, arg;
+ FILE *o;
+ if (argc != 2)
+ {
+ fprintf(stderr, "usage: %s maxargs\n", argv[0]);
+ return 1;
+ }
+ MAXARGS = atoi(argv[1]);
+ if (MAXARGS >= MAXMAXARGS)
+ {
+ fprintf(stderr, "error: too many arguments for today\n");
+ return 1;
+ }
+ o = fopen("m_class_dispatcher_1.h", "w");
+ if (! o)
+ {
+ return 1;
+ }
+ fprintf(o, warning);
+ for (ret = 0; ret < 2; ++ret)
+ {
+ for (args = 0; args <= MAXARGS; ++args)
+ {
+ for (iargs = 0; iargs <= args; ++iargs)
+ {
+ fargs = args - iargs;
+ fprintf(o, "typedef %s(*t_%sfun%d%d)(",
+ rettype[ret], ret ? "" : "v", iargs, fargs);
+ if (args)
+ {
+ for (arg = 0; arg < args; ++arg)
+ {
+ if (arg > 0)
+ {
+ fprintf(o, ", ");
+ }
+ if (arg < iargs)
+ {
+ fprintf(o, "t_int i%d", arg);
+ }
+ else
+ {
+ fprintf(o, "t_floatarg d%d", arg - iargs);
+ }
+ }
+ }
+ else
+ {
+ fprintf(o, "void");
+ }
+ fprintf(o, ");\n");
+ }
+ }
+ }
+ fclose(o);
+ o = fopen("m_class_dispatcher_2.h", "w");
+ if (! o)
+ {
+ return 1;
+ }
+ fprintf(o, warning);
+ fprintf(o,
+ "if (x == &pd_objectmaker)\n"
+ "{\n"
+ " switch (niarg * %d + nfarg)\n"
+ " {\n",
+ MAXMAXARGS);
+ for (args = 0; args <= MAXARGS; ++args)
+ {
+ for (iargs = 0; iargs <= args; ++iargs)
+ {
+ fargs = args - iargs;
+ fprintf(o, " case 0x%02x : bonzo = (*(t_fun%d%d)(m->me_fun))(",
+ iargs * MAXMAXARGS + fargs, iargs, fargs);
+ for (arg = 0; arg < args; ++arg)
+ {
+ if (arg > 0)
+ {
+ fprintf(o, ", ");
+ }
+ if (arg < iargs)
+ {
+ fprintf(o, "ai[%d]", arg);
+ }
+ else
+ {
+ fprintf(o, "ad[%d]", arg - iargs);
+ }
+ }
+ fprintf(o, "); break;\n");
+ }
+ }
+ fprintf(o,
+ " default : bonzo = 0;\n"
+ " }\n"
+ " pd_this->pd_newest = bonzo;\n"
+ "}\n"
+ "else\n"
+ "{\n"
+ " switch (niarg * %d + nfarg)\n"
+ " {\n",
+ MAXMAXARGS);
+ for (args = 0; args <= MAXARGS; ++args)
+ {
+ for (iargs = 0; iargs <= args; ++iargs)
+ {
+ fargs = args - iargs;
+ fprintf(o, " case 0x%02x : (*(t_vfun%d%d)(m->me_fun))(",
+ iargs * MAXMAXARGS + fargs, iargs, fargs);
+ for (arg = 0; arg < args; ++arg)
+ {
+ if (arg > 0)
+ {
+ fprintf(o, ", ");
+ }
+ if (arg < iargs)
+ {
+ fprintf(o, "ai[%d]", arg);
+ }
+ else
+ {
+ fprintf(o, "ad[%d]", arg - iargs);
+ }
+ }
+ fprintf(o, "); break;\n");
+ }
+ }
+ fprintf(o,
+ " default : ;\n"
+ " }\n"
+ "}\n");
+ fclose(o);
+ return 0;
+}
diff --git a/src/m_class_dispatcher_1.h b/src/m_class_dispatcher_1.h
new file mode 100644
index 000000000..511ab9a1a
--- /dev/null
+++ b/src/m_class_dispatcher_1.h
@@ -0,0 +1,43 @@
+/* IMPORTANT: EDIT m_class_dispatcher.c INSTEAD OF THIS FILE */
+typedef void (*t_vfun00)(void);
+typedef void (*t_vfun01)(t_floatarg d0);
+typedef void (*t_vfun10)(t_int i0);
+typedef void (*t_vfun02)(t_floatarg d0, t_floatarg d1);
+typedef void (*t_vfun11)(t_int i0, t_floatarg d0);
+typedef void (*t_vfun20)(t_int i0, t_int i1);
+typedef void (*t_vfun03)(t_floatarg d0, t_floatarg d1, t_floatarg d2);
+typedef void (*t_vfun12)(t_int i0, t_floatarg d0, t_floatarg d1);
+typedef void (*t_vfun21)(t_int i0, t_int i1, t_floatarg d0);
+typedef void (*t_vfun30)(t_int i0, t_int i1, t_int i2);
+typedef void (*t_vfun04)(t_floatarg d0, t_floatarg d1, t_floatarg d2, t_floatarg d3);
+typedef void (*t_vfun13)(t_int i0, t_floatarg d0, t_floatarg d1, t_floatarg d2);
+typedef void (*t_vfun22)(t_int i0, t_int i1, t_floatarg d0, t_floatarg d1);
+typedef void (*t_vfun31)(t_int i0, t_int i1, t_int i2, t_floatarg d0);
+typedef void (*t_vfun40)(t_int i0, t_int i1, t_int i2, t_int i3);
+typedef void (*t_vfun05)(t_floatarg d0, t_floatarg d1, t_floatarg d2, t_floatarg d3, t_floatarg d4);
+typedef void (*t_vfun14)(t_int i0, t_floatarg d0, t_floatarg d1, t_floatarg d2, t_floatarg d3);
+typedef void (*t_vfun23)(t_int i0, t_int i1, t_floatarg d0, t_floatarg d1, t_floatarg d2);
+typedef void (*t_vfun32)(t_int i0, t_int i1, t_int i2, t_floatarg d0, t_floatarg d1);
+typedef void (*t_vfun41)(t_int i0, t_int i1, t_int i2, t_int i3, t_floatarg d0);
+typedef void (*t_vfun50)(t_int i0, t_int i1, t_int i2, t_int i3, t_int i4);
+typedef t_pd *(*t_fun00)(void);
+typedef t_pd *(*t_fun01)(t_floatarg d0);
+typedef t_pd *(*t_fun10)(t_int i0);
+typedef t_pd *(*t_fun02)(t_floatarg d0, t_floatarg d1);
+typedef t_pd *(*t_fun11)(t_int i0, t_floatarg d0);
+typedef t_pd *(*t_fun20)(t_int i0, t_int i1);
+typedef t_pd *(*t_fun03)(t_floatarg d0, t_floatarg d1, t_floatarg d2);
+typedef t_pd *(*t_fun12)(t_int i0, t_floatarg d0, t_floatarg d1);
+typedef t_pd *(*t_fun21)(t_int i0, t_int i1, t_floatarg d0);
+typedef t_pd *(*t_fun30)(t_int i0, t_int i1, t_int i2);
+typedef t_pd *(*t_fun04)(t_floatarg d0, t_floatarg d1, t_floatarg d2, t_floatarg d3);
+typedef t_pd *(*t_fun13)(t_int i0, t_floatarg d0, t_floatarg d1, t_floatarg d2);
+typedef t_pd *(*t_fun22)(t_int i0, t_int i1, t_floatarg d0, t_floatarg d1);
+typedef t_pd *(*t_fun31)(t_int i0, t_int i1, t_int i2, t_floatarg d0);
+typedef t_pd *(*t_fun40)(t_int i0, t_int i1, t_int i2, t_int i3);
+typedef t_pd *(*t_fun05)(t_floatarg d0, t_floatarg d1, t_floatarg d2, t_floatarg d3, t_floatarg d4);
+typedef t_pd *(*t_fun14)(t_int i0, t_floatarg d0, t_floatarg d1, t_floatarg d2, t_floatarg d3);
+typedef t_pd *(*t_fun23)(t_int i0, t_int i1, t_floatarg d0, t_floatarg d1, t_floatarg d2);
+typedef t_pd *(*t_fun32)(t_int i0, t_int i1, t_int i2, t_floatarg d0, t_floatarg d1);
+typedef t_pd *(*t_fun41)(t_int i0, t_int i1, t_int i2, t_int i3, t_floatarg d0);
+typedef t_pd *(*t_fun50)(t_int i0, t_int i1, t_int i2, t_int i3, t_int i4);
diff --git a/src/m_class_dispatcher_2.h b/src/m_class_dispatcher_2.h
new file mode 100644
index 000000000..009a3cb53
--- /dev/null
+++ b/src/m_class_dispatcher_2.h
@@ -0,0 +1,58 @@
+/* IMPORTANT: EDIT m_class_dispatcher.c INSTEAD OF THIS FILE */
+if (x == &pd_objectmaker)
+{
+ switch (niarg * 16 + nfarg)
+ {
+ case 0x00 : bonzo = (*(t_fun00)(m->me_fun))(); break;
+ case 0x01 : bonzo = (*(t_fun01)(m->me_fun))(ad[0]); break;
+ case 0x10 : bonzo = (*(t_fun10)(m->me_fun))(ai[0]); break;
+ case 0x02 : bonzo = (*(t_fun02)(m->me_fun))(ad[0], ad[1]); break;
+ case 0x11 : bonzo = (*(t_fun11)(m->me_fun))(ai[0], ad[0]); break;
+ case 0x20 : bonzo = (*(t_fun20)(m->me_fun))(ai[0], ai[1]); break;
+ case 0x03 : bonzo = (*(t_fun03)(m->me_fun))(ad[0], ad[1], ad[2]); break;
+ case 0x12 : bonzo = (*(t_fun12)(m->me_fun))(ai[0], ad[0], ad[1]); break;
+ case 0x21 : bonzo = (*(t_fun21)(m->me_fun))(ai[0], ai[1], ad[0]); break;
+ case 0x30 : bonzo = (*(t_fun30)(m->me_fun))(ai[0], ai[1], ai[2]); break;
+ case 0x04 : bonzo = (*(t_fun04)(m->me_fun))(ad[0], ad[1], ad[2], ad[3]); break;
+ case 0x13 : bonzo = (*(t_fun13)(m->me_fun))(ai[0], ad[0], ad[1], ad[2]); break;
+ case 0x22 : bonzo = (*(t_fun22)(m->me_fun))(ai[0], ai[1], ad[0], ad[1]); break;
+ case 0x31 : bonzo = (*(t_fun31)(m->me_fun))(ai[0], ai[1], ai[2], ad[0]); break;
+ case 0x40 : bonzo = (*(t_fun40)(m->me_fun))(ai[0], ai[1], ai[2], ai[3]); break;
+ case 0x05 : bonzo = (*(t_fun05)(m->me_fun))(ad[0], ad[1], ad[2], ad[3], ad[4]); break;
+ case 0x14 : bonzo = (*(t_fun14)(m->me_fun))(ai[0], ad[0], ad[1], ad[2], ad[3]); break;
+ case 0x23 : bonzo = (*(t_fun23)(m->me_fun))(ai[0], ai[1], ad[0], ad[1], ad[2]); break;
+ case 0x32 : bonzo = (*(t_fun32)(m->me_fun))(ai[0], ai[1], ai[2], ad[0], ad[1]); break;
+ case 0x41 : bonzo = (*(t_fun41)(m->me_fun))(ai[0], ai[1], ai[2], ai[3], ad[0]); break;
+ case 0x50 : bonzo = (*(t_fun50)(m->me_fun))(ai[0], ai[1], ai[2], ai[3], ai[4]); break;
+ default : bonzo = 0;
+ }
+ pd_this->pd_newest = bonzo;
+}
+else
+{
+ switch (niarg * 16 + nfarg)
+ {
+ case 0x00 : (*(t_vfun00)(m->me_fun))(); break;
+ case 0x01 : (*(t_vfun01)(m->me_fun))(ad[0]); break;
+ case 0x10 : (*(t_vfun10)(m->me_fun))(ai[0]); break;
+ case 0x02 : (*(t_vfun02)(m->me_fun))(ad[0], ad[1]); break;
+ case 0x11 : (*(t_vfun11)(m->me_fun))(ai[0], ad[0]); break;
+ case 0x20 : (*(t_vfun20)(m->me_fun))(ai[0], ai[1]); break;
+ case 0x03 : (*(t_vfun03)(m->me_fun))(ad[0], ad[1], ad[2]); break;
+ case 0x12 : (*(t_vfun12)(m->me_fun))(ai[0], ad[0], ad[1]); break;
+ case 0x21 : (*(t_vfun21)(m->me_fun))(ai[0], ai[1], ad[0]); break;
+ case 0x30 : (*(t_vfun30)(m->me_fun))(ai[0], ai[1], ai[2]); break;
+ case 0x04 : (*(t_vfun04)(m->me_fun))(ad[0], ad[1], ad[2], ad[3]); break;
+ case 0x13 : (*(t_vfun13)(m->me_fun))(ai[0], ad[0], ad[1], ad[2]); break;
+ case 0x22 : (*(t_vfun22)(m->me_fun))(ai[0], ai[1], ad[0], ad[1]); break;
+ case 0x31 : (*(t_vfun31)(m->me_fun))(ai[0], ai[1], ai[2], ad[0]); break;
+ case 0x40 : (*(t_vfun40)(m->me_fun))(ai[0], ai[1], ai[2], ai[3]); break;
+ case 0x05 : (*(t_vfun05)(m->me_fun))(ad[0], ad[1], ad[2], ad[3], ad[4]); break;
+ case 0x14 : (*(t_vfun14)(m->me_fun))(ai[0], ad[0], ad[1], ad[2], ad[3]); break;
+ case 0x23 : (*(t_vfun23)(m->me_fun))(ai[0], ai[1], ad[0], ad[1], ad[2]); break;
+ case 0x32 : (*(t_vfun32)(m->me_fun))(ai[0], ai[1], ai[2], ad[0], ad[1]); break;
+ case 0x41 : (*(t_vfun41)(m->me_fun))(ai[0], ai[1], ai[2], ai[3], ad[0]); break;
+ case 0x50 : (*(t_vfun50)(m->me_fun))(ai[0], ai[1], ai[2], ai[3], ai[4]); break;
+ default : ;
+ }
+}
From 2c488bd65c0a88b70ee6ba0453e53cc9c9632eb5 Mon Sep 17 00:00:00 2001
From: Claude Heiland-Allen
Date: Tue, 8 Jan 2019 12:10:35 +0000
Subject: [PATCH 013/450] objectmaker methods need to be cast to their real
type for emscripten
---
src/m_pd.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/m_pd.c b/src/m_pd.c
index f4651a55d..f1e7f744b 100644
--- a/src/m_pd.c
+++ b/src/m_pd.c
@@ -275,7 +275,10 @@ void pd_bang(t_pd *x)
void pd_float(t_pd *x, t_float f)
{
- (*(*x)->c_floatmethod)(x, f);
+ if (x == &pd_objectmaker)
+ ((t_floatmethodr)(*(*x)->c_floatmethod))(x, f);
+ else
+ (*(*x)->c_floatmethod)(x, f);
}
void pd_pointer(t_pd *x, t_gpointer *gp)
From 79f630e6800d1246e5185c9de1ee764b69a2acb2 Mon Sep 17 00:00:00 2001
From: Claude Heiland-Allen
Date: Wed, 11 Aug 2021 13:55:38 +0100
Subject: [PATCH 014/450] can't call canvas_new at wrong function pointer type
in emscripten
---
src/m_class.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/m_class.c b/src/m_class.c
index 66202a6ac..0c4f1c35f 100644
--- a/src/m_class.c
+++ b/src/m_class.c
@@ -1018,7 +1018,10 @@ void pd_typedmess(t_pd *x, t_symbol *s, int argc, t_atom *argv)
if (x == &pd_objectmaker)
pd_this->pd_newest =
(*((t_newgimme)(m->me_fun)))(s, argc, argv);
- else (*((t_messgimme)(m->me_fun)))(x, s, argc, argv);
+ else if (((t_messgimmer)(m->me_fun)) == ((t_messgimmer)(canvas_new)))
+ (*((t_messgimmer)(m->me_fun)))(x, s, argc, argv);
+ else
+ (*((t_messgimme)(m->me_fun)))(x, s, argc, argv);
return;
}
if (argc > MAXPDARG) argc = MAXPDARG;
From 3e5bc684ba40adf23a8d224ba438b30e5b6c799b Mon Sep 17 00:00:00 2001
From: Claude Heiland-Allen
Date: Tue, 8 Jan 2019 12:17:06 +0000
Subject: [PATCH 015/450] fix objectmaker methods function pointer type issues
in emscripten
---
src/m_class.c | 35 +++++++++++++++++++++++++++--------
1 file changed, 27 insertions(+), 8 deletions(-)
diff --git a/src/m_class.c b/src/m_class.c
index 0c4f1c35f..c9792fe3a 100644
--- a/src/m_class.c
+++ b/src/m_class.c
@@ -971,28 +971,47 @@ void pd_typedmess(t_pd *x, t_symbol *s, int argc, t_atom *argv)
structure. */
if (s == &s_float)
{
- if (!argc) (*c->c_floatmethod)(x, 0.);
- else if (argv->a_type == A_FLOAT)
- (*c->c_floatmethod)(x, argv->a_w.w_float);
- else goto badarg;
+ if (x == &pd_objectmaker)
+ if (!argc)
+ pd_this->pd_newest = pdfloat_new(x, 0.);
+ else if (argv->a_type == A_FLOAT)
+ pd_this->pd_newest = pdfloat_new(x, argv->a_w.w_float);
+ else goto badarg;
+ else
+ if (!argc) (*c->c_floatmethod)(x, 0.);
+ else if (argv->a_type == A_FLOAT)
+ (*c->c_floatmethod)(x, argv->a_w.w_float);
+ else goto badarg;
return;
}
if (s == &s_bang)
{
- (*c->c_bangmethod)(x);
+ if (x == &pd_objectmaker)
+ pd_this->pd_newest = bang_new(x);
+ else
+ (*c->c_bangmethod)(x);
return;
}
if (s == &s_list)
{
- (*c->c_listmethod)(x, s, argc, argv);
+ if (x == &pd_objectmaker)
+ pd_this->pd_newest = list_new(x, s, argc, argv);
+ else
+ (*c->c_listmethod)(x, s, argc, argv);
return;
}
if (s == &s_symbol)
{
if (argc && argv->a_type == A_SYMBOL)
- (*c->c_symbolmethod)(x, argv->a_w.w_symbol);
+ if (x == &pd_objectmaker)
+ pd_this->pd_newest = pdsymbol_new(x, argv->a_w.w_symbol);
+ else
+ (*c->c_symbolmethod)(x, argv->a_w.w_symbol);
else
- (*c->c_symbolmethod)(x, &s_);
+ if (x == &pd_objectmaker)
+ pd_this->pd_newest = pdsymbol_new(x, &s_);
+ else
+ (*c->c_symbolmethod)(x, &s_);
return;
}
/* pd_objectmaker doesn't require
From fc3a15a4e133b9f0d57b7132758cf20ba7708a17 Mon Sep 17 00:00:00 2001
From: Claude Heiland-Allen
Date: Fri, 9 Jun 2023 14:55:36 +0100
Subject: [PATCH 016/450] call free method using correct function pointer type
(required by Emscripten)
---
src/m_pd.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/m_pd.c b/src/m_pd.c
index f1e7f744b..7e3ff601d 100644
--- a/src/m_pd.c
+++ b/src/m_pd.c
@@ -25,10 +25,12 @@ t_pd *pd_new(t_class *c)
return (x);
}
+typedef void (*t_freemethod)(t_pd *);
+
void pd_free(t_pd *x)
{
t_class *c = *x;
- if (c->c_freemethod) (*(t_gotfn)(c->c_freemethod))(x);
+ if (c->c_freemethod) (*(t_freemethod)(c->c_freemethod))(x);
if (c->c_patchable)
{
while (((t_object *)x)->ob_outlet)
From 32f380a1128371265a3fa5dd2fdb318bfe8630e9 Mon Sep 17 00:00:00 2001
From: Claude Heiland-Allen
Date: Fri, 9 Jun 2023 15:48:39 +0100
Subject: [PATCH 017/450] ensure the class dispatched files are included in
dist tarballs
---
src/Makefile.am | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/Makefile.am b/src/Makefile.am
index da62435e2..80dd7b8d6 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -204,6 +204,7 @@ pkginclude_HEADERS = m_pd.h m_imp.h g_canvas.h g_undo.h g_all_guis.h s_stuff.h \
include_HEADERS = m_pd.h
noinst_HEADERS = s_audio_alsa.h s_audio_paring.h s_utf8.h m_private_utils.h
noinst_HEADERS += z_hooks.h z_ringbuffer.h x_libpdreceive.h
+noinst_HEADERS += m_class_dispatcher_1.h m_class_dispatcher_2.h
if LIBPD
libpdinclude_HEADERS += m_pd.h z_libpd.h
@@ -215,7 +216,8 @@ endif
# we want these in the dist tarball
EXTRA_DIST = CHANGELOG.txt notes.txt pd.rc \
makefile.gnu makefile.mac makefile.mingw makefile.msvc \
- d_soundfile.h s_audio_audiounit.c s_audio_esd.c
+ d_soundfile.h s_audio_audiounit.c s_audio_esd.c \
+ m_class_dispatcher.c
# add WISH define if it's set
WISH=@WISH@
From 4f58a8488da63af88df676660277f7683211bbcd Mon Sep 17 00:00:00 2001
From: Christof Ressi
Date: Wed, 28 Jun 2023 11:20:29 +0200
Subject: [PATCH 018/450] "set" message with no arguments unsets receive~,
throw~ and table DSP objects
---
src/d_array.c | 9 +++++++++
src/d_global.c | 4 ++--
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/src/d_array.c b/src/d_array.c
index f3bba6782..87df29d8e 100644
--- a/src/d_array.c
+++ b/src/d_array.c
@@ -76,6 +76,15 @@ static void arrayvec_testvec(t_arrayvec *v)
static void arrayvec_set(t_arrayvec *v, int argc, t_atom *argv)
{
int i;
+ if (!argc) /* unset */
+ {
+ for (i = 0; i < v->v_n; i++)
+ {
+ gpointer_unset(&v->v_vec[i].d_gp);
+ v->v_vec[i].d_symbol = &s_;
+ }
+ return;
+ }
for (i = 0; i < v->v_n && i < argc; i++)
{
gpointer_unset(&v->v_vec[i].d_gp); /* reset the pointer */
diff --git a/src/d_global.c b/src/d_global.c
index 2f06e13b7..eb7980b97 100644
--- a/src/d_global.c
+++ b/src/d_global.c
@@ -225,7 +225,7 @@ static void sigreceive_setup(void)
A_DEFSYM, A_DEFFLOAT, 0);
class_setdspflags(sigreceive_class, CLASS_MULTICHANNEL);
class_addmethod(sigreceive_class, (t_method)sigreceive_set, gensym("set"),
- A_SYMBOL, 0);
+ A_DEFSYM, 0);
class_addmethod(sigreceive_class, (t_method)sigreceive_dsp,
gensym("dsp"), A_CANT, 0);
class_sethelpsymbol(sigreceive_class, gensym("send-receive-tilde"));
@@ -392,7 +392,7 @@ static void sigthrow_setup(void)
sigthrow_class = class_new(gensym("throw~"), (t_newmethod)sigthrow_new, 0,
sizeof(t_sigthrow), CLASS_MULTICHANNEL, A_DEFSYM, 0);
class_addmethod(sigthrow_class, (t_method)sigthrow_set, gensym("set"),
- A_SYMBOL, 0);
+ A_DEFSYM, 0);
CLASS_MAINSIGNALIN(sigthrow_class, t_sigthrow, x_f);
class_addmethod(sigthrow_class, (t_method)sigthrow_dsp,
gensym("dsp"), A_CANT, 0);
From f74ea97599e2a6fc132ad6b41cfc9e0235235fc4 Mon Sep 17 00:00:00 2001
From: Christof Ressi
Date: Wed, 28 Jun 2023 12:00:27 +0200
Subject: [PATCH 019/450] tabread4~: make onset inlet signal rate
---
src/d_array.c | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/src/d_array.c b/src/d_array.c
index f3bba6782..681ef5b7f 100644
--- a/src/d_array.c
+++ b/src/d_array.c
@@ -471,24 +471,23 @@ typedef struct _tabread4_tilde
t_object x_obj;
t_arrayvec x_v;
t_float x_f;
- t_float x_onset;
} t_tabread4_tilde;
static void *tabread4_tilde_new(t_symbol *s, int argc, t_atom *argv)
{
t_tabread4_tilde *x = (t_tabread4_tilde *)pd_new(tabread4_tilde_class);
arrayvec_init(&x->x_v, x, argc, argv);
+ signalinlet_new(&x->x_obj, 0);
outlet_new(&x->x_obj, gensym("signal"));
- floatinlet_new(&x->x_obj, &x->x_onset);
- x->x_f = x->x_onset = 0;
+ x->x_f = 0;
return (x);
}
static t_int *tabread4_tilde_perform(t_int *w)
{
t_dsparray *d = (t_dsparray *)(w[1]);
- double onset = *(t_float *)(w[2]);
- t_sample *in = (t_sample *)(w[3]);
+ t_sample *in = (t_sample *)(w[2]);
+ t_sample *onset = (t_sample *)(w[3]);
t_sample *out = (t_sample *)(w[4]);
int n = (int)(w[5]);
int maxindex, i;
@@ -505,7 +504,7 @@ static t_int *tabread4_tilde_perform(t_int *w)
for (i = 0; i < n; i++)
{
- double findex = *in++ + onset;
+ double findex = (double)*in++ + (double)*onset++;
int index = findex;
t_sample frac, a, b, c, d, cminusb;
if (index < 1)
@@ -542,13 +541,14 @@ static void tabread4_tilde_set(t_tabread4_tilde *x, t_symbol *s,
static void tabread4_tilde_dsp(t_tabread4_tilde *x, t_signal **sp)
{
- int i;
- signal_setmultiout(&sp[1], x->x_v.v_n);
+ int i, length = sp[0]->s_length;
+ signal_setmultiout(&sp[2], x->x_v.v_n);
arrayvec_testvec(&x->x_v);
for (i = 0; i < x->x_v.v_n; i++)
- dsp_add(tabread4_tilde_perform, 5, &x->x_v.v_vec[i], &x->x_onset,
- sp[0]->s_vec + (i%(sp[0]->s_nchans)) * sp[0]->s_length,
- sp[1]->s_vec + i * sp[0]->s_length, (t_int)sp[0]->s_length);
+ dsp_add(tabread4_tilde_perform, 5, &x->x_v.v_vec[i],
+ sp[0]->s_vec + (i % sp[0]->s_nchans) * length,
+ sp[1]->s_vec + (i % sp[1]->s_nchans) * length,
+ sp[2]->s_vec + i * length, (t_int)length);
}
From f40d63d3bcb6566c63765ff3b51db56e6579fff0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E2=AD=90caitp=E2=AD=90?=
Date: Sun, 8 Oct 2023 00:17:34 -0400
Subject: [PATCH 020/450] docs: fix uanother typo in drawtext-help.pd
---
doc/5.reference/drawtext-help.pd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/5.reference/drawtext-help.pd b/doc/5.reference/drawtext-help.pd
index 620aca7c9..5fab5e7c5 100644
--- a/doc/5.reference/drawtext-help.pd
+++ b/doc/5.reference/drawtext-help.pd
@@ -21,7 +21,7 @@
#X text 39 42 - Optional flags:, f 54;
#X text 53 63 - "-n": make invisible initially \; - "-v [const or field name]": assign a variable to make this visible/invisible., f 57;
#X text 28 114 Arguments:;
-#X text 550 264 This [sruct] object below defines the fields for this template. You can see them by right-clicking on the object in the "drawtext-data" window and selecting "properties.";
+#X text 550 264 This [struct] object below defines the fields for this template. You can see them by right-clicking on the object in the "drawtext-data" window and selecting "properties.";
#X text 104 238 <-- inlet sets visibility (1: visible \, 0: invisible);
#X obj 762 221 drawtext -n boom 0 -45 0 boom=;
#X obj 762 190 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
From 2c6b7070ed79f9af690c8a2efea0fe198ee0ac7f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Thu, 2 Nov 2023 14:55:46 +0100
Subject: [PATCH 021/450] properly export some symbols used in extra/
however, we really should wrap these into access functions
https://github.com/pure-data/pure-data/issues/2122
---
src/m_pd.h | 2 +-
src/s_stuff.h | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/m_pd.h b/src/m_pd.h
index c658fa555..d8c6c44e4 100644
--- a/src/m_pd.h
+++ b/src/m_pd.h
@@ -12,7 +12,6 @@ extern "C" {
#define PD_MINOR_VERSION 54
#define PD_BUGFIX_VERSION 1
#define PD_TEST_VERSION ""
-extern int pd_compatibilitylevel; /* e.g., 43 for pd 0.43 compatibility */
/* old name for "MSW" flag -- we have to take it for the sake of many old
"nmakefiles" for externs, which will define NT and not MSW */
@@ -903,6 +902,7 @@ static inline int PD_BIGORSMALL(t_float f) /* exponent outside (-512,512) */
/* get version number at run time */
EXTERN void sys_getversion(int *major, int *minor, int *bugfix);
+EXTERN int pd_compatibilitylevel; /* e.g., 43 for pd 0.43 compatibility */
/* get floatsize at run time */
EXTERN unsigned int sys_getfloatsize(void);
diff --git a/src/s_stuff.h b/src/s_stuff.h
index 0708d453c..36faa5ee1 100644
--- a/src/s_stuff.h
+++ b/src/s_stuff.h
@@ -38,7 +38,7 @@ extern t_symbol *sys_flags;
/* s_main.c */
extern int sys_debuglevel;
extern int sys_verbose;
-extern int sys_noloadbang;
+EXTERN int sys_noloadbang;
EXTERN int sys_havegui(void);
extern const char *sys_guicmd;
@@ -249,7 +249,7 @@ void dummy_listdevs(void);
/* s_midi.c */
#define MAXMIDIINDEV 16 /* max. number of input ports */
#define MAXMIDIOUTDEV 16 /* max. number of output ports */
-extern int sys_midiapi;
+EXTERN int sys_midiapi;
extern int sys_nmidiin;
extern int sys_nmidiout;
extern int sys_midiindevlist[];
@@ -346,7 +346,7 @@ void sys_setalarm(int microsec);
#endif
void sys_set_priority(int higher);
-extern int sys_hipriority; /* real-time flag, true if priority boosted */
+EXTERN int sys_hipriority; /* real-time flag, true if priority boosted */
/* s_print.c */
From f213ffafbb5345bbcf1d20df1d2c437f529a5b64 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Thu, 2 Nov 2023 16:33:51 +0100
Subject: [PATCH 022/450] export glob_watchdog() as well
but use *void*" in the argument signature (same as the other glob_* callbacks)
---
src/m_glob.c | 2 +-
src/m_imp.h | 1 +
src/m_sched.c | 2 +-
src/s_inter.c | 2 +-
4 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/m_glob.c b/src/m_glob.c
index 0eaf69a28..fe99ca960 100644
--- a/src/m_glob.c
+++ b/src/m_glob.c
@@ -35,7 +35,7 @@ void glob_start_startup_dialog(t_pd *dummy, t_floatarg flongform);
void glob_startup_dialog(t_pd *dummy, t_symbol *s, int argc, t_atom *argv);
void glob_ping(t_pd *dummy);
void glob_plugindispatch(t_pd *dummy, t_symbol *s, int argc, t_atom *argv);
-void glob_watchdog(t_pd *dummy);
+void glob_watchdog(void *dummy);
void glob_loadpreferences(t_pd *dummy, t_symbol *s);
void glob_savepreferences(t_pd *dummy, t_symbol *s);
void glob_forgetpreferences(t_pd *dummy);
diff --git a/src/m_imp.h b/src/m_imp.h
index 5f746094c..44b30d72d 100644
--- a/src/m_imp.h
+++ b/src/m_imp.h
@@ -102,6 +102,7 @@ EXTERN t_pd *glob_evalfile(t_pd *ignore, t_symbol *name, t_symbol *dir);
EXTERN void glob_initfromgui(void *dummy, t_symbol *s, int argc, t_atom *argv);
EXTERN void glob_quit(void *dummy); /* glob_exit(0); */
EXTERN void glob_exit(void *dummy, t_float status);
+EXTERN void glob_watchdog(void *dummy); /* glob_exit(0); */
EXTERN void open_via_helppath(const char *name, const char *dir);
#define __m_imp_h_
diff --git a/src/m_sched.c b/src/m_sched.c
index b62751b98..717561170 100644
--- a/src/m_sched.c
+++ b/src/m_sched.c
@@ -198,7 +198,7 @@ void sys_log_error(int type)
static int sched_lastinclip, sched_lastoutclip,
sched_lastindb, sched_lastoutdb;
-void glob_watchdog(t_pd *dummy);
+void glob_watchdog(void *dummy);
static float sched_fastforward;
diff --git a/src/s_inter.c b/src/s_inter.c
index adf82f8a5..0e433fb9e 100644
--- a/src/s_inter.c
+++ b/src/s_inter.c
@@ -1106,7 +1106,7 @@ void sys_gui_preferences(void)
static int sys_watchfd = -1;
-void glob_watchdog(t_pd *dummy)
+void glob_watchdog(void *dummy)
{
if (sys_watchfd < 0)
return;
From 06b2e0c46aa4eed5de19c7a9a77b5be39bb90cdf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Thu, 2 Nov 2023 16:37:18 +0100
Subject: [PATCH 023/450] export all namelist_* functions
it doesn't really make sense to only export the namelist_append_files()
it's probably just as well to remove all of them from the public interface,
but then, a linked list of strings is a somewhat useful thing
---
src/s_stuff.h | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/s_stuff.h b/src/s_stuff.h
index 36faa5ee1..65fb0b64a 100644
--- a/src/s_stuff.h
+++ b/src/s_stuff.h
@@ -16,10 +16,11 @@ typedef struct _namelist /* element in a linked list of stored strings */
char *nl_string; /* the string */
} t_namelist;
-t_namelist *namelist_append(t_namelist *listwas, const char *s, int allowdup);
+EXTERN t_namelist *namelist_append(t_namelist *listwas, const char *s, int allowdup);
EXTERN t_namelist *namelist_append_files(t_namelist *listwas, const char *s);
-void namelist_free(t_namelist *listwas);
-const char *namelist_get(const t_namelist *namelist, int n);
+EXTERN void namelist_free(t_namelist *listwas);
+EXTERN const char *namelist_get(const t_namelist *namelist, int n);
+
void sys_setextrapath(const char *p);
extern int sys_usestdpath;
int sys_open_absolute(const char *name, const char* ext,
From 7a59ac2d59901ae05b96531e7ef8363d839a9797 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Thu, 2 Nov 2023 16:47:21 +0100
Subject: [PATCH 024/450] Remove EXTERN specifier from function definitions (as
opposed to declarations)
the public interface (including EXTERN) should (only) live in the header-files.
the only exception is error(), which we no longer expose in the headers
but still export.
this also declares mayer_dofft() (in src/d_fft_fftsg.c) as "static",
as it really is an implementation detail. the public API is mayer_fft() resp mayer_ifft()
---
src/d_fft_fftsg.c | 12 ++++++------
src/d_fft_fftw.c | 10 +++++-----
src/g_canvas.c | 2 +-
src/m_class.c | 6 +++---
src/m_pd.c | 6 +++---
5 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/src/d_fft_fftsg.c b/src/d_fft_fftsg.c
index 534175759..0d2d3797c 100644
--- a/src/d_fft_fftsg.c
+++ b/src/d_fft_fftsg.c
@@ -109,12 +109,12 @@ void mayer_term( void)
}
/* -------- public routines -------- */
-EXTERN void mayer_fht(t_sample *fz, int n)
+void mayer_fht(t_sample *fz, int n)
{
post("FHT: not yet implemented");
}
-EXTERN void mayer_dofft(t_sample *fz1, t_sample *fz2, int n, int sgn)
+static void mayer_dofft(t_sample *fz1, t_sample *fz2, int n, int sgn)
{
FFTFLT *buf, *fp3;
int i;
@@ -137,17 +137,17 @@ EXTERN void mayer_dofft(t_sample *fz1, t_sample *fz2, int n, int sgn)
}
}
-EXTERN void mayer_fft(int n, t_sample *fz1, t_sample *fz2)
+void mayer_fft(int n, t_sample *fz1, t_sample *fz2)
{
mayer_dofft(fz1, fz2, n, -1);
}
-EXTERN void mayer_ifft(int n, t_sample *fz1, t_sample *fz2)
+void mayer_ifft(int n, t_sample *fz1, t_sample *fz2)
{
mayer_dofft(fz1, fz2, n, 1);
}
-EXTERN void mayer_realfft(int n, t_sample *fz)
+void mayer_realfft(int n, t_sample *fz)
{
FFTFLT *buf, *fp3;
int i, nover2 = n/2;
@@ -165,7 +165,7 @@ EXTERN void mayer_realfft(int n, t_sample *fz)
*fp1 = fp3[0], *fp2 = fp3[1];
}
-EXTERN void mayer_realifft(int n, t_sample *fz)
+void mayer_realifft(int n, t_sample *fz)
{
FFTFLT *buf, *fp3;
int i, nover2 = n/2;
diff --git a/src/d_fft_fftw.c b/src/d_fft_fftw.c
index 10d1ce403..e356d49c9 100644
--- a/src/d_fft_fftw.c
+++ b/src/d_fft_fftw.c
@@ -167,7 +167,7 @@ void mayer_term(void)
}
-EXTERN void mayer_fht(t_sample *fz, int n)
+void mayer_fht(t_sample *fz, int n)
{
post("FHT: not yet implemented");
}
@@ -189,12 +189,12 @@ static void mayer_do_cfft(int n, t_sample *fz1, t_sample *fz2, int fwd)
fz1[i] = fz[i*2], fz2[i] = fz[i*2+1];
}
-EXTERN void mayer_fft(int n, t_sample *fz1, t_sample *fz2)
+void mayer_fft(int n, t_sample *fz1, t_sample *fz2)
{
mayer_do_cfft(n, fz1, fz2, 1);
}
-EXTERN void mayer_ifft(int n, t_sample *fz1, t_sample *fz2)
+void mayer_ifft(int n, t_sample *fz1, t_sample *fz2)
{
mayer_do_cfft(n, fz1, fz2, 0);
}
@@ -205,7 +205,7 @@ EXTERN void mayer_ifft(int n, t_sample *fz1, t_sample *fz2)
but it's probably the mayer_fft that should be corrected...
*/
-EXTERN void mayer_realfft(int n, t_sample *fz)
+void mayer_realfft(int n, t_sample *fz)
{
int i;
rfftw_info *p = rfftw_getplan(n, 1);
@@ -221,7 +221,7 @@ EXTERN void mayer_realfft(int n, t_sample *fz)
fz[i] = -p->out[i];
}
-EXTERN void mayer_realifft(int n, t_sample *fz)
+void mayer_realifft(int n, t_sample *fz)
{
int i;
rfftw_info *p = rfftw_getplan(n, 0);
diff --git a/src/g_canvas.c b/src/g_canvas.c
index a948ed38e..0a06d2b12 100644
--- a/src/g_canvas.c
+++ b/src/g_canvas.c
@@ -2172,7 +2172,7 @@ void g_canvas_freepdinstance(void)
freebytes(THISGUI, sizeof(*THISGUI));
}
-EXTERN int pd_getdspstate(void)
+int pd_getdspstate(void)
{
return (THISGUI->i_dspstate);
}
diff --git a/src/m_class.c b/src/m_class.c
index 9e98c1fa2..5ea4b1341 100644
--- a/src/m_class.c
+++ b/src/m_class.c
@@ -142,7 +142,7 @@ static void class_addmethodtolist(t_class *c, t_methodentry **methodlist,
}
#ifdef PDINSTANCE
-EXTERN void pd_setinstance(t_pdinstance *x)
+void pd_setinstance(t_pdinstance *x)
{
pd_this = x;
}
@@ -157,7 +157,7 @@ static void pdinstance_renumber(void)
extern void text_template_init(void);
extern void garray_init(void);
-EXTERN t_pdinstance *pdinstance_new(void)
+t_pdinstance *pdinstance_new(void)
{
t_pdinstance *x = (t_pdinstance *)getbytes(sizeof(t_pdinstance));
t_class *c;
@@ -193,7 +193,7 @@ EXTERN t_pdinstance *pdinstance_new(void)
return (x);
}
-EXTERN void pdinstance_free(t_pdinstance *x)
+void pdinstance_free(t_pdinstance *x)
{
t_symbol *s;
t_canvas *canvas;
diff --git a/src/m_pd.c b/src/m_pd.c
index f4651a55d..03799e1f8 100644
--- a/src/m_pd.c
+++ b/src/m_pd.c
@@ -322,7 +322,7 @@ void pd_init(void)
pd_init_systems();
}
-EXTERN void pd_init_systems(void) {
+void pd_init_systems(void) {
mess_init();
sys_lock();
obj_init();
@@ -332,12 +332,12 @@ EXTERN void pd_init_systems(void) {
sys_unlock();
}
-EXTERN void pd_term_systems(void) {
+void pd_term_systems(void) {
sys_lock();
sys_unlock();
}
-EXTERN t_canvas *pd_getcanvaslist(void)
+t_canvas *pd_getcanvaslist(void)
{
return (pd_this->pd_canvaslist);
}
From c073243a9b6a6a81fba738353dcedffca3f8629b Mon Sep 17 00:00:00 2001
From: porres
Date: Thu, 2 Nov 2023 14:21:46 -0300
Subject: [PATCH 025/450] document [notein] handling of 'note off' messages
when receiving a 'note off' message (I mean a proper one, with release velocity), [notein] outputs a message with '0' velocity.
closes https://github.com/pure-data/pddp/issues/170
---
doc/5.reference/midi-help.pd | 205 ++++++++++++++++++-----------------
1 file changed, 104 insertions(+), 101 deletions(-)
diff --git a/doc/5.reference/midi-help.pd b/doc/5.reference/midi-help.pd
index f7881ed79..df9d0d7e8 100644
--- a/doc/5.reference/midi-help.pd
+++ b/doc/5.reference/midi-help.pd
@@ -1,16 +1,16 @@
-#N canvas 207 23 1070 714 12;
-#X obj 529 248 noteout;
-#X obj 675 338 pgmout;
-#X obj 560 338 bendout;
+#N canvas 207 23 1071 715 12;
+#X obj 529 228 noteout;
+#X obj 675 312 pgmout;
+#X obj 560 312 bendout;
#X floatatom 26 447 5 0 0 0 - - - 0;
#X text 31 379 pitch bend, f 5;
-#X obj 675 257 ctlout;
-#X obj 779 338 touchout;
-#X obj 895 338 polytouchout;
-#X obj 69 559 midiin;
-#X obj 411 557 sysexin;
-#X obj 794 631 midiout;
-#X obj 241 567 midirealtimein;
+#X obj 675 237 ctlout;
+#X obj 779 312 touchout;
+#X obj 895 312 polytouchout;
+#X obj 69 553 midiin;
+#X obj 411 551 sysexin;
+#X obj 794 641 midiout;
+#X obj 241 561 midirealtimein;
#X obj 241 419 touchin;
#X obj 340 399 polytouchin;
#X obj 26 167 notein;
@@ -24,7 +24,7 @@
#X text 372 473 aftertouch value;
#X floatatom 261 330 0 0 0 0 - - - 0;
#X text 289 331 value;
-#X text 76 166 (omni);
+#X text 22 147 (omni);
#X obj 166 192 notein 1;
#X text 157 157 (channel 1);
#X text 324 158 (all controllers \, omni);
@@ -32,48 +32,42 @@
#X text 22 325 value;
#X obj 65 298 ctlin 4;
#X floatatom 111 324 0 0 0 0 - - - 0;
-#X text 507 192 note;
-#X text 886 272 touch;
-#X text 931 281 note;
+#X text 507 172 note;
+#X text 886 246 touch;
+#X text 931 255 note;
#X text 121 297 (controller 4);
-#X text 707 178 value;
-#X text 740 231 channel;
-#X obj 848 230 ctlout 7;
-#X text 24 614 raw MIDI byte by byte (except real-time messages), f 27;
-#X text 236 621 real-time messages;
-#X text 32 516 These three below are always omni \, don't take arguments and output the port number on the right outlet:;
-#X text 725 205 controller #;
+#X text 707 158 value;
+#X text 740 211 channel;
+#X obj 848 210 ctlout 7;
+#X text 24 608 raw MIDI byte by byte (except real-time messages), f 27;
+#X text 236 615 real-time messages;
+#X text 32 510 These three below are always omni \, don't take arguments and output the port number on the right outlet:;
+#X text 725 185 controller #;
#X text 327 217 controller #;
#X text 61 241 note;
#X text 159 243 note;
#X text 200 243 velocity;
#X text 409 450 note;
#X obj 26 419 bendin, f 7;
-#X text 81 418 *;
-#X text 615 337 *;
-#X text 612 217 channel;
-#X text 548 191 velocity;
-#X text 391 608 system exclusive messages only \, byte by byte, f 16;
-#X text 886 288 value;
+#X text 612 197 channel;
+#X text 548 171 velocity;
+#X text 393 607 system exclusive messages only \, byte by byte, f 16;
+#X text 886 262 value;
#X text 339 185 channel/port;
#X text 165 171 (port 1);
#X text 139 326 channel/port;
#X obj 261 300 ctlin 7 17;
#X text 339 294 (controller 7 \, channel 1/port 2), f 17;
#X text 15 8 MIDI INPUTS: Inputs are omni by default \, an optional argument sets the channel/port and removes the rightmost outlet (which outputs this information). For [ctlin] \, a first optional argument sets controller number and suppresses its corresponding outlet \, and a second argument sets the channel and also suppresses its corresponding outlet., f 70;
-#X text 549 71 MIDI OUTPUTS: Outputs are set to channel 1 / port 1 by default \, but they also take a channel/port argument (where channels from 17 represent port 2 \, from 33 port 3 and so on). The [ctlout] object takes control and channel/port arguments. Inlets are not suppressed by arguments and change the parameters., f 67;
-#X text 808 163 (controller 7 \, channel/port 1), f 15;
-#X obj 959 230 ctlout 3 38;
+#X text 550 55 MIDI OUTPUTS: Outputs are set to channel 1 / port 1 by default \, but they also take a channel/port argument (where channels from 17 represent port 2 \, from 33 port 3 and so on). The [ctlout] object takes control and channel/port arguments. Inlets are not suppressed by arguments and change the parameters., f 67;
+#X text 808 143 (controller 7 \, channel/port 1), f 15;
+#X obj 959 210 ctlout 3 38;
#X text 15 89 Port number is encoded as the channel number. Channels 1 to 16 are for port 1 \, channels 17 to 32 is the same as channels 1 to 16 for port 2 \, channels 33 to 48 represents channels 1 to 16 in port 3 \, and so on..., f 70;
-#X text 184 418 **;
-#X text 724 337 **;
-#X text 539 437 ** Program change values in [pgmin] and [pgmout] are indexed from 1 \, which means that the possible values are from 1 to 128 (not 0 to 127)!, f 70;
-#X text 539 387 * Known bug: [bendin] and [bendout] are inconsistent ([bendin] outputs values from 0 to 16383 and [bendout] takes values from -8192 to 8191) - this won't change., f 70;
#X text 839 682 updated for Pd version 0.48-2;
-#X text 938 163 (controller 3 \, channel 6/port 3), f 17;
+#X text 938 143 (controller 3 \, channel 6/port 3), f 17;
#X floatatom 26 241 4 0 127 0 - - - 0;
-#X floatatom 588 217 0 1 64 0 - - - 0;
-#X floatatom 560 312 5 0 0 0 - - - 0;
+#X floatatom 588 197 0 1 64 0 - - - 0;
+#X floatatom 560 286 5 0 0 0 - - - 0;
#X floatatom 45 218 4 0 127 0 - - - 0;
#X floatatom 166 221 4 0 127 0 - - - 0;
#X floatatom 280 246 4 0 127 0 - - - 0;
@@ -82,23 +76,23 @@
#X floatatom 340 471 4 0 127 0 - - - 0;
#X floatatom 127 447 4 0 127 0 - - - 0;
#X floatatom 241 447 4 0 127 0 - - - 0;
-#X floatatom 69 588 4 0 127 0 - - - 0;
-#X floatatom 241 596 4 0 127 0 - - - 0;
-#X floatatom 108 588 4 0 127 0 - - - 0;
-#X floatatom 411 586 4 0 127 0 - - - 0;
+#X floatatom 69 582 4 0 127 0 - - - 0;
+#X floatatom 241 590 4 0 127 0 - - - 0;
+#X floatatom 108 582 4 0 127 0 - - - 0;
+#X floatatom 411 580 4 0 127 0 - - - 0;
#X floatatom 457 586 4 0 127 0 - - - 0;
-#X floatatom 336 596 4 0 127 0 - - - 0;
-#X floatatom 959 203 4 0 127 0 - - - 0;
-#X floatatom 848 203 4 0 127 0 - - - 0;
-#X floatatom 694 204 4 0 127 0 - - - 0;
-#X floatatom 675 177 4 0 127 0 - - - 0;
-#X floatatom 552 217 4 0 127 0 - - - 0;
-#X floatatom 514 217 4 0 127 0 - - - 0;
-#X floatatom 675 312 4 0 127 0 - - - 0;
-#X floatatom 779 312 4 0 127 0 - - - 0;
-#X floatatom 895 312 4 0 127 0 - - - 0;
-#X floatatom 935 312 4 0 127 0 - - - 0;
-#X floatatom 714 230 0 1 64 0 - - - 0;
+#X floatatom 336 590 4 0 127 0 - - - 0;
+#X floatatom 959 183 4 0 127 0 - - - 0;
+#X floatatom 848 183 4 0 127 0 - - - 0;
+#X floatatom 694 184 4 0 127 0 - - - 0;
+#X floatatom 675 157 4 0 127 0 - - - 0;
+#X floatatom 552 197 4 0 127 0 - - - 0;
+#X floatatom 514 197 4 0 127 0 - - - 0;
+#X floatatom 675 286 4 0 127 0 - - - 0;
+#X floatatom 779 286 4 0 127 0 - - - 0;
+#X floatatom 895 286 4 0 127 0 - - - 0;
+#X floatatom 935 286 4 0 127 0 - - - 0;
+#X floatatom 714 210 0 1 64 0 - - - 0;
#X floatatom 312 184 0 1 64 0 - - - 0;
#X floatatom 219 220 0 1 64 0 - - - 0;
#X floatatom 65 193 0 1 64 0 - - - 0;
@@ -342,53 +336,62 @@
#X restore 856 9 pd reference;
#X text 954 10 <= click;
#X obj 529 4 cnv 1 1 35 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X floatatom 794 571 5 0 0 0 - - - 0;
-#X text 563 564 In order to use MIDI Input or output objects \, be sure to set MIDI devices in:, f 29;
-#X text 593 615 Preferences --> MIDI;
-#X msg 794 542 144 \, 68 \, 120;
-#X msg 812 599 128 68 0;
-#X text 893 542 note on as a stream of raw MIDI., f 19;
-#X text 881 592 note off as a MIDI packet list, f 18;
-#X text 37 647 (sysex supported);
-#X text 540 478 Raw MIDI output is provided by [midiout]. It deals with a stream of floats or MIDI packet lists. It doesn't take arguments and the 2nd inlet sets port number. You can use [midiout] to send raw real-time and sysex messages as well., f 70;
-#X connect 8 0 83 0;
-#X connect 8 1 85 0;
-#X connect 9 0 86 0;
-#X connect 9 1 87 0;
-#X connect 11 0 84 0;
-#X connect 11 1 88 0;
-#X connect 12 0 82 0;
-#X connect 12 1 104 0;
-#X connect 13 0 80 0;
-#X connect 13 1 79 0;
-#X connect 13 2 105 0;
-#X connect 14 0 72 0;
-#X connect 14 1 75 0;
-#X connect 14 2 102 0;
-#X connect 17 0 77 0;
-#X connect 17 1 78 0;
-#X connect 17 2 100 0;
-#X connect 26 0 76 0;
-#X connect 26 1 101 0;
+#X floatatom 794 591 4 0 0 0 - - - 0;
+#X text 563 573 In order to use MIDI Input or output objects \, be sure to set MIDI devices in:, f 29;
+#X text 593 624 Preferences --> MIDI;
+#X msg 794 562 144 \, 68 \, 120;
+#X text 891 556 note on as a stream of raw MIDI., f 19;
+#X text 919 592 note off as a MIDI packet list, f 18;
+#X text 37 641 (sysex supported);
+#X text 540 498 Raw MIDI output is provided by [midiout]. It deals with a stream of floats or MIDI packet lists. It doesn't take arguments and the 2nd inlet sets port number. You can use [midiout] to send raw real-time and sysex messages as well., f 70;
+#X text 75 166 *;
+#X text 81 418 **;
+#X text 184 418 ***;
+#X text 585 229 *;
+#X text 615 311 **;
+#X text 724 311 ***;
+#X text 539 407 ** Known bug: [bendin] and [bendout] are inconsistent ([bendin] outputs values from 0 to 16383 and [bendout] takes values from -8192 to 8191) - this won't change., f 70;
+#X text 539 457 *** Program change values in [pgmin] and [pgmout] are indexed from 1 \, which means that the possible values are from 1 to 128 (not 0 to 127)!, f 70;
+#X text 539 346 * Release velocity is not supported \, [noteout] only sends Note On velocities and for [notein] a release velocity becomes 0 (commonly interpreted as a "note off"). Tru "note off" messages are still supported via [midiin] and [midiout]., f 70;
+#X msg 838 599 128 68 100;
+#X connect 8 0 77 0;
+#X connect 8 1 79 0;
+#X connect 9 0 80 0;
+#X connect 9 1 81 0;
+#X connect 11 0 78 0;
+#X connect 11 1 82 0;
+#X connect 12 0 76 0;
+#X connect 12 1 98 0;
+#X connect 13 0 74 0;
+#X connect 13 1 73 0;
+#X connect 13 2 99 0;
+#X connect 14 0 66 0;
+#X connect 14 1 69 0;
+#X connect 14 2 96 0;
+#X connect 17 0 71 0;
+#X connect 17 1 72 0;
+#X connect 17 2 94 0;
+#X connect 26 0 70 0;
+#X connect 26 1 95 0;
#X connect 31 0 29 0;
#X connect 31 1 32 0;
#X connect 49 0 3 0;
-#X connect 49 1 103 0;
-#X connect 59 0 23 0;
-#X connect 73 0 0 2;
-#X connect 74 0 2 0;
-#X connect 89 0 64 0;
-#X connect 90 0 39 0;
-#X connect 91 0 5 1;
-#X connect 92 0 5 0;
-#X connect 93 0 0 1;
-#X connect 94 0 0 0;
-#X connect 95 0 1 0;
-#X connect 96 0 6 0;
-#X connect 97 0 7 0;
-#X connect 98 0 7 1;
-#X connect 99 0 5 2;
-#X connect 107 0 81 0;
-#X connect 119 0 10 0;
-#X connect 122 0 119 0;
-#X connect 123 0 10 0;
+#X connect 49 1 97 0;
+#X connect 57 0 23 0;
+#X connect 67 0 0 2;
+#X connect 68 0 2 0;
+#X connect 83 0 62 0;
+#X connect 84 0 39 0;
+#X connect 85 0 5 1;
+#X connect 86 0 5 0;
+#X connect 87 0 0 1;
+#X connect 88 0 0 0;
+#X connect 89 0 1 0;
+#X connect 90 0 6 0;
+#X connect 91 0 7 0;
+#X connect 92 0 7 1;
+#X connect 93 0 5 2;
+#X connect 101 0 75 0;
+#X connect 113 0 10 0;
+#X connect 116 0 113 0;
+#X connect 130 0 10 0;
From 743e145d0a55b06a07e44bdd6a988b624bc622e6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Fri, 3 Nov 2023 09:31:22 +0100
Subject: [PATCH 026/450] Fix glob_watchdog() declaration in pd~
---
extra/pd~/pdsched.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/extra/pd~/pdsched.c b/extra/pd~/pdsched.c
index 07225819c..90fd4ae8a 100644
--- a/extra/pd~/pdsched.c
+++ b/extra/pd~/pdsched.c
@@ -22,7 +22,7 @@ outputs audio and messages. */
#include "binarymsg.c"
#if PD_WATCHDOG
-void glob_watchdog(t_pd *dummy);
+void glob_watchdog(void *dummy);
static void pollwatchdog( void)
{
From 75455f307df22383da18baed94e8eb591a58cac0 Mon Sep 17 00:00:00 2001
From: porres
Date: Tue, 7 Nov 2023 02:35:27 -0300
Subject: [PATCH 027/450] improve pd~
added example to run as -nogui and other minor details and improvements
---
extra/pd~/pd~-help.pd | 127 ++++++++++++++++++------------------
extra/pd~/pd~-subprocess.pd | 92 +++++++++++++-------------
2 files changed, 108 insertions(+), 111 deletions(-)
diff --git a/extra/pd~/pd~-help.pd b/extra/pd~/pd~-help.pd
index 3b15f5b2a..a5cee31a9 100644
--- a/extra/pd~/pd~-help.pd
+++ b/extra/pd~/pd~-help.pd
@@ -1,31 +1,25 @@
-#N canvas 444 23 630 704 12;
-#X msg 80 269 foo bar baz;
-#X obj 228 354 osc~ 440;
-#X obj 145 488 env~ 8192;
-#X floatatom 145 537 5 0 0 0 - - - 0;
-#X msg 34 230 pd~ stop;
-#X obj 145 513 i;
-#X obj 229 489 env~ 8192;
-#X floatatom 229 539 5 0 0 0 - - - 0;
-#X obj 229 515 i;
-#X obj 162 389 *~;
-#X obj 228 390 *~;
-#X obj 63 517 print x;
-#X msg 17 204 pd~ start pd~-subprocess.pd;
+#N canvas 312 23 761 691 12;
+#X msg 160 344 foo bar baz;
+#X obj 257 431 osc~ 440;
+#X obj 174 562 env~ 8192;
+#X floatatom 174 601 8 0 0 0 - - - 0;
+#X msg 68 304 pd~ stop;
+#X obj 257 563 env~ 8192;
+#X floatatom 257 601 8 0 0 0 - - - 0;
+#X obj 191 466 *~;
+#X obj 257 467 *~;
+#X obj 92 591 print x;
#X obj 37 13 pd~;
-#X text 173 250 Any message besides "pd~" is sent to the sub-process. For instance \, the message below sends "bar baz" to any object in the sub-process named "foo" \, such as a "receive" object., f 59;
-#X text 117 308 Audio signals appear in adc~ objects in the sub-process. The sub-process doesn't open real audio devices., f 56;
-#X text 307 347 Creation args:, f 41;
-#X text 307 415 -fifo sets round-trip delay in blocks;
-#X text 307 431 -pddir sets Pd directory \, e.g. \,, f 41;
-#X text 342 447 .../Pd-0.42.app/Contents/Resources, f 36;
-#X text 307 463 -scheddir sets scheduler dir \, e.g. \,, f 41;
-#X text 342 479 .../.../Resources/extra/pd~, f 36;
-#X text 307 398 -sr sets sample rate, f 41;
-#X text 34 626 ATTENTION: DSP must be running in this process for the sub-process to run. This is because its clock is slaved to audio I/O it gets from us!, f 81;
-#X msg 390 548 \; pd dsp \$1;
-#X obj 4 43 cnv 1 620 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X text 542 12 <= click;
+#X text 383 424 Creation args:, f 41;
+#X text 383 492 -fifo sets round-trip delay in blocks;
+#X text 383 508 -pddir sets Pd directory \, e.g. \,, f 41;
+#X text 418 524 .../Pd-0.42.app/Contents/Resources, f 36;
+#X text 383 540 -scheddir sets scheduler dir \, e.g. \,, f 41;
+#X text 418 556 .../.../Resources/extra/pd~, f 36;
+#X text 383 475 -sr sets sample rate, f 41;
+#X msg 594 215 \; pd dsp \$1;
+#X obj 4 43 cnv 1 750 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 672 12 <= click;
#N canvas 555 116 719 472 reference 0;
#X obj 6 35 cnv 5 700 5 empty empty INLETS: 8 18 0 13 #202020 #000000 0;
#X obj 6 209 cnv 2 700 2 empty empty OUTLETS: 8 12 0 13 #202020 #000000 0;
@@ -41,51 +35,56 @@
#X text 60 73 pd~ start -;
#X text 221 73 start a new sub-process. This message takes startup flags and needs a pd file to open., f 67;
#X text 144 105 pd~ stop - stops the pd sub-process., f 78;
-#X text 158 153 signal - signal input if there's a corresponding adc~ input., f 76;
#X text 144 122 anything -;
#X text 221 122 messages besides "pd~" are sent to corresponding objects in the sub-process with the same name as the first element in the message., f 67;
#X obj 6 180 cnv 1 700 1 empty empty n: 8 12 0 13 #9f9f9f #000000 0;
-#X text 158 186 signal - signal input if there's a corresponding adc~ input., f 76;
-#X text 158 270 signal - signal output if there's a corresponding dac~ output., f 63;
#X text 94 216 total number of 'n' signal outlets is given as a creation argument., f 69;
#X text 94 44 total number of 'n' signal inlets is given as a creation argument., f 67;
-#X text 143 241 anything - messages from the sub-process sent via "stdout" objects., f 67;
#X text 102 383 -fifo : sets number of blocks for round-trip (default 5)., f 74;
#X text 102 365 -sr : sets sample rate of subprocess (default pd's current)., f 74;
#X text 102 401 -pddir : sets Pd's directory (needed if different than default)., f 74;
#X text 102 419 -scheddir : sets scheduler's directory (also needed if different)., f 74;
#X text 77 5 - run a pd sub-process (for multiprocessing).;
-#X restore 448 13 pd reference;
-#X obj 4 667 cnv 1 620 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X text 40 677 see also:;
-#X obj 116 678 stdout;
-#X text 307 364 -ninsig sets input audio channels, f 41;
-#X text 307 381 -noutsig sets output channels, f 41;
-#X text 223 194 Sending a new "start" message will stop the sub-process (if there's one) and start a new process by opening a patch. The "stop" message only stops the sub-process., f 55;
-#X text 13 112 Messages with "pd~" selector control the sub-process. "pd~ start" takes as arguments any startup flags you wish to send the sub-process. For example \, specify "-nogui" to stop the sub-process's GUI from appearing. You don't have to specify the number of channels in and out \, since that's set by creation arguments below. Audio config arguments arguments (-audiobuf \, -audiodev \, etc.) are ignored., f 85;
-#X obj 263 391 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 13 51 The [pd~] object starts and manages a Pd sub-process that can communicate with the super-process (this one) via audio channels and/or Pd messages. In this way you can take advantage of multi-core CPUs \, and/or use Pd features from within Max (if you're using the Max version of [pd~])., f 85;
-#X obj 63 426 pd~ -ninsig 2 -noutsig 2 -fifo 20, f 24;
-#X text 34 590 The first outlet reports messages the sub-process sends us via "stdout" objects. Any other outlets are signals corresponding to [dac~] objects in the sub-process., f 81;
-#X obj 197 390 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 409 676 Updated for Pd version 0.42;
+#X text 158 153 signal - signal input if there's a corresponding [adc~] input., f 76;
+#X text 158 186 signal - signal input if there's a corresponding [adc~] input., f 76;
+#X text 143 241 anything - messages from the sub-process sent via [stdout] objects., f 67;
+#X text 158 270 signal - signal output if there's a corresponding [dac~] output., f 64;
+#X restore 578 13 pd reference;
+#X text 39 657 see also:;
+#X obj 115 658 stdout;
+#X text 383 441 -ninsig sets input audio channels, f 41;
+#X text 383 458 -noutsig sets output channels, f 41;
+#X obj 292 468 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 17 53 The [pd~] object starts and manages a Pd sub-process that can communicate with the super-process (this one) via audio channels and/or Pd messages. In this way you can take advantage of multi-core CPUs \, and/or use Pd features from within Max (if you're using the Max version of [pd~])., f 99;
+#X obj 92 500 pd~ -ninsig 2 -noutsig 2 -fifo 20, f 24;
+#X obj 226 467 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 548 656 Updated for Pd version 0.42;
#X text 72 12 - run a pd sub-process (for multiprocessing);
-#X text 422 516 DSP on/off;
-#X obj 390 514 ../../doc/5.reference/set-dsp-tgl;
-#X connect 0 0 37 0;
-#X connect 1 0 9 0;
-#X connect 1 0 10 0;
-#X connect 2 0 5 0;
-#X connect 4 0 37 0;
-#X connect 5 0 3 0;
-#X connect 6 0 8 0;
-#X connect 8 0 7 0;
-#X connect 9 0 37 0;
-#X connect 10 0 37 1;
-#X connect 12 0 37 0;
-#X connect 35 0 10 1;
-#X connect 37 0 11 0;
-#X connect 37 1 2 0;
-#X connect 37 2 6 0;
-#X connect 39 0 9 1;
-#X connect 43 0 24 0;
+#X text 626 183 DSP on/off;
+#X obj 594 181 ../../doc/5.reference/set-dsp-tgl;
+#X msg 141 304 pd~ start -nogui pd~-subprocess.pd;
+#X msg 41 270 pd~ start pd~-subprocess.pd;
+#X text 17 104 Messages with the "pd~" selector control the sub-process. "pd~ start" takes a pd file name to open and it can be preceeded by any startup flags you wish to send the sub-process. For example \, specify "-nogui" to stop the sub-process's GUI from appearing. You don't have to specify the number of channels in and out \, since that's set by creation arguments below. Audio config arguments arguments (-audiobuf \, -audiodev \, etc.) are ignored., f 99;
+#X text 251 262 Sending a new "start" message stops the sub-process (if there's one) and starts a new one. The "stop" message only stops the sub-process., f 68;
+#X text 390 303 (re)starts without the GUI;
+#X obj 3 647 cnv 1 750 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 337 585 The first outlet reports messages the sub-process sends us via [stdout] objects. Any other outlets are signals corresponding to [dac~] objects in the sub-process., f 55;
+#X text 260 332 Any message besides "pd~" is sent to the sub-process. For instance \, the message below sends "bar baz" to any object in the sub-process named "foo" \, such as a [receive] object., f 62;
+#X text 176 383 Audio signals appear in [adc~] objects in the sub-process. Note that [pd~] cannot The sub-process doesn't open real audio devices., f 74;
+#X text 60 193 ATTENTION: DSP must be running in this process for the sub-process to start and run. This is because its clock is slaved to audio I/O it gets from us!, f 71;
+#X connect 0 0 28 0;
+#X connect 1 0 7 0;
+#X connect 1 0 8 0;
+#X connect 2 0 3 0;
+#X connect 4 0 28 0;
+#X connect 5 0 6 0;
+#X connect 7 0 28 0;
+#X connect 8 0 28 1;
+#X connect 26 0 8 1;
+#X connect 28 0 9 0;
+#X connect 28 1 2 0;
+#X connect 28 2 5 0;
+#X connect 29 0 7 1;
+#X connect 33 0 18 0;
+#X connect 34 0 28 0;
+#X connect 35 0 28 0;
diff --git a/extra/pd~/pd~-subprocess.pd b/extra/pd~/pd~-subprocess.pd
index 8ce714bd7..bed7fed82 100644
--- a/extra/pd~/pd~-subprocess.pd
+++ b/extra/pd~/pd~-subprocess.pd
@@ -1,47 +1,45 @@
-#N canvas 566 38 587 595 12;
-#X obj 85 409 r foo;
-#X obj 85 437 print foo;
-#X obj 227 450 stdout;
-#X msg 211 367 a b c;
-#X obj 109 203 env~ 8192;
-#X floatatom 109 252 5 0 0 0 - - - 0;
-#X obj 109 228 i;
-#X obj 284 187 osc~ 440;
-#X obj 284 221 *~;
-#X obj 358 188 osc~ 440;
-#X obj 358 222 *~;
-#X msg 237 419 bang;
-#X obj 366 368 loadbang;
-#X obj 183 203 env~ 8192;
-#X floatatom 183 252 5 0 0 0 - - - 0;
-#X obj 183 228 i;
-#X msg 227 391 4;
-#X text 62 500 We turn DSP on at load for convenience - control objects in this patch will still work without it (unlike in the super-process \, where DSP must be on for time to move forward in the sub-process.);
-#X obj 333 256 dac~;
-#X obj 151 172 adc~, f 5;
-#X msg 366 421 \; pd dsp \$1;
-#X text 389 396 DSP on/off;
-#X obj 319 222 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 45 20 This is a test patch to demonstrate the [pd~] object. It's intended as the patch to run in the sub-process. The sub-process (which is a separate instance of Pd) can be called from a Max or Pd super-process., f 70;
-#X text 46 75 Audio inlets and outlets on the Pd~ object (in the super-process) talk to [adc~] and [dac~] objects here - so \, for instance \, the first [adc~] here is the first inlet of the pd~ object \, and the first channel of [dac~] goes to the second outlet of [pd~] (because the first one is for messages \, as shown further below.), f 70;
-#X text 41 293 Any message sent to a stdout object in this sub-process (below) appears on the first message outlet of the [pd~] object in the super-process. The super-process can send messages to any [receive] object in this sub-process., f 71;
-#X obj 393 223 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X obj 366 395 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X connect 0 0 1 0;
-#X connect 3 0 2 0;
-#X connect 4 0 6 0;
-#X connect 6 0 5 0;
-#X connect 7 0 8 0;
-#X connect 8 0 18 0;
-#X connect 9 0 10 0;
-#X connect 10 0 18 1;
-#X connect 11 0 2 0;
-#X connect 12 0 27 0;
-#X connect 13 0 15 0;
-#X connect 15 0 14 0;
-#X connect 16 0 2 0;
-#X connect 19 0 4 0;
-#X connect 19 1 13 0;
-#X connect 22 0 8 1;
-#X connect 26 0 10 1;
-#X connect 27 0 20 0;
+#N canvas 566 38 629 615 12;
+#X obj 89 457 print foo;
+#X obj 314 479 stdout;
+#X msg 314 410 a b c;
+#X obj 127 228 env~ 8192;
+#X floatatom 127 267 8 0 0 0 - - - 0;
+#X obj 350 162 osc~ 440;
+#X msg 261 415 bang;
+#X obj 442 401 loadbang;
+#X obj 201 228 env~ 8192;
+#X floatatom 201 267 8 0 0 0 - - - 0;
+#X msg 330 447 4;
+#X obj 350 278 dac~;
+#X obj 169 187 adc~, f 5;
+#X msg 442 462 \; pd dsp \$1;
+#X text 465 433 DSP on/off;
+#X obj 393 209 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 36 17 This is a test patch to demonstrate the [pd~] object. It's intended as the patch to run in the sub-process. The sub-process (which is a separate instance of Pd) can be called from a Max or Pd super-process., f 78;
+#X obj 419 209 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X obj 442 432 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X obj 419 174 loadbang;
+#X obj 350 243 *~;
+#X obj 384 244 *~;
+#X text 36 73 Audio inlets and outlets on the [pd~] object (in the super-process) talk to [adc~] and [dac~] objects here - so \, for instance \, the left [adc~] output here corresponds to the first inlet of the [pd~] object \, and the first channel of [dac~] goes to the second outlet of [pd~] (because the first one is for messages \, as shown further below.), f 78;
+#X obj 89 427 receive foo;
+#X text 26 319 Any message sent to a [stdout] object in this sub-process (below) appears on the first message outlet of the [pd~] object in the super-process. The super-process can send messages to any named objects such as the [receive] object named as 'foo' in this sub-process below ., f 82;
+#X text 34 528 DSP must be on here and in the super-process in order for audio to run. Control objects in this patch will still work with DSP off in the sub-process \, but even so the DSP must still be on in the super-process for time to move forward in the sub-process., f 79;
+#X connect 2 0 1 0;
+#X connect 3 0 4 0;
+#X connect 5 0 20 0;
+#X connect 5 0 21 0;
+#X connect 6 0 1 0;
+#X connect 7 0 18 0;
+#X connect 8 0 9 0;
+#X connect 10 0 1 0;
+#X connect 12 0 3 0;
+#X connect 12 1 8 0;
+#X connect 15 0 20 1;
+#X connect 17 0 21 1;
+#X connect 18 0 13 0;
+#X connect 19 0 17 0;
+#X connect 19 0 15 0;
+#X connect 20 0 11 0;
+#X connect 21 0 11 1;
+#X connect 23 0 0 0;
From 7e4cab47c2fbf102a8fb0cbfeed28b067772ac4f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Tue, 7 Nov 2023 16:43:14 +0100
Subject: [PATCH 028/450] Update translatable-strings (fixing typo)
"non-existant" -> "non-existent"
---
po/az.po | 4 ++--
po/bg.po | 4 ++--
po/de.po | 8 ++++----
po/el.po | 4 ++--
po/en.po | 8 ++++----
po/en_ca.po | 8 ++++----
po/es.po | 8 ++++----
po/eu.po | 4 ++--
po/fr.po | 8 ++++----
po/gu.po | 4 ++--
po/he.po | 9 +++++----
po/hi.po | 4 ++--
po/hu.po | 4 ++--
po/id.po | 4 ++--
po/it.po | 8 ++++----
po/ja.po | 4 ++--
po/ko.po | 4 ++--
po/nl.po | 4 ++--
po/pa.po | 4 ++--
po/pl.po | 4 ++--
po/pt_br.po | 8 ++++----
po/pt_pt.po | 4 ++--
po/ru.po | 4 ++--
po/sq.po | 4 ++--
po/sv.po | 4 ++--
po/template.pot | 6 +++---
po/uk.po | 4 ++--
po/vi.po | 4 ++--
po/zh_tw.po | 4 ++--
29 files changed, 76 insertions(+), 75 deletions(-)
diff --git a/po/az.po b/po/az.po
index 0aa90ffb4..348392b9a 100644
--- a/po/az.po
+++ b/po/az.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Pure Data 0.43\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
-"POT-Creation-Date: 2023-06-26 22:30+0200\n"
+"POT-Creation-Date: 2023-11-07 16:37+0100\n"
"PO-Revision-Date: 2004-03-12 22:22+0200\n"
"Last-Translator: Metin Amiroff \n"
"Language-Team: Azerbaijani \n"
@@ -1132,7 +1132,7 @@ msgstr ""
msgid "Cancelling download of '%s': No installation directory given."
msgstr ""
-msgid "Installing to non-existant directory failed"
+msgid "Installing to non-existent directory failed"
msgstr ""
#, tcl-format
diff --git a/po/bg.po b/po/bg.po
index ef3b35c3d..821776166 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Pure Data 0.43\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
-"POT-Creation-Date: 2023-06-26 22:30+0200\n"
+"POT-Creation-Date: 2023-11-07 16:37+0100\n"
"PO-Revision-Date: 2022-10-30 07:04+0000\n"
"Last-Translator: Max Neupert \n"
"Language-Team: Bulgarian \n"
-"Language-Team: German \n"
+"Language-Team: German \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1098,7 +1098,7 @@ msgid "Cancelling download of '%s': No installation directory given."
msgstr ""
"Abbruch des Downloads von '%s': Kein Installationsverzeichnis angegeben."
-msgid "Installing to non-existant directory failed"
+msgid "Installing to non-existent directory failed"
msgstr "Die Installation in ein nicht-existierendes Verzeichnis schlug fehl"
#, tcl-format
diff --git a/po/el.po b/po/el.po
index accfb9416..4948a7a75 100644
--- a/po/el.po
+++ b/po/el.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Pure Data 0.43\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
-"POT-Creation-Date: 2023-06-26 22:30+0200\n"
+"POT-Creation-Date: 2023-11-07 16:37+0100\n"
"PO-Revision-Date: 2009-09-13 01:51+0200\n"
"Last-Translator: Γεώργιος Κερατζάκης \n"
"Language-Team: Greek \n"
-"Language-Team: English \n"
+"Language-Team: English \n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1074,7 +1074,7 @@ msgstr "Install %1$s to %2$s?"
msgid "Cancelling download of '%s': No installation directory given."
msgstr "Cancelling download of '%s': No installation directory given."
-msgid "Installing to non-existant directory failed"
+msgid "Installing to non-existent directory failed"
msgstr "Installing to non-existant directory failed"
#, tcl-format
diff --git a/po/en_ca.po b/po/en_ca.po
index 270a28a24..d225e5980 100644
--- a/po/en_ca.po
+++ b/po/en_ca.po
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: Pure Data 0.43\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
-"POT-Creation-Date: 2023-06-26 22:30+0200\n"
+"POT-Creation-Date: 2023-11-07 16:37+0100\n"
"PO-Revision-Date: 2023-06-27 06:05+0000\n"
"Last-Translator: umläute \n"
-"Language-Team: English (Canada) \n"
+"Language-Team: English (Canada) \n"
"Language: en_ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1075,7 +1075,7 @@ msgstr "Install %1$s to %2$s?"
msgid "Cancelling download of '%s': No installation directory given."
msgstr "Cancelling download of '%s': No installation directory given."
-msgid "Installing to non-existant directory failed"
+msgid "Installing to non-existent directory failed"
msgstr "Installing to non-existent directory failed"
#, tcl-format
diff --git a/po/es.po b/po/es.po
index a51574dd3..413f1d40a 100644
--- a/po/es.po
+++ b/po/es.po
@@ -12,11 +12,11 @@ msgid ""
msgstr ""
"Project-Id-Version: Pure Data 0.53.0\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
-"POT-Creation-Date: 2023-06-26 22:30+0200\n"
+"POT-Creation-Date: 2023-11-07 16:37+0100\n"
"PO-Revision-Date: 2023-06-28 06:21+0000\n"
"Last-Translator: gallegonovato \n"
-"Language-Team: Spanish \n"
+"Language-Team: Spanish \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1095,7 +1095,7 @@ msgid "Cancelling download of '%s': No installation directory given."
msgstr ""
"Cancelando la descarga de %s: No fue dado el directorio de instalación ."
-msgid "Installing to non-existant directory failed"
+msgid "Installing to non-existent directory failed"
msgstr "Falló la installación al directorio no existente"
#, tcl-format
diff --git a/po/eu.po b/po/eu.po
index 65fd32601..149408002 100644
--- a/po/eu.po
+++ b/po/eu.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Pure Data 0.43\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
-"POT-Creation-Date: 2023-06-26 22:30+0200\n"
+"POT-Creation-Date: 2023-11-07 16:37+0100\n"
"PO-Revision-Date: 2022-10-30 07:04+0000\n"
"Last-Translator: Max Neupert \n"
"Language-Team: Basque \n"
-"Language-Team: French \n"
+"Language-Team: French \n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1104,7 +1104,7 @@ msgstr ""
"Annulation du téléchargement de '%s' : aucun répertoire d'installation n'a "
"été indiqué."
-msgid "Installing to non-existant directory failed"
+msgid "Installing to non-existent directory failed"
msgstr "L'installation a échoué : le répertoire n'existe pas"
#, tcl-format
diff --git a/po/gu.po b/po/gu.po
index c180ad5dc..43971fa82 100644
--- a/po/gu.po
+++ b/po/gu.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Pure Data-0.43\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
-"POT-Creation-Date: 2023-06-26 22:30+0200\n"
+"POT-Creation-Date: 2023-11-07 16:37+0100\n"
"PO-Revision-Date: 2005-09-14 12:49+0530\n"
"Last-Translator: Ankit Patel \n"
"Language-Team: Gujarati \n"
-"Language-Team: Hebrew \n"
+"Language-Team: Hebrew \n"
"Language: he\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1074,7 +1074,8 @@ msgstr "להתקין את %1$s אל %2$s?"
msgid "Cancelling download of '%s': No installation directory given."
msgstr "ההורדה של ‚%s’ מבוטלת: לא סופקה תיקיית התקנה."
-msgid "Installing to non-existant directory failed"
+#, fuzzy
+msgid "Installing to non-existent directory failed"
msgstr "התקנה לתיקייה שאינה קיימת נכשלה"
#, tcl-format
diff --git a/po/hi.po b/po/hi.po
index a984fceda..4d426746a 100644
--- a/po/hi.po
+++ b/po/hi.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Pure Data 0.43\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
-"POT-Creation-Date: 2023-06-26 22:30+0200\n"
+"POT-Creation-Date: 2023-11-07 16:37+0100\n"
"PO-Revision-Date: 2005-05-04 12:50+0530\n"
"Last-Translator: Rajesh Ranjan \n"
"Language-Team: Hindi \n"
"Language-Team: Hungarian \n"
"Language-Team: Indonesian \n"
-"Language-Team: Italian \n"
+"Language-Team: Italian \n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1095,7 +1095,7 @@ msgstr ""
"Cancellazione del download di '%s': Nessuna cartella di installazione "
"fornita."
-msgid "Installing to non-existant directory failed"
+msgid "Installing to non-existent directory failed"
msgstr "Installazione su una cartella non esistente fallita"
#, tcl-format
diff --git a/po/ja.po b/po/ja.po
index 7733f1488..872c198f1 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Pure Data 0.53.0\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
-"POT-Creation-Date: 2023-06-26 22:30+0200\n"
+"POT-Creation-Date: 2023-11-07 16:37+0100\n"
"PO-Revision-Date: 2023-02-13 12:36+0000\n"
"Last-Translator: umläute \n"
"Language-Team: Japanese \n"
"Language-Team: Korean \n"
"Language-Team: Dutch \n"
"Language-Team: Punjabi \n"
"Language-Team: Polish \n"
-"Language-Team: Portuguese (Brazil) \n"
+"Language-Team: Portuguese (Brazil) \n"
"Language: pt_br\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1081,7 +1081,7 @@ msgstr "Instalar %1$s em %2$s?"
msgid "Cancelling download of '%s': No installation directory given."
msgstr "Cancelando download de '%s': Nenhum diretório de instalação fornecido."
-msgid "Installing to non-existant directory failed"
+msgid "Installing to non-existent directory failed"
msgstr "Falha ao instalar em um diretório não existente"
#, tcl-format
diff --git a/po/pt_pt.po b/po/pt_pt.po
index 68be419a0..5947f44e0 100644
--- a/po/pt_pt.po
+++ b/po/pt_pt.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Pure Data 0.43\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
-"POT-Creation-Date: 2023-06-26 22:30+0200\n"
+"POT-Creation-Date: 2023-11-07 16:37+0100\n"
"PO-Revision-Date: 2023-02-13 12:36+0000\n"
"Last-Translator: umläute \n"
"Language-Team: Portuguese (Portugal) \n"
"Language-Team: Russian \n"
"Language-Team: Albanian \n"
"Language-Team: Swedish \n"
"Language-Team: LANGUAGE \n"
@@ -1068,7 +1068,7 @@ msgstr ""
msgid "Cancelling download of '%s': No installation directory given."
msgstr ""
-msgid "Installing to non-existant directory failed"
+msgid "Installing to non-existent directory failed"
msgstr ""
#, tcl-format
diff --git a/po/uk.po b/po/uk.po
index e955de69d..c58295453 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Pure Data 0.53.0\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
-"POT-Creation-Date: 2023-06-26 22:30+0200\n"
+"POT-Creation-Date: 2023-11-07 16:37+0100\n"
"PO-Revision-Date: 2023-02-13 12:36+0000\n"
"Last-Translator: umläute \n"
"Language-Team: Ukrainian \n"
"Language-Team: Vietnamese \n"
"Language-Team: Chinese (Traditional)
Date: Wed, 15 Nov 2023 01:52:07 -0300
Subject: [PATCH 029/450] document that pd~ doesn't handle MIDI objects
---
extra/pd~/pd~-help.pd | 121 ++++++++++++++++++++----------------
extra/pd~/pd~-subprocess.pd | 20 +++---
2 files changed, 76 insertions(+), 65 deletions(-)
diff --git a/extra/pd~/pd~-help.pd b/extra/pd~/pd~-help.pd
index a5cee31a9..f03b9da08 100644
--- a/extra/pd~/pd~-help.pd
+++ b/extra/pd~/pd~-help.pd
@@ -1,23 +1,21 @@
-#N canvas 312 23 761 691 12;
-#X msg 160 344 foo bar baz;
-#X obj 257 431 osc~ 440;
-#X obj 174 562 env~ 8192;
-#X floatatom 174 601 8 0 0 0 - - - 0;
-#X msg 68 304 pd~ stop;
-#X obj 257 563 env~ 8192;
-#X floatatom 257 601 8 0 0 0 - - - 0;
-#X obj 191 466 *~;
-#X obj 257 467 *~;
-#X obj 92 591 print x;
+#N canvas 368 23 760 715 12;
+#X msg 107 368 foo bar baz;
+#X obj 257 461 osc~ 440;
+#X obj 174 592 env~ 8192;
+#X floatatom 174 631 8 0 0 0 - - - 0;
+#X msg 93 333 pd~ stop;
+#X obj 257 592 env~ 8192;
+#X floatatom 257 631 8 0 0 0 - - - 0;
+#X obj 191 496 *~;
+#X obj 257 496 *~;
#X obj 37 13 pd~;
-#X text 383 424 Creation args:, f 41;
-#X text 383 492 -fifo sets round-trip delay in blocks;
-#X text 383 508 -pddir sets Pd directory \, e.g. \,, f 41;
-#X text 418 524 .../Pd-0.42.app/Contents/Resources, f 36;
-#X text 383 540 -scheddir sets scheduler dir \, e.g. \,, f 41;
-#X text 418 556 .../.../Resources/extra/pd~, f 36;
-#X text 383 475 -sr sets sample rate, f 41;
-#X msg 594 215 \; pd dsp \$1;
+#X text 383 454 Creation args:, f 41;
+#X text 383 522 -fifo sets round-trip delay in blocks;
+#X text 383 538 -pddir sets Pd directory \, e.g. \,, f 41;
+#X text 383 570 -scheddir sets scheduler dir \, e.g. \,, f 41;
+#X text 418 586 .../.../Resources/extra/pd~, f 36;
+#X text 383 505 -sr sets sample rate, f 41;
+#X msg 624 216 \; pd dsp \$1;
#X obj 4 43 cnv 1 750 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 672 12 <= click;
#N canvas 555 116 719 472 reference 0;
@@ -33,13 +31,10 @@
#X text 102 347 -noutsig : sets number of output audio channels (default 2)., f 74;
#X obj 6 67 cnv 1 700 1 empty empty 1st: 8 12 0 13 #9f9f9f #000000 0;
#X text 60 73 pd~ start -;
-#X text 221 73 start a new sub-process. This message takes startup flags and needs a pd file to open., f 67;
#X text 144 105 pd~ stop - stops the pd sub-process., f 78;
#X text 144 122 anything -;
#X text 221 122 messages besides "pd~" are sent to corresponding objects in the sub-process with the same name as the first element in the message., f 67;
#X obj 6 180 cnv 1 700 1 empty empty n: 8 12 0 13 #9f9f9f #000000 0;
-#X text 94 216 total number of 'n' signal outlets is given as a creation argument., f 69;
-#X text 94 44 total number of 'n' signal inlets is given as a creation argument., f 67;
#X text 102 383 -fifo : sets number of blocks for round-trip (default 5)., f 74;
#X text 102 365 -sr : sets sample rate of subprocess (default pd's current)., f 74;
#X text 102 401 -pddir : sets Pd's directory (needed if different than default)., f 74;
@@ -49,42 +44,58 @@
#X text 158 186 signal - signal input if there's a corresponding [adc~] input., f 76;
#X text 143 241 anything - messages from the sub-process sent via [stdout] objects., f 67;
#X text 158 270 signal - signal output if there's a corresponding [dac~] output., f 64;
+#X text 221 73 start a new sub-process. This message takes startup flags and needs a pd file to open., f 67;
+#X text 94 44 total number of 'n' signal inlets as given by the -ninsig flag., f 67;
+#X text 94 216 total number of 'n' signal outlets as given by the -noutsig flag., f 69;
#X restore 578 13 pd reference;
-#X text 39 657 see also:;
-#X obj 115 658 stdout;
-#X text 383 441 -ninsig sets input audio channels, f 41;
-#X text 383 458 -noutsig sets output channels, f 41;
-#X obj 292 468 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 17 53 The [pd~] object starts and manages a Pd sub-process that can communicate with the super-process (this one) via audio channels and/or Pd messages. In this way you can take advantage of multi-core CPUs \, and/or use Pd features from within Max (if you're using the Max version of [pd~])., f 99;
-#X obj 92 500 pd~ -ninsig 2 -noutsig 2 -fifo 20, f 24;
-#X obj 226 467 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 548 656 Updated for Pd version 0.42;
+#X text 29 687 see also:;
+#X obj 105 688 stdout;
+#X text 383 471 -ninsig sets input audio channels, f 41;
+#X text 383 488 -noutsig sets output channels, f 41;
+#X obj 292 496 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 27 53 The [pd~] object starts and manages a Pd sub-process that can communicate with the super-process (this one) via audio channels and/or Pd messages. In this way you can take advantage of multi-core CPUs \, and/or use Pd features from within Max (if you're using the Max version of [pd~])., f 100;
+#X obj 92 532 pd~ -ninsig 2 -noutsig 2 -fifo 20, f 24;
+#X obj 226 496 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 543 686 Updated for Pd version 0.42;
#X text 72 12 - run a pd sub-process (for multiprocessing);
-#X text 626 183 DSP on/off;
-#X obj 594 181 ../../doc/5.reference/set-dsp-tgl;
-#X msg 141 304 pd~ start -nogui pd~-subprocess.pd;
-#X msg 41 270 pd~ start pd~-subprocess.pd;
-#X text 17 104 Messages with the "pd~" selector control the sub-process. "pd~ start" takes a pd file name to open and it can be preceeded by any startup flags you wish to send the sub-process. For example \, specify "-nogui" to stop the sub-process's GUI from appearing. You don't have to specify the number of channels in and out \, since that's set by creation arguments below. Audio config arguments arguments (-audiobuf \, -audiodev \, etc.) are ignored., f 99;
-#X text 251 262 Sending a new "start" message stops the sub-process (if there's one) and starts a new one. The "stop" message only stops the sub-process., f 68;
-#X text 390 303 (re)starts without the GUI;
-#X obj 3 647 cnv 1 750 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X text 337 585 The first outlet reports messages the sub-process sends us via [stdout] objects. Any other outlets are signals corresponding to [dac~] objects in the sub-process., f 55;
-#X text 260 332 Any message besides "pd~" is sent to the sub-process. For instance \, the message below sends "bar baz" to any object in the sub-process named "foo" \, such as a [receive] object., f 62;
-#X text 176 383 Audio signals appear in [adc~] objects in the sub-process. Note that [pd~] cannot The sub-process doesn't open real audio devices., f 74;
-#X text 60 193 ATTENTION: DSP must be running in this process for the sub-process to start and run. This is because its clock is slaved to audio I/O it gets from us!, f 71;
-#X connect 0 0 28 0;
+#X text 655 186 DSP on/off;
+#X obj 624 182 ../../doc/5.reference/set-dsp-tgl;
+#X msg 66 303 pd~ start -nogui pd~-subprocess.pd;
+#X msg 31 267 pd~ start pd~-subprocess.pd;
+#X text 317 304 (re)starts without the GUI;
+#X obj 3 677 cnv 1 750 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 347 613 The first outlet reports messages the sub-process sends us via [stdout] objects. Any other outlets are signals corresponding to [dac~] objects in the sub-process., f 55;
+#X text 418 554 .../Pd-0.54-0.app/Contents/Resources;
+#X text 240 261 Sending a new "start" message stops the sub-process (if there's one) and starts a new one., f 52;
+#X obj 92 611 print pd~;
+#X msg 123 454 toggle \$1;
+#X obj 123 417 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
+#X text 200 357 Message besides "pd~" are sent to named objects (such as [receive]) in the sub-process. So "bar baz" is sent to any object named "foo" and an object named "toggle" gets the float to turn the audio output via a [dac~] object., f 77;
+#X text 291 413 Audio input signals appear in [adc~] objects in the sub-process. The sub-process doesn't open real audio devices., f 64;
+#X text 163 333 Stop the sub-process;
+#X text 148 411 Turn audio output on/off, f 13;
+#X text 38 187 ATTENTION: DSP must be running in this process for the sub-process to start and run. This is because its clock is slaved to audio I/O it gets from us! Also note that MIDI objects don't work in a sub-process \, so MIDI messages need to be sent in and out via regular messages., f 80;
+#X text 27 104 Messages with the "pd~" selector control the sub-process. A "pd~ start" message takes a pd file name to open and can take startup flags before the file name. For example \, "-nogui" prevents the sub-process's GUI from appearing. Note that you don't have to specify the number of channels in and out \, since that's set by creation arguments. Aslo \, audio config flags (-audiobuf \, -audiodev \, etc.) are ignored., f 100;
+#X text 270 439 v;
+#X text 270 429 |;
+#X text 270 420 |;
+#X text 274 409 _;
+#X text 280 409 _;
+#X connect 0 0 26 0;
#X connect 1 0 7 0;
#X connect 1 0 8 0;
#X connect 2 0 3 0;
-#X connect 4 0 28 0;
+#X connect 4 0 26 0;
#X connect 5 0 6 0;
-#X connect 7 0 28 0;
-#X connect 8 0 28 1;
-#X connect 26 0 8 1;
-#X connect 28 0 9 0;
-#X connect 28 1 2 0;
-#X connect 28 2 5 0;
-#X connect 29 0 7 1;
-#X connect 33 0 18 0;
-#X connect 34 0 28 0;
-#X connect 35 0 28 0;
+#X connect 7 0 26 0;
+#X connect 8 0 26 1;
+#X connect 24 0 8 1;
+#X connect 26 0 39 0;
+#X connect 26 1 2 0;
+#X connect 26 2 5 0;
+#X connect 27 0 7 1;
+#X connect 31 0 16 0;
+#X connect 32 0 26 0;
+#X connect 33 0 26 0;
+#X connect 40 0 26 0;
+#X connect 41 0 40 0;
diff --git a/extra/pd~/pd~-subprocess.pd b/extra/pd~/pd~-subprocess.pd
index bed7fed82..1683cb21d 100644
--- a/extra/pd~/pd~-subprocess.pd
+++ b/extra/pd~/pd~-subprocess.pd
@@ -1,4 +1,4 @@
-#N canvas 566 38 629 615 12;
+#N canvas 416 56 629 615 12;
#X obj 89 457 print foo;
#X obj 314 479 stdout;
#X msg 314 410 a b c;
@@ -18,28 +18,28 @@
#X text 36 17 This is a test patch to demonstrate the [pd~] object. It's intended as the patch to run in the sub-process. The sub-process (which is a separate instance of Pd) can be called from a Max or Pd super-process., f 78;
#X obj 419 209 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
#X obj 442 432 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X obj 419 174 loadbang;
#X obj 350 243 *~;
#X obj 384 244 *~;
#X text 36 73 Audio inlets and outlets on the [pd~] object (in the super-process) talk to [adc~] and [dac~] objects here - so \, for instance \, the left [adc~] output here corresponds to the first inlet of the [pd~] object \, and the first channel of [dac~] goes to the second outlet of [pd~] (because the first one is for messages \, as shown further below.), f 78;
#X obj 89 427 receive foo;
#X text 26 319 Any message sent to a [stdout] object in this sub-process (below) appears on the first message outlet of the [pd~] object in the super-process. The super-process can send messages to any named objects such as the [receive] object named as 'foo' in this sub-process below ., f 82;
#X text 34 528 DSP must be on here and in the super-process in order for audio to run. Control objects in this patch will still work with DSP off in the sub-process \, but even so the DSP must still be on in the super-process for time to move forward in the sub-process., f 79;
+#X obj 419 174 receive toggle;
#X connect 2 0 1 0;
#X connect 3 0 4 0;
+#X connect 5 0 19 0;
#X connect 5 0 20 0;
-#X connect 5 0 21 0;
#X connect 6 0 1 0;
#X connect 7 0 18 0;
#X connect 8 0 9 0;
#X connect 10 0 1 0;
#X connect 12 0 3 0;
#X connect 12 1 8 0;
-#X connect 15 0 20 1;
-#X connect 17 0 21 1;
+#X connect 15 0 19 1;
+#X connect 17 0 20 1;
#X connect 18 0 13 0;
-#X connect 19 0 17 0;
-#X connect 19 0 15 0;
-#X connect 20 0 11 0;
-#X connect 21 0 11 1;
-#X connect 23 0 0 0;
+#X connect 19 0 11 0;
+#X connect 20 0 11 1;
+#X connect 22 0 0 0;
+#X connect 25 0 17 0;
+#X connect 25 0 15 0;
From 32593622859d7258300e8f8879650d5c94e282b1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Mon, 20 Nov 2023 13:33:43 +0100
Subject: [PATCH 030/450] Update AppData metainfo
- add developer entry ("msp et al.")
- remove tags from description (all known renderers show them verbatim, which does not help)
- add bugracker/vcs/translate URLs
---
linux/org.puredata.pd-gui.metainfo.xml | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/linux/org.puredata.pd-gui.metainfo.xml b/linux/org.puredata.pd-gui.metainfo.xml
index 47c616ca4..e16a35962 100644
--- a/linux/org.puredata.pd-gui.metainfo.xml
+++ b/linux/org.puredata.pd-gui.metainfo.xml
@@ -2,6 +2,8 @@
org.puredata.pd-gui
Pure Data (Pd)
+ Miller S. Puckette et al.
+
A real-time graphical programming environment for live interactive computer music
FSFAP
@@ -12,7 +14,7 @@
Pure Data (or just "Pd") is an open source visual programming language for multimedia. Pure Data is developed by Miller Puckette since 1996 and you can find it on his official website along with the official documentation and other related resources. This is the official "Pd" or "main distribution" and it is also known as "Pd Vanilla".
- Think of Pd as a Modular Synthesizer that is also a programming language.
+ Think of Pd as a "Modular Synthesizer" that is also a programming language.
Pd's audio and MIDI functions are built-in as well as networking (e.g. using Open Sound Control), but there are a number of external libraries that allow you to do graphics, interface hardware and much more...
@@ -22,6 +24,9 @@
pd-gui
https://puredata.info/
+ https://bugs.puredata.info
+ https://github.com/pure-data/pure-data
+ https://hosted.weblate.org/projects/pure-data/pure-data/
org.puredata.pd-gui.desktop
From 4b3669ef25b6bb5124b0acdb0d8cc27b9dfb5872 Mon Sep 17 00:00:00 2001
From: Lucas Cordiviola
Date: Thu, 9 Nov 2023 18:11:41 -0300
Subject: [PATCH 031/450] NSIS: finer 'exact-match' search for running app
Filter tasklist so that 'whateverpd.exe' does not match in a search for 'pd.exe'.
Also provides a button to force installation if for whatever reason the detection gives a false-positive.
Closes: #2128
---
msw/pd.nsi | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/msw/pd.nsi b/msw/pd.nsi
index 2295bb7b3..f6dc4d219 100644
--- a/msw/pd.nsi
+++ b/msw/pd.nsi
@@ -1,7 +1,7 @@
;
;
; https://stackoverflow.com/questions/36185539/can-i-get-nsis-to-make-a-single-installer-that-handles-local-deployment-and-syst
-; ./build-nsi.sh -o "c:/tmp" G:/gitportable/nsis/pd-0.53.1 0.53.1
+; ./build-nsi.sh -o "c:/tmp" "G:/gitportable/nsis2/pd-0.54-1" 0.54-1xx
;####################################################
@@ -185,16 +185,18 @@ RequestExecutionLevel highest
; perhaps all this can be done with an nsis plugin but we just use nsis as it comes from package managers.
ReadEnvStr $0 COMSPEC
- nsExec::ExecToStack '"$0" /c tasklist | find /I "$PdProcess"'
+ nsExec::ExecToStack '"$0" /c tasklist | findstr /R /I /M /C:"\<$PdProcess\>"'
Pop $1
Pop $2
${If} $2 == ""
goto good
${Else}
IfSilent default
- HideWindow
- MessageBox MB_OK "Refusing to continue. Save your work and quit \
- any running ${PD_FOLDER} app before doing an (un)installation."
+ MessageBox MB_ICONEXCLAMATION|MB_YESNO "Refusing to continue. Save your work and quit \
+ any running ${PD_FOLDER} app before doing an (un)installation.$\r$\n$\r$\n\
+ We found the following app open:$\r$\n$\r$\n\
+ $2 $\r$\n$\r$\n\
+ Force installation anyway?" IDYES good IDNO default
default:
quit
${EndIf}
@@ -672,4 +674,4 @@ Section Uninstall
Call un.RefreshShellIcons
SetAutoClose true
${EndIf}
-SectionEnd
\ No newline at end of file
+SectionEnd
From 0f8f8a81b7eb83f01acaf4ea964e3e8ca331a1c2 Mon Sep 17 00:00:00 2001
From: Christof Ressi
Date: Sat, 18 Nov 2023 18:00:40 +0100
Subject: [PATCH 032/450] switch~: bash phase if reblocked and switched on
again
... to make sure we are in sync with inlet prolog and outlet epilog
---
src/d_ugen.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/src/d_ugen.c b/src/d_ugen.c
index 2751d2232..ee9e0e12f 100644
--- a/src/d_ugen.c
+++ b/src/d_ugen.c
@@ -255,7 +255,14 @@ static void *switch_new(t_floatarg fvecsize, t_floatarg foverlap,
static void block_float(t_block *x, t_floatarg f)
{
if (x->x_switched)
+ {
+ int wason = x->x_switchon;
x->x_switchon = (f != 0);
+ /* bash phase if switched on again to make sure
+ we are in sync with inlet prolog and outlet epilog! */
+ if (!wason && x->x_reblock)
+ x->x_phase = THIS->u_phase & (x->x_period - 1);
+ }
}
static void block_bang(t_block *x)
From 85d6418c7eb590332dfde72da6c55a1d988c0dbe Mon Sep 17 00:00:00 2001
From: Christof Ressi
Date: Sat, 18 Nov 2023 18:01:01 +0100
Subject: [PATCH 033/450] ugen_done_graph: remove unnused 'phase' variable
---
src/d_ugen.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/src/d_ugen.c b/src/d_ugen.c
index ee9e0e12f..143bad915 100644
--- a/src/d_ugen.c
+++ b/src/d_ugen.c
@@ -1063,7 +1063,7 @@ void ugen_done_graph(t_dspcontext *dc)
t_dspcontext *parent_context = dc->dc_parentcontext;
t_float parent_srate;
int parent_vecsize, parent_overlap;
- int period, frequency, phase, calcsize;
+ int period, frequency, calcsize;
t_float srate;
int chainblockbegin; /* DSP chain onset before block prolog code */
int chainblockend; /* and after block epilog code */
@@ -1131,7 +1131,6 @@ void ugen_done_graph(t_dspcontext *dc)
(parent_vecsize * realoverlap * upsample);
frequency = (parent_vecsize * realoverlap * upsample)/
(calcsize * downsample);
- phase = blk->x_phase;
srate = parent_srate * realoverlap * upsample / downsample;
if (period < 1) period = 1;
if (frequency < 1) frequency = 1;
@@ -1152,7 +1151,6 @@ void ugen_done_graph(t_dspcontext *dc)
calcsize = parent_vecsize;
downsample = upsample = 1;
period = frequency = 1;
- phase = 0;
if (!parent_context) reblock = 1;
switched = 0;
}
From 5b0e0a649bf5eebe41911fe01e2eac8bf35ada47 Mon Sep 17 00:00:00 2001
From: Christof Ressi
Date: Thu, 23 Nov 2023 13:20:38 +0100
Subject: [PATCH 034/450] make CLASS_MAINSIGNALIN type safe
With C11/C++11 we can statically assert the size of the 'field' argument.
Also, let's use 'offsetof', instead of the ugly NULL pointer cast hack, to get the member offset.
---
src/m_pd.h | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/src/m_pd.h b/src/m_pd.h
index c658fa555..93052c577 100644
--- a/src/m_pd.h
+++ b/src/m_pd.h
@@ -59,10 +59,17 @@ extern int pd_compatibilitylevel; /* e.g., 43 for pd 0.43 compatibility */
#define ATTRIBUTE_FORMAT_PRINTF(a, b)
#endif
-#if !defined(_SIZE_T) && !defined(_SIZE_T_)
-#include /* just for size_t -- how lame! */
+#if __STDC_VERSION__ >= 201112L
+#include
+#define STATIC_ASSERT _Static_assert
+#elif __cplusplus >= 201103L
+#define STATIC_ASSERT static_assert
+#else
+#define STATIC_ASSERT(condition, message) /* no-op */
#endif
+#include /* for size_t and offsetof */
+
/* Microsoft Visual Studio is not C99, but since VS2015 has included most C99 headers:
https://docs.microsoft.com/en-us/previous-versions/hh409293(v=vs.140)#c-runtime-library
These definitions recreate stdint.h types, but only in pre-2015 Visual Studio: */
@@ -526,7 +533,8 @@ EXTERN int class_isdrawcommand(const t_class *c);
EXTERN void class_set_extern_dir(t_symbol *s);
EXTERN void class_domainsignalin(t_class *c, int onset);
#define CLASS_MAINSIGNALIN(c, type, field) \
- class_domainsignalin(c, (char *)(&((type *)0)->field) - (char *)0)
+ STATIC_ASSERT(sizeof(((type *)NULL)->field) == sizeof(t_float), "field must be t_float!"); \
+ class_domainsignalin(c, offsetof(type, field))
/* prototype for functions to save Pd's to a binbuf */
typedef void (*t_savefn)(t_gobj *x, t_binbuf *b);
From 78bdcea2af3429f3074b59f9ce2595214e8b2191 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Mon, 27 Nov 2023 13:20:19 +0100
Subject: [PATCH 035/450] Import deken v0.9.16
- PowerShell implementation for a fast and API-stable SHA256 hash on Windows
- relax the sha256 check slightly (check whether the SHA256 as reported by
the .sha256 file is "contained" in the calculated hash (as opposed to
"equals") to work around interface quirks on Windows' "certUtil"
- unify sha256 error handling for download-installation and file-installation
- allow the user a one-time override of a sha256 failure
---
tcl/pd_deken.tcl | 220 +++++++++++++++++++++++++++++++++--------------
1 file changed, 155 insertions(+), 65 deletions(-)
diff --git a/tcl/pd_deken.tcl b/tcl/pd_deken.tcl
index 8cca138be..3ec25c512 100644
--- a/tcl/pd_deken.tcl
+++ b/tcl/pd_deken.tcl
@@ -103,7 +103,7 @@ proc ::deken::versioncheck {version} {
}
## put the current version of this package here:
-if { [::deken::versioncheck 0.9.14] } {
+if { [::deken::versioncheck 0.9.16] } {
namespace eval ::deken:: {
namespace export open_searchui
@@ -515,6 +515,34 @@ proc ::deken::utilities::sha256_shasum {filename} {
catch { set hash [lindex [exec shasum -a 256 $filename] 0] }
return $hash
}
+proc ::deken::utilities::sha256_powershell {filename} {
+ set batscript [::deken::utilities::get_tmpfilename [::deken::utilities::get_tmpdir] ".bat" ]
+ set script {
+@echo off
+powershell -Command " & {Get-FileHash -Algorithm SHA256 -LiteralPath \"%1\" | Select-Object -ExpandProperty Hash}"
+ }
+ if {![catch {set fileId [open $batscript "w"]}]} {
+ puts $fileId $script
+ close $fileId
+ }
+
+ if {![file exists $batscript]} {
+ ## still no script, give up
+ return ""
+ }
+
+ if { [ catch {
+ set hash [exec "${batscript}" "${filename}"]
+ } stdout ] } {
+ # ouch, couldn't run powershell script
+ ::deken::utilities::verbose 1 "sha256.ps1 error: $stdout"
+ set hash ""
+ }
+
+ catch { file delete "${batscript}" }
+
+ return $hash
+}
proc ::deken::utilities::sha256_msw {filename} {
set hash {}
catch { set hash [join [exec certUtil -hashfile $filename SHA256 | findstr /v "hash"] ""] }
@@ -532,11 +560,11 @@ proc ::deken::utilities::sha256_tcllib {filename} {
proc ::deken::utilities::verify_sha256 {url pkgfile} {
set msg [format [_ "Skipping SHA256 verification of '%s'." ] $url ]
::deken::statuspost $msg
- return 1
+ return -100
}
-foreach impl {sha256sum shasum msw tcllib} {
+foreach impl {sha256sum shasum powershell msw tcllib} {
if { [::deken::utilities::sha256_${impl} $::argv0] ne "" } {
set ::deken::utilities::sha256_implementation ::deken::utilities::sha256_${impl}
proc ::deken::utilities::verify_sha256 {url pkgfile} {
@@ -545,48 +573,77 @@ foreach impl {sha256sum shasum msw tcllib} {
set retval 1
set isremote 1
- if { [ catch {
- # check if $url really is a local file
- if { [file normalize $url] eq $url } {
- # $url is really an absolute filename
- # use it, if it exists
- set hashfile "${url}.sha256"
- set isremote 0
- if { [file isfile $url ] && [file readable $url] } { } else {
- set hashfile ""
- }
- } else {
- # otherwise fetch it from the internet
+ set hashfile ""
+
+ # check if $url really is a local file
+ if { [file normalize $url] eq $url } {
+ # $url is really an absolute filename
+ # use it, if it exists
+ set hashfile "${url}.sha256"
+ set isremote 0
+ if { [file isfile ${hashfile} ] && [file readable ${hashfile}] } { } else {
+ set msg [format [_ "Unable to fetch reference SHA256 for '%s'." ] $url ]
+ ::deken::utilities::verbose 0 $msg
+ ::deken::statuspost $msg warn 0
+ return -10
+ }
+ } else {
+ # otherwise fetch it from the internet
+ if { [ catch {
set hashfile [::deken::utilities::download_file ${url}.sha256 [::deken::utilities::get_tmpfilename [::deken::utilities::get_tmpdir] ".sha256" ] ]
+ } stdout ] } {
+ ::deken::utilities::verbose 0 "${stdout}"
+ # unable to download
+ set msg [format [_ "Unable to fetch reference SHA256 for '%s'." ] $url ]
+ ::deken::utilities::verbose 0 $msg
+ ::deken::statuspost $msg warn 0
+ return -10
+ }
+ }
+ if { "${hashfile}" eq "" } {
+ set retval -10
+ }
+
+ if { [ catch {
+ set fp [open $hashfile r]
+ set reference [string trim [string tolower [read $fp] ] ]
+ close $fp
+ if { $isremote } {
+ catch { file delete $hashfile }
}
- if { "$hashfile" eq "" } {
- ::deken::utilities::verbose 0 [format [_ "Unable to fetch reference SHA256 for '%s'." ] $url ]
+
+ # get hash of file
+ set hash [${::deken::utilities::sha256_implementation} $pkgfile ]
+ set hash [string trim [string tolower $hash ] ]
+ # check if hash is sane
+ if { [string length $hash] != 64 || ! [string is xdigit $hash] } {
+ ::deken::statuspost [format [_ "File checksum looks invalid: '%s'." ] $hash] warn 0
+ }
+ # check if reference is sane
+ if { [string length $reference] != 64 || ! [string is xdigit $reference] } {
+ # this is more grave than the sanity check for the file hash
+ # (since for the file hash we depend on the user's machine being able to
+ # produce a proper SHA256 hash)
+ ::deken::statuspost [format [_ "Reference checksum looks invalid: '%s'." ] $reference] error 0
+ }
+
+ if { [string first ${reference} ${hash}] >= 0 } {
set retval 1
} else {
- set fp [open $hashfile r]
- set reference [string trim [string tolower [read $fp] ] ]
- close $fp
- if { $isremote } {
- catch { file delete $hashfile }
- }
-
- set hash [string trim [string tolower [ ${::deken::utilities::sha256_implementation} $pkgfile ] ] ]
- if { "${hash}" eq "${reference}" } {
- set retval 1
- } else {
- # SHA256 verification failed...
- set retval 0
- }
+ # SHA256 verification failed...
+ set retval 0
}
} stdout ] } {
::deken::utilities::verbose 0 "${stdout}"
# unable to verify
- ::deken::utilities::verbose 0 [format [_ "Unable to perform SHA256 verification for '%s'." ] $url ]
- set retval 1
+ set msg [format [_ "Unable to perform SHA256 verification for '%s'." ] $url ]
+ ::deken::utilities::verbose 0 $msg
+ ::deken::statuspost $msg warn 0
+ set retval -20
}
return ${retval}
}
-# it seems we found a working sha256 implementation, don't try to other ones...
+# it seems we found a working sha256 implementation, don't try the other ones...
break
}
}
@@ -1231,6 +1288,52 @@ proc ::deken::versioncompare {a b} {
return 0
}
+proc ::deken::verify_sha256_gui {url pkgfile} {
+ ## verify that the SHA256 of the $pkgfile matches that from $url
+ ## in case of failure, this displays a dialog asking the user how to proceed
+ ## (if the preferences indicate we require checking)
+ ## returns
+ ## - 1 on success
+ ## - 0 on failure
+ ## - negative numbers indicate failures to be ignored
+ ## - one digit: user requested ignore
+ ## - -1 user requested ignore via prefs
+ ## - -2 user requested ignore via dialog
+ ## - two digits: unable to verify
+ ## - -10 reference could not be read
+ ## - -20 an exception occured while verifying
+ ## - three digits:
+ ## - -100 no sha256 verifier implemented
+ set err_msg [format [_ "SHA256 verification of '%s' failed!" ] $pkgfile ]
+ set err_title [_ "SHA256 verification failed" ]
+ set err_status [format [_ "Checksum mismatch for '%s'" ] $url]
+
+ while 1 {
+ set hash_ok [::deken::utilities::verify_sha256 ${url} ${pkgfile}]
+ if { ${hash_ok} } {
+ return ${hash_ok}
+ }
+ ::deken::statuspost $err_status warn 0
+ if { ! $::deken::verify_sha256 } {
+ return -1
+ }
+ set result [tk_messageBox \
+ -title ${err_title} \
+ -message ${err_msg} \
+ -icon error -type abortretryignore \
+ -parent $::deken::winid]
+ switch -- ${result} {
+ abort {
+ return 0
+ }
+ ignore {
+ return -2
+ }
+ }
+ }
+ return 0
+}
+
proc ::deken::install_package_from_file {{pkgfile ""}} {
set types {}
lappend types [list [_ "Deken Packages" ] .dek]
@@ -1248,23 +1351,9 @@ proc ::deken::install_package_from_file {{pkgfile ""}} {
# perform checks and install it
set pkgfile [file normalize $pkgfile]
- if { "$::deken::verify_sha256" } {
- if { ! [::deken::utilities::verify_sha256 ${pkgfile} ${pkgfile}] } {
- ::deken::statuspost [format [_ "Checksum mismatch for '%s'" ] $pkgfile] warn 0
- set msg [format [_ "SHA256 verification of '%s' failed!" ] $pkgfile ]
-
- set result "retry"
- while { "$result" eq "retry" } {
- set result [tk_messageBox \
- -title [_ "SHA256 verification failed" ] \
- -message "${msg}" \
- -icon error -type abortretryignore \
- -parent $::deken::winid]
- # we don't have a good strategy if the user selects 'retry'
- # so we just display the dialog again...
- }
- if { "$result" eq "abort" } { return }
- }
+ set result [::deken::verify_sha256_gui ${pkgfile} ${pkgfile}]
+ if { ! $result } {
+ return
}
::deken::install_package ${pkgfile} "" "" 1
}
@@ -2499,21 +2588,22 @@ proc ::deken::install_link {URL filename} {
set msg [_ "Download completed! Verifying..." ]
::deken::progressstatus $msg
::deken::post "$msg" info
- if { ! [::deken::utilities::verify_sha256 ${URL} $fullpkgfile] } {
- ::deken::statuspost [format [_ "Checksum mismatch for '%s'" ] $filename] warn 0
- if { "$::deken::verify_sha256" } {
- if { ! "$::deken::keep_package" } {
- catch { file delete $fullpkgfile }
- }
- tk_messageBox \
- -title [_ "SHA256 verification failed" ] \
- -message [format [_ "SHA256 verification of '%s' failed!" ] $fullpkgfile ] \
- -icon error -type ok \
- -parent $::deken::winid
- ::deken::progress 0
- return
- } else {
+
+ set result [::deken::verify_sha256_gui ${URL} ${fullpkgfile}]
+ if { ! $result } {
+ # verification failed
+ if { ! "$::deken::keep_package" } {
+ catch { file delete $fullpkgfile }
+ }
+ ::deken::progress 0
+ return
+ }
+ if { $result < 0 } {
+ # verification failed, but we ignore it
+ if { $result > -10 } {
::deken::statuspost [_ "Ignoring checksum mismatch" ] info 0
+ } elseif { $result > -100 } {
+ ::deken::statuspost [_ "Ignoring checksum errors" ] info 0
}
}
::deken::install_package ${fullpkgfile} ${filename} ${installdir} ${::deken::keep_package}
From b4c0edab580faedba22d6c594495e606ec4b52c7 Mon Sep 17 00:00:00 2001
From: Ben Wesch
Date: Mon, 27 Nov 2023 18:51:03 +0100
Subject: [PATCH 036/450] fix range example and reference in [text search] help
---
doc/5.reference/text-object-help.pd | 41 +++++++++++++++--------------
1 file changed, 21 insertions(+), 20 deletions(-)
diff --git a/doc/5.reference/text-object-help.pd b/doc/5.reference/text-object-help.pd
index 6617c5b27..0b8dc32a1 100644
--- a/doc/5.reference/text-object-help.pd
+++ b/doc/5.reference/text-object-help.pd
@@ -1,5 +1,5 @@
#N struct text-struct float x float y text z;
-#N canvas 547 23 540 573 12;
+#N canvas 547 37 540 573 12;
#X obj 91 539 list;
#X obj 28 12 text;
#X text 14 539 see also:;
@@ -408,7 +408,7 @@
#X restore 353 375 pd fromlist;
#X text 99 374 convert from list;
#X obj 241 398 text search;
-#N canvas 339 23 916 694 search 0;
+#N canvas 339 37 916 694 search 0;
#X floatatom 46 316 5 0 0 0 - - - 0;
#X text 340 259 find another text by name or pointer;
#X text 218 288 arguments: name of the text object or "-s struct-name", f 55;
@@ -448,26 +448,27 @@
#X obj 6 41 cnv 1 900 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X obj 29 10 text search;
#X text 811 11 <= click;
-#N canvas 726 130 570 392 reference 0;
+#N canvas 726 130 570 398 reference 0;
#X obj 9 47 cnv 5 550 5 empty empty INLETS: 8 18 0 13 #202020 #000000 0;
-#X obj 9 194 cnv 2 550 2 empty empty OUTLET: 8 12 0 13 #202020 #000000 0;
-#X obj 8 364 cnv 5 550 5 empty empty empty 8 18 0 13 #202020 #000000 0;
-#X obj 9 136 cnv 1 550 1 empty empty 2nd: 8 12 0 13 #7c7c7c #000000 0;
-#X text 122 143 symbol - set array name., f 46;
-#X text 116 163 pointer - pointer to the array if -s flag is used.;
-#X text 76 265 -s : struct name and field name of main structure., f 66;
+#X obj 9 203 cnv 2 550 2 empty empty OUTLET: 8 12 0 13 #202020 #000000 0;
+#X obj 8 373 cnv 5 550 5 empty empty empty 8 18 0 13 #202020 #000000 0;
+#X obj 9 145 cnv 1 550 1 empty empty 2nd: 8 12 0 13 #7c7c7c #000000 0;
+#X text 122 152 symbol - set array name., f 46;
+#X text 116 172 pointer - pointer to the array if -s flag is used.;
+#X text 76 274 -s : struct name and field name of main structure., f 66;
#X obj 35 14 text search;
#X text 165 85 list - search key, f 40;
#X obj 9 77 cnv 1 550 1 empty empty 1st: 8 12 0 13 #7c7c7c #000000 0;
-#X text 107 303 1) symbol - array name if no flags are given (default: none)., f 61;
-#X text 121 322 2) list -;
-#X obj 9 235 cnv 2 550 2 empty empty ARGUMENTS: 8 12 0 13 #202020 #000000 0;
-#X obj 9 261 cnv 1 550 1 empty empty flags: 8 12 0 13 #9f9f9f #000000 0;
-#X obj 9 293 cnv 1 550 1 empty empty args: 8 12 0 13 #7c7c7c #000000 0;
+#X text 107 312 1) symbol - array name if no flags are given (default: none)., f 61;
+#X text 121 331 2) list -;
+#X obj 9 244 cnv 2 550 2 empty empty ARGUMENTS: 8 12 0 13 #202020 #000000 0;
+#X obj 9 270 cnv 1 550 1 empty empty flags: 8 12 0 13 #9f9f9f #000000 0;
+#X obj 9 302 cnv 1 550 1 empty empty args: 8 12 0 13 #7c7c7c #000000 0;
#X text 123 14 - search for a message.;
-#X text 134 203 float - found message number or -1 if not found.;
+#X text 134 212 float - found message number or -1 if not found.;
#X text 190 323 search element number optionally preceded by ">" \, ">=" \, "<" \, "<=" \, or "near"., f 49;
-#X text 53 104 range - set search range (indexed from 0);
+#X text 53 104 range -;
+#X text 214 104 onset and range of searched messages (onset starting from index 0), f 38;
#X restore 717 11 pd reference;
#X text 53 95 matches first message (number 0);
#X text 117 10 - search for a message.;
@@ -487,9 +488,9 @@
#X text 607 558 Here message 2 wins because its element 0 is nearer to 3 \, notwithstanding that its element 1 is farther from 1, f 40;
#X text 225 359 here we ask to match both element 0 and 3 exactly. In element 3 we're testing symbols for equality., f 50;
#X text 13 457 Match a message for which the search key is greater than the element zero of that message. The message getting closest to the key wins. You can also use the 'range' message to narrow the search., f 68;
-#X msg 20 567 range 2 4;
-#X text 22 517 narrow to elements 2 and 4, f 9;
-#X text 163 545 this matches messages 1 and 3 \, and each is equally good \, so message 1 wins \, unless you narroe the range, f 43;
+#X text 163 545 this matches messages 1 and 3 \, and each is equally good \, so message 1 wins \, unless you narrow the range, f 43;
+#X text 22 517 narrow to messages 2 and 3, f 9;
+#X msg 20 567 range 2 2;
#X connect 4 0 0 0;
#X connect 5 0 4 1;
#X connect 6 0 4 0;
@@ -515,7 +516,7 @@
#X connect 30 0 28 0;
#X connect 31 0 28 0;
#X connect 32 0 28 0;
-#X connect 56 0 24 0;
+#X connect 58 0 24 0;
#X restore 353 398 pd search;
#X text 50 421 sequencer/message-sender;
#X obj 241 422 text sequence;
From 5a80eb9addaf40cef8cdffdc924be9c4cddd175d Mon Sep 17 00:00:00 2001
From: porres
Date: Mon, 27 Nov 2023 16:08:34 -0300
Subject: [PATCH 037/450] Update text-object-help.pd
improve a bit from the last commit/PR by ben wesch
---
doc/5.reference/text-object-help.pd | 80 ++++++++++++++---------------
1 file changed, 40 insertions(+), 40 deletions(-)
diff --git a/doc/5.reference/text-object-help.pd b/doc/5.reference/text-object-help.pd
index 0b8dc32a1..fc6710f24 100644
--- a/doc/5.reference/text-object-help.pd
+++ b/doc/5.reference/text-object-help.pd
@@ -408,7 +408,7 @@
#X restore 353 375 pd fromlist;
#X text 99 374 convert from list;
#X obj 241 398 text search;
-#N canvas 339 37 916 694 search 0;
+#N canvas 401 23 916 714 search 0;
#X floatatom 46 316 5 0 0 0 - - - 0;
#X text 340 259 find another text by name or pointer;
#X text 218 288 arguments: name of the text object or "-s struct-name", f 55;
@@ -423,41 +423,40 @@
#X msg 64 203 4 5;
#X msg 73 228 4 13;
#X msg 54 173 7;
-#X msg 83 365 7 cat;
-#X msg 133 365 7 alligator;
-#X floatatom 133 428 5 0 0 0 - - - 0;
-#X msg 33 365 7 dog;
-#X obj 133 400 text search text-search 0 3, f 33;
+#X msg 73 365 7 cat;
+#X msg 123 365 7 alligator;
+#X floatatom 123 428 5 0 0 0 - - - 0;
+#X msg 23 365 7 dog;
+#X obj 123 400 text search text-search 0 3, f 33;
#X floatatom 675 373 5 0 0 0 - - - 0;
#X obj 675 332 text search text-search 1;
#X msg 686 235 8 9;
#X msg 675 206 8 9 alligator;
#X msg 700 262 8;
#X msg 709 292 symbol line;
-#X floatatom 112 665 5 0 0 0 - - - 0;
-#X obj 112 633 text search text-search > 0, f 33;
-#X msg 112 516 2;
-#X msg 132 553 4;
-#X msg 146 598 10;
-#X obj 528 621 text search text-search 2 near 0;
-#X floatatom 528 659 5 0 0 0 - - - 0;
-#X msg 528 472 3 3;
-#X msg 543 512 3 2.5 1;
-#X msg 556 568 3 3 1;
+#X floatatom 112 685 5 0 0 0 - - - 0;
+#X msg 112 536 2;
+#X msg 128 573 4;
+#X msg 143 613 10;
+#X obj 528 641 text search text-search 2 near 0;
+#X floatatom 528 679 5 0 0 0 - - - 0;
+#X msg 528 488 3 3;
+#X msg 543 532 3 2.5 1;
+#X msg 556 588 3 3 1;
#X text 440 109 click to open:;
#X obj 6 41 cnv 1 900 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X obj 29 10 text search;
#X text 811 11 <= click;
-#N canvas 726 130 570 398 reference 0;
+#N canvas 726 130 570 384 reference 0;
#X obj 9 47 cnv 5 550 5 empty empty INLETS: 8 18 0 13 #202020 #000000 0;
#X obj 9 203 cnv 2 550 2 empty empty OUTLET: 8 12 0 13 #202020 #000000 0;
-#X obj 8 373 cnv 5 550 5 empty empty empty 8 18 0 13 #202020 #000000 0;
+#X obj 8 363 cnv 5 550 5 empty empty empty 8 18 0 13 #202020 #000000 0;
#X obj 9 145 cnv 1 550 1 empty empty 2nd: 8 12 0 13 #7c7c7c #000000 0;
#X text 122 152 symbol - set array name., f 46;
#X text 116 172 pointer - pointer to the array if -s flag is used.;
#X text 76 274 -s : struct name and field name of main structure., f 66;
#X obj 35 14 text search;
-#X text 165 85 list - search key, f 40;
+#X text 136 85 list - search key, f 40;
#X obj 9 77 cnv 1 550 1 empty empty 1st: 8 12 0 13 #7c7c7c #000000 0;
#X text 107 312 1) symbol - array name if no flags are given (default: none)., f 61;
#X text 121 331 2) list -;
@@ -467,8 +466,8 @@
#X text 123 14 - search for a message.;
#X text 134 212 float - found message number or -1 if not found.;
#X text 190 323 search element number optionally preceded by ">" \, ">=" \, "<" \, "<=" \, or "near"., f 49;
-#X text 53 104 range -;
-#X text 214 104 onset and range of searched messages (onset starting from index 0), f 38;
+#X text 24 104 range -;
+#X text 185 104 onset and range of searched messages (onset indexed from 0), f 44;
#X restore 717 11 pd reference;
#X text 53 95 matches first message (number 0);
#X text 117 10 - search for a message.;
@@ -479,18 +478,19 @@
#X text 95 203 matches two elements of message number 2;
#X text 107 227 fails on second element so no match;
#X text 213 306 ... then optional element numbers (starting from 0) optionally preceded by ">". ">=" \, "<" \, "<=" \, or "near".;
-#X text 145 509 messages 1 \, 2 \, and 3 match \, but 2 wins because its first element (4) is closest to the search key 2, f 51;
-#X text 178 597 nobody's first element is greater than 10;
+#X text 145 529 messages 1 \, 2 \, and 3 match \, but 2 wins because its first element (4) is closest to the search key 2, f 51;
+#X text 175 612 nobody's first element is greater than 10;
#X text 597 53 If the search pattern (the incoming list) has more elements than we have specified search elements \, extra search patterns match succeeding elements starting from the last one give as an argument. So for example if there are no arguments we look for matches to any number of elements starting from the beginning of the message in the text., f 42;
#X text 531 407 Here we ask for element 2 to equal 3 and elements starting at 0 to be 'near' the following arguments., f 41;
-#X text 562 472 element 2 is 3 and element 0 nearest 3;
-#X text 605 500 here messages 0 and 2 tie over 2.4 (1 and 4 are equally far from it) so message 0 whose second element is closer to 1 wins., f 42;
-#X text 607 558 Here message 2 wins because its element 0 is nearer to 3 \, notwithstanding that its element 1 is farther from 1, f 40;
-#X text 225 359 here we ask to match both element 0 and 3 exactly. In element 3 we're testing symbols for equality., f 50;
-#X text 13 457 Match a message for which the search key is greater than the element zero of that message. The message getting closest to the key wins. You can also use the 'range' message to narrow the search., f 68;
-#X text 163 545 this matches messages 1 and 3 \, and each is equally good \, so message 1 wins \, unless you narrow the range, f 43;
-#X text 22 517 narrow to messages 2 and 3, f 9;
-#X msg 20 567 range 2 2;
+#X text 562 488 element 2 is 3 and element 0 nearest 3;
+#X text 605 516 here messages 0 and 2 tie over 2.4 (1 and 4 are equally far from it) so message 0 whose second element is closer to 1 wins., f 42;
+#X text 607 578 Here message 2 wins because its element 0 is nearer to 3 \, notwithstanding that its element 1 is farther from 1, f 40;
+#X text 215 359 here we ask to match both element 0 and 3 exactly. In element 3 we're testing symbols for equality., f 50;
+#X obj 112 653 text search text-search > 0, f 33;
+#X text 159 565 matches 1 & 3 \, both are equally good \, so 1 wins \, unless you narrow the range, f 48;
+#X msg 20 587 range 2 3;
+#X text 24 536 narrow between 2 and 4, f 7;
+#X text 13 457 Match a message for which the search key is greater than the element zero of that message. The message getting closest to the key wins. You can also use the 'range' message to narrow the search \, wich takes an offset and number of messages., f 68;
#X connect 4 0 0 0;
#X connect 5 0 4 1;
#X connect 6 0 4 0;
@@ -508,15 +508,15 @@
#X connect 20 0 18 0;
#X connect 21 0 18 0;
#X connect 22 0 18 0;
-#X connect 24 0 23 0;
-#X connect 25 0 24 0;
-#X connect 26 0 24 0;
-#X connect 27 0 24 0;
-#X connect 28 0 29 0;
-#X connect 30 0 28 0;
-#X connect 31 0 28 0;
-#X connect 32 0 28 0;
-#X connect 58 0 24 0;
+#X connect 24 0 54 0;
+#X connect 25 0 54 0;
+#X connect 26 0 54 0;
+#X connect 27 0 28 0;
+#X connect 29 0 27 0;
+#X connect 30 0 27 0;
+#X connect 31 0 27 0;
+#X connect 54 0 23 0;
+#X connect 56 0 54 0;
#X restore 353 398 pd search;
#X text 50 421 sequencer/message-sender;
#X obj 241 422 text sequence;
From 93f6f90deda881f4338c79e3ef2f06359044c654 Mon Sep 17 00:00:00 2001
From: Miller Puckette
Date: Wed, 29 Nov 2023 16:36:53 +0100
Subject: [PATCH 038/450] sigmund~ better block size error checking
---
extra/sigmund~/sigmund~.c | 34 ++++++++++++++++++++--------------
1 file changed, 20 insertions(+), 14 deletions(-)
diff --git a/extra/sigmund~/sigmund~.c b/extra/sigmund~/sigmund~.c
index da046941e..e8e7b826e 100644
--- a/extra/sigmund~/sigmund~.c
+++ b/extra/sigmund~/sigmund~.c
@@ -1165,20 +1165,23 @@ static void sigmund_dsp(t_sigmund *x, t_signal **sp)
{
if (x->x_mode == MODE_STREAM)
{
- if (x->x_hop % sp[0]->s_n)
- post("sigmund~: adjusting hop size to %d",
- (x->x_hop = sp[0]->s_n * (x->x_hop / sp[0]->s_n)));
- if (x->x_infill % sp[0]->s_n) {
- if (x->x_inbuf) {
- int i;
- t_sample*inbuf = x->x_inbuf;
- for(i=0; ix_npts; i++)
- *inbuf++ = 0.;
+ if (x->x_npts % sp[0]->s_n)
+ pd_error(x, "sigmund~: npts %d must be multiple of block size %d",
+ x->x_npts, sp[0]->s_n);
+ else
+ {
+ if (x->x_hop % sp[0]->s_n)
+ post("sigmund~: adjusting hop size to %d",
+ (x->x_hop = sp[0]->s_n * (x->x_hop / sp[0]->s_n)));
+ if ((x->x_infill % sp[0]->s_n) || (x->x_infill > x->x_npts))
+ {
+ if (x->x_inbuf)
+ memset(x->x_inbuf, 0, x->x_npts * sizeof(*x->x_inbuf));
+ x->x_infill = 0;
}
- x->x_infill = 0;
+ x->x_sr = sp[0]->s_sr;
+ dsp_add(sigmund_perform, 3, x, sp[0]->s_vec, (t_int)sp[0]->s_n);
}
- x->x_sr = sp[0]->s_sr;
- dsp_add(sigmund_perform, 3, x, sp[0]->s_vec, (t_int)sp[0]->s_n);
}
}
@@ -1283,10 +1286,13 @@ static t_int *sigmund_perform(t_int *w)
return (w+4);
if (x->x_countdown > 0)
x->x_countdown -= n;
- else if (x->x_infill != x->x_npts)
+ else
{
int j;
- t_float *fp = x->x_inbuf + x->x_infill;
+ t_float *fp;
+ if (x->x_infill + n > x->x_npts)
+ bug("sigmund_perform"), x->x_infill = 0;
+ fp = x->x_inbuf + x->x_infill;
for (j = 0; j < n; j++)
*fp++ = *in++;
x->x_infill += n;
From 6995b02985bfb1d9de59e6c1c71ea826565b098a Mon Sep 17 00:00:00 2001
From: Miller Puckette
Date: Wed, 29 Nov 2023 16:39:39 +0100
Subject: [PATCH 039/450] add note for testing sub-pd with ascii input/output
---
extra/pd~/notes.txt | 3 +++
1 file changed, 3 insertions(+)
diff --git a/extra/pd~/notes.txt b/extra/pd~/notes.txt
index 59129d5ab..97e57f79c 100644
--- a/extra/pd~/notes.txt
+++ b/extra/pd~/notes.txt
@@ -1,5 +1,8 @@
pd -schedlib `pwd`/pdsched
+ascii, non-real-time:
+pd -schedlib `pwd`/pdsched -extraflags a -nrt
+
dolist:
pd~ to delay starting subproc until asked
figure out about setting nchannels from command line
From ef9a7999697b8ec8bfe4e378e244d30366fd9b71 Mon Sep 17 00:00:00 2001
From: porres
Date: Wed, 29 Nov 2023 23:47:21 -0300
Subject: [PATCH 040/450] document default flag values in [soundfiler] and
letting it save files
closes https://github.com/pure-data/pddp/issues/177
One big issue is that the example used a '/tmp/' directory to write to, but this directory doesn't exist, so noting got saved. I removed this temp file so now it gets saved on the docs folder.
I also documented default flag values for writting
I think it would best to also use [openpanel] and [savepanel] in the examples by the way.
---
doc/5.reference/soundfiler-help.pd | 221 +++++++++++++++++------------
1 file changed, 127 insertions(+), 94 deletions(-)
diff --git a/doc/5.reference/soundfiler-help.pd b/doc/5.reference/soundfiler-help.pd
index f1eeb0ff5..a3507fdcb 100644
--- a/doc/5.reference/soundfiler-help.pd
+++ b/doc/5.reference/soundfiler-help.pd
@@ -1,61 +1,25 @@
-#N canvas 322 46 863 579 12;
+#N canvas 183 50 1039 619 12;
#N canvas 0 22 450 300 (subpatch) 0;
-#X array array1 13 float 2;
-#X coords 0 1 13 -1 300 100 1 0 0;
-#X restore 545 269 graph;
-#N canvas 0 22 450 300 (subpatch) 0;
-#X array array2 78003 float 2;
-#X coords 0 1 78003 -1 300 100 1;
-#X restore 545 387 graph;
-#X obj 32 382 soundfiler;
-#X msg 76 270 write -aiff /tmp/foo1 array2;
-#X msg 25 141 read ../sound/bell.aiff array2;
-#X msg 41 198 read -raw 128 2 2 b ../sound/bell.aiff array1 array2;
-#X floatatom 32 411 7 0 0 0 - - - 0;
-#X msg 33 169 read -resize ../sound/bell.aiff array2;
-#X text 286 270 write a file;
-#X text 408 326 write stereo;
-#X obj 143 542 tabwrite~;
-#X obj 217 542 tabread4~;
-#X obj 290 542 tabplay~;
-#X obj 414 542 writesf~;
-#X obj 356 542 readsf~;
-#X text 18 541 See also:;
-#X text 245 141 read a file to zero or more arrays;
-#X obj 30 15 soundfiler;
-#X text 313 169 optionally resize;
-#X text 419 198 override header;
-#X text 314 224 ... read from an ascii file, f 28;
-#X text 648 541 updated for Pd version 0.51;
-#X msg 49 225 read -ascii -resize table.txt array1;
-#X msg 85 325 write -next -bytes 4 /tmp/foo3 array1 array2;
-#X text 33 444 Left outlet outputs the number of samples. Right outlet outputs info as a list: samplerate \, headersize \, num channels \, bytes per sample \, & endianness ("b" or "l"). If no array name is given \, no samples are read but the info is provided anyway., f 63;
-#X msg 81 298 write -nframes 10000 /tmp/foo2.wav array2;
-#X text 380 298 set type by file ext;
-#X text 287 352 ... write to an ascii file;
-#X msg 91 352 write /tmp/foo1.txt array2;
-#X text 314 374 "-ascii" set via file ext;
-#N canvas 791 194 575 345 Dealing_with_"\$0" 0;
-#X obj 258 174 array define \$0-x;
-#X obj 153 202 f \$0;
-#X obj 153 263 soundfiler;
-#X floatatom 153 289 7 0 0 0 - - - 0;
-#X msg 153 231 read -resize ../sound/bell.aiff \$1-x;
-#X obj 153 176 loadbang;
-#X text 36 86 You can use "\$0" in an array name in [array define] and if you need to set the array name in a message you can load '\$0' in a float object and send it to it., f 70;
-#X text 390 175 <- array with local name, f 13;
-#X text 36 33 '\$0' - the patch ID number used to force locality in Pd - is widely used in send/receive names as well as array names. This is especially useful in abstractions so each copy has local names instead of global., f 70;
-#X connect 1 0 4 0;
-#X connect 2 0 3 0;
-#X connect 4 0 2 0;
-#X connect 5 0 1 0;
-#X restore 385 410 pd Dealing_with_"\$0";
-#X text 234 401 open subpatch to see how to deal with '\$0', f 21;
-#X obj 95 542 array;
-#X listbox 99 411 16 0 0 0 - - - 0;
-#X obj 8 46 cnv 1 850 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X text 774 11 <= click;
-#N canvas 556 60 632 371 reference 0;
+#X array sample 255944 float 2;
+#X coords 0 1 255944 -1 250 100 1 0 0;
+#X restore 278 275 graph;
+#X obj 60 340 soundfiler;
+#X floatatom 60 369 7 0 0 0 - - - 12;
+#X text 101 262 write a file;
+#X obj 163 580 tabwrite~;
+#X obj 237 580 tabread4~;
+#X obj 310 580 tabplay~;
+#X obj 434 580 writesf~;
+#X obj 376 580 readsf~;
+#X text 38 579 See also:;
+#X text 256 185 read a file to zero or more arrays, f 35;
+#X obj 40 15 soundfiler;
+#X text 806 579 updated for Pd version 0.51;
+#X obj 115 580 array;
+#X listbox 127 369 16 0 0 0 - - - 0;
+#X obj 6 51 cnv 1 1025 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 916 14 <= click;
+#N canvas 540 87 632 371 reference 0;
#X obj 8 52 cnv 5 610 5 empty empty INLET: 8 18 0 13 #202020 #000000 0;
#X obj 8 182 cnv 2 610 2 empty empty OUTLETS: 8 12 0 13 #202020 #000000 0;
#X obj 8 301 cnv 2 610 2 empty empty ARGUMENTS: 8 12 0 13 #202020 #000000 0;
@@ -64,46 +28,115 @@
#X obj 7 210 cnv 1 610 1 empty empty 1st: 8 12 0 13 #7c7c7c #000000 0;
#X text 109 254 list -;
#X text 102 219 float - number of samples (when reading a file)., f 58;
-#X text 157 254 sample rate \, header size \, number of channels \, bytes per sample & endianness (when reading a file)., f 51;
#X text 75 66 read -;
#X text 174 66 sets a filename to open and optionally one or more arrays to load channels. Optional flags: -wave \, -aiff \, -caf \, -next \, -skip \, -maxsize \, -ascii \, -raw .;
#X text 68 117 write -;
-#X text 174 116 sets a filename to write and one or more arrays to specify channels. Optional flags: -wave \, -aiff \, -caf \, -next \, -big \, -little \, -skip \, -nframes \, -ascii \, -normalize \, -rate .., f 60;
#X obj 30 15 soundfiler;
-#X text 164 309 NONE;
+#X text 234 309 NONE;
#X text 112 15 - import/export soundfiles to/from arrays.;
-#X restore 680 12 pd reference;
-#X obj 8 524 cnv 1 850 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X text 551 132 Use 'read' messages to load files into arrays and 'write' messages to write arrays to a sound file. Open the subpatch below for more information on flags for reading and writing., f 39;
-#N canvas 578 80 567 534 read-write-flags 0;
-#X text 49 53 -skip ;
-#X text 49 108 -raw ;
-#X text 49 89 -maxsize ;
-#X text 55 381 -skip ;
-#X text 55 403 -nframes ;
-#X text 55 447 -normalize;
-#X text 55 425 -bytes <2 \, 3 \, or 4>;
-#X text 55 467 -rate ;
-#X text 49 219 -ascii - read a file containing ascii numbers;
-#X text 55 359 -big \, -little (sample endianness);
-#X text 54 340 -wave \, -aiff \, -caf \, -next \, -ascii;
-#X text 55 495 The number of channels is limited to 64;
-#X text 67 237 May be combined with -resize. Newlines in the file are ignored \, non-numeric fields are replaced by zero. If multiple arrays are specified \, the first elements of each array should come first in the file \, followed by all the second elements and so on (interleaved)., f 67;
-#X text 49 35 -wave \, -aiff \, -caf \, -next;
-#X text 49 71 -resize (resizes arrays to the size of the sound file);
-#X text 9 17 Flags for 'read' messages:;
-#X text 20 319 Flags for 'write' messages:;
-#X text 67 126 you can leave soundfiler to figure out which of the known soundfile formats the file belongs to or override all header and type information using the "-raw" flag \, which causes all header and type information to be ignored. Endianness is "l" ("little") for Intel machines or "b" ("big") for older PPC Macintoshes. You can give "n" (natural) to take the byte order your machine prefers., f 67;
-#X restore 674 216 pd read-write-flags;
-#X text 30 61 The [soundfiler] object reads and writes floating point arrays to binary soundfiles which may contain uncompressed 2- or 3-byte integer ("pcm") or 4-byte floating point samples in wave \, aiff \, caf \, next \, or ascii text formats. The number of channels of the soundfile need not match the number of arrays given (extras are dropped and unsupplied channels are zeroed out)., f 114;
-#X text 110 15 - import/export soundfiles to/from arrays;
-#X connect 2 0 6 0;
-#X connect 2 1 33 0;
-#X connect 3 0 2 0;
+#X text 174 116 sets a filename to write and one or more arrays to specify channels. Optional flags: -wave \, -aiff \, -caf \, -ascii \, -next \, -big \, -little \, -skip \, -nframes \, -normalize \, -rate .;
+#X text 157 254 sample rate \, header size \, number of channels \, bytes per sample & endianness ('b' or 'l')., f 51;
+#X restore 822 15 pd reference;
+#X text 120 14 - import/export soundfiles to/from arrays;
+#X msg 34 185 read ../sound/bell.aiff sample;
+#X msg 60 220 read -resize ../sound/bell.aiff sample;
+#X text 29 69 The [soundfiler] object loads files into arrays and also saves arrays into files. The soundfiles may contain uncompressed 2- or 3-byte integer ("pcm") or 4-byte floating point samples in wave \, aiff \, caf and next formats. Additionally \, [soundfiler] also deals with ascii text files., f 72;
+#X text 340 212 optionally resize array to fit the whole file, f 23;
+#X text 37 153 Basic read/write example:;
+#N canvas 791 194 575 345 Dealing_with_"\$0" 0;
+#X obj 273 171 array define \$0-x;
+#X obj 153 202 f \$0;
+#X obj 153 263 soundfiler;
+#X floatatom 153 289 7 0 0 0 - - - 0;
+#X msg 153 231 read -resize ../sound/bell.aiff \$1-x;
+#X obj 153 176 loadbang;
+#X text 405 172 <- array with local name, f 13;
+#X text 36 33 '\$0' - the patch ID number used to force locality in Pd - is widely used in send/receive names as well as array names. This is especially useful in abstractions so each copy has local names instead of global., f 70;
+#X text 36 86 Here we use "\$0" in an array name in [array define] and if you need to set the array name in a message you can load '\$0' in a float object and send it to it., f 70;
+#X connect 1 0 4 0;
+#X connect 2 0 3 0;
#X connect 4 0 2 0;
-#X connect 5 0 2 0;
-#X connect 7 0 2 0;
-#X connect 22 0 2 0;
-#X connect 23 0 2 0;
-#X connect 25 0 2 0;
-#X connect 28 0 2 0;
+#X connect 5 0 1 0;
+#X restore 788 376 pd Dealing_with_"\$0";
+#X text 678 353 open subpatch to see how to deal with '\$0', f 28;
+#X text 29 501 The 'write' message takes a filename to save to and one or more arrays (one for each channel)., f 72;
+#X text 29 422 The 'read' message takes a file to load and one or more arrays to load into (in the case the file has more than one channel). The number of channels of the soundfile need not match the number of arrays given to read (extras channels are dropped and unsupplied channels are zeroed out in the extra arrays)., f 72;
+#X text 577 243 Note that if no array name is given to read to \, no samples are read but you get the number of samples in the file on the left outlet and the info on the right outlet anyway., f 62;
+#X text 577 300 Also note that the number of channels is limited to 64 for both reading and writting., f 62;
+#N canvas 86 112 1234 585 read-write-flags 0;
+#X text 27 83 -resize (resizes arrays to the size of the sound file), f 62;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array array1 78003 float 2;
+#X coords 0 1 78003 -1 325 120 1 0 0;
+#X restore 538 441 graph;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array array2 78003 float 2;
+#X coords 0 1 78003 -1 325 120 1 0 0;
+#X restore 877 441 graph;
+#X obj 681 357 soundfiler;
+#X text 27 23 Flags for 'read' message:, f 62;
+#X text 27 347 Flags for 'write' message:, f 69;
+#X text 27 101 -maxsize (maximum number of samples to resize to), f 62;
+#X text 48 139 [soundfiler] can figure out which of the known soundfile formats the file belongs to or override all header and type information using the "-raw" flag \, which causes all header and type information to be ignored. Endianness is "l" ("little") for Intel machines or "b" ("big") for older PPC Macintoshes. You can give "n" (natural) to take the byte order your machine prefers., f 70;
+#X text 27 231 -ascii (read a file containing ascii numbers), f 73;
+#X text 48 251 This may only be combined with '-resize'. Newlines in the file are ignored \, non-numeric fields are replaced by zero. If multiple arrays are specified \, the first elements of each array should come first in the file \, followed by all the second elements and so on (interleaved)., f 70;
+#X text 27 47 -wave \, -aiff \, -caf \, -next (soundfile format), f 62;
+#X text 857 108 read a file overriding the header;
+#X text 988 255 read from an ascii file;
+#X listbox 748 385 17 0 0 0 - - - 0;
+#X msg 664 133 read -resize -raw 128 2 2 b ../sound/bell.aiff array1 array2;
+#X msg 735 278 read -ascii -resize table.txt array1 array2;
+#X msg 726 255 read -ascii -resize table.txt array1;
+#X text 903 313 write to an ascii file;
+#X floatatom 681 385 6 0 0 0 - - - 0;
+#X msg 694 189 write -nframes 10000 foo2.wav array1;
+#X obj 645 72 openpanel;
+#X obj 645 37 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
+#X msg 645 100 read -resize \$1 array1;
+#X msg 704 213 write -next -bytes 4 foo3 array1 array2;
+#X text 959 189 write and set number of samples;
+#X text 989 207 set file extenstion and write a stereo file, f 23;
+#X obj 560 72 savepanel;
+#X obj 560 37 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
+#X text 677 38 choose file to save to or read from in your hard disk;
+#X msg 676 157 read -maxsize 44100 -aiff ../sound/bell.aiff array1;
+#X text 1044 157 set size and extension;
+#X text 82 500 * note that arrays whose values exceed the -1 to 1 range are automatically normalized, f 42;
+#X text 27 442 -bytes (bytes per sample: 2 \, 3 \, or 4 \, default: 2), f 69;
+#X text 27 461 -rate (sample rate \, default Pd's running sample rate), f 69;
+#X text 27 424 -nframes (maximum points to write \, default whole array), f 69;
+#X text 27 405 -skip (number of points to skip in array \, default 0), f 69;
+#X text 27 65 -skip (sample frames to skip in the file as an offset), f 62;
+#X text 27 120 -raw (header size \, channels \, bytes per sample \, endianness), f 73;
+#X text 27 367 -wave \, -aiff \, -caf \, -next \, -ascii (soundfile format \, default: 'wave'), f 69;
+#X text 27 386 -big \, -little (sample endianness \, default 'little'), f 69;
+#X text 27 480 -normalize * (normalize file to '1'), f 69;
+#X msg 560 100 write \$1 array1 array2, f 9;
+#X msg 745 314 write foo1.txt array1;
+#X connect 3 0 18 0;
+#X connect 3 1 13 0;
+#X connect 14 0 3 0;
+#X connect 15 0 3 0;
+#X connect 16 0 3 0;
+#X connect 19 0 3 0;
+#X connect 20 0 22 0;
+#X connect 21 0 20 0;
+#X connect 22 0 3 0;
+#X connect 23 0 3 0;
+#X connect 26 0 41 0;
+#X connect 27 0 26 0;
+#X connect 29 0 3 0;
+#X connect 41 0 3 0;
+#X connect 42 0 3 0;
+#X restore 756 497 pd read-write-flags & more examples;
+#X f 19;
+#X msg 89 289 write foo1 sample;
+#X text 577 69 At loading or writting a file \, the left outlet outputs the number of samples and the right outlet sends information as a list \, namely: Sample Rate \, Header Size \, Number of Bhannels \, Bytes per Sample & Endianness ("b" for "big" or "l" for "little")., f 62;
+#X text 577 149 When loading a file \, the left outlet sends the number of samples the file contains if the array is equal or greater in size. If you're loading a file into an array that is smaller \, the number or samples is clipped to the array size and you probably want to use the -resize flag to resize the array size to the file size., f 62;
+#X text 577 413 Both 'read' and 'write' messages also take optional flags for configuration. In the basic example to the left we have the '-resize' flag in the read message that resizes the array to the file size. See more about flags and advanced examples in the subpatch below., f 62;
+#X obj 6 562 cnv 1 1025 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X connect 1 0 2 0;
+#X connect 1 1 14 0;
+#X connect 19 0 1 0;
+#X connect 20 0 1 0;
+#X connect 31 0 1 0;
From 79bb9eb7e5bb2b0301f6632360859be5faba1267 Mon Sep 17 00:00:00 2001
From: porres
Date: Thu, 30 Nov 2023 00:44:42 -0300
Subject: [PATCH 041/450] Update soundfiler-help.pd
fixed a typo and other minor cosmetical changes
---
doc/5.reference/soundfiler-help.pd | 70 ++++++++++++++++--------------
1 file changed, 37 insertions(+), 33 deletions(-)
diff --git a/doc/5.reference/soundfiler-help.pd b/doc/5.reference/soundfiler-help.pd
index a3507fdcb..c3d8bdada 100644
--- a/doc/5.reference/soundfiler-help.pd
+++ b/doc/5.reference/soundfiler-help.pd
@@ -1,8 +1,8 @@
#N canvas 183 50 1039 619 12;
#N canvas 0 22 450 300 (subpatch) 0;
-#X array sample 255944 float 2;
-#X coords 0 1 255944 -1 250 100 1 0 0;
-#X restore 278 275 graph;
+#X array sample 44100 float 2;
+#X coords 0 1 44100 -1 250 100 1 0 0;
+#X restore 269 273 graph;
#X obj 60 340 soundfiler;
#X floatatom 60 369 7 0 0 0 - - - 12;
#X text 101 262 write a file;
@@ -63,7 +63,7 @@
#X text 29 422 The 'read' message takes a file to load and one or more arrays to load into (in the case the file has more than one channel). The number of channels of the soundfile need not match the number of arrays given to read (extras channels are dropped and unsupplied channels are zeroed out in the extra arrays)., f 72;
#X text 577 243 Note that if no array name is given to read to \, no samples are read but you get the number of samples in the file on the left outlet and the info on the right outlet anyway., f 62;
#X text 577 300 Also note that the number of channels is limited to 64 for both reading and writting., f 62;
-#N canvas 86 112 1234 585 read-write-flags 0;
+#N canvas 101 118 1234 585 read-write-flags 1;
#X text 27 83 -resize (resizes arrays to the size of the sound file), f 62;
#N canvas 0 22 450 300 (subpatch) 0;
#X array array1 78003 float 2;
@@ -73,7 +73,7 @@
#X array array2 78003 float 2;
#X coords 0 1 78003 -1 325 120 1 0 0;
#X restore 877 441 graph;
-#X obj 681 357 soundfiler;
+#X obj 681 367 soundfiler;
#X text 27 23 Flags for 'read' message:, f 62;
#X text 27 347 Flags for 'write' message:, f 69;
#X text 27 101 -maxsize (maximum number of samples to resize to), f 62;
@@ -81,26 +81,22 @@
#X text 27 231 -ascii (read a file containing ascii numbers), f 73;
#X text 48 251 This may only be combined with '-resize'. Newlines in the file are ignored \, non-numeric fields are replaced by zero. If multiple arrays are specified \, the first elements of each array should come first in the file \, followed by all the second elements and so on (interleaved)., f 70;
#X text 27 47 -wave \, -aiff \, -caf \, -next (soundfile format), f 62;
-#X text 857 108 read a file overriding the header;
-#X text 988 255 read from an ascii file;
-#X listbox 748 385 17 0 0 0 - - - 0;
-#X msg 664 133 read -resize -raw 128 2 2 b ../sound/bell.aiff array1 array2;
-#X msg 735 278 read -ascii -resize table.txt array1 array2;
-#X msg 726 255 read -ascii -resize table.txt array1;
-#X text 903 313 write to an ascii file;
-#X floatatom 681 385 6 0 0 0 - - - 0;
-#X msg 694 189 write -nframes 10000 foo2.wav array1;
+#X text 1119 137 read a file overriding the header, f 11;
+#X text 1002 261 read from an ascii file;
+#X listbox 748 395 17 0 0 0 - - - 0;
+#X msg 684 152 read -resize -raw 128 2 2 b ../sound/bell.aiff array1 array2;
+#X msg 749 284 read -ascii -resize table.txt array1 array2;
+#X text 922 321 write to an ascii file;
+#X floatatom 681 395 6 0 0 0 - - - 0;
+#X msg 709 199 write -nframes 10000 foo2.wav array1;
#X obj 645 72 openpanel;
#X obj 645 37 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
-#X msg 645 100 read -resize \$1 array1;
-#X msg 704 213 write -next -bytes 4 foo3 array1 array2;
-#X text 959 189 write and set number of samples;
-#X text 989 207 set file extenstion and write a stereo file, f 23;
+#X msg 719 226 write -next -bytes 4 foo3 array1 array2;
+#X text 974 199 write and set number of samples;
+#X text 1004 217 set file extenstion and write a stereo file, f 23;
#X obj 560 72 savepanel;
#X obj 560 37 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
#X text 677 38 choose file to save to or read from in your hard disk;
-#X msg 676 157 read -maxsize 44100 -aiff ../sound/bell.aiff array1;
-#X text 1044 157 set size and extension;
#X text 82 500 * note that arrays whose values exceed the -1 to 1 range are automatically normalized, f 42;
#X text 27 442 -bytes (bytes per sample: 2 \, 3 \, or 4 \, default: 2), f 69;
#X text 27 461 -rate (sample rate \, default Pd's running sample rate), f 69;
@@ -112,29 +108,37 @@
#X text 27 386 -big \, -little (sample endianness \, default 'little'), f 69;
#X text 27 480 -normalize * (normalize file to '1'), f 69;
#X msg 560 100 write \$1 array1 array2, f 9;
-#X msg 745 314 write foo1.txt array1;
-#X connect 3 0 18 0;
+#X msg 764 322 write foo1.txt array1;
+#X msg 645 100 read -resize \$1 array1 array2;
+#X msg 666 127 read -maxsize 44100 -aiff ../sound/bell.aiff array1 array2;
+#X text 905 103 set max size and extension;
+#X msg 740 261 read -ascii -resize table.txt array1;
+#X connect 3 0 17 0;
#X connect 3 1 13 0;
#X connect 14 0 3 0;
#X connect 15 0 3 0;
-#X connect 16 0 3 0;
-#X connect 19 0 3 0;
-#X connect 20 0 22 0;
-#X connect 21 0 20 0;
-#X connect 22 0 3 0;
-#X connect 23 0 3 0;
-#X connect 26 0 41 0;
-#X connect 27 0 26 0;
-#X connect 29 0 3 0;
-#X connect 41 0 3 0;
+#X connect 18 0 3 0;
+#X connect 19 0 39 0;
+#X connect 20 0 19 0;
+#X connect 21 0 3 0;
+#X connect 24 0 37 0;
+#X connect 25 0 24 0;
+#X connect 37 0 3 0;
+#X connect 38 0 3 0;
+#X connect 39 0 3 0;
+#X connect 40 0 3 0;
#X connect 42 0 3 0;
#X restore 756 497 pd read-write-flags & more examples;
#X f 19;
#X msg 89 289 write foo1 sample;
-#X text 577 69 At loading or writting a file \, the left outlet outputs the number of samples and the right outlet sends information as a list \, namely: Sample Rate \, Header Size \, Number of Bhannels \, Bytes per Sample & Endianness ("b" for "big" or "l" for "little")., f 62;
#X text 577 149 When loading a file \, the left outlet sends the number of samples the file contains if the array is equal or greater in size. If you're loading a file into an array that is smaller \, the number or samples is clipped to the array size and you probably want to use the -resize flag to resize the array size to the file size., f 62;
#X text 577 413 Both 'read' and 'write' messages also take optional flags for configuration. In the basic example to the left we have the '-resize' flag in the read message that resizes the array to the file size. See more about flags and advanced examples in the subpatch below., f 62;
#X obj 6 562 cnv 1 1025 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X obj 503 580 openpanel;
+#X obj 576 580 savepanel;
+#X text 577 69 At loading or writting a file \, the left outlet outputs the number of samples and the right outlet sends information as a list \, namely: Sample Rate \, Header Size \, Number of Channels \, Bytes per Sample & Endianness ("b" for "big" or "l" for "little")., f 62;
+#X text 126 389 info ;
+#X text 44 389 # samples;
#X connect 1 0 2 0;
#X connect 1 1 14 0;
#X connect 19 0 1 0;
From 4dca787381b0503adaca867a1f1f07f07fe0b97c Mon Sep 17 00:00:00 2001
From: porres
Date: Thu, 30 Nov 2023 00:47:10 -0300
Subject: [PATCH 042/450] Update soundfiler-help.pd
closing subpatch
---
doc/5.reference/soundfiler-help.pd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/5.reference/soundfiler-help.pd b/doc/5.reference/soundfiler-help.pd
index c3d8bdada..71bbfea42 100644
--- a/doc/5.reference/soundfiler-help.pd
+++ b/doc/5.reference/soundfiler-help.pd
@@ -63,7 +63,7 @@
#X text 29 422 The 'read' message takes a file to load and one or more arrays to load into (in the case the file has more than one channel). The number of channels of the soundfile need not match the number of arrays given to read (extras channels are dropped and unsupplied channels are zeroed out in the extra arrays)., f 72;
#X text 577 243 Note that if no array name is given to read to \, no samples are read but you get the number of samples in the file on the left outlet and the info on the right outlet anyway., f 62;
#X text 577 300 Also note that the number of channels is limited to 64 for both reading and writting., f 62;
-#N canvas 101 118 1234 585 read-write-flags 1;
+#N canvas 101 118 1234 585 read-write-flags 0;
#X text 27 83 -resize (resizes arrays to the size of the sound file), f 62;
#N canvas 0 22 450 300 (subpatch) 0;
#X array array1 78003 float 2;
From 0d0f968f07a5c8d3ec0dc4de132b329f07e2bd62 Mon Sep 17 00:00:00 2001
From: Lucas Cordiviola
Date: Thu, 7 Dec 2023 01:05:13 -0300
Subject: [PATCH 043/450] html: correct file extension for 'deken-like' naming
under macOS. (#2156)
---
doc/1.manual/x4.htm | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/doc/1.manual/x4.htm b/doc/1.manual/x4.htm
index 56c1ff0f6..90f6a00e0 100644
--- a/doc/1.manual/x4.htm
+++ b/doc/1.manual/x4.htm
@@ -195,13 +195,13 @@
‘’ |
‘’ |
32 |
-my_lib.darwin-fat-32.dylib |
+my_lib.darwin-fat-32.so |
‘’ |
‘’ |
64 |
-my_lib.darwin-fat-64.dylib |
+my_lib.darwin-fat-64.so |
‘’ |
@@ -213,13 +213,13 @@
‘’ |
‘’ |
32 |
-my_lib.darwin-ppc-32.dylib |
+my_lib.darwin-ppc-32.so |
‘’ |
‘’ |
64 |
-my_lib.darwin-ppc-64.dylib |
+my_lib.darwin-ppc-64.so |
‘’ |
@@ -231,13 +231,13 @@
‘’ |
‘’ |
32 |
-my_lib.darwin-i386-32.dylib |
+my_lib.darwin-i386-32.so |
‘’ |
‘’ |
64 |
-my_lib.darwin-i386-64.dylib |
+my_lib.darwin-i386-64.so |
‘’ |
@@ -249,13 +249,13 @@
‘’ |
‘’ |
32 |
-my_lib.darwin-amd64-32.dylib |
+my_lib.darwin-amd64-32.so |
‘’ |
‘’ |
64 |
-my_lib.darwin-amd64-64.dylib |
+my_lib.darwin-amd64-64.so |
‘’ |
@@ -267,13 +267,13 @@
‘’ |
‘’ |
32 |
-my_lib.darwin-arm64-32.dylib |
+my_lib.darwin-arm64-32.so |
‘’ |
‘’ |
64 |
-my_lib.darwin-arm64-64.dylib |
+my_lib.darwin-arm64-64.so |
Windows |
From fe5109b00b0caba39f33810d8a49aeee2cb3b4da Mon Sep 17 00:00:00 2001
From: Christof Ressi
Date: Fri, 8 Dec 2023 22:13:40 +0100
Subject: [PATCH 044/450] fix out-of-bounds memory access in list_store_delete
thanks to Timothy Schoen!
---
src/x_list.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/x_list.c b/src/x_list.c
index f0d84968d..581da237e 100644
--- a/src/x_list.c
+++ b/src/x_list.c
@@ -507,7 +507,7 @@ static void list_store_delete(t_list_store *x, t_floatarg f1, t_floatarg f2)
}
/* shift elements (after the deleted elements) to the left */
memmove(x->x_alist.l_vec + index, x->x_alist.l_vec + index + n,
- (x->x_alist.l_n - index) * sizeof(*x->x_alist.l_vec));
+ (x->x_alist.l_n - index - n) * sizeof(*x->x_alist.l_vec));
/* shrink memory */
if (!(x->x_alist.l_vec = (t_listelem *)resizebytes(x->x_alist.l_vec,
(x->x_alist.l_n) * sizeof(*x->x_alist.l_vec),
From 917c777092335e34c842d206e6d79358bb2c485e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Thu, 14 Dec 2023 22:03:05 +0100
Subject: [PATCH 045/450] Various minor improvements to [file]
- Closes: https://github.com/pure-data/pure-data/issues/1665
- Closes: https://github.com/pure-data/pure-data/issues/2008
- Closes: https://github.com/pure-data/pure-data/issues/2080
---
src/x_file.c | 102 ++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 77 insertions(+), 25 deletions(-)
diff --git a/src/x_file.c b/src/x_file.c
index b014b7caa..6a0bb2e90 100644
--- a/src/x_file.c
+++ b/src/x_file.c
@@ -442,6 +442,25 @@ static int do_checkpathname(t_file_handle*x, const char*path) {
return 0;
}
+t_canvas*do_getparentcanvas(t_file_handle*x, int parentlevel, int*effectivelevel) {
+ t_canvas *c = x->x_canvas;
+ int i, level = 0;
+ for (i = 0; i < parentlevel; i++)
+ {
+ while (!c->gl_env) /* back up to containing canvas or abstraction */
+ c = c->gl_owner;
+ if (c->gl_owner) /* back up one more into an owner if any */
+ {
+ c = c->gl_owner;
+ level++;
+ }
+ }
+ if(effectivelevel)
+ *effectivelevel = level;
+ return c;
+}
+
+
static int do_parse_creationmode(t_atom*ap) {
const char*s;
if(A_FLOAT==ap->a_type)
@@ -588,6 +607,7 @@ static int file_handle_checkopen(t_file_handle*x, const char*cmd) {
if(x->x_fd<0) {
if(!cmd)cmd=(x->x_mode)?"write":"read";
pd_error(x, "'%s' without prior 'open'", cmd);
+ outlet_bang(x->x_infoout);
return 0;
}
return 1;
@@ -1152,13 +1172,16 @@ static void file_glob_symbol(t_file_handle*x, t_symbol*spattern) {
/* ================ [file which] ====================== */
-static void file_which_symbol(t_file_handle*x, t_symbol*s) {
+static void file_which_doit(t_file_handle*x, t_symbol*s, int depth) {
+ char pathname[MAXPDSTRING];
+ t_canvas*c = do_getparentcanvas(x, depth, 0);
+ do_expandunbash(s->s_name, pathname, MAXPDSTRING);
/* LATER we might output directories as well,... */
int isdir=0;
t_atom outv[2];
char dirresult[MAXPDSTRING], *nameresult;
- int fd = canvas_open(x->x_canvas,
- s->s_name, "",
+ int fd = canvas_open(c,
+ pathname, "",
dirresult, &nameresult, MAXPDSTRING,
1);
if(fd>=0) {
@@ -1173,12 +1196,47 @@ static void file_which_symbol(t_file_handle*x, t_symbol*s) {
}
}
+static void file_which_list(t_file_handle*x, t_symbol*s, int argc, t_atom*argv) {
+ const char*msg = s?s->s_name:"";
+ int parentlevel = 0;
+ t_symbol*path;
+
+ switch(argc) {
+ default: goto fail;
+ case 1:
+ switch(argv->a_type) {
+ case(A_SYMBOL):
+ path = atom_getsymbol(argv);
+ break;
+ default: goto fail;
+ }
+ break;
+ case 2:
+ if(A_SYMBOL == argv[0].a_type && A_FLOAT == argv[1].a_type) {
+ path = atom_getsymbol(argv+0);
+ parentlevel = (int)atom_getfloat(argv+1);
+ break;
+ }
+ goto fail;
+ }
+
+ if(path) {
+ file_which_doit(x, path, parentlevel);
+ return;
+ }
+
+ fail:
+ pd_error(x, "bad arguments for %s%smessage to object 'file which'", msg, *msg?" ":"");
+}
+
+
/* ================ [file patchpath] ====================== */
static void file_patchpath_list(t_file_handle*x, t_symbol*s, int argc, t_atom*argv) {
- t_canvas *c = x->x_canvas;
- const char*pathname = 0;
- int i, parentlevel = 0, effectivelevel = 0;
+ const char*msg = s?s->s_name:"";
+ t_canvas *c;
+ const char*path = 0;
+ int parentlevel = 0, effectivelevel = 0;
switch(argc) {
default: goto fail;
@@ -1186,7 +1244,7 @@ static void file_patchpath_list(t_file_handle*x, t_symbol*s, int argc, t_atom*ar
case 1:
switch(argv->a_type) {
case(A_SYMBOL):
- pathname = atom_getsymbol(argv)->s_name;
+ path = atom_getsymbol(argv)->s_name;
break;
case (A_FLOAT):
parentlevel = (int)atom_getfloat(argv);
@@ -1196,25 +1254,18 @@ static void file_patchpath_list(t_file_handle*x, t_symbol*s, int argc, t_atom*ar
break;
case 2:
if(A_SYMBOL == argv[0].a_type && A_FLOAT == argv[1].a_type) {
- pathname = atom_getsymbol(argv+0)->s_name;
+ path = atom_getsymbol(argv+0)->s_name;
parentlevel = (int)atom_getfloat(argv+1);
break;
}
goto fail;
}
- for (i = 0; i < parentlevel; i++)
- {
- while (!c->gl_env) /* back up to containing canvas or abstraction */
- c = c->gl_owner;
- if (c->gl_owner) /* back up one more into an owner if any */
- {
- c = c->gl_owner;
- effectivelevel++;
- }
- }
- if (pathname)
+ c = do_getparentcanvas(x, parentlevel, &effectivelevel);
+ if (path)
{
+ char pathname[MAXPDSTRING-1];
+ do_expandunbash(path, pathname, MAXPDSTRING-1);
if(sys_isabsolutepath(pathname))
{
s = gensym(pathname);
@@ -1234,7 +1285,7 @@ static void file_patchpath_list(t_file_handle*x, t_symbol*s, int argc, t_atom*ar
return;
fail:
- pd_error(x, "bad arguments for message to object 'file patchpath'");
+ pd_error(x, "bad arguments for %s%smessage to object 'file patchpath'", msg, *msg?" ":"");
}
/* ================ [file mkdir] ====================== */
@@ -1327,7 +1378,6 @@ static int file_do_delete_recursive(const char*pathname) {
static void file_delete_symbol(t_file_handle*x, t_symbol*path) {
char pathname[MAXPDSTRING];
-
do_expandunbash(path->s_name, pathname, MAXPDSTRING);
if(sys_remove(pathname)) {
@@ -1342,7 +1392,6 @@ static void file_delete_symbol(t_file_handle*x, t_symbol*path) {
static void file_delete_recursive(t_file_handle*x, t_symbol*path) {
char pathname[MAXPDSTRING];
-
do_expandunbash(path->s_name, pathname, MAXPDSTRING);
if(file_do_delete_recursive(pathname)) {
@@ -1507,13 +1556,15 @@ static void file_cwd_bang(t_file_handle*x) {
}
}
static void file_cwd_symbol(t_file_handle*x, t_symbol*path) {
- if(!sys_chdir(path->s_name)) {
+ char pathname[MAXPDSTRING];
+ do_expandunbash(path->s_name, pathname, MAXPDSTRING);
+ if(!sys_chdir(pathname)) {
file_cwd_bang(x);
} else {
if(x->x_verbose) {
char buf[MAXPDSTRING];
pd_error(x, "could not change the working directory to '%s': %s",
- path->s_name, do_errmsg(buf, MAXPDSTRING));
+ pathname, do_errmsg(buf, MAXPDSTRING));
}
outlet_bang(x->x_infoout);
}
@@ -1868,7 +1919,8 @@ void x_file_setup(void)
class_addlist(file_handle_class, file_handle_list);
/* [file which] */
- file_which_class = file_class_new("file which", file_which_new, 0, file_which_symbol, VERBOSE);
+ file_which_class = file_class_new("file which", file_which_new, 0, 0, VERBOSE);
+ class_addlist(file_which_class, file_which_list);
/* [file patchpath] */
file_patchpath_class = file_class_new("file patchpath", file_patchpath_new, 0, 0, VERBOSE);
From 470a96dec7341c92be130f160f2d32ef1256a641 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Thu, 14 Dec 2023 22:27:30 +0100
Subject: [PATCH 046/450] remember last successfull dir for [savepenal] and
[openpanel]
Closes: https://github.com/pure-data/pure-data/issues/1018
later check the redundancy of ::pd::private::lastopendir vs ::fileopendir
for now the assumption is:
- ::pd::private::lastopendir is a private variable for the pdtk_openpanel proc
- ::fileopendir is a global variable for whatever
---
tcl/wheredoesthisgo.tcl | 31 +++++++++++++++++++++++++------
1 file changed, 25 insertions(+), 6 deletions(-)
diff --git a/tcl/wheredoesthisgo.tcl b/tcl/wheredoesthisgo.tcl
index 4c064f890..0940a94ca 100644
--- a/tcl/wheredoesthisgo.tcl
+++ b/tcl/wheredoesthisgo.tcl
@@ -1,6 +1,13 @@
package provide wheredoesthisgo 0.1
+namespace eval ::pd::private:: {
+ # these are some private variables for which there is
+ # no more specific namespace yet...
+ variable lastsavedir ""
+ variable lastopendir ""
+}
+
# a place to temporarily store things until they find a home or go away
proc open_file {filename} {
@@ -30,12 +37,16 @@ proc open_file {filename} {
# procs for panels (openpanel, savepanel)
proc pdtk_openpanel {target localdir {mode 0}} {
- if {! [file isdirectory $localdir]} {
+ if { $::pd::private::lastopendir == "" } {
if { ! [file isdirectory $::fileopendir]} {
set ::fileopendir $::env(HOME)
}
- set localdir $::fileopendir
+ set ::pd::private::lastopendir $::fileopendir
}
+ if {! [file isdirectory $localdir]} {
+ set localdir $::pd::private::lastopendir
+ }
+
# 0: file, 1: directory, 2: multiple files
switch $mode {
0 { set result [tk_getOpenFile -initialdir $localdir] }
@@ -46,28 +57,36 @@ proc pdtk_openpanel {target localdir {mode 0}} {
if {$result ne ""} {
if { $mode == 2 } {
# 'result' is a list
- set ::fileopendir [file dirname [lindex $result 0]]
+ set ::pd::private::lastopendir [file dirname [lindex $result 0]]
+ set ::fileopendir $::pd::private::lastopendir
set args {}
foreach path $result {
lappend args [enquote_path $path]
}
pdsend "$target callback [join $args]"
} else {
- set ::fileopendir [expr {$mode == 0 ? [file dirname $result] : $result}]
+ set ::pd::private::lastopendir [expr {$mode == 0 ? [file dirname $result] : $result}]
+ set ::fileopendir $::pd::private::lastopendir
pdsend "$target callback [enquote_path $result]"
}
}
}
+
proc pdtk_savepanel {target localdir} {
- if {! [file isdirectory $localdir]} {
+ if { $::pd::private::lastsavedir == "" } {
if { ! [file isdirectory $::filenewdir]} {
set ::filenewdir $::env(HOME)
}
- set localdir $::filenewdir
+ set ::pd::private::lastsavedir $::filenewdir
}
+ if {! [file isdirectory $localdir]} {
+ set localdir $::pd::private::lastsavedir
+ }
+
set filename [tk_getSaveFile -initialdir $localdir]
if {$filename ne ""} {
+ set ::pd::private::lastsavedir [file dirname $filename]
pdsend "$target callback [enquote_path $filename]"
}
}
From ec0fb4db4629f04095701894e8124f144e9f330e Mon Sep 17 00:00:00 2001
From: Christof Ressi
Date: Mon, 11 Dec 2023 02:05:51 +0100
Subject: [PATCH 047/450] Add pd_[v]snprintf() functions as a safe and
cross-platform alternative to [v]snprintf()
The functions are declared in 'm_private_utils.h' and defined in 's_print.c'
For a detailed explanation, see the comment above pd_vsnprintf() in 's_printf.c'.
---
extra/pd~/pd~.c | 40 ++++++++++++++----------
src/g_all_guis.c | 6 ++--
src/g_canvas.c | 12 ++++----
src/m_binbuf.c | 8 ++---
src/m_class.c | 2 +-
src/m_obj.c | 5 +--
src/m_private_utils.h | 7 -----
src/s_audio_mmio.c | 4 +--
src/s_audio_pa.c | 8 ++---
src/s_file.c | 28 ++++++++---------
src/s_inter.c | 21 ++++++-------
src/s_loader.c | 8 ++---
src/s_print.c | 72 +++++++++++++++++++++++++++++++++++++------
src/s_stuff.h | 4 +++
src/x_file.c | 9 +++---
src/x_gui.c | 3 +-
16 files changed, 147 insertions(+), 90 deletions(-)
diff --git a/extra/pd~/pd~.c b/extra/pd~/pd~.c
index 36a872442..e4a1bcced 100644
--- a/extra/pd~/pd~.c
+++ b/extra/pd~/pd~.c
@@ -34,7 +34,6 @@ typedef int socklen_t;
#ifdef _MSC_VER
#pragma warning (disable: 4305 4244)
-#define snprintf _snprintf
#define stat _stat
#endif
@@ -87,6 +86,13 @@ void critical_exit(int z);
#include "s_stuff.h"
static t_class *pd_tilde_class;
#define PDERROR pd_error(x,
+#else
+#ifdef _MSC_VER
+/* Sorry, MSP! */
+#define pd_snprintf _snprintf
+#else
+#define pd_snprintf snprintf
+#endif
#endif
#if defined(__x86_64__) || defined(_M_X64)
@@ -559,15 +565,15 @@ static void pd_tilde_dostart(t_pd_tilde *x, const char *pddir,
sprintf(ninsigstr, "%d", ninsig);
sprintf(noutsigstr, "%d", noutsig);
sprintf(sampleratestr, "%f", (float)samplerate);
- snprintf(tmpbuf, MAXPDSTRING, "%s/bin/pd" EXTENT, pddir);
+ pd_snprintf(tmpbuf, MAXPDSTRING, "%s/bin/pd" EXTENT, pddir);
sys_bashfilename(tmpbuf, pdexecbuf);
if (stat(pdexecbuf, &statbuf) < 0)
{
- snprintf(tmpbuf, MAXPDSTRING, "%s/../../../bin/pd" EXTENT, pddir);
+ pd_snprintf(tmpbuf, MAXPDSTRING, "%s/../../../bin/pd" EXTENT, pddir);
sys_bashfilename(tmpbuf, pdexecbuf);
if (stat(pdexecbuf, &statbuf) < 0)
{
- snprintf(tmpbuf, MAXPDSTRING, "%s/pd" EXTENT, pddir);
+ pd_snprintf(tmpbuf, MAXPDSTRING, "%s/pd" EXTENT, pddir);
sys_bashfilename(tmpbuf, pdexecbuf);
if (stat(pdexecbuf, &statbuf) < 0)
{
@@ -579,7 +585,7 @@ static void pd_tilde_dostart(t_pd_tilde *x, const char *pddir,
/* check that the scheduler dynamic linkable exists w either suffix */
for(dllextent=get_dllextent(); *dllextent; dllextent++)
{
- snprintf(tmpbuf, MAXPDSTRING, "%s/pdsched%s", schedlibdir, *dllextent);
+ pd_snprintf(tmpbuf, MAXPDSTRING, "%s/pdsched%s", schedlibdir, *dllextent);
sys_bashfilename(tmpbuf, schedbuf);
if (stat(schedbuf, &statbuf) >= 0)
goto gotone;
@@ -589,33 +595,33 @@ static void pd_tilde_dostart(t_pd_tilde *x, const char *pddir,
gotone:
/* but the sub-process wants the scheduler name without the suffix */
- snprintf(tmpbuf, MAXPDSTRING, "%s/pdsched", schedlibdir);
+ pd_snprintf(tmpbuf, MAXPDSTRING, "%s/pdsched", schedlibdir);
sys_bashfilename(tmpbuf, schedbuf);
- /* was: snprintf(cmdbuf, MAXPDSTRING,
+ /* was: pd_snprintf(cmdbuf, MAXPDSTRING,
"'%s' -schedlib '%s'/pdsched -path '%s' -inchannels %d -outchannels %d -r \
%g %s\n",
pdexecbuf, schedlibdir, patchdir, ninsig, noutsig, samplerate, pdargs);
*/
- snprintf(cmdbuf, MAXPDSTRING, "%s", pdexecbuf);
+ pd_snprintf(cmdbuf, MAXPDSTRING, "%s", pdexecbuf);
#ifdef _WIN32
/* _spawnv wants the command without quotes as in cmdbuf above;
but in the argument vector paths must be quoted if they contain
whitespace */
if (strchr(pdexecbuf, ' ') && *pdexecbuf != '"' && *pdexecbuf != '\'')
{
- if (snprintf(tmpbuf, MAXPDSTRING, "\"%s\"", pdexecbuf) >= 0)
- snprintf(pdexecbuf, MAXPDSTRING, "%s", tmpbuf);
+ if (pd_snprintf(tmpbuf, MAXPDSTRING, "\"%s\"", pdexecbuf) >= 0)
+ pd_snprintf(pdexecbuf, MAXPDSTRING, "%s", tmpbuf);
}
if (strchr(schedbuf, ' ') && *schedbuf != '"' && *schedbuf != '\'')
{
- if (snprintf(tmpbuf, MAXPDSTRING, "\"%s\"", schedbuf) >= 0)
- snprintf(schedbuf, MAXPDSTRING, "%s", tmpbuf);
+ if (pd_snprintf(tmpbuf, MAXPDSTRING, "\"%s\"", schedbuf) >= 0)
+ pd_snprintf(schedbuf, MAXPDSTRING, "%s", tmpbuf);
}
if (strchr(patchdir_c, ' ') && *patchdir_c != '"' && *patchdir_c != '\'')
- snprintf(patchdir, MAXPDSTRING, "\"%s\"", patchdir_c);
+ pd_snprintf(patchdir, MAXPDSTRING, "\"%s\"", patchdir_c);
else
#endif /* _WIN32 */
- snprintf(patchdir, MAXPDSTRING, "%s", patchdir_c);
+ pd_snprintf(patchdir, MAXPDSTRING, "%s", patchdir_c);
execargv[0] = pdexecbuf;
execargv[1] = "-schedlib";
@@ -636,7 +642,7 @@ static void pd_tilde_dostart(t_pd_tilde *x, const char *pddir,
{
#ifdef PD
if (argv[i].a_type == A_SYMBOL)
- snprintf(tmpbuf, MAXPDSTRING, "%s", argv[i].a_w.w_symbol->s_name);
+ pd_snprintf(tmpbuf, MAXPDSTRING, "%s", argv[i].a_w.w_symbol->s_name);
else if (argv[i].a_type == A_FLOAT)
sprintf(tmpbuf, "%f", (float)argv[i].a_w.w_float);
#endif
@@ -657,8 +663,8 @@ static void pd_tilde_dostart(t_pd_tilde *x, const char *pddir,
if (strchr(tmpbuf, ' ') && *tmpbuf != '"' && *tmpbuf != '\'')
{
char nutherbuf[MAXPDSTRING];
- snprintf(nutherbuf, MAXPDSTRING, "\"%s\"", tmpbuf);
- snprintf(tmpbuf, MAXPDSTRING, "%s", nutherbuf);
+ pd_snprintf(nutherbuf, MAXPDSTRING, "\"%s\"", tmpbuf);
+ pd_snprintf(tmpbuf, MAXPDSTRING, "%s", nutherbuf);
}
#endif /* _WIN32 */
execargv[FIXEDARG+i] = malloc(strlen(tmpbuf) + 1);
diff --git a/src/g_all_guis.c b/src/g_all_guis.c
index 1de66d752..e915e2a71 100644
--- a/src/g_all_guis.c
+++ b/src/g_all_guis.c
@@ -311,9 +311,9 @@ static t_symbol* color2symbol(int col) {
{
/* compatibility with Pd<=0.47: saves colors as numbers with limited resolution */
int col2 = -1 - (((0xfc0000 & col) >> 6)|((0xfc00 & col) >> 4)|((0xfc & col) >> 2));
- snprintf(colname, MAXPDSTRING-1, "%d", col2);
+ pd_snprintf(colname, MAXPDSTRING-1, "%d", col2);
} else {
- snprintf(colname, MAXPDSTRING-1, "#%06x", col);
+ pd_snprintf(colname, MAXPDSTRING-1, "#%06x", col);
}
return gensym(colname);
}
@@ -822,7 +822,7 @@ int iemgui_dialog(t_iemgui *iemgui, t_symbol **srl, int argc, t_atom *argv)
void iemgui_setdialogatoms(t_iemgui *iemgui, int argc, t_atom*argv)
{
-#define SETCOLOR(a, col) do {char color[MAXPDSTRING]; snprintf(color, MAXPDSTRING-1, "#%06x", 0xffffff & col); color[MAXPDSTRING-1] = 0; SETSYMBOL(a, gensym(color));} while(0)
+#define SETCOLOR(a, col) do {char color[MAXPDSTRING]; pd_snprintf(color, MAXPDSTRING-1, "#%06x", 0xffffff & col); color[MAXPDSTRING-1] = 0; SETSYMBOL(a, gensym(color));} while(0)
t_float zoom = iemgui->x_glist->gl_zoom;
t_symbol *srl[3];
int for_undo = 1;
diff --git a/src/g_canvas.c b/src/g_canvas.c
index a948ed38e..4b5e1a2af 100644
--- a/src/g_canvas.c
+++ b/src/g_canvas.c
@@ -687,7 +687,7 @@ static void canvas_dosetbounds(t_canvas *x, int x1, int y1, int x2, int y2)
t_symbol *canvas_makebindsym(t_symbol *s)
{
char buf[MAXPDSTRING];
- snprintf(buf, MAXPDSTRING-1, "pd-%s", s->s_name);
+ pd_snprintf(buf, MAXPDSTRING-1, "pd-%s", s->s_name);
buf[MAXPDSTRING-1] = 0;
return (gensym(buf));
}
@@ -1669,7 +1669,7 @@ static void canvas_path(t_canvas *x, t_canvasenvironment *e, const char *path)
/* check whether the given subdir is in one of the user search-paths */
for (nl=STUFF->st_searchpath; nl; nl=nl->nl_next)
{
- snprintf(strbuf, MAXPDSTRING-1, "%s/%s/", nl->nl_string, path);
+ pd_snprintf(strbuf, MAXPDSTRING-1, "%s/%s/", nl->nl_string, path);
strbuf[MAXPDSTRING-1]=0;
if (check_exists(strbuf))
{
@@ -1681,7 +1681,7 @@ static void canvas_path(t_canvas *x, t_canvasenvironment *e, const char *path)
/* check whether the given subdir is in one of the standard-paths */
for (nl=STUFF->st_staticpath; nl; nl=nl->nl_next)
{
- snprintf(strbuf, MAXPDSTRING-1, "%s/%s/", nl->nl_string, path);
+ pd_snprintf(strbuf, MAXPDSTRING-1, "%s/%s/", nl->nl_string, path);
strbuf[MAXPDSTRING-1]=0;
if (check_exists(strbuf))
{
@@ -1715,7 +1715,7 @@ static void canvas_lib(t_canvas *x, t_canvasenvironment *e, const char *lib)
/* check whether the given lib is located in one of the user search-paths */
for (nl=STUFF->st_searchpath; nl; nl=nl->nl_next)
{
- snprintf(strbuf, MAXPDSTRING-1, "%s/%s", nl->nl_string, lib);
+ pd_snprintf(strbuf, MAXPDSTRING-1, "%s/%s", nl->nl_string, lib);
strbuf[MAXPDSTRING-1]=0;
if (sys_load_lib(x, strbuf))
return;
@@ -1747,7 +1747,7 @@ static void canvas_stdpath(t_canvasenvironment *e, const char *stdpath)
/* check whether the given subdir is in one of the standard-paths */
for (nl=STUFF->st_staticpath; nl; nl=nl->nl_next)
{
- snprintf(strbuf, MAXPDSTRING-1, "%s/%s/", nl->nl_string, stdpath);
+ pd_snprintf(strbuf, MAXPDSTRING-1, "%s/%s/", nl->nl_string, stdpath);
strbuf[MAXPDSTRING-1]=0;
if (check_exists(strbuf))
{
@@ -1778,7 +1778,7 @@ static void canvas_stdlib(t_canvasenvironment *e, const char *stdlib)
/* check whether the given lib is located in one of the standard-paths */
for (nl=STUFF->st_staticpath; nl; nl=nl->nl_next)
{
- snprintf(strbuf, MAXPDSTRING-1, "%s/%s", nl->nl_string, stdlib);
+ pd_snprintf(strbuf, MAXPDSTRING-1, "%s/%s", nl->nl_string, stdlib);
strbuf[MAXPDSTRING-1]=0;
if (sys_load_lib(0, strbuf))
return;
diff --git a/src/m_binbuf.c b/src/m_binbuf.c
index e1e54c49b..e63744782 100644
--- a/src/m_binbuf.c
+++ b/src/m_binbuf.c
@@ -796,9 +796,9 @@ int binbuf_read(t_binbuf *b, const char *filename, const char *dirname, int crfl
char namebuf[MAXPDSTRING];
if (*dirname)
- snprintf(namebuf, MAXPDSTRING-1, "%s/%s", dirname, filename);
+ pd_snprintf(namebuf, MAXPDSTRING-1, "%s/%s", dirname, filename);
else
- snprintf(namebuf, MAXPDSTRING-1, "%s", filename);
+ pd_snprintf(namebuf, MAXPDSTRING-1, "%s", filename);
namebuf[MAXPDSTRING-1] = 0;
if ((fd = sys_open(namebuf, 0)) < 0)
@@ -893,9 +893,9 @@ int binbuf_write(const t_binbuf *x, const char *filename, const char *dir, int c
int indx;
if (*dir)
- snprintf(fbuf, MAXPDSTRING-1, "%s/%s", dir, filename);
+ pd_snprintf(fbuf, MAXPDSTRING-1, "%s/%s", dir, filename);
else
- snprintf(fbuf, MAXPDSTRING-1, "%s", filename);
+ pd_snprintf(fbuf, MAXPDSTRING-1, "%s", filename);
fbuf[MAXPDSTRING-1] = 0;
if (!strcmp(filename + strlen(filename) - 4, ".pat") ||
diff --git a/src/m_class.c b/src/m_class.c
index 9e98c1fa2..6a1a3dda3 100644
--- a/src/m_class.c
+++ b/src/m_class.c
@@ -123,7 +123,7 @@ static void class_addmethodtolist(t_class *c, t_methodentry **methodlist,
if (sel && (*methodlist)[i].me_name == sel)
{
char nbuf[80];
- snprintf(nbuf, 80, "%s_aliased", sel->s_name);
+ pd_snprintf(nbuf, 80, "%s_aliased", sel->s_name);
nbuf[79] = 0;
(*methodlist)[i].me_name = dogensym(nbuf, 0, pdinstance);
if (c == pd_objectmaker)
diff --git a/src/m_obj.c b/src/m_obj.c
index d3259da06..bbfc16d71 100644
--- a/src/m_obj.c
+++ b/src/m_obj.c
@@ -8,6 +8,7 @@ behavior for "gobjs" appears at the end of this file. */
#include "m_pd.h"
#include "m_imp.h"
+#include "s_stuff.h"
#include
#include "m_private_utils.h"
@@ -400,14 +401,14 @@ static void backtracer_printmsg(t_pd *who, t_symbol *s,
{
char msgbuf[104];
int nprint = (argc > NARGS ? NARGS : argc), nchar, i;
- snprintf(msgbuf, 100, "%s: %s ", class_getname(*who), s->s_name);
+ pd_snprintf(msgbuf, 100, "%s: %s ", class_getname(*who), s->s_name);
nchar = strlen(msgbuf);
for (i = 0; i < nprint && nchar < 100; i++)
if (nchar < 100)
{
char buf[100];
atom_string(&argv[i], buf, 100);
- snprintf(msgbuf + nchar, 100-nchar, " %s", buf);
+ pd_snprintf(msgbuf + nchar, 100-nchar, " %s", buf);
nchar = strlen(msgbuf);
}
if (argc > nprint && nchar < 100)
diff --git a/src/m_private_utils.h b/src/m_private_utils.h
index c9ace345e..589791f68 100644
--- a/src/m_private_utils.h
+++ b/src/m_private_utils.h
@@ -107,11 +107,4 @@
# endif
#endif
-
-/* -------------------------MSVC compat defines --------------------- */
-#ifdef _MSC_VER
-# define snprintf _snprintf
-#endif
-
-
#endif /* M_PRIVATE_UTILS_H */
diff --git a/src/s_audio_mmio.c b/src/s_audio_mmio.c
index e30b76925..c61ae9449 100644
--- a/src/s_audio_mmio.c
+++ b/src/s_audio_mmio.c
@@ -784,7 +784,7 @@ void mmio_getdevs(char *indevlist, int *nindevs,
wRtn = waveInGetDevCaps(i, (LPWAVEINCAPS) &wicap, sizeof(wicap));
if (!wRtn)
u8_nativetoutf8(utf8device, MAXPDSTRING, wicap.szPname, -1);
- _snprintf(indevlist + i * devdescsize, devdescsize, "%s",
+ pd_snprintf(indevlist + i * devdescsize, devdescsize, "%s",
(wRtn ? "???" : utf8device));
indevlist[(i+1) * devdescsize - 1] = 0;
}
@@ -799,7 +799,7 @@ void mmio_getdevs(char *indevlist, int *nindevs,
wRtn = waveOutGetDevCaps(i, (LPWAVEOUTCAPS) &wocap, sizeof(wocap));
if (!wRtn)
u8_nativetoutf8(utf8device, MAXPDSTRING, wocap.szPname, -1);
- _snprintf(outdevlist + i * devdescsize, devdescsize, "%s",
+ pd_snprintf(outdevlist + i * devdescsize, devdescsize, "%s",
(wRtn ? "???" : utf8device));
outdevlist[(i+1) * devdescsize - 1] = 0;
}
diff --git a/src/s_audio_pa.c b/src/s_audio_pa.c
index 7a3ec03f3..3424ae80f 100644
--- a/src/s_audio_pa.c
+++ b/src/s_audio_pa.c
@@ -709,10 +709,10 @@ static char*pdi2devname(const PaDeviceInfo*pdi, char*buf, size_t bufsize) {
api = Pa_GetHostApiInfo(pdi->hostApi);
if(api)
- snprintf(utf8device, MAXPDSTRING, "%s: %s",
+ pd_snprintf(utf8device, MAXPDSTRING, "%s: %s",
api->name, pdi->name);
else
- snprintf(utf8device, MAXPDSTRING, "%s",
+ pd_snprintf(utf8device, MAXPDSTRING, "%s",
pdi->name);
u8_nativetoutf8(buf, bufsize, utf8device, MAXPDSTRING);
@@ -738,13 +738,13 @@ void pa_getdevs(char *indevlist, int *nindevs,
if (pdi->maxInputChannels > 0 && nin < maxndev)
{
/* LATER figure out how to get API name correctly */
- snprintf(indevlist + nin * devdescsize, devdescsize,
+ pd_snprintf(indevlist + nin * devdescsize, devdescsize,
"%s", devname);
nin++;
}
if (pdi->maxOutputChannels > 0 && nout < maxndev)
{
- snprintf(outdevlist + nout * devdescsize, devdescsize,
+ pd_snprintf(outdevlist + nout * devdescsize, devdescsize,
"%s", devname);
nout++;
}
diff --git a/src/s_file.c b/src/s_file.c
index d42cb2fc8..1dcc64674 100644
--- a/src/s_file.c
+++ b/src/s_file.c
@@ -141,9 +141,9 @@ static int preferences_getloadpath(char *dst, size_t size)
char user_prefs[MAXPDSTRING];
char *homedir = getenv("HOME");
struct stat statbuf;
- snprintf(embedded_prefs, MAXPDSTRING, "%s/../org.puredata.pd",
+ pd_snprintf(embedded_prefs, MAXPDSTRING, "%s/../org.puredata.pd",
sys_libdir->s_name);
- snprintf(user_prefs, MAXPDSTRING,
+ pd_snprintf(user_prefs, MAXPDSTRING,
"%s/Library/Preferences/org.puredata.pd.plist", homedir);
if (stat(user_prefs, &statbuf) == 0)
{
@@ -161,7 +161,7 @@ static int preferences_getloadpath(char *dst, size_t size)
static void preferences_getsavepath(char *dst, size_t size)
{
char user_prefs[MAXPDSTRING];
- snprintf(user_prefs, MAXPDSTRING,
+ pd_snprintf(user_prefs, MAXPDSTRING,
"%s/Library/Preferences/org.puredata.pd.plist", getenv("HOME"));
strncpy(dst, user_prefs, size);
}
@@ -326,10 +326,10 @@ static int sys_getpreference(const char *key, char *value, int size)
char path[MAXPDSTRING];
int embedded = preferences_getloadpath(path, MAXPDSTRING);
if (embedded)
- snprintf(cmdbuf, 256, "defaults read %s %s 2> /dev/null\n",
+ pd_snprintf(cmdbuf, 256, "defaults read %s %s 2> /dev/null\n",
path, key);
else
- snprintf(cmdbuf, 256, "defaults read org.puredata.pd %s 2> /dev/null\n",
+ pd_snprintf(cmdbuf, 256, "defaults read org.puredata.pd %s 2> /dev/null\n",
key);
FILE *fp = popen(cmdbuf, "r");
while (nread < size)
@@ -373,7 +373,7 @@ static void sys_putpreference(const char *key, const char *value)
else {
/* fallback to defaults command */
char cmdbuf[MAXPDSTRING];
- snprintf(cmdbuf, MAXPDSTRING,
+ pd_snprintf(cmdbuf, MAXPDSTRING,
"defaults write org.puredata.pd %s \"%s\" 2> /dev/null\n", key, value);
system(cmdbuf);
}
@@ -410,15 +410,15 @@ static void sys_initsavepreferences(void)
{
for (j = 0; j < maxnum[i]; j++)
{
- snprintf(buf, sizeof(buf), "%sdev%d", key[i], j + 1);
- snprintf(devname, sizeof(devname), "%sdevname%d", key[i], j + 1);
+ pd_snprintf(buf, sizeof(buf), "%sdev%d", key[i], j + 1);
+ pd_snprintf(devname, sizeof(devname), "%sdevname%d", key[i], j + 1);
if (!sys_deletepreference(buf) || !sys_deletepreference(devname))
break;
}
}
for (i = 0; ; i++)
{
- snprintf(buf, sizeof(buf), "path%d", i + 1);
+ pd_snprintf(buf, sizeof(buf), "path%d", i + 1);
if (!sys_deletepreference(buf))
break;
}
@@ -515,9 +515,9 @@ static void sys_initloadpreferences(void)
char default_prefs_file[MAXPDSTRING];
struct stat statbuf;
- snprintf(default_prefs_file, MAXPDSTRING, "%s/default.pdsettings",
+ pd_snprintf(default_prefs_file, MAXPDSTRING, "%s/default.pdsettings",
sys_libdir->s_name);
- snprintf(user_prefs_file, MAXPDSTRING, "%s/.pdsettings",
+ pd_snprintf(user_prefs_file, MAXPDSTRING, "%s/.pdsettings",
(homedir ? homedir : "."));
if (stat(user_prefs_file, &statbuf) == 0)
strncpy(filenamebuf, user_prefs_file, MAXPDSTRING);
@@ -546,7 +546,7 @@ static void sys_initsavepreferences(void)
if (!homedir)
return;
- snprintf(filenamebuf, MAXPDSTRING, "%s/.pdsettings", homedir);
+ pd_snprintf(filenamebuf, MAXPDSTRING, "%s/.pdsettings", homedir);
filenamebuf[MAXPDSTRING-1] = 0;
sys_initsavepreferences_file(filenamebuf);
}
@@ -891,7 +891,7 @@ void glob_forgetpreferences(t_pd *dummy)
char user_prefs_file[MAXPDSTRING]; /* user prefs file */
const char *homedir = getenv("HOME");
struct stat statbuf;
- snprintf(user_prefs_file, MAXPDSTRING, "%s/.pdsettings",
+ pd_snprintf(user_prefs_file, MAXPDSTRING, "%s/.pdsettings",
(homedir ? homedir : "."));
user_prefs_file[MAXPDSTRING-1] = 0;
if (stat(user_prefs_file, &statbuf) != 0) {
@@ -908,7 +908,7 @@ void glob_forgetpreferences(t_pd *dummy)
if (!sys_getpreference("audioapi", cmdbuf, MAXPDSTRING))
post("no Pd settings to clear"), warn = 0;
/* do it anyhow, why not... */
- snprintf(cmdbuf, MAXPDSTRING,
+ pd_snprintf(cmdbuf, MAXPDSTRING,
"defaults delete org.puredata.pd 2> /dev/null\n");
if (system(cmdbuf) && warn)
post("failed to erase Pd settings");
diff --git a/src/s_inter.c b/src/s_inter.c
index adf82f8a5..9b1cc2631 100644
--- a/src/s_inter.c
+++ b/src/s_inter.c
@@ -820,7 +820,7 @@ void sys_vgui(const char *fmt, ...)
sys_trytogetmoreguibuf(INTER->i_guisize + GUI_ALLOCCHUNK);
}
va_start(ap, fmt);
- msglen = vsnprintf(
+ msglen = pd_vsnprintf(
INTER->i_guibuf + INTER->i_guihead,
INTER->i_guisize - INTER->i_guihead,
fmt, ap);
@@ -828,19 +828,18 @@ void sys_vgui(const char *fmt, ...)
if(msglen < 0)
{
fprintf(stderr,
- "Pd: buffer space wasn't sufficient for long GUI string\n");
+ "sys_vgui: pd_snprintf() failed with error code %d\n", errno);
return;
}
if (msglen >= INTER->i_guisize - INTER->i_guihead)
{
int msglen2, newsize =
INTER->i_guisize
- + 1
- + (msglen > GUI_ALLOCCHUNK ? msglen : GUI_ALLOCCHUNK);
+ + (msglen < GUI_ALLOCCHUNK ? GUI_ALLOCCHUNK : msglen + 1);
sys_trytogetmoreguibuf(newsize);
va_start(ap, fmt);
- msglen2 = vsnprintf(
+ msglen2 = pd_vsnprintf(
INTER->i_guibuf + INTER->i_guihead,
INTER->i_guisize - INTER->i_guihead,
fmt, ap);
@@ -1240,7 +1239,7 @@ static void init_deken_arch(void)
cpu_v--)
{
static char cpuname[CPUNAME_SIZE+1];
- snprintf(cpuname, CPUNAME_SIZE, "armv%d%c", cpu_v, endianness);
+ pd_snprintf(cpuname, CPUNAME_SIZE, "armv%d%c", cpu_v, endianness);
deken_CPU[n++] = gensym(cpuname)->s_name;
}
}
@@ -1265,7 +1264,7 @@ const char*sys_deken_specifier(char*buf, size_t bufsize, int float_agnostic, int
if ((cpu>=0) && (((!deken_CPU) || (cpu >= (sizeof(deken_CPU)/sizeof(*deken_CPU))) || (!deken_CPU[cpu]))))
return 0;
- snprintf(buf, bufsize-1,
+ pd_snprintf(buf, bufsize-1,
"%s-%s-%d", deken_OS, (cpu<0)?"fat":deken_CPU[cpu], (int)((float_agnostic?0:8) * sizeof(t_float)));
buf[bufsize-1] = 0;
@@ -1544,13 +1543,13 @@ static int sys_do_startgui(const char *libdir)
#else /* NOT _WIN32 */
/* fprintf(stderr, "%s\n", libdir); */
- snprintf(wishbuf, sizeof(wishbuf), "%s/" PDBINDIR WISH, libdir);
+ pd_snprintf(wishbuf, sizeof(wishbuf), "%s/" PDBINDIR WISH, libdir);
sys_bashfilename(wishbuf, wishbuf);
- snprintf(scriptbuf, sizeof(scriptbuf), "%s/" PDGUIDIR "/pd-gui.tcl", libdir);
+ pd_snprintf(scriptbuf, sizeof(scriptbuf), "%s/" PDGUIDIR "/pd-gui.tcl", libdir);
sys_bashfilename(scriptbuf, scriptbuf);
- snprintf(cmdbuf, sizeof(cmdbuf), "%s \"%s\" %d", /* quote script path! */
+ pd_snprintf(cmdbuf, sizeof(cmdbuf), "%s \"%s\" %d", /* quote script path! */
WISH, scriptbuf, portno);
memset(&si, 0, sizeof(si));
@@ -1637,7 +1636,7 @@ void sys_setrealtime(const char *libdir)
if (sys_hipriority == -1)
sys_hipriority = 1;
- snprintf(cmdbuf, MAXPDSTRING, "%s/bin/pd-watchdog", libdir);
+ pd_snprintf(cmdbuf, MAXPDSTRING, "%s/bin/pd-watchdog", libdir);
cmdbuf[MAXPDSTRING-1] = 0;
if (sys_hipriority)
{
diff --git a/src/s_loader.c b/src/s_loader.c
index 0aef37259..4ed19a095 100644
--- a/src/s_loader.c
+++ b/src/s_loader.c
@@ -129,7 +129,7 @@ static char*add_deken_extension(const char*systemext, int float_agnostic, int cp
return 0;
ext[MAXPDSTRING-1] = 0;
- if(snprintf(ext, MAXPDSTRING-1, ".%s%s", extbuf, systemext) > 0)
+ if(pd_snprintf(ext, MAXPDSTRING-1, ".%s%s", extbuf, systemext) > 0)
add_dllextension(ext);
else
{
@@ -535,7 +535,7 @@ int sys_run_scheduler(const char *externalschedlibname,
for(dllextent=sys_get_dllextensions(); *dllextent; dllextent++)
{
struct stat statbuf;
- snprintf(filename, sizeof(filename), "%s%s", externalschedlibname,
+ pd_snprintf(filename, sizeof(filename), "%s%s", externalschedlibname,
*dllextent);
sys_bashfilename(filename, filename);
if(!stat(filename, &statbuf))
@@ -604,7 +604,7 @@ static t_pd *do_create_abstraction(t_symbol*s, int argc, t_atom *argv)
int fd = -1;
t_pd *was = s__X.s_thing;
- snprintf(classslashclass, MAXPDSTRING, "%s/%s", objectname, objectname);
+ pd_snprintf(classslashclass, MAXPDSTRING, "%s/%s", objectname, objectname);
if ((fd = canvas_open(canvas, objectname, ".pd",
dirbuf, &nameptr, MAXPDSTRING, 0)) >= 0 ||
(fd = canvas_open(canvas, objectname, ".pat",
@@ -640,7 +640,7 @@ static int sys_do_load_abs(t_canvas *canvas, const char *objectname,
but we have already tried all paths */
if (!path) return (0);
- snprintf(classslashclass, MAXPDSTRING, "%s/%s", objectname, objectname);
+ pd_snprintf(classslashclass, MAXPDSTRING, "%s/%s", objectname, objectname);
if ((fd = sys_trytoopenone(path, objectname, ".pd",
dirbuf, &nameptr, MAXPDSTRING, 1)) >= 0 ||
(fd = sys_trytoopenone(path, objectname, ".pat",
diff --git a/src/s_print.c b/src/s_print.c
index 214e307fe..a48c9fe81 100644
--- a/src/s_print.c
+++ b/src/s_print.c
@@ -14,6 +14,58 @@
t_printhook sys_printhook = NULL;
int sys_printtostderr;
+#ifdef _WIN32
+
+ /* NB: Unlike vsnprintf(), _vsnprintf() does *not* null-terminate
+ the output if the resulting string is too large to fit into the buffer.
+ Also, it just returns -1 instead of the required number of bytes.
+ Strictly speaking, the UCRT in Windows 10 actually contains a standard-
+ conforming vsnprintf() function that is not just an alias for _vsnprintf().
+ However, MinGW traditionally links against the old msvcrt.dll runtime library.
+ Recent versions of MinGW seem to have their own (standard-conformating)
+ implementation of vsnprintf(), but to ensure portability we rather use our
+ own implementation for all Windows builds. */
+int pd_vsnprintf(char *buf, size_t size, const char *fmt, va_list argptr)
+{
+ int ret = _vsnprintf(buf, size, fmt, argptr);
+ if (ret < 0)
+ {
+ /* null-terminate the buffer and get the required number of bytes. */
+ ret = _vscprintf(fmt, argptr);
+ buf[size - 1] = '\0';
+ }
+ return ret;
+}
+
+int pd_snprintf(char *buf, size_t size, const char *fmt, ...)
+{
+ int ret;
+ va_list ap;
+ va_start(ap, fmt);
+ ret = pd_vsnprintf(buf, size, fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
+#else
+
+int pd_vsnprintf(char *buf, size_t size, const char *fmt, va_list argptr)
+{
+ return vsnprintf(buf, size, fmt, argptr);
+}
+
+int pd_snprintf(char *buf, size_t size, const char *fmt, ...)
+{
+ int ret;
+ va_list ap;
+ va_start(ap, fmt);
+ ret = vsnprintf(buf, size, fmt, ap);
+ va_end(ap);
+ return ret;
+}
+
+#endif
+
/* escape characters for tcl/tk */
char* pdgui_strnescape(char *dst, size_t dstlen, const char *src, size_t srclen)
{
@@ -76,7 +128,7 @@ static void doerror(const void *object, const char *s)
// what about sys_printhook_error ?
if (STUFF->st_printhook)
{
- snprintf(upbuf, MAXPDSTRING-1, "error: %s", s);
+ pd_snprintf(upbuf, MAXPDSTRING-1, "error: %s", s);
(*STUFF->st_printhook)(upbuf);
}
else if (sys_printtostderr)
@@ -108,7 +160,7 @@ static void dologpost(const void *object, const int level, const char *s)
// what about sys_printhook_verbose ?
if (STUFF->st_printhook)
{
- snprintf(upbuf, MAXPDSTRING-1, "verbose(%d): %s", level, s);
+ pd_snprintf(upbuf, MAXPDSTRING-1, "verbose(%d): %s", level, s);
(*STUFF->st_printhook)(upbuf);
}
else if (sys_printtostderr)
@@ -135,7 +187,7 @@ void logpost(const void *object, int level, const char *fmt, ...)
va_list ap;
if (level > PD_DEBUG && !sys_verbose) return;
va_start(ap, fmt);
- vsnprintf(buf, MAXPDSTRING-1, fmt, ap);
+ pd_vsnprintf(buf, MAXPDSTRING-1, fmt, ap);
va_end(ap);
strcat(buf, "\n");
@@ -148,7 +200,7 @@ void startlogpost(const void *object, const int level, const char *fmt, ...)
va_list ap;
if (level > PD_DEBUG && !sys_verbose) return;
va_start(ap, fmt);
- vsnprintf(buf, MAXPDSTRING-1, fmt, ap);
+ pd_vsnprintf(buf, MAXPDSTRING-1, fmt, ap);
va_end(ap);
dologpost(object, level, buf);
@@ -162,7 +214,7 @@ void post(const char *fmt, ...)
t_int arg[8];
int i;
va_start(ap, fmt);
- vsnprintf(buf, MAXPDSTRING-1, fmt, ap);
+ pd_vsnprintf(buf, MAXPDSTRING-1, fmt, ap);
va_end(ap);
strcat(buf, "\n");
@@ -176,7 +228,7 @@ void startpost(const char *fmt, ...)
t_int arg[8];
int i;
va_start(ap, fmt);
- vsnprintf(buf, MAXPDSTRING-1, fmt, ap);
+ pd_vsnprintf(buf, MAXPDSTRING-1, fmt, ap);
va_end(ap);
dopost(buf);
@@ -229,7 +281,7 @@ EXTERN void error(const char *fmt, ...)
int i;
va_start(ap, fmt);
- vsnprintf(buf, MAXPDSTRING-1, fmt, ap);
+ pd_vsnprintf(buf, MAXPDSTRING-1, fmt, ap);
va_end(ap);
strcat(buf, "\n");
@@ -246,7 +298,7 @@ void verbose(int level, const char *fmt, ...)
if (level > sys_verbose) return;
va_start(ap, fmt);
- vsnprintf(buf, MAXPDSTRING-1, fmt, ap);
+ pd_vsnprintf(buf, MAXPDSTRING-1, fmt, ap);
va_end(ap);
strcat(buf, "\n");
@@ -272,7 +324,7 @@ void pd_error(const void *object, const char *fmt, ...)
static int saidit = 0;
va_start(ap, fmt);
- vsnprintf(buf, MAXPDSTRING-1, fmt, ap);
+ pd_vsnprintf(buf, MAXPDSTRING-1, fmt, ap);
va_end(ap);
strcat(buf, "\n");
@@ -329,7 +381,7 @@ void bug(const char *fmt, ...)
t_int arg[8];
int i;
va_start(ap, fmt);
- vsnprintf(buf, MAXPDSTRING-1, fmt, ap);
+ pd_vsnprintf(buf, MAXPDSTRING-1, fmt, ap);
va_end(ap);
pd_error(0, "consistency check failed: %s", buf);
diff --git a/src/s_stuff.h b/src/s_stuff.h
index 0708d453c..d7681be4f 100644
--- a/src/s_stuff.h
+++ b/src/s_stuff.h
@@ -423,3 +423,7 @@ struct _instancestuff
* 'srclen' can be 0, in which case the 'src' string must be 0-terminated.
*/
EXTERN char*pdgui_strnescape(char* dst, size_t dstlen, const char*src, size_t srclen);
+
+/* safe cross-platform alternatives to snprintf and vsnprintf. */
+EXTERN int pd_snprintf(char *buf, size_t size, const char *fmt, ...);
+EXTERN int pd_vsnprintf(char *buf, size_t size, const char *fmt, va_list argptr);
diff --git a/src/x_file.c b/src/x_file.c
index b014b7caa..d02c55137 100644
--- a/src/x_file.c
+++ b/src/x_file.c
@@ -7,6 +7,7 @@
#include "m_pd.h"
#include "g_canvas.h"
+#include "s_stuff.h"
#include "s_utf8.h"
#include "m_private_utils.h"
@@ -312,7 +313,7 @@ static const char*do_errmsg(char*buffer, size_t bufsize) {
s=buffer + strlen(buffer)-1;
while(('\r' == *s || '\n' == *s) && s>buffer)
*s--=0;
- snprintf(errcode, sizeof(errcode), " [%ld]", err);
+ pd_snprintf(errcode, sizeof(errcode), " [%ld]", err);
errcode[sizeof(errcode)-1] = 0;
strcat(buffer, errcode);
return buffer;
@@ -1220,7 +1221,7 @@ static void file_patchpath_list(t_file_handle*x, t_symbol*s, int argc, t_atom*ar
s = gensym(pathname);
} else {
char buf[MAXPDSTRING];
- snprintf(buf, MAXPDSTRING, "%s/%s",
+ pd_snprintf(buf, MAXPDSTRING, "%s/%s",
canvas_getdir(c)->s_name, pathname);
buf[MAXPDSTRING-1] = 0;
s = gensym(buf);
@@ -1381,7 +1382,7 @@ static int file_do_copy(const char*source, const char*destination, int mode) {
filename=source;
else
filename++;
- snprintf(destfile, MAXPDSTRING, "%s/%s", destination, filename);
+ pd_snprintf(destfile, MAXPDSTRING, "%s/%s", destination, filename);
dst = sys_open(destfile, O_WRONLY | O_CREAT | O_TRUNC, mode);
}
}
@@ -1424,7 +1425,7 @@ static int file_do_move(const char*source, const char*destination, int mode) {
filename=source;
else
filename++;
- snprintf(destfile, MAXPDSTRING, "%s/%s", destination, filename);
+ pd_snprintf(destfile, MAXPDSTRING, "%s/%s", destination, filename);
result = sys_rename(source, destfile);
olderrno = errno;
}
diff --git a/src/x_gui.c b/src/x_gui.c
index adb6e22e7..ac0094fcd 100644
--- a/src/x_gui.c
+++ b/src/x_gui.c
@@ -7,6 +7,7 @@ away before the panel does... */
#include "m_pd.h"
#include "g_canvas.h"
+#include "s_stuff.h"
#include
#include
#ifdef HAVE_UNISTD_H
@@ -489,7 +490,7 @@ static void pdcontrol_dir(t_pdcontrol *x, t_symbol *s, t_floatarg f)
if (*s->s_name)
{
char buf[MAXPDSTRING];
- snprintf(buf, MAXPDSTRING, "%s/%s",
+ pd_snprintf(buf, MAXPDSTRING, "%s/%s",
canvas_getdir(c)->s_name, s->s_name);
buf[MAXPDSTRING-1] = 0;
outlet_symbol(x->x_outlet, gensym(buf));
From 9524f8d1f80235748d33d343c96b1ffffa55d0c9 Mon Sep 17 00:00:00 2001
From: Christof Ressi
Date: Tue, 2 Nov 2021 21:20:14 +0100
Subject: [PATCH 048/450] make openpanel/savepanel dialogs window modal
---
src/x_gui.c | 10 ++++++----
tcl/wheredoesthisgo.tcl | 15 +++++++++------
2 files changed, 15 insertions(+), 10 deletions(-)
diff --git a/src/x_gui.c b/src/x_gui.c
index adb6e22e7..e55a88382 100644
--- a/src/x_gui.c
+++ b/src/x_gui.c
@@ -240,6 +240,7 @@ static t_class *openpanel_class;
typedef struct _openpanel
{
t_object x_obj;
+ t_canvas *x_canvas;
t_symbol *x_s;
int x_mode; /* 0: file, 1: folder, 2: multiple files */
} t_openpanel;
@@ -252,6 +253,7 @@ static void *openpanel_new(t_floatarg mode)
x->x_mode = (mode < 0 || mode > 2) ? 0 : mode;
sprintf(buf, "d%lx", (t_int)x);
x->x_s = gensym(buf);
+ x->x_canvas = canvas_getcurrent();
pd_bind(&x->x_obj.ob_pd, x->x_s);
outlet_new(&x->x_obj, &s_symbol);
return (x);
@@ -260,8 +262,8 @@ static void *openpanel_new(t_floatarg mode)
static void openpanel_symbol(t_openpanel *x, t_symbol *s)
{
const char *path = (s && s->s_name) ? s->s_name : "\"\"";
- pdgui_vmess("pdtk_openpanel", "ssi",
- x->x_s->s_name, path, x->x_mode);
+ pdgui_vmess("pdtk_openpanel", "ssic",
+ x->x_s->s_name, path, x->x_mode, glist_getcanvas(x->x_canvas));
}
static void openpanel_bang(t_openpanel *x)
@@ -324,8 +326,8 @@ static void *savepanel_new(void)
static void savepanel_symbol(t_savepanel *x, t_symbol *s)
{
const char *path = (s && s->s_name) ? s->s_name : "\"\"";
- pdgui_vmess("pdtk_savepanel", "ss",
- x->x_s->s_name, path);
+ pdgui_vmess("pdtk_savepanel", "ssc",
+ x->x_s->s_name, path, glist_getcanvas(x->x_canvas));
}
static void savepanel_bang(t_savepanel *x)
diff --git a/tcl/wheredoesthisgo.tcl b/tcl/wheredoesthisgo.tcl
index 0940a94ca..8467fc738 100644
--- a/tcl/wheredoesthisgo.tcl
+++ b/tcl/wheredoesthisgo.tcl
@@ -36,7 +36,7 @@ proc open_file {filename} {
# ------------------------------------------------------------------------------
# procs for panels (openpanel, savepanel)
-proc pdtk_openpanel {target localdir {mode 0}} {
+proc pdtk_openpanel {target localdir {mode 0} {parent .pdwindow}} {
if { $::pd::private::lastopendir == "" } {
if { ! [file isdirectory $::fileopendir]} {
set ::fileopendir $::env(HOME)
@@ -49,9 +49,12 @@ proc pdtk_openpanel {target localdir {mode 0}} {
# 0: file, 1: directory, 2: multiple files
switch $mode {
- 0 { set result [tk_getOpenFile -initialdir $localdir] }
- 1 { set result [tk_chooseDirectory -initialdir $localdir] }
- 2 { set result [tk_getOpenFile -multiple 1 -initialdir $localdir] }
+ 0 { set result [tk_getOpenFile -initialdir $localdir \
+ -parent $parent] }
+ 1 { set result [tk_chooseDirectory -initialdir $localdir \
+ -parent $parent] }
+ 2 { set result [tk_getOpenFile -multiple 1 -initialdir $localdir \
+ -parent $parent] }
default { ::pdwindow::error "bad value for 'mode' argument" }
}
if {$result ne ""} {
@@ -73,7 +76,7 @@ proc pdtk_openpanel {target localdir {mode 0}} {
}
-proc pdtk_savepanel {target localdir} {
+proc pdtk_savepanel {target localdir {parent .pdwindow}} {
if { $::pd::private::lastsavedir == "" } {
if { ! [file isdirectory $::filenewdir]} {
set ::filenewdir $::env(HOME)
@@ -84,7 +87,7 @@ proc pdtk_savepanel {target localdir} {
set localdir $::pd::private::lastsavedir
}
- set filename [tk_getSaveFile -initialdir $localdir]
+ set filename [tk_getSaveFile -initialdir $localdir -parent $parent]
if {$filename ne ""} {
set ::pd::private::lastsavedir [file dirname $filename]
pdsend "$target callback [enquote_path $filename]"
From f736e8c3b38909240b4b68e82496c6b80eb9e198 Mon Sep 17 00:00:00 2001
From: Christof Ressi
Date: Tue, 2 Nov 2021 21:32:56 +0100
Subject: [PATCH 049/450] make "save as" dialogs window modal
---
tcl/pdtk_canvas.tcl | 3 ++-
tcl/pdwindow.tcl | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/tcl/pdtk_canvas.tcl b/tcl/pdtk_canvas.tcl
index 803959265..587308b4e 100644
--- a/tcl/pdtk_canvas.tcl
+++ b/tcl/pdtk_canvas.tcl
@@ -172,7 +172,8 @@ proc pdtk_canvas_saveas {mytoplevel initialfile initialdir destroyflag} {
if { ! [file isdirectory $initialdir]} {set initialdir $::filenewdir}
set filename [tk_getSaveFile -initialdir $initialdir \
-initialfile [::pdtk_canvas::cleanname "$initialfile"] \
- -defaultextension .pd -filetypes $::filetypes]
+ -defaultextension .pd -filetypes $::filetypes \
+ -parent $mytoplevel]
if {$filename eq ""} return; # they clicked cancel
set extension [file extension $filename]
diff --git a/tcl/pdwindow.tcl b/tcl/pdwindow.tcl
index 4635d08eb..da2c4cede 100644
--- a/tcl/pdwindow.tcl
+++ b/tcl/pdwindow.tcl
@@ -208,7 +208,7 @@ proc ::pdwindow::clear_console {} {
# save the contents of the pdwindow::logbuffer to a file
proc ::pdwindow::save_logbuffer_to_file {} {
variable logbuffer
- set filename [tk_getSaveFile -initialfile "pdwindow.txt" -defaultextension .txt]
+ set filename [tk_getSaveFile -initialfile "pdwindow.txt" -defaultextension .txt -parent .pdwindow]
if {$filename eq ""} return; # they clicked cancel
set f [open $filename w]
puts $f "Pd $::PD_MAJOR_VERSION.$::PD_MINOR_VERSION-$::PD_BUGFIX_VERSION$::PD_TEST_VERSION on $::tcl_platform(os) $::tcl_platform(machine)"
From 3b751bced1c1cc37d506be57c974aae38f5bee67 Mon Sep 17 00:00:00 2001
From: ssantos
Date: Mon, 18 Dec 2023 15:35:07 +0000
Subject: [PATCH 050/450] Translated using Weblate (Portuguese (Portugal))
Currently translated at 100.0% (491 of 491 strings)
Translation: pure-data/Interface
Translate-URL: https://hosted.weblate.org/projects/pure-data/pure-data/pt_PT/
---
po/pt_pt.po | 344 ++++++++++++++++++++++------------------------------
1 file changed, 142 insertions(+), 202 deletions(-)
diff --git a/po/pt_pt.po b/po/pt_pt.po
index 5947f44e0..131015779 100644
--- a/po/pt_pt.po
+++ b/po/pt_pt.po
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: Pure Data 0.43\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
"POT-Creation-Date: 2023-11-07 16:37+0100\n"
-"PO-Revision-Date: 2023-02-13 12:36+0000\n"
-"Last-Translator: umläute \n"
+"PO-Revision-Date: 2023-12-19 16:08+0000\n"
+"Last-Translator: ssantos \n"
"Language-Team: Portuguese (Portugal) \n"
"Language: pt_pt\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.16-dev\n"
+"X-Generator: Weblate 5.3\n"
"X-Poedit-Language: Portuguese\n"
"X-Poedit-Country: PORTUGAL\n"
@@ -33,13 +33,11 @@ msgstr "novo-apenas"
msgid "new&old"
msgstr "novo&velho"
-#, fuzzy
msgid "no scale"
-msgstr "Escala"
+msgstr "sem escala"
-#, fuzzy
msgid "scale"
-msgstr "Escala"
+msgstr "escala"
#, tcl-format
msgid "Discard changes to '%s'?"
@@ -51,16 +49,14 @@ msgstr "Desfazer limpar"
msgid "Undo connect"
msgstr "Desfazer conectar"
-#, fuzzy
msgid "Undo cut"
-msgstr "Anular"
+msgstr "Desfazer cortar"
msgid "Undo disconnect"
msgstr "Desfazer desconectar"
-#, fuzzy
msgid "Undo duplicate"
-msgstr "Duplicar"
+msgstr "Desfazer duplicar"
msgid "Undo motion"
msgstr "Desfazer movimentar"
@@ -77,16 +73,14 @@ msgstr "Refazer limpar"
msgid "Redo connect"
msgstr "Refazer conectar"
-#, fuzzy
msgid "Redo cut"
-msgstr "Restaurar"
+msgstr "Refazer cortar"
msgid "Redo disconnect"
msgstr "Refazer desconectar"
-#, fuzzy
msgid "Redo duplicate"
-msgstr "Duplicar"
+msgstr "Refazer duplicar"
msgid "Redo motion"
msgstr "Refazer movimentar"
@@ -109,9 +103,8 @@ msgstr "impossível deletar ficheiro .pdsettings"
msgid "failed to erase Pd settings"
msgstr "falha ao apagar configurações do Pd"
-#, fuzzy
msgid "erased Pd settings"
-msgstr "Gravar a configuração"
+msgstr "configurações do Pd apagadas"
msgid "no Pd settings to erase"
msgstr "nenhuma configuração do Pd para apagar"
@@ -126,7 +119,6 @@ msgstr "(re-gravar preferências para reinstanciá-las)"
msgid "File"
msgstr "Ficheiro"
-#, fuzzy
msgid "Edit"
msgstr "Editar"
@@ -208,13 +200,11 @@ msgstr "Aplicar"
msgid "OK"
msgstr "OK"
-#, fuzzy
msgid "no device"
-msgstr "Dispositivo de entrada 3:"
+msgstr "Nenhum dispositivo"
-#, fuzzy
msgid "(same as input device)..."
-msgstr "(igual ao dispositivo de entrada) .............."
+msgstr "(mesmo que o dispositivo de entrada)..."
msgid "Channels:"
msgstr "Canais:"
@@ -225,16 +215,14 @@ msgstr "Dispositivo de entrada"
msgid "Output Devices"
msgstr "Dispositivo de saída"
-#, fuzzy
msgid "Use Multiple Devices"
-msgstr "Usar vários dispositivos"
+msgstr "Usar Múltiplos Dispositivos"
msgid "audio system"
-msgstr ""
+msgstr "Sistema de áudio"
-#, fuzzy
msgid "Settings"
-msgstr "Configuração MIDI"
+msgstr "Configurações"
msgid "Sample rate:"
msgstr "Sample rate:"
@@ -274,10 +262,10 @@ msgid "Scale"
msgstr "Escala"
msgid "X units per pixel:"
-msgstr "Unidades de X por pixel"
+msgstr "Unidades de X por pixel:"
msgid "Y units per pixel:"
-msgstr "Unidades de Y por pixel"
+msgstr "Unidades de Y por pixel:"
msgid "Appearance on parent patch"
msgstr "Aparência no patch pai"
@@ -291,9 +279,8 @@ msgstr "Esconder nome e variáveis do objecto"
msgid "Range and size"
msgstr "Registo e tamanho"
-#, fuzzy
msgid "X range: from"
-msgstr "Faixa X, de"
+msgstr "Registro de X: de"
msgid "to"
msgstr "a"
@@ -301,13 +288,11 @@ msgstr "a"
msgid "Margin:"
msgstr "Margem:"
-#, fuzzy
msgid "Y range: from"
-msgstr "Faixa Y, de"
+msgstr "Registro de Y: de"
-#, fuzzy
msgid "Data Properties"
-msgstr "Propriedades da tela"
+msgstr "Propriedades da Estrutura de Dados"
msgid "Send"
msgstr "Enviar"
@@ -323,9 +308,9 @@ msgstr "Encontrado '%1$s' em %2$s"
msgid "Couldn't find '%1$s' in %2$s"
msgstr "Não foi possível encontrar '%1$s' em %2$s"
-#, fuzzy, tcl-format
+#, tcl-format
msgid "Search in %s for:"
-msgstr "Procurar em"
+msgstr "Procurar em %s por:"
#, tcl-format
msgid "Showed last '%1$s' in %2$s"
@@ -366,9 +351,8 @@ msgstr "Apenas X"
msgid "Y only"
msgstr "Apenas Y"
-#, fuzzy
msgid "GUI Box Properties"
-msgstr "Propriedades da atom box"
+msgstr "Propriedades da Caixa de GUI"
msgid "Messages"
msgstr "Mensagens"
@@ -380,7 +364,7 @@ msgid "Receive symbol:"
msgstr "Símbolo para receber:"
msgid "auto"
-msgstr ""
+msgstr "automático"
msgid "Width:"
msgstr "Largura:"
@@ -397,7 +381,6 @@ msgstr "Superior:"
msgid "Label"
msgstr "Legenda"
-#, fuzzy
msgid "Left"
msgstr "Esquerda"
@@ -422,9 +405,8 @@ msgstr "Cor da legenda"
msgid "Bang"
msgstr "Bang"
-#, fuzzy
msgid "Flash Time (msec)"
-msgstr "Delay (mseg):"
+msgstr "Tempo de piscagem (ms)"
msgid "Min:"
msgstr "Mínimo:"
@@ -447,9 +429,8 @@ msgstr "Number2"
msgid "Width (digits):"
msgstr "Largura (dígitos):"
-#, fuzzy
msgid "Height:"
-msgstr "Direita"
+msgstr "Altura:"
msgid "Output Range"
msgstr "Registo de Saída"
@@ -500,13 +481,11 @@ msgstr "Saltar no clique"
msgid "Steady on click"
msgstr "Manter no clique"
-#, fuzzy
msgid "X offset:"
-msgstr "Posição X"
+msgstr "Deslocamento X:"
-#, fuzzy
msgid "Y offset:"
-msgstr "Posição Y"
+msgstr "Deslocamento Y:"
msgid "Colors"
msgstr "Cores"
@@ -523,16 +502,14 @@ msgstr "Criar uma cor"
msgid "Test label"
msgstr "teste"
-#, fuzzy
msgid "Send a Pd message"
-msgstr "Enviar mensagem..."
+msgstr "Enviar uma mensagem"
msgid "(use arrow keys for history)"
msgstr "(use setas para histórico)"
-#, fuzzy
msgid "no input devices"
-msgstr "Dispositivo de entrada"
+msgstr "nenhum dispositivos de entrada"
msgid "In Ports:"
msgstr "Ports de entrada:"
@@ -541,7 +518,7 @@ msgid "Out Ports:"
msgstr "Ports de saída:"
msgid "MIDI system"
-msgstr ""
+msgstr "Sistema MIDI"
msgid "MIDI Settings"
msgstr "Configuração MIDI"
@@ -574,13 +551,11 @@ msgstr "Desativar"
msgid "Externals Install Directory"
msgstr "Diretório de Instalação de Externals"
-#, fuzzy
msgid "Clear"
-msgstr "Limpar menu"
+msgstr "Limpar"
-#, fuzzy
msgid "path preferences"
-msgstr "Preferências"
+msgstr "caminho de busca"
msgid "Choose Pd documents directory:"
msgstr "Escolher diretório dos documentos Pd:"
@@ -595,49 +570,41 @@ msgstr "Adicionar um novo caminho"
msgid "Edit existing path [%s]"
msgstr "Editar caminho existente [%s]"
-#, fuzzy
msgid "Patch windows"
-msgstr "Janela Pd"
+msgstr "Janelas do Patch"
-#, fuzzy
msgid "Zoom New Windows"
-msgstr "Janela superior"
+msgstr "Ampliar Zoom em Novas Janelas"
-#, fuzzy
msgid "GUI settings"
-msgstr "Gravar a configuração"
+msgstr "Configurações de GUI"
msgid "preference layout (reopen the preferences to see the effect)"
-msgstr ""
+msgstr "preferência de layout (reabra as preferências para ver o efeito)"
msgid "use tabs"
-msgstr ""
+msgstr "usar guias"
msgid "single page"
-msgstr ""
+msgstr "página única"
msgid "Preferences"
msgstr "Preferências"
-#, fuzzy
msgid "startup preferences"
-msgstr "Preferências"
+msgstr "inicialização"
-#, fuzzy
msgid "audio preferences"
-msgstr "Preferências"
+msgstr "áudio"
-#, fuzzy
msgid "MIDI preferences"
-msgstr "Preferências"
+msgstr "MIDI"
-#, fuzzy
msgid "deken preferences"
-msgstr "Preferências"
+msgstr "preferências do deken"
-#, fuzzy
msgid "misc preferences"
-msgstr "Preferências"
+msgstr "diversas"
msgid "Add new library"
msgstr "Adicionar nova biblioteca"
@@ -646,40 +613,37 @@ msgid "Edit library"
msgstr "Editar biblioteca"
msgid "Settings below require a restart of Pd!"
-msgstr ""
+msgstr "As configurações abaixo requerem a reinicialização do Pd!"
msgid "Pd libraries to load on startup"
msgstr "Bibliotecas de Pd a serem carregadas na inicialização"
-#, fuzzy
msgid "GUI options"
-msgstr "Gravar a configuração"
+msgstr "opções de GUI"
msgid "language"
-msgstr ""
+msgstr "idioma"
msgid "Menu language"
-msgstr ""
+msgstr "Menu de idioma"
msgid "float (32bit)"
-msgstr ""
+msgstr "float (32bit)"
msgid "double (64bit) EXPERIMENTAL"
-msgstr ""
+msgstr "double (64bit) EXPERIMENTAL"
msgid "double (64bit)"
-msgstr ""
+msgstr "double (64bit)"
-#, fuzzy
msgid "float size"
-msgstr "Tamanho do bloco:"
+msgstr "Tamanho do float"
msgid "Numeric precision of Pd-core"
-msgstr ""
+msgstr "Precisão numérica do núcleo do Pd"
-#, fuzzy
msgid "Startup options"
-msgstr "Flags de inicialização:"
+msgstr "Opções de inicialização"
msgid "Defeat real-time scheduling"
msgstr "Anular agendamento em tempo real"
@@ -687,16 +651,14 @@ msgstr "Anular agendamento em tempo real"
msgid "Startup flags:"
msgstr "Flags de inicialização:"
-#, fuzzy
msgid "Help Browser"
-msgstr "Navegador"
+msgstr "Navegador de Ajuda"
msgid "Associated Files"
msgstr "Ficheiros associados"
-#, fuzzy
msgid "Pd Files"
-msgstr "Ficheiros Pd"
+msgstr "Ficheiros de Pd"
msgid "Max Patch Files"
msgstr "Ficheiros Max-Patches"
@@ -714,14 +676,13 @@ msgstr "Ficheiros Max-Texto (.mxt)"
msgid "detected font: %s"
msgstr "fonte detectada: %s"
-#, fuzzy, tcl-format
+#, tcl-format
msgid "WARNING: font family '%1$s' not found, using default (%2$s)"
-msgstr "AVISO: O tipo de letra '%s' não foi encontrado, usando o padrão (%s)"
+msgstr "AVISO: família de fonte '%1$s' não encontrado, usando padrão (%2$s)"
-#, fuzzy, tcl-format
+#, tcl-format
msgid "WARNING: font weight '%1$s' not found, using default (%2$s)"
-msgstr ""
-"AVISO: O formato de letra '%s' não foi encontrado, usando o padrão (%s)"
+msgstr "AVISO: peso de fonte '%1$s' não encontrado, usando padrão (%2$s)"
#, tcl-format
msgid "using font: %1$s %2$s"
@@ -752,11 +713,10 @@ msgid "Failed to find plugins in %s ...skipping!"
msgstr "Falha ao encontrar plugin em %s …pulando!"
msgid "Pd startup failure"
-msgstr ""
+msgstr "falha de inicialização do Pd"
-#, fuzzy
msgid "Failed to start Pd-core"
-msgstr "Falha ao instalar '%s'!"
+msgstr "Falha ao iniciar o núcleo do Pd"
msgid "(Tcl) MISSING CLOSE-BRACE '}': "
msgstr "(Tcl) MISSING CLOSE-BRACE '}': "
@@ -787,9 +747,9 @@ msgstr "instalando pacote deken '%s'"
msgid "ignoring '%s': doesn't look like a deken package"
msgstr "ignorando '%s': não parece ser um pacote do deken"
-#, fuzzy, tcl-format
+#, tcl-format
msgid "Installing '%s'"
-msgstr "Rejeitar modificações em '%s'?"
+msgstr "A instalar '%s'"
#, tcl-format
msgid "Successfully unzipped %1$s into %2$s."
@@ -903,9 +863,9 @@ msgstr ""
"Apenas mostrar a mais nova versão de uma biblioteca\n"
"(tratar outras versões como arquiteturas estrangeiras)"
-#, fuzzy, tcl-format
+#, tcl-format
msgid "Deken %s Preferences"
-msgstr "Preferências"
+msgstr "Preferências do Deken %s"
#, tcl-format
msgid "Platform re-detected: %s"
@@ -914,17 +874,14 @@ msgstr "Plataforma re-detectada: %s"
msgid "Deken Packages"
msgstr "Pacotes do Deken"
-#, fuzzy
msgid "ZIP Files"
-msgstr "Arquivos ZIP"
+msgstr "Ficheiros ZIP"
-#, fuzzy
msgid "TAR Files"
-msgstr "Arquivos TAR"
+msgstr "Ficheiros TAR"
-#, fuzzy
msgid "All Files"
-msgstr "todos os arquivos"
+msgstr "Todos os Ficheiros"
#, tcl-format
msgid "Checksum mismatch for '%s'"
@@ -996,9 +953,8 @@ msgstr "Processado %d pacotes selecionados para instalação."
msgid "Show all"
msgstr "Mostra todos"
-#, fuzzy
msgid "Search"
-msgstr "Procurar em"
+msgstr "Procurar"
#, tcl-format
msgid "Install (%d)"
@@ -1052,9 +1008,8 @@ msgstr "Procurar em: "
msgid "libraries"
msgstr "bibliotecas"
-#, fuzzy
msgid "objects"
-msgstr "Object"
+msgstr "objetos"
msgid "both"
msgstr "ambos"
@@ -1083,16 +1038,15 @@ msgstr "Enviador"
msgid "Date"
msgstr "Data"
-#, fuzzy
msgid "Search Results"
-msgstr "Procurar em"
+msgstr "Resultados de Busca"
msgid "Log"
msgstr "Log"
-#, fuzzy, tcl-format
+#, tcl-format
msgid "Searching for \"%s\"..."
-msgstr "Rejeitar modificações em '%s'?"
+msgstr "À procura de \"%s\"..."
#, tcl-format
msgid "online? %s"
@@ -1173,9 +1127,9 @@ msgstr "[deken] deken-plugin.tcl (busca de externals Pd) carregado de %s."
msgid "[deken] Platform detected: %s"
msgstr "[deken] platforma detectada: %s"
-#, fuzzy, tcl-format
+#, tcl-format
msgid "Searching on %s..."
-msgstr "Rejeitar modificações em '%s'?"
+msgstr "À procura em %s..."
#, tcl-format
msgid "Searching on %1$s returned %2$d results"
@@ -1188,13 +1142,12 @@ msgstr "Nenhum servidor encontrado para procurar..."
msgid "Uploaded by %1$s @ %2$s"
msgstr "Enviado por %1$s em %2$s"
-#, fuzzy, tcl-format
+#, tcl-format
msgid "Searching for '%s' failed!"
-msgstr "Rejeitar modificações em '%s'?"
+msgstr "Procura por '%s' falhou!"
-#, fuzzy
msgid "Search failed"
-msgstr "Procurar em"
+msgstr "Procura falhou"
msgid "Unable to perform search."
msgstr "Incapaz de fazer procura."
@@ -1205,9 +1158,8 @@ msgstr "Selecionar pacotes para instalação"
msgid "Deselect package"
msgstr "Desselecionar pacote"
-#, fuzzy
msgid "Open package webpage"
-msgstr "Abrir recente"
+msgstr "Abrir a página do pacote na web"
msgid "Copy package URL"
msgstr "Copiar URL do pacote"
@@ -1284,126 +1236,125 @@ msgid "Couldn't create preferences \"%1$s\" in %2$s"
msgstr "Não foi possível criar preferências \"%1$s\" em %2$s"
msgid "Afrikaans"
-msgstr ""
+msgstr "Africâner"
msgid "Arabic"
-msgstr ""
+msgstr "Árabe"
msgid "Azerbaijani"
-msgstr ""
+msgstr "Azerbaijano"
msgid "Belarusian"
-msgstr ""
+msgstr "Bielorrusso"
msgid "Bulgarian"
-msgstr ""
+msgstr "Búlgaro"
msgid "German"
-msgstr ""
+msgstr "Alemão"
msgid "German (Austria)"
-msgstr ""
+msgstr "Alemão (Áustria)"
msgid "Greek"
-msgstr ""
+msgstr "Grego"
msgid "English"
-msgstr ""
+msgstr "Inglês"
msgid "English (Canada)"
-msgstr ""
+msgstr "Inglês (Canadá)"
msgid "English (UK)"
-msgstr ""
+msgstr "Inglês (Britânico)"
msgid "English (USA)"
-msgstr ""
+msgstr "Inglês (EUA)"
msgid "Spanish"
-msgstr ""
+msgstr "Espanhol"
msgid "Basque"
-msgstr ""
+msgstr "Basco"
msgid "Finnish"
-msgstr ""
+msgstr "Finlândia"
msgid "French"
-msgstr ""
+msgstr "Francês"
msgid "Gujarati"
-msgstr ""
+msgstr "Gujardo"
msgid "Hebrew"
-msgstr ""
+msgstr "Hebraico"
msgid "Hindi"
-msgstr ""
+msgstr "Híndi"
msgid "Hungarian"
-msgstr ""
+msgstr "Húngaro"
msgid "Armenian"
-msgstr ""
+msgstr "Arménio"
msgid "Italian"
-msgstr ""
+msgstr "Italiano"
msgid "Indonesian"
-msgstr ""
+msgstr "Indonésio"
msgid "Japanese"
-msgstr ""
+msgstr "Japonês"
msgid "Korean"
-msgstr ""
+msgstr "Coreano"
msgid "Dutch"
-msgstr ""
+msgstr "Holandês"
msgid "Panjabi"
-msgstr ""
+msgstr "Panjábi"
msgid "Polish"
-msgstr ""
+msgstr "Polonês"
msgid "Portuguese"
-msgstr ""
+msgstr "Português"
msgid "Portuguese (Brazil)"
-msgstr ""
+msgstr "Português (Brasil)"
msgid "Portuguese (Portugal)"
-msgstr ""
+msgstr "Português (Portugal)"
msgid "Russian"
-msgstr ""
+msgstr "Russo"
msgid "Albanian"
-msgstr ""
+msgstr "Albanês"
msgid "Swedish"
-msgstr ""
+msgstr "Sueco"
msgid "Turkish"
-msgstr ""
+msgstr "Turco"
msgid "Ukrainian"
-msgstr ""
+msgstr "Ucraniano"
msgid "Vietnamese"
-msgstr ""
+msgstr "Vietnamita"
msgid "Chinese (Traditional)"
-msgstr ""
+msgstr "Chinês (Tradicional)"
-#, fuzzy, tcl-format
+#, tcl-format
msgid "(default language: %s)"
-msgstr "Platforma padrão: %s"
+msgstr "(idioma padrão: %s)"
-#, fuzzy
msgid "(no translation)"
-msgstr "traduções"
+msgstr "(sem tradução)"
#, tcl-format
msgid "ignoring '%s': doesn't exist"
@@ -1423,7 +1374,7 @@ msgid "Save As..."
msgstr "Guardar como..."
msgid "Print..."
-msgstr "Imprimir"
+msgstr "Imprimir…"
msgid "Paste Replace"
msgstr "Colar Substituir"
@@ -1431,13 +1382,11 @@ msgstr "Colar Substituir"
msgid "Duplicate"
msgstr "Duplicar"
-#, fuzzy
msgid "Zoom In"
-msgstr "Zoom"
+msgstr "Ampliar Zoom"
-#, fuzzy
msgid "Zoom Out"
-msgstr "Zoom"
+msgstr "Reduzir Zoom"
msgid "Tidy Up"
msgstr "Arrumar"
@@ -1463,9 +1412,8 @@ msgstr "Novo"
msgid "Open"
msgstr "Abrir"
-#, fuzzy
msgid "Message..."
-msgstr "Mensagem"
+msgstr "Mensagem..."
msgid "Cut"
msgstr "Cortar"
@@ -1533,22 +1481,20 @@ msgstr "Zoom"
msgid "Bring All to Front"
msgstr "Trazer Todas para Frente"
-#, fuzzy
msgid "Next Window"
-msgstr "Janela superior"
+msgstr "Próxima Janela"
-#, fuzzy
msgid "Previous Window"
-msgstr "Janela superior"
+msgstr "Janela Anterior"
msgid "Parent Window"
msgstr "Janela superior"
msgid "HTML Manual..."
-msgstr "Manual HTML"
+msgstr "Manual HTML…"
msgid "Browser..."
-msgstr "Navegador"
+msgstr "Navegador…"
msgid "List of objects..."
msgstr "Lista de objetos..."
@@ -1572,24 +1518,20 @@ msgstr ""
"Deletar todas as preferências?\n"
"(faz efeito quando o Pd é reiniciado)"
-#, fuzzy
msgid "removed GUI settings"
-msgstr "Gravar a configuração"
+msgstr "configurações de GUI removidas"
msgid "no Pd-GUI settings to clear"
msgstr "nenhuma configuração Pd-GUI para limpar"
-#, fuzzy
msgid "Edit Preferences..."
-msgstr "Preferências..."
+msgstr "Editar Preferências..."
-#, fuzzy
msgid "Save All Preferences"
-msgstr "Preferências"
+msgstr "Gravar Todas as Preferências"
-#, fuzzy
msgid "Save to..."
-msgstr "Guardar como..."
+msgstr "Gravar em..."
msgid "Load from..."
msgstr "Carregar de..."
@@ -1597,9 +1539,8 @@ msgstr "Carregar de..."
msgid "Forget All..."
msgstr "Esquecer Todas..."
-#, fuzzy
msgid "Tabbed preferences"
-msgstr "Preferências"
+msgstr "Preferências em guias"
msgid "Open Recent"
msgstr "Abrir recente"
@@ -1622,6 +1563,8 @@ msgid ""
"Accepting will update the contents in the associated object. You still have "
"to save the patch to make the changes persistent."
msgstr ""
+"Aceitar atualizará o conteúdo dos objetos associados. Ainda terá que gravar "
+"o patch para que as mudanças sejam permanentes."
#, tcl-format
msgid "dropped %d lines from the Pd window"
@@ -1631,9 +1574,8 @@ msgstr "descartadas %d linhas da janela de Pd"
msgid "the Pd window filtered %d lines"
msgstr "a janela do Pd filtrou %d linhas"
-#, fuzzy
msgid "Audio on"
-msgstr "Configuração audio"
+msgstr "Áudio ligado"
msgid "Audio off"
msgstr "Áudio desligado"
@@ -1648,11 +1590,11 @@ msgid "Pd"
msgstr "Pd"
msgid "EXPERIMENTAL double (64bit) precision"
-msgstr ""
+msgstr "EXPERIMENTAL precisão double (64bit)"
#, tcl-format
msgid "%dbit-floats EXPERIMENTAL"
-msgstr ""
+msgstr "%dbit-floats EXPERIMENTAL"
msgid "DSP"
msgstr "DSP"
@@ -1679,18 +1621,16 @@ msgid "all"
msgstr "todos"
msgid "y1"
-msgstr ""
+msgstr "y1"
msgid "New..."
msgstr "Novo..."
-#, fuzzy
msgid "Edit..."
-msgstr "Editar"
+msgstr "Editar..."
-#, fuzzy
msgid "Delete"
-msgstr "Apagar array"
+msgstr "Deletar"
#, tcl-format
msgid "ignoring '%s': doesn't look like a Pd file"
From 1e866f2ff55d2fd048362add59d0b0140e9269b8 Mon Sep 17 00:00:00 2001
From: Charles Hughes
Date: Sat, 30 Dec 2023 16:22:15 -0800
Subject: [PATCH 051/450] Update snapshot~-help.pd (#2163)
The docs say "outlet" when I am certain it should say "inlet". Outlets do not receive or react to inputs.
---
doc/5.reference/snapshot~-help.pd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/5.reference/snapshot~-help.pd b/doc/5.reference/snapshot~-help.pd
index c55a7c4ce..46df149b2 100644
--- a/doc/5.reference/snapshot~-help.pd
+++ b/doc/5.reference/snapshot~-help.pd
@@ -29,7 +29,7 @@
#X obj 124 429 sig~;
#X obj 10 414 cnv 1 610 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 113 286 <-- take one snapshot;
-#X text 28 63 The [snapshot~] object takes a signal and converts it to a control value whenever it receives a bang in its left outlet. This object is particularly useful for monitoring outputs., f 81;
+#X text 28 63 The [snapshot~] object takes a signal and converts it to a control value whenever it receives a bang in its left inlet. This object is particularly useful for monitoring outputs., f 81;
#X text 27 122 In the example below \, a [snapshot~] object prints out the values of a low frequency cosine wave every time it is sent a bang message., f 83;
#X obj 89 286 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X text 135 372 This output updates each time bang is clicked above;
From b461f0df791c82f1117a1d47427e0a5aa1897085 Mon Sep 17 00:00:00 2001
From: porres
Date: Mon, 1 Jan 2024 20:15:45 -0300
Subject: [PATCH 052/450] let [soundfiler] save files again. (#2164)
this is a follow up to https://github.com/pure-data/pure-data/pull/2148
taking into consideration this comment https://github.com/pure-data/pure-data/pull/2148#issuecomment-1836820049
---
doc/5.reference/soundfiler-help.pd | 115 +++++++++++++++++------------
1 file changed, 68 insertions(+), 47 deletions(-)
diff --git a/doc/5.reference/soundfiler-help.pd b/doc/5.reference/soundfiler-help.pd
index 71bbfea42..0b7a3d881 100644
--- a/doc/5.reference/soundfiler-help.pd
+++ b/doc/5.reference/soundfiler-help.pd
@@ -5,14 +5,13 @@
#X restore 269 273 graph;
#X obj 60 340 soundfiler;
#X floatatom 60 369 7 0 0 0 - - - 12;
-#X text 101 262 write a file;
#X obj 163 580 tabwrite~;
#X obj 237 580 tabread4~;
#X obj 310 580 tabplay~;
#X obj 434 580 writesf~;
#X obj 376 580 readsf~;
#X text 38 579 See also:;
-#X text 256 185 read a file to zero or more arrays, f 35;
+#X text 256 176 read a file to zero or more arrays, f 35;
#X obj 40 15 soundfiler;
#X text 806 579 updated for Pd version 0.51;
#X obj 115 580 array;
@@ -38,11 +37,11 @@
#X text 157 254 sample rate \, header size \, number of channels \, bytes per sample & endianness ('b' or 'l')., f 51;
#X restore 822 15 pd reference;
#X text 120 14 - import/export soundfiles to/from arrays;
-#X msg 34 185 read ../sound/bell.aiff sample;
-#X msg 60 220 read -resize ../sound/bell.aiff sample;
+#X msg 34 176 read ../sound/bell.aiff sample;
+#X msg 60 211 read -resize ../sound/bell.aiff sample;
#X text 29 69 The [soundfiler] object loads files into arrays and also saves arrays into files. The soundfiles may contain uncompressed 2- or 3-byte integer ("pcm") or 4-byte floating point samples in wave \, aiff \, caf and next formats. Additionally \, [soundfiler] also deals with ascii text files., f 72;
-#X text 340 212 optionally resize array to fit the whole file, f 23;
-#X text 37 153 Basic read/write example:;
+#X text 340 203 optionally resize array to fit the whole file, f 23;
+#X text 37 144 Basic read/write example:;
#N canvas 791 194 575 345 Dealing_with_"\$0" 0;
#X obj 273 171 array define \$0-x;
#X obj 153 202 f \$0;
@@ -63,17 +62,17 @@
#X text 29 422 The 'read' message takes a file to load and one or more arrays to load into (in the case the file has more than one channel). The number of channels of the soundfile need not match the number of arrays given to read (extras channels are dropped and unsupplied channels are zeroed out in the extra arrays)., f 72;
#X text 577 243 Note that if no array name is given to read to \, no samples are read but you get the number of samples in the file on the left outlet and the info on the right outlet anyway., f 62;
#X text 577 300 Also note that the number of channels is limited to 64 for both reading and writting., f 62;
-#N canvas 101 118 1234 585 read-write-flags 0;
+#N canvas 85 86 1235 552 read-write-flags 0;
#X text 27 83 -resize (resizes arrays to the size of the sound file), f 62;
#N canvas 0 22 450 300 (subpatch) 0;
#X array array1 78003 float 2;
#X coords 0 1 78003 -1 325 120 1 0 0;
-#X restore 538 441 graph;
+#X restore 887 260 graph;
#N canvas 0 22 450 300 (subpatch) 0;
#X array array2 78003 float 2;
#X coords 0 1 78003 -1 325 120 1 0 0;
-#X restore 877 441 graph;
-#X obj 681 367 soundfiler;
+#X restore 887 404 graph;
+#X obj 622 447 soundfiler;
#X text 27 23 Flags for 'read' message:, f 62;
#X text 27 347 Flags for 'write' message:, f 69;
#X text 27 101 -maxsize (maximum number of samples to resize to), f 62;
@@ -81,22 +80,16 @@
#X text 27 231 -ascii (read a file containing ascii numbers), f 73;
#X text 48 251 This may only be combined with '-resize'. Newlines in the file are ignored \, non-numeric fields are replaced by zero. If multiple arrays are specified \, the first elements of each array should come first in the file \, followed by all the second elements and so on (interleaved)., f 70;
#X text 27 47 -wave \, -aiff \, -caf \, -next (soundfile format), f 62;
-#X text 1119 137 read a file overriding the header, f 11;
-#X text 1002 261 read from an ascii file;
-#X listbox 748 395 17 0 0 0 - - - 0;
-#X msg 684 152 read -resize -raw 128 2 2 b ../sound/bell.aiff array1 array2;
-#X msg 749 284 read -ascii -resize table.txt array1 array2;
-#X text 922 321 write to an ascii file;
-#X floatatom 681 395 6 0 0 0 - - - 0;
-#X msg 709 199 write -nframes 10000 foo2.wav array1;
-#X obj 645 72 openpanel;
-#X obj 645 37 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
-#X msg 719 226 write -next -bytes 4 foo3 array1 array2;
-#X text 974 199 write and set number of samples;
-#X text 1004 217 set file extenstion and write a stereo file, f 23;
-#X obj 560 72 savepanel;
-#X obj 560 37 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
-#X text 677 38 choose file to save to or read from in your hard disk;
+#X text 1056 131 read a file overriding the header, f 23;
+#X text 904 169 read from an ascii file;
+#X listbox 689 495 17 0 0 0 - - - 0;
+#X msg 625 138 read -resize -raw 128 2 2 b ../sound/bell.aiff array1 array2;
+#X msg 651 192 read -ascii -resize table.txt array1 array2;
+#X floatatom 622 495 6 0 0 0 - - - 0;
+#X obj 586 58 openpanel;
+#X obj 586 23 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
+#X obj 672 289 savepanel;
+#X obj 672 254 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
#X text 82 500 * note that arrays whose values exceed the -1 to 1 range are automatically normalized, f 42;
#X text 27 442 -bytes (bytes per sample: 2 \, 3 \, or 4 \, default: 2), f 69;
#X text 27 461 -rate (sample rate \, default Pd's running sample rate), f 69;
@@ -107,30 +100,52 @@
#X text 27 367 -wave \, -aiff \, -caf \, -next \, -ascii (soundfile format \, default: 'wave'), f 69;
#X text 27 386 -big \, -little (sample endianness \, default 'little'), f 69;
#X text 27 480 -normalize * (normalize file to '1'), f 69;
-#X msg 560 100 write \$1 array1 array2, f 9;
-#X msg 764 322 write foo1.txt array1;
-#X msg 645 100 read -resize \$1 array1 array2;
-#X msg 666 127 read -maxsize 44100 -aiff ../sound/bell.aiff array1 array2;
-#X text 905 103 set max size and extension;
-#X msg 740 261 read -ascii -resize table.txt array1;
-#X connect 3 0 17 0;
+#X msg 672 317 write \$1 array1 array2;
+#X msg 586 86 read -resize \$1 array1 array2;
+#X msg 607 113 read -maxsize 44100 -aiff ../sound/bell.aiff array1 array2;
+#X text 846 89 set max size and extension;
+#X msg 642 169 read -ascii -resize table.txt array1;
+#N canvas 411 132 607 507 more-writting-examples 0;
+#X msg 171 364 write foo1.txt array1;
+#X obj 113 451 outlet;
+#X text 223 191 write a mono file and set number of samples, f 22;
+#X obj 144 202 savepanel;
+#X obj 144 167 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
+#X msg 144 237 write -nframes 10000 \$1 array1;
+#X obj 113 78 savepanel;
+#X obj 113 43 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
+#X msg 113 113 write -next -bytes 4 \$1 array1 array2;
+#X text 192 38 Write a stereo file with a 4 byte resolution and in the 'next' format (so when typing into the savepannel dialog you should not set the file extension), f 47;
+#X obj 171 322 savepanel;
+#X obj 171 287 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
+#X text 251 304 write to an ascii file (set the file extension to '.txt'), f 31;
+#X connect 0 0 1 0;
+#X connect 3 0 5 0;
+#X connect 4 0 3 0;
+#X connect 5 0 1 0;
+#X connect 6 0 8 0;
+#X connect 7 0 6 0;
+#X connect 8 0 1 0;
+#X connect 10 0 0 0;
+#X connect 11 0 10 0;
+#X restore 681 383 pd more-writting-examples;
+#X text 698 256 Write a stereo fie;
+#X text 618 24 Choose file to save to or read from in your hard disk;
+#X connect 3 0 16 0;
#X connect 3 1 13 0;
#X connect 14 0 3 0;
#X connect 15 0 3 0;
-#X connect 18 0 3 0;
-#X connect 19 0 39 0;
+#X connect 17 0 32 0;
+#X connect 18 0 17 0;
+#X connect 19 0 31 0;
#X connect 20 0 19 0;
-#X connect 21 0 3 0;
-#X connect 24 0 37 0;
-#X connect 25 0 24 0;
-#X connect 37 0 3 0;
-#X connect 38 0 3 0;
-#X connect 39 0 3 0;
-#X connect 40 0 3 0;
-#X connect 42 0 3 0;
+#X connect 31 0 3 0;
+#X connect 32 0 3 0;
+#X connect 33 0 3 0;
+#X connect 35 0 3 0;
+#X connect 36 0 3 0;
#X restore 756 497 pd read-write-flags & more examples;
#X f 19;
-#X msg 89 289 write foo1 sample;
#X text 577 149 When loading a file \, the left outlet sends the number of samples the file contains if the array is equal or greater in size. If you're loading a file into an array that is smaller \, the number or samples is clipped to the array size and you probably want to use the -resize flag to resize the array size to the file size., f 62;
#X text 577 413 Both 'read' and 'write' messages also take optional flags for configuration. In the basic example to the left we have the '-resize' flag in the read message that resizes the array to the file size. See more about flags and advanced examples in the subpatch below., f 62;
#X obj 6 562 cnv 1 1025 1 empty empty empty 8 12 0 13 #000000 #000000 0;
@@ -139,8 +154,14 @@
#X text 577 69 At loading or writting a file \, the left outlet outputs the number of samples and the right outlet sends information as a list \, namely: Sample Rate \, Header Size \, Number of Channels \, Bytes per Sample & Endianness ("b" for "big" or "l" for "little")., f 62;
#X text 126 389 info ;
#X text 44 389 # samples;
+#X obj 84 280 savepanel;
+#X obj 84 248 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
+#X msg 84 308 write \$1 sample;
+#X text 112 249 write to a file;
#X connect 1 0 2 0;
-#X connect 1 1 14 0;
+#X connect 1 1 13 0;
+#X connect 18 0 1 0;
#X connect 19 0 1 0;
-#X connect 20 0 1 0;
-#X connect 31 0 1 0;
+#X connect 38 0 40 0;
+#X connect 39 0 38 0;
+#X connect 40 0 1 0;
From 4ec57eaa2fa8fdc2a0930ec21b6bb41f559cc0c6 Mon Sep 17 00:00:00 2001
From: porres
Date: Fri, 5 Jan 2024 12:59:54 -0300
Subject: [PATCH 053/450] Documentation (#2167)
* let [soundfiler] save files again.
this is a follow up to https://github.com/pure-data/pure-data/pull/2148
taking into consideration this comment https://github.com/pure-data/pure-data/pull/2148#issuecomment-1836820049
* better document [pd~] messages
closes https://github.com/pure-data/pddp/issues/182
I improved the kind of messages you can send to [pd~] and I have also revised the documentation about pd-messaes and improved it considerably.
---
doc/5.reference/pd-messages.pd | 349 +++++++++++++++------------
doc/5.reference/send-receive-help.pd | 210 ++++++++--------
extra/pd~/pd~-help.pd | 196 ++++++++-------
extra/pd~/pd~-subprocess.pd | 85 +++----
4 files changed, 455 insertions(+), 385 deletions(-)
diff --git a/doc/5.reference/pd-messages.pd b/doc/5.reference/pd-messages.pd
index 4246e522e..d182b877f 100644
--- a/doc/5.reference/pd-messages.pd
+++ b/doc/5.reference/pd-messages.pd
@@ -1,11 +1,10 @@
-#N canvas 240 42 1000 661 12;
-#X msg 733 137 dsp \$1;
-#X msg 577 149 \; pd dsp 0;
-#X text 757 108 turn DSP engine on/off;
-#X msg 577 107 \; pd dsp 1;
+#N canvas 248 43 1000 661 12;
+#X msg 733 127 dsp \$1;
+#X msg 577 139 \; pd dsp 0;
+#X text 757 98 turn DSP engine on/off;
+#X msg 577 97 \; pd dsp 1;
#X msg 56 309 \; pd compatibility 0.52;
#X text 29 147 The 'compatibility' message takes a version number and sets the behavior of some objects back to that particular version. This can be useful in some cases if you want to guarantee that your patch will work in the same way as in the version you created it. This is because sometimes a new version of Pd may promote a change in the behavior of the object (usually to fix a bug) that can also break or change the result of a patch., f 62;
-#X text 35 376 Objects that change their behavior according to the set compatibility have that information in their help file.;
#X text 45 288 set compatibility to Pd 0.52;
#X text 273 277 set to Pd 0.49;
#X text 107 422 For example \, check the help file of:, f 18;
@@ -22,69 +21,61 @@
#X obj 176 380 delay;
#X floatatom 176 311 5 0 8000 0 - - - 0;
#X text 79 311 milliseconds:;
-#X text 63 380 sends a bang after the time amount, f 12;
-#X text 399 415 tells pd to 'fast-forward' and render a given amount of time in ms, f 35;
-#X msg 348 371 start 88200;
#X obj 348 557 tabwrite~ fast-forward;
-#X msg 176 268 6000;
-#N canvas 0 22 450 278 (subpatch) 0;
-#X array fast-forward 441000 float 2;
-#X coords 0 1 441000 -1 250 120 1 0 0;
-#X restore 411 209 graph;
#X obj 371 463 noise~;
#X obj 371 522 *~;
-#X obj 389 493 osc~ 0.2;
#X text 479 335 --- 10 sec ---;
-#X text 82 22 Pd is mostly used to generate and process things in realtime \, nonetheless \, the "fast-forward" message allows you to 'render' an amount of audio faster than realtime (and as fast as your process can handle) - this is also called 'batch processing'. In this example we use it to record 6 seconds of amplitude modulation white noise into an array., f 76;
-#X text 82 105 This is very useful if you want to process a pre recorded audio in a Pd patch or to generate an audio file with a generative (or automated) patch. You can also use [soundfiler] to export to a sound file or directly use [writesf~] instead. The 'fast-forward' message takes a time in milliseconds to fast forward to. Check the example, f 76;
#X msg 62 240 \; pd dsp \$1;
#X obj 62 205 set-dsp-tgl;
#X text 93 209 <-- DSP on/off (make sure it is on);
-#X text 216 266 <-- time amount to render (6 seconds), f 19;
#X text 219 310 <-- set other lengths;
#X text 376 422 <--;
#X text 423 463 <-- white noise generator;
#X text 76 448 stops the --> recording, f 13;
-#X text 150 381 -->;
-#X text 439 369 <-- start recording 2 seconds into the table, f 22;
#X text 175 558 records to the array -->;
#X text 406 522 <-- amplitude modulation;
-#X connect 0 0 11 0;
+#X text 82 22 Pd is mostly used to generate and process things in realtime \, nonetheless \, the "fast-forward" message allows you to 'render' an amount of audio faster than realtime (and as fast as your CPU can handle) - this is also called 'batch processing'. In this example we use it to record 6 seconds of amplitude modulated white noise into an array., f 76;
+#X text 82 105 This is very useful if you want to process a pre recorded audio in a Pd patch or to generate an audio file with a generative (or automated) patch. You can also use [soundfiler] to export to a sound file or directly use [writesf~] instead. The 'fast-forward' message takes a time in milliseconds to fast forward to. Check the example below., f 76;
+#X text 354 373 <-- start recording;
+#X msg 176 268 5000;
+#X text 216 266 <-- time amount to render (5 seconds), f 19;
+#N canvas 0 22 450 278 (subpatch) 0;
+#X array fast-forward 441000 float 2;
+#X coords 0 1 441000 -1 250 120 1 0 0;
+#X restore 411 209 graph;
+#X text 399 415 tells pd to 'fast-forward' and render the given amount of time in ms, f 37;
+#X obj 389 493 osc~ 0.25;
+#X text 57 379 sends a bang --> after the given time amount, f 16;
+#X connect 0 0 8 0;
#X connect 1 0 0 0;
#X connect 2 0 5 0;
#X connect 2 1 3 0;
-#X connect 2 2 10 0;
+#X connect 2 2 8 0;
#X connect 3 0 4 0;
#X connect 5 0 1 0;
#X connect 6 0 2 0;
-#X connect 10 0 11 0;
-#X connect 12 0 6 0;
-#X connect 14 0 15 0;
-#X connect 15 0 11 0;
-#X connect 16 0 15 1;
-#X connect 21 0 20 0;
-#X restore 788 307 pd fast-forward;
-#N canvas 446 153 828 532 other-messages 0;
+#X connect 9 0 10 0;
+#X connect 10 0 8 0;
+#X connect 13 0 12 0;
+#X connect 24 0 6 0;
+#X connect 28 0 10 1;
+#X restore 777 294 pd fast-forward;
+#N canvas 469 143 828 532 other-messages 0;
#X msg 472 154 \; pd quit;
-#X obj 142 182 pdcontrol;
-#X msg 142 154 dir;
+#X obj 112 192 pdcontrol;
+#X msg 112 164 dir;
#X obj 471 119 s pd;
#X msg 471 92 quit;
#X msg 634 236 \; pd verifyquit;
-#X text 37 74 The "open" message opens a Pd file and takes two symbols \, the first is the Pd filename and the second is the directory where it lives. You can use this to open desired patches from within a patch., f 53;
-#X msg 142 212 \; pd open help-intro.pd \$1;
-#X obj 76 411 pdcontrol;
-#X msg 76 383 dir;
-#X msg 76 441 \; pd menunew new-patch \$1;
-#X text 458 31 And here are some more:, f 12;
+#X obj 86 426 pdcontrol;
+#X msg 86 398 dir;
#X obj 567 18 cnv 15 170 100 empty empty empty 20 12 0 14 #f88c7c #404040 0;
#X text 595 79 UNSAVED PATCHES WILL BE LOST!!!, f 16;
#X obj 544 148 cnv 15 178 45 empty empty empty 20 12 0 14 #f88c7c #404040 0;
-#X text 39 272 The "menunew" message generates a new empty Pd file (but doesn't save it to disk unless you save the file.) It takes two symbols \, the first is the Pd filename and the second is the directory where it will be saved. You can use this for dynamic patching (see next section on parent patch)., f 51;
#X text 42 29 Here are some more messages Pd receives that may be useful., f 31;
#X text 552 152 <-- You've been warned. Do it at your own risk!, f 23;
-#X text 152 410 <-- get currently directory;
-#X text 218 181 <-- get currently directory;
+#X text 162 425 <-- get currently directory;
+#X text 188 191 <-- get currently directory;
#N canvas 0 22 450 278 (subpatch) 0;
#X coords 0 1 100 -1 172 102 1;
#X restore 566 17 graph;
@@ -96,23 +87,28 @@
#X msg 445 450 \; pd perf \$1;
#X obj 445 411 tgl 22 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
#X text 437 304 The 'perf 1' message turns "performance" mode on \, and 'perf 0' turns it off. In performance mode \, a "close this window?" message appears when you try to close an unmodified patch. Also \, a "really quit?" message appears when you try to quit Pd and no changes have been made to the patch., f 49;
-#X text 562 419 Note that the "quit" message to Pd still mercilessly quits the Pd application \, even in this mode., f 31;
-#X connect 1 0 7 0;
+#X msg 112 222 \; pd open clone-abs-a.pd \$1;
+#X text 37 74 The "open" message opens a Pd file and takes two symbols \, the first is the Pd filename and the second is the directory where it lives. You can use this to open desired patches from within a patch - a.k.a" dynamic patching" (see next section on parent patch)., f 53;
+#X text 39 282 The "menunew" message generates a new empty Pd file (but doesn't save it to disk unless you save the file.) It takes two symbols \, the first is the Pd filename and the second is the directory where it will be saved. This is also another form of dynamic patching (see next section on parent patch)., f 51;
+#X text 460 24 And here are some more messages:, f 12;
+#X text 562 419 Note that even in this mode the "quit" message to Pd will still mercilessly quit the Pd application., f 29;
+#X msg 86 456 \; pd menunew new-patch.pd \$1;
+#X connect 1 0 22 0;
#X connect 2 0 1 0;
#X connect 4 0 3 0;
-#X connect 8 0 10 0;
-#X connect 9 0 8 0;
-#X connect 25 0 24 0;
-#X restore 790 358 pd other-messages;
+#X connect 6 0 27 0;
+#X connect 7 0 6 0;
+#X connect 20 0 19 0;
+#X restore 779 345 pd other-messages;
#X text 22 627 see also:;
#X obj 139 628 samplerate~;
#X obj 97 628 send;
#X obj 228 628 namecanvas;
#X msg 387 628 message;
#X obj 77 24 cnv 15 242 27 empty empty Messages\ you\ can\ send\ to\ Pd: 11 14 0 14 #e0e0e0 #404040 0;
-#X obj 518 440 cnv 15 420 27 empty empty Messages\ you\ can\ send\ to\ Patch\ windows\ (canvases) 15 14 0 14 #e0e0e0 #404040 0;
-#X obj 518 467 cnv 15 420 27 empty empty (aka\ Dynamic\ patching): 117 12 0 14 #e0e0e0 #404040 0;
-#N canvas 565 169 771 410 Dynamic-Patching 0;
+#X obj 524 426 cnv 15 420 27 empty empty Messages\ you\ can\ send\ to\ Patch\ windows\ (canvases) 15 14 0 14 #e0e0e0 #404040 0;
+#X obj 524 453 cnv 15 420 27 empty empty (aka\ Dynamic\ patching): 117 12 0 14 #e0e0e0 #404040 0;
+#N canvas 465 177 863 411 Dynamic-Patching 0;
#N canvas 338 52 659 663 creating-boxes 0;
#X obj 91 523 send pd-creating-boxes;
#X text 19 22 The 'obj' message creates objects boxes. It needs to be followed by a pair of x/y coordinates and then the object name followed by creation arguments (if necessary)., f 60;
@@ -135,53 +131,34 @@
#X connect 4 0 0 0;
#X connect 5 0 0 0;
#X connect 6 0 0 0;
-#X restore 181 294 pd creating-boxes;
-#N canvas 778 286 529 443 loadbang 0;
-#X obj 94 331 s pd-loadbang-example;
-#N canvas 376 356 304 192 loadbang-example 0;
-#X restore 307 196 pd loadbang-example;
-#X text 63 112 Creating a [loadbang] object itself via dynamic patching also doesn't make it fire. So you may also need to send a 'loadbang' message afterwards., f 58;
-#X msg 114 263 loadbang;
-#X msg 94 197 clear \, obj 100 100 bng \, obj 100 75 loadbang \, connect 1 0 0 0 \, vis 1, f 23;
-#X text 184 264 fire loadbang;
-#X msg 133 300 clear \, vis 0;
-#X obj 341 327 s pd-loadbang;
-#X msg 341 298 loadbang;
-#X text 331 257 also work for subpatches., f 13;
-#X text 63 42 A 'loadbang' message will make [loadbang] objects output a bang. This is useful because when you create abstractions that contain a loadbang object \, they don't get fired \, so you have to force fire after they get created ., f 58;
-#X text 55 372 The 'loadbang' message will fire [loadbang] objects that are placed in the named canvas and also in subwindows of that canvas \, but not other loadbang objects elsewhere.;
-#X connect 3 0 0 0;
-#X connect 4 0 0 0;
-#X connect 6 0 0 0;
-#X connect 8 0 7 0;
-#X restore 591 269 pd loadbang;
-#X obj 240 171 namecanvas;
+#X restore 283 353 pd creating-boxes;
+#X obj 275 158 namecanvas;
#N canvas 461 65 592 579 Data-Structures 0;
#X msg 141 491 clear;
#X msg 41 364 vis \$1;
#X obj 41 334 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#N canvas 523 391 191 85 ds2 0;
-#N canvas 50 470 557 157 template-toplevel 0;
+#N canvas 523 391 231 124 ds2 0;
+#N canvas 261 467 557 157 template-toplevel 0;
#X obj 21 94 plot bazoo 700 3 10 20 20;
#X obj 21 68 drawpolygon q 4 0 0 20 z z -5 10 20;
#X obj 21 30 struct template-toplevel float x float y float z float q array bazoo template-element;
-#X restore 11 11 pd template-toplevel;
-#N canvas 199 231 600 239 template-element 0;
+#X restore 32 29 pd template-toplevel;
+#N canvas 280 487 477 161 template-element 0;
#X obj 58 83 drawpolygon 10 2 5 0 0 -5 -5 0 0 5 5 0;
#X obj 59 48 struct template-element float x float y float w;
-#X restore 11 34 pd template-element;
-#X restore 407 456 pd ds2;
+#X restore 32 62 pd template-element;
+#X restore 457 460 pd ds2;
#X text 65 334 show/hide;
#N canvas 361 282 477 221 ds 0;
-#X obj 52 45 filledcurve 990 0 1 0 0 50 0 50 50 0 50;
-#X obj 52 72 drawcurve 0 1 15 15 20 15 20 20 15 20 15 15;
-#X obj 52 99 drawcurve 0 1 30 15 35 15 35 20 30 20 30 15;
-#X obj 52 126 filledcurve 999 0 1 10 25 25 45 40 25 25 35 10 25;
+#X obj 54 44 filledcurve 990 0 1 0 0 50 0 50 50 0 50;
+#X obj 54 71 drawcurve 0 1 15 15 20 15 20 20 15 20 15 15;
+#X obj 54 98 drawcurve 0 1 30 15 35 15 35 20 30 20 30 15;
+#X obj 54 125 filledcurve 999 0 1 10 25 25 45 40 25 25 35 10 25;
#X obj 54 17 struct ds float x float y symbol sym;
-#X obj 52 153 drawsymbol sym 55 25 0;
-#X restore 456 401 pd ds;
+#X obj 54 152 drawsymbol sym 55 25 0;
+#X restore 456 399 pd ds;
#X msg 100 366 scalar ds 225 225 -hi_there!!;
-#X text 317 362 add data structure scalar 'ds' (see [pd ds]) and 3 fields., f 30;
+#X text 317 360 add data structure scalar 'ds' (see [pd ds]) and 3 fields., f 30;
#X msg 117 407 read ds-text.txt;
#X text 187 492 clean it up;
#X msg 127 432 write ds-text-2.txt;
@@ -189,12 +166,10 @@
#N canvas 164 235 514 421 \$0-DS-example 0;
#X restore 337 312 pd \$0-DS-example;
#X obj 102 526 s pd-\$0-DS-example;
-#X text 66 242 Note you can also use "\$0" to give local names to subpatches. This is useful for abstractions in general. In this case we need to use [send] as "\$0" doesn't work in messages., f 61;
-#X text 70 14 A 'vis 1' message shows the window while 'vis 0' hides it. The 'read' and 'write' messages can be used to import and export contents of a window (used for Data Structures). The 'clear' message clears the contentes of a window whatever they are (objects \, Data Structures \, arrays \, anything). A 'scalar' message adds a Data Structure scalar to the window., f 62;
#X text 216 312 click to open =>;
#X text 271 431 read/write from/to text (see [pd ds2]);
-#X text 70 109 For more on Data Structures \, check section 4.data.structures in Pd's tutorial examples.;
-#X obj 91 166 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X text 70 109 For more on Data Structures \, check section 4.data.structures in Pd's tutorial examples., f 61;
+#X obj 102 166 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#N canvas 491 316 412 249 open 0;
#X obj 58 49 inlet;
#X obj 58 105 pdcontrol;
@@ -203,8 +178,10 @@
#X connect 0 0 2 0;
#X connect 1 0 3 0;
#X connect 2 0 1 0;
-#X restore 91 196 pd open;
-#X text 115 165 <-- open first example of the 4.Data.Structure section;
+#X restore 102 196 pd open;
+#X text 126 165 <-- open first example of the 4.Data.Structure section;
+#X text 66 242 Note you can also use "\$0" to give local names to subpatches. In this case we need to use [send] (as "\$0" doesn't work in messages)., f 61;
+#X text 70 16 The 'read' and 'write' messages can be used to import and export contents of a window \, which is something used for Data Structures. A 'scalar' message adds a Data Structure scalar to the window. The 'clear' message clears the contentes of a window whatever they are (objects \, Data Structures \, arrays \, anything)., f 61;
#X connect 0 0 13 0;
#X connect 1 0 13 0;
#X connect 2 0 1 0;
@@ -212,8 +189,8 @@
#X connect 8 0 13 0;
#X connect 10 0 13 0;
#X connect 11 0 0 0;
-#X connect 19 0 20 0;
-#X restore 288 367 pd Data-Structures;
+#X connect 17 0 18 0;
+#X restore 611 67 pd Data-Structures;
#N canvas 691 48 597 554 (dis)connecting-boxes 0;
#X obj 79 482 send pd-connect-boxes;
#N canvas 413 247 259 224 connect-boxes 0;
@@ -235,82 +212,131 @@
#X connect 7 0 0 0;
#X connect 8 0 0 0;
#X connect 9 0 0 0;
-#X restore 547 72 pd (dis)connecting-boxes;
-#X text 595 223 loadbang handling:, f 9;
-#N canvas 509 124 849 512 save 0;
+#X restore 596 155 pd (dis)connecting-boxes;
+#N canvas 407 108 849 512 save 0;
#X msg 326 121 menusave;
#X msg 367 171 menusaveas;
#X msg 386 221 menuclose;
-#X obj 76 206 pdcontrol;
-#X msg 76 178 dir;
-#X msg 76 236 \; pd menunew new-example \$1;
-#X obj 367 437 s pd-new-example;
-#X text 398 108 this will save and create the patch in the directory you created. It'll also rewrite if it's already saved., f 39;
#X text 453 163 opens a dialog for you to choose where to save., f 24;
-#X obj 96 379 s pd-new-example;
#X msg 96 350 text 100 100 very nice;
-#X msg 411 399 vis \$1;
-#X obj 411 369 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 480 366 note 'vis 0' doesn't close the patch \, just hides it (and shows it too if it's opened)., f 31;
-#X text 113 326 add something;
+#X msg 426 394 vis \$1;
+#X obj 426 364 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
#X obj 405 273 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
#X msg 405 303 dirty \$1;
-#X text 466 214 Depending if changes were made with some dynamic patching messages \, it closes without saving., f 48;
-#X text 55 120 So first let's send a message to Pd to create a new patch/canvas., f 32;
-#X text 151 37 In this example we are sending messages to the main window of a different patch that we first create.;
-#X text 478 267 Note that Pd won't ask you either to save changes in the same case as above. To make sure it asks \, you can use 'dirty 1'. Conversely \, 'dirty 0' makes Pd ignore changes you made and doesn't ask you to save when you close., f 47;
-#X text 110 177 <-- go;
-#X connect 0 0 6 0;
-#X connect 1 0 6 0;
-#X connect 2 0 6 0;
-#X connect 3 0 5 0;
-#X connect 4 0 3 0;
-#X connect 10 0 9 0;
-#X connect 11 0 6 0;
-#X connect 12 0 11 0;
-#X connect 15 0 16 0;
-#X connect 16 0 6 0;
-#X restore 661 338 pd save;
-#X text 529 329 Other messages (saving a patch):, f 17;
-#X text 92 347 clear \, vis \, read \, write \, scalar (Data Structures) and "\$0":, f 34;
-#N canvas 527 328 801 383 abstractions 0;
-#X text 46 29 You can create abstractions just like you would create any other object in Pd! All you need to do is have the name of the abstraction as the object name., f 48;
-#X obj 102 162 send pd-abstractions;
-#X msg 102 122 obj 150 220 help-intro;
-#X text 269 121 <= click;
-#X text 55 265 In this example we loaded another Pd file as an abstraction that resides on the same folder. In this case it's not an actual object (and used as such) \, but another patch used in Pd's documentation., f 48;
-#X obj 512 214 send pd-help-intro.pd;
-#X msg 512 182 vis \$1;
-#X obj 512 154 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 427 41 You probably just want to use [namecanvas] to name an abstraction's window and send messages to it (please \, again \, refer to its help file). But you can also use the abstraction's file name to send it messages. In this case you need to end with ".pd" \, see below:, f 46;
-#X text 458 266 This can be particularly important for handling "loadbangs" as the next example on the parent patch shows., f 40;
-#X connect 2 0 1 0;
+#X text 157 37 In this example we are sending messages to the main window of a different patch that we first create.;
+#X obj 70 195 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
+#X obj 70 224 openpanel 1;
+#X text 107 325 Now add something;
+#X text 98 195 <-- choose a directory;
+#X text 398 108 this will save and create the patch in the chosen directory. It'll also rewrite if it's already saved/created., f 40;
+#X msg 70 254 \; pd menunew new-example.pd \$1;
+#X obj 96 379 s pd-new-example.pd;
+#X obj 367 437 s pd-new-example.pd;
+#X text 478 267 Note that Pd won't ask you to save changes if they were made via dynamic patching. To make sure it asks you \, you can use the 'dirty 1' message. Conversely \, 'dirty 0' makes Pd ignore changes you made and doesn't ask you to save when you close the patch., f 47;
+#X text 466 214 Closes the patch but asks you to save if changes were made (see considerations below)., f 48;
+#X text 43 99 So first let's send a message to Pd to open a new patch/canvas in a directory of your choosing. Note that the file isn't saved or created yet in your hard drive., f 34;
+#X connect 0 0 17 0;
+#X connect 1 0 17 0;
+#X connect 2 0 17 0;
+#X connect 4 0 16 0;
+#X connect 5 0 17 0;
#X connect 6 0 5 0;
-#X connect 7 0 6 0;
-#X restore 578 172 pd abstractions;
-#X text 31 217 Many of the menu entries in Pd end up making Pd send a message to a canvas name. For instance \, when you create an object or message box. See example below for creating 'boxes'., f 62;
-#X text 586 127 handling abstractions:, f 13;
-#X text 523 28 You can connect and disconnect boxes. See subpatch below:, f 30;
-#X text 44 156 For reference \, please check the help file of -->, f 26;
-#X obj 343 172 pdcontrol;
-#X text 323 172 &;
-#X text 31 21 You can communicate with a Pd window by sending messages to the name of the file (which communicates to the main window of a patch or abstraction). You can also communicate with a subpatch's window by sending messages to the subpatch's name. In both cases you need to precede the send name with 'pd-'. In the case of abstractions \, you also need to end with ".pd". Alternatively you can name a main window or a subpatch with [namecanvas] or use [pdcontrol]., f 65;
-#X restore 695 569 pd Dynamic-Patching;
+#X connect 7 0 8 0;
+#X connect 8 0 17 0;
+#X connect 10 0 11 0;
+#X connect 11 0 15 0;
+#X restore 714 339 pd save;
+#X text 582 330 Other messages (saving a patch):, f 17;
+#X text 572 111 You can connect and disconnect boxes. See subpatch below:, f 30;
+#X text 79 143 For reference \, please check the help file of -->, f 26;
+#X obj 378 159 pdcontrol;
+#X text 358 159 &;
+#X text 45 268 Many of the menu entries in Pd (for instance \, when you create an object or message box) end up causing Pd to send a message to a named canvas. We can abuse this and also use such messages to control a canvas from a patch. See example below for how to create 'boxes'., f 62;
+#X text 596 210 handling abstractions and loadbangs:, f 22;
+#N canvas 260 23 995 524 abstractions 0;
+#X obj 119 173 send pd-abstractions;
+#X obj 539 262 s pd-loadbang-example;
+#N canvas 376 356 304 192 loadbang-example 0;
+#X restore 782 211 pd loadbang-example;
+#X msg 559 194 loadbang;
+#X msg 539 118 clear \, obj 100 100 bng \, obj 100 75 loadbang \, connect 1 0 0 0 \, vis 1, f 23;
+#X msg 578 231 clear \, vis 0;
+#X msg 615 434 loadbang;
+#X text 628 180 fire [loadbang] <-- objects, f 15;
+#X obj 615 463 s pd-abstractions;
+#X obj 802 436 loadbang;
+#X obj 802 460 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
+#X msg 119 133 obj 150 225 rev3~ 100 90 3000 20;
+#X msg 222 405 loadbang;
+#X obj 222 445 send pd-rev3~.pd;
+#X text 46 276 A 'loadbang' message will make [loadbang] objects output a bang. This is useful because when you create abstractions that contain a [loadbang] object (like [rev3~]) \, they don't get fired - so you have to force fire a 'loadbang' after they get created. One way to do this is to send the loadbang message to the abstraction file name.;
+#X text 504 33 Note that creating a [loadbang] object itself via dynamic patching doesn't make it fire up either. So you probably want to send a 'loadbang' message afterwards.;
+#X text 46 29 You can create abstractions just like you would create any other object in Pd. All you need to do is have the name of the abstraction as the object name followed by arguments if needed or desired. In this example we load [rev3~] \, an abstraction from the 'extra' library.;
+#X text 518 318 The 'loadbang' message will fire [loadbang] objects that are placed in the canvas and also in subwindows of that canvas \, but not other loadbang objects elsewhere. Hence \, sending a loadbang message to this window will fire a loadbang in [rev3~] and in [pd loadbang-example] (as well as in this window of course)., f 57;
+#X connect 3 0 1 0;
+#X connect 4 0 1 0;
+#X connect 5 0 1 0;
+#X connect 6 0 8 0;
+#X connect 9 0 10 0;
+#X connect 11 0 0 0;
+#X connect 12 0 13 0;
+#X restore 629 257 pd abstractions \; and loadbangs;
+#N canvas 550 46 607 633 vis 0;
+#X msg 303 335 vis \$1;
+#X obj 303 305 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 327 305 show/hide;
+#X obj 170 526 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#N canvas 491 316 470 254 open 0;
+#X obj 58 49 inlet;
+#X obj 58 105 pdcontrol;
+#X msg 58 78 dir;
+#X msg 58 132 \; pd open 05.counter.pd \$1/../2.control.examples;
+#X connect 0 0 2 0;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X restore 170 576 pd open;
+#X obj 210 345 rev1~;
+#X obj 303 370 s pd-rev1~.pd;
+#N canvas 164 235 514 421 subpatch 0;
+#X restore 164 139 pd subpatch;
+#X msg 288 131 vis \$1;
+#X obj 288 101 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 312 101 show/hide;
+#X obj 288 170 s pd-subpatch;
+#X text 91 24 A 'vis 1' message shows the window while 'vis 0' hides it (so it does't get closed). In order to send messages to a subpatch name \, you need to precede its name with 'pd-'.;
+#X msg 332 542 vis \$1;
+#X obj 332 512 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 356 512 show/hide;
+#X text 89 413 The thing is that an abstraction is a pd file that's loaded in another patch \, so nothing differs in respect to other pd files that are opened but not loaded as abstractions. Let's \, for instance \, open an arbitrary .pd file from Pd's control tutorial (05.counter.pd) and communicate with it.;
+#X obj 332 581 s pd-05.counter.pd;
+#X text 194 525 <-- first open file, f 11;
+#X text 89 210 In the cases of abstractions and patch files you also need to precede the file name with 'pd-' \, but you also have to end it with the '.pd' extension (actually the extension is part of the window name \, so nothing is really different). Let's check this in practice with the [rev1~] abstraction., f 61;
+#X connect 0 0 6 0;
+#X connect 1 0 0 0;
+#X connect 3 0 4 0;
+#X connect 8 0 11 0;
+#X connect 9 0 8 0;
+#X connect 13 0 17 0;
+#X connect 14 0 13 0;
+#X restore 314 218 pd vis;
+#X text 569 24 clear \, read \, write \, scalar (Data Structures) and "\$0":, f 34;
+#X text 151 206 Let's start with the simple "vis" message:, f 21;
+#X text 31 21 You can communicate with a Pd window by sending messages to the name of the pd file (which communicates to the main window of a patch or abstraction). You can also communicate with a subpatch's window. This will be shown shortly but note first that you can also name any window (main or subpatch) with [namecanvas] or \, alternatively \, use [pdcontrol] to send the same messages here documented., f 65;
+#X restore 679 561 pd Dynamic-Patching;
#X text 87 500 The set-tracing message is useful for debugging with the [trace] object. Check its help file., f 47;
-#X text 601 519 Open subpatch for documentation on how to send messages to to a patch window:, f 38;
#X obj 265 326 send pd;
#X text 29 74 We can use both the [send] object or message boxes to send messages to Pd. Here are some messages that makes sense for you to send to Pd from within a patch. Conversely \, you can also send Pd these messages via Pd's command line., f 62;
-#X obj 733 166 send pd;
+#X obj 733 156 send pd;
#X msg 265 299 compatibility 0.49;
-#X text 555 34 The message "dsp 1" turns DSP on and "dsp 0" turns it off., f 32;
-#X obj 733 109 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 595 24 The message "dsp 1" turns DSP on and "dsp 0" turns it off., f 32;
+#X obj 733 99 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
#X obj 5 615 cnv 1 984 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#N canvas 0 22 450 278 (subpatch) 0;
#X coords 0 1 100 -1 244 28 1;
#X restore 76 24 graph;
#N canvas 0 22 450 278 (subpatch) 0;
#X coords 0 1 100 -1 421 54 1;
-#X restore 517 441 graph;
+#X restore 523 427 graph;
#X text 780 627 updated for Pd version 0.54;
#X obj 310 628 pdcontrol;
#N canvas 543 122 589 553 dsp-start/stop 0;
@@ -324,18 +350,21 @@
#X msg 223 284 \; pd dsp \$1;
#X obj 223 249 set-dsp-tgl;
#X text 254 253 <-- DSP on/off;
-#X text 86 178 These messages are used in this helper abstraction below to set the toggle according to the DSP state. This abstraction is used in Pd's documentation. Open it to check it out.;
-#X text 85 354 Note that the you get a bang from 'pd-dsp-started' not only when audio is turned on \, but whenever the DSP chain gets updated \, as in new audio connections and changes in settings such as a new sample rate. Check the help file of [samplerate~] that uses this feature to output the sample rate whenever it changes., f 63;
#X text 255 467 see also:;
#X obj 330 468 samplerate~;
+#X text 86 178 These messages are used in the helper abstraction below to set the toggle according to the DSP state. This abstraction is used in Pd's documentation. Open it to check it out.;
+#X text 85 354 Note that the you get a bang from 'pd-dsp-started' not only when audio is turned on \, but whenever the DSP chain gets updated \, as with new audio connections \, changes in settings such as a new sample rate or when the patch is saved. Check the help file of [samplerate~] that uses this feature to output the sample rate whenever it changes., f 63;
#X connect 1 0 0 0;
#X connect 2 0 5 0;
#X connect 8 0 7 0;
-#X restore 786 236 pd dsp-start/stop;
-#X text 536 222 Pd sends you bangs when DSP is turned on or off and more \, see -->, f 34;
-#X text 548 291 The "fast-forward" message to Pd allows batch processing. Open --> the subpatch for an example., f 33;
-#X text 568 357 Here are some other useful --> messages you can send to Pd., f 30;
-#X connect 0 0 29 0;
-#X connect 13 0 12 0;
-#X connect 30 0 27 0;
-#X connect 32 0 0 0;
+#X restore 778 234 pd dsp-start/stop;
+#X text 537 278 The "fast-forward" message to Pd allows batch processing. Open --> the subpatch for an example., f 33;
+#X text 557 344 Here are some other useful --> messages you can send to Pd., f 30;
+#X text 585 507 Open the following subpatch for documentation on how to send messages to a patch window:, f 45;
+#X obj 456 628 pd~;
+#X text 35 376 Objects that change their behavior according to the set compatibility have that information in their help files.;
+#X text 572 222 Pd sends you bangs when DSP is turned on or off \, see -->, f 28;
+#X connect 0 0 27 0;
+#X connect 12 0 11 0;
+#X connect 28 0 25 0;
+#X connect 30 0 0 0;
diff --git a/doc/5.reference/send-receive-help.pd b/doc/5.reference/send-receive-help.pd
index 5f71ebe87..f145a517c 100644
--- a/doc/5.reference/send-receive-help.pd
+++ b/doc/5.reference/send-receive-help.pd
@@ -1,67 +1,30 @@
-#N canvas 324 23 915 656 12;
+#N canvas 335 23 886 675 12;
#X obj 33 15 send;
-#X obj 26 120 send help-send1;
-#X obj 182 121 send help-send1;
-#X obj 332 121 send help-send2;
-#X obj 26 150 receive help-send1;
-#X obj 182 150 receive help-send2;
-#X obj 332 150 receive help-send2;
-#X floatatom 26 95 5 0 0 0 - - - 0;
-#X floatatom 182 98 5 0 0 0 - - - 0;
-#X floatatom 332 97 5 0 0 0 - - - 0;
-#X floatatom 26 174 5 0 0 0 - - - 0;
-#X floatatom 182 176 5 0 0 0 - - - 0;
-#X floatatom 332 174 5 0 0 0 - - - 0;
+#X obj 123 174 send help-send1;
+#X obj 298 175 send help-send1;
+#X obj 123 214 receive help-send1;
+#X obj 298 214 receive help-send2;
+#X floatatom 123 149 5 0 0 0 - - - 0;
+#X floatatom 298 152 5 0 0 0 - - - 0;
+#X floatatom 124 285 5 0 0 0 - - - 0;
+#X floatatom 123 238 5 0 0 0 - - - 0;
+#X floatatom 298 240 5 0 0 0 - - - 0;
+#X floatatom 298 319 5 0 0 0 - - - 0;
#X obj 374 14 s;
-#X msg 199 306 \; help-send1 34 \; help-send2 67;
-#X obj 156 540 send;
-#X msg 181 448 symbol help-send1;
-#X msg 194 477 symbol help-send2;
-#X floatatom 127 478 5 0 0 0 - - - 0;
-#X symbolatom 181 509 12 0 0 0 - - - 0;
-#X obj 599 197 value y;
-#X obj 525 214 send y;
-#X floatatom 525 186 5 0 0 0 - - - 0;
-#X obj 599 166 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X floatatom 599 226 5 0 0 0 - - - 0;
-#X text 29 620 see also:;
+#X msg 255 428 symbol help-send1;
+#X msg 268 457 symbol help-send2;
+#X floatatom 173 436 5 0 0 0 - - - 0;
+#X symbolatom 255 489 12 0 0 0 - - - 0;
+#X text 29 640 see also:;
#X text 72 14 - send messages without patch cords;
#X text 406 13 - abbreviation;
-#X obj 105 619 send~;
-#X obj 482 395 list store 1 2 3;
-#X obj 628 413 float 1.5;
-#X obj 716 413 int 10;
-#X msg 482 367 send x;
-#X obj 804 340 receive x;
-#X listbox 804 374 10 0 0 0 - - - 0;
-#X msg 628 353 send x;
-#X msg 716 352 send x;
+#X obj 105 639 send~;
#X obj 375 40 r;
#X obj 32 41 receive;
#X text 90 40 - receive messages without patch cords;
#X text 407 39 - abbreviation;
-#X obj 155 619 receive~;
-#X floatatom 578 566 5 0 0 0 - x z 0;
-#X obj 676 224 send array;
-#X msg 676 178 0 -1 0 1 0 -1 0 1, f 9;
-#X text 489 454 Note that GUIs have built in send and receive names you can set via properties (right click and check it)., f 40;
-#X text 691 619 updated for Pd version 0.52;
-#N canvas 0 22 450 278 (subpatch) 0;
-#X array array 7 float 2;
-#X coords 0 1.1 7 -1.1 100 50 1 0 0;
-#X restore 773 186 graph;
-#X msg 639 383 send y;
-#X msg 726 383 send y;
-#X floatatom 809 470 5 0 0 0 - - - 0;
-#X obj 809 442 value y;
-#X text 490 554 "receive x";
-#X text 676 517 "send x";
-#X text 625 560 send in GUIs can also send to value objects., f 22;
-#X text 496 572 "send z";
-#X floatatom 824 570 5 0 0 0 - - - 0;
-#X obj 824 541 value z;
-#X text 499 87 Interaction with other objects (check their help files):;
-#X msg 836 410 send x;
+#X obj 155 639 receive~;
+#X text 651 639 updated for Pd version 0.52;
#N canvas 452 151 914 439 Dealing_with_"\$0" 0;
#X obj 171 164 send \$0-x;
#X obj 294 120 receive \$0-x;
@@ -111,10 +74,9 @@
#X connect 25 0 18 0;
#X connect 26 0 11 0;
#X connect 27 0 7 0;
-#X restore 335 570 pd Dealing_with_"\$0";
-#X msg 223 619 message;
-#X obj 374 619 samplerate~;
-#X obj 285 619 pd-messages;
+#X restore 596 159 pd Dealing_with_"\$0";
+#X msg 223 639 message;
+#X obj 285 639 pd-messages;
#N canvas 725 70 573 568 reference 0;
#X obj 8 53 cnv 5 550 5 empty empty INLETS: 8 18 0 13 #202020 #000000 0;
#X obj 8 86 cnv 1 550 1 empty empty 1st: 8 12 0 13 #9f9f9f #000000 0;
@@ -144,40 +106,96 @@
#X text 106 511 1) symbol -;
#X text 189 511 receive name symbol (default: empty symbol).;
#X text 193 280 send symbol (if given \, 2nd inlet is suppressed \, default: empty symbol)., f 35;
-#X restore 723 31 pd reference;
-#X text 820 32 <= click;
-#X obj 8 77 cnv 1 900 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X obj 8 607 cnv 1 900 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X obj 824 514 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X obj 809 409 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X text 23 225 [send] sends messages to [receive] objects with the same name (set by the argument). They work across windows too. Also \, you can use message boxes to send messages if they start with a semicolon as shown below:;
-#X text 499 110 The [value] object receives floats from [send] objects with the same name as its variable name. You can also use [send] to send messages to arrays with the same name., f 55;
-#X text 479 262 The [receive] object can also get messages from [value] and the other objects below via their "send" messages. Note that [value] can also get these values from these objects (except [list store] because [value] can't deal with lists).;
-#X obj 503 517 hsl 162 19 0 127 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1;
-#X text 7 570 Open subpatch to see how to deal with '\$0' ->;
-#X text 22 378 If invoked without an argument \, [send] is assigned to an empty symbol and creates an inlet to let you set the target via "symbol" messages:, f 54;
-#X connect 4 0 10 0;
-#X connect 5 0 11 0;
-#X connect 6 0 12 0;
-#X connect 7 0 1 0;
-#X connect 8 0 2 0;
-#X connect 9 0 3 0;
-#X connect 16 0 19 0;
-#X connect 17 0 19 0;
-#X connect 18 0 15 0;
-#X connect 19 0 15 1;
-#X connect 20 0 24 0;
+#X restore 681 33 pd reference;
+#X text 778 34 <= click;
+#X obj 8 77 cnv 1 870 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 40 97 [send] sends messages to [receive] objects with the same name (set by the argument). They work across windows too., f 62;
+#X text 34 367 If invoked without an argument \, [send] is assigned to an empty symbol and creates an inlet to let you set the target via a "symbol" message:, f 62;
+#X obj 548 469 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 548 436 r pd-dsp-started;
+#X obj 173 478 s;
+#X obj 124 319 s help-send2;
+#X obj 298 285 r help-send2;
+#X obj 709 334 s pd;
+#X msg 709 302 dsp \$1;
+#X obj 709 273 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
+#X obj 694 468 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 694 435 r pd-dsp-stopped;
+#X text 590 112 Open subpatch below to see how to deal with '\$0', f 27;
+#N canvas 614 47 487 653 Interaction_with_other_objects 0;
+#X msg 294 62 \; help-send1 34 \; help-send2 67;
+#X obj 148 224 value y;
+#X obj 74 241 send y;
+#X floatatom 74 213 5 0 0 0 - - - 0;
+#X obj 148 193 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X floatatom 148 253 5 0 0 0 - - - 0;
+#X obj 31 422 list store 1 2 3;
+#X obj 177 440 float 1.5;
+#X obj 265 440 int 10;
+#X msg 31 394 send x;
+#X obj 353 367 receive x;
+#X listbox 353 401 10 0 0 0 - - - 0;
+#X msg 177 380 send x;
+#X msg 265 379 send x;
+#X floatatom 127 593 5 0 0 0 - x z 0;
+#X obj 225 251 send array;
+#X msg 225 205 0 -1 0 1 0 -1 0 1, f 9;
+#X text 38 481 Note that GUIs have built in send and receive names you can set via properties (right click and check it)., f 40;
+#N canvas 0 22 450 278 (subpatch) 0;
+#X array array 7 float 2;
+#X coords 0 1.1 7 -1.1 100 50 1 0 0;
+#X restore 322 213 graph;
+#X msg 188 410 send y;
+#X msg 275 410 send y;
+#X floatatom 358 497 5 0 0 0 - - - 0;
+#X obj 358 469 value y;
+#X text 39 581 "receive x";
+#X text 225 544 "send x";
+#X text 174 587 send in GUIs can also send to value objects., f 22;
+#X text 45 599 "send z";
+#X floatatom 373 597 5 0 0 0 - - - 0;
+#X obj 373 568 value z;
+#X text 35 24 Interaction with other objects (check their help files):;
+#X msg 385 437 send x;
+#X obj 373 541 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 358 436 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X text 35 137 The [value] object receives floats from [send] objects with the same name as its variable name. You can also use [send] to send messages to arrays with the same name.;
+#X text 28 289 The [receive] object can also get messages from [value] and the other objects below via their "send" messages. Note that [value] can also get these values from these objects (except [list store] because [value] can't deal with lists).;
+#X obj 52 544 hsl 162 19 0 127 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1;
+#X text 50 68 Message boxes also send messages if it starts with a semicolon:, f 32;
+#X connect 1 0 5 0;
+#X connect 3 0 2 0;
+#X connect 4 0 1 0;
+#X connect 9 0 6 0;
+#X connect 10 0 11 0;
+#X connect 12 0 7 0;
+#X connect 13 0 8 0;
+#X connect 16 0 15 0;
+#X connect 19 0 7 0;
+#X connect 20 0 8 0;
#X connect 22 0 21 0;
-#X connect 23 0 20 0;
-#X connect 32 0 29 0;
-#X connect 33 0 34 0;
-#X connect 35 0 30 0;
-#X connect 36 0 31 0;
-#X connect 44 0 43 0;
-#X connect 48 0 30 0;
-#X connect 49 0 31 0;
-#X connect 51 0 50 0;
-#X connect 57 0 56 0;
-#X connect 59 0 51 0;
-#X connect 68 0 57 0;
-#X connect 69 0 51 0;
+#X connect 28 0 27 0;
+#X connect 30 0 22 0;
+#X connect 31 0 28 0;
+#X connect 32 0 22 0;
+#X restore 124 586 pd Interaction_with_other_objects;
+#X text 48 533 The [send] and [receive] objects do interact with other objects in Pd. Open the subpatch below for details.;
+#X obj 8 627 cnv 1 870 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 530 216 Note you can also use [send] and [receive] to communicate with Pd itself., f 43;
+#X text 471 525 For reference \, check "pd-messages" in the "see also" section below \, where such messages to Pd are documented (you'll also find documentation on how to communicate to a named patch window or a patch file in there)., f 55;
+#X text 541 290 A commonly used Pd messages is to turn DSP on and off!, f 21;
+#X text 516 381 The [receive] objects below respond to change in the DSP status., f 45;
+#X connect 3 0 8 0;
+#X connect 4 0 9 0;
+#X connect 5 0 1 0;
+#X connect 6 0 2 0;
+#X connect 7 0 37 0;
+#X connect 12 0 15 0;
+#X connect 13 0 15 0;
+#X connect 14 0 36 0;
+#X connect 15 0 36 1;
+#X connect 35 0 34 0;
+#X connect 38 0 10 0;
+#X connect 40 0 39 0;
+#X connect 41 0 40 0;
+#X connect 43 0 42 0;
diff --git a/extra/pd~/pd~-help.pd b/extra/pd~/pd~-help.pd
index f03b9da08..714d05b06 100644
--- a/extra/pd~/pd~-help.pd
+++ b/extra/pd~/pd~-help.pd
@@ -1,101 +1,123 @@
-#N canvas 368 23 760 715 12;
-#X msg 107 368 foo bar baz;
-#X obj 257 461 osc~ 440;
-#X obj 174 592 env~ 8192;
-#X floatatom 174 631 8 0 0 0 - - - 0;
-#X msg 93 333 pd~ stop;
-#X obj 257 592 env~ 8192;
-#X floatatom 257 631 8 0 0 0 - - - 0;
-#X obj 191 496 *~;
-#X obj 257 496 *~;
-#X obj 37 13 pd~;
-#X text 383 454 Creation args:, f 41;
-#X text 383 522 -fifo sets round-trip delay in blocks;
-#X text 383 538 -pddir sets Pd directory \, e.g. \,, f 41;
-#X text 383 570 -scheddir sets scheduler dir \, e.g. \,, f 41;
-#X text 418 586 .../.../Resources/extra/pd~, f 36;
-#X text 383 505 -sr sets sample rate, f 41;
-#X msg 624 216 \; pd dsp \$1;
-#X obj 4 43 cnv 1 750 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X text 672 12 <= click;
-#N canvas 555 116 719 472 reference 0;
+#N canvas 352 23 762 717 12;
+#X msg 113 380 foo bar baz;
+#X obj 257 471 osc~ 440;
+#X obj 174 618 env~ 8192;
+#X floatatom 174 647 8 0 0 0 - - - 0;
+#X msg 93 340 pd~ stop;
+#X obj 257 618 env~ 8192;
+#X floatatom 257 647 8 0 0 0 - - - 0;
+#X obj 191 521 *~;
+#X obj 257 521 *~;
+#X obj 34 12 pd~;
+#X msg 636 255 \; pd dsp \$1;
+#X obj 4 41 cnv 1 750 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 672 11 <= click;
+#N canvas 555 116 719 456 reference 0;
#X obj 6 35 cnv 5 700 5 empty empty INLETS: 8 18 0 13 #202020 #000000 0;
-#X obj 6 209 cnv 2 700 2 empty empty OUTLETS: 8 12 0 13 #202020 #000000 0;
-#X obj 6 297 cnv 2 700 2 empty empty ARGUMENTS: 8 12 0 13 #202020 #000000 0;
-#X obj 5 445 cnv 5 700 5 empty empty empty 8 18 0 13 #202020 #000000 0;
-#X obj 5 238 cnv 1 700 1 empty empty 1st: 8 12 0 13 #9f9f9f #000000 0;
-#X obj 5 265 cnv 1 700 1 empty empty n: 8 12 0 13 #9f9f9f #000000 0;
+#X obj 6 199 cnv 2 700 2 empty empty OUTLETS: 8 12 0 13 #202020 #000000 0;
+#X obj 6 287 cnv 2 700 2 empty empty ARGUMENTS: 8 12 0 13 #202020 #000000 0;
+#X obj 5 435 cnv 5 700 5 empty empty empty 8 18 0 13 #202020 #000000 0;
+#X obj 5 228 cnv 1 700 1 empty empty 1st: 8 12 0 13 #9f9f9f #000000 0;
+#X obj 5 255 cnv 1 700 1 empty empty n: 8 12 0 13 #9f9f9f #000000 0;
#X obj 42 6 pd~;
-#X obj 5 323 cnv 1 700 1 empty empty flags: 8 12 0 13 #9f9f9f #000000 0;
-#X text 102 329 -ninsig : sets number of input audio channels (default 2)., f 74;
-#X text 102 347 -noutsig : sets number of output audio channels (default 2)., f 74;
+#X obj 5 313 cnv 1 700 1 empty empty flags: 8 12 0 13 #9f9f9f #000000 0;
+#X text 102 319 -ninsig : sets number of input audio channels (default 2)., f 74;
+#X text 102 337 -noutsig : sets number of output audio channels (default 2)., f 74;
#X obj 6 67 cnv 1 700 1 empty empty 1st: 8 12 0 13 #9f9f9f #000000 0;
#X text 60 73 pd~ start -;
#X text 144 105 pd~ stop - stops the pd sub-process., f 78;
#X text 144 122 anything -;
-#X text 221 122 messages besides "pd~" are sent to corresponding objects in the sub-process with the same name as the first element in the message., f 67;
-#X obj 6 180 cnv 1 700 1 empty empty n: 8 12 0 13 #9f9f9f #000000 0;
-#X text 102 383 -fifo : sets number of blocks for round-trip (default 5)., f 74;
-#X text 102 365 -sr : sets sample rate of subprocess (default pd's current)., f 74;
-#X text 102 401 -pddir : sets Pd's directory (needed if different than default)., f 74;
-#X text 102 419 -scheddir : sets scheduler's directory (also needed if different)., f 74;
+#X obj 6 170 cnv 1 700 1 empty empty n: 8 12 0 13 #9f9f9f #000000 0;
+#X text 102 373 -fifo : sets number of blocks for round-trip (default 5)., f 74;
+#X text 102 391 -pddir : sets Pd's directory (needed if different than default)., f 74;
+#X text 102 409 -scheddir : sets scheduler's directory (also needed if different)., f 74;
#X text 77 5 - run a pd sub-process (for multiprocessing).;
-#X text 158 153 signal - signal input if there's a corresponding [adc~] input., f 76;
-#X text 158 186 signal - signal input if there's a corresponding [adc~] input., f 76;
-#X text 143 241 anything - messages from the sub-process sent via [stdout] objects., f 67;
-#X text 158 270 signal - signal output if there's a corresponding [dac~] output., f 64;
+#X text 158 143 signal - signal input if there's a corresponding [adc~] input., f 76;
+#X text 158 176 signal - signal input if there's a corresponding [adc~] input., f 76;
+#X text 143 231 anything - messages from the sub-process sent via [stdout] objects., f 67;
+#X text 158 260 signal - signal output if there's a corresponding [dac~] output., f 64;
#X text 221 73 start a new sub-process. This message takes startup flags and needs a pd file to open., f 67;
#X text 94 44 total number of 'n' signal inlets as given by the -ninsig flag., f 67;
-#X text 94 216 total number of 'n' signal outlets as given by the -noutsig flag., f 69;
-#X restore 578 13 pd reference;
-#X text 29 687 see also:;
-#X obj 105 688 stdout;
-#X text 383 471 -ninsig sets input audio channels, f 41;
-#X text 383 488 -noutsig sets output channels, f 41;
-#X obj 292 496 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 27 53 The [pd~] object starts and manages a Pd sub-process that can communicate with the super-process (this one) via audio channels and/or Pd messages. In this way you can take advantage of multi-core CPUs \, and/or use Pd features from within Max (if you're using the Max version of [pd~])., f 100;
-#X obj 92 532 pd~ -ninsig 2 -noutsig 2 -fifo 20, f 24;
-#X obj 226 496 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 543 686 Updated for Pd version 0.42;
-#X text 72 12 - run a pd sub-process (for multiprocessing);
-#X text 655 186 DSP on/off;
-#X obj 624 182 ../../doc/5.reference/set-dsp-tgl;
-#X msg 66 303 pd~ start -nogui pd~-subprocess.pd;
-#X msg 31 267 pd~ start pd~-subprocess.pd;
-#X text 317 304 (re)starts without the GUI;
-#X obj 3 677 cnv 1 750 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 94 206 total number of 'n' signal outlets as given by the -noutsig flag., f 69;
+#X text 221 122 messages besides "pd~" are sent to the sub-process., f 67;
+#X text 102 355 -sr : sets sample rate of subprocess (default Pd's current)., f 74;
+#X restore 578 12 pd reference;
+#X text 29 690 see also:;
+#X obj 105 691 stdout;
+#X obj 292 521 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X obj 226 521 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 543 689 Updated for Pd version 0.42;
+#X text 69 11 - run a pd sub-process (for multiprocessing);
+#X text 666 224 DSP on/off;
+#X obj 636 221 ../../doc/5.reference/set-dsp-tgl;
+#X msg 17 284 pd~ start pd~-subprocess.pd;
+#X obj 3 680 cnv 1 750 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 347 613 The first outlet reports messages the sub-process sends us via [stdout] objects. Any other outlets are signals corresponding to [dac~] objects in the sub-process., f 55;
-#X text 418 554 .../Pd-0.54-0.app/Contents/Resources;
-#X text 240 261 Sending a new "start" message stops the sub-process (if there's one) and starts a new one., f 52;
-#X obj 92 611 print pd~;
-#X msg 123 454 toggle \$1;
-#X obj 123 417 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
-#X text 200 357 Message besides "pd~" are sent to named objects (such as [receive]) in the sub-process. So "bar baz" is sent to any object named "foo" and an object named "toggle" gets the float to turn the audio output via a [dac~] object., f 77;
-#X text 291 413 Audio input signals appear in [adc~] objects in the sub-process. The sub-process doesn't open real audio devices., f 64;
-#X text 163 333 Stop the sub-process;
-#X text 148 411 Turn audio output on/off, f 13;
-#X text 38 187 ATTENTION: DSP must be running in this process for the sub-process to start and run. This is because its clock is slaved to audio I/O it gets from us! Also note that MIDI objects don't work in a sub-process \, so MIDI messages need to be sent in and out via regular messages., f 80;
-#X text 27 104 Messages with the "pd~" selector control the sub-process. A "pd~ start" message takes a pd file name to open and can take startup flags before the file name. For example \, "-nogui" prevents the sub-process's GUI from appearing. Note that you don't have to specify the number of channels in and out \, since that's set by creation arguments. Aslo \, audio config flags (-audiobuf \, -audiodev \, etc.) are ignored., f 100;
-#X text 270 439 v;
-#X text 270 429 |;
-#X text 270 420 |;
-#X text 274 409 _;
-#X text 280 409 _;
-#X connect 0 0 26 0;
+#X obj 92 631 print pd~;
+#X obj 126 447 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
+#X text 270 451 v;
+#X text 270 442 |;
+#X text 274 431 _;
+#X text 280 431 _;
+#X text 27 49 The [pd~] object starts and manages a Pd sub-process that can communicate with the super-process (this one) via audio channels and/or Pd messages. In this way you can take advantage of multi-core CPUs. The Max version of [pd~] \, on the other hand \, allows you to use Pd features from within Max., f 100;
+#X text 157 340 Stops the sub-process;
+#X msg 126 474 pd dsp \$1;
+#X msg 332 533 pd-pd~-subprocess.pd vis \$1;
+#X obj 333 507 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
+#X msg 333 474 0;
+#X msg 373 474 1;
+#X text 359 506 hide/show window;
+#X obj 162 691 ../../doc/5.reference/pd-messages;
+#X text 549 475 You can communicate to the patch via its file name preceded by 'pd-'. Check the [pd-messages] file in the 'see also' section for more options., f 26;
+#X text 403 474 * <-----------------;
+#X text 291 437 Audio input signals appear in [adc~] objects in the sub-process., f 64;
+#X obj 92 576 pd~ -ninsig 2 -noutsig 2 -fifo 20 -sr 44100, f 24;
+#X text 271 582 <-- see [pd reference] for creation flag's descriptions.;
+#X msg 126 404 0;
+#X msg 166 404 1;
+#X text 148 448 DSP On/Off;
+#X text 206 377 Other messages are sent to the sub-process \, such as to [receive] objects (like 'foo' in this example) and also messages to 'pd' ("pd dsp 1" \, etc). You can also communicate to the patch file itself (see below *)., f 73;
+#X text 579 311 For more about flags \, see:, f 21;
+#N canvas 740 224 546 444 startup-flags 0;
+#X obj 110 237 pdcontrol;
+#X obj 110 177 pdcontrol;
+#X msg 110 147 dir;
+#X msg 110 206 browse \$1/../../doc/1.manual/x3.htm;
+#X text 147 145 <-- Click to open Chapter 3 of Pd's Manual;
+#X text 54 41 For a list of all startup flags you can use please refer to the Pd Manual \, Chapter 3 "Getting Pd to run". More specifically \, go to section 3.5 "Preferences and startup options". You can go to the manual via the "help" and "browser" menus or click the message below., f 63;
+#X text 84 283 Note \, however \, that audio/midi flags are ignored as the sub-process doesn't open real audio and MIDI devices \, so please refer to 'general flags' only.;
+#X text 83 339 The example in the parent patch used the '-nogui' flag to start without the GUI. Also the '-send' flag is used to send a pd message to start DSP right away.;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X connect 3 0 0 0;
+#X restore 611 330 pd startup-flags;
+#X msg 56 315 pd~ start -nogui -send pd dsp 1 pd~-subprocess.pd;
+#X text 218 277 Sending a new "start" message stops the sub-process (if there's one) and starts a new one (DSP must be on).;
+#X text 27 219 ATTENTION: DSP must be running in this process for the sub-process to start and run. This is because its clock is slaved to audio I/O it gets from us!, f 75;
+#X text 27 98 Messages with the "pd~" selector control the sub-process. A "pd~ start" message takes a pd file name to open and optional startup flags before it. For example \, "-nogui" prevents the sub-process's GUI from appearing. Note that you shouldn't specify the number of channels in and out or sample rate via startup flags since that's set by [pd~]'s creation flags. The sub-process doesn't open real audio and MIDI devices \, so audio/midi config flags (-audiodev \, -midiindev \, etc.) are ignored. Messages without the "pd~" selector are sent to the sub-process (see examples/details below). Note that the sub-process cannot communicate with MIDI devices connected to Pd \, so MIDI messages need to be sent in and out via regular messages to the sub-process., f 100;
+#X text 560 225 --------->;
+#X text 407 316 (re)start with flags -->;
+#X connect 0 0 43 0;
#X connect 1 0 7 0;
#X connect 1 0 8 0;
#X connect 2 0 3 0;
-#X connect 4 0 26 0;
+#X connect 4 0 43 0;
#X connect 5 0 6 0;
-#X connect 7 0 26 0;
-#X connect 8 0 26 1;
-#X connect 24 0 8 1;
-#X connect 26 0 39 0;
-#X connect 26 1 2 0;
-#X connect 26 2 5 0;
-#X connect 27 0 7 1;
-#X connect 31 0 16 0;
-#X connect 32 0 26 0;
-#X connect 33 0 26 0;
-#X connect 40 0 26 0;
-#X connect 41 0 40 0;
+#X connect 7 0 43 0;
+#X connect 8 0 43 1;
+#X connect 16 0 8 1;
+#X connect 17 0 7 1;
+#X connect 21 0 10 0;
+#X connect 22 0 43 0;
+#X connect 26 0 33 0;
+#X connect 33 0 43 0;
+#X connect 34 0 43 0;
+#X connect 35 0 34 0;
+#X connect 36 0 35 0;
+#X connect 37 0 35 0;
+#X connect 43 0 25 0;
+#X connect 43 1 2 0;
+#X connect 43 2 5 0;
+#X connect 45 0 26 0;
+#X connect 46 0 26 0;
+#X connect 51 0 43 0;
diff --git a/extra/pd~/pd~-subprocess.pd b/extra/pd~/pd~-subprocess.pd
index 1683cb21d..0f008dd76 100644
--- a/extra/pd~/pd~-subprocess.pd
+++ b/extra/pd~/pd~-subprocess.pd
@@ -1,45 +1,46 @@
-#N canvas 416 56 629 615 12;
-#X obj 89 457 print foo;
-#X obj 314 479 stdout;
-#X msg 314 410 a b c;
-#X obj 127 228 env~ 8192;
-#X floatatom 127 267 8 0 0 0 - - - 0;
-#X obj 350 162 osc~ 440;
-#X msg 261 415 bang;
-#X obj 442 401 loadbang;
-#X obj 201 228 env~ 8192;
-#X floatatom 201 267 8 0 0 0 - - - 0;
-#X msg 330 447 4;
-#X obj 350 278 dac~;
-#X obj 169 187 adc~, f 5;
-#X msg 442 462 \; pd dsp \$1;
-#X text 465 433 DSP on/off;
-#X obj 393 209 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 36 17 This is a test patch to demonstrate the [pd~] object. It's intended as the patch to run in the sub-process. The sub-process (which is a separate instance of Pd) can be called from a Max or Pd super-process., f 78;
-#X obj 419 209 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X obj 442 432 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X obj 350 243 *~;
-#X obj 384 244 *~;
-#X text 36 73 Audio inlets and outlets on the [pd~] object (in the super-process) talk to [adc~] and [dac~] objects here - so \, for instance \, the left [adc~] output here corresponds to the first inlet of the [pd~] object \, and the first channel of [dac~] goes to the second outlet of [pd~] (because the first one is for messages \, as shown further below.), f 78;
-#X obj 89 427 receive foo;
-#X text 26 319 Any message sent to a [stdout] object in this sub-process (below) appears on the first message outlet of the [pd~] object in the super-process. The super-process can send messages to any named objects such as the [receive] object named as 'foo' in this sub-process below ., f 82;
-#X text 34 528 DSP must be on here and in the super-process in order for audio to run. Control objects in this patch will still work with DSP off in the sub-process \, but even so the DSP must still be on in the super-process for time to move forward in the sub-process., f 79;
-#X obj 419 174 receive toggle;
+#N canvas 215 92 1016 541 12;
+#X obj 393 245 print foo;
+#X obj 352 488 stdout;
+#X msg 301 453 a b c;
+#X obj 54 249 env~ 8192;
+#X floatatom 54 279 8 0 0 0 - - - 0;
+#X obj 257 228 osc~ 440;
+#X obj 128 249 env~ 8192;
+#X floatatom 128 279 8 0 0 0 - - - 0;
+#X obj 257 275 dac~;
+#X obj 96 217 adc~, f 5;
+#X obj 381 209 receive foo;
+#X obj 757 167 print dsp-started;
+#X obj 757 264 print dsp-stopped;
+#X obj 757 235 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
+#X obj 757 138 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
+#X obj 352 453 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
+#X floatatom 380 453 5 0 0 0 - - - 0;
+#X obj 757 109 r pd-dsp-started;
+#X obj 757 206 r pd-dsp-stopped;
+#X obj 669 408 ../../doc/5.reference/pd-messages;
+#X msg 626 197 \; pd dsp 1;
+#X obj 381 283 stdout;
+#X obj 626 157 ../../doc/5.reference/set-dsp-tgl;
+#X text 546 21 DSP must be on both in the sub and super-process in order for audio to run. Control objects in this patch will still work if DSP is off in the sub-process \, but even so the DSP must still be on in the super-process for time to move forward in the sub-process., f 61;
+#X text 546 299 Messages sent to 'pd' in the super-process are also possible so you can start/stop the DSP engine in the sub-process and more. This example has [receive] objects that respond to changes in the DSP state from the super process. For reference to all messages you can send to Pd \, open the following documentation patch:, f 61;
+#X text 546 447 Note that the above document also shows how to send messages to a Pure Data file \, which is also a possibility to send messages from the super-process to this canvas (such as 'vis 0' and 'vis 1' as shown in the example in the super-process)., f 61;
+#X text 21 21 This is a test patch to demonstrate the [pd~] object. It's intended as the patch to run in the sub-process \, which is a separate instance of Pd that can be called from a Pd super-process (or also from a Max super-process if you have the Max version of [pd~])., f 68;
+#X text 21 90 Audio inlets and outlets on the [pd~] object (in the super-process) talk to [adc~] and [dac~] objects here - so \, for instance \, the left [adc~] output below corresponds to the first inlet of the [pd~] object. Similarly \, the first channel of [dac~] goes to the second outlet of [pd~] (because the first one is for messages \, as explained below.), f 68;
+#X text 21 328 The super-process can send messages to any named object (such as [receive] objects \, arrays \, GUIs with built-in receive names and [value] objects). In this way \, a 'bar baz' message is received by [receive foo] when the super-process sends 'foo bar baz'. On the other hand \, messages sent to [stdout] objects appear on the first outlet of the [pd~] object in the super-process (and you can have more than one [stdout] object)., f 68;
#X connect 2 0 1 0;
#X connect 3 0 4 0;
-#X connect 5 0 19 0;
-#X connect 5 0 20 0;
-#X connect 6 0 1 0;
-#X connect 7 0 18 0;
-#X connect 8 0 9 0;
-#X connect 10 0 1 0;
-#X connect 12 0 3 0;
-#X connect 12 1 8 0;
-#X connect 15 0 19 1;
-#X connect 17 0 20 1;
+#X connect 5 0 8 0;
+#X connect 5 0 8 1;
+#X connect 6 0 7 0;
+#X connect 9 0 3 0;
+#X connect 9 1 6 0;
+#X connect 10 0 0 0;
+#X connect 10 0 21 0;
+#X connect 13 0 12 0;
+#X connect 14 0 11 0;
+#X connect 15 0 1 0;
+#X connect 16 0 1 0;
+#X connect 17 0 14 0;
#X connect 18 0 13 0;
-#X connect 19 0 11 0;
-#X connect 20 0 11 1;
-#X connect 22 0 0 0;
-#X connect 25 0 17 0;
-#X connect 25 0 15 0;
+#X connect 22 0 20 0;
From 570be229473828253961a77db5b57c5d560cc7c9 Mon Sep 17 00:00:00 2001
From: porres
Date: Fri, 5 Jan 2024 15:04:02 -0300
Subject: [PATCH 054/450] Update loadbang-help.pd
better describe where pd-message is
---
doc/5.reference/loadbang-help.pd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/5.reference/loadbang-help.pd b/doc/5.reference/loadbang-help.pd
index 3a1e6b2a5..991e8c82f 100644
--- a/doc/5.reference/loadbang-help.pd
+++ b/doc/5.reference/loadbang-help.pd
@@ -24,7 +24,7 @@
#X obj 230 283 bng 19 250 50 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000;
#X text 40 54 The [loadbang] object outputs a "bang" message when the containing patch is opened as a document or included in another patch as an abstraction., f 66;
#X text 40 105 [loadbang] objects within abstractions send their "bang" messages before [loadbang] objects in the calling patch. Otherwise \, the order in which the "bangs" are sent from two [loadbang] objects is undefined., f 66;
-#X text 258 183 You can force a [loaddbang] to fire if you send a 'loadbang' message to the patch (see 'pd-messages')., f 35;
#X text 85 15 - send a "bang" when loading the patch;
+#X text 258 183 You can force a [loaddbang] to fire if you send a 'loadbang' message to the patch (see 'pd-messages' in the 'see also' section below)., f 35;
#X connect 0 0 3 0;
#X connect 3 0 1 0;
From 5ef35619719fc56ad7982df788c0b00d7b070b66 Mon Sep 17 00:00:00 2001
From: porres
Date: Fri, 5 Jan 2024 22:23:22 -0300
Subject: [PATCH 055/450] fix pd~ help by removing '-send' flag
discussion in https://github.com/pure-data/pddp/issues/182#issuecomment-1879434988
---
extra/pd~/pd~-help.pd | 40 ++++++++++++++++++-------------------
extra/pd~/pd~-subprocess.pd | 34 ++++++++++++++++---------------
2 files changed, 38 insertions(+), 36 deletions(-)
diff --git a/extra/pd~/pd~-help.pd b/extra/pd~/pd~-help.pd
index 714d05b06..a5eb90fb1 100644
--- a/extra/pd~/pd~-help.pd
+++ b/extra/pd~/pd~-help.pd
@@ -1,4 +1,4 @@
-#N canvas 352 23 762 717 12;
+#N canvas 320 23 763 717 12;
#X msg 113 380 foo bar baz;
#X obj 257 471 osc~ 440;
#X obj 174 618 env~ 8192;
@@ -67,7 +67,6 @@
#X msg 333 474 0;
#X msg 373 474 1;
#X text 359 506 hide/show window;
-#X obj 162 691 ../../doc/5.reference/pd-messages;
#X text 549 475 You can communicate to the patch via its file name preceded by 'pd-'. Check the [pd-messages] file in the 'see also' section for more options., f 26;
#X text 403 474 * <-----------------;
#X text 291 437 Audio input signals appear in [adc~] objects in the sub-process., f 64;
@@ -77,8 +76,8 @@
#X msg 166 404 1;
#X text 148 448 DSP On/Off;
#X text 206 377 Other messages are sent to the sub-process \, such as to [receive] objects (like 'foo' in this example) and also messages to 'pd' ("pd dsp 1" \, etc). You can also communicate to the patch file itself (see below *)., f 73;
-#X text 579 311 For more about flags \, see:, f 21;
-#N canvas 740 224 546 444 startup-flags 0;
+#X text 563 310 For more about flags \, see:, f 21;
+#N canvas 740 224 542 377 startup-flags 0;
#X obj 110 237 pdcontrol;
#X obj 110 177 pdcontrol;
#X msg 110 147 dir;
@@ -86,38 +85,39 @@
#X text 147 145 <-- Click to open Chapter 3 of Pd's Manual;
#X text 54 41 For a list of all startup flags you can use please refer to the Pd Manual \, Chapter 3 "Getting Pd to run". More specifically \, go to section 3.5 "Preferences and startup options". You can go to the manual via the "help" and "browser" menus or click the message below., f 63;
#X text 84 283 Note \, however \, that audio/midi flags are ignored as the sub-process doesn't open real audio and MIDI devices \, so please refer to 'general flags' only.;
-#X text 83 339 The example in the parent patch used the '-nogui' flag to start without the GUI. Also the '-send' flag is used to send a pd message to start DSP right away.;
#X connect 1 0 3 0;
#X connect 2 0 1 0;
#X connect 3 0 0 0;
-#X restore 611 330 pd startup-flags;
-#X msg 56 315 pd~ start -nogui -send pd dsp 1 pd~-subprocess.pd;
+#X restore 595 329 pd startup-flags;
#X text 218 277 Sending a new "start" message stops the sub-process (if there's one) and starts a new one (DSP must be on).;
#X text 27 219 ATTENTION: DSP must be running in this process for the sub-process to start and run. This is because its clock is slaved to audio I/O it gets from us!, f 75;
#X text 27 98 Messages with the "pd~" selector control the sub-process. A "pd~ start" message takes a pd file name to open and optional startup flags before it. For example \, "-nogui" prevents the sub-process's GUI from appearing. Note that you shouldn't specify the number of channels in and out or sample rate via startup flags since that's set by [pd~]'s creation flags. The sub-process doesn't open real audio and MIDI devices \, so audio/midi config flags (-audiodev \, -midiindev \, etc.) are ignored. Messages without the "pd~" selector are sent to the sub-process (see examples/details below). Note that the sub-process cannot communicate with MIDI devices connected to Pd \, so MIDI messages need to be sent in and out via regular messages to the sub-process., f 100;
#X text 560 225 --------->;
-#X text 407 316 (re)start with flags -->;
-#X connect 0 0 43 0;
+#X msg 63 315 pd~ start -nogui pd~-subprocess.pd;
+#X text 313 315 (re)start with the -nogui flag -->;
+#X text 350 334 (turn DSP on via a message);
+#X obj 162 691 ../../doc/5.reference/pd-messages;
+#X connect 0 0 42 0;
#X connect 1 0 7 0;
#X connect 1 0 8 0;
#X connect 2 0 3 0;
-#X connect 4 0 43 0;
+#X connect 4 0 42 0;
#X connect 5 0 6 0;
-#X connect 7 0 43 0;
-#X connect 8 0 43 1;
+#X connect 7 0 42 0;
+#X connect 8 0 42 1;
#X connect 16 0 8 1;
#X connect 17 0 7 1;
#X connect 21 0 10 0;
-#X connect 22 0 43 0;
+#X connect 22 0 42 0;
#X connect 26 0 33 0;
-#X connect 33 0 43 0;
-#X connect 34 0 43 0;
+#X connect 33 0 42 0;
+#X connect 34 0 42 0;
#X connect 35 0 34 0;
#X connect 36 0 35 0;
#X connect 37 0 35 0;
-#X connect 43 0 25 0;
-#X connect 43 1 2 0;
-#X connect 43 2 5 0;
+#X connect 42 0 25 0;
+#X connect 42 1 2 0;
+#X connect 42 2 5 0;
+#X connect 44 0 26 0;
#X connect 45 0 26 0;
-#X connect 46 0 26 0;
-#X connect 51 0 43 0;
+#X connect 54 0 42 0;
diff --git a/extra/pd~/pd~-subprocess.pd b/extra/pd~/pd~-subprocess.pd
index 0f008dd76..b6cfaf865 100644
--- a/extra/pd~/pd~-subprocess.pd
+++ b/extra/pd~/pd~-subprocess.pd
@@ -1,10 +1,9 @@
-#N canvas 215 92 1016 541 12;
+#N canvas 182 92 1016 541 12;
#X obj 393 245 print foo;
#X obj 352 488 stdout;
#X msg 301 453 a b c;
#X obj 54 249 env~ 8192;
#X floatatom 54 279 8 0 0 0 - - - 0;
-#X obj 257 228 osc~ 440;
#X obj 128 249 env~ 8192;
#X floatatom 128 279 8 0 0 0 - - - 0;
#X obj 257 275 dac~;
@@ -18,7 +17,6 @@
#X floatatom 380 453 5 0 0 0 - - - 0;
#X obj 757 109 r pd-dsp-started;
#X obj 757 206 r pd-dsp-stopped;
-#X obj 669 408 ../../doc/5.reference/pd-messages;
#X msg 626 197 \; pd dsp 1;
#X obj 381 283 stdout;
#X obj 626 157 ../../doc/5.reference/set-dsp-tgl;
@@ -28,19 +26,23 @@
#X text 21 21 This is a test patch to demonstrate the [pd~] object. It's intended as the patch to run in the sub-process \, which is a separate instance of Pd that can be called from a Pd super-process (or also from a Max super-process if you have the Max version of [pd~])., f 68;
#X text 21 90 Audio inlets and outlets on the [pd~] object (in the super-process) talk to [adc~] and [dac~] objects here - so \, for instance \, the left [adc~] output below corresponds to the first inlet of the [pd~] object. Similarly \, the first channel of [dac~] goes to the second outlet of [pd~] (because the first one is for messages \, as explained below.), f 68;
#X text 21 328 The super-process can send messages to any named object (such as [receive] objects \, arrays \, GUIs with built-in receive names and [value] objects). In this way \, a 'bar baz' message is received by [receive foo] when the super-process sends 'foo bar baz'. On the other hand \, messages sent to [stdout] objects appear on the first outlet of the [pd~] object in the super-process (and you can have more than one [stdout] object)., f 68;
+#X obj 257 238 *~ 0.1;
+#X obj 257 207 noise~;
+#X obj 653 408 ../../doc/5.reference/pd-messages;
#X connect 2 0 1 0;
#X connect 3 0 4 0;
-#X connect 5 0 8 0;
-#X connect 5 0 8 1;
-#X connect 6 0 7 0;
-#X connect 9 0 3 0;
-#X connect 9 1 6 0;
-#X connect 10 0 0 0;
-#X connect 10 0 21 0;
-#X connect 13 0 12 0;
-#X connect 14 0 11 0;
+#X connect 5 0 6 0;
+#X connect 8 0 3 0;
+#X connect 8 1 5 0;
+#X connect 9 0 0 0;
+#X connect 9 0 19 0;
+#X connect 12 0 11 0;
+#X connect 13 0 10 0;
+#X connect 14 0 1 0;
#X connect 15 0 1 0;
-#X connect 16 0 1 0;
-#X connect 17 0 14 0;
-#X connect 18 0 13 0;
-#X connect 22 0 20 0;
+#X connect 16 0 13 0;
+#X connect 17 0 12 0;
+#X connect 20 0 18 0;
+#X connect 27 0 7 0;
+#X connect 27 0 7 1;
+#X connect 28 0 27 0;
From 85fb9bab60c66b18739d3cb857accb922ab8f35f Mon Sep 17 00:00:00 2001
From: porres
Date: Sat, 6 Jan 2024 16:13:41 -0300
Subject: [PATCH 056/450] properly document '-send' flag in [pd~]
thanks to iohannes in https://github.com/pure-data/pddp/issues/182#issuecomment-1879778876
---
extra/pd~/pd~-help.pd | 77 ++++++++++++++++++++++---------------------
1 file changed, 39 insertions(+), 38 deletions(-)
diff --git a/extra/pd~/pd~-help.pd b/extra/pd~/pd~-help.pd
index a5eb90fb1..2f9e3b64c 100644
--- a/extra/pd~/pd~-help.pd
+++ b/extra/pd~/pd~-help.pd
@@ -1,4 +1,4 @@
-#N canvas 320 23 763 717 12;
+#N canvas 320 23 760 719 12;
#X msg 113 380 foo bar baz;
#X obj 257 471 osc~ 440;
#X obj 174 618 env~ 8192;
@@ -60,64 +60,65 @@
#X text 274 431 _;
#X text 280 431 _;
#X text 27 49 The [pd~] object starts and manages a Pd sub-process that can communicate with the super-process (this one) via audio channels and/or Pd messages. In this way you can take advantage of multi-core CPUs. The Max version of [pd~] \, on the other hand \, allows you to use Pd features from within Max., f 100;
-#X text 157 340 Stops the sub-process;
#X msg 126 474 pd dsp \$1;
#X msg 332 533 pd-pd~-subprocess.pd vis \$1;
#X obj 333 507 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
#X msg 333 474 0;
#X msg 373 474 1;
#X text 359 506 hide/show window;
-#X text 549 475 You can communicate to the patch via its file name preceded by 'pd-'. Check the [pd-messages] file in the 'see also' section for more options., f 26;
#X text 403 474 * <-----------------;
-#X text 291 437 Audio input signals appear in [adc~] objects in the sub-process., f 64;
#X obj 92 576 pd~ -ninsig 2 -noutsig 2 -fifo 20 -sr 44100, f 24;
#X text 271 582 <-- see [pd reference] for creation flag's descriptions.;
#X msg 126 404 0;
#X msg 166 404 1;
#X text 148 448 DSP On/Off;
-#X text 206 377 Other messages are sent to the sub-process \, such as to [receive] objects (like 'foo' in this example) and also messages to 'pd' ("pd dsp 1" \, etc). You can also communicate to the patch file itself (see below *)., f 73;
-#X text 563 310 For more about flags \, see:, f 21;
-#N canvas 740 224 542 377 startup-flags 0;
-#X obj 110 237 pdcontrol;
-#X obj 110 177 pdcontrol;
-#X msg 110 147 dir;
-#X msg 110 206 browse \$1/../../doc/1.manual/x3.htm;
-#X text 147 145 <-- Click to open Chapter 3 of Pd's Manual;
-#X text 54 41 For a list of all startup flags you can use please refer to the Pd Manual \, Chapter 3 "Getting Pd to run". More specifically \, go to section 3.5 "Preferences and startup options". You can go to the manual via the "help" and "browser" menus or click the message below., f 63;
-#X text 84 283 Note \, however \, that audio/midi flags are ignored as the sub-process doesn't open real audio and MIDI devices \, so please refer to 'general flags' only.;
-#X connect 1 0 3 0;
-#X connect 2 0 1 0;
-#X connect 3 0 0 0;
-#X restore 595 329 pd startup-flags;
-#X text 218 277 Sending a new "start" message stops the sub-process (if there's one) and starts a new one (DSP must be on).;
#X text 27 219 ATTENTION: DSP must be running in this process for the sub-process to start and run. This is because its clock is slaved to audio I/O it gets from us!, f 75;
#X text 27 98 Messages with the "pd~" selector control the sub-process. A "pd~ start" message takes a pd file name to open and optional startup flags before it. For example \, "-nogui" prevents the sub-process's GUI from appearing. Note that you shouldn't specify the number of channels in and out or sample rate via startup flags since that's set by [pd~]'s creation flags. The sub-process doesn't open real audio and MIDI devices \, so audio/midi config flags (-audiodev \, -midiindev \, etc.) are ignored. Messages without the "pd~" selector are sent to the sub-process (see examples/details below). Note that the sub-process cannot communicate with MIDI devices connected to Pd \, so MIDI messages need to be sent in and out via regular messages to the sub-process., f 100;
#X text 560 225 --------->;
-#X msg 63 315 pd~ start -nogui pd~-subprocess.pd;
-#X text 313 315 (re)start with the -nogui flag -->;
-#X text 350 334 (turn DSP on via a message);
#X obj 162 691 ../../doc/5.reference/pd-messages;
-#X connect 0 0 42 0;
+#X msg 46 315 pd~ start -nogui -send pd\ dsp\ 1 pd~-subprocess.pd;
+#X text 411 316 (re)start with flags \, see -->;
+#N canvas 707 185 554 486 more 0;
+#X obj 106 224 pdcontrol;
+#X obj 106 164 pdcontrol;
+#X msg 106 134 dir;
+#X msg 106 193 browse \$1/../../doc/1.manual/x3.htm;
+#X text 143 132 <-- Click to open Chapter 3 of Pd's Manual;
+#X text 50 28 For a list of all startup flags you can use please refer to the Pd Manual \, Chapter 3 "Getting Pd to run". More specifically \, go to section 3.5 "Preferences and startup options". You can go to the manual via the "help" and "browser" menus or click the message below., f 63;
+#X text 42 266 Note \, however \, that audio/midi flags are ignored as the sub-process doesn't open real audio and MIDI devices \, so please refer to 'general flags' only., f 69;
+#X text 42 320 In the example on the parent patch we used the '-nogui' flag to run Pd without the GUI and also the '-send' flag to send a message to pd to turn the DSP on. Note that unlike the way you'd use this flag in startup menu or command line you should not use quotes. Instead we have to escape spaces with backslashes., f 69;
+#X text 42 404 By the way \, of course you can just use a [loadbang] in the subprocess to turn DSP on \, so these examples are mostly didactical \, not practical., f 69;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X connect 3 0 0 0;
+#X restore 620 317 pd more about startup flags;
+#X f 13;
+#X text 218 277 sending a new "start" message stops the sub-process (if there's one) and starts a new one (DSP must be on).;
+#X text 157 340 stops the sub-process;
+#X text 206 377 other messages are sent to the sub-process \, such as to [receive] objects (like 'foo' in this example) and also messages to 'pd' ("pd dsp 1" \, etc). You can also communicate to the patch file itself (see below *)., f 73;
+#X text 291 437 audio input signals appear in [adc~] objects in the sub-process., f 64;
+#X text 549 475 you can communicate to the patch via its file name preceded by 'pd-'. Check the [pd-messages] file in the 'see also' section for more options/details., f 26;
+#X connect 0 0 39 0;
#X connect 1 0 7 0;
#X connect 1 0 8 0;
#X connect 2 0 3 0;
-#X connect 4 0 42 0;
+#X connect 4 0 39 0;
#X connect 5 0 6 0;
-#X connect 7 0 42 0;
-#X connect 8 0 42 1;
+#X connect 7 0 39 0;
+#X connect 8 0 39 1;
#X connect 16 0 8 1;
#X connect 17 0 7 1;
#X connect 21 0 10 0;
-#X connect 22 0 42 0;
-#X connect 26 0 33 0;
-#X connect 33 0 42 0;
-#X connect 34 0 42 0;
+#X connect 22 0 39 0;
+#X connect 26 0 32 0;
+#X connect 32 0 39 0;
+#X connect 33 0 39 0;
+#X connect 34 0 33 0;
#X connect 35 0 34 0;
-#X connect 36 0 35 0;
-#X connect 37 0 35 0;
-#X connect 42 0 25 0;
-#X connect 42 1 2 0;
-#X connect 42 2 5 0;
-#X connect 44 0 26 0;
-#X connect 45 0 26 0;
-#X connect 54 0 42 0;
+#X connect 36 0 34 0;
+#X connect 39 0 25 0;
+#X connect 39 1 2 0;
+#X connect 39 2 5 0;
+#X connect 41 0 26 0;
+#X connect 42 0 26 0;
+#X connect 48 0 39 0;
From c3497b77021cfedba790dbba393672e2056967bf Mon Sep 17 00:00:00 2001
From: Christof Ressi
Date: Thu, 4 Jan 2024 02:36:26 +0100
Subject: [PATCH 057/450] fix 'pd_this' on Windows
On Windows it is not possible to 'properly' export a thread local variable from a DLL.
MinGW can do it, but the resulting symbol ('__emutls_v.pd_this') is not portable and certainly not understood by MSVC.
The solution is to access 'pd_this' via a function call.
For externals, 'pd_this' is now a macro for 'pd_getinstance()'.
Internally, we directly use 'pd_this', but we don't try to export it.
On other platforms, 'pd_this' is now properly marked as EXTERN.
---
src/m_class.c | 5 +++++
src/m_pd.h | 14 +++++++++++++-
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/src/m_class.c b/src/m_class.c
index 9e98c1fa2..c4658ec83 100644
--- a/src/m_class.c
+++ b/src/m_class.c
@@ -147,6 +147,11 @@ EXTERN void pd_setinstance(t_pdinstance *x)
pd_this = x;
}
+t_pdinstance *pd_getinstance(void)
+{
+ return pd_this;
+}
+
static void pdinstance_renumber(void)
{
int i;
diff --git a/src/m_pd.h b/src/m_pd.h
index c658fa555..34041b899 100644
--- a/src/m_pd.h
+++ b/src/m_pd.h
@@ -965,6 +965,7 @@ EXTERN t_pdinstance pd_maininstance;
#ifdef PDINSTANCE
EXTERN t_pdinstance *pdinstance_new(void);
EXTERN void pd_setinstance(t_pdinstance *x);
+EXTERN t_pdinstance *pd_getinstance(void);
EXTERN void pdinstance_free(t_pdinstance *x);
#endif /* PDINSTANCE */
@@ -979,7 +980,18 @@ EXTERN void pdinstance_free(t_pdinstance *x);
#endif
#ifdef PDINSTANCE
-extern PERTHREAD t_pdinstance *pd_this;
+#ifdef _WIN32
+/* Windows does not allow exporting thread-local variables from DLLs,
+so externals need to get 'pd_this' with an (implicit) function call.
+Internally, we may directly access 'pd_this', but we must not export it! */
+#ifdef PD_INTERNAL
+extern PERTHREAD t_pdinstance *pd_this; /* not EXTERN! */
+#else
+#define pd_this pd_getinstance()
+#endif /* PD_INTERNAL */
+#else
+EXTERN PERTHREAD t_pdinstance *pd_this;
+#endif /* _WIN32 */
EXTERN t_pdinstance **pd_instances;
EXTERN int pd_ninstances;
#else
From 84a675cdae19cf2c91a0d1fbca015b89e288adc0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Tue, 9 Jan 2024 08:00:12 +0100
Subject: [PATCH 058/450] unqueue iemgui's on free
use a common destructor callback for the iemguis to avoid code duplication.
Closes: https://github.com/pure-data/pure-data/issues/2168
---
src/g_all_guis.c | 7 +++++++
src/g_all_guis.h | 3 +++
src/g_bang.c | 4 +---
src/g_mycanvas.c | 9 +--------
src/g_numbox.c | 4 +---
src/g_radio.c | 9 +--------
src/g_slider.c | 9 +--------
src/g_toggle.c | 9 +--------
src/g_vumeter.c | 9 +--------
9 files changed, 17 insertions(+), 46 deletions(-)
diff --git a/src/g_all_guis.c b/src/g_all_guis.c
index 1de66d752..ca602e7a5 100644
--- a/src/g_all_guis.c
+++ b/src/g_all_guis.c
@@ -1024,6 +1024,13 @@ void iemgui_setdrawfunctions(t_iemgui *iemgui, t_iemgui_drawfunctions *w)
SET_DRAW(iemgui, move);
}
+void iemgui_free(t_iemgui *iemgui) {
+ if(iemgui->x_fsf.x_rcv_able)
+ pd_unbind(&iemgui->x_obj.ob_pd, iemgui->x_rcv);
+ pdgui_stub_deleteforkey(iemgui);
+ sys_unqueuegui(iemgui);
+}
+
t_iemgui *iemgui_new(t_class*cls)
diff --git a/src/g_all_guis.h b/src/g_all_guis.h
index 1225b298a..34d31473b 100644
--- a/src/g_all_guis.h
+++ b/src/g_all_guis.h
@@ -333,6 +333,9 @@ EXTERN void iemgui_setdrawfunctions(t_iemgui *iemgui, t_iemgui_drawfunctions *w)
*/
t_iemgui* iemgui_new(t_class*cls);
+/* common destructor */
+void iemgui_free(t_iemgui *x);
+
/* these are deliberately not exported for now */
/* update the label (both internally and on the GUI)
diff --git a/src/g_bang.c b/src/g_bang.c
index 49d3e9863..7aef111b7 100644
--- a/src/g_bang.c
+++ b/src/g_bang.c
@@ -402,11 +402,9 @@ static void *bng_new(t_symbol *s, int argc, t_atom *argv)
static void bng_free(t_bng *x)
{
- if(x->x_gui.x_fsf.x_rcv_able)
- pd_unbind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv);
clock_free(x->x_clock_lck);
clock_free(x->x_clock_hld);
- pdgui_stub_deleteforkey(x);
+ iemgui_free(&x->x_gui);
}
void g_bang_setup(void)
diff --git a/src/g_mycanvas.c b/src/g_mycanvas.c
index 1775223ed..4166f8708 100644
--- a/src/g_mycanvas.c
+++ b/src/g_mycanvas.c
@@ -323,17 +323,10 @@ static void *my_canvas_new(t_symbol *s, int argc, t_atom *argv)
return (x);
}
-static void my_canvas_free(t_my_canvas *x)
-{
- if(x->x_gui.x_fsf.x_rcv_able)
- pd_unbind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv);
- pdgui_stub_deleteforkey(x);
-}
-
void g_mycanvas_setup(void)
{
my_canvas_class = class_new(gensym("cnv"), (t_newmethod)my_canvas_new,
- (t_method)my_canvas_free, sizeof(t_my_canvas), CLASS_NOINLET, A_GIMME, 0);
+ (t_method)iemgui_free, sizeof(t_my_canvas), CLASS_NOINLET, A_GIMME, 0);
class_addcreator((t_newmethod)my_canvas_new, gensym("my_canvas"), A_GIMME, 0);
class_addmethod(my_canvas_class, (t_method)my_canvas_dialog,
gensym("dialog"), A_GIMME, 0);
diff --git a/src/g_numbox.c b/src/g_numbox.c
index 11566cdbb..561530b83 100644
--- a/src/g_numbox.c
+++ b/src/g_numbox.c
@@ -739,10 +739,8 @@ static void *my_numbox_new(t_symbol *s, int argc, t_atom *argv)
static void my_numbox_free(t_my_numbox *x)
{
- if(x->x_gui.x_fsf.x_rcv_able)
- pd_unbind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv);
clock_free(x->x_clock_wait);
- pdgui_stub_deleteforkey(x);
+ iemgui_free(&x->x_gui);
}
void g_numbox_setup(void)
diff --git a/src/g_radio.c b/src/g_radio.c
index c6c1f4fb3..bcc79cc2c 100644
--- a/src/g_radio.c
+++ b/src/g_radio.c
@@ -673,17 +673,10 @@ static void *dial_new(t_symbol *s, int argc, t_atom *argv)
return (radio_donew(s, argc, argv, 1));
}
-static void radio_free(t_radio *x)
-{
- if(x->x_gui.x_fsf.x_rcv_able)
- pd_unbind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv);
- pdgui_stub_deleteforkey(x);
-}
-
void g_radio_setup(void)
{
radio_class = class_new(gensym("hradio"), (t_newmethod)radio_new,
- (t_method)radio_free, sizeof(t_radio), 0, A_GIMME, 0);
+ (t_method)iemgui_free, sizeof(t_radio), 0, A_GIMME, 0);
class_addcreator((t_newmethod)radio_new, gensym("vradio"), A_GIMME, 0);
class_addcreator((t_newmethod)radio_new, gensym("rdb"), A_GIMME, 0);
diff --git a/src/g_slider.c b/src/g_slider.c
index 441b986f6..a2b92bb5d 100644
--- a/src/g_slider.c
+++ b/src/g_slider.c
@@ -752,17 +752,10 @@ static void *slider_new(t_symbol *s, int argc, t_atom *argv)
return (x);
}
-static void slider_free(t_slider *x)
-{
- if(x->x_gui.x_fsf.x_rcv_able)
- pd_unbind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv);
- pdgui_stub_deleteforkey(x);
-}
-
void g_slider_setup(void)
{
slider_class = class_new(gensym("hsl"), (t_newmethod)slider_new,
- (t_method)slider_free, sizeof(t_slider), 0, A_GIMME, 0);
+ (t_method)iemgui_free, sizeof(t_slider), 0, A_GIMME, 0);
class_addcreator((t_newmethod)slider_new, gensym("vsl"), A_GIMME, 0);
class_addcreator((t_newmethod)slider_new, gensym("hslider"), A_GIMME, 0);
class_addcreator((t_newmethod)slider_new, gensym("vslider"), A_GIMME, 0);
diff --git a/src/g_toggle.c b/src/g_toggle.c
index 04aa287a1..aaecaf892 100644
--- a/src/g_toggle.c
+++ b/src/g_toggle.c
@@ -353,17 +353,10 @@ static void *toggle_new(t_symbol *s, int argc, t_atom *argv)
return (x);
}
-static void toggle_free(t_toggle *x)
-{
- if(x->x_gui.x_fsf.x_rcv_able)
- pd_unbind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv);
- pdgui_stub_deleteforkey(x);
-}
-
void g_toggle_setup(void)
{
toggle_class = class_new(gensym("tgl"), (t_newmethod)toggle_new,
- (t_method)toggle_free, sizeof(t_toggle), 0, A_GIMME, 0);
+ (t_method)iemgui_free, sizeof(t_toggle), 0, A_GIMME, 0);
class_addcreator((t_newmethod)toggle_new, gensym("toggle"), A_GIMME, 0);
class_addbang(toggle_class, toggle_bang);
class_addfloat(toggle_class, toggle_float);
diff --git a/src/g_vumeter.c b/src/g_vumeter.c
index b495f5de7..6519eb486 100644
--- a/src/g_vumeter.c
+++ b/src/g_vumeter.c
@@ -557,17 +557,10 @@ static void *vu_new(t_symbol *s, int argc, t_atom *argv)
return (x);
}
-static void vu_free(t_vu *x)
-{
- if(x->x_gui.x_fsf.x_rcv_able)
- pd_unbind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv);
- pdgui_stub_deleteforkey(x);
-}
-
void g_vumeter_setup(void)
{
vu_class = class_new(gensym("vu"), (t_newmethod)vu_new,
- (t_method)vu_free, sizeof(t_vu), 0, A_GIMME, 0);
+ (t_method)iemgui_free, sizeof(t_vu), 0, A_GIMME, 0);
class_addbang(vu_class,vu_bang);
class_addfloat(vu_class,vu_float);
class_addmethod(vu_class, (t_method)vu_ft1,
From 5a914a16f228e9a37f4e80892dd7831dc086b3dd Mon Sep 17 00:00:00 2001
From: aaaaalbert
Date: Mon, 15 Jan 2024 22:56:06 +0100
Subject: [PATCH 059/450] Fix typos in German translation, de.po
---
po/de.po | 86 ++++++++++++++++++++++++++++----------------------------
1 file changed, 43 insertions(+), 43 deletions(-)
diff --git a/po/de.po b/po/de.po
index db3742b79..5325b0e63 100644
--- a/po/de.po
+++ b/po/de.po
@@ -53,7 +53,7 @@ msgid "Undo cut"
msgstr "Rückgängig: Ausschneiden"
msgid "Undo disconnect"
-msgstr "Rückgängig: Verbindung Trennen"
+msgstr "Rückgängig: Verbindung trennen"
msgid "Undo duplicate"
msgstr "Rückgängig: Duplizieren"
@@ -77,7 +77,7 @@ msgid "Redo cut"
msgstr "Wiederholen: Ausschneiden"
msgid "Redo disconnect"
-msgstr "Wiederholen: Verbindung Trennen"
+msgstr "Wiederholen: Verbindung trennen"
msgid "Redo duplicate"
msgstr "Wiederholen: Duplizieren"
@@ -92,13 +92,13 @@ msgid "Redo typing"
msgstr "Wiederholen: Eingabe"
msgid "no Pd settings to clear"
-msgstr "Keine Pd Einstellungen zum Zurücksetzen"
+msgstr "Keine Pd-Einstellungen zum Zurücksetzen"
msgid "removed .pdsettings file"
msgstr "Datei \".pdsettings\" entfernt"
msgid "couldn't delete .pdsettings file"
-msgstr "die Datei \".pdsettings\" konnte nicht gelöscht werden"
+msgstr "Die Datei \".pdsettings\" konnte nicht gelöscht werden"
msgid "failed to erase Pd settings"
msgstr "Löschen der Pd-Einstellungen schlug fehl"
@@ -115,7 +115,7 @@ msgstr ""
"Start abgestürzt"
msgid "(re-save preferences to reinstate them)"
-msgstr "(speichern Sie die Einstellungen um sie wiederherzustellen)"
+msgstr "(speichern Sie die Einstellungen, um sie wiederherzustellen)"
msgid "File"
msgstr "Datei"
@@ -148,7 +148,7 @@ msgid "Paste"
msgstr "Einfügen"
msgid "Array Properties"
-msgstr "Array Eigenschaften"
+msgstr "Array-Eigenschaften"
msgid "Array"
msgstr "Array"
@@ -259,22 +259,22 @@ msgstr ""
"WARNUNG: pdtk_canvas_dialog hat unbekannte graphme-Einstellungen detektiert"
msgid "Canvas Properties"
-msgstr "Canvas Eigenschaften"
+msgstr "Canvas-Eigenschaften"
msgid "Scale"
msgstr "Skalierung"
msgid "X units per pixel:"
-msgstr "X Einheiten pro Pixel:"
+msgstr "X-Einheiten pro Pixel:"
msgid "Y units per pixel:"
-msgstr "Y Einheiten pro Pixel:"
+msgstr "Y-Einheiten pro Pixel:"
msgid "Appearance on parent patch"
msgstr "Erscheinen auf dem übergeordneten Patch"
msgid "Graph-On-Parent"
-msgstr "Graph on Parent"
+msgstr "Graph-on-Parent"
msgid "Hide object name and arguments"
msgstr "Objektname und Argumente verbergen"
@@ -295,7 +295,7 @@ msgid "Y range: from"
msgstr "Y-Spanne, von"
msgid "Data Properties"
-msgstr "Daten Eigenschaften"
+msgstr "Daten-Eigenschaften"
msgid "Send"
msgstr "Abschicken"
@@ -324,7 +324,7 @@ msgid "Showing '%1$d' out of %2$d items in %3$s"
msgstr "Zeige %1$d von %2$d Ergebnissen für %3$s"
msgid "Pd window"
-msgstr "Pd Fenster"
+msgstr "Pd-Fenster"
msgid "Match whole word only"
msgstr "Ganzes Wort abgleichen"
@@ -355,7 +355,7 @@ msgid "Y only"
msgstr "nur Y"
msgid "GUI Box Properties"
-msgstr "GUI Box Eigenschaften"
+msgstr "GUI-Box-Eigenschaften"
msgid "Messages"
msgstr "Messages"
@@ -421,7 +421,7 @@ msgid "Toggle"
msgstr "Schalter"
msgid "Non Zero Value"
-msgstr "Nicht-Null Wert"
+msgstr "Nicht-Null-Wert"
msgid "Value:"
msgstr "Wert:"
@@ -525,10 +525,10 @@ msgid "MIDI system"
msgstr "MIDI-System"
msgid "MIDI Settings"
-msgstr "MIDI Einstellungen"
+msgstr "MIDI-Einstellungen"
msgid "ALSA MIDI Settings"
-msgstr "ALSA MIDI Einstellungen"
+msgstr "ALSA-MIDI-Einstellungen"
msgid "Pd search path for objects, help, audio, text and other files"
msgstr ""
@@ -607,7 +607,7 @@ msgid "MIDI preferences"
msgstr "MIDI"
msgid "deken preferences"
-msgstr "Deken Einstellungen"
+msgstr "Deken-Einstellungen"
msgid "misc preferences"
msgstr "sonstiges"
@@ -622,7 +622,7 @@ msgid "Settings below require a restart of Pd!"
msgstr "Die folgenden Einstellungen erfordern einen Neustart von Pd!"
msgid "Pd libraries to load on startup"
-msgstr "Pd-Bibliotheken die automatisch geladen werden"
+msgstr "Pd-Bibliotheken, die automatisch geladen werden"
msgid "GUI options"
msgstr "GUI-Einstellungen"
@@ -667,16 +667,16 @@ msgid "Pd Files"
msgstr "Pd-Dateien"
msgid "Max Patch Files"
-msgstr "Max Patch Dateien"
+msgstr "Max-Patch-Dateien"
msgid "Max Text Files"
-msgstr "Max Textdateien"
+msgstr "Max-Textdateien"
msgid "Max Patch Files (.pat)"
-msgstr "Max Patch Dateien (.pat)"
+msgstr "Max-Patch-Dateien (.pat)"
msgid "Max Text Files (.mxt)"
-msgstr "Max Textdateien (.mxt)"
+msgstr "Max-Textdateien (.mxt)"
#, tcl-format
msgid "detected font: %s"
@@ -757,7 +757,7 @@ msgstr "Installiere deken Paket '%s'"
#, tcl-format
msgid "ignoring '%s': doesn't look like a deken package"
-msgstr "Ignoriere '%s': dies scheint kein deken Paket zu sein"
+msgstr "Ignoriere '%s': dies scheint kein Deken-Paket zu sein"
#, tcl-format
msgid "Installing '%s'"
@@ -884,13 +884,13 @@ msgid "Platform re-detected: %s"
msgstr "Paketarchitektur korrigiert: %s"
msgid "Deken Packages"
-msgstr "Deken Pakete"
+msgstr "Deken-Pakete"
msgid "ZIP Files"
-msgstr "ZIP Archive"
+msgstr "ZIP-Archive"
msgid "TAR Files"
-msgstr "TAR Archive"
+msgstr "TAR-Archive"
msgid "All Files"
msgstr "Alle Dateien"
@@ -1033,7 +1033,7 @@ msgid "translations"
msgstr "Übersetzungen"
msgid "Only install externals uploaded by people you trust."
-msgstr "Installieren Sie nur Externals deren Entwickler_innen Sie vertrauen."
+msgstr "Installieren Sie nur Externals, deren Entwickler_innen Sie vertrauen."
msgid "Disabling tabbed view: incompatible Tcl/Tk detected"
msgstr "Deaktiviere Reiteransicht: inkompatible Tcl/Tk-version gefunden"
@@ -1075,7 +1075,7 @@ msgid "Found %1$d usable packages (of %2$d packages in total)."
msgstr "%1$d verwendbare Pakete gefunden (von insgesamt %2$d Paketen)."
msgid "It appears that there are no matching packages for your architecture."
-msgstr "Es scheint als gäbe es keine passenden Pakete für Ihre Architektur."
+msgstr "Es scheint, als gäbe es keine passenden Pakete für Ihre Architektur."
msgid "No matching externals found."
msgstr "Keine passenden Externals gefunden."
@@ -1137,7 +1137,7 @@ msgstr "Ignoriere Checksummen-Fehler"
#, tcl-format
msgid "[deken] deken-plugin.tcl (Pd externals search) loaded from %s."
-msgstr "[deken] Pd Paketmanager vom Pfad %s geladen."
+msgstr "[deken] Pd-Paketmanager vom Pfad %s geladen."
#, tcl-format
msgid "[deken] Platform detected: %s"
@@ -1178,7 +1178,7 @@ msgid "Open package webpage"
msgstr "Webseite des Pakets öffnen"
msgid "Copy package URL"
-msgstr "Paket URL kopieren"
+msgstr "Paket-URL kopieren"
msgid "Copy SHA256 checksum URL"
msgstr "URL zur SHA256-Prüfsumme kopieren"
@@ -1471,10 +1471,10 @@ msgid "Find Last Error"
msgstr "Letzten Fehler finden"
msgid "DSP On"
-msgstr "DSP Ein"
+msgstr "DSP ein"
msgid "DSP Off"
-msgstr "DSP Aus"
+msgstr "DSP aus"
msgid "Test Audio and MIDI..."
msgstr "Audio und MIDI testen..."
@@ -1507,10 +1507,10 @@ msgid "Parent Window"
msgstr "Übergeordnetes Fenster"
msgid "HTML Manual..."
-msgstr "HTML Anleitung..."
+msgstr "HTML-Anleitung..."
msgid "Browser..."
-msgstr "Patch Browser..."
+msgstr "Patch-Browser..."
msgid "List of objects..."
msgstr "Liste aller Objekte..."
@@ -1538,7 +1538,7 @@ msgid "removed GUI settings"
msgstr "GUI-Einstellungen entfernt"
msgid "no Pd-GUI settings to clear"
-msgstr "Keine Pd-GUI Einstellungen zum Zurücksetzen"
+msgstr "Keine Pd-GUI-Einstellungen zum Zurücksetzen"
msgid "Edit Preferences..."
msgstr "Einstellungen bearbeiten..."
@@ -1616,7 +1616,7 @@ msgid "DSP"
msgstr "DSP"
msgid "Audio I/O error"
-msgstr "Audio E/A-Fehler"
+msgstr "Audio-E/A-Fehler"
msgid "Log:"
msgstr "Protokoll:"
@@ -1665,7 +1665,7 @@ msgstr "überspringe '%s': kein Pd-File"
#~ msgstr "Audioeinstellungen..."
#~ msgid "MIDI..."
-#~ msgstr "MIDI Einstellungen..."
+#~ msgstr "MIDI-Einstellungen..."
# iemgui
#~ msgid "-------dimensions(digits)(pix):-------"
@@ -1719,7 +1719,7 @@ msgstr "überspringe '%s': kein Pd-File"
#~ msgstr "logarithmisch"
#~ msgid "log-height:"
-#~ msgstr "log Höhe:"
+#~ msgstr "log-Höhe:"
#~ msgid "max:"
#~ msgstr "max:"
@@ -1759,7 +1759,7 @@ msgstr "überspringe '%s': kein Pd-File"
#, tcl-format
#~ msgid "couldn't create \"externals\" directory in: %s\n"
-#~ msgstr "konnte kein \"externals\" Verzeichnis in '%s' erstellen.\n"
+#~ msgstr "konnte kein \"externals\"-Verzeichnis in '%s' erstellen.\n"
#~ msgid "Intrrpt:"
#~ msgstr "Interruptzeit:"
@@ -1799,10 +1799,10 @@ msgstr "überspringe '%s': kein Pd-File"
#~ msgstr "für:"
#~ msgid "really quit?"
-#~ msgstr "Wirklich Abbrechen?"
+#~ msgstr "Wirklich abbrechen?"
#~ msgid "Use multiple ALSA devices"
-#~ msgstr "Mehrere ALSA Geräte verwenden"
+#~ msgstr "Mehrere ALSA-Geräte verwenden"
#~ msgid "Math"
#~ msgstr "Mathe"
@@ -1823,7 +1823,7 @@ msgstr "überspringe '%s': kein Pd-File"
#~ msgstr "Eingabegerät 4:"
#~ msgid "Toggle Console"
-#~ msgstr "Konsole Ein/Aus"
+#~ msgstr "Konsole ein/aus"
#~ msgid "Font Properties"
#~ msgstr "Zeichensatz-Einstellungen"
@@ -1862,7 +1862,7 @@ msgstr "überspringe '%s': kein Pd-File"
#~ msgid "WARNING: Font weight '%s' not found, using default (%s)"
#~ msgstr ""
-#~ "WARNUNG: Zeichensatz Schnitt '%s' nicht gefunden, Standard wird verwendet "
+#~ "WARNUNG: Schriftstärke '%s' nicht gefunden, Standard wird verwendet "
#~ "(%s)"
#~ msgid "WARNING: Font family '%s' not found, using default (%s)"
From d67ff2603ded7f84883a90bdd2389116e2f210d3 Mon Sep 17 00:00:00 2001
From: porres
Date: Mon, 22 Jan 2024 19:00:39 -0300
Subject: [PATCH 060/450] document using 'control' key to temprarily get out of
edit mode
closes https://github.com/pure-data/pddp/issues/183
---
doc/2.control.examples/01.PART1.hello.pd | 2 +-
doc/2.control.examples/02.editing.pd | 60 ++++++++----------------
2 files changed, 20 insertions(+), 42 deletions(-)
diff --git a/doc/2.control.examples/01.PART1.hello.pd b/doc/2.control.examples/01.PART1.hello.pd
index 11eaf7642..63a635d5c 100644
--- a/doc/2.control.examples/01.PART1.hello.pd
+++ b/doc/2.control.examples/01.PART1.hello.pd
@@ -10,9 +10,9 @@
#X text 215 83 <-- message box;
#X text 24 217 Message boxes respond to mouse clicks by sending their contents to one or more destinations. The usual destination is the "outlet" at the lower left corner of the box. Click on the message box above and watch the terminal window Pd was started in. You should see the "hello world" message appear., f 63;
#X text 24 484 To get help (for either GUIs \, message box or objects) \, right click it and select "Help". You should see a "help window" for the object., f 63;
-#X text 24 16 There are four types of text (or 'box') objects in Pd: Message \, GUI \, Object \, and Comment. Comments are simple texts (like this one) that do nothing. Check below:, f 63;
#X text 189 145 <-- bang button (another GUI);
#X text 24 296 The number atom box is a GUI (graphical user interface) and responds to click and "dragging" up and down with the mouse \, which changes the contents and sends the result out its outlet. You can also type a number after clicking on the atom box \, hit "enter" to output the number or click anywhere else to cancel. You can right click on it for properties. A "bang" GUI sends "bang" messages when clicked on \, you can also right click it for properties., f 63;
+#X text 24 16 There are four types of text (or 'box') objects in Pd: Message \, GUI \, Object \, and Comment. Comments are simple texts (like this one) that do nothing. Check the options below:, f 63;
#X connect 0 0 1 0;
#X connect 2 0 1 0;
#X connect 4 0 1 0;
diff --git a/doc/2.control.examples/02.editing.pd b/doc/2.control.examples/02.editing.pd
index cc2dbadd0..1a0b8f8d4 100644
--- a/doc/2.control.examples/02.editing.pd
+++ b/doc/2.control.examples/02.editing.pd
@@ -1,43 +1,21 @@
-#N canvas 594 23 523 712 12;
-#X msg 116 46 hello world;
-#X obj 225 82 print;
-#X floatatom 225 46 5 0 0 0 - - - 0;
-#X text 115 25 message;
-#X text 274 83 object;
-#X text 44 122 When you first open a Pd document like this one \, your
-cursor will be an arrow. Select "edit mode" in the Edit menu and the
-cursor will change to the image of a hand. The patch is now in edit
-mode. You can move any object by dragging it., f 63;
-#X text 44 191 Select "Edit mode" again in the Edit menu and you're
-back to the arrow cursor which acts on objects without moving them.
-, f 63;
-#X text 44 231 In Edit mode \, if you click on a message \, object
-\, or comment \, you can then retype the text. For objects this will
-create a new object and delete the old one. Pd will try to reconnect
-the newly created object in the same way as the old one., f 63;
-#X text 44 301 When you're done changing the contents of the box \,
-click outside the box to deselect it. This tells Pd to incorporate
-the new text., f 63;
-#X text 44 356 You can create new objects by duplicating existing ones
-using the "duplicate" menu item. You can also "cut" and "paste" them.
-If you duplicate several connected objects the connections will be
-replicated too., f 63;
-#X text 44 422 Edit mode also lets you make and break connections between
-objects. Put the "hand" cursor over a line connecting two objects:
-it turns into an X. Clicking will select the connection \, which you
-can delete with the delete key \, or "Cut" from the "Edit" menu. Hold
-the cursor over an outlet and it becomes a circle (a patch point).
-Drag to any box and release--you will be connected to the nearest inlet.
-, f 63;
-#X text 268 44 atom number box;
-#X text 281 672 updated for Pd version 0.52-2;
-#X text 44 531 The "put" menu creates new text items of any of the
-four types. Note that there are other GUI boxes in this menu \, like
-the list box than can hold one or more atoms. An atom in Pd is a message
-item \, usually either a float or a symbol. The put menu also offers
-a "symbol" atom box \, a GUI box analogous to the atom number box but
-for showing and entering single text strings. Other GUIs like bang
-\, toggle are also in this menu \, as well as arrays and graphs (which
-we'll see later on)., f 63;
+#N canvas 201 47 983 495 12;
+#X msg 135 26 hello world;
+#X obj 244 92 print;
+#X floatatom 244 26 5 0 0 0 - - - 0;
+#X text 74 24 message;
+#X text 293 93 object;
+#X text 46 413 In Edit mode \, if you click on a message \, object \, or comment \, you can then retype the text. For objects this will create a new object and delete the old one. Pd will try to reconnect the newly created object in the same way as the old one., f 63;
+#X text 528 23 When you're done changing the contents of the box \, click outside the box to deselect it. This tells Pd to incorporate the new text.;
+#X text 528 84 You can create new objects by duplicating existing ones using the "duplicate" menu item. You can also "cut" and "paste" them. If you duplicate several connected objects the connections will be replicated too.;
+#X text 528 155 Edit mode also lets you make and break connections between objects. Put the "hand" cursor over a line connecting two objects: it turns into an X. Clicking will select the connection \, which you can delete with the delete key \, or "Cut" from the "Edit" menu. Hold the cursor over an outlet and it becomes a circle (a patch point). Drag to any box and release--you will be connected to the nearest inlet.;
+#X text 287 25 atom number box;
+#X text 528 276 The "put" menu creates new text items of any of the four types. Note that there are other GUI boxes in this menu \, like the list box than can hold one or more atoms. An atom in Pd is a message item \, usually either a float or a symbol. The put menu also offers a "symbol" atom box \, a GUI box analogous to the atom number box but for showing and entering single text strings. Other GUIs like bang \, toggle are also in this menu \, as well as arrays and graphs (which we'll see later on).;
+#X obj 271 55 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
+#X text 298 54 bang button;
+#X text 46 132 When you first open a Pd document like this one \, your cursor will be an arrow. This is also known as "run" mode and you can then click and interact with objects like messages \, number boxes and bang buttons. Select "edit mode" in the Edit menu to check it on and the cursor will change to the image of a hand. The patch is now in edit mode. You can move any object by clicking on it and dragging it. You can also select a set of objects and then move them all., f 63;
+#X text 46 253 Select "Edit mode" again to uncheck it in the Edit menu and you're back in run mode with the arrow cursor which acts on objects without moving them., f 63;
+#X text 46 305 Note that the Edit menu also shows you a keyboard shortcuts to alter into and out of "Edit mode". If you are predominantly editing a patch but would like to quickly get out of it just to click on a message or something \, you can just press and hold the control key (command in mac computers) and you'll note the arrow is back until you release the key so you can briefly do what you want., f 63;
+#X text 728 441 updated for Pd version 0.54-1;
#X connect 0 0 1 0;
#X connect 2 0 1 0;
+#X connect 11 0 1 0;
From 07eddac1e5fb5391bc6ccb04c35068ba1defc5a5 Mon Sep 17 00:00:00 2001
From: Lucas Cordiviola
Date: Tue, 23 Jan 2024 00:52:58 -0300
Subject: [PATCH 061/450] html: document using 'control' key to temporarily get
out of edit mode (#2177)
---
doc/1.manual/x2.htm | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/doc/1.manual/x2.htm b/doc/1.manual/x2.htm
index 226bc8ec0..09d020726 100644
--- a/doc/1.manual/x2.htm
+++ b/doc/1.manual/x2.htm
@@ -234,7 +234,10 @@
moves boxes or makes and cuts connections; in run mode clicking on boxes sends
them messages which they react to in different ways. In run mode, number and
message boxes can be used as controls. Normally, when you are in a performance
-you will stay in run mode; to change the patch you go to edit mode.
+you will stay in run mode; to change the patch you go to edit mode. If you are
+in edit mode and you need to briefly switch to run mode you can hold the
+control key (command in mac computers) and you'll be able to use the mouse
+as in run mode until you release the control key.
From 4952566ea92842b0d4861ad3aaf61711187d2171 Mon Sep 17 00:00:00 2001
From: porres
Date: Tue, 23 Jan 2024 01:06:20 -0300
Subject: [PATCH 062/450] revise last commit by lucarda
---
doc/1.manual/x2.htm | 24 +++++++++++++++---------
1 file changed, 15 insertions(+), 9 deletions(-)
diff --git a/doc/1.manual/x2.htm b/doc/1.manual/x2.htm
index 09d020726..925545e0d 100644
--- a/doc/1.manual/x2.htm
+++ b/doc/1.manual/x2.htm
@@ -227,17 +227,23 @@
+ A patch can be in edit or run mode; this really only affects how mouse
+clicks affect the patch. In run mode, the mouse your cursor is an arrow, and
+when you first open a patch, it is in run mode. Select "edit mode" in the
+Edit menu to check it on and the cursor will change to the image of a hand.
+
- A patch can be in edit or run mode; this really only affects how mouse
-clicks affect the patch. In edit mode, clicking and dragging selects and
-moves boxes or makes and cuts connections; in run mode clicking on boxes sends
-them messages which they react to in different ways. In run mode, number and
-message boxes can be used as controls. Normally, when you are in a performance
-you will stay in run mode; to change the patch you go to edit mode. If you are
-in edit mode and you need to briefly switch to run mode you can hold the
-control key (command in mac computers) and you'll be able to use the mouse
-as in run mode until you release the control key.
+
In edit mode, clicking and dragging selects and moves boxes or makes
+and cuts connections; in run mode clicking on boxes sends them messages
+which they react to in different ways. In run mode, number and message
+boxes can be used as controls. Normally, when you are in a performance
+you will stay in run mode.
+
+
If you are predominantly editing a patch but would like to quickly
+go to run mode just to click on something like a message, you can just
+press and hold the control key (command in mac computers) and you'll
+note the shape of an arrow is back until you release the key.
From 164ae51503fc270251c512e310a430df9fc72931 Mon Sep 17 00:00:00 2001
From: Antoine Rousseau <_antoine_@metalu.net>
Date: Sun, 28 Jan 2024 14:22:55 +0100
Subject: [PATCH 063/450] make canvas dirty after adding any type of object
---
src/g_text.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/g_text.c b/src/g_text.c
index 6c8ef69a7..07aa52292 100644
--- a/src/g_text.c
+++ b/src/g_text.c
@@ -98,6 +98,7 @@ void glist_text(t_glist *gl, t_symbol *s, int argc, t_atom *argv)
canvas_undo_add(glist_getcanvas(gl), UNDO_CREATE, "create",
(void *)canvas_undo_set_create(glist_getcanvas(gl)));
canvas_startmotion(glist_getcanvas(gl));
+ canvas_dirty(glist_getcanvas(gl), 1);
}
}
@@ -155,6 +156,7 @@ static void canvas_objtext(t_glist *gl, int xpix, int ypix, int width,
/* this is called if we've been created from the menu. */
glist_select(gl, &x->te_g);
gobj_activate(&x->te_g, gl, 1);
+ canvas_dirty(gl, 1);
}
if (pd_class(&x->ob_pd) == vinlet_class)
canvas_resortinlets(glist_getcanvas(gl));
@@ -554,6 +556,7 @@ void canvas_msg(t_glist *gl, t_symbol *s, int argc, t_atom *argv)
else canvas_startmotion(glist_getcanvas(gl));
canvas_undo_add(glist_getcanvas(gl), UNDO_CREATE, "create",
(void *)canvas_undo_set_create(glist_getcanvas(gl)));
+ canvas_dirty(glist_getcanvas(gl), 1);
}
}
@@ -1216,6 +1219,7 @@ void canvas_atom(t_glist *gl, t_atomtype type,
else canvas_startmotion(glist_getcanvas(gl));
canvas_undo_add(glist_getcanvas(gl), UNDO_CREATE, "create",
(void *)canvas_undo_set_create(glist_getcanvas(gl)));
+ canvas_dirty(glist_getcanvas(gl), 1);
}
}
From d90ee51e96a79c20f8ca101f9e05901fccd9c4b6 Mon Sep 17 00:00:00 2001
From: Antoine Rousseau <_antoine_@metalu.net>
Date: Sun, 28 Jan 2024 11:44:03 +0100
Subject: [PATCH 064/450] correct which canvas Pd proposes to save when
requested to quit
---
src/g_editor.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/g_editor.c b/src/g_editor.c
index 27188090e..0145eb7a2 100644
--- a/src/g_editor.c
+++ b/src/g_editor.c
@@ -3300,7 +3300,7 @@ void glob_verifyquit(void *dummy, t_floatarg f)
canvas_vis(g2, 1);
pdgui_vmess("pdtk_canvas_menuclose", "^m",
- canvas_getrootfor(g),
+ canvas_getrootfor(g2),
gensym(buf), 2, backmsg);
return;
}
From 4b418b840d7fe4af56206a140ea9fec98c829df0 Mon Sep 17 00:00:00 2001
From: Christof Ressi
Date: Tue, 30 Jan 2024 17:10:14 +0100
Subject: [PATCH 065/450] fix possible out-of-range error in [midiout]
---
src/s_midi_pm.c | 2 ++
src/x_midi.c | 7 ++++---
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/src/s_midi_pm.c b/src/s_midi_pm.c
index 71b1e667e..b90d7e465 100644
--- a/src/s_midi_pm.c
+++ b/src/s_midi_pm.c
@@ -152,6 +152,8 @@ void sys_putmidibyte(int portno, int byte)
fit into PortMidi buffers. */
static int mess[4];
static int nbytes = 0, sysex = 0, i;
+ if (portno < 0 || portno >= mac_nmidioutdev)
+ return;
if (byte > MIDI_SYSEXEND)
{
/* realtime */
diff --git a/src/x_midi.c b/src/x_midi.c
index e059c3cf7..e2bcc8dad 100644
--- a/src/x_midi.c
+++ b/src/x_midi.c
@@ -583,16 +583,17 @@ static void *midiout_new(t_floatarg portno)
static void midiout_float(t_midiout *x, t_floatarg f)
{
- outmidi_byte(x->x_portno - 1, f);
+ int portno = x->x_portno >= 1 ? x->x_portno - 1 : 0;
+ outmidi_byte(portno, f);
}
static void midiout_list(t_midiout *x, t_symbol *s, int ac, t_atom *av)
{
- int i;
+ int i, portno = x->x_portno >= 1 ? x->x_portno - 1 : 0;
for (i = 0; i < ac; ++i)
{
if(av[i].a_type == A_FLOAT)
- outmidi_byte(x->x_portno - 1, av[i].a_w.w_float);
+ outmidi_byte(portno, av[i].a_w.w_float);
}
}
From 0832577f496e74b6f18dd34287d8bb849a2027c4 Mon Sep 17 00:00:00 2001
From: porres
Date: Tue, 30 Jan 2024 23:29:52 -0300
Subject: [PATCH 066/450] fix plot~ help
closes https://github.com/pure-data/pddp/issues/184
---
doc/5.reference/plot-help.pd | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/doc/5.reference/plot-help.pd b/doc/5.reference/plot-help.pd
index 2853d9814..7fd59a894 100644
--- a/doc/5.reference/plot-help.pd
+++ b/doc/5.reference/plot-help.pd
@@ -3,8 +3,8 @@
#N struct array2-template float x float y;
#N struct array3-template float y float w;
#N canvas 596 38 519 318 12;
-#N canvas 564 184 788 529 plot-template 0;
-#X obj 558 392 struct plot-template float x float y array array1 array1-template array array2 array2-template array array3 array3-template, f 20;
+#N canvas 443 180 818 527 plot-template 0;
+#X obj 568 386 struct plot-template float x float y array array1 array1-template array array2 array2-template array array3 array3-template, f 20;
#X text 27 51 Optional flags:;
#X text 32 217 Arguments:;
#X text 23 24 Creation arguments:;
@@ -12,20 +12,20 @@
#X msg 74 360 0;
#X text 129 380 (if no -v [field name] flag was given);
#X text 48 235 - optional word "curve" to specify Bezier curve \; - array field name to plot \; - color (0=black \, 999=white \, 900=red \, 90=green \, 9=blue \, 555=grey \, etc.) \; - line width \; - relative x and y location \; - x spacing, f 49;
-#X text 558 354 here's the [struct] for all this:, f 19;
+#X text 568 348 here's the [struct] for all this:, f 19;
#X text 57 438 This plots a red trace (500) of width 1 starting at point (10 \, 15). Horizontal spacing is 20 and the black diamonds come from the template of the array1 element itself - check [pd array1-template]., f 54;
-#X obj 515 195 plot -c array3 9 1 100 50 35;
-#X text 453 231 This draws the blue curved array. If a "w" variable is present in the template as for array3 (see [pd array3-template]) \, the line width argument is ignored and the "w" variable sets the width value for each element. The value of 'w' is drawn in [pd array3-template]., f 41;
+#X obj 525 195 plot -c array3 9 1 100 50 35;
+#X text 466 236 This draws the blue curved array. If a "w" variable is present in the template as for array3 (see [pd array3-template]) \, the line width argument is ignored and the "w" variable sets the width value for each element. The value of 'w' is drawn in [pd array3-template]., f 46;
#X obj 74 407 plot array1 500 1 10 15 20;
#X text 46 74 - "-c": sets to Bezier curve plot \; - "-n": make invisible initially \; - "-v [const or name]": set visibility of array \; - "-vs [const or name]": to set visibility of element scalars \; - "-e [const or name]": enable/disable editing \; - "-x [name]": use different field name for x \; - "-y [name]": use different field name for y \; - "-w [name]": use different field name for w, f 52;
-#X obj 479 54 plot -n curve array2 90 4 150 -30;
-#X obj 479 22 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
-#X text 505 22 <-- visibility;
-#X text 430 86 The [plot] above plots a curved green spiral with: color 70 \, line width 3 \, location (100 \, 0). Open the [pd array2-template] subpatch to check the template for "array2". Since the template contains an "x" variable \, [plot] ignores the 'x spacing' argument and takes x from the data itself., f 48;
+#X obj 489 22 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
+#X text 515 22 <-- visibility;
#X text 108 360 <-- inlet sets visibility (1: visible \, 0: invisible);
+#X text 440 86 The [plot] above plots a curved green spiral with: color 90 \, line width 4 \, location (150 \, -30). Open the [pd array2-template] subpatch to check the template for "array2". Since the template contains an "x" variable \, [plot] ignores the 'x spacing' argument and takes x from the data itself., f 50;
+#X obj 489 54 plot -n curve array2 90 4 150 -30;
#X connect 4 0 12 0;
#X connect 5 0 12 0;
-#X connect 15 0 14 0;
+#X connect 14 0 18 0;
#X restore 266 139 pd plot-template;
#N canvas 565 310 468 256 array1-template 0;
#X obj 88 182 filledpolygon 0 0 0 -5 0 0 5 5 0 0 -5;
From 80eabe090d2df6dd1030bca0cc773f5fc91cb7f1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Sun, 4 Feb 2024 23:47:56 +0100
Subject: [PATCH 067/450] do not try to guess compat-CPUs for arm64 (only for
arm32)
Closes: https://github.com/pure-data/pure-data/issues/2190
---
src/s_inter.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/s_inter.c b/src/s_inter.c
index 0e433fb9e..8e13e9ca4 100644
--- a/src/s_inter.c
+++ b/src/s_inter.c
@@ -1202,7 +1202,9 @@ static void init_deken_arch(void)
#if defined(DEKEN_CPU)
deken_CPU[0] = strip_quotes(deken_CPU[0], deken_CPU_noquotes, MAXPDSTRING);
#else /* !DEKEN_CPU */
-# if defined __ARM_ARCH
+# if defined(__aarch64__)
+ /* no special-casing for arm64 */
+# elif defined __ARM_ARCH
/* ARM-specific:
* if we are running ARMv7, we can also load ARMv6 externals
*/
From 7a924ada4f286a66d4297a9715db305116b03eac Mon Sep 17 00:00:00 2001
From: Christof Ressi
Date: Fri, 9 Feb 2024 14:20:30 +0100
Subject: [PATCH 068/450] outlet~: fix reblocking bug with multichannel signals
only increment read/write positions on last channel!
---
src/g_io.c | 59 ++++++++++++++++++++++++++++--------------------------
1 file changed, 31 insertions(+), 28 deletions(-)
diff --git a/src/g_io.c b/src/g_io.c
index 5eb2d9bbf..25c5b8da7 100644
--- a/src/g_io.c
+++ b/src/g_io.c
@@ -370,8 +370,8 @@ typedef struct _voutlet
t_canvas *x_canvas;
t_outlet *x_parentoutlet;
int x_buflength;
- int x_empty; /* next to read out of buffer in epilog code */
- int x_write; /* next to write in to buffer */
+ int x_read; /* next to read out of buffer in epilog code */
+ int x_write; /* next to write into buffer */
int x_hop; /* hopsize */
int x_updownmethod;
/* parent's outlet signal, valid between the prolog and the dsp setup
@@ -455,10 +455,8 @@ t_int *voutlet_perform(t_int *w)
{
t_voutlet *x = (t_voutlet *)(w[1]);
t_sample *in = (t_sample *)(w[2]), *buf= (t_sample *)(w[3]);
- int xwrite = x->x_write;
- int hop = (int)(w[4]);
- int n = (int)(w[5]);
- t_sample *out = buf + xwrite,
+ int lastone = (int)(w[4]), n = (int)(w[5]), write = x->x_write;
+ t_sample *out = buf + write,
*endbuf = buf + x->x_buflength;
while (n--)
{
@@ -466,10 +464,12 @@ t_int *voutlet_perform(t_int *w)
if (out == endbuf)
out = buf;
}
- xwrite += x->x_hop;
- if (xwrite >= x->x_buflength)
- xwrite = 0;
- x->x_write = xwrite;
+ if (lastone) /* only advance write position on last channel! */
+ {
+ if ((write += x->x_hop) >= x->x_buflength)
+ write = 0;
+ x->x_write = write;
+ }
return (w+6);
}
@@ -478,11 +478,12 @@ static t_int *voutlet_doepilog(t_int *w)
{
t_voutlet *x = (t_voutlet *)(w[1]);
t_sample *in, *out = (t_sample *)(w[2]), *buf = (t_sample *)(w[3]);
- int hop = (int)(w[4]), n = (int)(w[5]), empty = x->x_empty;
- if (empty == x->x_buflength)
- empty = 0;
- x->x_empty = empty + hop;
- in = buf + empty;
+ int lastone = (int)(w[4]), n = (int)(w[5]), read = x->x_read;
+ if (read == x->x_buflength)
+ read = 0;
+ if (lastone) /* only advance read position on last channel! */
+ x->x_read = read + n;
+ in = buf + read;
for (; n--; in++)
*out++ = *in, *in = 0;
return (w+6);
@@ -496,11 +497,12 @@ static t_int *voutlet_doepilog_resample(t_int *w)
t_voutlet *x = (t_voutlet *)(w[1]);
t_sample *in, *out = ((t_resample *)(w[2]))->s_vec,
*buf = (t_sample *)(w[3]);
- int hop = (int)(w[4]), n = (int)(w[5]), empty = x->x_empty;
- if (empty == x->x_buflength)
- empty = 0;
- x->x_empty = empty + hop;
- in = buf + empty;
+ int lastone = (int)(w[4]), n = (int)(w[5]), read = x->x_read;
+ if (read == x->x_buflength)
+ read = 0;
+ if (lastone) /* only advance read position on last channel! */
+ x->x_read = read + n;
+ in = buf + read;
for (; n--; in++)
*out++ = *in, *in = 0;
return (w+6);
@@ -583,9 +585,9 @@ static void voutlet_dsp(t_voutlet *x, t_signal **sp)
dsp_add_copy(sp[0]->s_vec, (*x->x_parentsignal)->s_vec,
sp[0]->s_length * sp[0]->s_nchans);
else for (i = 0; i < x->x_nchans; i++)
+ /* NB: x_hop isn't set yet, so we cannot pass it directy! */
dsp_add(voutlet_perform, 5, x, sp[0]->s_vec + i * sp[0]->s_length,
- x->x_rb[i].r_buf, (t_int)(i == x->x_nchans - 1 ? x->x_hop : 0),
- (t_int)sp[0]->s_length);
+ x->x_rb[i].r_buf, (t_int)(i == x->x_nchans-1), (t_int)sp[0]->s_length);
}
}
@@ -630,15 +632,15 @@ void voutlet_dspepilog(struct _voutlet *x, t_signal **parentsigs,
else x->x_hop = period * re_parentvecsize;
if (x->x_parentsignal)
{
- /* set epilog pointer and schedule it */
- x->x_empty = re_parentvecsize * epilogphase;
+ /* set epilog pointer and schedule it */
+ x->x_read = re_parentvecsize * epilogphase;
for (i = 0; i < x->x_nchans; i++)
{
- t_int hop = (i == x->x_nchans-1 ? re_parentvecsize : 0);
if (upsample * downsample == 1)
dsp_add(voutlet_doepilog, 5, x,
(*x->x_parentsignal)->s_vec + i * parentvecsize,
- x->x_rb[i].r_buf, hop, (t_int)parentvecsize);
+ x->x_rb[i].r_buf, (t_int)(i == x->x_nchans-1),
+ (t_int)parentvecsize);
else
{
int method = (x->x_updownmethod < 0 ?
@@ -647,8 +649,9 @@ void voutlet_dspepilog(struct _voutlet *x, t_signal **parentsigs,
x->x_rb[i].r_updown.downsample=downsample;
x->x_rb[i].r_updown.upsample=upsample;
dsp_add(voutlet_doepilog_resample, 5, x,
- &x->x_rb[i].r_updown,
- x->x_rb[i].r_buf, hop, (t_int)re_parentvecsize);
+ &x->x_rb[i].r_updown, x->x_rb[i].r_buf,
+ (t_int)(i == x->x_nchans-1),
+ (t_int)re_parentvecsize);
resampleto_dsp(&x->x_rb[i].r_updown,
(*x->x_parentsignal)->s_vec + i * parentvecsize,
re_parentvecsize, parentvecsize, method);
From 81ad8a7a826215b0169b40f7a906071de761373f Mon Sep 17 00:00:00 2001
From: Christof Ressi
Date: Fri, 9 Feb 2024 14:22:54 +0100
Subject: [PATCH 069/450] inlet~: rename 'fill' to 'read' to be consistent with
outlet~
+ add some comments to clarify that read/write positions are only advanced on the last channel
---
src/g_io.c | 33 ++++++++++++++++++---------------
1 file changed, 18 insertions(+), 15 deletions(-)
diff --git a/src/g_io.c b/src/g_io.c
index 25c5b8da7..50a364fac 100644
--- a/src/g_io.c
+++ b/src/g_io.c
@@ -64,8 +64,8 @@ typedef struct _vinlet
t_canvas *x_canvas;
t_inlet *x_inlet;
int x_buflength; /* number of samples per channel in buffer */
- int x_fill;
- int x_read;
+ int x_write; /* write position in reblocker */
+ int x_read; /* read position in reblocker */
int x_hop;
int x_updownmethod;
/* if not reblocking, the next slot communicates the parent's
@@ -147,13 +147,13 @@ t_int *vinlet_perform(t_int *w)
t_vinlet *x = (t_vinlet *)(w[1]);
t_sample *out = (t_sample *)(w[2]);
t_reblocker *rb = (t_reblocker *)(w[3]);
- int hop = (int)(w[4]), n = (int)(w[5]), read = x->x_read;
+ int advance = (int)(w[4]), n = (int)(w[5]), read = x->x_read;
t_sample *in = rb->r_buf + read;
while (n--)
*out++ = *in++;
- if (hop)
+ if (advance) /* only on last channel */
{
- if ((read += hop) == x->x_buflength)
+ if ((read += advance) == x->x_buflength)
read = 0;
x->x_read = read;
}
@@ -184,9 +184,12 @@ static void vinlet_dsp(t_vinlet *x, t_signal **sp)
int i;
signal_setmultiout(sp, x->x_nchans);
for (i = 0; i < x->x_nchans; i++)
+ {
+ /* only advance read position on last channel! */
+ int advance = (i == x->x_nchans-1) ? sp[0]->s_length : 0;
dsp_add(vinlet_perform, 5, x, sp[0]->s_vec + i * sp[0]->s_length,
- &x->x_rb[i], (t_int)(i == x->x_nchans-1 ? sp[0]->s_length : 0),
- (t_int)(sp[0]->s_length));
+ &x->x_rb[i], (t_int)advance, (t_int)(sp[0]->s_length));
+ }
x->x_read = 0;
}
}
@@ -197,18 +200,18 @@ t_int *vinlet_doprolog(t_int *w)
t_vinlet *x = (t_vinlet *)(w[1]);
t_sample *in = (t_sample *)(w[2]), *out;
t_sample *buf = (t_sample *)(w[3]);
- int lastone = (int)(w[4]), n = (int)(w[5]), fill = x->x_fill;
+ int lastone = (int)(w[4]), n = (int)(w[5]), write = x->x_write;
- if (fill == x->x_buflength)
+ if (write == x->x_buflength)
{
t_sample *f1 = buf, *f2 = buf + x->x_hop;
int nshift = x->x_buflength - x->x_hop;
while (nshift--) *f1++ = *f2++;
- fill -= x->x_hop;
+ write -= x->x_hop;
}
- out = buf + fill;
- if (lastone)
- x->x_fill = fill + n;
+ out = buf + write;
+ if (lastone) /* only advance write position on last channel! */
+ x->x_write = write + n;
while (n--)
*out++ = *in++;
return (w+6);
@@ -269,7 +272,7 @@ void vinlet_dspprolog(struct _vinlet *x, t_signal **parentsigs,
{
x->x_hop = period * re_parentvecsize;
- x->x_fill = prologphase ?
+ x->x_write = prologphase ?
x->x_buflength - (x->x_hop - prologphase * re_parentvecsize) :
x->x_buflength;
for (i = 0; i < x->x_nchans; i++)
@@ -291,7 +294,7 @@ void vinlet_dspprolog(struct _vinlet *x, t_signal **parentsigs,
re_parentvecsize, method);
dsp_add(vinlet_doprolog, 5, x, x->x_rb[i].r_updown.s_vec,
x->x_rb[i].r_buf, (t_int)(i == x->x_nchans-1),
- (t_int)re_parentvecsize);
+ (t_int)re_parentvecsize);
}
}
}
From 2ffd8ef7af4f3e6af2d56e927e03ee5dfc3dfaed Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Thu, 8 Feb 2024 16:42:28 +0100
Subject: [PATCH 070/450] Fix typo for ::pdwindow::font_size variable
---
tcl/dialog_font.tcl | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tcl/dialog_font.tcl b/tcl/dialog_font.tcl
index de49e3ad5..843603cc1 100644
--- a/tcl/dialog_font.tcl
+++ b/tcl/dialog_font.tcl
@@ -72,7 +72,7 @@ proc ::dialog_font::do_apply {mytoplevel myfontsize stretchval whichstretch} {
}
::pd_guiprefs::write menu-fontsize "$myfontsize"
- set ::pdwindow::font:size $myfontsize
+ set ::pdwindow::font_size $myfontsize
} else {
pdsend "$mytoplevel font $myfontsize $stretchval $whichstretch"
From c863bbecce07ab7cd632eccace3e51e4e0f07357 Mon Sep 17 00:00:00 2001
From: Christof Ressi
Date: Tue, 13 Feb 2024 02:42:16 +0100
Subject: [PATCH 071/450] fix "channels" message for send~ and catch~
setting x_length to 1 does not work for block size 1; instead we keep track of the previous channel count.
---
src/d_global.c | 20 +++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/src/d_global.c b/src/d_global.c
index 81873f4cc..31b7ed426 100644
--- a/src/d_global.c
+++ b/src/d_global.c
@@ -17,8 +17,9 @@ typedef struct _sigsend
t_canvas *x_canvas;
int x_length;
int x_nchans;
- t_sample *x_vec;
+ int x_prevnchans;
t_float x_f;
+ t_sample *x_vec;
} t_sigsend;
static void *sigsend_new(t_symbol *s, t_floatarg fnchans)
@@ -29,6 +30,7 @@ static void *sigsend_new(t_symbol *s, t_floatarg fnchans)
x->x_sym = s;
if ((x->x_nchans = fnchans) < 1)
x->x_nchans = 1;
+ x->x_prevnchans = x->x_nchans;
x->x_length = 1;
x->x_vec = (t_sample *)getbytes(x->x_nchans * sizeof(t_sample));
x->x_f = 0;
@@ -53,18 +55,19 @@ static t_int *sigsend_perform(t_int *w)
static void sigsend_channels(t_sigsend *x, t_float fnchans)
{
x->x_nchans = fnchans >= 1 ? fnchans : 1;
- x->x_length = 1; /* trigger update via sigsend_fixbuf */
+ /* buffer will be resized in sigsend_fixbuf() */
canvas_update_dsp();
}
static void sigsend_fixbuf(t_sigsend *x, int length)
{
- if (x->x_length != length)
+ if (x->x_length != length || x->x_nchans != x->x_prevnchans)
{
x->x_vec = (t_sample *)resizebytes(x->x_vec,
- x->x_length * x->x_nchans * sizeof(t_sample),
+ x->x_length * x->x_prevnchans * sizeof(t_sample),
length * x->x_nchans * sizeof(t_sample));
x->x_length = length;
+ x->x_prevnchans = x->x_nchans;
}
}
@@ -239,6 +242,7 @@ typedef struct _sigcatch
t_canvas *x_canvas;
int x_length;
int x_nchans;
+ int x_prevnchans;
t_sample *x_vec;
} t_sigcatch;
@@ -252,6 +256,7 @@ static void *sigcatch_new(t_symbol *s, t_floatarg fnchans)
x->x_length = 1; /* replaced later */
if ((x->x_nchans = fnchans) < 1)
x->x_nchans = 1;
+ x->x_prevnchans = x->x_nchans;
x->x_vec = (t_sample *)getbytes(x->x_length * sizeof(t_sample));
outlet_new(&x->x_obj, &s_signal);
return (x);
@@ -260,18 +265,19 @@ static void *sigcatch_new(t_symbol *s, t_floatarg fnchans)
static void sigcatch_channels(t_sigcatch *x, t_float fnchans)
{
x->x_nchans = fnchans >= 1 ? fnchans : 1;
- x->x_length = 1; /* trigger update via sigcatch_fixbuf */
+ /* buffer will be resized in sigcatch_fixbuf() */
canvas_update_dsp();
}
static void sigcatch_fixbuf(t_sigcatch *x, int length)
{
- if (x->x_length != length)
+ if (x->x_length != length || x->x_nchans != x->x_prevnchans)
{
x->x_vec = (t_sample *)resizebytes(x->x_vec,
- x->x_length * x->x_nchans * sizeof(t_sample),
+ x->x_length * x->x_prevnchans * sizeof(t_sample),
length * x->x_nchans * sizeof(t_sample));
x->x_length = length;
+ x->x_prevnchans = x->x_nchans;
}
}
From 7648854a07859d5b8e83f81a930fa316100f55a6 Mon Sep 17 00:00:00 2001
From: porres
Date: Fri, 16 Feb 2024 04:31:22 -0300
Subject: [PATCH 072/450] Update expr-help.pd
fix typo
---
doc/5.reference/expr-help.pd | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/doc/5.reference/expr-help.pd b/doc/5.reference/expr-help.pd
index ef3e4a792..f3a68f5d2 100644
--- a/doc/5.reference/expr-help.pd
+++ b/doc/5.reference/expr-help.pd
@@ -948,12 +948,12 @@
#X connect 37 0 31 0;
#X restore 819 633 pd difference-equations(Lorenz);
#X obj 340 155 fexpr~ $x1[0] + $y1[-1];
-#X text 62 193 'n' index for '$x#' is from 0 to minus "vector size - 1".;
-#X text 62 210 'n' index for '$x#' is from -1 to minus "vector size - 1".;
+#X text 62 192 'n' index for '$x#' is from 0 to minus "vector size - 1"., f 58;
#X text 23 63 Besides '$f#' \, '$i#' and '$s#' \, [fexpr~] takes '$x#' and '$y#' variables (and no '$v#' variables from [expr~]). Note that the first inlet of [fexpr~] needs to be of type '$x1' (cannot be '$f1' \, '$i1' or '$s1'). You can still send floats to this left inlet as floats sent to audio inlets are promoted to signals. The '$x#' and '$y#' types are input and output samples defined by 'n':, f 71;
#X text 23 243 The vector (or 'block') size is defined by the [block~] or [switch~] objects. The default is 64 so it's from 0 to -63 for '$x#' and -1 to -63 for $y#. As such \, $x#[0] specifies the current sample input \, and $y#[-1] the last sample output., f 72;
#X obj 917 234 set-dsp-tgl;
#X text 948 238 DSP on/off;
+#X text 62 210 'n' index for '$y#' is from -1 to minus "vector size - 1".;
#X connect 4 0 9 0;
#X connect 5 0 9 0;
#X connect 6 0 5 0;
@@ -977,7 +977,7 @@
#X connect 32 0 22 0;
#X connect 40 0 29 0;
#X connect 41 0 27 0;
-#X connect 57 0 47 0;
+#X connect 56 0 47 0;
#X restore 212 555 pd [fexpr~] Examples;
#X obj 335 608 >;
#X text 102 522 (click on the subpatches to open them), f 13;
From 253bf5136c7f01be4fb664a1ee4b555bfad3bbe9 Mon Sep 17 00:00:00 2001
From: porres
Date: Sat, 17 Feb 2024 16:34:41 -0300
Subject: [PATCH 073/450] fix [vcf~]
This help file used to say [lop~] couldn't take signals, which is not true anymore, so it got a full revision... minor revisions for [bp~] is here as well...
---
doc/5.reference/bp~-help.pd | 20 ++++----
doc/5.reference/vcf~-help.pd | 92 ++++++++++++++++++------------------
2 files changed, 57 insertions(+), 55 deletions(-)
diff --git a/doc/5.reference/bp~-help.pd b/doc/5.reference/bp~-help.pd
index 08e80d34a..9d7a64c6d 100644
--- a/doc/5.reference/bp~-help.pd
+++ b/doc/5.reference/bp~-help.pd
@@ -1,10 +1,9 @@
-#N canvas 562 45 480 601 12;
+#N canvas 541 39 480 601 12;
#X declare -stdpath ./;
#X floatatom 89 249 7 0 0 0 - - - 0;
#X msg 56 192 clear;
-#X text 35 91 The left inlet is the incoming audio signal \, the middle control input sets center frequency and the right input sets "Q"., f 58;
+#X text 25 91 The left inlet is the incoming audio signal \, the middle control input sets center frequency and the right input sets "Q"., f 63;
#X floatatom 123 306 5 1 50 0 - - - 0;
-#X text 35 53 bp~ passes a sinusoid at the center frequency at unit gain (approximately). Other frequencies are attenuated.;
#X obj 56 379 output~;
#X obj 31 160 noise~;
#X obj 285 146 declare -stdpath ./;
@@ -50,10 +49,11 @@
#X obj 92 222 hsl 169 18 200 2000 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1;
#X obj 126 279 hsl 169 18 1 20 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1;
#X text 137 339 <-- arguments: frequency and Q;
-#X connect 0 0 8 1;
-#X connect 1 0 8 0;
-#X connect 3 0 8 2;
-#X connect 6 0 8 0;
-#X connect 8 0 5 0;
-#X connect 30 0 0 0;
-#X connect 31 0 3 0;
+#X text 25 53 [bp~] passes a sinusoid at the center frequency at unit gain (approximately). Other frequencies are attenuated., f 63;
+#X connect 0 0 7 1;
+#X connect 1 0 7 0;
+#X connect 3 0 7 2;
+#X connect 5 0 7 0;
+#X connect 7 0 4 0;
+#X connect 29 0 0 0;
+#X connect 30 0 3 0;
diff --git a/doc/5.reference/vcf~-help.pd b/doc/5.reference/vcf~-help.pd
index 0cfa223b5..62862a5da 100644
--- a/doc/5.reference/vcf~-help.pd
+++ b/doc/5.reference/vcf~-help.pd
@@ -1,32 +1,31 @@
-#N canvas 480 36 606 610 12;
+#N canvas 430 69 660 593 12;
#X declare -stdpath ./;
-#X floatatom 215 240 8 0 0 0 - - - 0;
-#X floatatom 259 337 5 0 0 0 - - - 0;
+#X floatatom 193 224 8 0 0 0 - - - 0;
+#X floatatom 237 321 5 0 0 0 - - - 0;
#X obj 28 14 vcf~;
-#X text 12 544 see also:;
-#X obj 90 544 bp~;
-#X obj 171 369 vcf~ 1, f 13;
-#X text 384 544 updated for Pd version 0.46;
-#X text 137 490 (band-pass);
-#X text 267 491 (low-pass);
-#X text 137 473 real output;
-#X text 254 473 imaginary output;
-#X obj 124 544 bob~;
-#X obj 149 308 noise~;
-#X text 69 308 test input;
-#X text 303 336 Q;
-#X text 274 369 optional argument initializes Q;
-#X obj 134 413 output~;
-#X obj 259 413 output~;
-#X obj 165 544 lop~;
-#X obj 205 544 hip~;
-#X obj 418 440 declare -stdpath ./;
-#X obj 25 576 biquad~;
-#X obj 84 575 slop~, f 7;
-#X obj 143 575 cpole~, f 7;
-#X obj 205 575 fexpr~;
-#X text 261 575 - unfriendly filters;
-#X obj 7 43 cnv 1 590 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 12 524 see also:;
+#X obj 90 524 bp~;
+#X obj 149 353 vcf~ 1, f 13;
+#X text 440 524 updated for Pd version 0.46;
+#X text 115 474 (band-pass);
+#X text 115 457 real output;
+#X text 232 457 imaginary output;
+#X obj 124 524 bob~;
+#X obj 127 292 noise~;
+#X text 47 292 test input;
+#X text 281 320 Q;
+#X text 252 353 optional argument initializes Q;
+#X obj 112 397 output~;
+#X obj 237 397 output~;
+#X obj 165 524 lop~;
+#X obj 205 524 hip~;
+#X obj 494 205 declare -stdpath ./;
+#X obj 25 556 biquad~;
+#X obj 84 555 slop~, f 7;
+#X obj 143 555 cpole~, f 7;
+#X obj 205 555 fexpr~;
+#X text 261 555 - unfriendly filters;
+#X obj 7 44 cnv 1 640 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#N canvas 667 114 517 345 reference 0;
#X obj 9 42 cnv 5 490 5 empty empty INLETS: 8 18 0 13 #202020 #000000 0;
#X obj 9 187 cnv 2 490 2 empty empty OUTLETS: 8 12 0 13 #202020 #000000 0;
@@ -40,27 +39,30 @@
#X text 87 126 signal - resonant frequency in Hz.;
#X obj 11 153 cnv 1 490 1 empty empty 3rd: 8 12 0 13 #7c7c7c #000000 0;
#X obj 11 71 cnv 1 490 1 empty empty 1st: 8 12 0 13 #7c7c7c #000000 0;
-#X text 94 160 float - set Q.;
#X text 134 287 1) float - initial Q (default 0).;
#X obj 11 242 cnv 1 490 1 empty empty 2nd: 8 12 0 13 #7c7c7c #000000 0;
#X obj 11 211 cnv 1 490 1 empty empty 1st: 8 12 0 13 #7c7c7c #000000 0;
#X text 86 217 signal - real output (band-pass filtered signal).;
-#X text 86 250 signal - imaginary output (band-pass filtered signal).;
-#X restore 414 14 pd reference;
-#X text 512 14 <= click;
-#X obj 7 525 cnv 1 590 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 94 160 float - resonance Q.;
+#X text 86 250 signal - imaginary output ("low-pass" filtered signal).;
+#X restore 474 14 pd reference;
+#X text 572 14 <= click;
#X text 76 14 - voltage-controlled band/low-pass filter;
-#X text 25 53 [vcf~] is a resonant band-pass and low-pass filter that takes either a control or an audio signal to set center frequency \, which may thus change continuously in time as in an analog voltage controlled filter (and unlike [bp~] and [lop~] that only take control values). The "Q" or filter sharpness is still only set by control messages. It is more expensive but more powerful than the [bp~] band-pass filter., f 78;
-#X text 24 146 [vcf~] is implemented as a one-pole complex filter with outlets for the real and imaginary value. These may be used as band-pass and low-pass filter outputs \, or combined to allow other possibilities., f 78;
-#X obj 218 213 hsl 169 18 200 2000 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1;
-#X text 283 240 <-- resonant frequency in Hz;
-#X obj 262 308 hsl 169 18 1 20 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1;
-#X obj 215 271 sig~ 200;
-#X connect 0 0 36 0;
+#X obj 196 197 hsl 169 18 200 2000 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1;
+#X text 261 224 <-- resonant frequency in Hz, f 15;
+#X obj 240 292 hsl 169 18 1 20 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1;
+#X obj 193 255 sig~ 200;
+#X text 242 523 - friendly filters;
+#X obj 7 505 cnv 1 640 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 36 129 [vcf~] can take a signal to set the resonant frequency as in an analog voltage controlled filter ("vcf" for short). It is thus more expensive but more powerful than [bp~]. The resonance "Q" or filter sharpness is still only set by control messages., f 83;
+#X text 371 395 Listen to how the white noise input is filtered. The higher the Q \, the more attenuation we have for frequencies besides the center frequency \, so the less wide the frequency band is., f 38;
+#X text 36 59 [vcf~] is a one-pole complex filter with outlets for the real (left) and imaginary (right) parts \, which are \, respectively \, a band-pass and a low-pass filter (that can be combined to allow other possibilities). The maximum gain is constant at 0dB \, what makes the lowpass output more like a bandpass really \, and similar to [bp~]., f 83;
+#X text 245 475 ("low-pass");
+#X connect 0 0 32 0;
#X connect 1 0 5 2;
-#X connect 5 0 16 0;
-#X connect 5 1 17 0;
-#X connect 12 0 5 0;
-#X connect 33 0 0 0;
-#X connect 35 0 1 0;
-#X connect 36 0 5 1;
+#X connect 5 0 15 0;
+#X connect 5 1 16 0;
+#X connect 11 0 5 0;
+#X connect 29 0 0 0;
+#X connect 31 0 1 0;
+#X connect 32 0 5 1;
From 4b0213373417ec5e92625c1a60eee4660ad99284 Mon Sep 17 00:00:00 2001
From: porres
Date: Tue, 20 Feb 2024 01:40:17 -0300
Subject: [PATCH 074/450] mark hip~ as one-pole/one-zero
hip~ was marked as one-pole only, but it is a one-pole/one-zero filter.
also mentioned biquad is a 2-pole/2-zero
---
doc/5.reference/binops-help.pd | 2 +-
doc/5.reference/biquad~-help.pd | 16 ++++----
doc/5.reference/cpole~-help.pd | 14 +++----
doc/5.reference/czero_rev~-help.pd | 64 +++++++++++++++---------------
doc/5.reference/czero~-help.pd | 58 +++++++++++++--------------
doc/5.reference/help-intro.pd | 14 +++----
doc/5.reference/hip~-help.pd | 36 ++++++++---------
doc/5.reference/lop~-help.pd | 14 +++----
doc/5.reference/rpole~-help.pd | 38 +++++++++---------
9 files changed, 128 insertions(+), 128 deletions(-)
diff --git a/doc/5.reference/binops-help.pd b/doc/5.reference/binops-help.pd
index 18b5db751..286e8df91 100644
--- a/doc/5.reference/binops-help.pd
+++ b/doc/5.reference/binops-help.pd
@@ -90,7 +90,7 @@
#X text 54 376 (etc.) - unary operators;
#X text 359 343 (etc.) - other binary operators;
#X text 293 376 (etc.) - trigonometric functions;
-#X text 457 59 As in the signal versions \; - [log] takes a base value via an argument or the right inlet but defaults to "e". A 0 or negative left input gives -1000 as the result. - [pow] has protection against NaNs (they become 0) \, and it raises a number on the left inlet to a numeric power (given by the right inlet or argument)., f 48;
+#X text 457 59 As in the signal versions \; - [log] takes a base value via an argument or the right inlet but defaults to "e". A 0 or negative left input gives -1000 as the result \; - [pow] has protection against NaNs (they become 0) \, and it raises a number on the left inlet to a numeric power (given by the right inlet or argument)., f 48;
#X connect 3 0 30 0;
#X connect 13 0 14 0;
#X connect 14 0 17 0;
diff --git a/doc/5.reference/biquad~-help.pd b/doc/5.reference/biquad~-help.pd
index 385a9f481..d4cbcd1c6 100644
--- a/doc/5.reference/biquad~-help.pd
+++ b/doc/5.reference/biquad~-help.pd
@@ -1,4 +1,4 @@
-#N canvas 562 32 629 664 12;
+#N canvas 501 37 629 664 12;
#X obj 152 437 env~;
#X floatatom 152 468 8 0 0 0 - - - 0;
#X floatatom 53 306 5 0 0 0 - - - 0;
@@ -28,8 +28,8 @@
#X text 123 158 signal - the filtered signal output.;
#X text 112 198 1) list - initializes the 5 coefficients (fb1 fb2 ff1 ff2 ff3)., f 63;
#X text 37 98 set - set the last two input samples., f 71;
-#X text 101 15 - raw biquad 2nd order filter;
#X text 135 79 list - list of filter coefficients (fb1 fb2 ff1 ff2 ff3).;
+#X text 101 15 - biquad 2nd order (2-pole/2-zero) filter;
#X restore 417 13 pd reference;
#X text 515 13 <= click;
#X text 54 561 see also:;
@@ -48,17 +48,17 @@
#X obj 183 585 slop~, f 7;
#X text 14 57 [biquad~] calculates the following difference equation:;
#X obj 6 545 cnv 1 602 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X text 17 116 Where y[n] is the output sample \, y[n-1] is the last output sample and y[n-2] is the output previous to the last one. These samples are fedback \, hence you have the 'fb' (standing for 'feedback') coefficients., f 81;
-#X text 17 165 x[n] is the input sample \, x[n-1] is the last input sample and x[n-2] is the input previous to the last one. Hence you have 'ff' (standing for 'feedforward') coefficients., f 81;
#X text 227 432 this [biquad~] is a notch filter for fn = Pi/4 (= SR/8 = 5512.5Hz @44.1k), f 36;
#X text 327 560 <-- user-friendly filters;
#X text 242 585 <-- not friendly;
#X text 14 621 raw filters -->;
#X text 407 631 updated for Pd version 0.3;
#X text 45 86 y[n] = fb1 * y[n-1] + fb2 * y[n-2] + ff1 * x[n] + ff2 * x[n-1] + ff3 * x[n-2], f 77;
-#X text 83 13 - raw biquad 2nd order filter;
-#X obj 472 236 set-dsp-tgl;
-#X text 503 240 DSP on/off;
+#X obj 471 236 set-dsp-tgl;
+#X text 502 240 DSP on/off;
+#X text 9 116 Where y[n] is the output sample \, y[n-1] is the last output sample and y[n-2] is the output previous to the last one. These samples are fedback \, hence these are marked as 'fb' (standing for 'feedback') coefficients., f 85;
+#X text 9 165 x[n] is the input sample \, x[n-1] is the last input sample and x[n-2] is the input previous to the last one. Hence these are marked as 'ff' (standing for 'feedforward') coefficients., f 85;
+#X text 81 13 - biquad 2nd order (2-pole/2-zero) filter;
#X connect 0 0 1 0;
#X connect 2 0 9 0;
#X connect 3 0 4 0;
@@ -68,4 +68,4 @@
#X connect 9 0 3 0;
#X connect 9 0 6 0;
#X connect 13 0 6 0;
-#X connect 45 0 10 0;
+#X connect 42 0 10 0;
diff --git a/doc/5.reference/cpole~-help.pd b/doc/5.reference/cpole~-help.pd
index f39813466..bc29bf886 100644
--- a/doc/5.reference/cpole~-help.pd
+++ b/doc/5.reference/cpole~-help.pd
@@ -1,4 +1,4 @@
-#N canvas 549 23 530 666 12;
+#N canvas 457 23 530 666 12;
#X declare -stdpath ./;
#X obj 58 125 osc~ 100;
#X msg 67 152 clear;
@@ -13,12 +13,12 @@
#X msg 79 179 set 0.6 0.8;
#X text 48 338 y[n] = x[n] + a[n] * y[n-1];
#N canvas 796 231 441 392 test 0;
-#X obj 90 85 osc~;
-#X floatatom 90 52 5 0 0 0 - - - 0;
+#X obj 84 85 osc~;
+#X floatatom 84 52 5 0 0 0 - - - 0;
#X obj 146 304 env~ 16384;
#X floatatom 146 328 5 0 0 0 - - - 0;
-#X obj 90 112 *~;
-#X msg 40 113 set 1;
+#X obj 84 112 *~;
+#X msg 34 113 set 1;
#X floatatom 334 113 4 -1000 1000 0 - - - 0;
#X text 138 14 Stuff to test it:;
#X obj 215 123 cos~;
@@ -26,7 +26,7 @@
#X obj 258 75 phasor~;
#X floatatom 258 48 5 0 0 0 - - - 0;
#X floatatom 146 52 5 0 0 0 - - - 0;
-#X obj 177 113 tgl 17 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1;
+#X obj 177 112 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1;
#X obj 146 112 *~;
#X obj 146 85 phasor~;
#X floatatom 321 46 5 0 0 0 - - - 0;
@@ -40,7 +40,7 @@
#X floatatom 233 328 5 0 0 0 - - - 0;
#X obj 23 303 output~;
#X obj 258 238 declare -stdpath ./;
-#X obj 121 114 tgl 17 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1;
+#X obj 115 112 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1;
#X connect 0 0 4 0;
#X connect 1 0 0 0;
#X connect 2 0 3 0;
diff --git a/doc/5.reference/czero_rev~-help.pd b/doc/5.reference/czero_rev~-help.pd
index d44e53114..1256957b4 100644
--- a/doc/5.reference/czero_rev~-help.pd
+++ b/doc/5.reference/czero_rev~-help.pd
@@ -1,41 +1,41 @@
-#N canvas 621 32 532 680 12;
+#N canvas 533 32 532 680 12;
#X declare -stdpath ./;
#X obj 33 128 osc~ 100;
#X msg 51 155 clear;
-#N canvas 534 144 522 578 test 0;
-#X obj 189 431 env~ 16384;
-#X floatatom 189 455 5 0 0 0 - - - 0;
-#X floatatom 359 168 4 -1000 1000 0 - - - 0;
-#X obj 254 186 cos~;
+#N canvas 534 144 523 562 test 0;
+#X obj 189 441 env~ 16384;
+#X floatatom 189 465 5 0 0 0 - - - 0;
+#X floatatom 359 178 4 -1000 1000 0 - - - 0;
+#X obj 254 196 cos~;
#X floatatom 255 50 5 0 0 0 - - - 0;
#X obj 255 73 phasor~;
#X floatatom 302 17 5 0 0 0 - - - 0;
#X obj 301 42 / 1000;
-#X obj 295 169 -~ 0.25;
-#X obj 295 191 cos~;
-#X obj 359 197 / 1000;
-#X obj 254 224 *~;
-#X obj 295 225 *~;
-#X obj 273 429 env~ 16384;
-#X floatatom 273 453 5 0 0 0 - - - 0;
-#X obj 136 191 phasor~;
-#X floatatom 136 162 5 0 0 0 - - - 0;
-#X text 61 83 Stuff to test it:;
-#X obj 136 272 cpole~;
-#X obj 295 269 *~ -1;
-#X obj 64 488 env~ 16384;
-#X floatatom 64 512 5 0 0 0 - - - 0;
-#X obj 143 488 env~ 16384;
-#X floatatom 143 512 5 0 0 0 - - - 0;
-#X obj 143 304 cpole~;
-#X obj 160 341 czero_rev~;
-#X obj 205 370 czero_rev~;
-#X msg 48 212 clear;
+#X obj 295 179 -~ 0.25;
+#X obj 295 201 cos~;
+#X obj 359 207 / 1000;
+#X obj 254 234 *~;
+#X obj 295 235 *~;
+#X obj 273 439 env~ 16384;
+#X floatatom 273 463 5 0 0 0 - - - 0;
+#X obj 136 201 phasor~;
+#X floatatom 136 172 5 0 0 0 - - - 0;
+#X text 61 93 Stuff to test it:;
+#X obj 136 282 cpole~;
+#X obj 295 279 *~ -1;
+#X obj 64 498 env~ 16384;
+#X floatatom 64 522 5 0 0 0 - - - 0;
+#X obj 143 498 env~ 16384;
+#X floatatom 143 522 5 0 0 0 - - - 0;
+#X obj 143 314 cpole~;
+#X obj 160 351 czero_rev~;
+#X obj 205 380 czero_rev~;
+#X msg 48 222 clear;
#X obj 255 103 cos~;
-#X obj 254 134 *~ 0.02;
-#X obj 304 100 sig~ 1.1;
-#X obj 368 420 output~;
-#X obj 58 38 declare -stdpath ./;
+#X obj 254 144 *~ 0.02;
+#X obj 303 109 sig~ 1.1;
+#X obj 368 430 output~;
+#X obj 58 48 declare -stdpath ./;
#X connect 0 0 1 0;
#X connect 2 0 10 0;
#X connect 3 0 11 0;
@@ -85,9 +85,9 @@
#X obj 174 257 sig~;
#X text 220 296 coefficient (real and imaginary part);
#X msg 62 181 set 0.6 0.8;
-#X text 57 374 where y[n] is the output \, x[n] the input \, and a[n] the filter coefficient (all complex numbers). The filter is always stable., f 64;
+#X text 32 374 where y[n] is the output \, x[n] the input \, and a[n] the filter coefficient (all complex numbers). The filter is always stable., f 64;
#X obj 16 12 czero_rev~;
-#X text 57 414 The transfer function is H(Z) = -a + Z^-1.;
+#X text 32 414 The transfer function is H(Z) = -a + Z^-1., f 64;
#X obj 87 622 lop~;
#X text 8 623 see also:;
#X obj 170 555 rzero~;
diff --git a/doc/5.reference/czero~-help.pd b/doc/5.reference/czero~-help.pd
index bd04ac8d0..17a5e09d8 100644
--- a/doc/5.reference/czero~-help.pd
+++ b/doc/5.reference/czero~-help.pd
@@ -8,7 +8,6 @@
#X floatatom 414 112 4 -1000 1000 0 - - - 0;
#X obj 294 112 cos~;
#X floatatom 229 57 5 0 0 0 - - - 0;
-#X obj 269 119 tgl 15 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000 0 1;
#X obj 229 117 *~;
#X obj 229 80 phasor~;
#X floatatom 338 53 5 0 0 0 - - - 0;
@@ -33,38 +32,39 @@
#X text 151 14 Stuff to test it:;
#X obj 230 280 output~;
#X obj 26 223 declare -stdpath ./;
+#X obj 264 117 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1;
#X connect 0 0 1 0;
-#X connect 2 0 12 0;
-#X connect 3 0 13 0;
-#X connect 4 0 7 0;
-#X connect 5 0 6 1;
-#X connect 6 0 17 0;
-#X connect 7 0 6 0;
+#X connect 2 0 11 0;
+#X connect 3 0 12 0;
+#X connect 4 0 6 0;
+#X connect 5 0 16 0;
+#X connect 6 0 5 0;
+#X connect 7 0 8 0;
+#X connect 8 0 3 0;
#X connect 8 0 9 0;
-#X connect 9 0 3 0;
#X connect 9 0 10 0;
-#X connect 10 0 11 0;
-#X connect 11 0 14 0;
-#X connect 12 0 14 1;
-#X connect 12 0 13 1;
-#X connect 13 0 17 2;
-#X connect 14 0 17 3;
-#X connect 15 0 16 0;
-#X connect 17 0 0 0;
-#X connect 17 0 28 0;
-#X connect 17 1 15 0;
-#X connect 17 1 28 1;
+#X connect 10 0 13 0;
+#X connect 11 0 13 1;
+#X connect 11 0 12 1;
+#X connect 12 0 16 2;
+#X connect 13 0 16 3;
+#X connect 14 0 15 0;
+#X connect 16 0 0 0;
+#X connect 16 0 27 0;
+#X connect 16 1 14 0;
+#X connect 16 1 27 1;
+#X connect 17 0 23 0;
#X connect 18 0 24 0;
-#X connect 19 0 25 0;
-#X connect 20 0 22 0;
+#X connect 19 0 21 0;
+#X connect 19 0 18 0;
#X connect 20 0 19 0;
-#X connect 21 0 20 0;
-#X connect 22 0 23 0;
-#X connect 23 0 26 0;
-#X connect 24 0 26 1;
-#X connect 24 0 25 1;
-#X connect 25 0 17 0;
-#X connect 26 0 17 1;
+#X connect 21 0 22 0;
+#X connect 22 0 25 0;
+#X connect 23 0 25 1;
+#X connect 23 0 24 1;
+#X connect 24 0 16 0;
+#X connect 25 0 16 1;
+#X connect 29 0 5 1;
#X restore 396 562 pd test;
#X obj 91 207 sig~;
#X obj 123 231 sig~;
@@ -74,7 +74,7 @@
#X obj 28 11 czero~;
#X text 84 341 y[n] = x[n] - a[n] * x[n-1];
#X text 31 369 where y[n] is the output \, x[n] the input \, and a[n] the filter coefficient (all complex numbers). The filter is always stable., f 63;
-#X text 32 415 The transfer function is H(Z) = 1 - aZ^-1.;
+#X text 31 409 The transfer function is H(Z) = 1 - aZ^-1., f 63;
#X obj 60 279 czero~ 0.9 0.4;
#X text 195 255 <= filter coefficient (imaginary part);
#X obj 92 613 lop~;
diff --git a/doc/5.reference/help-intro.pd b/doc/5.reference/help-intro.pd
index 478d28248..08d12dc53 100644
--- a/doc/5.reference/help-intro.pd
+++ b/doc/5.reference/help-intro.pd
@@ -88,9 +88,7 @@
#X obj 49 4673 print~;
#X text 174 4673 - print out one or more "blocks";
#X obj 42 5850 rpole~;
-#X text 173 5849 - raw real-valued one-pole filter;
#X obj 42 5874 rzero~;
-#X text 173 5873 - raw real-valued one-zero filter;
#X obj 42 5898 rzero_rev~;
#X obj 42 5923 cpole~;
#X obj 99 5923 czero~;
@@ -300,7 +298,6 @@
#X obj 48 4248 snake~ out;
#X text 174 4220 - combine mono signals into multichannel signals;
#X text 174 4247 - split multichannel signals into mono signals;
-#X text 240 5922 - complex-valued variants;
#X text 22 218 ----------------------------------- GUIs -----------------------------------, f 76;
#X text 15 1087 ------------------------------ ARRAYS/TABLES -------------------------------, f 77;
#X text 3 4187 --------------------------- GENERAL AUDIO TOOLS ----------------------------, f 77;
@@ -440,12 +437,8 @@
#X text 173 5520 - non-interpolating table lookup for signals;
#X text 173 5544 - 4-point-interpolating table lookup for signals;
#X text 173 5699 - voltage-controlled band/low-pass filter;
-#X text 173 5725 - one-pole high pass filter;
-#X text 173 5749 - one-pole low pass filter;
#X text 173 5774 - slew-limiting / low pass filter;
#X text 173 5799 - 2-pole band-pass filter;
-#X text 173 5823 - raw biquad 2nd order filter;
-#X text 173 5897 - real one-zero "reverse" filter;
#X text 173 6029 - writes a signal in a delay line;
#X text 173 6053 - read a signal from a delay line (no interpolation);
#X text 172 6079 - read from a delay line with 4-point interpolation;
@@ -505,3 +498,10 @@
#X text 185 2074 - get path relative to the patch;
#X text -3 4771 ------------------------------- SIGNAL MATH ---------------------------------, f 77;
#X text 175 4849 - C-style expressions / filter expressions;
+#X text 240 5922 - raw complex-valued variants;
+#X text 173 5725 - 1-pole/1-zero high pass filter;
+#X text 173 5749 - 1-pole low pass filter;
+#X text 173 5823 - biquad 2nd order (2-pole/2-zero) filter;
+#X text 173 5849 - raw real-valued 1-pole filter;
+#X text 173 5873 - raw real-valued 1-zero filter;
+#X text 173 5897 - raw real 1-zero "reverse" filter;
diff --git a/doc/5.reference/hip~-help.pd b/doc/5.reference/hip~-help.pd
index 8b549774f..b543fd6be 100644
--- a/doc/5.reference/hip~-help.pd
+++ b/doc/5.reference/hip~-help.pd
@@ -1,21 +1,20 @@
#N canvas 541 23 578 563 12;
#X declare -stdpath ./;
-#X floatatom 216 177 8 0 0 0 - - - 0;
-#X msg 113 124 clear;
+#X floatatom 196 177 8 0 0 0 - - - 0;
+#X msg 93 124 clear;
#X obj 25 15 hip~;
-#X text 70 14 - one-pole high pass filter;
#X text 352 502 updated for Pd version 0.44;
#X msg 297 442 \; pd compatibility 0.43;
-#X text 231 206 Creation argument initializes cutoff frequency.;
+#X text 211 206 Creation argument initializes cutoff frequency.;
#X text 40 344 COMPATIBILITY NOTE: in Pd versions before 0.44 \, the high-frequency output gain was incorrectly greater than one (usually only slightly so \, but noticeably if the cutoff frequency was more than 1/4 the Nyquist frequency). This problem was fixed INCORRECTLY in pd 0.44-0 though 0.44-2 \, and is now hopefully fixed since Pd 0.44-3. To get the old (0.43 and earlier) behavior \, set "compatibility" to 0.43 in Pd's command line or by a message:, f 67;
#X text 24 503 see also:;
#X obj 97 502 lop~;
#X obj 136 502 bp~;
#X obj 210 502 bob~;
#X obj 170 502 vcf~;
-#X obj 156 156 noise~;
-#X obj 156 252 output~;
-#X obj 156 204 hip~ 2000;
+#X obj 136 156 noise~;
+#X obj 136 252 output~;
+#X obj 136 204 hip~ 2000;
#X obj 323 268 declare -stdpath ./;
#X obj 96 531 biquad~;
#X obj 155 530 slop~, f 7;
@@ -33,19 +32,20 @@
#X text 106 163 signal - filtered signal.;
#X obj 9 71 cnv 1 450 1 empty empty 1st: 8 12 0 13 #9f9f9f #000000 0;
#X obj 9 119 cnv 1 450 1 empty empty 2nd: 8 12 0 13 #7c7c7c #000000 0;
-#X text 113 126 float - rolloff frequency., f 36;
#X text 104 203 1) float - rolloff frequency in Hz (default 0).;
#X obj 36 12 hip~;
-#X text 78 11 - one-pole high pass filter.;
+#X text 113 126 float - cutoff frequency., f 36;
+#X text 78 11 - 1-pole/1-zero high pass filter.;
#X restore 395 15 pd reference;
#X text 493 16 <= click;
#X obj 8 491 cnv 1 560 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X text 39 56 [hip~] is a one-pole high pass filter with a specified cutoff frequency. Left (audio) inlet is the incoming audio signal. Right (control) inlet sets cutoff frequency., f 72;
-#X text 162 124 <-- reinitialize internal state;
-#X text 282 177 <-- set cutoff frequency;
-#X obj 219 150 hsl 169 18 50 5000 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1;
-#X connect 0 0 15 1;
-#X connect 1 0 15 0;
-#X connect 13 0 15 0;
-#X connect 15 0 14 0;
-#X connect 29 0 0 0;
+#X text 142 124 <-- reinitialize internal state;
+#X text 262 177 <-- set cutoff frequency;
+#X obj 199 150 hsl 169 18 50 5000 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1;
+#X text 39 56 [hip~] is a one-pole/one-zero high pass filter with a specified cutoff frequency. The left inlet is the incoming audio signal to filter. The right inlet sets cutoff frequency (at control rate only)., f 72;
+#X text 70 14 - 1-pole/1-zero high pass filter;
+#X connect 0 0 14 1;
+#X connect 1 0 14 0;
+#X connect 12 0 14 0;
+#X connect 14 0 13 0;
+#X connect 27 0 0 0;
diff --git a/doc/5.reference/lop~-help.pd b/doc/5.reference/lop~-help.pd
index 93238298d..1c195ee43 100644
--- a/doc/5.reference/lop~-help.pd
+++ b/doc/5.reference/lop~-help.pd
@@ -2,7 +2,6 @@
#X declare -stdpath ./;
#X floatatom 236 187 8 0 0 0 - - - 0;
#X obj 26 13 lop~;
-#X text 66 14 - one-pole low pass filter;
#X msg 140 135 clear;
#X text 14 346 see also:;
#X obj 93 345 hip~;
@@ -30,9 +29,9 @@
#X text 106 167 signal - filtered signal.;
#X obj 11 123 cnv 1 450 1 empty empty 2nd: 8 12 0 13 #7c7c7c #000000 0;
#X text 104 207 1) float - rolloff frequency in Hz (default 0).;
-#X text 86 15 - one-pole low pass filter.;
#X obj 11 75 cnv 1 450 1 empty empty 1st: 8 12 0 13 #7c7c7c #000000 0;
#X text 113 130 float or signal - rolloff frequency.;
+#X text 86 15 - 1-pole low pass filter.;
#X restore 385 13 pd reference;
#X text 483 14 <= click;
#X obj 7 328 cnv 1 560 1 empty empty empty 8 12 0 13 #000000 #000000 0;
@@ -56,8 +55,9 @@
#X connect 5 0 3 1;
#X connect 7 0 4 0;
#X restore 416 280 pd signal-cutoff;
-#X connect 0 0 11 1;
-#X connect 3 0 11 0;
-#X connect 9 0 11 0;
-#X connect 11 0 10 0;
-#X connect 25 0 0 0;
+#X text 66 14 - 1-pole low pass filter;
+#X connect 0 0 10 1;
+#X connect 2 0 10 0;
+#X connect 8 0 10 0;
+#X connect 10 0 9 0;
+#X connect 24 0 0 0;
diff --git a/doc/5.reference/rpole~-help.pd b/doc/5.reference/rpole~-help.pd
index a03827fe3..05f507b86 100644
--- a/doc/5.reference/rpole~-help.pd
+++ b/doc/5.reference/rpole~-help.pd
@@ -1,20 +1,19 @@
#N canvas 504 36 528 607 12;
#X declare -stdpath ./;
-#X floatatom 141 192 4 0 0 0 - - - 0;
-#X obj 74 105 osc~ 100;
-#X msg 90 137 clear;
+#X floatatom 137 192 4 0 0 0 - - - 0;
+#X obj 70 105 osc~ 100;
+#X msg 86 135 clear;
#X obj 21 10 rpole~;
-#X msg 98 163 set 1;
-#X text 37 335 The transfer function is H(Z) = 1/(1 - aZ^-1).;
-#X text 38 297 where y[n] is the output \, x[n] the input \, and a[n] the filter coefficient. The filter is unstable if/when |a[n]|>1.;
-#X obj 74 219 rpole~ 0.9;
-#N canvas 969 234 313 353 test 0;
+#X msg 94 163 set 1;
+#X text 38 335 The transfer function is H(Z) = 1/(1 - aZ^-1)., f 61;
+#X obj 70 219 rpole~ 0.9;
+#N canvas 909 179 313 353 test 0;
#X obj 76 78 osc~;
#X floatatom 76 55 5 0 0 0 - - - 0;
#X obj 76 282 env~ 16384;
#X floatatom 76 306 5 0 0 0 - - - 0;
#X obj 76 168 rpole~;
-#X obj 104 107 tgl 15 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000 0 1;
+#X obj 114 105 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1;
#X obj 76 105 *~;
#X msg 97 137 set 1;
#X floatatom 151 118 4 -100 100 0 - - - 0;
@@ -34,11 +33,6 @@
#X connect 9 0 4 1;
#X restore 415 492 pd test;
#X text 94 272 y[n] = x[n] + a[n] * y[n-1];
-#X text 146 106 <= signal to filter;
-#X text 142 137 <= clear internal state to zero;
-#X text 146 162 <= set internal state;
-#X text 176 191 <= filter coefficient (may be a signal);
-#X text 162 219 <= creation argument initializes filter coefficient;
#X obj 87 540 lop~;
#X text 8 541 see also:;
#X obj 173 473 rzero~;
@@ -98,8 +92,14 @@
#X text 30 48 [rpole~] filters an audio signal (left inlet) via a raw one-pole (recursive) real filter \, whose coefficient is controlled by a creation argument or by an audio signal (right inlet)., f 65;
#X text 35 250 The action of [rpole~] is:;
#X text 18 366 Pd also provides a suite of user-friendly filters. This and other raw filters are provided for situations which the user-friendly ones can't handle. See Chapter 8 of http://msp.ucsd.edu/techniques.htm for an introduction to the necessary theory (click) ->, f 69;
-#X connect 0 0 7 1;
-#X connect 1 0 7 0;
-#X connect 2 0 7 0;
-#X connect 4 0 7 0;
-#X connect 34 0 35 0;
+#X text 142 106 <- signal to filter;
+#X text 131 135 <- clear internal state to zero;
+#X text 142 162 <- set internal state;
+#X text 172 191 <- filter coefficient (may be a signal);
+#X text 151 219 <- creation argument initializes filter coefficient;
+#X text 38 297 where y[n] is the output \, x[n] the input \, and a[n] the filter coefficient. The filter is unstable if/when |a[n]| > 1, f 61;
+#X connect 0 0 6 1;
+#X connect 1 0 6 0;
+#X connect 2 0 6 0;
+#X connect 4 0 6 0;
+#X connect 28 0 29 0;
From a93c45d122ddbf121f6a29579cdbb77fda6e21f7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Tue, 20 Feb 2024 12:08:24 +0100
Subject: [PATCH 075/450] Handle non-existing parent for
[openpanel]/[savepanel]
Closes: https://github.com/pure-data/pure-data/issues/2195
---
tcl/wheredoesthisgo.tcl | 42 +++++++++++++++++++++++++++++------------
1 file changed, 30 insertions(+), 12 deletions(-)
diff --git a/tcl/wheredoesthisgo.tcl b/tcl/wheredoesthisgo.tcl
index 8467fc738..76e61b435 100644
--- a/tcl/wheredoesthisgo.tcl
+++ b/tcl/wheredoesthisgo.tcl
@@ -35,7 +35,6 @@ proc open_file {filename} {
# ------------------------------------------------------------------------------
# procs for panels (openpanel, savepanel)
-
proc pdtk_openpanel {target localdir {mode 0} {parent .pdwindow}} {
if { $::pd::private::lastopendir == "" } {
if { ! [file isdirectory $::fileopendir]} {
@@ -46,16 +45,29 @@ proc pdtk_openpanel {target localdir {mode 0} {parent .pdwindow}} {
if {! [file isdirectory $localdir]} {
set localdir $::pd::private::lastopendir
}
+ if { ! [winfo exists parent] } {
+ set parent .pdwindow
+ }
- # 0: file, 1: directory, 2: multiple files
- switch $mode {
- 0 { set result [tk_getOpenFile -initialdir $localdir \
- -parent $parent] }
- 1 { set result [tk_chooseDirectory -initialdir $localdir \
- -parent $parent] }
- 2 { set result [tk_getOpenFile -multiple 1 -initialdir $localdir \
- -parent $parent] }
- default { ::pdwindow::error "bad value for 'mode' argument" }
+ set result ""
+ if { [winfo exists parent] } {
+ # 0: file, 1: directory, 2: multiple files
+ switch $mode {
+ 0 { set result [tk_getOpenFile -initialdir $localdir \
+ -parent $parent] }
+ 1 { set result [tk_chooseDirectory -initialdir $localdir \
+ -parent $parent] }
+ 2 { set result [tk_getOpenFile -multiple 1 -initialdir $localdir \
+ -parent $parent] }
+ default { ::pdwindow::error "bad value for 'mode' argument" }
+ }
+ } else {
+ switch $mode {
+ 0 { set result [tk_getOpenFile -initialdir $localdir] }
+ 1 { set result [tk_chooseDirectory -initialdir $localdir] }
+ 2 { set result [tk_getOpenFile -multiple 1 -initialdir $localdir] }
+ default { ::pdwindow::error "bad value for 'mode' argument" }
+ }
}
if {$result ne ""} {
if { $mode == 2 } {
@@ -86,8 +98,14 @@ proc pdtk_savepanel {target localdir {parent .pdwindow}} {
if {! [file isdirectory $localdir]} {
set localdir $::pd::private::lastsavedir
}
-
- set filename [tk_getSaveFile -initialdir $localdir -parent $parent]
+ if { ! [winfo exists parent] } {
+ set parent .pdwindow
+ }
+ if { [winfo exists parent] } {
+ set filename [tk_getSaveFile -initialdir $localdir -parent $parent]
+ } else {
+ set filename [tk_getSaveFile -initialdir $localdir]
+ }
if {$filename ne ""} {
set ::pd::private::lastsavedir [file dirname $filename]
pdsend "$target callback [enquote_path $filename]"
From cf2e812b696441e951cc1234ecdfca46159e72e9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Tue, 20 Feb 2024 14:58:30 +0100
Subject: [PATCH 076/450] whitespace
---
src/m_class.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/m_class.c b/src/m_class.c
index 5ea4b1341..36395fcd8 100644
--- a/src/m_class.c
+++ b/src/m_class.c
@@ -203,7 +203,7 @@ void pdinstance_free(t_pdinstance *x)
pd_setinstance(x);
sys_lock();
pd_globallock();
-
+
instanceno = x->pd_instanceno;
inter = x->pd_inter;
canvas_suspend_dsp();
@@ -1252,4 +1252,3 @@ int class_getdspflags(const t_class *c)
(c->c_nopromotesig ? CLASS_NOPROMOTESIG : 0) |
(c->c_nopromoteleft ? CLASS_NOPROMOTELEFT : 0) );
}
-
From 3b721117278a02f8520523c66082ef4d14cd7523 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Tue, 20 Feb 2024 14:59:22 +0100
Subject: [PATCH 077/450] make vararg handling in class_addcreator() more
robust
and incidentally use the same checks as in class_addmethod()
Closes: https://github.com/pure-data/pure-data/issues/2199
---
src/m_class.c | 33 ++++++++++++++++-----------------
1 file changed, 16 insertions(+), 17 deletions(-)
diff --git a/src/m_class.c b/src/m_class.c
index 36395fcd8..d9efec4b4 100644
--- a/src/m_class.c
+++ b/src/m_class.c
@@ -569,28 +569,27 @@ void class_addcreator(t_newmethod newmethod, t_symbol *s,
t_atomtype type1, ...)
{
va_list ap;
- t_atomtype vec[MAXPDARG+1], *vp = vec;
+ t_atomtype vec[MAXPDARG+1], *vp = vec, argtype = type1;
int count = 0;
- *vp = type1;
+ if(!argtype) argtype = A_NULL;
va_start(ap, type1);
- while (*vp)
- {
- if (count == MAXPDARG)
- {
- if(s)
- pd_error(0, "class %s: sorry: only %d creation args allowed",
- s->s_name, MAXPDARG);
- else
- pd_error(0, "unnamed class: sorry: only %d creation args allowed",
- MAXPDARG);
- break;
- }
- vp++;
- count++;
- *vp = va_arg(ap, t_atomtype);
+ while(argtype != A_NULL && count < MAXPDARG) {
+ vec[count++] = argtype;
+ argtype = va_arg(ap, t_atomtype);
+ if(!argtype) argtype = A_NULL;
}
va_end(ap);
+ /* the last argument must be A_NULL */
+ if (A_NULL != argtype) {
+ if(s)
+ pd_error(0, "class %s: sorry: only %d creation args allowed",
+ s->s_name, MAXPDARG);
+ else
+ pd_error(0, "unnamed class: sorry: only %d creation args allowed",
+ MAXPDARG);
+ }
+ vec[count] = A_NULL;
class_addmethod(pd_objectmaker, (t_method)newmethod, s,
vec[0], vec[1], vec[2], vec[3], vec[4], vec[5]);
}
From c560b0cd509d41be1ad5a2cba32e57ac340a8074 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Tue, 20 Feb 2024 15:32:36 +0100
Subject: [PATCH 078/450] fix find-error on Windows (mostly)
Closes: https://github.com/pure-data/pure-data/issues/2191
TODO: if we are really unlucky, the instance id will only have numbers
(that is "[0-9]", but without any "[a-f]"), which will then trigger
Pd's number parser and we get a "bad arguments for message 'findinstance'"
---
src/s_print.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/src/s_print.c b/src/s_print.c
index 214e307fe..7c2a9d8ba 100644
--- a/src/s_print.c
+++ b/src/s_print.c
@@ -308,12 +308,15 @@ void glob_findinstance(t_pd *dummy, t_symbol*s)
// revert s to (potential) pointer to object
PD_LONGINTTYPE obj = 0;
const char*addr;
+ int result = 0;
if(!s || !s->s_name)
return;
addr = s->s_name;
- if (('.' != addr[0]) && ('0' != addr[0]))
- return;
- if (!sscanf(addr+1, "x%lx", &obj))
+ if (('.' == addr[0]) || ('0' == addr[0]))
+ result = sscanf(addr+1, "x%lx", &obj);
+ if (!result)
+ result = sscanf(addr, "%p", &obj);
+ if (!result)
return;
if(!obj)
From edec0e4fe71844e76c3988493ad6983c4053f219 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Tue, 20 Feb 2024 15:49:37 +0100
Subject: [PATCH 079/450] use PDGUI_FORMAT__OBJECT for sending object-IDs
between core<->gui
the GUI doesn't care, but the core needs to use the same formatter
for sending and receiving (parsing). also the ID must always be a symbol
so can bypass Pd's atom parser
---
src/s_inter_gui.c | 4 +++-
src/s_print.c | 6 +++---
src/s_stuff.h | 7 +++++++
3 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/src/s_inter_gui.c b/src/s_inter_gui.c
index ae07cb59b..6adfc09df 100644
--- a/src/s_inter_gui.c
+++ b/src/s_inter_gui.c
@@ -231,9 +231,11 @@ static int addmess(const t_val *v)
sys_vgui("{%s}", str_escape(v->value.p, v->size));
break;
case GUI_VMESS__POINTER:
- case GUI_VMESS__OBJECT:
sys_vgui("%p", v->value.p);
break;
+ case GUI_VMESS__OBJECT:
+ sys_vgui(PDGUI_FORMAT__OBJECT, v->value.p);
+ break;
case GUI_VMESS__MESSAGE:
sys_vgui("{");
if (v->string)
diff --git a/src/s_print.c b/src/s_print.c
index 7c2a9d8ba..58caade88 100644
--- a/src/s_print.c
+++ b/src/s_print.c
@@ -312,10 +312,10 @@ void glob_findinstance(t_pd *dummy, t_symbol*s)
if(!s || !s->s_name)
return;
addr = s->s_name;
- if (('.' == addr[0]) || ('0' == addr[0]))
- result = sscanf(addr+1, "x%lx", &obj);
if (!result)
- result = sscanf(addr, "%p", &obj);
+ result = sscanf(addr, PDGUI_FORMAT__OBJECT, &obj);
+ if (!result && (('.' == addr[0]) || ('0' == addr[0])))
+ result = sscanf(addr+1, "x%lx", &obj);
if (!result)
return;
diff --git a/src/s_stuff.h b/src/s_stuff.h
index 65fb0b64a..361a0cc81 100644
--- a/src/s_stuff.h
+++ b/src/s_stuff.h
@@ -424,3 +424,10 @@ struct _instancestuff
* 'srclen' can be 0, in which case the 'src' string must be 0-terminated.
*/
EXTERN char*pdgui_strnescape(char* dst, size_t dstlen, const char*src, size_t srclen);
+
+/* format non-trivial data when sending it from core->gui (and vice versa)
+ */
+/* make sure that an object-id is always a string (even on windows, where %p
+ * does not prefix '0x'
+ */
+#define PDGUI_FORMAT__OBJECT "obj:%p"
From 4aaca87ec4522272cabbba37778130a0b9a618ad Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Wed, 21 Feb 2024 17:29:45 +0100
Subject: [PATCH 080/450] explicitly set A_NULL to 0
for vararg termination, typically just "0" is used,
so make it explicit that this is really the same as A_NULL.
---
src/m_class.c | 2 --
src/m_pd.h | 2 +-
2 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/src/m_class.c b/src/m_class.c
index d9efec4b4..53b86dd5b 100644
--- a/src/m_class.c
+++ b/src/m_class.c
@@ -571,13 +571,11 @@ void class_addcreator(t_newmethod newmethod, t_symbol *s,
va_list ap;
t_atomtype vec[MAXPDARG+1], *vp = vec, argtype = type1;
int count = 0;
- if(!argtype) argtype = A_NULL;
va_start(ap, type1);
while(argtype != A_NULL && count < MAXPDARG) {
vec[count++] = argtype;
argtype = va_arg(ap, t_atomtype);
- if(!argtype) argtype = A_NULL;
}
va_end(ap);
/* the last argument must be A_NULL */
diff --git a/src/m_pd.h b/src/m_pd.h
index d8c6c44e4..641ac39b9 100644
--- a/src/m_pd.h
+++ b/src/m_pd.h
@@ -167,7 +167,7 @@ typedef union word
typedef enum
{
- A_NULL,
+ A_NULL = 0,
A_FLOAT,
A_SYMBOL,
A_POINTER,
From 54b34c3b6ad0550f6cb9f210c9d65e7900aa97c4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jean-Micha=C3=ABl=20Celerier?=
Date: Thu, 22 Feb 2024 07:31:22 -0500
Subject: [PATCH 081/450] printing: fix invalid format specifier in some cases
on Win32. Fixes #2187 (#2188)
---
src/s_print.c | 30 +++++++++++++++---------------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/src/s_print.c b/src/s_print.c
index 58caade88..8f4cd4c37 100644
--- a/src/s_print.c
+++ b/src/s_print.c
@@ -11,6 +11,18 @@
#include "s_stuff.h"
#include "m_private_utils.h"
+#ifdef _WIN32
+#ifndef PD_FWPRINTF_NARROW_FORMATTER
+#if __USE_MINGW_ANSI_STDIO
+ /* This is a workaround for a bug in the old msvcrt.dll used by MinGW */
+ #define PD_FWPRINTF_NARROW_FORMATTER L"%s"
+#else
+ /* Covers modern C runtimes on MSYS2 & MSVC */
+ #define PD_FWPRINTF_NARROW_FORMATTER L"%S"
+#endif
+#endif /* PD_FWPRINTF_NARROW_FORMATTER */
+#endif /* _WIN32 */
+
t_printhook sys_printhook = NULL;
int sys_printtostderr;
@@ -52,11 +64,7 @@ static void dopost(const char *s)
else if (sys_printtostderr || !sys_havegui())
{
#ifdef _WIN32
- #ifdef _MSC_VER
- fwprintf(stderr, L"%S", s);
- #else
- fwprintf(stderr, L"%s", s);
- #endif
+ fwprintf(stderr, PD_FWPRINTF_NARROW_FORMATTER, s);
fflush(stderr);
#else
fprintf(stderr, "%s", s);
@@ -82,11 +90,7 @@ static void doerror(const void *object, const char *s)
else if (sys_printtostderr)
{
#ifdef _WIN32
- #ifdef _MSC_VER
- fwprintf(stderr, L"error: %S", s);
- #else
- fwprintf(stderr, L"error: %s", s);
- #endif
+ fwprintf(stderr, L"error: " PD_FWPRINTF_NARROW_FORMATTER, s);
fflush(stderr);
#else
fprintf(stderr, "error: %s", s);
@@ -114,11 +118,7 @@ static void dologpost(const void *object, const int level, const char *s)
else if (sys_printtostderr)
{
#ifdef _WIN32
- #ifdef _MSC_VER
- fwprintf(stderr, L"verbose(%d): %S", level, s);
- #else
- fwprintf(stderr, L"verbose(%d): %s", level, s);
- #endif
+ fwprintf(stderr, L"verbose(%d): " PD_FWPRINTF_NARROW_FORMATTER, level, s);
fflush(stderr);
#else
fprintf(stderr, "verbose(%d): %s", level, s);
From 87ee44b89c33324202cf34f8e4a7f1d4e0f6850c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Sun, 25 Feb 2024 20:08:48 +0100
Subject: [PATCH 082/450] Ignore badfloats for slider and vu
Closes: https://github.com/pure-data/pure-data/issues/2201
Co-authored by: Marco Matteo Markidis
---
src/g_slider.c | 2 ++
src/g_vumeter.c | 4 +++-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/g_slider.c b/src/g_slider.c
index a2b92bb5d..a6519df02 100644
--- a/src/g_slider.c
+++ b/src/g_slider.c
@@ -508,6 +508,8 @@ static void slider_set(t_slider *x, t_floatarg f)
{
int old = x->x_val;
double g;
+ if (PD_BADFLOAT(f))
+ return;
x->x_fval = f;
if (x->x_min > x->x_max)
diff --git a/src/g_vumeter.c b/src/g_vumeter.c
index 6519eb486..d911cc4eb 100644
--- a/src/g_vumeter.c
+++ b/src/g_vumeter.c
@@ -443,7 +443,9 @@ static void vu_float(t_vu *x, t_floatarg rms)
{
int i;
int old = x->x_rms;
- if(rms <= IEM_VU_MINDB)
+ if (PD_BADFLOAT(rms))
+ return;
+ else if(rms <= IEM_VU_MINDB)
x->x_rms = 0;
else if(rms >= IEM_VU_MAXDB)
x->x_rms = IEM_VU_STEPS;
From e17ae0f22b52806401e5281756d72f975bfd1a23 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Sun, 25 Feb 2024 20:19:06 +0100
Subject: [PATCH 083/450] [vu] always disable sender
Closes: https://github.com/pure-data/pure-data/issues/2189
---
src/g_vumeter.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/g_vumeter.c b/src/g_vumeter.c
index d911cc4eb..a0bed06d5 100644
--- a/src/g_vumeter.c
+++ b/src/g_vumeter.c
@@ -516,7 +516,6 @@ static void *vu_new(t_symbol *s, int argc, t_atom *argv)
w = (int)atom_getfloatarg(0, argc, argv);
h = (int)atom_getfloatarg(1, argc, argv);
iemgui_new_getnames(&x->x_gui, 1, argv);
- x->x_gui.x_snd_unexpanded = x->x_gui.x_snd = gensym("nosndno"); /*no send*/
ldx = (int)atom_getfloatarg(4, argc, argv);
ldy = (int)atom_getfloatarg(5, argc, argv);
iem_inttofstyle(&x->x_gui.x_fsf, atom_getfloatarg(6, argc, argv));
@@ -525,6 +524,7 @@ static void *vu_new(t_symbol *s, int argc, t_atom *argv)
scale = (int)atom_getfloatarg(10, argc, argv);
}
else iemgui_new_getnames(&x->x_gui, 1, 0);
+ x->x_gui.x_snd_unexpanded = x->x_gui.x_snd = gensym("nosndno"); /*no send*/
if((argc == 12)&&IS_A_FLOAT(argv,11))
iem_inttosymargs(&x->x_gui.x_isa, atom_getfloatarg(11, argc, argv));
From d49ebcec1b9c09f4ccd942ce2b7eabbb58be2755 Mon Sep 17 00:00:00 2001
From: porres
Date: Wed, 28 Feb 2024 16:38:51 -0300
Subject: [PATCH 084/450] better describe reverberators
[rev1~] was described as a chain of allpass filters, but [rev2~] and [rev3~] had no description, so I said thy are based on a feedback delay network.
Other help files had minor changes and improvements. Worth mentioning is the [readsf~] text on how to use [file which] was confusing, now I think it's much better.
---
doc/5.reference/delay-tilde-objects-help.pd | 8 +--
doc/5.reference/env~-help.pd | 18 +++---
doc/5.reference/file-help.pd | 6 +-
doc/5.reference/int-help.pd | 10 +--
doc/5.reference/readsf~-help.pd | 18 +++---
extra/rev1~-help.pd | 4 +-
extra/rev2~-help.pd | 33 +++++-----
extra/rev3~-help.pd | 67 +++++++++++----------
extra/sigmund~/sigmund~-help.pd | 2 +
9 files changed, 86 insertions(+), 80 deletions(-)
diff --git a/doc/5.reference/delay-tilde-objects-help.pd b/doc/5.reference/delay-tilde-objects-help.pd
index 7982c2c7b..dbf399917 100644
--- a/doc/5.reference/delay-tilde-objects-help.pd
+++ b/doc/5.reference/delay-tilde-objects-help.pd
@@ -24,7 +24,7 @@
#X text 123 376 input (delay time in ms);
#X msg 49 376 500;
#X text 732 527 updated for Pd version 0.52;
-#X text 213 329 2nd argument: length of delay line in msec (the maximum delay time in read objects), f 42;
+#X text 214 329 2nd argument: length of delay line in msec (the maximum delay time in read objects), f 42;
#X text 119 64 - read from a delay line with 4-point interpolation (for variable delay times), f 40;
#X text 656 198 signal input (variable delay time in ms);
#X obj 491 70 vd~;
@@ -80,10 +80,10 @@
#X text 784 275 -- old name of;
#X text 588 468 See also other examples in the "G" section for more fun with delays \, such as feedback delays., f 46;
#X obj 155 529 send~;
-#X text 12 112 The [delread~] and [delread4~] objects read from a delay line allocated in a [delwrite~] object with the same name. You can use more than one [delread~] and/or [delread4~] objects for the same [delwrite~] object. If the specified delay time in [delread~]/[delread4~] is longer than the size of the delay line or less than zero it is clipped to the length of the delay line., f 81;
+#X text 30 112 The [delread~] and [delread4~] objects read from a delay line allocated in a [delwrite~] object with the same name. You can use more than one [delread~] and/or [delread4~] objects for the same [delwrite~] object. If the specified delay time in [delread~]/[delread4~] is longer than the size of the delay line or less than zero it is clipped to the length of the delay line., f 76;
#X text 246 450 Note that in this help file we're using delay names with "\$0" (the patch ID number used to force locality in Pd)., f 40;
-#X text 138 188 Usually \, [delread~]/[delread4~] must have the same block size \, overlap and upsampling factors as the corresponding [delwrite~] object \, otherwise you might get unexpected results \, unless you really know what you're doing. This example patch uses the default block size of 64 samples but you can change it with:, f 63;
-#X obj 510 270 block~;
+#X text 121 188 Usually \, [delread~]/[delread4~] must have the same block size \, overlap and upsampling factors as the corresponding [delwrite~] object \, otherwise you might get unexpected results \, unless you really know what you're doing. This example patch uses the default block size of 64 samples but you can change it with:, f 63;
+#X obj 518 269 block~;
#X text 113 280 <-- set all samples of delay line to zero.;
#X connect 3 0 7 0;
#X connect 5 0 3 0;
diff --git a/doc/5.reference/env~-help.pd b/doc/5.reference/env~-help.pd
index dd7d6e33a..3ebdf55e3 100644
--- a/doc/5.reference/env~-help.pd
+++ b/doc/5.reference/env~-help.pd
@@ -1,12 +1,11 @@
-#N canvas 593 27 546 593 12;
+#N canvas 493 24 546 593 12;
#X floatatom 47 347 8 0 0 0 - - - 0;
#X obj 18 11 env~;
#X text 58 12 - envelope follower;
#X obj 47 211 osc~ 400;
#X obj 47 268 *~;
-#X floatatom 132 199 5 0 100 0 - - - 0;
+#X floatatom 132 196 5 0 100 0 - - - 0;
#X obj 132 237 dbtorms;
-#X text 30 56 The env~ object takes a signal and outputs its RMS amplitude in dB (with 1 normalized to 100 dB.) Output is bounded below by zero., f 67;
#X obj 47 303 env~ 16384 8192;
#X text 164 279 creation arguments:;
#X text 30 92 The analysis is "Hanning" (raised cosine) windowed., f 67;
@@ -39,11 +38,14 @@
#X text 321 563 updated for Pd version 0.4;
#X obj 368 185 set-dsp-tgl;
#X text 399 189 DSP on/off;
-#X connect 0 0 14 0;
+#X text 30 56 The [env~] object takes a signal and outputs its RMS amplitude in dB (with 1 normalized to 100 dB.) Output is bounded below by zero., f 67;
+#X text 16 564 see also:;
+#X obj 94 563 sigmund~;
+#X connect 0 0 13 0;
#X connect 3 0 4 0;
-#X connect 4 0 8 0;
+#X connect 4 0 7 0;
#X connect 5 0 6 0;
#X connect 6 0 4 1;
-#X connect 8 0 0 0;
-#X connect 14 0 13 0;
-#X connect 25 0 12 0;
+#X connect 7 0 0 0;
+#X connect 13 0 12 0;
+#X connect 24 0 11 0;
diff --git a/doc/5.reference/file-help.pd b/doc/5.reference/file-help.pd
index f81f84ad4..a61688e32 100644
--- a/doc/5.reference/file-help.pd
+++ b/doc/5.reference/file-help.pd
@@ -305,7 +305,7 @@
#X text 156 250 - list files in directories;
#X obj 27 249 file glob;
#X obj 27 222 file which;
-#N canvas 660 134 623 461 which 0;
+#N canvas 560 152 623 461 which 0;
#X obj 35 187 file which;
#X symbolatom 35 301 79 0 0 0 - - - 0;
#X obj 35 327 print found;
@@ -315,7 +315,7 @@
#X text 73 364 notes:;
#X text 126 364 - currently this only works for files \, not for directories!;
#X text 126 385 - currently only the first match is returned;
-#X text 178 123 a file that ships with Pd;
+#X text 177 121 a file that ships with Pd;
#X text 139 156 probably does not exist in Pd's search path;
#N canvas 628 410 738 232 arguments 0;
#X text 274 145 less verbose (quiet);
@@ -336,7 +336,6 @@
#X floatatom 127 274 3 0 0 1 - - - 0;
#X obj 11 47 cnv 1 600 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 137 14 - locate a file;
-#X text 29 65 [file which] tries to locate the file in using Pd's search-paths and returns the resolved path., f 69;
#X obj 50 15 file which;
#N canvas 778 127 581 317 reference 0;
#X obj 9 52 cnv 5 550 5 empty empty INLET: 8 18 0 13 #202020 #000000 0;
@@ -356,6 +355,7 @@
#X text 85 174 symbol - the input symbol if file isn't located.;
#X restore 518 15 pd reference;
#X text 157 273 directory flag: 0 if file \, 1 if directory \, see notes below.;
+#X text 53 65 [file which] tries to locate the file in using Pd's search-paths (via preferences and/or the [declare] object) and returns the resolved path., f 72;
#X connect 0 0 13 0;
#X connect 0 1 12 0;
#X connect 1 0 2 0;
diff --git a/doc/5.reference/int-help.pd b/doc/5.reference/int-help.pd
index 8437c24b8..73ef22869 100644
--- a/doc/5.reference/int-help.pd
+++ b/doc/5.reference/int-help.pd
@@ -42,7 +42,6 @@
#X connect 13 0 3 0;
#X connect 14 0 7 0;
#X restore 362 474 pd Dealing_with_"\$0";
-#X text 38 80 The int object stores a number initialized by its creation argument \, which may be reset using its inlet and output by sending it the "bang" message. Sending a number sets a new value and outputs it. A non-integer input is truncated to an integer (a la Max) so the object can also be used to truncate values and convert from float to integers., f 72;
#X obj 69 481 print float;
#X msg 83 290 3 10 a;
#X text 136 291 list get truncated to the first item;
@@ -87,7 +86,8 @@
#X text 175 461 open subpatch to see how to deal with '\$0' ------>, f 25;
#X text 203 318 send to a named object such as a GUI \, a receive or value objects -->, f 35;
#X obj 455 306 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X connect 0 0 18 0;
+#X text 38 80 The [int] object stores a number initialized by its creation argument \, which may be reset using its inlet and output by sending it the "bang" message. Sending a number sets a new value and outputs it. A non-integer input is truncated to an integer (a la Max) so the object can also be used to truncate values and convert from float to integers., f 72;
+#X connect 0 0 17 0;
#X connect 1 0 7 0;
#X connect 2 0 7 1;
#X connect 7 0 0 0;
@@ -96,6 +96,6 @@
#X connect 10 0 1 0;
#X connect 14 0 11 0;
#X connect 15 0 12 0;
-#X connect 19 0 7 0;
-#X connect 35 0 7 0;
-#X connect 40 0 15 0;
+#X connect 18 0 7 0;
+#X connect 34 0 7 0;
+#X connect 39 0 15 0;
diff --git a/doc/5.reference/readsf~-help.pd b/doc/5.reference/readsf~-help.pd
index beaca9631..731db002b 100644
--- a/doc/5.reference/readsf~-help.pd
+++ b/doc/5.reference/readsf~-help.pd
@@ -1,4 +1,4 @@
-#N canvas 421 44 688 635 12;
+#N canvas 421 44 688 659 12;
#X declare -stdpath ./;
#X obj 491 428 print didit;
#X obj 163 403 env~ 16384;
@@ -9,13 +9,13 @@
#X obj 323 403 env~ 16384;
#X obj 404 403 env~ 16384;
#X msg 41 177 open ../sound/bell.aiff 0 200 4 2 b;
-#X obj 96 599 soundfiler;
-#X text 17 598 see also:;
+#X obj 96 615 soundfiler;
+#X text 17 614 see also:;
#X obj 38 15 readsf~;
#X text 300 167 Open takes a filename \, an onset in sample frames \, and \, as an override \, you may also supply a header size to skip \, a number of channels \, bytes per sample \, and endianness., f 44;
#X text 21 126 The wave \, aiff \, caf \, and next formats are parsed automatically \, although only uncompressed 2- or 3-byte integer ("pcm") and 4-byte floating point samples are accepted., f 91;
#X obj 34 406 output~;
-#X obj 185 599 writesf~;
+#X obj 185 615 writesf~;
#X obj 491 402 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X text 511 352 - number of channels \; - per channel buffer size in bytes, f 22;
#X msg 75 205 open ../sound/bell.aiff;
@@ -51,7 +51,7 @@
#X floatatom 323 430 6 0 0 0 - - - 0;
#X floatatom 404 430 6 0 0 0 - - - 0;
#X text 506 334 Arguments:;
-#X obj 7 582 cnv 1 675 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X obj 7 598 cnv 1 675 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 207 322 print information on the Pd window;
#X obj 123 287 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
#X floatatom 123 314 3 0 0 0 - - - 0;
@@ -61,12 +61,12 @@
#X text 136 233 start playback;
#X text 143 259 stop playback;
#X text 21 60 The [readsf~] object reads a soundfile into its signal outputs. You must open the soundfile in advance (best a little bit before you need it) using the "open" message. The object immediately starts reading from the file \, but output will only appear after you send a "1" or "start" message to start the playback. A "0" or "stop" message stops it., f 91;
-#X text 482 602 Updated for version 0.53-1;
+#X text 482 618 Updated for version 0.53-1;
#X text 96 15 - soundfile playback from disk;
#X text 487 451 "bang" when the soundfile is done., f 18;
-#X text 538 546 see:;
-#X obj 581 546 file which;
-#X text 39 505 Note: [readsf~] cannot find files in folders added via a [declare] object and it is recommended to use [file which] to get absolute paths which can be used with open. Folder paths added to the search path via preferences do work., f 82;
+#X text 528 562 see:;
+#X obj 571 562 file which;
+#X text 49 505 Note: [readsf~] can find files added to the search path via preferences as usual \, but it can't find files in folders added via a [declare] object! In this case it is recommended to use [file which] because it can search paths added via [declare] and return the absolute path to be used with the 'open' message., f 82;
#X connect 1 0 2 0;
#X connect 3 0 5 0;
#X connect 4 0 23 0;
diff --git a/extra/rev1~-help.pd b/extra/rev1~-help.pd
index 591c3dcb8..3cff17dac 100644
--- a/extra/rev1~-help.pd
+++ b/extra/rev1~-help.pd
@@ -1,4 +1,4 @@
-#N canvas 515 23 648 487 12;
+#N canvas 350 30 648 487 12;
#X floatatom 172 255 5 0 100 0 - db - 0;
#X obj 29 93 metro 2000;
#X text 210 283 clear;
@@ -76,7 +76,7 @@
#X connect 21 0 20 0;
#X connect 22 0 23 0;
#X restore 29 204 pd test-input;
-#X obj 30 350 output~;
+#X obj 29 350 output~;
#X obj 156 350 output~;
#X obj 6 44 cnv 1 630 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 552 12 <= click;
diff --git a/extra/rev2~-help.pd b/extra/rev2~-help.pd
index 36761d01a..6ed41646c 100644
--- a/extra/rev2~-help.pd
+++ b/extra/rev2~-help.pd
@@ -1,9 +1,9 @@
-#N canvas 472 38 646 596 12;
-#X floatatom 113 313 4 0 120 0 - - - 0;
+#N canvas 472 38 646 597 12;
+#X floatatom 113 291 4 0 120 0 - - - 0;
#X floatatom 147 344 4 0 100 0 - - - 0;
-#X floatatom 181 381 6 0 0 0 - - - 0;
+#X floatatom 181 379 6 0 0 0 - - - 0;
#X floatatom 216 407 4 0 100 0 - - - 0;
-#X text 229 381 crossover frequency \, Hz.;
+#X text 229 379 crossover frequency \, Hz.;
#X obj 35 10 rev2~, f 7;
#X text 98 10 - a simple 1-in \, 4-out reverberator;
#X text 21 565 see also:;
@@ -12,11 +12,11 @@
#X obj 79 109 metro 2000;
#X obj 79 137 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X obj 79 84 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X msg 167 77 20;
-#X msg 176 100 100;
-#X msg 189 147 1000;
+#X msg 167 67 20;
+#X msg 176 90 100;
+#X msg 189 137 1000;
#X floatatom 167 183 5 0 0 0 - - - 0;
-#X msg 183 124 500;
+#X msg 183 114 500;
#X floatatom 123 183 5 0 0 0 - freq - 0;
#X text 119 162 pitch;
#X text 101 137 impulse;
@@ -74,7 +74,7 @@
#X connect 21 0 20 0;
#X connect 22 0 23 0;
#X restore 79 220 pd test-input;
-#X obj 21 470 output~;
+#X obj 21 480 output~;
#X obj 6 44 cnv 1 630 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 552 12 <= click;
#N canvas 746 67 578 447 reference 0;
@@ -109,14 +109,15 @@
#X restore 458 13 pd reference;
#X obj 6 549 cnv 1 630 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 417 562 updated for Pd version 0.37;
-#X obj 79 436 rev2~ 100 90 3000 20;
-#X text 251 408 High Frequency damping (in percent: 0-100), f 22;
-#X obj 170 470 output~;
-#X text 147 312 output level dB;
-#X text 212 74 <-- tone burst durtion in ms;
-#X text 270 112 The creation arguments (output level \, liveness \, crossover frequency \, HF damping) may also be supplied in four inlets as shown. The "liveness" (actually the internal feedback percentage) should be 100 for infinite reverb \, 90 for longish \, and 80 for short., f 50;
-#X text 270 202 The crossover frequency and HF damping work together: at frequencies above crossover \, the feedback is diminished by the "damping" as a percentage. So zero HF damping means equal reverb time at all frequencies \, and 100% damping means almost nothing above the crossover frequency gets through., f 50;
+#X obj 79 446 rev2~ 100 90 3000 20;
+#X text 251 399 High Frequency damping (in percent: 0-100), f 22;
+#X obj 170 480 output~;
#X text 180 337 liveness/feedback (in percent: 0-100), f 19;
+#X text 239 443 args: level \, liveness \, crossover \, damping;
+#X text 147 279 output level (dB), f 6;
+#X text 200 66 <-- tone burst duration in ms;
+#X text 248 104 The [rev2~] object is a reverberator based on a feedback delay network. Its arguments (output level \, liveness \, crossover frequency \, high frequency damping) may also be supplied via the four inlets as shown here. The "liveness" (actually the internal feedback percentage) should be 100 for an infinite reverb \, 90 for longish \, and 80 for short., f 52;
+#X text 248 212 The crossover frequency and high frequency damping work together: at frequencies above crossover \, the feedback is diminished by the "damping" as a percentage. So zero high frequency damping means equal reverb time at all frequencies \, and 100% damping means almost nothing above the crossover frequency gets through., f 52;
#X connect 0 0 28 1;
#X connect 1 0 28 2;
#X connect 2 0 28 3;
diff --git a/extra/rev3~-help.pd b/extra/rev3~-help.pd
index 6df1f5ce7..8f7b18ff4 100644
--- a/extra/rev3~-help.pd
+++ b/extra/rev3~-help.pd
@@ -1,18 +1,18 @@
-#N canvas 409 31 730 537 12;
-#X obj 78 372 rev3~ 100 90 3000 20;
+#N canvas 409 31 730 573 12;
+#X obj 57 403 rev3~ 100 90 3000 20;
#X obj 27 14 rev3~, f 9;
#X text 104 13 - hard-core \, 2-in \, 4-out reverberator;
-#X obj 78 94 metro 2000;
-#X obj 78 122 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X obj 78 69 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X msg 166 67 20;
-#X msg 175 90 100;
-#X msg 188 137 1000;
-#X floatatom 166 168 5 0 0 0 - - - 0;
-#X msg 182 114 500;
-#X floatatom 122 168 5 0 0 0 - freq - 0;
-#X text 118 147 pitch;
-#X text 99 122 impulse;
+#X obj 57 95 metro 2000;
+#X obj 57 123 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 57 70 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X msg 145 68 20;
+#X msg 154 91 100;
+#X msg 167 138 1000;
+#X floatatom 145 169 5 0 0 0 - - - 0;
+#X msg 161 115 500;
+#X floatatom 101 169 5 0 0 0 - freq - 0;
+#X text 97 148 pitch;
+#X text 78 123 impulse;
#N canvas 863 156 393 438 test-input 0;
#X obj 241 191 line~;
#X obj 241 214 cos~;
@@ -66,15 +66,15 @@
#X connect 20 0 13 0;
#X connect 21 0 20 0;
#X connect 22 0 23 0;
-#X restore 78 205 pd test-input;
-#X floatatom 132 253 4 0 120 0 - - - 0;
-#X floatatom 160 282 4 0 100 0 - - - 0;
-#X floatatom 187 317 6 0 0 0 - - - 0;
-#X floatatom 215 343 4 0 100 0 - - - 0;
-#X text 235 317 crossover frequency \, Hz.;
-#X text 31 503 see also:;
-#X obj 20 404 output~;
-#X obj 169 404 output~;
+#X restore 57 206 pd test-input;
+#X floatatom 111 264 4 0 120 0 - - - 0;
+#X floatatom 139 293 4 0 100 0 - - - 0;
+#X floatatom 166 330 6 0 0 0 - - - 0;
+#X floatatom 194 361 4 0 100 0 - - - 0;
+#X text 214 330 crossover frequency \, Hz.;
+#X text 31 543 see also:;
+#X obj 33 449 output~;
+#X obj 148 449 output~;
#X obj 6 44 cnv 1 715 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 622 12 <= click;
#N canvas 746 67 573 478 reference 0;
@@ -109,17 +109,18 @@
#X text 131 72 signal - left channel reverb input., f 56;
#X text 131 99 signal - right channel reverb input., f 56;
#X restore 528 13 pd reference;
-#X obj 104 503 rev1~;
-#X text 480 500 updated for Pd version 0.37-1;
-#X obj 5 488 cnv 1 715 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X obj 90 306 *~ -1;
-#X obj 152 503 rev2~, f 8;
-#X text 163 253 output level (dB);
-#X text 193 277 liveness \, feedback percentage (0-100), f 18;
-#X text 347 116 The creation arguments (output level \, liveness \, crossover frequency \, HF damping) may also be supplied in four inlets as shown. The "liveness" (actually the internal feedback percentage) should be 100 for infinite reverb \, 90 for longish \, and 80 for short. The crossover frequency and HF damping work together: at frequencies above crossover \, the feedback is diminished by the "damping" as a percentage. So zero HF damping means equal reverb time at all frequencies \, and 100% damping means almost nothing above the crossover frequency gets through., f 50;
-#X text 250 344 High Frequency damping \, percentage (0-100), f 23;
-#X text 211 64 <-- tone burst durtion in ms, f 14;
-#X text 398 61 (A more expensive \, presumably better \, one than [rev2~].), f 29;
+#X obj 104 543 rev1~;
+#X text 480 540 updated for Pd version 0.37-1;
+#X obj 5 528 cnv 1 715 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X obj 69 317 *~ -1;
+#X obj 152 543 rev2~, f 8;
+#X text 142 264 output level (dB);
+#X text 172 288 liveness \, feedback percentage (0-100), f 18;
+#X text 229 355 High Frequency damping \, percentage (0-100), f 23;
+#X text 189 67 <-- tone burst durtion in ms, f 14;
+#X text 327 68 The [rev3~] object is a more expensive \, presumably better \, reverberator than [rev2~]. It has a bigger feedback delay network matrix and an early reflections stage., f 54;
+#X text 212 402 args: level \, liveness \, crossover \, damping;
+#X text 327 131 The creation arguments (output level \, liveness \, crossover frequency \, high frequency damping) may also be supplied in four inlets as shown. The "liveness" (actually the internal feedback percentage) should be 100 for infinite reverb \, 90 for longish \, and 80 for short. The crossover frequency and high frequency damping work together: at frequencies above crossover \, the feedback is diminished by the "damping" as a percentage. So zero high frequency damping means equal reverb time at all frequencies \, and 100% damping means almost nothing above the crossover frequency gets through., f 54;
#X connect 0 0 21 0;
#X connect 0 1 21 1;
#X connect 0 2 22 0;
diff --git a/extra/sigmund~/sigmund~-help.pd b/extra/sigmund~/sigmund~-help.pd
index 77020830a..0d9eab0ba 100644
--- a/extra/sigmund~/sigmund~-help.pd
+++ b/extra/sigmund~/sigmund~-help.pd
@@ -290,6 +290,8 @@
#X restore 457 505 pd more;
#X text 31 228 The basic parameters for all output options are:;
#X text 38 333 These can be set via flags or messages. The 'npts' and 'hop' parameters are in samples and need to be powers of two. The example below specifies a huge hop of 4096 (to slow the output down). There are more parameters see [pd setting-parameters] for more details on them all., f 74;
+#X text 29 592 see also:;
+#X obj 105 592 env~;
#X connect 1 0 35 0;
#X connect 4 0 1 0;
#X connect 26 0 4 0;
From 9bae2a5e109bbbc654a314b85a6097f8c9f32642 Mon Sep 17 00:00:00 2001
From: porres
Date: Sat, 2 Mar 2024 13:08:39 -0300
Subject: [PATCH 085/450] improve readsf~
this was motivated by making it clear that the object doesnt' load the file into the memory, but other improvements were made.
---
doc/5.reference/readsf~-help.pd | 126 +++++++++++++++-----------------
1 file changed, 60 insertions(+), 66 deletions(-)
diff --git a/doc/5.reference/readsf~-help.pd b/doc/5.reference/readsf~-help.pd
index 731db002b..05df1a678 100644
--- a/doc/5.reference/readsf~-help.pd
+++ b/doc/5.reference/readsf~-help.pd
@@ -1,28 +1,19 @@
-#N canvas 421 44 688 659 12;
+#N canvas 339 45 705 651 12;
#X declare -stdpath ./;
-#X obj 491 428 print didit;
-#X obj 163 403 env~ 16384;
-#X floatatom 163 430 6 0 0 0 - - - 0;
-#X msg 162 324 print;
-#X obj 243 403 env~ 16384;
-#X obj 74 364 readsf~ 4 1e+06, f 60;
-#X obj 323 403 env~ 16384;
-#X obj 404 403 env~ 16384;
-#X msg 41 177 open ../sound/bell.aiff 0 200 4 2 b;
-#X obj 96 615 soundfiler;
-#X text 17 614 see also:;
-#X obj 38 15 readsf~;
-#X text 300 167 Open takes a filename \, an onset in sample frames \, and \, as an override \, you may also supply a header size to skip \, a number of channels \, bytes per sample \, and endianness., f 44;
-#X text 21 126 The wave \, aiff \, caf \, and next formats are parsed automatically \, although only uncompressed 2- or 3-byte integer ("pcm") and 4-byte floating point samples are accepted., f 91;
-#X obj 34 406 output~;
-#X obj 185 615 writesf~;
-#X obj 491 402 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X text 511 352 - number of channels \; - per channel buffer size in bytes, f 22;
-#X msg 75 205 open ../sound/bell.aiff;
-#X obj 537 261 declare -stdpath ./;
-#X obj 7 47 cnv 1 675 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X text 613 14 <= click;
-#N canvas 679 102 573 384 reference 0;
+#X obj 499 448 print didit;
+#X floatatom 82 460 6 0 0 0 - - - 0;
+#X msg 150 342 print;
+#X obj 96 614 soundfiler;
+#X text 17 613 see also:;
+#X obj 38 13 readsf~;
+#X obj 144 426 output~;
+#X obj 185 614 writesf~;
+#X obj 499 422 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X text 519 372 - number of channels \; - per channel buffer size in bytes, f 22;
+#X obj 549 262 declare -stdpath ./;
+#X obj 3 45 cnv 1 695 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 623 12 <= click;
+#N canvas 651 73 573 384 reference 0;
#X obj 8 52 cnv 5 550 5 empty empty INLET: 8 18 0 13 #202020 #000000 0;
#X obj 8 208 cnv 2 550 2 empty empty OUTLETS: 8 12 0 13 #202020 #000000 0;
#X obj 8 309 cnv 2 550 2 empty empty ARGUMENTS: 8 12 0 13 #202020 #000000 0;
@@ -31,7 +22,6 @@
#X obj 7 236 cnv 1 550 1 empty empty n: 8 12 0 13 #7c7c7c #000000 0;
#X obj 30 18 readsf~;
#X text 78 68 open -;
-#X text 177 68 sets a filename \, an onset in samples \, header size to skip \, number of channels \, bytes per sample \, and endianness., f 50;
#X text 120 157 float -;
#X text 177 157 nonzero starts playback \, zero stops., f 50;
#X text 121 178 print - prints information on Pd's terminal window., f 58;
@@ -43,46 +33,50 @@
#X text 82 213 ('n' number of outlets specified by argument);
#X text 120 117 start -;
#X text 127 137 stop -;
-#X text 177 117 start playback (needs a prior 'open' message)., f 50;
#X text 177 137 stop playback., f 50;
#X text 88 19 - soundfile playback from disk.;
-#X restore 519 15 pd reference;
-#X floatatom 243 430 6 0 0 0 - - - 0;
-#X floatatom 323 430 6 0 0 0 - - - 0;
-#X floatatom 404 430 6 0 0 0 - - - 0;
-#X text 506 334 Arguments:;
-#X obj 7 598 cnv 1 675 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X text 207 322 print information on the Pd window;
-#X obj 123 287 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
-#X floatatom 123 314 3 0 0 0 - - - 0;
-#X text 146 287 nonzero starts playback \, zero stops it;
-#X msg 91 233 start;
-#X msg 104 259 stop;
-#X text 136 233 start playback;
-#X text 143 259 stop playback;
-#X text 21 60 The [readsf~] object reads a soundfile into its signal outputs. You must open the soundfile in advance (best a little bit before you need it) using the "open" message. The object immediately starts reading from the file \, but output will only appear after you send a "1" or "start" message to start the playback. A "0" or "stop" message stops it., f 91;
-#X text 482 618 Updated for version 0.53-1;
-#X text 96 15 - soundfile playback from disk;
-#X text 487 451 "bang" when the soundfile is done., f 18;
-#X text 528 562 see:;
-#X obj 571 562 file which;
-#X text 49 505 Note: [readsf~] can find files added to the search path via preferences as usual \, but it can't find files in folders added via a [declare] object! In this case it is recommended to use [file which] because it can search paths added via [declare] and return the absolute path to be used with the 'open' message., f 82;
-#X connect 1 0 2 0;
-#X connect 3 0 5 0;
-#X connect 4 0 23 0;
-#X connect 5 0 1 0;
-#X connect 5 0 14 0;
-#X connect 5 1 4 0;
-#X connect 5 1 14 1;
-#X connect 5 2 6 0;
-#X connect 5 3 7 0;
-#X connect 5 4 16 0;
-#X connect 6 0 24 0;
-#X connect 7 0 25 0;
-#X connect 8 0 5 0;
-#X connect 16 0 0 0;
-#X connect 18 0 5 0;
-#X connect 29 0 30 0;
-#X connect 30 0 5 0;
-#X connect 32 0 5 0;
-#X connect 33 0 5 0;
+#X text 177 117 start playback., f 50;
+#X text 177 68 sets a filename \, an onset in samples \, header size to skip \, number of channels \, bytes per sample \, and endianness. (needed before start playback.), f 50;
+#X restore 529 13 pd reference;
+#X floatatom 290 460 6 0 0 0 - - - 0;
+#X text 514 354 Arguments:;
+#X text 195 341 print information on the Pd window;
+#X obj 104 276 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
+#X floatatom 104 303 3 0 0 0 - - - 0;
+#X text 127 276 nonzero starts playback \, zero stops it;
+#X msg 51 215 start;
+#X msg 82 245 stop;
+#X text 96 215 start playback;
+#X text 121 245 stop playback;
+#X text 496 613 Updated for version 0.53-1;
+#X text 96 13 - soundfile playback from disk;
+#X text 528 564 see:;
+#X obj 571 564 file which;
+#X text 21 136 The 'wave' \, 'aiff' \, 'caf' \, and 'next' formats are parsed automatically \, although only uncompressed 2- or 3-byte integer ("pcm") and 4-byte floating point samples are accepted., f 93;
+#X text 287 177 Open takes: filename \, onset in samples \, header size to skip \, channels number \, bytes per sample and endianness., f 55;
+#X obj 3 602 cnv 1 695 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 21 56 The [readsf~] object reads a soundfile from the hard disk (that is \, it doesn't load it into the memory). You must always first use the "open" message (when it immediately starts reading from the file in advance) \, though playback only starts from the begining after you send a "1" or "start" message. A "0" or "stop" message stops it. Opening in advance a bit earlier was necessary to give the CPU some time back in the day where CPU power was a scarce resource., f 93;
+#X text 49 507 Note: [readsf~] can find files added to the search path via preferences as usual \, but it can't find files in folders added via a [declare] object! In this case it is recommended to use [file which] \, because it can search paths added via [declare] and return the absolute path to be used with the 'open' message., f 83;
+#X obj 82 433 env~;
+#X obj 290 433 env~;
+#X obj 82 384 readsf~ 2 1e+06, f 60;
+#X text 287 210 (By overriding the header above \, we force this mono file to be played as a stereo twice as fast), f 55;
+#X text 371 420 "bang" when file reaches the end., f 16;
+#X msg 24 185 open ../sound/bell.aiff 0 200 2 2 b;
+#X msg 145 305 open ../sound/bell.aiff 22050 \, 1;
+#X text 385 298 open at half a second into the file and start right away., f 30;
+#X connect 2 0 35 0;
+#X connect 8 0 0 0;
+#X connect 17 0 18 0;
+#X connect 18 0 35 0;
+#X connect 20 0 35 0;
+#X connect 21 0 35 0;
+#X connect 33 0 1 0;
+#X connect 34 0 14 0;
+#X connect 35 0 6 0;
+#X connect 35 0 33 0;
+#X connect 35 1 34 0;
+#X connect 35 1 6 1;
+#X connect 35 2 8 0;
+#X connect 38 0 35 0;
+#X connect 39 0 35 0;
From a50533101aaba02a86593524a0ac56896b15e5cc Mon Sep 17 00:00:00 2001
From: Antoine Rousseau <_antoine_@metalu.net>
Date: Wed, 21 Feb 2024 14:18:55 +0100
Subject: [PATCH 086/450] ask whether changes should be discarded when typing
into a modified abs
previously the dialog was opened when activating the object, at
mouse-up (like after moving it).
---
src/g_editor.c | 27 ++++++++++++++-------------
1 file changed, 14 insertions(+), 13 deletions(-)
diff --git a/src/g_editor.c b/src/g_editor.c
index 0145eb7a2..66637049e 100644
--- a/src/g_editor.c
+++ b/src/g_editor.c
@@ -2907,22 +2907,10 @@ void canvas_mouseup(t_canvas *x,
else if ((x->gl_editor->e_onmotion == MA_MOVE ||
x->gl_editor->e_onmotion == MA_RESIZE))
{
- /* if there's only one text item selected activate the text.
- LATER consider under sme conditions not activating it, for instance
- if it appears to have been desired only to move the object. Maybe
- shift-click could allow dragging without activating text? A
- different solution (only activating if the object wasn't moved
- (commit f0df4e586) turned out to flout ctrlD+move+retype. */
+ /* if there's only one text item selected activate the text. */
if (x->gl_editor->e_selection &&
!(x->gl_editor->e_selection->sel_next))
{
- t_gobj *g = x->gl_editor->e_selection->sel_what;
- t_glist *gl2;
- /* first though, check we aren't an abstraction with a
- dirty sub-patch that would be discarded if we edit this. */
- if (canvas_undo_confirmdiscard(g))
- return;
- /* OK, activate it */
gobj_activate(x->gl_editor->e_selection->sel_what, x, 1);
}
}
@@ -3087,6 +3075,19 @@ void canvas_key(t_canvas *x, t_symbol *s, int ac, t_atom *av)
|| !strcmp(gotkeysym->s_name, "Left")
|| !strcmp(gotkeysym->s_name, "Right")))
{
+ /* if the typed object (which is also the selected object in the canvas)
+ is an abstraction, and if its text has not been modified yet, then ask the
+ permission to discard any changes inside it. */
+ if (pd_class(&x->gl_editor->e_selection->sel_what->g_pd) == canvas_class
+ && !x->gl_editor->e_textdirty
+ /* only ask permission if the keystroke is really modifying the text */
+ && keynum
+ )
+ {
+ t_canvas *selected_canvas = x->gl_editor->e_selection->sel_what;
+ if(canvas_undo_confirmdiscard(selected_canvas))
+ return;
+ }
/* send the key to the box's editor */
if (!x->gl_editor->e_textdirty)
{
From fa788ea7dd31766cd6c1f20b38765cf6144c8055 Mon Sep 17 00:00:00 2001
From: Reza Almanda
Date: Sun, 3 Mar 2024 22:40:53 +0000
Subject: [PATCH 087/450] Translated using Weblate (Indonesian)
Currently translated at 39.3% (193 of 491 strings)
Translation: pure-data/Interface
Translate-URL: https://hosted.weblate.org/projects/pure-data/pure-data/id/
---
po/id.po | 29 ++++++++++++++---------------
1 file changed, 14 insertions(+), 15 deletions(-)
diff --git a/po/id.po b/po/id.po
index 960dbd5e7..c0654c7f6 100644
--- a/po/id.po
+++ b/po/id.po
@@ -7,7 +7,7 @@ msgstr ""
"Project-Id-Version: Pure Data 0.53.0\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
"POT-Creation-Date: 2023-11-07 16:37+0100\n"
-"PO-Revision-Date: 2023-10-23 01:02+0000\n"
+"PO-Revision-Date: 2024-03-04 23:01+0000\n"
"Last-Translator: Reza Almanda \n"
"Language-Team: Indonesian \n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 5.1\n"
+"X-Generator: Weblate 5.5-dev\n"
msgid "linear"
msgstr "linier"
@@ -456,7 +456,7 @@ msgid "Canvas"
msgstr "Kanvas"
msgid "Visible Rectangle (pix)"
-msgstr ""
+msgstr "Persegi Panjang Tampak (pix)"
#, tcl-format
msgid "%s Properties"
@@ -511,10 +511,10 @@ msgid "In Ports:"
msgstr "Port Masuk:"
msgid "Out Ports:"
-msgstr ""
+msgstr "Port Keluaran:"
msgid "MIDI system"
-msgstr ""
+msgstr "Sistem MIDI"
msgid "MIDI Settings"
msgstr "Pengaturan MIDI"
@@ -523,35 +523,34 @@ msgid "ALSA MIDI Settings"
msgstr "Pengaturan ALSA MIDI"
msgid "Pd search path for objects, help, audio, text and other files"
-msgstr ""
+msgstr "Jalur pencarian Pd untuk objek, bantuan, audio, teks, dan file lainnya"
msgid "Use standard paths"
-msgstr ""
+msgstr "Gunakan lokasi standar"
msgid "Verbose"
msgstr "Bertele-tele"
msgid "Pd Documents Directory"
-msgstr ""
+msgstr "Direktori Dokumen Pd"
msgid "Browse"
-msgstr ""
+msgstr "Jelajah"
msgid "Reset"
-msgstr ""
+msgstr "Setel ulang"
msgid "Disable"
-msgstr ""
+msgstr "Nonaktifkan"
msgid "Externals Install Directory"
-msgstr ""
+msgstr "Direktori Instalasi Eksternal"
msgid "Clear"
-msgstr ""
+msgstr "Bersihkan"
-#, fuzzy
msgid "path preferences"
-msgstr "Preferensi"
+msgstr "Lokasi preferensi"
msgid "Choose Pd documents directory:"
msgstr ""
From 3d38e060832f5e89e300a891341e70b23aefcecc Mon Sep 17 00:00:00 2001
From: porres
Date: Wed, 6 Mar 2024 21:52:26 -0300
Subject: [PATCH 088/450] add default value for 2nd arg in readsf~ and improve
things more
I improved the description after discussion with christoff and dan on the pd list
---
doc/5.reference/readsf~-help.pd | 110 ++++++++++++++++----------------
1 file changed, 55 insertions(+), 55 deletions(-)
diff --git a/doc/5.reference/readsf~-help.pd b/doc/5.reference/readsf~-help.pd
index 05df1a678..b790be32b 100644
--- a/doc/5.reference/readsf~-help.pd
+++ b/doc/5.reference/readsf~-help.pd
@@ -1,23 +1,22 @@
-#N canvas 339 45 705 651 12;
+#N canvas 352 23 705 663 12;
#X declare -stdpath ./;
-#X obj 499 448 print didit;
-#X floatatom 82 460 6 0 0 0 - - - 0;
-#X msg 150 342 print;
-#X obj 96 614 soundfiler;
-#X text 17 613 see also:;
+#X obj 499 477 print didit;
+#X floatatom 82 472 6 0 0 0 - - - 0;
+#X msg 150 354 print;
+#X obj 96 626 soundfiler;
+#X text 17 625 see also:;
#X obj 38 13 readsf~;
-#X obj 144 426 output~;
-#X obj 185 614 writesf~;
-#X obj 499 422 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X text 519 372 - number of channels \; - per channel buffer size in bytes, f 22;
-#X obj 549 262 declare -stdpath ./;
+#X obj 144 438 output~;
+#X obj 185 626 writesf~;
+#X obj 499 448 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 549 274 declare -stdpath ./;
#X obj 3 45 cnv 1 695 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 623 12 <= click;
-#N canvas 651 73 573 384 reference 0;
+#N canvas 651 73 576 400 reference 0;
#X obj 8 52 cnv 5 550 5 empty empty INLET: 8 18 0 13 #202020 #000000 0;
#X obj 8 208 cnv 2 550 2 empty empty OUTLETS: 8 12 0 13 #202020 #000000 0;
#X obj 8 309 cnv 2 550 2 empty empty ARGUMENTS: 8 12 0 13 #202020 #000000 0;
-#X obj 7 363 cnv 5 550 5 empty empty empty 8 18 0 13 #202020 #000000 0;
+#X obj 7 383 cnv 5 550 5 empty empty empty 8 18 0 13 #202020 #000000 0;
#X obj 7 273 cnv 1 550 1 empty empty rightmost: 8 12 0 13 #7c7c7c #000000 0;
#X obj 7 236 cnv 1 550 1 empty empty n: 8 12 0 13 #7c7c7c #000000 0;
#X obj 30 18 readsf~;
@@ -28,8 +27,7 @@
#X text 122 245 signal -;
#X text 187 245 channel output of a given file., f 46;
#X text 137 281 bang - when finishing playing file., f 54;
-#X text 107 317 1) float - sets number of output channels (default 1 \, max 64)., f 62;
-#X text 107 336 2) float - per channel buffer size in bytes., f 62;
+#X text 86 332 1) float - sets number of output channels (default 1 \, max 64)., f 62;
#X text 82 213 ('n' number of outlets specified by argument);
#X text 120 117 start -;
#X text 127 137 stop -;
@@ -37,46 +35,48 @@
#X text 88 19 - soundfile playback from disk.;
#X text 177 117 start playback., f 50;
#X text 177 68 sets a filename \, an onset in samples \, header size to skip \, number of channels \, bytes per sample \, and endianness. (needed before start playback.), f 50;
+#X text 86 351 2) float - per channel buffer size in bytes (default/min 262144)., f 65;
#X restore 529 13 pd reference;
-#X floatatom 290 460 6 0 0 0 - - - 0;
-#X text 514 354 Arguments:;
-#X text 195 341 print information on the Pd window;
-#X obj 104 276 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
-#X floatatom 104 303 3 0 0 0 - - - 0;
-#X text 127 276 nonzero starts playback \, zero stops it;
-#X msg 51 215 start;
-#X msg 82 245 stop;
-#X text 96 215 start playback;
-#X text 121 245 stop playback;
-#X text 496 613 Updated for version 0.53-1;
+#X floatatom 290 472 6 0 0 0 - - - 0;
+#X text 519 376 Arguments:, f 21;
+#X text 195 353 print information on the Pd window;
+#X obj 104 288 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
+#X floatatom 104 315 3 0 0 0 - - - 0;
+#X text 127 288 nonzero starts playback \, zero stops it;
+#X msg 51 227 start;
+#X msg 82 257 stop;
+#X text 96 227 start playback;
+#X text 121 257 stop playback;
+#X text 496 625 Updated for version 0.53-1;
#X text 96 13 - soundfile playback from disk;
-#X text 528 564 see:;
-#X obj 571 564 file which;
-#X text 21 136 The 'wave' \, 'aiff' \, 'caf' \, and 'next' formats are parsed automatically \, although only uncompressed 2- or 3-byte integer ("pcm") and 4-byte floating point samples are accepted., f 93;
-#X text 287 177 Open takes: filename \, onset in samples \, header size to skip \, channels number \, bytes per sample and endianness., f 55;
-#X obj 3 602 cnv 1 695 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X text 21 56 The [readsf~] object reads a soundfile from the hard disk (that is \, it doesn't load it into the memory). You must always first use the "open" message (when it immediately starts reading from the file in advance) \, though playback only starts from the begining after you send a "1" or "start" message. A "0" or "stop" message stops it. Opening in advance a bit earlier was necessary to give the CPU some time back in the day where CPU power was a scarce resource., f 93;
-#X text 49 507 Note: [readsf~] can find files added to the search path via preferences as usual \, but it can't find files in folders added via a [declare] object! In this case it is recommended to use [file which] \, because it can search paths added via [declare] and return the absolute path to be used with the 'open' message., f 83;
-#X obj 82 433 env~;
-#X obj 290 433 env~;
-#X obj 82 384 readsf~ 2 1e+06, f 60;
-#X text 287 210 (By overriding the header above \, we force this mono file to be played as a stereo twice as fast), f 55;
-#X text 371 420 "bang" when file reaches the end., f 16;
-#X msg 24 185 open ../sound/bell.aiff 0 200 2 2 b;
-#X msg 145 305 open ../sound/bell.aiff 22050 \, 1;
-#X text 385 298 open at half a second into the file and start right away., f 30;
-#X connect 2 0 35 0;
+#X text 528 576 see:;
+#X obj 571 576 file which;
+#X text 21 148 The 'wave' \, 'aiff' \, 'caf' \, and 'next' formats are parsed automatically \, although only uncompressed 2- or 3-byte integer ("pcm") and 4-byte floating point samples are accepted., f 93;
+#X text 287 189 Open takes: filename \, onset in samples \, header size to skip \, channels number \, bytes per sample and endianness., f 55;
+#X obj 3 614 cnv 1 695 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 49 519 Note: [readsf~] can find files added to the search path via preferences as usual \, but it can't find files in folders added via a [declare] object! In this case it is recommended to use [file which] \, because it can search paths added via [declare] and return the absolute path to be used with the 'open' message., f 83;
+#X obj 82 445 env~;
+#X obj 290 445 env~;
+#X text 287 222 (By overriding the header above \, we force this mono file to be played as a stereo twice as fast), f 55;
+#X text 372 441 "bang" when file reaches the end., f 16;
+#X msg 24 197 open ../sound/bell.aiff 0 200 2 2 b;
+#X msg 145 317 open ../sound/bell.aiff 22050 \, 1;
+#X text 385 310 open at half a second into the file and start right away., f 30;
+#X text 519 395 - number of channels - per channel buffer size in bytes, f 21;
+#X obj 82 396 readsf~ 2 262144, f 60;
+#X text 21 56 The [readsf~] object reads a soundfile from the hard disk. That is \, it doesn't fully load it into the memory \, but into a small local buffer first. The "open" message starts filling this buffer but a playback only starts when you send a "1" or "start" message. A "0" or "stop" message stops it. Waiting a bit before playing might be necessary if you hear an audio dropout on first accessing a file. You can also increase the default buffer size as the 2nd argument \, but it shouldn't really be necessary., f 93;
+#X connect 2 0 39 0;
#X connect 8 0 0 0;
-#X connect 17 0 18 0;
-#X connect 18 0 35 0;
-#X connect 20 0 35 0;
-#X connect 21 0 35 0;
-#X connect 33 0 1 0;
-#X connect 34 0 14 0;
-#X connect 35 0 6 0;
-#X connect 35 0 33 0;
-#X connect 35 1 34 0;
-#X connect 35 1 6 1;
-#X connect 35 2 8 0;
-#X connect 38 0 35 0;
-#X connect 39 0 35 0;
+#X connect 16 0 17 0;
+#X connect 17 0 39 0;
+#X connect 19 0 39 0;
+#X connect 20 0 39 0;
+#X connect 31 0 1 0;
+#X connect 32 0 13 0;
+#X connect 35 0 39 0;
+#X connect 36 0 39 0;
+#X connect 39 0 6 0;
+#X connect 39 0 31 0;
+#X connect 39 1 32 0;
+#X connect 39 1 6 1;
+#X connect 39 2 8 0;
From feecf16018f686494217e1e33324d9cf24b9e1ab Mon Sep 17 00:00:00 2001
From: porres
Date: Wed, 6 Mar 2024 22:14:29 -0300
Subject: [PATCH 089/450] improve description of [list] defaults to 'append'
based on discussion at https://github.com/pure-data/pure-data/issues/2204
---
doc/5.reference/list-help.pd | 129 ++++++++++++++--------------
doc/5.reference/text-object-help.pd | 82 +++++++++---------
2 files changed, 106 insertions(+), 105 deletions(-)
diff --git a/doc/5.reference/list-help.pd b/doc/5.reference/list-help.pd
index 0f97e29a3..820cf701f 100644
--- a/doc/5.reference/list-help.pd
+++ b/doc/5.reference/list-help.pd
@@ -1,6 +1,5 @@
-#N canvas 466 36 601 600 12;
+#N canvas 466 36 601 523 12;
#X obj 24 12 list;
-#X text 64 12 - building and using variable-length messages;
#N canvas 581 25 529 694 about-lists 0;
#X obj 95 661 print message;
#X msg 85 455 list x.wav 44100;
@@ -34,7 +33,7 @@
#X connect 11 0 13 0;
#X connect 12 0 13 0;
#X connect 21 0 2 0;
-#X restore 216 381 pd about-lists;
+#X restore 176 341 pd about-lists;
#X obj 28 90 list append;
#X obj 28 115 list prepend;
#X obj 28 189 list trim;
@@ -93,18 +92,18 @@
#X connect 15 0 14 0;
#X connect 16 0 3 0;
#X restore 472 189 pd trim;
-#N canvas 591 40 625 609 append 0;
-#X floatatom 111 240 5 0 0 0 - - - 0;
-#X msg 19 147 1 2 3;
-#X msg 53 178 list cis boom bah;
-#X msg 91 209 walk the dog;
-#X msg 209 364 list x y z;
-#X msg 191 338 go dog go;
-#X msg 222 391 4 5 6 and 7;
-#X text 266 337 same for right inlet...;
-#X listbox 106 522 35 0 0 0 - - - 0;
-#X obj 106 555 print append;
-#X text 516 39 <= click;
+#N canvas 591 40 624 619 append 0;
+#X floatatom 111 264 5 0 0 0 - - - 0;
+#X msg 19 171 1 2 3;
+#X msg 53 202 list cis boom bah;
+#X msg 91 233 walk the dog;
+#X msg 209 388 list x y z;
+#X msg 191 362 go dog go;
+#X msg 222 415 4 5 6 and 7;
+#X text 266 361 same for right inlet...;
+#X listbox 106 546 35 0 0 0 - - - 0;
+#X obj 106 579 print append;
+#X text 516 26 <= click;
#N canvas 707 200 583 323 reference 0;
#X obj 9 52 cnv 5 550 5 empty empty INLETS: 8 18 0 13 #202020 #000000 0;
#X obj 9 200 cnv 2 550 2 empty empty OUTLET: 8 12 0 13 #202020 #000000 0;
@@ -120,42 +119,43 @@
#X text 167 95 set messages to concatenate to a second list and output (a bang is a zero element list)., f 49;
#X text 87 153 anything -;
#X text 167 153 set messages to append to the first list (a bang is a zero element list and clears it)., f 49;
-#X restore 422 40 pd reference;
-#X obj 9 81 cnv 1 600 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X restore 422 27 pd reference;
+#X obj 9 105 cnv 1 600 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X obj 27 25 list append;
-#X obj 27 50 list;
-#X text 70 51 - short form for "list append".;
#X text 119 24 - append a second list to the first;
-#X text 192 208 a non-list message is converted to a list;
-#X obj 106 486 list append 1 2 3;
-#X text 156 240 a number is one-element list;
-#X text 45 91 Use [list append] to concatenate a second list (defined via arguments or the right inlet) to the first list via the left inlet., f 74;
-#X text 175 292 a "bang" is the same as a zero-element list \, so it outputs the list stored as an argument or via the right inlet;
-#X obj 245 453 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X text 267 446 as a zero-element list \, a bang clears the second list, f 30;
-#X text 239 486 <-- creation args initialize the list to append;
-#X obj 151 299 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X text 65 147 numeric list (a number as the first item makes this a list);
-#X symbolatom 130 269 10 0 0 0 - - - 0;
-#X text 207 267 a symbol is also a one-element list;
-#X symbolatom 234 420 10 0 0 0 - - - 0;
-#X text 184 178 list starting with symbol (needs explicit "list" selector);
-#X floatatom 166 421 5 0 0 0 - - - 0;
-#X text 315 419 one-element lists;
-#X connect 0 0 18 0;
-#X connect 1 0 18 0;
-#X connect 2 0 18 0;
-#X connect 3 0 18 0;
-#X connect 4 0 18 1;
-#X connect 5 0 18 1;
-#X connect 6 0 18 1;
+#X text 192 232 a non-list message is converted to a list;
+#X text 156 264 a number is one-element list;
+#X text 45 115 Use [list append] to concatenate a second list (defined via arguments or the right inlet) to the first list via the left inlet., f 74;
+#X text 175 316 a "bang" is the same as a zero-element list \, so it outputs the list stored as an argument or via the right inlet;
+#X obj 245 477 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X text 267 470 as a zero-element list \, a bang clears the second list, f 30;
+#X text 239 510 <-- creation args initialize the list to append;
+#X obj 151 323 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X text 65 171 numeric list (a number as the first item makes this a list);
+#X symbolatom 130 293 10 0 0 0 - - - 0;
+#X text 207 291 a symbol is also a one-element list;
+#X symbolatom 234 444 10 0 0 0 - - - 0;
+#X text 184 202 list starting with symbol (needs explicit "list" selector);
+#X floatatom 166 445 5 0 0 0 - - - 0;
+#X text 315 443 one-element lists;
+#X obj 28 56 list;
+#X text 65 57 -;
+#X text 80 57 defaults to [list append] \, in which case it can take lists that start with a number as arguments (symbols are expected to be a function)., f 69;
+#X obj 106 510 list append x y z;
+#X connect 0 0 33 0;
+#X connect 1 0 33 0;
+#X connect 2 0 33 0;
+#X connect 3 0 33 0;
+#X connect 4 0 33 1;
+#X connect 5 0 33 1;
+#X connect 6 0 33 1;
#X connect 8 0 9 0;
-#X connect 18 0 8 0;
-#X connect 22 0 18 1;
-#X connect 25 0 18 0;
-#X connect 27 0 18 0;
-#X connect 29 0 18 1;
-#X connect 31 0 18 1;
+#X connect 19 0 33 1;
+#X connect 22 0 33 0;
+#X connect 24 0 33 0;
+#X connect 26 0 33 1;
+#X connect 28 0 33 1;
+#X connect 33 0 8 0;
#X restore 471 90 pd append;
#N canvas 665 26 585 705 split 0;
#X msg 204 373 1 2 3;
@@ -307,7 +307,6 @@
#X connect 27 0 7 1;
#X connect 29 0 7 1;
#X restore 471 115 pd prepend;
-#X text 101 425 And here are some examples showing how to use these objects to compose and/or use variable length messages:, f 45;
#N canvas 650 69 554 651 example1 0;
#X text 57 102 send;
#X msg 108 124 250;
@@ -364,8 +363,8 @@
#X connect 30 0 19 0;
#X connect 31 0 9 0;
#X connect 32 0 16 0;
-#X restore 237 466 pd example1;
-#X text 325 466 simple sequencer;
+#X restore 309 384 pd example1;
+#X text 397 384 simple sequencer;
#N canvas 735 50 568 626 example2 0;
#X text 304 198 clear;
#X text 65 168 send;
@@ -419,8 +418,8 @@
#X connect 25 0 2 0;
#X connect 26 0 4 1;
#X connect 27 0 15 0;
-#X restore 237 492 pd example2;
-#X text 325 492 another sequencer;
+#X restore 309 410 pd example2;
+#X text 397 410 another sequencer;
#N canvas 553 155 494 341 example3 0;
#X obj 73 169 until;
#X msg 107 113 1 2 3 4 a b c;
@@ -449,9 +448,7 @@
#X connect 7 0 6 1;
#X connect 8 0 6 1;
#X connect 9 0 4 0;
-#X restore 237 519 pd example3;
-#X obj 28 297 list;
-#X text 65 298 - short for "list append";
+#X restore 309 434 pd example3;
#X text 157 217 - output number of items in list;
#N canvas 611 137 533 425 length 0;
#X msg 220 207 1 2 3;
@@ -640,8 +637,8 @@
#X connect 32 0 6 0;
#X connect 34 0 6 0;
#X restore 471 140 pd store;
-#X text 383 566 updated for Pd version 0.52;
-#X text 324 519 list iterator;
+#X text 393 488 updated for Pd version 0.52;
+#X text 396 434 list iterator;
#X obj 7 44 cnv 1 590 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 527 13 <= click;
#N canvas 749 68 563 222 reference 0;
@@ -655,16 +652,16 @@
#X text 160 86 sets the function of [list] \, possible values: append \, prepend \, store \, split \, trim \, length \, fromsymbol and tosymbol. The default value is 'append'., f 54;
#X restore 433 13 pd reference;
#X text 448 58 click for details:;
-#X obj 6 552 cnv 1 590 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X obj 6 474 cnv 1 590 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 157 245 -;
#X text 171 245 convert symbols to/from numeric characters, f 23;
-#X text 18 565 see also:;
-#X obj 96 565 array;
+#X text 18 487 see also:;
+#X obj 96 487 array;
#X text 29 58 The [list] object's first argument sets its function:;
-#X text 76 344 In general \, [list] will convert non-list messages (such as "set 5") to lists (such as "list set 5") automatically. Here's more about lists in Pd:, f 65;
-#X obj 182 565 float;
-#X obj 143 565 text;
-#X obj 230 565 symbol;
+#X text 76 304 In general \, [list] will convert non-list messages (such as "set 5") to lists (such as "list set 5") automatically. Here's more about lists in Pd:, f 67;
+#X obj 182 487 float;
+#X obj 143 487 text;
+#X obj 230 487 symbol;
#N canvas 592 78 607 430 from/to 0;
#X symbolatom 47 221 10 0 0 0 - - - 0;
#X obj 47 251 list fromsymbol;
@@ -714,3 +711,5 @@
#X connect 15 0 3 0;
#X restore 473 243 pd from/to symbol;
#X f 10;
+#X text 64 12 - building and managing variable-length messages;
+#X text 65 393 Some examples showing how to use these objects to compose and/or use variable length messages., f 32;
diff --git a/doc/5.reference/text-object-help.pd b/doc/5.reference/text-object-help.pd
index fc6710f24..eb596e4c5 100644
--- a/doc/5.reference/text-object-help.pd
+++ b/doc/5.reference/text-object-help.pd
@@ -1,5 +1,5 @@
#N struct text-struct float x float y text z;
-#N canvas 547 37 540 573 12;
+#N canvas 491 51 540 573 12;
#X obj 91 539 list;
#X obj 28 12 text;
#X text 14 539 see also:;
@@ -11,35 +11,35 @@
#X restore 131 539 array;
#X obj 241 206 text define;
#X text 68 158 The text object's first argument sets its function:, f 27;
-#N canvas 505 76 742 624 define 0;
-#X msg 42 122 clear;
-#X msg 60 148 read text-object-help.txt;
-#X msg 93 177 write text-object-help.txt;
-#X text 254 426 creation arguments:;
-#X text 396 426 optional -k flag to keep contents;
-#X text 398 443 optional name;
-#X text 247 146 read from a file;
-#X text 289 177 write to a file;
-#X text 91 121 clear;
-#X obj 128 249 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X obj 93 485 t b p;
-#X obj 93 537 text get -s text t;
-#X msg 93 512 0;
-#X obj 93 587 print;
-#X obj 93 562 list trim;
-#X obj 93 424 text define -k text-1;
+#N canvas 363 76 742 656 define 0;
+#X msg 42 152 clear;
+#X msg 60 178 read text-object-help.txt;
+#X msg 93 207 write text-object-help.txt;
+#X text 254 456 creation arguments:;
+#X text 396 456 optional -k flag to keep contents;
+#X text 398 473 optional name;
+#X text 247 176 read from a file;
+#X text 289 207 write to a file;
+#X text 91 151 clear;
+#X obj 128 279 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 93 515 t b p;
+#X obj 93 567 text get -s text t;
+#X msg 93 542 0;
+#X obj 93 617 print;
+#X obj 93 592 list trim;
+#X obj 93 454 text define -k text-1;
#A set this is a message \; this is another 1 ... \;;
-#X msg 108 217 write -c /tmp/test-cr.txt;
-#X obj 237 454 print notify-outlet;
-#X text 149 244 bang to output a pointer to a scalar (struct) containing the text - see first outlet below, f 45;
-#X text 244 479 Second outlet notifies you when text changes. As of Pd 0.48 this only outputs the message "updated" when text changes \, but this might be extended to offer more information in the future.;
-#X msg 161 353 click;
-#X msg 209 353 close;
-#X msg 142 288 send text-send;
-#X text 250 288 send pointer to a named receive object;
-#X obj 106 456 r text-send;
-#X msg 153 324 sort;
-#X text 200 322 sort the contents. details here:;
+#X msg 108 247 write -c /tmp/test-cr.txt;
+#X obj 237 484 print notify-outlet;
+#X text 149 274 bang to output a pointer to a scalar (struct) containing the text - see first outlet below, f 45;
+#X text 244 509 Second outlet notifies you when text changes. As of Pd 0.48 this only outputs the message "updated" when text changes \, but this might be extended to offer more information in the future.;
+#X msg 161 383 click;
+#X msg 209 383 close;
+#X msg 142 318 send text-send;
+#X text 250 318 send pointer to a named receive object;
+#X obj 106 486 r text-send;
+#X msg 153 354 sort;
+#X text 200 352 sort the contents. details here:;
#N canvas 719 128 502 255 sorting-text 0;
#X obj 101 197 text define text-sorting;
#X msg 133 160 sort;
@@ -47,8 +47,8 @@
#X text 47 25 Numbers come before symbols \, which are sorted alphabetically (details such as case sensitivity (does 'b' come before 'A'?) may depend on operating system). Shorter lines come before longer ones that match the entire shorter lines. As a special case empty lines come before anything else.;
#X connect 1 0 0 0;
#X connect 2 0 0 0;
-#X restore 443 323 pd sorting-text;
-#X text 636 17 <= click;
+#X restore 443 353 pd sorting-text;
+#X text 648 38 <= click;
#N canvas 758 177 578 421 reference 0;
#X obj 9 46 cnv 5 550 5 empty empty INLET: 8 18 0 13 #202020 #000000 0;
#X obj 9 207 cnv 2 550 2 empty empty OUTLETS: 8 12 0 13 #202020 #000000 0;
@@ -72,17 +72,19 @@
#X obj 9 301 cnv 2 550 2 empty empty ARGUMENTS: 8 12 0 13 #202020 #000000 0;
#X obj 9 327 cnv 1 550 1 empty empty flags: 8 12 0 13 #9f9f9f #000000 0;
#X obj 9 359 cnv 1 550 1 empty empty args: 8 12 0 13 #7c7c7c #000000 0;
-#X restore 533 18 pd reference;
-#X obj 10 51 cnv 1 725 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X restore 545 39 pd reference;
+#X obj 10 81 cnv 1 725 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X obj 33 18 text define;
#X text 131 18 - create \, store \, and/or edit texts;
-#X text 297 211 an optional -c flag allows you to read or write to/from a file interpreting carriage returns as separators., f 55;
-#X text 171 392 |;
-#X text 171 405 V;
-#X text 257 353 open (to see and edit text) and close text window;
-#X text 175 387 - click on the object to open and see/edit text;
-#X text 177 560 First outlet is pointer to a "text scalar" containing the text \, which is output when the object is sent a "bang". For example \, here's machinery for printing out the first message of the text., f 74;
-#X text 27 60 [text define] maintains a text object and can name it so that other objects can find it (and later should have some alternative \, anonymous way to be found). A text contains messages separated by commas and semicolons., f 98;
+#X text 297 241 an optional -c flag allows you to read or write to/from a file interpreting carriage returns as separators., f 55;
+#X text 171 422 |;
+#X text 171 435 V;
+#X text 257 383 open (to see and edit text) and close text window;
+#X text 175 417 - click on the object to open and see/edit text;
+#X text 177 590 First outlet is pointer to a "text scalar" containing the text \, which is output when the object is sent a "bang". For example \, here's machinery for printing out the first message of the text., f 74;
+#X text 27 90 [text define] maintains a text object and can name it so that other objects can find it (and later should have some alternative \, anonymous way to be found). A text contains messages separated by commas and semicolons., f 98;
+#X obj 33 47 text;
+#X text 129 47 - without arguments it defaults to [text define];
#X connect 0 0 15 0;
#X connect 1 0 15 0;
#X connect 2 0 15 0;
From 05abf69d981b22a6a7aae5269a9e9f4d93cc2651 Mon Sep 17 00:00:00 2001
From: porres
Date: Thu, 7 Mar 2024 00:55:09 -0300
Subject: [PATCH 090/450] taking more suggestions from christof in [readsf~]
I also added more information on the differences and relation between soundfiler and readsf~
---
doc/5.reference/readsf~-help.pd | 111 +++++++++++++++--------------
doc/5.reference/soundfiler-help.pd | 82 ++++++++++-----------
2 files changed, 97 insertions(+), 96 deletions(-)
diff --git a/doc/5.reference/readsf~-help.pd b/doc/5.reference/readsf~-help.pd
index b790be32b..ee6e89aa2 100644
--- a/doc/5.reference/readsf~-help.pd
+++ b/doc/5.reference/readsf~-help.pd
@@ -1,17 +1,17 @@
-#N canvas 352 23 705 663 12;
+#N canvas 399 25 704 696 12;
#X declare -stdpath ./;
-#X obj 499 477 print didit;
-#X floatatom 82 472 6 0 0 0 - - - 0;
-#X msg 150 354 print;
-#X obj 96 626 soundfiler;
-#X text 17 625 see also:;
-#X obj 38 13 readsf~;
-#X obj 144 438 output~;
-#X obj 185 626 writesf~;
-#X obj 499 448 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X obj 549 274 declare -stdpath ./;
-#X obj 3 45 cnv 1 695 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X text 623 12 <= click;
+#X obj 506 481 print didit;
+#X floatatom 89 476 6 0 0 0 - - - 0;
+#X msg 157 364 print;
+#X obj 96 669 soundfiler;
+#X text 17 668 see also:;
+#X obj 33 11 readsf~;
+#X obj 151 442 output~;
+#X obj 185 669 writesf~;
+#X obj 506 451 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 541 284 declare -stdpath ./;
+#X obj 3 41 cnv 1 695 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 623 10 <= click;
#N canvas 651 73 576 400 reference 0;
#X obj 8 52 cnv 5 550 5 empty empty INLET: 8 18 0 13 #202020 #000000 0;
#X obj 8 208 cnv 2 550 2 empty empty OUTLETS: 8 12 0 13 #202020 #000000 0;
@@ -36,47 +36,48 @@
#X text 177 117 start playback., f 50;
#X text 177 68 sets a filename \, an onset in samples \, header size to skip \, number of channels \, bytes per sample \, and endianness. (needed before start playback.), f 50;
#X text 86 351 2) float - per channel buffer size in bytes (default/min 262144)., f 65;
-#X restore 529 13 pd reference;
-#X floatatom 290 472 6 0 0 0 - - - 0;
-#X text 519 376 Arguments:, f 21;
-#X text 195 353 print information on the Pd window;
-#X obj 104 288 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
-#X floatatom 104 315 3 0 0 0 - - - 0;
-#X text 127 288 nonzero starts playback \, zero stops it;
-#X msg 51 227 start;
-#X msg 82 257 stop;
-#X text 96 227 start playback;
-#X text 121 257 stop playback;
-#X text 496 625 Updated for version 0.53-1;
-#X text 96 13 - soundfile playback from disk;
-#X text 528 576 see:;
-#X obj 571 576 file which;
-#X text 21 148 The 'wave' \, 'aiff' \, 'caf' \, and 'next' formats are parsed automatically \, although only uncompressed 2- or 3-byte integer ("pcm") and 4-byte floating point samples are accepted., f 93;
-#X text 287 189 Open takes: filename \, onset in samples \, header size to skip \, channels number \, bytes per sample and endianness., f 55;
-#X obj 3 614 cnv 1 695 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X text 49 519 Note: [readsf~] can find files added to the search path via preferences as usual \, but it can't find files in folders added via a [declare] object! In this case it is recommended to use [file which] \, because it can search paths added via [declare] and return the absolute path to be used with the 'open' message., f 83;
-#X obj 82 445 env~;
-#X obj 290 445 env~;
-#X text 287 222 (By overriding the header above \, we force this mono file to be played as a stereo twice as fast), f 55;
-#X text 372 441 "bang" when file reaches the end., f 16;
-#X msg 24 197 open ../sound/bell.aiff 0 200 2 2 b;
-#X msg 145 317 open ../sound/bell.aiff 22050 \, 1;
-#X text 385 310 open at half a second into the file and start right away., f 30;
-#X text 519 395 - number of channels - per channel buffer size in bytes, f 21;
-#X obj 82 396 readsf~ 2 262144, f 60;
-#X text 21 56 The [readsf~] object reads a soundfile from the hard disk. That is \, it doesn't fully load it into the memory \, but into a small local buffer first. The "open" message starts filling this buffer but a playback only starts when you send a "1" or "start" message. A "0" or "stop" message stops it. Waiting a bit before playing might be necessary if you hear an audio dropout on first accessing a file. You can also increase the default buffer size as the 2nd argument \, but it shouldn't really be necessary., f 93;
-#X connect 2 0 39 0;
+#X restore 529 11 pd reference;
+#X floatatom 297 476 6 0 0 0 - - - 0;
+#X text 526 384 Arguments:, f 20;
+#X text 203 358 print information on the Pd window, f 17;
+#X obj 111 298 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
+#X floatatom 111 325 3 0 0 0 - - - 0;
+#X text 134 298 nonzero starts playback \, zero stops it;
+#X msg 58 237 start;
+#X msg 89 267 stop;
+#X text 103 237 start playback;
+#X text 128 267 stop playback;
+#X text 496 668 Updated for version 0.53-1;
+#X text 91 11 - soundfile playback from disk;
+#X text 530 572 see:;
+#X obj 573 572 file which;
+#X text 294 199 Open takes: filename \, onset in samples \, header size to skip \, channels number \, bytes per sample and endianness., f 55;
+#X obj 3 657 cnv 1 695 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 69 518 Note: [readsf~] can find files added to the search path via preferences as usual \, but it can't find files in folders added via a [declare] object! In this case it is recommended to use [file which] \, because it can search paths added via [declare] and return the absolute path to be used with the 'open' message., f 83;
+#X obj 89 449 env~;
+#X obj 297 449 env~;
+#X text 294 232 (By overriding the header above \, we force this mono file to be played as a stereo twice as fast), f 55;
+#X text 379 444 "bang" when file reaches the end., f 16;
+#X msg 31 207 open ../sound/bell.aiff 0 200 2 2 b;
+#X msg 152 327 open ../sound/bell.aiff 22050 \, 1;
+#X text 526 402 - number of channels - per channel buffer size in bytes, f 20;
+#X obj 89 405 readsf~ 2 262144, f 60;
+#X text 72 602 Another Note: check also [soundfiler] \, which allows you to load a file into memory by filling it into an array. This also gives you more playback possibilities with table reading objects., f 83;
+#X text 21 158 The 'wave' \, 'aiff' \, 'caf' \, and 'next' formats are supported and parsed automatically \, although only uncompressed 2- or 3-byte integer ("pcm") and 4-byte floating point samples are accepted., f 94;
+#X text 21 51 The [readsf~] object streams a soundfile from the hard disk. That is \, it doesn't fully load it into the memory \, but into a small local buffer first. The "open" message starts filling this buffer but a playback only starts when you send a "1" or "start" message. A "0" or "stop" message stops it. You may get audio dropouts if you "start" right after the "open" message \, so you should wait a few milliseconds between "open" and "start" to ensure that the buffer is filled in time. You can also increase the default buffer size as the 2nd argument \, but it shouldn't really be necessary. The 1st argument initializes the number of channel outputs., f 94;
+#X text 392 320 open at half a second into the file and start right away. Since it's mono \, we only have the left output., f 39;
+#X connect 2 0 37 0;
#X connect 8 0 0 0;
#X connect 16 0 17 0;
-#X connect 17 0 39 0;
-#X connect 19 0 39 0;
-#X connect 20 0 39 0;
-#X connect 31 0 1 0;
-#X connect 32 0 13 0;
-#X connect 35 0 39 0;
-#X connect 36 0 39 0;
-#X connect 39 0 6 0;
-#X connect 39 0 31 0;
-#X connect 39 1 32 0;
-#X connect 39 1 6 1;
-#X connect 39 2 8 0;
+#X connect 17 0 37 0;
+#X connect 19 0 37 0;
+#X connect 20 0 37 0;
+#X connect 30 0 1 0;
+#X connect 31 0 13 0;
+#X connect 34 0 37 0;
+#X connect 35 0 37 0;
+#X connect 37 0 6 0;
+#X connect 37 0 30 0;
+#X connect 37 1 31 0;
+#X connect 37 1 6 1;
+#X connect 37 2 8 0;
diff --git a/doc/5.reference/soundfiler-help.pd b/doc/5.reference/soundfiler-help.pd
index 0b7a3d881..d833e6dbc 100644
--- a/doc/5.reference/soundfiler-help.pd
+++ b/doc/5.reference/soundfiler-help.pd
@@ -1,22 +1,22 @@
-#N canvas 183 50 1039 619 12;
+#N canvas 223 50 1039 619 12;
#N canvas 0 22 450 300 (subpatch) 0;
#X array sample 44100 float 2;
#X coords 0 1 44100 -1 250 100 1 0 0;
-#X restore 269 273 graph;
-#X obj 60 340 soundfiler;
-#X floatatom 60 369 7 0 0 0 - - - 12;
-#X obj 163 580 tabwrite~;
-#X obj 237 580 tabread4~;
-#X obj 310 580 tabplay~;
-#X obj 434 580 writesf~;
-#X obj 376 580 readsf~;
-#X text 38 579 See also:;
-#X text 256 176 read a file to zero or more arrays, f 35;
+#X restore 269 247 graph;
+#X obj 60 316 soundfiler;
+#X floatatom 60 345 7 0 0 0 - - - 12;
+#X obj 278 581 tabwrite~;
+#X obj 352 581 tabread4~;
+#X obj 425 581 tabplay~;
+#X obj 159 581 writesf~;
+#X obj 101 581 readsf~;
+#X text 28 580 See also:;
+#X text 256 152 read a file to zero or more arrays, f 35;
#X obj 40 15 soundfiler;
-#X text 806 579 updated for Pd version 0.51;
-#X obj 115 580 array;
-#X listbox 127 369 16 0 0 0 - - - 0;
-#X obj 6 51 cnv 1 1025 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 806 580 updated for Pd version 0.51;
+#X obj 230 581 array;
+#X listbox 127 345 16 0 0 0 - - - 0;
+#X obj 6 49 cnv 1 1025 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 916 14 <= click;
#N canvas 540 87 632 371 reference 0;
#X obj 8 52 cnv 5 610 5 empty empty INLET: 8 18 0 13 #202020 #000000 0;
@@ -37,11 +37,11 @@
#X text 157 254 sample rate \, header size \, number of channels \, bytes per sample & endianness ('b' or 'l')., f 51;
#X restore 822 15 pd reference;
#X text 120 14 - import/export soundfiles to/from arrays;
-#X msg 34 176 read ../sound/bell.aiff sample;
-#X msg 60 211 read -resize ../sound/bell.aiff sample;
-#X text 29 69 The [soundfiler] object loads files into arrays and also saves arrays into files. The soundfiles may contain uncompressed 2- or 3-byte integer ("pcm") or 4-byte floating point samples in wave \, aiff \, caf and next formats. Additionally \, [soundfiler] also deals with ascii text files., f 72;
-#X text 340 203 optionally resize array to fit the whole file, f 23;
-#X text 37 144 Basic read/write example:;
+#X msg 34 152 read ../sound/bell.aiff sample;
+#X msg 60 187 read -resize ../sound/bell.aiff sample;
+#X text 28 61 The [soundfiler] object loads files into arrays and also saves arrays into files. The soundfiles may contain uncompressed 2- or 3-byte integer ("pcm") or 4-byte floating point samples in wave \, aiff \, caf and next formats. Additionally \, [soundfiler] also deals with ascii text files., f 72;
+#X text 340 180 optionally resize array to fit the whole file, f 23;
+#X text 37 127 Basic read/write example:;
#N canvas 791 194 575 345 Dealing_with_"\$0" 0;
#X obj 273 171 array define \$0-x;
#X obj 153 202 f \$0;
@@ -56,12 +56,10 @@
#X connect 2 0 3 0;
#X connect 4 0 2 0;
#X connect 5 0 1 0;
-#X restore 788 376 pd Dealing_with_"\$0";
-#X text 678 353 open subpatch to see how to deal with '\$0', f 28;
-#X text 29 501 The 'write' message takes a filename to save to and one or more arrays (one for each channel)., f 72;
-#X text 29 422 The 'read' message takes a file to load and one or more arrays to load into (in the case the file has more than one channel). The number of channels of the soundfile need not match the number of arrays given to read (extras channels are dropped and unsupplied channels are zeroed out in the extra arrays)., f 72;
-#X text 577 243 Note that if no array name is given to read to \, no samples are read but you get the number of samples in the file on the left outlet and the info on the right outlet anyway., f 62;
-#X text 577 300 Also note that the number of channels is limited to 64 for both reading and writting., f 62;
+#X restore 788 378 pd Dealing_with_"\$0";
+#X text 678 355 open subpatch to see how to deal with '\$0', f 28;
+#X text 577 247 Note that if no array name is given to read to \, no samples are read but you get the number of samples in the file on the left outlet and the info on the right outlet anyway., f 62;
+#X text 577 304 Also note that the number of channels is limited to 64 for both reading and writting., f 62;
#N canvas 85 86 1235 552 read-write-flags 0;
#X text 27 83 -resize (resizes arrays to the size of the sound file), f 62;
#N canvas 0 22 450 300 (subpatch) 0;
@@ -144,24 +142,26 @@
#X connect 33 0 3 0;
#X connect 35 0 3 0;
#X connect 36 0 3 0;
-#X restore 756 497 pd read-write-flags & more examples;
+#X restore 779 505 pd read-write-flags & more examples;
#X f 19;
#X text 577 149 When loading a file \, the left outlet sends the number of samples the file contains if the array is equal or greater in size. If you're loading a file into an array that is smaller \, the number or samples is clipped to the array size and you probably want to use the -resize flag to resize the array size to the file size., f 62;
-#X text 577 413 Both 'read' and 'write' messages also take optional flags for configuration. In the basic example to the left we have the '-resize' flag in the read message that resizes the array to the file size. See more about flags and advanced examples in the subpatch below., f 62;
-#X obj 6 562 cnv 1 1025 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X obj 503 580 openpanel;
-#X obj 576 580 savepanel;
-#X text 577 69 At loading or writting a file \, the left outlet outputs the number of samples and the right outlet sends information as a list \, namely: Sample Rate \, Header Size \, Number of Channels \, Bytes per Sample & Endianness ("b" for "big" or "l" for "little")., f 62;
-#X text 126 389 info ;
-#X text 44 389 # samples;
-#X obj 84 280 savepanel;
-#X obj 84 248 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
-#X msg 84 308 write \$1 sample;
-#X text 112 249 write to a file;
+#X text 577 425 Both 'read' and 'write' messages also take optional flags for configuration. In the basic example to the left we have the '-resize' flag in the read message that resizes the array to the file size. See more about flags and advanced examples in the subpatch below., f 62;
+#X obj 6 563 cnv 1 1025 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X obj 493 581 openpanel;
+#X obj 566 581 savepanel;
+#X text 577 66 At loading or writting a file \, the left outlet outputs the number of samples and the right outlet sends information as a list \, namely: Sample Rate \, Header Size \, Number of Channels \, Bytes per Sample & Endianness ("b" for "big" or "l" for "little")., f 62;
+#X text 44 365 # samples;
+#X obj 84 256 savepanel;
+#X obj 84 224 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
+#X msg 84 284 write \$1 sample;
+#X text 112 225 write to a file;
+#X text 29 489 Note: Loading a soundfile into an array might be useful for more flexible playing strategies with table reading objects in the 'see section' below. For a simpler alternative that streams a soundfile directly from your hard drive \, see [readsf~]., f 72;
+#X text 29 396 The 'read' message takes a file to load and one or more arrays to load into (in the case the file has more than one channel). The number of channels of the soundfile need not match the number of arrays given to read (extras channels are dropped and unsupplied channels are zeroed out in the extra arrays). The 'write' message takes a filename to save to and one or more arrays (one for each channel)., f 72;
+#X text 124 365 info: sample rate \, header size \, channels \, bytes \, endianness;
#X connect 1 0 2 0;
#X connect 1 1 13 0;
#X connect 18 0 1 0;
#X connect 19 0 1 0;
-#X connect 38 0 40 0;
-#X connect 39 0 38 0;
-#X connect 40 0 1 0;
+#X connect 35 0 37 0;
+#X connect 36 0 35 0;
+#X connect 37 0 1 0;
From b08a30cf5a736bd77eb596f77799b241ac051070 Mon Sep 17 00:00:00 2001
From: Christof Ressi
Date: Thu, 7 Mar 2024 20:12:43 +0100
Subject: [PATCH 091/450] fix implicit pointer cast
---
src/g_editor.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/g_editor.c b/src/g_editor.c
index 66637049e..847e12f17 100644
--- a/src/g_editor.c
+++ b/src/g_editor.c
@@ -3084,7 +3084,7 @@ void canvas_key(t_canvas *x, t_symbol *s, int ac, t_atom *av)
&& keynum
)
{
- t_canvas *selected_canvas = x->gl_editor->e_selection->sel_what;
+ t_gobj *selected_canvas = x->gl_editor->e_selection->sel_what;
if(canvas_undo_confirmdiscard(selected_canvas))
return;
}
From 5ed5b598fb6c7b49a3cf13f85fd87f588d574905 Mon Sep 17 00:00:00 2001
From: Christof Ressi
Date: Thu, 7 Mar 2024 21:04:37 +0100
Subject: [PATCH 092/450] fix range change check for -maxsize argument in
soundfiler_read()
---
src/d_soundfile.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/src/d_soundfile.c b/src/d_soundfile.c
index ac8615439..72ffdcdd7 100644
--- a/src/d_soundfile.c
+++ b/src/d_soundfile.c
@@ -1185,12 +1185,11 @@ static void soundfiler_read(t_soundfiler *x, t_symbol *s,
}
else if (!strcmp(flag, "maxsize"))
{
- ssize_t tmp;
if (argc < 2 || argv[1].a_type != A_FLOAT ||
- ((tmp = (argv[1].a_w.w_float > SFMAXFRAMES ?
- SFMAXFRAMES : argv[1].a_w.w_float)) < 0))
+ argv[1].a_w.w_float < 0)
goto usage;
- maxsize = (size_t)tmp;
+ maxsize = (double)argv[1].a_w.w_float > (double)SFMAXFRAMES ?
+ SFMAXFRAMES : (size_t)argv[1].a_w.w_float;
resize = 1; /* maxsize implies resize */
argc -= 2; argv += 2;
}
From 8992d68843e91558ba1c514f8ac0fea775cac415 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Mon, 11 Mar 2024 16:52:41 +0100
Subject: [PATCH 093/450] remove dormant code for tclentry
people wishing to use the tclprompt, should just
install the "tclprompt-plugin"
---
tcl/pdwindow.tcl | 75 ------------------------------------------------
1 file changed, 75 deletions(-)
diff --git a/tcl/pdwindow.tcl b/tcl/pdwindow.tcl
index da2c4cede..e1c72d6ad 100644
--- a/tcl/pdwindow.tcl
+++ b/tcl/pdwindow.tcl
@@ -7,8 +7,6 @@ namespace eval ::pdwindow:: {
variable maxlogbuffer 21000 ;# if the logbuffer grows beyond this number, cut it
variable keeplogbuffer 1000 ;# if the logbuffer gets automatically cut, keep this many elements
variable logbuffer {}
- variable tclentry {}
- variable tclentry_history {"console show"}
variable history_position 0
variable linecolor 0 ;# is toggled to alternate text line colors
variable logmenuitems
@@ -291,73 +289,6 @@ proc ::pdwindow::pdwindow_bindings {} {
}
}
-#--Tcl entry procs-------------------------------------------------------------#
-
-proc ::pdwindow::eval_tclentry {} {
- variable tclentry
- variable tclentry_history
- variable history_position 0
- if {$tclentry eq ""} {return} ;# no need to do anything if empty
- if {[catch {uplevel #0 $tclentry} errorname]} {
- global errorInfo
- switch -regexp -- $errorname {
- "missing close-brace" {
- ::pdwindow::error [concat [_ "(Tcl) MISSING CLOSE-BRACE '\}': "] $errorInfo]\n
- } "missing close-bracket" {
- ::pdwindow::error [concat [_ "(Tcl) MISSING CLOSE-BRACKET '\]': "] $errorInfo]\n
- } "^invalid command name" {
- ::pdwindow::error [concat [_ "(Tcl) INVALID COMMAND NAME: "] $errorInfo]\n
- } default {
- ::pdwindow::error [concat [_ "(Tcl) UNHANDLED ERROR: "] $errorInfo]\n
- }
- }
- }
- lappend tclentry_history $tclentry
- set tclentry {}
-}
-
-proc ::pdwindow::get_history {direction} {
- variable tclentry_history
- variable history_position
-
- incr history_position $direction
- if {$history_position < 0} {set history_position 0}
- if {$history_position > [llength $tclentry_history]} {
- set history_position [llength $tclentry_history]
- }
- .pdwindow.tcl.entry delete 0 end
- .pdwindow.tcl.entry insert 0 \
- [lindex $tclentry_history end-[expr $history_position - 1]]
-}
-
-proc ::pdwindow::validate_tcl {} {
- variable tclentry
- if {[info complete $tclentry]} {
- .pdwindow.tcl.entry configure -background "white"
- } else {
- .pdwindow.tcl.entry configure -background "#FFF0F0"
- }
-}
-
-#--create tcl entry-----------------------------------------------------------#
-
-proc ::pdwindow::create_tcl_entry {} {
-# Tcl entry box frame
- label .pdwindow.tcl.label -text [_ "Tcl:"] -anchor e
- pack .pdwindow.tcl.label -side left
- entry .pdwindow.tcl.entry -width 200 \
- -exportselection 1 -insertwidth 2 -insertbackground blue \
- -textvariable ::pdwindow::tclentry -font TkTextFont
- pack .pdwindow.tcl.entry -side left -fill x
-# bindings for the Tcl entry widget
- bind .pdwindow.tcl.entry <$::modifier-Key-a> "%W selection range 0 end; break"
- bind .pdwindow.tcl.entry "::pdwindow::eval_tclentry"
- bind .pdwindow.tcl.entry "::pdwindow::get_history 1"
- bind .pdwindow.tcl.entry "::pdwindow::get_history -1"
- bind .pdwindow.tcl.entry +"::pdwindow::validate_tcl"
-
- bind .pdwindow.text "focus .pdwindow.tcl.entry; break"
-}
proc ::pdwindow::set_findinstance_cursor {widget key state} {
set triggerkeys [list Control_L Control_R Meta_L Meta_R]
@@ -468,8 +399,6 @@ proc ::pdwindow::create_window {} {
# TODO figure out how to make the menu traversable with the keyboard
#.pdwindow.header.logmenu configure -takefocus 1
pack .pdwindow.header.logmenu -side left
- frame .pdwindow.tcl -borderwidth 0
- pack .pdwindow.tcl -side bottom -fill x
text .pdwindow.text -relief raised -bd 2 -font [list $::font_family $::pdwindow::font_size] \
-highlightthickness 0 -borderwidth 1 -relief flat \
-yscrollcommand ".pdwindow.scroll set" -width 80 \
@@ -479,7 +408,6 @@ proc ::pdwindow::create_window {} {
pack .pdwindow.text -side right -fill both -expand 1
raise .pdwindow
focus .pdwindow.text
- # run bindings last so that .pdwindow.tcl.entry exists
pdwindow_bindings
# set cursor to show when clicking in 'findinstance' mode
bind .pdwindow "+::pdwindow::set_findinstance_cursor %W %K %s"
@@ -507,9 +435,6 @@ proc ::pdwindow::create_window {} {
#--configure the window menu---------------------------------------------------#
proc ::pdwindow::create_window_finalize {} {
- # wait until .pdwindow.tcl.entry is visible before opening files so that
- # the loading logic can grab it and put up the busy cursor
-
# this ought to be called after all elements of the window (including the
# menubar!) have been created!
if {![winfo viewable .pdwindow.text]} { tkwait visibility .pdwindow.text }
From d736e1fc1c41beaaa666036524c7196c758a0d71 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Mon, 11 Mar 2024 13:21:46 +0100
Subject: [PATCH 094/450] I/O errors: use background color of container to make
error invisible
rather than assuming that the container is "lightgray"
---
tcl/pdwindow.tcl | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/tcl/pdwindow.tcl b/tcl/pdwindow.tcl
index e1c72d6ad..79fe34679 100644
--- a/tcl/pdwindow.tcl
+++ b/tcl/pdwindow.tcl
@@ -238,10 +238,11 @@ proc ::pdwindow::pdtk_pd_dsp {value} {
}
proc ::pdwindow::pdtk_pd_dio {red} {
+ set dio .pdwindow.header.ioframe.dio
if {$red == 1} {
- .pdwindow.header.ioframe.dio configure -foreground red
+ $dio configure -foreground red
} else {
- .pdwindow.header.ioframe.dio configure -foreground lightgray
+ $dio configure -foreground [[winfo parent $dio] cget -background]
}
}
From 355cc97fb6079b3ed25d73c21847c510d8b4e3b5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Mon, 11 Mar 2024 18:29:12 +0100
Subject: [PATCH 095/450] use namespaced variable for enabled
"cords_to_foreground"
---
tcl/pdtk_canvas.tcl | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/tcl/pdtk_canvas.tcl b/tcl/pdtk_canvas.tcl
index 587308b4e..8962438a7 100644
--- a/tcl/pdtk_canvas.tcl
+++ b/tcl/pdtk_canvas.tcl
@@ -10,6 +10,8 @@ namespace eval ::pdtk_canvas:: {
variable untitled_name "PDUNTITLED"
variable untitled_len 10
+ variable enable_cords_to_foreground 0
+
namespace export pdtk_canvas_popup
namespace export pdtk_canvas_editmode
namespace export pdtk_canvas_getscroll
@@ -489,11 +491,8 @@ proc ::pdtk_canvas::cleanname {name} {
return $name
}
-set enable_cords_to_foreground false
-
proc ::pdtk_canvas::cords_to_foreground {mytoplevel {state 1}} {
- global enable_cords_to_foreground
- if {$enable_cords_to_foreground eq "true"} {
+ if {$::pdtk_canvas::enable_cords_to_foreground} {
set col black
if { $state == 0 } {
set col lightgrey
From f989819791076e7acd9aab8acc53afb15189a9af Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Mon, 11 Mar 2024 18:29:27 +0100
Subject: [PATCH 096/450] add "cords_to_foreground" to preferences
---
tcl/dialog_preferences.tcl | 23 +++++++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/tcl/dialog_preferences.tcl b/tcl/dialog_preferences.tcl
index 521e90e8a..cdee9438f 100644
--- a/tcl/dialog_preferences.tcl
+++ b/tcl/dialog_preferences.tcl
@@ -8,7 +8,7 @@ namespace eval ::dialog_preferences:: {
}
set ::dialog_preferences::use_ttknotebook {}
-after idle ::dialog_preferences::read_usettknotebook
+after idle ::dialog_preferences::read
# allow updating the audio resp MIDI frame if the backend changes
set ::dialog_preferences::audio_frame {}
set ::dialog_preferences::midi_frame {}
@@ -22,6 +22,7 @@ proc ::dialog_preferences::cancel {mytoplevel} {
proc ::dialog_preferences::do_apply {mytoplevel} {
::pd_guiprefs::write "gui_language" $::pd_i18n::language
::pd_guiprefs::write "use_ttknotebook" $::dialog_preferences::use_ttknotebook
+ ::pd_guiprefs::write "cords_to_foreground" $::pdtk_canvas::enable_cords_to_foreground
pdsend "pd zoom-open $::sys_zoom_open"
}
proc ::dialog_preferences::apply {mytoplevel} {
@@ -30,7 +31,14 @@ proc ::dialog_preferences::apply {mytoplevel} {
proc ::dialog_preferences::ok {mytoplevel} {
::preferencewindow::ok $mytoplevel
}
-
+proc ::dialog_preferences::read {} {
+ set x [::pd_guiprefs::read cords_to_foreground]
+ if {[catch { if { $x } { set x 1 } else { set x 0 } }]} {
+ set x 0
+ }
+ set ::pdtk_canvas::enable_cords_to_foreground $x
+ ::dialog_preferences::read_usettknotebook
+}
proc ::dialog_preferences::read_usettknotebook {} {
set ::dialog_preferences::use_ttknotebook [::pd_guiprefs::read use_ttknotebook]
}
@@ -56,7 +64,7 @@ proc ::dialog_preferences::fill_frame {prefs} {
labelframe $prefs.guiframe.prefsnavi -padx 5 -pady 5 -borderwidth 0 \
-text [_ "preference layout (reopen the preferences to see the effect)" ]
- pack $prefs.guiframe.prefsnavi -side left -anchor w -expand 1
+ pack $prefs.guiframe.prefsnavi -side top -anchor w -expand 1
radiobutton $prefs.guiframe.prefsnavi.tab \
-text [_ "use tabs" ] \
-value 1 -variable ::dialog_preferences::use_ttknotebook
@@ -65,7 +73,14 @@ proc ::dialog_preferences::fill_frame {prefs} {
-value 0 -variable ::dialog_preferences::use_ttknotebook
pack $prefs.guiframe.prefsnavi.tab -side left -anchor w
pack $prefs.guiframe.prefsnavi.scroll -side left -anchor w
- }
+
+ labelframe $prefs.guiframe.patching -padx 5 -pady 5 -borderwidth 0 \
+ -text [_ "patching helpers" ]
+ pack $prefs.guiframe.patching -side top -anchor w -expand 1
+ checkbutton $prefs.guiframe.patching.highlight_connections -text [_ "Highlight active cord while connecting"] \
+ -variable ::pdtk_canvas::enable_cords_to_foreground -anchor w
+ pack $prefs.guiframe.patching.highlight_connections -side left -anchor w
+}
proc ::dialog_preferences::create_dialog {{mytoplevel .gui_preferences}} {
destroy $mytoplevel
From d4f59ff85087b05bf8d1bb4e92359f1f5a084834 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Mon, 11 Mar 2024 22:06:52 +0100
Subject: [PATCH 097/450] use named loglevels
---
src/g_editor.c | 10 +++++-----
src/m_class.c | 2 +-
src/m_obj.c | 4 +---
src/s_print.c | 4 ++--
4 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/src/g_editor.c b/src/g_editor.c
index 847e12f17..3a2281611 100644
--- a/src/g_editor.c
+++ b/src/g_editor.c
@@ -4380,26 +4380,26 @@ void canvas_connect(t_canvas *x, t_floatarg fwhoout, t_floatarg foutno,
for (src = x->gl_list; whoout; src = src->g_next, whoout--)
if (!src->g_next) {
src = NULL;
- logpost(sink, 3, "cannot connect non-existing object");
+ logpost(sink, PD_DEBUG, "cannot connect non-existing object");
goto bad; /* bug fix thanks to Hannes */
}
for (sink = x->gl_list; whoin; sink = sink->g_next, whoin--)
if (!sink->g_next) {
sink = NULL;
- logpost(src, 3, "cannot connect to non-existing object");
+ logpost(src, PD_DEBUG, "cannot connect to non-existing object");
goto bad;
}
/* check they're both patchable objects */
if (!(objsrc = pd_checkobject(&src->g_pd)) ||
!(objsink = pd_checkobject(&sink->g_pd))) {
- logpost(src?src:sink, 3, "cannot connect unpatchable object");
+ logpost(src?src:sink, PD_DEBUG, "cannot connect unpatchable object");
goto bad;
}
/* check if objects are already connected */
if (canvas_isconnected(x, objsrc, outno, objsink, inno)) {
- logpost(src, 3, "io pair already connected");
+ logpost(src, PD_DEBUG, "io pair already connected");
goto bad;
}
@@ -4503,7 +4503,7 @@ static void canvas_tidy(t_canvas *x)
bestdist = i;
}
}
- logpost(NULL, 3, "tidy: best vertical distance %d", bestdist);
+ logpost(NULL, PD_DEBUG, "tidy: best vertical distance %d", bestdist);
for (y = x->gl_list; y; y = y->g_next)
if (all || glist_isselected(x, y))
{
diff --git a/src/m_class.c b/src/m_class.c
index 53b86dd5b..3f3290884 100644
--- a/src/m_class.c
+++ b/src/m_class.c
@@ -1237,7 +1237,7 @@ t_class *
logpost(0, loglevel, "refusing to load %dbit-float object '%s' into %dbit-float Pd", ext_floatsize, s->s_name, PD_FLOATSIZE);
loglevel=3;
} else
- logpost(0, 3, "refusing to load unnamed %dbit-float object into %dbit-float Pd", ext_floatsize, PD_FLOATSIZE);
+ logpost(0, PD_DEBUG, "refusing to load unnamed %dbit-float object into %dbit-float Pd", ext_floatsize, PD_FLOATSIZE);
return 0;
}
diff --git a/src/m_obj.c b/src/m_obj.c
index d3259da06..85651469d 100644
--- a/src/m_obj.c
+++ b/src/m_obj.c
@@ -413,7 +413,7 @@ static void backtracer_printmsg(t_pd *who, t_symbol *s,
if (argc > nprint && nchar < 100)
sprintf(msgbuf + nchar, "...");
else memcpy(msgbuf+100, "...", 4); /* in case we didn't finish */
- logpost(who, 2, "%s", msgbuf);
+ logpost(who, PD_NORMAL, "%s", msgbuf);
}
static void backtracer_anything(t_backtracer *x, t_symbol *s,
@@ -1011,5 +1011,3 @@ void obj_init(void)
class_addanything(backtracer_class, backtracer_anything);
}
-
-
diff --git a/src/s_print.c b/src/s_print.c
index 8f4cd4c37..9ad4f079a 100644
--- a/src/s_print.c
+++ b/src/s_print.c
@@ -98,7 +98,7 @@ static void doerror(const void *object, const char *s)
}
else
pdgui_vmess("::pdwindow::logpost", "ois",
- object, 1, s);
+ object, PD_ERROR, s);
}
static void dologpost(const void *object, const int level, const char *s)
@@ -285,7 +285,7 @@ void pd_error(const void *object, const char *fmt, ...)
if (object && !saidit)
{
if (sys_havegui())
- logpost(NULL, 4,
+ logpost(NULL, PD_VERBOSE,
"... you might be able to track this down from the Find menu.");
saidit = 1;
}
From cdefcfe7083448d982a62721d9f9d2a4e8917f07 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Mon, 11 Mar 2024 22:17:57 +0100
Subject: [PATCH 098/450] allow "find last error" for "couldn't create" issues
Closes: https://github.com/pure-data/pure-data/issues/2209
---
src/g_text.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/g_text.c b/src/g_text.c
index 07aa52292..bb66bdb05 100644
--- a/src/g_text.c
+++ b/src/g_text.c
@@ -116,7 +116,7 @@ static void canvas_error_couldntcreate(void*x, t_binbuf*b, const char*errmsg)
buf = resizebytes(buf, bufsize, bufsize+1);
buf[bufsize] = 0;
logpost(x, PD_CRITICAL, "%s", buf);
- logpost(x, PD_ERROR, "%s", errmsg);
+ pd_error(x, "%s", errmsg);
freebytes(buf, bufsize);
}
From fb3631e1fdad39cab577c5ca74b19d12f8b905b2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Mon, 11 Mar 2024 22:18:29 +0100
Subject: [PATCH 099/450] make sure that 0-objects don't stop on the toes of
"find last error"
---
src/s_print.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/s_print.c b/src/s_print.c
index 9ad4f079a..f3973f162 100644
--- a/src/s_print.c
+++ b/src/s_print.c
@@ -278,7 +278,8 @@ void pd_error(const void *object, const char *fmt, ...)
doerror(object, buf);
- error_object = object;
+ if(object)
+ error_object = object;
strncpy(error_string, buf, 256);
error_string[255] = 0;
From 1f97af34c2afa4a8aadc095b9cc0159da581d098 Mon Sep 17 00:00:00 2001
From: porres
Date: Tue, 12 Mar 2024 21:15:49 -0300
Subject: [PATCH 100/450] cosmetic changes, add color to array's background
Conform arrays to the color theme of the help files with a light gray background.
closes https://github.com/pure-data/pddp/issues/179
---
doc/2.control.examples/16.more.arrays.pd | 57 ++--
doc/2.control.examples/22.random-walk.pd | 2 +-
doc/4.data.structures/16.FFT-plot.pd | 39 +--
doc/4.data.structures/17.partialtracer.pd | 13 +-
doc/5.reference/array-object-help.pd | 83 +++---
doc/5.reference/binops-help.pd | 126 ++++----
doc/5.reference/binops-other-help.pd | 2 +-
doc/5.reference/binops-tilde-help.pd | 2 +-
doc/5.reference/canvas-help.pd | 22 +-
doc/5.reference/change-help.pd | 2 +-
doc/5.reference/clip~-help.pd | 31 +-
doc/5.reference/clone-abs-b.pd | 2 +-
doc/5.reference/cnv-help.pd | 10 +-
doc/5.reference/delay-help.pd | 21 +-
doc/5.reference/expr-help.pd | 188 ++++++------
doc/5.reference/fft~-help.pd | 2 +-
doc/5.reference/gui-boxes-help.pd | 4 +-
doc/5.reference/nbx-help.pd | 2 +-
doc/5.reference/osc-format-parse-help.pd | 2 +-
doc/5.reference/osc~-help.pd | 25 +-
doc/5.reference/pack-help.pd | 38 +--
doc/5.reference/pdcontrol-help.pd | 14 +-
doc/5.reference/phasor~-help.pd | 29 +-
doc/5.reference/pipe-help.pd | 34 +--
doc/5.reference/realtime-help.pd | 2 +-
doc/5.reference/send-receive-help.pd | 23 +-
doc/5.reference/set-help.pd | 4 +-
doc/5.reference/setsize-help.pd | 2 +-
doc/5.reference/slop~-help.pd | 336 +++++++++++-----------
doc/5.reference/soundfiler-help.pd | 105 +++----
doc/5.reference/stripnote-help.pd | 51 ++--
doc/5.reference/tabosc4~-help.pd | 13 +-
doc/5.reference/tabplay~-help.pd | 105 +++----
doc/5.reference/tabread-help.pd | 20 +-
doc/5.reference/tabread4-help.pd | 20 +-
doc/5.reference/tabread4~-help.pd | 94 +++---
doc/5.reference/tabread~-help.pd | 61 ++--
doc/5.reference/tabsend-receive~-help.pd | 156 +++++-----
doc/5.reference/tabwrite-help.pd | 15 +-
doc/5.reference/tabwrite~-help.pd | 59 ++--
doc/5.reference/text-object-help.pd | 2 +-
doc/5.reference/timer-help.pd | 74 ++---
doc/5.reference/unpack-help.pd | 2 +-
doc/5.reference/vcf~-help.pd | 2 +-
doc/5.reference/writesf~-help.pd | 2 +-
extra/hilbert~-help.pd | 33 +--
extra/loop~/loop~-help.pd | 55 ++--
extra/lrshift~/lrshift~-help.pd | 68 ++---
extra/output~-help.pd | 6 +-
extra/pique/pique-help.pd | 40 +--
extra/sigmund~/sigmund~-help.pd | 33 +--
51 files changed, 1086 insertions(+), 1047 deletions(-)
diff --git a/doc/2.control.examples/16.more.arrays.pd b/doc/2.control.examples/16.more.arrays.pd
index 635ce4bcd..586615863 100644
--- a/doc/2.control.examples/16.more.arrays.pd
+++ b/doc/2.control.examples/16.more.arrays.pd
@@ -1,28 +1,19 @@
-#N canvas 273 23 887 699 12;
-#N canvas 0 50 450 250 (subpatch) 0;
-#X array array97 5 float 1;
-#A 0 0.486666 0.126666 0.566675 -0.5 0.5;
-#X array array98 7 float 1;
-#A 0 -1 1 -1 1 -1 1 -1;
-#X coords 0 1 6 -1 300 150 1 0 0;
-#X restore 531 40 graph;
+#N canvas 273 23 887 709 12;
#X text 105 13 MORE ON ARRAYS;
-#X obj 614 369 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X msg 614 396 \; array98 vis \$1;
+#X obj 614 373 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X msg 614 400 \; array98 vis \$1;
#X msg 518 653 \; array98 style \$1;
#X msg 506 484 \; array98 width \$1;
#X floatatom 506 456 5 1 10 0 - - - 0;
#X floatatom 708 485 5 0 0 0 - - - 0;
#X msg 708 511 \; array98 color \$1;
#X msg 675 455 9;
-#X msg 708 455 90;
#X msg 742 455 900;
#X text 36 138 set array values from index 0;
#X text 309 129 sets two values from index 3, f 17;
#X text 30 39 Arrays have methods to set their values explicitly. Below you can set their "bounds" rectangles \, rename them (but if you have two with the same name this won't necessarily do what you want) and add markings. To set values by message \, send a list whose first element gives the index to start at. Indices count up from zero., f 66;
#X msg 28 166 \; array98 0 -1 1 -1 1 -1 1 -1;
-#X text 488 316 For last \, there are methods to change the visual appearance of arrays:, f 51;
-#X text 486 370 show/hide arrays:;
+#X text 486 374 show/hide arrays:;
#X text 546 455 set line width;
#X text 751 483 set color;
#X floatatom 518 629 5 0 0 0 - - - 0;
@@ -35,7 +26,7 @@
#X msg 222 394 \; array97 yticks 0 0.1 5;
#X msg 30 478 \; array97 xlabel -1.1 0 1 2 3 4 5 6;
#X msg 281 478 \; array97 ylabel -0.1 -1 0 1;
-#X msg 736 395 \; array97 vis \$1;
+#X msg 736 399 \; array97 vis \$1;
#N canvas 162 212 568 393 locality 0;
#N canvas 0 22 450 278 (subpatch) 0;
#X array \$0-array 10 float 3;
@@ -60,27 +51,37 @@
#X text 716 572 allow editing with mouse, f 13;
#X text 722 608 prevent mouse interaction, f 14;
#X msg 683 645 \; array97 edit \$1 \; array98 edit \$1;
-#X text 487 209 You can put more than one array in a single "graph" (which is Pd's name for the bounding rectangle \, and is a synonym for "canvas".) Arrays' sizes need not match the bounds of the containing graph. But if you resize an array \, and if it is the only array contained in a graph \, then the graph automatically resets its bounds to match., f 51;
+#X text 487 209 You can put more than one array in a single "graph" (which is Pd's name for the bounding rectangle \, and is a synonym for "canvas".) Arrays' sizes need not match the bounds of the containing graph. But if you resize an array \, and if it is the only array contained in a graph \, then the graph automatically resets its bounds to match., f 52;
#X text 25 526 You can also change the x and y range and size in the "properties" dialog. Note that information about size and ranges is saved \, but ticks and labels are lost between Pd sessions. The contents of the array may be saved as part of the patch or discarded. This is set in the 'properties" dialog as well., f 62;
#X text 27 207 renaming an array;
#X text 26 276 setting the bounds rectangle;
-#X text 30 441 adding labels: give a y value and a bunch of x values or vice versa, f 37;
+#X text 103 439 adding labels: give a y value and a bunch of x values or vice versa, f 37;
#X text 25 342 adding x and y labels: give a point to put a tick \, the interval between ticks \, and the number of ticks overall per large tick;
#X text 44 670 updated for version 0.52;
-#X obj 736 369 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X obj 736 373 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
#X obj 518 563 vradio 19 1 0 3 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0;
#X text 542 563 Point (0);
#X text 542 582 Polygon (1);
#X text 542 602 Bezier (2);
#X text 512 533 set display style:;
-#X connect 2 0 3 0;
-#X connect 6 0 5 0;
-#X connect 7 0 8 0;
-#X connect 9 0 7 0;
-#X connect 10 0 7 0;
-#X connect 11 0 7 0;
-#X connect 20 0 4 0;
-#X connect 33 0 37 0;
-#X connect 34 0 37 0;
-#X connect 45 0 30 0;
-#X connect 46 0 20 0;
+#X obj 532 41 cnv 19 298 148 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 250 (subpatch) 0;
+#X array array97 5 float 1;
+#A 0 0.486666 0.126666 0.566675 -0.5 0.5;
+#X array array98 7 float 1;
+#A 0 -1 1 -1 1 -1 1 -1;
+#X coords 0 1 6 -1 300 150 1 0 0;
+#X restore 531 40 graph;
+#X text 487 314 For last \, there are methods to change the visual appearance of arrays (and you can use a canvas [cnv] to set background color as in this example):, f 52;
+#X msg 708 455 444;
+#X connect 1 0 2 0;
+#X connect 5 0 4 0;
+#X connect 6 0 7 0;
+#X connect 8 0 6 0;
+#X connect 9 0 6 0;
+#X connect 17 0 3 0;
+#X connect 30 0 34 0;
+#X connect 31 0 34 0;
+#X connect 42 0 27 0;
+#X connect 43 0 17 0;
+#X connect 51 0 6 0;
diff --git a/doc/2.control.examples/22.random-walk.pd b/doc/2.control.examples/22.random-walk.pd
index cc0228c0f..7c86db51f 100644
--- a/doc/2.control.examples/22.random-walk.pd
+++ b/doc/2.control.examples/22.random-walk.pd
@@ -1,4 +1,4 @@
-#N canvas 748 41 536 598 12;
+#N canvas 510 45 535 586 12;
#X floatatom 140 248 5 0 0 0 - - - 0;
#X obj 167 125 f;
#X obj 140 198 random 4;
diff --git a/doc/4.data.structures/16.FFT-plot.pd b/doc/4.data.structures/16.FFT-plot.pd
index 4155024c5..b7e805156 100644
--- a/doc/4.data.structures/16.FFT-plot.pd
+++ b/doc/4.data.structures/16.FFT-plot.pd
@@ -45,10 +45,6 @@
#X obj 43 143 openpanel;
#X obj 43 90 bng 22 250 50 0 empty empty 1st 31 11 0 20 #dfdfdf #000000 #000000;
#N canvas 136 53 860 453 sample 0;
-#N canvas 0 50 450 300 (subpatch) 0;
-#X array \$0-sample 62079 float 2;
-#X coords 0 1 62079 -1 453 90 1 0 0;
-#X restore 350 68 graph;
#X obj 119 121 r resize-sample;
#X obj 119 156 t f b;
#X obj 151 187 samplerate~;
@@ -123,21 +119,26 @@
#X obj 360 309 delay 1000;
#X msg 378 251 \; npeaks 25;
#X obj 360 372 send pd-16.FFT-plot.pd;
-#X connect 1 0 2 0;
-#X connect 2 0 5 0;
-#X connect 2 1 3 0;
-#X connect 3 0 4 0;
-#X connect 4 0 5 1;
-#X connect 5 0 14 0;
-#X connect 6 0 11 0;
-#X connect 8 0 11 1;
-#X connect 9 0 7 0;
-#X connect 10 0 12 0;
-#X connect 14 0 13 0;
-#X connect 15 0 20 0;
-#X connect 15 0 19 0;
-#X connect 18 0 21 0;
-#X connect 19 0 18 0;
+#X obj 351 69 cnv 19 451 88 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 300 (subpatch) 0;
+#X array \$0-sample 62079 float 2;
+#X coords 0 1 62079 -1 453 90 1 0 0;
+#X restore 350 68 graph;
+#X connect 0 0 1 0;
+#X connect 1 0 4 0;
+#X connect 1 1 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 4 1;
+#X connect 4 0 13 0;
+#X connect 5 0 10 0;
+#X connect 7 0 10 1;
+#X connect 8 0 6 0;
+#X connect 9 0 11 0;
+#X connect 13 0 12 0;
+#X connect 14 0 19 0;
+#X connect 14 0 18 0;
+#X connect 17 0 20 0;
+#X connect 18 0 17 0;
#X coords 0 -1 1 1 453 108 2 350 50;
#X restore 43 193 pd sample;
#N canvas 395 221 458 221 peaks-template 0;
diff --git a/doc/4.data.structures/17.partialtracer.pd b/doc/4.data.structures/17.partialtracer.pd
index c78e52ba0..c98773991 100644
--- a/doc/4.data.structures/17.partialtracer.pd
+++ b/doc/4.data.structures/17.partialtracer.pd
@@ -1,4 +1,4 @@
-#N canvas 561 24 736 636 12;
+#N canvas 368 23 736 636 12;
#X declare -stdpath ./;
#N canvas 86 373 1216 368 trace-list 1;
#X coords 0 92 1 91.75 0 0 0;
@@ -90,10 +90,6 @@
#X restore 216 66 pd synthesis;
#X obj 26 176 s sample-size;
#X obj 351 69 cnv 19 451 88 empty empty empty 20 12 0 12 #ffffff #404040 0;
-#N canvas 0 50 450 300 (subpatch) 0;
-#X array \$0-sample 62079 float 2;
-#X coords 0 1 62079 -1 453 90 1 0 0;
-#X restore 350 68 graph;
#N canvas 179 166 287 327 resize-sample 0;
#X obj 83 41 r resize-sample;
#X obj 115 101 samplerate~;
@@ -112,6 +108,11 @@
#X connect 4 1 1 0;
#X connect 6 0 5 0;
#X restore 40 108 pd resize-sample;
+#X obj 351 69 cnv 19 451 88 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 300 (subpatch) 0;
+#X array \$0-sample 155944 float 2;
+#X coords 0 1 155944 -1 453 90 1 0 0;
+#X restore 350 68 graph;
#X connect 0 0 7 0;
#X connect 1 0 2 1;
#X connect 2 0 9 0;
@@ -119,7 +120,7 @@
#X connect 5 0 3 0;
#X connect 6 0 8 0;
#X connect 7 0 2 0;
-#X connect 12 0 2 0;
+#X connect 11 0 2 0;
#X coords 0 -1 1 1 453 108 2 350 50;
#X restore 22 176 pd sample;
#X msg 186 151 voice2.wav;
diff --git a/doc/5.reference/array-object-help.pd b/doc/5.reference/array-object-help.pd
index 6565eede7..7464b05be 100644
--- a/doc/5.reference/array-object-help.pd
+++ b/doc/5.reference/array-object-help.pd
@@ -398,11 +398,6 @@
#X text 105 268 onset (first index \, zero for start of array);
#X text 74 394 index;
#X text 148 13 - outputs the specified quantile;
-#N canvas 0 22 450 300 (subpatch) 0;
-#X array array-5 100 float 1;
-#A 0 7.04317e-07 1.23423e-06 2.13847e-06 3.66343e-06 6.20514e-06 1.03918e-05 1.72073e-05 2.81715e-05 4.56021e-05 7.2986e-05 0.000115497 0.00018071 0.000279558 0.0004276 0.00064667 0.000966955 0.00142958 0.00208972 0.00302027 0.00431601 0.00609813 0.008519 0.0117668 0.0160697 0.0216988 0.0289696 0.0382407 0.04991 0.0644062 0.0821762 0.103668 0.129306 0.159467 0.194447 0.234429 0.279447 0.329356 0.383804 0.442213 0.50377 0.567428 0.631928 0.695829 0.757559 0.81547 0.867916 0.913326 0.950281 0.977589 0.99435 1 0.99435 0.977589 0.950281 0.913326 0.867916 0.81547 0.757559 0.69583 0.631928 0.567428 0.50377 0.442213 0.383804 0.329356 0.279447 0.234429 0.194447 0.159467 0.129306 0.103668 0.0821763 0.0644063 0.0499101 0.0382407 0.0289696 0.0216988 0.0160698 0.0117669 0.00851902 0.00609814 0.00431601 0.00302027 0.00208972 0.00142958 0.000966957 0.000646672 0.0004276 0.000279558 0.00018071 0.000115497 7.29861e-05 4.56022e-05 2.81715e-05 1.72073e-05 1.03918e-05 6.20514e-06 3.66344e-06 2.13848e-06 1.23423e-06;
-#X coords 0 1 99 0 220 100 1 0 0;
-#X restore 440 201 graph;
#X text 148 38 - array as weighted probabilities;
#X text 433 474 set seed \, see -->;
#N canvas 741 135 468 474 seed 0;
@@ -445,11 +440,6 @@
#X obj 116 242 array quantile array-5;
#X floatatom 116 276 5 0 100 0 - - - 0;
#X floatatom 79 351 5 0 100 0 - - - 0;
-#N canvas 0 50 450 250 (subpatch) 0;
-#X array array-6 100 float 1;
-#A 0 0 0 0 0 0 0 0 0 0 0 0 0.00715053 0.00715053 0.0285789 0.0500072 0.0714356 0.100007 0.128578 0.164292 0.207148 0.478574 0.628573 0.678572 0.721429 0.717857 0.714286 0.707143 0.7 0.692857 0.685715 0.678572 0.18572 0.164292 0.157149 0.0142931 -0.00713521 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.014293 0.0214357 0.0357213 0.078578 0.142863 0.207148 0.335718 0.407146 0.435717 0.478574 0.514288 0.557144 0.592858 0.642858 0.7 0.692857 0.692857 0.692857 0.692857 0.7 0.696429 0.349997 0.335712 0.321426 0.278569 0.192856 0.149999 0.135714 0.114285 0.0999998 0.0714298 0.0642871 0.0571443 0.0285732 0 0 0 0 0;
-#X coords 0 1 99 0 200 140 1 0 0;
-#X restore 304 160 graph;
#X obj 79 317 array quantile array-6;
#X obj 772 163 array define histo 128;
#X obj 607 320 tabwrite histo;
@@ -466,25 +456,37 @@
#X text 832 126 clear;
#X text 552 39 The example below creates a histogram from a MIDI note input \, or use the number box to feed it. Then we use [array random] to output weighted random values according to the histogram., f 61;
#X text 807 225 weighted random;
+#X obj 305 161 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 250 (subpatch) 0;
+#X array array-6 100 float 1;
+#A 0 0 0 0 0 0 0 0 0 0 0 0 0.00715053 0.00715053 0.0285789 0.0500072 0.0714356 0.100007 0.128578 0.164292 0.207148 0.478574 0.628573 0.678572 0.721429 0.717857 0.714286 0.707143 0.7 0.692857 0.685715 0.678572 0.18572 0.164292 0.157149 0.0142931 0.00714284 0.00714284 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.014293 0.0214357 0.0357213 0.078578 0.142863 0.207148 0.335718 0.407146 0.435717 0.478574 0.514288 0.557144 0.592858 0.642858 0.7 0.692857 0.692857 0.692857 0.692857 0.7 0.696429 0.349997 0.335712 0.321426 0.278569 0.192856 0.149999 0.135714 0.114285 0.0999998 0.0714298 0.0642871 0.0571443 0.0285732 0 0 0 0 0;
+#X coords 0 1 99 0 200 140 1 0 0;
+#X restore 304 160 graph;
#X connect 1 0 3 0;
#X connect 2 0 1 0;
#X connect 3 0 4 0;
-#X connect 3 0 8 0;
+#X connect 3 0 7 0;
#X connect 4 0 5 0;
-#X connect 8 0 6 0;
-#X connect 11 0 12 0;
+#X connect 7 0 6 0;
+#X connect 10 0 11 0;
+#X connect 11 0 9 0;
#X connect 12 0 10 0;
-#X connect 13 0 11 0;
-#X connect 13 1 10 1;
-#X connect 14 0 9 0;
-#X connect 15 0 13 0;
-#X connect 16 0 15 0;
-#X connect 16 1 15 1;
-#X connect 17 0 13 0;
+#X connect 12 1 9 1;
+#X connect 13 0 8 0;
+#X connect 14 0 12 0;
+#X connect 15 0 14 0;
+#X connect 15 1 14 1;
+#X connect 16 0 12 0;
+#X connect 18 0 17 0;
#X connect 19 0 18 0;
-#X connect 20 0 19 0;
#X restore 133 626 pd examples;
#X obj 36 205 hsl 162 19 0 1 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1;
+#X obj 441 202 cnv 19 218 98 empty empty empty 20 12 0 12 #dfdfdf #404040 0;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array array-5 100 float 1;
+#A 0 7.04317e-07 1.23423e-06 2.13847e-06 3.66343e-06 6.20514e-06 1.03918e-05 1.72073e-05 2.81715e-05 4.56021e-05 7.2986e-05 0.000115497 0.00018071 0.000279558 0.0004276 0.00064667 0.000966955 0.00142958 0.00208972 0.00302027 0.00431601 0.00609813 0.008519 0.0117668 0.0160697 0.0216988 0.0289696 0.0382407 0.04991 0.0644062 0.0821762 0.103668 0.129306 0.159467 0.194447 0.234429 0.279447 0.329356 0.383804 0.442213 0.50377 0.567428 0.631928 0.695829 0.757559 0.81547 0.867916 0.913326 0.950281 0.977589 0.99435 1 0.99435 0.977589 0.950281 0.913326 0.867916 0.81547 0.757559 0.69583 0.631928 0.567428 0.50377 0.442213 0.383804 0.329356 0.279447 0.234429 0.194447 0.159467 0.129306 0.103668 0.0821763 0.0644063 0.0499101 0.0382407 0.0289696 0.0216988 0.0160698 0.0117669 0.00851902 0.00609814 0.00431601 0.00302027 0.00208972 0.00142958 0.000966957 0.000646672 0.0004276 0.000279558 0.00018071 0.000115497 7.29861e-05 4.56022e-05 2.81715e-05 1.72073e-05 1.03918e-05 6.20514e-06 3.66344e-06 2.13848e-06 1.23423e-06;
+#X coords 0 1 99 0 220 100 1 0 0;
+#X restore 440 201 graph;
#X connect 0 0 1 1;
#X connect 1 0 3 0;
#X connect 2 0 1 2;
@@ -494,17 +496,12 @@
#X connect 8 0 5 1;
#X connect 16 0 1 3;
#X connect 18 0 5 2;
-#X connect 34 0 5 0;
-#X connect 36 0 1 0;
-#X connect 42 0 36 0;
+#X connect 33 0 5 0;
+#X connect 35 0 1 0;
+#X connect 41 0 35 0;
#X restore 421 327 pd quantile+random;
#X obj 37 361 array max;
#N canvas 579 106 649 580 min+max 0;
-#N canvas 0 50 450 250 (subpatch) 0;
-#X array array-7 100 float 1;
-#A 0 0.335714 0.37857 0.421427 0.442855 0.478569 0.521426 0.535711 0.55714 0.585711 0.599997 0.614282 0.63571 0.649996 0.664282 0.671424 0.699995 0.699995 0.714281 0.721424 0.707138 0.699995 0.692853 0.68571 0.671424 0.649996 0.628568 0.599997 0.571425 0.514283 0.471426 0.414284 0.385713 0.357142 0.328571 0.3 0.285714 0.271429 0.25 0.228572 0.214286 0.207143 0.200001 0.185715 0.17143 0.164287 0.157144 0.150001 0.135716 0.128573 0.12143 0.12143 0.114287 0.114287 0.114287 0.114287 0.114287 0.12143 0.125001 0.128573 0.128573 0.135716 0.139287 0.142858 0.150001 0.157144 0.157144 0.164287 0.17143 0.200001 0.214286 0.228572 0.235715 0.242857 0.257143 0.271429 0.285714 0.307142 0.321428 0.335714 0.357142 0.371427 0.385713 0.399999 0.407141 0.414284 0.421427 0.42857 0.435713 0.442855 0.457141 0.460712 0.464284 0.471426 0.478569 0.485712 0.499998 0.50714 0.514283 0.521426 0.528569;
-#X coords 0 1 99 0 200 140 1 0 0;
-#X restore 356 402 graph;
#X floatatom 61 322 7 0 100 0 - - - 0;
#X obj 61 153 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X floatatom 83 184 5 0 0 0 - - - 0;
@@ -565,17 +562,23 @@
#X text 161 218 number of points (-1 for the end of the array);
#X obj 61 277 array max array-7;
#X obj 99 501 array min array-7;
-#X connect 2 0 32 0;
-#X connect 3 0 32 0;
-#X connect 4 0 32 1;
-#X connect 6 0 32 2;
-#X connect 10 0 33 0;
-#X connect 11 0 33 0;
-#X connect 12 0 33 1;
-#X connect 32 0 1 0;
-#X connect 32 1 8 0;
-#X connect 33 0 9 0;
-#X connect 33 1 14 0;
+#X obj 357 403 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 250 (subpatch) 0;
+#X array array-7 100 float 1;
+#A 0 0.335714 0.37857 0.421427 0.442855 0.478569 0.521426 0.535711 0.55714 0.585711 0.599997 0.614282 0.63571 0.649996 0.664282 0.671424 0.699995 0.699995 0.714281 0.721424 0.707138 0.699995 0.692853 0.68571 0.671424 0.649996 0.628568 0.599997 0.571425 0.514283 0.471426 0.414284 0.385713 0.357142 0.328571 0.3 0.285714 0.271429 0.25 0.228572 0.214286 0.207143 0.200001 0.185715 0.17143 0.164287 0.157144 0.150001 0.135716 0.128573 0.12143 0.12143 0.114287 0.114287 0.114287 0.114287 0.114287 0.12143 0.125001 0.128573 0.128573 0.135716 0.139287 0.142858 0.150001 0.157144 0.157144 0.164287 0.17143 0.200001 0.214286 0.228572 0.235715 0.242857 0.257143 0.271429 0.285714 0.307142 0.321428 0.335714 0.357142 0.371427 0.385713 0.399999 0.407141 0.414284 0.421427 0.42857 0.435713 0.442855 0.457141 0.460712 0.464284 0.471426 0.478569 0.485712 0.499998 0.50714 0.514283 0.521426 0.528569;
+#X coords 0 1 99 0 200 140 1 0 0;
+#X restore 356 402 graph;
+#X connect 1 0 31 0;
+#X connect 2 0 31 0;
+#X connect 3 0 31 1;
+#X connect 5 0 31 2;
+#X connect 9 0 32 0;
+#X connect 10 0 32 0;
+#X connect 11 0 32 1;
+#X connect 31 0 0 0;
+#X connect 31 1 7 0;
+#X connect 32 0 8 0;
+#X connect 32 1 13 0;
#X restore 421 372 pd min+max;
#X obj 37 384 array min;
#X obj 177 496 list;
diff --git a/doc/5.reference/binops-help.pd b/doc/5.reference/binops-help.pd
index 286e8df91..ac4f8f725 100644
--- a/doc/5.reference/binops-help.pd
+++ b/doc/5.reference/binops-help.pd
@@ -1,40 +1,40 @@
-#N canvas 324 52 827 415 12;
-#X obj 23 17 +;
-#X text 16 338 see also:;
-#X obj 94 341 +~;
-#X obj 556 253 min 20;
-#X obj 52 17 -;
-#X obj 82 17 *;
-#X obj 112 17 /;
-#X obj 147 17 max;
-#X obj 178 17 min;
-#X obj 322 343 >;
-#X floatatom 131 286 5 0 0 0 - - - 0;
-#X floatatom 174 286 8 0 0 0 - - - 0;
-#X floatatom 291 286 5 0 0 0 - - - 0;
-#X floatatom 344 166 5 0 0 0 - - - 0;
-#X obj 344 193 t b f;
-#X text 100 165 set left and right inputs here;
-#X floatatom 247 286 5 0 0 0 - - - 0;
-#X obj 47 253 +;
-#X obj 89 253 -;
-#X obj 131 253 *;
-#X obj 174 253 /;
-#X obj 247 253 max;
-#X obj 291 253 min;
-#X floatatom 47 166 5 0 0 0 - - - 0;
-#X obj 603 344 expr;
-#X obj 263 375 sin;
-#X obj 502 253 + 3;
-#X obj 622 253 * 3;
-#X floatatom 89 286 5 0 0 0 - - - 0;
-#X floatatom 47 286 5 0 0 0 - - - 0;
-#X floatatom 556 286 5 0 0 0 - - - 0;
-#X floatatom 502 286 5 0 0 0 - - - 0;
-#X floatatom 622 286 5 0 0 0 - - - 0;
-#X floatatom 556 221 5 0 0 0 - - - 0;
-#X floatatom 622 221 5 0 0 0 - - - 0;
-#X floatatom 502 221 5 0 0 0 - - - 0;
+#N canvas 316 78 809 391 12;
+#X obj 14 13 +;
+#X text 7 329 see also:;
+#X obj 85 332 +~;
+#X obj 547 249 min 20;
+#X obj 43 13 -;
+#X obj 73 13 *;
+#X obj 103 13 /;
+#X obj 138 13 max;
+#X obj 169 13 min;
+#X obj 313 334 >;
+#X floatatom 122 282 5 0 0 0 - - - 0;
+#X floatatom 165 282 8 0 0 0 - - - 0;
+#X floatatom 282 282 5 0 0 0 - - - 0;
+#X floatatom 335 162 5 0 0 0 - - - 0;
+#X obj 335 189 t b f;
+#X text 91 161 set left and right inputs here;
+#X floatatom 238 282 5 0 0 0 - - - 0;
+#X obj 38 249 +;
+#X obj 80 249 -;
+#X obj 122 249 *;
+#X obj 165 249 /;
+#X obj 238 249 max;
+#X obj 282 249 min;
+#X floatatom 38 162 5 0 0 0 - - - 0;
+#X obj 594 335 expr;
+#X obj 256 360 sin;
+#X obj 493 249 + 3;
+#X obj 613 249 * 3;
+#X floatatom 80 282 5 0 0 0 - - - 0;
+#X floatatom 38 282 5 0 0 0 - - - 0;
+#X floatatom 547 282 5 0 0 0 - - - 0;
+#X floatatom 493 282 5 0 0 0 - - - 0;
+#X floatatom 613 282 5 0 0 0 - - - 0;
+#X floatatom 547 217 5 0 0 0 - - - 0;
+#X floatatom 613 217 5 0 0 0 - - - 0;
+#X floatatom 493 217 5 0 0 0 - - - 0;
#N canvas 706 96 563 496 reference 0;
#X obj 8 242 cnv 5 550 5 empty empty INLETS: 8 18 0 13 #202020 #000000 0;
#X obj 8 277 cnv 1 550 1 empty empty 1st: 8 12 0 13 #9f9f9f #000000 0;
@@ -65,32 +65,32 @@
#X text 103 424 1) float -;
#X text 182 424 initialize value of right inlet (default 'e' for [log] \, 0 otherwise)., f 44;
#X text 22 14 Control rate binary (two-input) operators:;
-#X restore 693 13 pd reference;
-#X text 626 13 click =>;
-#X obj 13 48 cnv 1 800 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X obj 213 17 log;
-#X obj 244 17 pow;
-#X floatatom 414 286 8 0 0 0 - - - 0;
-#X floatatom 344 286 8 0 0 0 - - - 0;
-#X obj 344 253 log;
-#X obj 414 253 pow;
-#X obj 13 326 cnv 1 800 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X floatatom 677 286 8 0 0 0 - - - 0;
-#X floatatom 747 286 8 0 0 0 - - - 0;
-#X obj 677 253 log 2;
-#X obj 747 253 pow 3;
-#X floatatom 677 221 5 0 0 0 - - - 0;
-#X floatatom 747 221 5 0 0 0 - - - 0;
-#X text 18 58 These binary operators perform the 4 arithmetic functions ([+] \, etc) \, output the minimum or maximum of two numbers ([min] \, [max]) and perform logarithms ([log]) and power function ([pow]). All of these objects take a bang message to evaluate the operation with the previously set values and an argument to set the right input value., f 58;
-#X text 486 185 Initializing right input with an argument:;
-#X obj 25 375 abs;
-#X text 598 377 updated for Pd version 0.54;
-#X text 277 17 - control binary operators;
-#X text 130 341 (etc.) - signal versions;
-#X text 54 376 (etc.) - unary operators;
-#X text 359 343 (etc.) - other binary operators;
-#X text 293 376 (etc.) - trigonometric functions;
-#X text 457 59 As in the signal versions \; - [log] takes a base value via an argument or the right inlet but defaults to "e". A 0 or negative left input gives -1000 as the result \; - [pow] has protection against NaNs (they become 0) \, and it raises a number on the left inlet to a numeric power (given by the right inlet or argument)., f 48;
+#X restore 684 9 pd reference;
+#X text 617 9 click =>;
+#X obj 4 44 cnv 1 800 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X obj 204 13 log;
+#X obj 235 13 pow;
+#X floatatom 405 282 8 0 0 0 - - - 0;
+#X floatatom 335 282 8 0 0 0 - - - 0;
+#X obj 335 249 log;
+#X obj 405 249 pow;
+#X obj 4 322 cnv 1 800 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X floatatom 668 282 8 0 0 0 - - - 0;
+#X floatatom 738 282 8 0 0 0 - - - 0;
+#X obj 668 249 log 2;
+#X obj 738 249 pow 3;
+#X floatatom 668 217 5 0 0 0 - - - 0;
+#X floatatom 738 217 5 0 0 0 - - - 0;
+#X text 9 54 These binary operators perform the 4 arithmetic functions ([+] \, etc) \, output the minimum or maximum of two numbers ([min] \, [max]) and perform logarithms ([log]) and power function ([pow]). All of these objects take a bang message to evaluate the operation with the previously set values and an argument to set the right input value., f 58;
+#X text 477 181 Initializing right input with an argument:;
+#X obj 18 360 abs;
+#X text 589 362 updated for Pd version 0.54;
+#X text 268 13 - control binary operators;
+#X text 121 332 (etc.) - signal versions;
+#X text 47 361 (etc.) - unary operators;
+#X text 350 334 (etc.) - other binary operators;
+#X text 286 361 (etc.) - trigonometric functions;
+#X text 448 55 As in the signal versions \; - [log] takes a base value via an argument or the right inlet but defaults to "e". A 0 or negative left input gives -1000 as the result \; - [pow] has protection against NaNs (they become 0) \, and it raises a number on the left inlet to a numeric power (given by the right inlet or argument)., f 48;
#X connect 3 0 30 0;
#X connect 13 0 14 0;
#X connect 14 0 17 0;
diff --git a/doc/5.reference/binops-other-help.pd b/doc/5.reference/binops-other-help.pd
index 871649d9f..d69de82b9 100644
--- a/doc/5.reference/binops-other-help.pd
+++ b/doc/5.reference/binops-other-help.pd
@@ -1,4 +1,4 @@
-#N canvas 501 23 635 705 12;
+#N canvas 431 23 635 705 12;
#X obj 198 489 <;
#X obj 166 131 &&;
#X obj 207 130 ||;
diff --git a/doc/5.reference/binops-tilde-help.pd b/doc/5.reference/binops-tilde-help.pd
index 17d157227..1f51ccd19 100644
--- a/doc/5.reference/binops-tilde-help.pd
+++ b/doc/5.reference/binops-tilde-help.pd
@@ -1,4 +1,4 @@
-#N canvas 319 23 841 580 12;
+#N canvas 311 33 841 580 12;
#X obj 22 164 +~;
#X obj 102 164 -~;
#X obj 22 18 +~;
diff --git a/doc/5.reference/canvas-help.pd b/doc/5.reference/canvas-help.pd
index ba785459a..4a993af24 100644
--- a/doc/5.reference/canvas-help.pd
+++ b/doc/5.reference/canvas-help.pd
@@ -1,6 +1,6 @@
#N canvas 299 39 1004 645 12;
#X obj 508 180 table;
-#X obj 552 552 table help-tab1 25;
+#X obj 552 557 table help-tab1 25;
#N canvas 1 51 450 300 (subpatch) 0;
#X restore 61 24 pd;
#X obj 338 609 array;
@@ -33,11 +33,6 @@
#X connect 3 0 1 0;
#X coords 0 1 100 -1 130 50 1 50 50;
#X restore 226 454 graph;
-#N canvas 0 22 450 278 (subpatch) 0;
-#X array array2 100 float 3;
-#A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
-#X coords 0 1 100 -1 200 140 1;
-#X restore 467 315 graph;
#X text 690 307 For details on how to work with arrays \, click and open the files below from the '2.control' examples., f 39;
#X text 42 609 see also:;
#X obj 118 609 inlet;
@@ -128,12 +123,12 @@
#X restore 695 436 pd open;
#X msg 695 381 15.array.pd;
#X msg 705 407 16.more.arrays.pd;
-#X text 694 552 <-- optional creation args: name \, size;
+#X text 694 556 <-- optional creation args: name \, size;
#X text 380 151 <= click;
#X text 197 313 <-- click to open;
#X text 54 469 right click to open -->;
#X text 787 382 <-- click to open examples.;
-#X text 532 498 [table] builds a subpatch with an array inside \, but the array contents (and other properties) aren't saved with the patch., f 62;
+#X text 532 508 [table] builds a subpatch with an array inside \, but the array contents (and other properties) aren't saved with the patch., f 62;
#X text 22 232 A 'canvas' is a patch window. By typing "pd" into an object box \, you create a 'subwindow' (or a 'subpatch'). An optional argument sets its name. Click to open and right click on it to access its canvas properties., f 55;
#X text 15 517 You can send messages to the canvas of a subpatch by sending them to the subpatch's name \, which is useful for Dynamic Patching (see [pd-messages] below). Alernatively \, you can also use the [namecanvas] object., f 66;
#X obj 6 590 cnv 1 990 1 empty empty empty 8 12 0 13 #000000 #000000 0;
@@ -143,5 +138,12 @@
#X text 554 179 - create subpatch with an array;
#X obj 665 608 all_guis;
#X text 592 608 anf also:;
-#X connect 25 0 24 0;
-#X connect 26 0 24 0;
+#X obj 468 306 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 22 450 278 (subpatch) 0;
+#X array array2 100 float 3;
+#A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
+#X coords 0 1 100 -1 200 140 1;
+#X restore 467 305 graph;
+#X text 499 450 (using canvas [cnv] for backgound color), f 20;
+#X connect 24 0 23 0;
+#X connect 25 0 23 0;
diff --git a/doc/5.reference/change-help.pd b/doc/5.reference/change-help.pd
index b97baa304..f8e9c0522 100644
--- a/doc/5.reference/change-help.pd
+++ b/doc/5.reference/change-help.pd
@@ -1,4 +1,4 @@
-#N canvas 641 53 509 382 12;
+#N canvas 580 53 509 382 12;
#X floatatom 68 279 5 0 0 0 - - - 0;
#X text 284 351 updated for Pd version 0.27;
#X text 154 253 creation argument initializes first value;
diff --git a/doc/5.reference/clip~-help.pd b/doc/5.reference/clip~-help.pd
index 44c87dd4c..b3ebc2d92 100644
--- a/doc/5.reference/clip~-help.pd
+++ b/doc/5.reference/clip~-help.pd
@@ -1,4 +1,4 @@
-#N canvas 518 85 518 450 12;
+#N canvas 445 81 518 450 12;
#X obj 36 168 clip~ -0.5 0.5;
#X obj 58 252 metro 500;
#X obj 12 16 clip~;
@@ -37,11 +37,7 @@
#X text 130 114 upper;
#X obj 4 400 cnv 1 505 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 133 61 The [clip~] object passes its signal input to its output \, clipping it to lie between two limits., f 50;
-#X obj 290 225 cnv 19 198 98 empty empty empty 20 12 0 12 #ffffff #404040 0;
-#N canvas 0 22 450 278 (subpatch) 0;
-#X array clip 200 float 0;
-#X coords 0 1 199 -1 200 100 1 0 0;
-#X restore 289 224 graph;
+#X obj 301 223 cnv 19 198 98 empty empty empty 20 12 0 12 #ffffff #404040 0;
#X obj 36 72 osc~ 500;
#X obj 153 208 set-dsp-tgl;
#X text 184 212 DSP on/off;
@@ -59,10 +55,10 @@
#X obj 72 200 clip~ -0.5 0.5;
#X obj 72 405 vsl 19 162 -1 1 0 0 empty empty empty 0 -9 0 12 #dfdfdf #000000 #000000 0 1;
#X obj 171 405 vsl 19 162 -1 1 0 0 empty empty empty 0 -9 0 12 #dfdfdf #000000 #000000 0 1;
-#X obj 171 265 metro 150;
-#X obj 171 236 loadbang;
#X obj 72 105 osc~ 0.5;
#X obj 139 105 osc~ 0.25;
+#X obj 171 265 metro 25;
+#X obj 171 236 loadbang;
#X connect 1 0 10 0;
#X connect 2 0 5 0;
#X connect 2 1 3 0;
@@ -72,19 +68,24 @@
#X connect 6 0 11 0;
#X connect 9 0 7 0;
#X connect 10 0 2 0;
-#X connect 13 0 3 0;
-#X connect 13 0 5 0;
-#X connect 14 0 13 0;
-#X connect 15 0 1 0;
-#X connect 16 0 1 1;
+#X connect 13 0 1 0;
+#X connect 14 0 1 1;
+#X connect 15 0 3 0;
+#X connect 15 0 5 0;
+#X connect 16 0 15 0;
#X restore 273 356 pd multichannel;
#X text 122 341 mutichannel signal support ----------->, f 20;
#X text 298 412 updated for Pd version 0.54;
#X obj 216 413 wrap~;
+#X obj 291 222 cnv 19 198 98 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 22 450 278 (subpatch) 0;
+#X array clip 200 float 0;
+#X coords 0 1 199 -1 200 100 1 0 0;
+#X restore 290 222 graph;
#X connect 0 0 16 0;
#X connect 1 0 16 0;
#X connect 4 0 0 1;
#X connect 11 0 1 0;
#X connect 17 0 0 2;
-#X connect 24 0 0 0;
-#X connect 25 0 10 0;
+#X connect 23 0 0 0;
+#X connect 24 0 10 0;
diff --git a/doc/5.reference/clone-abs-b.pd b/doc/5.reference/clone-abs-b.pd
index 110bfbcb5..a1809eb19 100644
--- a/doc/5.reference/clone-abs-b.pd
+++ b/doc/5.reference/clone-abs-b.pd
@@ -1,4 +1,4 @@
-#N canvas 890 284 261 316 12;
+#N canvas 571 175 261 316 12;
#X obj 80 264 outlet~;
#X obj 80 193 *~;
#X obj 80 89 inlet~;
diff --git a/doc/5.reference/cnv-help.pd b/doc/5.reference/cnv-help.pd
index c7c71471f..ac082d895 100644
--- a/doc/5.reference/cnv-help.pd
+++ b/doc/5.reference/cnv-help.pd
@@ -511,14 +511,14 @@
#X obj 68 231 send \$0-display;
#X floatatom 68 141 5 1 100 0 - - - 0;
#X msg 68 202 label \$1;
-#X obj 205 215 cnv 30 148 30 empty \$0-display file\ 001.wav 9 15 0 16 #000000 #fc6460 0;
-#X text 114 140 <= click and drag;
-#X obj 68 173 makefilename file\ %03d.wav;
+#X obj 205 215 cnv 30 148 30 empty \$0-display File\ 001.wav 9 15 0 16 #000000 #fc6460 0;
#X text 64 27 Here we're using a canvas to display a symbol by using it to set the label., f 43;
#X text 64 64 The file name is set with a [makefilename] object below and you can click and drag on the number box to set the file name., f 43;
-#X connect 1 0 5 0;
+#X obj 68 173 makefilename File\ %03d.wav;
+#X text 111 140 <-- click and drag;
+#X connect 1 0 6 0;
#X connect 2 0 0 0;
-#X connect 5 0 2 0;
+#X connect 6 0 2 0;
#X restore 357 311 pd display-example;
#X text 10 98 Insert it from the Put menu (named as "Canvas") or its shortcut. Alternatively \, create it by typing "my_canvas" or "cnv" into an object box. This object has no inlet or outlet \, so it can only communicate via send and receive symbols set via the properties window., f 71;
#X obj 84 426 all_guis;
diff --git a/doc/5.reference/delay-help.pd b/doc/5.reference/delay-help.pd
index fb0d879db..a46d8fbfd 100644
--- a/doc/5.reference/delay-help.pd
+++ b/doc/5.reference/delay-help.pd
@@ -1,13 +1,13 @@
-#N canvas 437 23 706 648 12;
+#N canvas 437 23 706 639 12;
#X obj 24 11 delay;
#X obj 25 36 del;
#X floatatom 233 462 5 0 0 0 - - - 0;
#X msg 92 271 stop;
-#X text 14 612 see also:;
-#X obj 138 612 timer;
-#X obj 90 612 metro;
+#X text 14 602 see also:;
+#X obj 138 602 timer;
+#X obj 90 602 metro;
#X obj 64 270 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X text 491 612 updated for Pd version 0.45;
+#X text 491 602 updated for Pd version 0.45;
#X obj 117 491 delay 1000 1 msec;
#X text 251 508 - tempo (float) and time unit (symbol) as in "tempo" message;
#X msg 162 325 tempo 0.5 msec;
@@ -22,7 +22,7 @@
#X text 132 270 cancel the delay;
#X text 156 297 set delay time and start;
#X msg 188 389 tempo 0.001 second;
-#X obj 185 612 text sequence;
+#X obj 185 602 text sequence;
#X text 69 10 - send a bang message after a time delay;
#X text 206 414 Note that if the tempo is changed while the delay is in progress \, the change takes effect to the remaining fraction of the delay., f 65;
#X obj 8 62 cnv 1 690 1 empty empty empty 8 12 0 13 #000000 #000000 0;
@@ -53,11 +53,11 @@
#X text 631 35 <= click;
#X text 276 460 set delay time (only takes effect at the next tempo).;
#X text 20 135 Delay times are in units of 1 millisecond by default \, but you can change this with the second and third argument or with a "tempo" message (as in [timer] \, [metro] and [text sequence]) \, which set a tempo value and a time unit symbol. Possible symbols are:, f 94;
-#X obj 290 612 pipe;
+#X obj 290 602 pipe;
#X text 93 184 - millisecond (msec for short) \; - seconds (sec) \; - minutes (min) \; - samples (samp), f 32;
#X text 401 252 'samp' depends on the sample rate the patch is running, f 28;
-#X obj 8 597 cnv 1 690 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X obj 117 550 bng 25 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 8 587 cnv 1 690 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X obj 117 530 bng 25 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X text 20 75 The [delay] object outputs a bang after a given delay time (via argument or right inlet). A bang starts the delay. A float specifies the time delay and starts it. If the delay is running and scheduled to output \, sending a bang or a float cancels the previous setting and reschedules the output., f 94;
#X text 247 491 <-- creation arguments: - delay time (float);
#X text 59 36 <-- abbreviation;
@@ -98,7 +98,8 @@
#X connect 16 0 2 0;
#X connect 19 0 21 0;
#X connect 21 0 20 0;
-#X restore 562 551 pd examples;
+#X restore 450 550 pd examples;
+#X text 320 549 open for more -->;
#X connect 2 0 9 1;
#X connect 3 0 9 0;
#X connect 7 0 9 0;
diff --git a/doc/5.reference/expr-help.pd b/doc/5.reference/expr-help.pd
index f3a68f5d2..220e89982 100644
--- a/doc/5.reference/expr-help.pd
+++ b/doc/5.reference/expr-help.pd
@@ -22,6 +22,7 @@
#X obj 502 46 vsl 19 162 0 10 0 0 empty empty empty 0 -9 0 12 #dfdfdf #000000 #000000 0 1;
#X text 154 93 <-- index to read from the array, f 33;
#X obj 577 30 cnv 19 218 128 empty empty empty 20 12 0 12 #ffffff #404040 0;
+#X obj 577 30 cnv 19 218 128 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
#N canvas 0 50 450 300 (subpatch) 0;
#X array array100 10 float 1;
#A 0 1 6.77019 2 8 5 6 1 4 2 8;
@@ -44,11 +45,6 @@
#X floatatom 624 128 5 0 99 0 - - - 0;
#X floatatom 624 182 5 0 0 0 - - - 0;
#X obj 712 100 loadbang;
-#N canvas 0 50 450 300 (subpatch) 0;
-#X array \$0-x 100 float 1;
-#A 0 -0.720016 -0.706683 -0.693349 -0.680016 -0.666682 -0.653348 -0.640015 -0.625014 -0.610014 -0.595014 -0.580013 -0.565013 -0.550013 -0.535012 -0.520012 -0.505012 -0.490011 -0.475011 -0.460011 -0.44501 -0.43001 -0.415009 -0.400009 -0.385009 -0.370008 -0.355008 -0.340008 -0.325007 -0.310007 -0.295007 -0.280006 -0.264006 -0.248006 -0.232005 -0.216005 -0.200005 -0.184004 -0.168004 -0.152003 -0.136003 -0.120003 -0.106669 -0.0933355 -0.0800018 -0.0666682 -0.0533346 -0.0400009 -0.0266673 -0.0133336 -3.10441e-10 0.0133336 0.0266673 0.0400009 0.0533346 0.0666682 0.0800018 0.0933355 0.106669 0.120003 0.133336 0.14667 0.160004 0.173337 0.186671 0.200005 0.213338 0.226672 0.240005 0.253339 0.266673 0.280006 0.29715 0.314293 0.331436 0.348579 0.365723 0.382866 0.400009 0.413343 0.426676 0.44001 0.453344 0.466677 0.480011 0.500011 0.520012 0.540012 0.560013 0.570013 0.580013 0.590014 0.600014 0.620014 0.640015 0.660015 0.680016 0.680016 0.720016 0.720016 0.720016;
-#X coords 0 1 99 -1 200 150 1 0 0;
-#X restore 249 188 graph;
#X obj 58 397 expr \$0-x[$f1];
#X floatatom 58 363 5 0 99 0 - - - 0;
#X floatatom 58 433 5 0 0 0 - - - 0;
@@ -71,19 +67,25 @@
#X text 538 127 try now -->;
#X text 100 362 <-- try;
#X text 21 6 '\$0' - the patch ID number used to force locality in Pd - may be used in the definition local array names in [expr] \, [expr~] or [fexpr~]. You can also use it to set local variable names in value objects that are retrieved in [expr] \, [expr~] and [fexpr~]. This is especially useful in abstractions., f 62;
+#X obj 250 189 cnv 19 198 148 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 300 (subpatch) 0;
+#X array \$0-x 100 float 1;
+#A 0 -0.720016 -0.706683 -0.693349 -0.680016 -0.666682 -0.653348 -0.640015 -0.625014 -0.610014 -0.595014 -0.580013 -0.565013 -0.550013 -0.535012 -0.520012 -0.505012 -0.490011 -0.475011 -0.460011 -0.44501 -0.43001 -0.415009 -0.400009 -0.385009 -0.370008 -0.355008 -0.340008 -0.325007 -0.310007 -0.295007 -0.280006 -0.264006 -0.248006 -0.232005 -0.216005 -0.200005 -0.184004 -0.168004 -0.152003 -0.136003 -0.120003 -0.106669 -0.0933355 -0.0800018 -0.0666682 -0.0533346 -0.0400009 -0.0266673 -0.0133336 -3.10441e-10 0.0133336 0.0266673 0.0400009 0.0533346 0.0666682 0.0800018 0.0933355 0.106669 0.120003 0.133336 0.14667 0.160004 0.173337 0.186671 0.200005 0.213338 0.226672 0.240005 0.253339 0.266673 0.280006 0.29715 0.314293 0.331436 0.348579 0.365723 0.382866 0.400009 0.413343 0.426676 0.44001 0.453344 0.466677 0.480011 0.500011 0.520012 0.540012 0.560013 0.570013 0.580013 0.590014 0.600014 0.620014 0.640015 0.660015 0.680016 0.680016 0.720016 0.720016 0.720016;
+#X coords 0 1 99 -1 200 150 1 0 0;
+#X restore 249 188 graph;
#X connect 0 0 3 0;
#X connect 1 0 0 1;
#X connect 2 0 0 0;
#X connect 4 0 1 0;
-#X connect 6 0 8 0;
-#X connect 7 0 6 0;
-#X connect 11 0 16 0;
-#X connect 11 1 15 0;
+#X connect 5 0 7 0;
+#X connect 6 0 5 0;
+#X connect 10 0 15 0;
+#X connect 10 1 14 0;
+#X connect 11 0 8 0;
#X connect 12 0 9 0;
-#X connect 13 0 10 0;
-#X connect 14 0 12 0;
-#X connect 14 0 13 0;
-#X connect 24 0 11 0;
+#X connect 13 0 11 0;
+#X connect 13 0 12 0;
+#X connect 23 0 10 0;
#X restore 505 524 pd Dealing_with_"\$0";
#X text 28 607 see also:;
#X obj 285 671 block~;
@@ -200,11 +202,6 @@
#X floatatom 63 163 0 0 0 0 - - - 0;
#X floatatom 145 164 0 0 0 0 - - - 0;
#X floatatom 228 164 0 0 0 0 - - - 0;
-#N canvas 0 50 450 300 (subpatch) 0;
-#X array table 100 float 1;
-#A 0 0 1 2 3 4 5 6 7 8 9 18.5714 21.4285 28.5713 31.4284 34.9998 38.5712 40.714 42.8569 46.4283 49.2854 50.3568 51.4282 53.5711 54.2853 54.9996 55.7139 55.7139 55.7139 55.7139 55.7139 55.7139 55.7139 55.7139 55.5353 55.3568 55.1782 54.9996 54.2853 53.5711 52.8568 52.1425 51.4282 49.9997 48.5711 47.1426 45.714 44.0473 42.3807 40.714 39.0474 37.3807 35.7141 32.857 31.4284 29.9999 28.5713 26.4285 26.4285 26.7856 27.1427 27.857 28.5713 29.107 29.6427 30.1784 30.7141 31.607 32.4998 33.3927 34.2855 34.9998 35.7141 36.6665 37.6188 38.5712 40.714 41.4283 42.1426 44.2854 45.714 46.7854 47.8568 49.9997 51.4282 52.8568 55.7139 57.8567 59.9996 62.8567 64.9995 66.4281 69.2852 72.1423 93 94 95 96 97 98 99;
-#X coords 0 100 99 0 200 140 1 0 0;
-#X restore 336 118 graph;
#X obj 364 422 expr size("$s1") \;;
#X obj 63 102 expr Sum("table" \, 3 \, 9) \; sum("table") \; size("table");
#X msg 364 392 symbol table;
@@ -225,18 +222,24 @@
#X obj 63 73 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X obj 47 269 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X obj 47 396 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X connect 4 0 7 0;
-#X connect 5 0 0 0;
-#X connect 5 1 1 0;
-#X connect 5 2 2 0;
-#X connect 6 0 4 0;
-#X connect 15 0 11 0;
-#X connect 15 1 12 0;
-#X connect 16 0 13 0;
-#X connect 16 1 14 0;
-#X connect 21 0 5 0;
+#X obj 337 118 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 300 (subpatch) 0;
+#X array table 100 float 1;
+#A 0 0 1 2 3 4 5 6 7 8 9 18.5714 21.4285 28.5713 31.4284 34.9998 38.5712 40.714 42.8569 46.4283 49.2854 50.3568 51.4282 53.5711 54.2853 54.9996 55.7139 55.7139 55.7139 55.7139 55.7139 55.7139 55.7139 55.7139 55.5353 55.3568 55.1782 54.9996 54.2853 53.5711 52.8568 52.1425 51.4282 49.9997 48.5711 47.1426 45.714 44.0473 42.3807 40.714 39.0474 37.3807 35.7141 32.857 31.4284 29.9999 28.5713 26.4285 26.4285 26.7856 27.1427 27.857 28.5713 29.107 29.6427 30.1784 30.7141 31.607 32.4998 33.3927 34.2855 34.9998 35.7141 36.6665 37.6188 38.5712 40.714 41.4283 42.1426 44.2854 45.714 46.7854 47.8568 49.9997 51.4282 52.8568 55.7139 57.8567 59.9996 62.8567 64.9995 66.4281 69.2852 72.1423 93 94 95 96 97 98 99;
+#X coords 0 100 99 0 200 140 1 0 0;
+#X restore 336 118 graph;
+#X connect 3 0 6 0;
+#X connect 4 0 0 0;
+#X connect 4 1 1 0;
+#X connect 4 2 2 0;
+#X connect 5 0 3 0;
+#X connect 14 0 10 0;
+#X connect 14 1 11 0;
+#X connect 15 0 12 0;
+#X connect 15 1 13 0;
+#X connect 20 0 4 0;
+#X connect 21 0 14 0;
#X connect 22 0 15 0;
-#X connect 23 0 16 0;
#X restore 125 361 pd Table-functions;
#N canvas 286 64 570 578 Power-functions 0;
#X floatatom 62 60 5 0 0 0 - - - 0;
@@ -398,17 +401,18 @@
#X floatatom 62 211 5 0 0 0 - - - 0;
#X floatatom 276 211 5 0 0 0 - - - 0;
#X obj 62 158 expr array2[inc - 1] = 1 / inc \; inc = inc + 1;
+#X obj 129 119 v inc;
+#X msg 129 94 0;
+#X obj 62 129 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 352 101 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
#N canvas 0 22 450 278 (subpatch) 0;
#X array array2 16 float 2;
#X coords 0 1.1 16 -0.1 200 140 1 0 0;
#X restore 351 101 graph;
-#X obj 129 119 v inc;
-#X msg 129 94 0;
-#X obj 62 129 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X connect 3 0 1 0;
#X connect 3 1 2 0;
-#X connect 6 0 5 0;
-#X connect 7 0 3 0;
+#X connect 5 0 4 0;
+#X connect 6 0 3 0;
#X restore 125 326 pd Store-function;
#X text 46 19 Here are all the operators and functions available for [expr] \, [expr~] and [fexpr~] \, even though the given examples are only presented with [expr]., f 52;
#X text 46 76 These are organized in different groups. Click on the subpatches below to check each group:, f 52;
@@ -469,7 +473,7 @@
#X obj 632 437 expr abs($f1);
#X floatatom 632 474 5 0 0 0 - - - 0;
#X text 680 399 absolute value;
-#X obj 601 225 bng 15 250 50 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000;
+#X obj 601 215 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X msg 322 384 7;
#X obj 601 251 expr log(-1);
#X text 100 264 round floats to integers, f 12;
@@ -725,20 +729,8 @@
#X text 95 361 frequency;
#X floatatom 743 257 7 0 10 0 - - - 0;
#X obj 536 328 tabsend~ a1;
-#N canvas 0 50 450 300 (subpatch) 0;
-#X array a1 64 float 0;
-#X coords 0 1 63 -1 200 140 1;
-#X restore 103 527 graph;
#X obj 546 458 tabsend~ a2;
#X obj 711 454 tabsend~ a3;
-#N canvas 0 50 450 300 (subpatch) 0;
-#X array a2 64 float 0;
-#X coords 0 1 63 -1 200 140 1 0 0;
-#X restore 319 528 graph;
-#N canvas 0 50 450 300 (subpatch) 0;
-#X array a3 64 float 0;
-#X coords 0 1 63 -1 200 140 1;
-#X restore 540 528 graph;
#X obj 50 388 osc~ 440;
#X floatatom 250 347 8 0 0 0 - - - 0;
#X text 314 347 amplitude;
@@ -770,30 +762,45 @@
#X obj 743 72 vsl 19 162 0 1 0 0 empty empty empty 0 -9 0 12 #dfdfdf #000000 #000000 0 1;
#X obj 290 20 set-dsp-tgl;
#X text 321 24 DSP on/off;
-#X connect 0 0 10 0;
-#X connect 3 0 18 1;
-#X connect 10 0 14 0;
-#X connect 11 0 28 0;
-#X connect 13 0 14 1;
-#X connect 14 0 1 0;
-#X connect 14 0 1 1;
-#X connect 15 0 6 0;
-#X connect 15 1 7 0;
-#X connect 16 0 15 0;
-#X connect 17 0 18 0;
-#X connect 18 0 4 0;
-#X connect 21 0 31 1;
-#X connect 22 0 23 0;
-#X connect 23 0 31 0;
-#X connect 24 0 15 1;
-#X connect 28 0 13 0;
-#X connect 31 0 20 0;
-#X connect 36 0 20 0;
-#X connect 37 0 11 0;
-#X connect 38 0 3 0;
-#X connect 39 0 33 0;
+#X obj 541 529 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#X obj 320 529 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#X obj 104 528 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 300 (subpatch) 0;
+#X array a1 64 float 0;
+#X coords 0 1 63 -1 200 140 1;
+#X restore 103 527 graph;
+#N canvas 0 50 450 300 (subpatch) 0;
+#X array a2 64 float 0;
+#X coords 0 1 63 -1 200 140 1 0 0;
+#X restore 319 528 graph;
+#N canvas 0 50 450 300 (subpatch) 0;
+#X array a3 64 float 0;
+#X coords 0 1 63 -1 200 140 1;
+#X restore 540 528 graph;
+#X connect 0 0 7 0;
+#X connect 3 0 15 1;
+#X connect 7 0 11 0;
+#X connect 8 0 25 0;
+#X connect 10 0 11 1;
+#X connect 11 0 1 0;
+#X connect 11 0 1 1;
+#X connect 12 0 5 0;
+#X connect 12 1 6 0;
+#X connect 13 0 12 0;
+#X connect 14 0 15 0;
+#X connect 15 0 4 0;
+#X connect 18 0 28 1;
+#X connect 19 0 20 0;
+#X connect 20 0 28 0;
+#X connect 21 0 12 1;
+#X connect 25 0 10 0;
+#X connect 28 0 17 0;
+#X connect 33 0 17 0;
+#X connect 34 0 8 0;
+#X connect 35 0 3 0;
+#X connect 36 0 30 0;
#X restore 219 528 pd [expr~] Examples;
-#N canvas 240 37 1094 690 [fexpr~] 0;
+#N canvas 222 33 1094 690 [fexpr~] 0;
#X text 90 365 - $x1: same as $x1[0] \, $x2: same as $x2[0] (and so on)., f 60;
#X text 90 347 - $x: same as $x1[0]., f 60;
#X text 90 383 - $y: same as $y1[-1]., f 60;
@@ -889,14 +896,6 @@
#X array X 64 float 0;
#X coords 0 20 63 -20 200 140 1 0 0;
#X restore 178 423 graph;
-#N canvas 0 50 450 300 (subpatch) 0;
-#X array Y 64 float 0;
-#X coords 0 20 63 -20 200 140 2 0 0;
-#X restore 418 421 graph;
-#N canvas 0 50 450 300 (subpatch) 0;
-#X array Z 64 float 0;
-#X coords 0 40 63 0 200 140 2 0 0;
-#X restore 655 420 graph;
#X obj 249 136 expr 8./3;
#X text 587 289 $y1 -> $y1[-1] $y2 -> $y2[-1] $y3 -> $y3[-1], f 15;
#X text 145 547 -20;
@@ -922,10 +921,21 @@
#X text 294 250 <-- sets initial values of $y1[-1] \, $y2[-1] \, and $y3[-1];
#X text 446 165 <-- experiment with these parameter values. If you;
#X text 98 52 bang to start -->, f 9;
+#X obj 179 424 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#X obj 419 422 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#X obj 656 421 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 300 (subpatch) 0;
+#X array Y 64 float 0;
+#X coords 0 20 63 -20 200 140 2 0 0;
+#X restore 418 421 graph;
+#N canvas 0 50 450 300 (subpatch) 0;
+#X array Z 64 float 0;
+#X coords 0 40 63 0 200 140 2 0 0;
+#X restore 655 420 graph;
#X connect 3 0 0 0;
#X connect 4 0 1 0;
#X connect 5 0 3 0;
-#X connect 6 0 31 0;
+#X connect 6 0 29 0;
#X connect 7 0 2 0;
#X connect 8 0 9 0;
#X connect 10 0 4 0;
@@ -934,18 +944,18 @@
#X connect 12 0 10 0;
#X connect 12 0 11 0;
#X connect 12 0 6 0;
-#X connect 12 0 37 0;
-#X connect 12 0 19 0;
+#X connect 12 0 35 0;
+#X connect 12 0 17 0;
#X connect 13 0 8 0;
#X connect 14 0 13 0;
-#X connect 15 0 35 0;
-#X connect 19 0 7 0;
-#X connect 31 0 32 0;
-#X connect 31 0 38 0;
-#X connect 31 1 33 0;
-#X connect 31 2 34 0;
-#X connect 35 0 31 0;
-#X connect 37 0 31 0;
+#X connect 15 0 33 0;
+#X connect 17 0 7 0;
+#X connect 29 0 30 0;
+#X connect 29 0 36 0;
+#X connect 29 1 31 0;
+#X connect 29 2 32 0;
+#X connect 33 0 29 0;
+#X connect 35 0 29 0;
#X restore 819 633 pd difference-equations(Lorenz);
#X obj 340 155 fexpr~ $x1[0] + $y1[-1];
#X text 62 192 'n' index for '$x#' is from 0 to minus "vector size - 1"., f 58;
diff --git a/doc/5.reference/fft~-help.pd b/doc/5.reference/fft~-help.pd
index 6b74142ad..0b3a6bdd8 100644
--- a/doc/5.reference/fft~-help.pd
+++ b/doc/5.reference/fft~-help.pd
@@ -1,4 +1,4 @@
-#N canvas 561 49 711 489 12;
+#N canvas 485 49 711 489 12;
#X floatatom 27 176 7 0 0 0 - - - 0;
#X obj 27 123 * 44100;
#X floatatom 27 93 4 0 0 0 - - - 0;
diff --git a/doc/5.reference/gui-boxes-help.pd b/doc/5.reference/gui-boxes-help.pd
index aca7f3b9c..dc58f5596 100644
--- a/doc/5.reference/gui-boxes-help.pd
+++ b/doc/5.reference/gui-boxes-help.pd
@@ -102,7 +102,7 @@
#X text 70 43 By default \, when you create a box \, it'll use the font size that your patch is using. In this case it is "12". You can change the size settings in the properties. The 'auto' setting (the default) also automatically changes the font size of the atom box if you change your patch's font. In other cases \, it uses a specific font and keeps it no matter if you change the patch's font or not. Below \, we have a size of "36". The font setting also affects the label., f 56;
#X restore 196 267 pd size;
#X text 116 78 <-- right click for properties;
-#X restore 155 534 pd properties;
+#X restore 135 534 pd properties;
#N canvas 570 235 459 438 properties 0;
#N canvas 822 144 510 501 width 0;
#X symbolatom 162 162 10 0 0 0 - - - 0;
@@ -159,7 +159,7 @@
#X restore 240 277 pd size;
#X text 171 77 <-- right click for properties;
#X restore 800 264 pd properties;
-#X text 51 534 more details:;
+#X text 31 534 more details:;
#X listbox 490 41 20 0 0 0 - - - 0;
#X text 687 168 set only - don't output;
#X msg 559 360 1 2 3 foo 5;
diff --git a/doc/5.reference/nbx-help.pd b/doc/5.reference/nbx-help.pd
index 76d242ad8..49d5fe256 100644
--- a/doc/5.reference/nbx-help.pd
+++ b/doc/5.reference/nbx-help.pd
@@ -1,4 +1,4 @@
-#N canvas 337 23 538 656 12;
+#N canvas 357 23 538 656 12;
#X declare -stdpath ./;
#X floatatom 179 404 7 0 0 0 - - - 0;
#X msg 229 318 set \$1;
diff --git a/doc/5.reference/osc-format-parse-help.pd b/doc/5.reference/osc-format-parse-help.pd
index c0e5f0aad..3e23bfdb6 100644
--- a/doc/5.reference/osc-format-parse-help.pd
+++ b/doc/5.reference/osc-format-parse-help.pd
@@ -1,4 +1,4 @@
-#N canvas 329 61 893 639 12;
+#N canvas 325 36 893 639 12;
#X msg 294 174 1 2 3;
#X msg 315 223 set dog ferret;
#X msg 301 200 set mouse banana;
diff --git a/doc/5.reference/osc~-help.pd b/doc/5.reference/osc~-help.pd
index d524aef9b..827940db2 100644
--- a/doc/5.reference/osc~-help.pd
+++ b/doc/5.reference/osc~-help.pd
@@ -8,10 +8,6 @@
#X text 62 18 - cosine wave oscillator;
#X obj 184 239 metro 500;
#X obj 90 401 phasor~;
-#N canvas 0 50 450 250 (subpatch) 0;
-#X array \$0-array 200 float 0;
-#X coords 0 -1 199 1 200 100 1;
-#X restore 338 224 graph;
#X text 343 402 updated for Pd version 0.33;
#X obj 174 276 tabwrite~ \$0-array;
#X obj 133 309 output~;
@@ -48,11 +44,16 @@
#X obj 149 401 tabosc4~;
#X text 255 143 <-- reset phase;
#X text 10 231 (note it also takes signals), f 14;
-#X connect 0 0 13 0;
-#X connect 6 0 10 0;
-#X connect 12 0 6 0;
-#X connect 13 0 10 0;
-#X connect 13 0 11 0;
-#X connect 14 0 13 1;
-#X connect 15 0 13 1;
-#X connect 17 0 18 0;
+#X obj 338 225 cnv 19 198 98 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 250 (subpatch) 0;
+#X array \$0-array 200 float 0;
+#X coords 0 -1 199 1 200 100 1;
+#X restore 338 224 graph;
+#X connect 0 0 12 0;
+#X connect 6 0 9 0;
+#X connect 11 0 6 0;
+#X connect 12 0 9 0;
+#X connect 12 0 10 0;
+#X connect 13 0 12 1;
+#X connect 14 0 12 1;
+#X connect 16 0 17 0;
diff --git a/doc/5.reference/pack-help.pd b/doc/5.reference/pack-help.pd
index de2be544c..9cd4e2677 100644
--- a/doc/5.reference/pack-help.pd
+++ b/doc/5.reference/pack-help.pd
@@ -1,29 +1,29 @@
-#N canvas 487 35 595 622 12;
+#N canvas 487 35 590 612 12;
#X floatatom 69 168 6 0 0 0 - - - 0;
#X floatatom 124 253 5 0 0 0 - - - 0;
#X floatatom 234 280 5 0 0 0 - - - 0;
#X obj 69 364 print;
#X msg 179 253 symbol cat;
#X obj 28 16 pack;
-#X obj 114 582 unpack;
+#X obj 94 583 unpack;
#X msg 82 200 1 2 dog;
-#X text 352 584 updated for Pd version 0.34;
-#X text 37 582 See also:;
-#X obj 415 454 pack;
-#X obj 415 420 t b f;
-#X floatatom 415 394 6 0 0 0 - - - 0;
-#X floatatom 362 394 6 0 0 0 - - - 0;
-#X obj 415 507 print;
-#X obj 108 531 print;
-#X msg 108 400 a;
-#X obj 108 473 pack s f;
-#X floatatom 161 437 5 0 0 0 - - - 0;
-#X text 458 419 <= trigger;
+#X text 372 582 updated for Pd version 0.34;
+#X text 17 582 See also:;
+#X obj 425 454 pack;
+#X obj 425 420 t b f;
+#X floatatom 425 394 6 0 0 0 - - - 0;
+#X floatatom 372 394 6 0 0 0 - - - 0;
+#X obj 425 507 print;
+#X obj 115 531 print;
+#X msg 115 400 a;
+#X obj 115 473 pack s f;
+#X floatatom 168 437 5 0 0 0 - - - 0;
+#X text 468 419 <= trigger;
#X listbox 69 335 20 0 0 0 - - - 0;
-#X listbox 108 504 20 0 0 0 - - - 0;
-#X listbox 415 480 17 0 0 0 - - - 0;
+#X listbox 115 504 20 0 0 0 - - - 0;
+#X listbox 425 480 17 0 0 0 - - - 0;
#X obj 69 306 pack 10 100 symbol float;
-#X obj 169 582 trigger;
+#X obj 149 583 trigger;
#N canvas 545 128 559 219 pointer 0;
#X text 55 22 The [pack] object can pack a pointer into a list. A pointer can be the location of a Data Structure scalar somewhere or the head of a Data Structure list. To know more about Data Structures \, how to handle pointers and see examples \, please refer to the 4.Data.Structure section of the Pd's tutorials., f 65;
#X obj 93 124 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
@@ -60,7 +60,7 @@
#X restore 407 15 pd reference;
#X text 501 15 <= click;
#X obj 8 566 cnv 1 575 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X text 12 459 abbreviated arguments -->, f 13;
+#X text 19 459 abbreviated arguments -->, f 13;
#X obj 53 134 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X text 76 133 <-- outputs the packed elements;
#X text 117 167 <-- first inlet generates output;
@@ -69,7 +69,7 @@
#X text 18 56 The [pack] object outputs a concatenated list from a series of inputs. Creation arguments set the number of inlets and their type \, possible values are: float (or 'f') \, symbol (or 's') and pointer (or 'p') - see [pd pointer]. A number sets a numeric inlet and initializes the value ('float'/'f' initializes to 0)., f 79;
#X text 441 135 <-- about pointers;
#X text 316 328 By default \, [pack] takes two floats. You can use [trigger] to force an output on secondary inlets., f 36;
-#X text 143 395 [pack] accepts 'anythings' in the left inlet, f 26;
+#X text 146 395 [pack] accepts 'anythings' in the left inlet, f 26;
#X text 67 16 - combine atoms into a list;
#X connect 0 0 23 0;
#X connect 1 0 23 1;
diff --git a/doc/5.reference/pdcontrol-help.pd b/doc/5.reference/pdcontrol-help.pd
index eb0bceffc..087c589fc 100644
--- a/doc/5.reference/pdcontrol-help.pd
+++ b/doc/5.reference/pdcontrol-help.pd
@@ -1,7 +1,7 @@
#N canvas 426 23 715 635 12;
#X obj 32 13 pdcontrol;
-#X obj 21 380 pdcontrol;
-#X obj 21 438 print;
+#X obj 24 380 pdcontrol;
+#X obj 24 438 print;
#X msg 259 448 isvisible;
#N canvas 568 591 287 200 subpatch 0;
#X obj 99 26 inlet;
@@ -13,9 +13,9 @@
#X connect 1 0 3 0;
#X restore 259 479 pd subpatch;
#X text 109 455 open and shut the subpatch to test "isvisible" message, f 19;
-#X msg 37 181 dir;
+#X msg 40 181 dir;
#X text 70 180 get directory this patch is in;
-#X msg 50 216 dir 0 ../3.audio-examples/A00.intro.pd, f 32;
+#X msg 53 216 dir 0 ../3.audio-examples/A00.intro.pd, f 32;
#N canvas 761 91 541 437 args 0;
#X obj 103 254 print;
#X text 161 141 <= get arguments;
@@ -29,10 +29,10 @@
#X connect 6 0 0 0;
#X restore 362 552 pd args;
#X text 216 145 open a URL in a browser;
-#X msg 21 145 browse http://msp.ucsd.edu;
+#X msg 24 145 browse http://msp.ucsd.edu;
#X text 299 182 Optional argument to specify this patch (0) \, owning patch (1) \, its own owner (2) \, and so on \, and optionally also a filename relative to the patch's directory. (Ownership number is silently reduced if owners don't exist \, so here anything greater than zero is ignored.), f 55;
#X floatatom 259 513 5 0 0 0 - - - 0;
-#X symbolatom 21 409 80 0 0 0 - - - 0;
+#X symbolatom 24 409 80 0 0 0 - - - 0;
#X obj 8 44 cnv 1 700 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 625 14 <= click;
#N canvas 603 156 718 338 reference 0;
@@ -62,7 +62,7 @@
#X text 111 12 - get patch/window information or communicate to canvas.;
#X obj 178 603 pd-messages;
#X text 201 273 send a message to this patch window. NOTE: messages to canvases may change from one version of Pd to the next - so backward compatibility can't be guaranteed (although in practice they don't often change). WARNING: don't send a "clear" message - that will crash Pd. Other editing commands might also cause grief. See also "pd-messages" file below., f 69;
-#X msg 54 299 sendcanvas loadbang;
+#X msg 55 299 sendcanvas loadbang;
#X text 33 59 [pdcontrol] provides some patch/window related information. It can get the patch's owning directory \, its arguments (when loaded as an abstraction) and a window's visible/invisible state. In addition \, it allows you to send messages to the canvas or the parent canvas. For last \, it also lets you open a URL in a web browser. Other functionalities may be added., f 90;
#X connect 1 0 14 0;
#X connect 3 0 4 0;
diff --git a/doc/5.reference/phasor~-help.pd b/doc/5.reference/phasor~-help.pd
index f17cf34f9..1ba409102 100644
--- a/doc/5.reference/phasor~-help.pd
+++ b/doc/5.reference/phasor~-help.pd
@@ -1,8 +1,4 @@
#N canvas 535 32 572 616 12;
-#N canvas 0 22 450 278 (subpatch) 0;
-#X array phasor 4410 float 0;
-#X coords 0 1 4409 -1 200 100 1 0 0;
-#X restore 82 435 graph;
#X floatatom 96 211 5 -100 100 0 - - - 0;
#X obj 29 16 phasor~;
#X text 24 580 see also:;
@@ -13,7 +9,6 @@
#X text 97 17 - phase ramp generator;
#X msg 163 243 0;
#X obj 115 339 metro 100;
-#X obj 96 274 phasor~ 10;
#X msg 129 243 0.5;
#X text 32 149 The right inlet resets the phase with values from 0 to 1 (where '1' is the same as '0' and '0.5' is half the cycle)., f 69;
#X text 58 525 -1;
@@ -54,12 +49,18 @@
#X obj 325 415 cos~;
#X text 376 392 If used in conjunction with [cos~] you have an osicllator with access to the phase., f 22;
#X text 347 463 This way you can implement phase modulation \, check the help file of [cos~] for an example., f 26;
-#X connect 1 0 11 0;
-#X connect 9 0 11 1;
-#X connect 10 0 17 0;
-#X connect 11 0 17 0;
-#X connect 12 0 11 1;
-#X connect 18 0 34 0;
-#X connect 19 0 18 0;
-#X connect 21 0 10 0;
-#X connect 31 0 22 0;
+#X obj 96 274 phasor~ 21;
+#X obj 83 436 cnv 19 198 98 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 22 450 278 (subpatch) 0;
+#X array phasor 4410 float 0;
+#X coords 0 1 4409 -1 200 100 1 0 0;
+#X restore 82 435 graph;
+#X connect 0 0 35 0;
+#X connect 8 0 35 1;
+#X connect 9 0 15 0;
+#X connect 10 0 35 1;
+#X connect 16 0 32 0;
+#X connect 17 0 16 0;
+#X connect 19 0 9 0;
+#X connect 29 0 20 0;
+#X connect 35 0 15 0;
diff --git a/doc/5.reference/pipe-help.pd b/doc/5.reference/pipe-help.pd
index a850c734c..f4c5dc7db 100644
--- a/doc/5.reference/pipe-help.pd
+++ b/doc/5.reference/pipe-help.pd
@@ -1,28 +1,28 @@
-#N canvas 429 24 797 702 12;
-#X obj 603 526 t f f f;
-#X obj 626 557 + 1;
-#X obj 660 556 + 2;
-#X text 40 670 see also:;
+#N canvas 429 24 797 697 12;
+#X obj 603 514 t f f f;
+#X obj 626 545 + 1;
+#X obj 660 544 + 2;
+#X text 20 660 see also:;
#X obj 63 312 pipe 2000;
#X text 105 152 numbers to store and output later;
#X msg 74 179 flush;
#X msg 84 207 clear;
#X text 108 347 delayed output;
-#X obj 115 671 delay;
-#X obj 166 671 timer;
+#X obj 95 661 delay;
+#X obj 146 661 timer;
#X text 169 280 set delay time;
-#X text 561 670 updated for Pd version 0.33;
+#X text 571 660 updated for Pd version 0.33;
#X obj 45 16 pipe;
#X text 84 15 - message "delay line";
#X obj 63 380 print pipe;
#X obj 96 240 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X symbolatom 135 586 13 0 0 0 - - - 0;
+#X symbolatom 135 584 13 0 0 0 - - - 0;
#X msg 136 491 symbol ahoy;
#X msg 152 523 symbol cheers;
-#X obj 135 617 print;
+#X obj 135 615 print;
#X text 140 304 a single float creation argument initializes delay time (0 by default), f 37;
#X text 120 234 bang outputs the last received message after the delay time, f 30;
-#X obj 592 585 pipe 5 6 7 1000;
+#X obj 592 573 pipe 5 6 7 1000;
#X obj 517 225 t f f b, f 12;
#X msg 603 264 symbol stop;
#X obj 560 264 + 1;
@@ -44,11 +44,11 @@
#X floatatom 517 192 5 0 0 0 - - - 0;
#X floatatom 517 362 5 0 0 0 - - - 0;
#X floatatom 582 362 5 0 0 0 - - - 0;
-#X floatatom 592 613 5 0 0 0 - - - 0;
-#X floatatom 643 613 5 0 0 0 - - - 0;
-#X floatatom 694 613 5 0 0 0 - - - 0;
+#X floatatom 592 601 5 0 0 0 - - - 0;
+#X floatatom 643 601 5 0 0 0 - - - 0;
+#X floatatom 694 601 5 0 0 0 - - - 0;
#X floatatom 63 346 5 0 0 0 - - - 0;
-#X floatatom 603 500 5 0 0 0 - - - 0;
+#X floatatom 603 488 5 0 0 0 - - - 0;
#X obj 11 49 cnv 1 780 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#N canvas 747 105 570 534 reference 0;
#X obj 8 52 cnv 5 550 5 empty empty INLETS: 8 18 0 13 #202020 #000000 0;
@@ -78,10 +78,10 @@
#X text 107 380 pointer - pointer delayed output (if type is a pointer).;
#X restore 593 16 pd reference;
#X text 687 15 <= click;
-#X obj 10 653 cnv 1 780 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X obj 10 647 cnv 1 780 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 119 178 output all scheduled messages immediately;
#X text 128 208 forget all scheduled messages;
-#X obj 572 525 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 572 513 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X connect 0 0 23 0;
#X connect 0 1 1 0;
#X connect 0 2 2 0;
diff --git a/doc/5.reference/realtime-help.pd b/doc/5.reference/realtime-help.pd
index d8c032ece..63f19bbd1 100644
--- a/doc/5.reference/realtime-help.pd
+++ b/doc/5.reference/realtime-help.pd
@@ -1,4 +1,4 @@
-#N canvas 646 69 469 351 12;
+#N canvas 571 69 469 351 12;
#X floatatom 119 254 8 0 0 0 - - - 0;
#X text 184 253 Output is in milliseconds;
#X obj 16 15 realtime;
diff --git a/doc/5.reference/send-receive-help.pd b/doc/5.reference/send-receive-help.pd
index f145a517c..fdb55a51c 100644
--- a/doc/5.reference/send-receive-help.pd
+++ b/doc/5.reference/send-receive-help.pd
@@ -141,10 +141,6 @@
#X obj 225 251 send array;
#X msg 225 205 0 -1 0 1 0 -1 0 1, f 9;
#X text 38 481 Note that GUIs have built in send and receive names you can set via properties (right click and check it)., f 40;
-#N canvas 0 22 450 278 (subpatch) 0;
-#X array array 7 float 2;
-#X coords 0 1.1 7 -1.1 100 50 1 0 0;
-#X restore 322 213 graph;
#X msg 188 410 send y;
#X msg 275 410 send y;
#X floatatom 358 497 5 0 0 0 - - - 0;
@@ -163,6 +159,11 @@
#X text 28 289 The [receive] object can also get messages from [value] and the other objects below via their "send" messages. Note that [value] can also get these values from these objects (except [list store] because [value] can't deal with lists).;
#X obj 52 544 hsl 162 19 0 127 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1;
#X text 50 68 Message boxes also send messages if it starts with a semicolon:, f 32;
+#X obj 323 214 cnv 19 98 48 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 22 450 278 (subpatch) 0;
+#X array array 7 float 2;
+#X coords 0 1.1 7 -1.1 100 50 1 0 0;
+#X restore 322 213 graph;
#X connect 1 0 5 0;
#X connect 3 0 2 0;
#X connect 4 0 1 0;
@@ -171,13 +172,13 @@
#X connect 12 0 7 0;
#X connect 13 0 8 0;
#X connect 16 0 15 0;
-#X connect 19 0 7 0;
-#X connect 20 0 8 0;
-#X connect 22 0 21 0;
-#X connect 28 0 27 0;
-#X connect 30 0 22 0;
-#X connect 31 0 28 0;
-#X connect 32 0 22 0;
+#X connect 18 0 7 0;
+#X connect 19 0 8 0;
+#X connect 21 0 20 0;
+#X connect 27 0 26 0;
+#X connect 29 0 21 0;
+#X connect 30 0 27 0;
+#X connect 31 0 21 0;
#X restore 124 586 pd Interaction_with_other_objects;
#X text 48 533 The [send] and [receive] objects do interact with other objects in Pd. Open the subpatch below for details.;
#X obj 8 627 cnv 1 870 1 empty empty empty 8 12 0 13 #000000 #000000 0;
diff --git a/doc/5.reference/set-help.pd b/doc/5.reference/set-help.pd
index 65641589b..fd2a4bf81 100644
--- a/doc/5.reference/set-help.pd
+++ b/doc/5.reference/set-help.pd
@@ -1,5 +1,5 @@
#N struct set-template float x float y symbol s;
-#N canvas 609 23 568 698 12;
+#N canvas 521 23 568 698 12;
#X text 15 648 see also:;
#X obj 123 637 append;
#X obj 181 637 getsize;
@@ -13,7 +13,7 @@
#X text 285 231 Remaining args are names of fields.;
#X obj 220 660 pointer;
#X msg 268 139 traverse pd-set-data \, next;
-#N canvas 296 165 297 270 set-data 1;
+#N canvas 194 157 297 270 set-data 1;
#X scalar set-template 70 32 monkey \;;
#X scalar set-template 143 78 fish \;;
#X coords 0 270 1 269 0 0 0;
diff --git a/doc/5.reference/setsize-help.pd b/doc/5.reference/setsize-help.pd
index 39ea6f9ba..8e6b835bd 100644
--- a/doc/5.reference/setsize-help.pd
+++ b/doc/5.reference/setsize-help.pd
@@ -1,6 +1,6 @@
#N struct setsize-template float x float y array array4 array4-template;
#N struct array4-template float y;
-#N canvas 615 26 619 575 12;
+#N canvas 581 26 619 575 12;
#X text 16 534 see also:;
#N canvas 393 50 510 198 setsize-template 0;
#X obj 74 136 plot array4 500 1 10 15 10;
diff --git a/doc/5.reference/slop~-help.pd b/doc/5.reference/slop~-help.pd
index 93cb5241a..7dc46fa70 100644
--- a/doc/5.reference/slop~-help.pd
+++ b/doc/5.reference/slop~-help.pd
@@ -1,10 +1,5 @@
#N canvas 304 34 927 598 12;
#X obj 35 122 osc~;
-#N canvas 0 50 450 250 (subpatch) 0;
-#X array \$0-graph 1000 float 1;
-#A 0 -0.239854 -0.245719 -0.251574 -0.25742 -0.263255 -0.269079 -0.274893 -0.280696 -0.286488 -0.292268 -0.298037 -0.303793 -0.309538 -0.315271 -0.320991 -0.326698 -0.332393 -0.338074 -0.343743 -0.349397 -0.355039 -0.360666 -0.366279 -0.371878 -0.377463 -0.383033 -0.388588 -0.394128 -0.399653 -0.405162 -0.410656 -0.416135 -0.421597 -0.427043 -0.432473 -0.437887 -0.443284 -0.448664 -0.454028 -0.459374 -0.464539 -0.469444 -0.474091 -0.478482 -0.482619 -0.486504 -0.49014 -0.493527 -0.496669 -0.499566 -0.502222 -0.504637 -0.506815 -0.508757 -0.510465 -0.511941 -0.513187 -0.514205 -0.514997 -0.515566 -0.515913 -0.51604 -0.515949 -0.515643 -0.515123 -0.514391 -0.51345 -0.512302 -0.510949 -0.509392 -0.507635 -0.505678 -0.503525 -0.501178 -0.498637 -0.495907 -0.492988 -0.489883 -0.486594 -0.483123 -0.479474 -0.475646 -0.471644 -0.467469 -0.463124 -0.45861 -0.45393 -0.449086 -0.444081 -0.438916 -0.433594 -0.428118 -0.422489 -0.41671 -0.410784 -0.404712 -0.398497 -0.392141 -0.385647 -0.379017 -0.372253 -0.365358 -0.358334 -0.351183 -0.343909 -0.33661 -0.329311 -0.322012 -0.314713 -0.307414 -0.300115 -0.292816 -0.285517 -0.278218 -0.27092 -0.263621 -0.256322 -0.249023 -0.241724 -0.234425 -0.227126 -0.219827 -0.212528 -0.205229 -0.19793 -0.190631 -0.183332 -0.176033 -0.168734 -0.161435 -0.154136 -0.146837 -0.139538 -0.132239 -0.12494 -0.117641 -0.110342 -0.103043 -0.0957445 -0.0884455 -0.0811465 -0.0738476 -0.0665486 -0.0592497 -0.0519507 -0.0446517 -0.0373528 -0.0300538 -0.0227548 -0.0154559 -0.00815693 -0.000857967 0.00644099 0.01374 0.0210389 0.0283379 0.0356368 0.0429358 0.0502348 0.0575337 0.0648327 0.0721316 0.0794306 0.0867296 0.0940285 0.101327 0.108626 0.115925 0.123224 0.130523 0.137822 0.145121 0.15242 0.159719 0.167018 0.174317 0.181616 0.188915 0.196214 0.203513 0.210812 0.218111 0.22541 0.232709 0.240008 0.247307 0.254606 0.261905 0.269204 0.276502 0.283801 0.2911 0.298399 0.305698 0.312997 0.320296 0.327595 0.334894 0.342193 0.349492 0.356791 0.36409 0.371389 0.378688 0.385987 0.393286 0.400585 0.407884 0.415182 0.422481 0.42978 0.437079 0.444378 0.451677 0.458976 0.466275 0.473574 0.480873 0.488172 0.495471 0.50277 0.510069 0.517368 0.524667 0.531966 0.539265 0.546564 0.553862 0.561161 0.568403 0.575451 0.582305 0.588966 0.595432 0.601705 0.607784 0.61367 0.619362 0.624862 0.630168 0.63528 0.6402 0.644928 0.649463 0.653806 0.657957 0.661916 0.665684 0.669261 0.672647 0.675842 0.678848 0.681663 0.68429 0.686727 0.688976 0.691037 0.692911 0.694597 0.696097 0.697411 0.69854 0.699484 0.700244 0.70082 0.701213 0.701425 0.701454 0.701303 0.700972 0.700462 0.699774 0.698908 0.697865 0.696646 0.695252 0.693685 0.691944 0.690031 0.687946 0.685692 0.683268 0.680677 0.677918 0.674994 0.671904 0.668651 0.665236 0.661659 0.657922 0.654027 0.649974 0.645764 0.6414 0.636882 0.632212 0.627391 0.622421 0.617302 0.612037 0.606692 0.601337 0.595972 0.590598 0.585214 0.579821 0.574417 0.569004 0.56358 0.558147 0.552703 0.54725 0.541787 0.536313 0.53083 0.525336 0.519832 0.514318 0.508794 0.50326 0.497716 0.492162 0.486597 0.481022 0.475438 0.469843 0.464238 0.458623 0.452999 0.447364 0.441719 0.436065 0.4304 0.424726 0.419042 0.413348 0.407645 0.401932 0.39621 0.390478 0.384737 0.378986 0.373226 0.367457 0.361679 0.355891 0.350095 0.34429 0.338476 0.332654 0.326823 0.320983 0.315136 0.30928 0.303415 0.297543 0.291663 0.285775 0.279879 0.273976 0.268065 0.262147 0.256222 0.25029 0.244351 0.238405 0.232453 0.226494 0.220528 0.214557 0.208579 0.202596 0.196607 0.190612 0.184612 0.178607 0.172597 0.166582 0.160562 0.154537 0.148508 0.142475 0.136438 0.130397 0.124353 0.118305 0.112253 0.106199 0.100141 0.0940813 0.0880188 0.0819539 0.0758868 0.0698179 0.0637472 0.057675 0.0516014 0.0455267 0.0394512 0.0333749 0.0272982 0.0212211 0.015144 0.00906699 0.00299037 -0.00308567 -0.00916093 -0.0152352 -0.0213082 -0.0273798 -0.0334498 -0.0395178 -0.0455838 -0.0516474 -0.0577085 -0.0637668 -0.0698221 -0.0758742 -0.0819228 -0.0879677 -0.0940088 -0.100046 -0.106078 -0.112106 -0.118129 -0.124148 -0.130161 -0.136168 -0.14217 -0.148165 -0.154155 -0.160138 -0.166114 -0.172084 -0.178047 -0.184002 -0.18995 -0.19589 -0.201822 -0.207745 -0.213661 -0.219567 -0.225465 -0.231353 -0.237233 -0.243102 -0.248962 -0.254812 -0.260652 -0.266481 -0.2723 -0.278108 -0.283904 -0.28969 -0.295463 -0.301226 -0.306976 -0.312714 -0.318439 -0.324153 -0.329853 -0.33554 -0.341214 -0.346875 -0.352523 -0.358156 -0.363776 -0.369381 -0.374972 -0.380548 -0.38611 -0.391657 -0.397189 -0.402705 -0.408206 -0.413691 -0.419161 -0.424614 -0.430052 -0.435472 -0.440877 -0.446265 -0.451636 -0.45699 -0.46227 -0.467291 -0.472052 -0.476557 -0.480807 -0.484804 -0.48855 -0.492048 -0.495298 -0.498304 -0.501067 -0.503589 -0.505873 -0.507919 -0.509731 -0.51131 -0.512658 -0.513777 -0.514669 -0.515337 -0.515782 -0.516007 -0.516013 -0.515802 -0.515377 -0.514739 -0.513891 -0.512835 -0.511573 -0.510106 -0.508438 -0.50657 -0.504504 -0.502242 -0.499787 -0.497141 -0.494305 -0.491283 -0.488076 -0.484686 -0.481116 -0.477367 -0.473442 -0.469344 -0.465074 -0.460635 -0.456028 -0.451257 -0.446323 -0.441229 -0.435977 -0.430569 -0.425008 -0.419295 -0.413434 -0.407427 -0.401275 -0.394981 -0.388549 -0.381979 -0.375274 -0.368437 -0.36147 -0.354375 -0.347156 -0.339857 -0.332558 -0.325259 -0.31796 -0.310661 -0.303362 -0.296063 -0.288764 -0.281465 -0.274166 -0.266867 -0.259568 -0.25227 -0.244971 -0.237672 -0.230373 -0.223074 -0.215775 -0.208476 -0.201177 -0.193878 -0.186579 -0.17928 -0.171981 -0.164682 -0.157383 -0.150084 -0.142785 -0.135486 -0.128187 -0.120888 -0.113589 -0.10629 -0.0989913 -0.0916924 -0.0843934 -0.0770945 -0.0697955 -0.0624965 -0.0551976 -0.0478986 -0.0405997 -0.0333007 -0.0260017 -0.0187028 -0.0114038 -0.00410485 0.00319411 0.0104931 0.017792 0.025091 0.03239 0.0396889 0.0469879 0.0542868 0.0615858 0.0688848 0.0761837 0.0834827 0.0907816 0.0980806 0.10538 0.112679 0.119977 0.127276 0.134575 0.141874 0.149173 0.156472 0.163771 0.17107 0.178369 0.185668 0.192967 0.200266 0.207565 0.214864 0.222163 0.229462 0.236761 0.24406 0.251359 0.258658 0.265957 0.273256 0.280555 0.287854 0.295152 0.302451 0.30975 0.317049 0.324348 0.331647 0.338946 0.346245 0.353544 0.360843 0.368142 0.375441 0.38274 0.390039 0.397338 0.404637 0.411936 0.419235 0.426533 0.433832 0.441131 0.44843 0.455729 0.463028 0.470327 0.477626 0.484925 0.492224 0.499523 0.506822 0.514121 0.52142 0.528719 0.536018 0.543317 0.550616 0.557915 0.565214 0.572347 0.579287 0.586034 0.592586 0.598945 0.605111 0.611082 0.61686 0.622445 0.627837 0.633035 0.638041 0.642854 0.647475 0.651903 0.656139 0.660184 0.664036 0.667698 0.671169 0.674449 0.677538 0.680438 0.683149 0.68567 0.688003 0.690147 0.692104 0.693873 0.695456 0.696853 0.698064 0.69909 0.699931 0.700589 0.701063 0.701356 0.701466 0.701395 0.701144 0.700714 0.700104 0.699317 0.698352 0.697212 0.695896 0.694405 0.692741 0.690904 0.688896 0.686717 0.684368 0.681851 0.679167 0.676316 0.673299 0.670119 0.666776 0.66327 0.659605 0.655779 0.651796 0.647656 0.643361 0.638911 0.634308 0.629554 0.62465 0.619597 0.614397 0.609056 0.603705 0.598345 0.592975 0.587595 0.582206 0.576807 0.571398 0.565979 0.56055 0.555111 0.549662 0.544203 0.538734 0.533255 0.527766 0.522267 0.516757 0.511238 0.505708 0.500169 0.494619 0.489059 0.483489 0.477908 0.472318 0.466718 0.461108 0.455487 0.449857 0.444217 0.438567 0.432907 0.427237 0.421557 0.415868 0.410169 0.40446 0.398742 0.393014 0.387277 0.38153 0.375775 0.37001 0.364235 0.358452 0.35266 0.346859 0.341049 0.33523 0.329403 0.323568 0.317723 0.311871 0.30601 0.300142 0.294265 0.288381 0.282488 0.276588 0.270681 0.264766 0.258844 0.252915 0.246979 0.241036 0.235087 0.229131 0.223168 0.2172 0.211225 0.205244 0.199257 0.193265 0.187268 0.181265 0.175257 0.169244 0.163226 0.157203 0.151176 0.145145 0.13911 0.133071 0.127028 0.120981 0.114931 0.108878 0.102822 0.0967633 0.0907019 0.084638 0.0785719 0.0725038 0.0664338 0.0603623 0.0542893 0.0482151 0.04214 0.036064 0.0299874 0.0239105 0.0178334 0.0117564 0.00567956 -0.000396765 -0.0064724 -0.0125471 -0.0186207 -0.024693 -0.0307636 -0.0368325 -0.0428995 -0.0489641 -0.0550263 -0.0610859 -0.0671425 -0.073196 -0.0792462 -0.0852928 -0.0913357 -0.0973744 -0.103409 -0.109439 -0.115464 -0.121485 -0.1275 -0.13351 -0.139514 -0.145512 -0.151505 -0.157491 -0.16347 -0.169443 -0.175409 -0.181367 -0.187318 -0.193262 -0.199197 -0.205125 -0.211044 -0.216954 -0.222856 -0.228748 -0.234632 -0.240506 -0.24637 -0.252224 -0.258069 -0.263903 -0.269726 -0.275539 -0.28134 -0.287131 -0.29291 -0.298677 -0.304432 -0.310176 -0.315907 -0.321626 -0.327332 -0.333025 -0.338705 -0.344372 -0.350025 -0.355665 -0.36129 -0.366902 -0.372499 -0.378082 -0.383651 -0.389204 -0.394742 -0.400266 -0.405774 -0.411266 -0.416742 -0.422203 -0.427647 -0.433076 -0.438487 -0.443883 -0.449261 -0.454623 -0.459967 -0.465103 -0.469979 -0.474597 -0.47896 -0.483069 -0.486926 -0.490534 -0.493894 -0.497008 -0.499878 -0.502507 -0.504896 -0.507048 -0.508963 -0.510645 -0.512095 -0.513316 -0.514309 -0.515076 -0.51562 -0.515942 -0.516045 -0.51593 -0.515599 -0.515056 -0.514301 -0.513337 -0.512166 -0.51079 -0.509211 -0.507431 -0.505453 -0.503278 -0.500908 -0.498347 -0.495595 -0.492655 -0.48953 -0.486221 -0.48273 -0.47906 -0.475214 -0.471192 -0.466998 -0.462634 -0.458101 -0.453403 -0.448541 -0.443518 -0.438335 -0.432996 -0.427503 -0.421857 -0.416062 -0.410119 -0.404031 -0.3978 -0.391429 -0.384919 -0.378274 -0.371496 -0.364586 -0.357548 -0.350384 -0.343095 -0.335797 -0.328498 -0.321199 -0.3139 -0.306601 -0.299302;
-#X coords 0 1 999 -1 500 140 1 0 0;
-#X restore 404 384 graph;
#X floatatom 35 96 5 0 0 0 - - - 0;
#X obj 81 478 tabwrite~ \$0-graph;
#X obj 107 447 metro 500;
@@ -50,10 +45,6 @@
#X obj 88 99 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
#X obj 88 126 metro 500;
#X obj 88 156 s \$0-testpulse;
-#N canvas 0 50 450 250 (subpatch) 0;
-#X array \$0-test-in 20000 float 0;
-#X coords 0 1 19999 -1 500 140 1 0 0;
-#X restore 33 240 graph;
#N canvas 323 324 347 253 resize 0;
#X obj 83 52 inlet;
#X msg 83 79 resize \$1;
@@ -65,67 +56,54 @@
#X connect 1 0 3 0;
#X connect 1 0 4 0;
#X restore 607 610 pd resize;
-#X msg 623 579 20000;
-#N canvas 0 50 450 250 (subpatch) 0;
-#X array \$0-slop-out 20000 float 0;
-#X coords 0 1 19999 0 500 70 1 0 0;
-#X restore 33 410 graph;
-#N canvas 0 50 450 250 (subpatch) 0;
-#X array \$0-compander-out 20000 float 0;
-#X coords 0 1 19999 -1 500 140 1 0 0;
-#X restore 33 511 graph;
-#N canvas 0 50 450 250 (subpatch) 0;
-#X array \$0-dynamic-curve 102 float 1;
-#A 0 0 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 100;
-#X coords 0 100 101 0 202 200 1 0 0;
-#X restore 672 110 graph;
-#N canvas 455 23 698 706 parameters 0;
-#X obj 161 22 inlet;
-#X obj 29 60 r \$0-limit;
-#X obj 37 83 r \$0-knee;
-#X obj 45 106 r \$0-boost;
-#X obj 61 150 r \$0-thresh;
-#X obj 54 128 r \$0-ratio;
-#X obj 29 186 t b b;
-#X obj 29 236 until;
-#X obj 87 263 + 1;
-#X msg 78 233 0;
-#X obj 96 677 tabwrite \$0-dynamic-curve, f 52;
-#X obj 472 455 moses;
-#X obj 543 405 r \$0-thresh;
-#X obj 605 442 r \$0-ratio;
-#X obj 605 469 f;
-#X obj 605 494 / 100;
-#X obj 96 623 +;
-#X msg 504 481 0;
-#X obj 482 548 expr ($f1-$f2)*$f3;
-#X obj 96 648 max 0;
-#X obj 605 519 - 1;
-#X obj 29 346 +;
-#X obj 47 322 r \$0-boost;
-#X obj 137 322 r \$0-limit;
-#X obj 119 355 f;
-#X obj 137 380 -;
-#X obj 29 372 t f b;
-#X obj 271 322 r \$0-knee;
-#X obj 182 448 +;
-#X obj 61 422 -;
-#X obj 29 449 moses;
-#X obj 96 479 moses;
-#X obj 123 543 b;
-#X obj 359 476 r \$0-limit;
-#X obj 143 576 f;
-#X obj 96 511 expr $f4 - ($f2-$f1)*($f2-$f1)/(4*$f3);
-#X obj 51 490 +;
-#X msg 29 211 102;
-#X obj 271 348 f;
-#X obj 271 373 / 2;
-#X obj 155 355 r \$0-boost;
-#X obj 86 447 r \$0-boost;
-#X obj 29 294 trigger float float, f 61;
-#X obj 161 542 r \$0-limit;
-#X obj 29 261 float;
-#X obj 161 57 unpack f f f f f f;
+#X msg 624 579 20000;
+#N canvas 455 23 698 690 parameters 0;
+#X obj 191 14 inlet;
+#X obj 29 32 r \$0-limit;
+#X obj 37 55 r \$0-knee;
+#X obj 45 78 r \$0-boost;
+#X obj 61 122 r \$0-thresh;
+#X obj 54 100 r \$0-ratio;
+#X obj 29 158 t b b;
+#X obj 29 208 until;
+#X obj 87 235 + 1;
+#X msg 78 205 0;
+#X obj 96 649 tabwrite \$0-dynamic-curve, f 52;
+#X obj 472 427 moses;
+#X obj 543 377 r \$0-thresh;
+#X obj 605 414 r \$0-ratio;
+#X obj 605 441 f;
+#X obj 605 466 / 100;
+#X obj 96 595 +;
+#X msg 504 453 0;
+#X obj 482 520 expr ($f1-$f2)*$f3;
+#X obj 96 620 max 0;
+#X obj 605 491 - 1;
+#X obj 29 318 +;
+#X obj 47 294 r \$0-boost;
+#X obj 137 294 r \$0-limit;
+#X obj 119 327 f;
+#X obj 137 352 -;
+#X obj 29 344 t f b;
+#X obj 271 294 r \$0-knee;
+#X obj 182 420 +;
+#X obj 61 394 -;
+#X obj 29 421 moses;
+#X obj 96 451 moses;
+#X obj 123 515 b;
+#X obj 359 448 r \$0-limit;
+#X obj 143 548 f;
+#X obj 96 483 expr $f4 - ($f2-$f1)*($f2-$f1)/(4*$f3);
+#X obj 51 462 +;
+#X msg 29 183 102;
+#X obj 271 320 f;
+#X obj 271 345 / 2;
+#X obj 155 327 r \$0-boost;
+#X obj 86 419 r \$0-boost;
+#X obj 29 266 trigger float float, f 61;
+#X obj 161 514 r \$0-limit;
+#X obj 29 233 float;
+#X obj 191 49 unpack f f f f f f;
#N canvas 416 159 334 253 set-speed 0;
#X msg 115 81 set \$1;
#X obj 95 43 inlet;
@@ -134,7 +112,7 @@
#X connect 0 0 2 0;
#X connect 1 0 0 0;
#X connect 1 0 3 0;
-#X restore 284 84 pd set-speed;
+#X restore 314 76 pd set-speed;
#N canvas 416 159 334 253 set-thresh 0;
#X msg 115 81 set \$1;
#X obj 95 43 inlet;
@@ -143,7 +121,7 @@
#X connect 0 0 2 0;
#X connect 1 0 0 0;
#X connect 1 0 3 0;
-#X restore 259 111 pd set-thresh;
+#X restore 289 103 pd set-thresh;
#N canvas 416 159 334 253 set-ratio 0;
#X msg 115 81 set \$1;
#X obj 95 43 inlet;
@@ -152,7 +130,7 @@
#X connect 0 0 2 0;
#X connect 1 0 0 0;
#X connect 1 0 3 0;
-#X restore 234 137 pd set-ratio;
+#X restore 264 129 pd set-ratio;
#N canvas 416 159 334 253 set-boost 0;
#X msg 115 81 set \$1;
#X obj 95 43 inlet;
@@ -161,7 +139,7 @@
#X connect 0 0 2 0;
#X connect 1 0 0 0;
#X connect 1 0 3 0;
-#X restore 210 164 pd set-boost;
+#X restore 240 156 pd set-boost;
#N canvas 416 159 334 253 set-knee 0;
#X msg 115 81 set \$1;
#X obj 95 43 inlet;
@@ -170,7 +148,7 @@
#X connect 0 0 2 0;
#X connect 1 0 0 0;
#X connect 1 0 3 0;
-#X restore 185 188 pd set-knee;
+#X restore 215 180 pd set-knee;
#N canvas 416 159 334 253 set-limit 0;
#X msg 115 81 set \$1;
#X obj 95 43 inlet;
@@ -179,7 +157,7 @@
#X connect 0 0 2 0;
#X connect 1 0 0 0;
#X connect 1 0 3 0;
-#X restore 161 212 pd set-limit;
+#X restore 191 204 pd set-limit;
#X connect 0 0 45 0;
#X connect 1 0 6 0;
#X connect 2 0 6 0;
@@ -244,13 +222,13 @@
#X connect 45 4 47 0;
#X connect 45 5 46 0;
#X restore 719 530 pd parameters;
-#X floatatom 618 340 3 0 100 0 limit \$0-limit-set \$0-limit 0;
-#X floatatom 618 361 3 0 20 0 knee \$0-knee-set \$0-knee 0;
-#X floatatom 618 382 3 0 50 0 boost \$0-boost-set \$0-boost 0;
-#X floatatom 618 403 3 0 200 0 ratio \$0-ratio-set \$0-ratio 0;
-#X floatatom 618 425 3 0 100 0 thresh \$0-thresh-set \$0-thresh 0;
-#X floatatom 618 446 3 0 200 0 speed \$0-speed-set \$0-speed 0;
-#N canvas 298 103 615 643 run-compander 0;
+#X floatatom 618 340 4 0 100 0 limit \$0-limit-set \$0-limit 0;
+#X floatatom 618 361 4 0 20 0 knee \$0-knee-set \$0-knee 0;
+#X floatatom 618 382 4 0 50 0 boost \$0-boost-set \$0-boost 0;
+#X floatatom 618 403 4 0 200 0 ratio \$0-ratio-set \$0-ratio 0;
+#X floatatom 618 425 4 0 100 0 thresh \$0-thresh-set \$0-thresh 0;
+#X floatatom 618 446 4 0 200 0 speed \$0-speed-set \$0-speed 0;
+#N canvas 403 113 573 630 run-compander 0;
#X obj 47 20 inlet~;
#X obj 83 174 slop~ 0 0 0 0 1e+09;
#X obj 161 82 r \$0-speed;
@@ -288,8 +266,8 @@
#X connect 13 0 14 0;
#X connect 13 0 15 0;
#X restore 221 149 pd run-compander;
-#X msg 615 551 2000;
-#X msg 606 525 300;
+#X msg 616 551 2000;
+#X msg 607 525 300;
#X msg 730 424 100 0 0 200 100 100;
#X msg 710 368 100 0 0 100 0 50;
#X text 831 367 no change;
@@ -340,69 +318,94 @@
#X msg 458 152 \; pd dsp \$1;
#X obj 458 117 set-dsp-tgl;
#X text 489 121 DSP on/off;
-#X connect 0 0 17 0;
-#X connect 0 0 30 0;
+#X obj 34 241 cnv 19 498 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#X obj 34 411 cnv 19 498 68 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 250 (subpatch) 0;
+#X array \$0-test-in 20000 float 2;
+#X coords 0 1 20000 -1 500 140 1 0 0;
+#X restore 33 240 graph;
+#N canvas 0 50 450 250 (subpatch) 0;
+#X array \$0-slop-out 20000 float 2;
+#X coords 0 1 20000 0 500 70 1 0 0;
+#X restore 33 410 graph;
+#X obj 34 512 cnv 19 498 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 250 (subpatch) 0;
+#X array \$0-compander-out 20000 float 2;
+#X coords 0 1 20000 -1 500 140 1 0 0;
+#X restore 33 511 graph;
+#X obj 673 111 cnv 19 198 198 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 250 (subpatch) 0;
+#X array \$0-dynamic-curve 102 float 0;
+#X coords 0 100 101 0 200 200 1 0 0;
+#X restore 672 110 graph;
+#X connect 0 0 13 0;
+#X connect 0 0 26 0;
#X connect 1 0 2 0;
#X connect 2 0 3 0;
-#X connect 6 0 5 0;
-#X connect 17 0 31 0;
-#X connect 18 0 5 0;
-#X connect 19 0 5 0;
-#X connect 20 0 10 0;
-#X connect 21 0 10 0;
-#X connect 27 0 10 0;
-#X connect 28 0 10 0;
-#X connect 29 0 10 0;
-#X connect 33 0 21 0;
-#X connect 36 0 35 0;
+#X connect 5 0 4 0;
+#X connect 13 0 27 0;
+#X connect 14 0 4 0;
+#X connect 15 0 4 0;
+#X connect 16 0 6 0;
+#X connect 17 0 6 0;
+#X connect 23 0 6 0;
+#X connect 24 0 6 0;
+#X connect 25 0 6 0;
+#X connect 29 0 17 0;
+#X connect 32 0 31 0;
#X restore 704 301 pd compander-limiter;
-#N canvas 443 136 904 478 slew-limiter 0;
-#X floatatom 106 123 5 0 1000 0 - - - 0;
-#X obj 106 147 t f b;
-#X obj 138 176 samplerate~;
-#X obj 106 176 /;
-#X obj 80 381 metro 500;
+#N canvas 392 78 904 478 slew-limiter 0;
+#X floatatom 134 96 5 0 1000 0 - - - 0;
+#X obj 134 120 t f b;
+#X obj 166 149 samplerate~;
+#X obj 134 149 /;
+#X obj 78 378 metro 500;
#X obj 54 412 tabwrite~ \$0-slew-graph;
+#X floatatom 214 217 5 0 1000 0 - - - 0;
+#X obj 214 241 t f b;
+#X obj 246 269 samplerate~;
+#X obj 214 270 /;
+#X obj 54 201 osc~ 100;
+#X text 437 234 See the HTML documentation (link on main page of this patch) for details.;
+#X text 437 164 Here the maximum slope of the 100-Hz. sinusoid is 200pi \, about 628.3. Setting upward or downward slew limits below that will replace the waveform with straight line segments on the way up and/or down., f 60;
+#X text 182 95 max downward slope;
+#X text 262 216 max upward slope;
+#X text 437 31 The slew limiter is a filter whose cutoff frequency is infinite (so that the output follows the input exactly) unless the input varies from the previous output by more than the highest slope we allow (the slew limit) times the sample period (i.e. \, the maximum variation allowed over the space of a sample). This limit is therefore in units of amplitude per sample. The number boxes specify amplitude change per second \, which we divide by the sample rate to convert to the units needed by [slop~]., f 60;
+#X obj 78 336 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 102 335 <- start metronome to graph output, f 18;
+#X text 83 27 Using [slop~] to make a slew limiter;
+#X msg 261 388 \; pd dsp \$1;
+#X obj 261 353 set-dsp-tgl;
+#X text 291 357 DSP on/off;
+#X obj 393 307 cnv 19 498 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
#N canvas 0 50 450 250 (subpatch) 0;
#X array \$0-slew-graph 1000 float 0;
#X coords 0 1 999 -1 500 140 1 0 0;
#X restore 392 306 graph;
-#X floatatom 158 211 5 0 1000 0 - - - 0;
-#X obj 158 235 t f b;
-#X obj 190 263 samplerate~;
-#X obj 158 264 /;
-#X obj 54 302 slop~ 1e+09 0 0 0 0;
-#X obj 54 81 osc~ 100;
-#X text 437 234 See the HTML documentation (link on main page of this patch) for details.;
-#X text 437 164 Here the maximum slope of the 100-Hz. sinusoid is 200pi \, about 628.3. Setting upward or downward slew limits below that will replace the waveform with straight line segments on the way up and/or down., f 60;
-#X text 154 122 max downward slope;
-#X text 206 210 max upward slope;
-#X text 437 31 The slew limiter is a filter whose cutoff frequency is infinite (so that the output follows the input exactly) unless the input varies from the previous output by more than the highest slope we allow (the slew limit) times the sample period (i.e. \, the maximum variation allowed over the space of a sample). This limit is therefore in units of amplitude per sample. The number boxes specify amplitude change per second \, which we divide by the sample rate to convert to the units needed by [slop~]., f 60;
-#X obj 80 336 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 104 335 <- start metronome to graph output, f 18;
-#X text 55 39 Using [slop~] to make a slew limiter;
-#X msg 265 374 \; pd dsp \$1;
-#X obj 265 339 set-dsp-tgl;
-#X text 296 343 DSP on/off;
+#X obj 137 69 hsl 162 19 628.3 100 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1;
+#X obj 217 191 hsl 162 19 628.3 100 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1;
+#X obj 54 302 slop~ 1e+09 0.0142 0 0.0142 0;
#X connect 0 0 1 0;
#X connect 1 0 3 0;
#X connect 1 1 2 0;
#X connect 2 0 3 1;
-#X connect 3 0 11 2;
+#X connect 3 0 26 2;
#X connect 4 0 5 0;
-#X connect 7 0 8 0;
-#X connect 8 0 10 0;
-#X connect 8 1 9 0;
-#X connect 9 0 10 1;
-#X connect 10 0 11 4;
-#X connect 11 0 5 0;
-#X connect 12 0 11 0;
-#X connect 18 0 4 0;
-#X connect 22 0 21 0;
+#X connect 6 0 7 0;
+#X connect 7 0 9 0;
+#X connect 7 1 8 0;
+#X connect 8 0 9 1;
+#X connect 9 0 26 4;
+#X connect 10 0 26 0;
+#X connect 16 0 4 0;
+#X connect 20 0 19 0;
+#X connect 24 0 0 0;
+#X connect 25 0 6 0;
+#X connect 26 0 5 0;
#X restore 704 249 pd slew-limiter;
-#N canvas 535 70 763 564 peak-meter 0;
+#N canvas 420 78 763 564 peak-meter 0;
#X floatatom 217 132 5 0 50 0 - \$0-decay-speed-init - 0;
-#N canvas 392 300 639 450 generate-test 0;
+#N canvas 422 246 639 450 generate-test 0;
#X obj 45 196 osc~ 440;
#X msg 98 166 -0.25;
#X obj 165 239 *~;
@@ -501,10 +504,6 @@
#X floatatom 132 194 5 0 100 0 - - - 0;
#X obj 95 354 metro 500;
#X obj 95 308 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#N canvas 0 50 450 250 (subpatch) 0;
-#X array \$0-jitter-graph 1000 float 0;
-#X coords 0 1 999 -1 500 140 1 0 0;
-#X restore 305 262 graph;
#X obj 69 70 osc~ 100;
#X obj 69 385 tabwrite~ \$0-jitter-graph;
#X obj 69 101 clip~ -0.3 0.3;
@@ -521,18 +520,23 @@
#X msg 281 108 \; pd dsp \$1;
#X obj 281 73 set-dsp-tgl;
#X text 312 77 DSP on/off;
-#X connect 0 0 11 0;
-#X connect 1 0 5 0;
+#X obj 306 263 cnv 19 498 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 250 (subpatch) 0;
+#X array \$0-jitter-graph 1000 float 0;
+#X coords 0 1 999 -1 500 140 1 0 0;
+#X restore 305 262 graph;
+#X connect 0 0 10 0;
+#X connect 1 0 4 0;
#X connect 2 0 1 0;
-#X connect 4 0 6 0;
-#X connect 6 0 9 0;
-#X connect 7 0 8 0;
-#X connect 8 0 9 1;
-#X connect 9 0 10 0;
-#X connect 10 0 5 0;
-#X connect 11 0 10 2;
-#X connect 11 0 10 4;
-#X connect 18 0 17 0;
+#X connect 3 0 5 0;
+#X connect 5 0 8 0;
+#X connect 6 0 7 0;
+#X connect 7 0 8 1;
+#X connect 8 0 9 0;
+#X connect 9 0 4 0;
+#X connect 10 0 9 2;
+#X connect 10 0 9 4;
+#X connect 17 0 16 0;
#X restore 704 329 pd jitter-remover;
#X text 699 223 Examples:;
#X text 22 565 see also:;
@@ -585,23 +589,29 @@
#X text 518 106 The [slop~] object is a low-pass filter whose frequency response (i.e. \, reaction speed) can vary according to the filter's state. It can be useful for slew limiting \, dynamics processing (companders/limiters/noise gates) \, and soft saturation. Examples below are explained in the HTML reference (linked above)., f 55;
#X text 133 399 <- start metronome to graph output, f 18;
#X text 459 14 <- Open HTML reference;
-#X text 704 564 updated for Pd version 0.5;
#X text 84 43 - slew-limiting / low-pass filter;
#X msg 252 489 \; pd dsp \$1;
#X obj 252 454 set-dsp-tgl;
#X text 283 458 DSP on/off;
-#X connect 0 0 12 0;
-#X connect 2 0 0 0;
+#X obj 405 385 cnv 19 498 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 250 (subpatch) 0;
+#X array \$0-graph 1000 float 1;
+#A 0 -0.239854 -0.245719 -0.251574 -0.25742 -0.263255 -0.269079 -0.274893 -0.280696 -0.286488 -0.292268 -0.298037 -0.303793 -0.309538 -0.315271 -0.320991 -0.326698 -0.332393 -0.338074 -0.343743 -0.349397 -0.355039 -0.360666 -0.366279 -0.371878 -0.377463 -0.383033 -0.388588 -0.394128 -0.399653 -0.405162 -0.410656 -0.416135 -0.421597 -0.427043 -0.432473 -0.437887 -0.443284 -0.448664 -0.454028 -0.459374 -0.464539 -0.469444 -0.474091 -0.478482 -0.482619 -0.486504 -0.49014 -0.493527 -0.496669 -0.499566 -0.502222 -0.504637 -0.506815 -0.508757 -0.510465 -0.511941 -0.513187 -0.514205 -0.514997 -0.515566 -0.515913 -0.51604 -0.515949 -0.515643 -0.515123 -0.514391 -0.51345 -0.512302 -0.510949 -0.509392 -0.507635 -0.505678 -0.503525 -0.501178 -0.498637 -0.495907 -0.492988 -0.489883 -0.486594 -0.483123 -0.479474 -0.475646 -0.471644 -0.467469 -0.463124 -0.45861 -0.45393 -0.449086 -0.444081 -0.438916 -0.433594 -0.428118 -0.422489 -0.41671 -0.410784 -0.404712 -0.398497 -0.392141 -0.385647 -0.379017 -0.372253 -0.365358 -0.358334 -0.351183 -0.343909 -0.33661 -0.329311 -0.322012 -0.314713 -0.307414 -0.300115 -0.292816 -0.285517 -0.278218 -0.27092 -0.263621 -0.256322 -0.249023 -0.241724 -0.234425 -0.227126 -0.219827 -0.212528 -0.205229 -0.19793 -0.190631 -0.183332 -0.176033 -0.168734 -0.161435 -0.154136 -0.146837 -0.139538 -0.132239 -0.12494 -0.117641 -0.110342 -0.103043 -0.0957445 -0.0884455 -0.0811465 -0.0738476 -0.0665486 -0.0592497 -0.0519507 -0.0446517 -0.0373528 -0.0300538 -0.0227548 -0.0154559 -0.00815693 -0.000857967 0.00644099 0.01374 0.0210389 0.0283379 0.0356368 0.0429358 0.0502348 0.0575337 0.0648327 0.0721316 0.0794306 0.0867296 0.0940285 0.101327 0.108626 0.115925 0.123224 0.130523 0.137822 0.145121 0.15242 0.159719 0.167018 0.174317 0.181616 0.188915 0.196214 0.203513 0.210812 0.218111 0.22541 0.232709 0.240008 0.247307 0.254606 0.261905 0.269204 0.276502 0.283801 0.2911 0.298399 0.305698 0.312997 0.320296 0.327595 0.334894 0.342193 0.349492 0.356791 0.36409 0.371389 0.378688 0.385987 0.393286 0.400585 0.407884 0.415182 0.422481 0.42978 0.437079 0.444378 0.451677 0.458976 0.466275 0.473574 0.480873 0.488172 0.495471 0.50277 0.510069 0.517368 0.524667 0.531966 0.539265 0.546564 0.553862 0.561161 0.568403 0.575451 0.582305 0.588966 0.595432 0.601705 0.607784 0.61367 0.619362 0.624862 0.630168 0.63528 0.6402 0.644928 0.649463 0.653806 0.657957 0.661916 0.665684 0.669261 0.672647 0.675842 0.678848 0.681663 0.68429 0.686727 0.688976 0.691037 0.692911 0.694597 0.696097 0.697411 0.69854 0.699484 0.700244 0.70082 0.701213 0.701425 0.701454 0.701303 0.700972 0.700462 0.699774 0.698908 0.697865 0.696646 0.695252 0.693685 0.691944 0.690031 0.687946 0.685692 0.683268 0.680677 0.677918 0.674994 0.671904 0.668651 0.665236 0.661659 0.657922 0.654027 0.649974 0.645764 0.6414 0.636882 0.632212 0.627391 0.622421 0.617302 0.612037 0.606692 0.601337 0.595972 0.590598 0.585214 0.579821 0.574417 0.569004 0.56358 0.558147 0.552703 0.54725 0.541787 0.536313 0.53083 0.525336 0.519832 0.514318 0.508794 0.50326 0.497716 0.492162 0.486597 0.481022 0.475438 0.469843 0.464238 0.458623 0.452999 0.447364 0.441719 0.436065 0.4304 0.424726 0.419042 0.413348 0.407645 0.401932 0.39621 0.390478 0.384737 0.378986 0.373226 0.367457 0.361679 0.355891 0.350095 0.34429 0.338476 0.332654 0.326823 0.320983 0.315136 0.30928 0.303415 0.297543 0.291663 0.285775 0.279879 0.273976 0.268065 0.262147 0.256222 0.25029 0.244351 0.238405 0.232453 0.226494 0.220528 0.214557 0.208579 0.202596 0.196607 0.190612 0.184612 0.178607 0.172597 0.166582 0.160562 0.154537 0.148508 0.142475 0.136438 0.130397 0.124353 0.118305 0.112253 0.106199 0.100141 0.0940813 0.0880188 0.0819539 0.0758868 0.0698179 0.0637472 0.057675 0.0516014 0.0455267 0.0394512 0.0333749 0.0272982 0.0212211 0.015144 0.00906699 0.00299037 -0.00308567 -0.00916093 -0.0152352 -0.0213082 -0.0273798 -0.0334498 -0.0395178 -0.0455838 -0.0516474 -0.0577085 -0.0637668 -0.0698221 -0.0758742 -0.0819228 -0.0879677 -0.0940088 -0.100046 -0.106078 -0.112106 -0.118129 -0.124148 -0.130161 -0.136168 -0.14217 -0.148165 -0.154155 -0.160138 -0.166114 -0.172084 -0.178047 -0.184002 -0.18995 -0.19589 -0.201822 -0.207745 -0.213661 -0.219567 -0.225465 -0.231353 -0.237233 -0.243102 -0.248962 -0.254812 -0.260652 -0.266481 -0.2723 -0.278108 -0.283904 -0.28969 -0.295463 -0.301226 -0.306976 -0.312714 -0.318439 -0.324153 -0.329853 -0.33554 -0.341214 -0.346875 -0.352523 -0.358156 -0.363776 -0.369381 -0.374972 -0.380548 -0.38611 -0.391657 -0.397189 -0.402705 -0.408206 -0.413691 -0.419161 -0.424614 -0.430052 -0.435472 -0.440877 -0.446265 -0.451636 -0.45699 -0.46227 -0.467291 -0.472052 -0.476557 -0.480807 -0.484804 -0.48855 -0.492048 -0.495298 -0.498304 -0.501067 -0.503589 -0.505873 -0.507919 -0.509731 -0.51131 -0.512658 -0.513777 -0.514669 -0.515337 -0.515782 -0.516007 -0.516013 -0.515802 -0.515377 -0.514739 -0.513891 -0.512835 -0.511573 -0.510106 -0.508438 -0.50657 -0.504504 -0.502242 -0.499787 -0.497141 -0.494305 -0.491283 -0.488076 -0.484686 -0.481116 -0.477367 -0.473442 -0.469344 -0.465074 -0.460635 -0.456028 -0.451257 -0.446323 -0.441229 -0.435977 -0.430569 -0.425008 -0.419295 -0.413434 -0.407427 -0.401275 -0.394981 -0.388549 -0.381979 -0.375274 -0.368437 -0.36147 -0.354375 -0.347156 -0.339857 -0.332558 -0.325259 -0.31796 -0.310661 -0.303362 -0.296063 -0.288764 -0.281465 -0.274166 -0.266867 -0.259568 -0.25227 -0.244971 -0.237672 -0.230373 -0.223074 -0.215775 -0.208476 -0.201177 -0.193878 -0.186579 -0.17928 -0.171981 -0.164682 -0.157383 -0.150084 -0.142785 -0.135486 -0.128187 -0.120888 -0.113589 -0.10629 -0.0989913 -0.0916924 -0.0843934 -0.0770945 -0.0697955 -0.0624965 -0.0551976 -0.0478986 -0.0405997 -0.0333007 -0.0260017 -0.0187028 -0.0114038 -0.00410485 0.00319411 0.0104931 0.017792 0.025091 0.03239 0.0396889 0.0469879 0.0542868 0.0615858 0.0688848 0.0761837 0.0834827 0.0907816 0.0980806 0.10538 0.112679 0.119977 0.127276 0.134575 0.141874 0.149173 0.156472 0.163771 0.17107 0.178369 0.185668 0.192967 0.200266 0.207565 0.214864 0.222163 0.229462 0.236761 0.24406 0.251359 0.258658 0.265957 0.273256 0.280555 0.287854 0.295152 0.302451 0.30975 0.317049 0.324348 0.331647 0.338946 0.346245 0.353544 0.360843 0.368142 0.375441 0.38274 0.390039 0.397338 0.404637 0.411936 0.419235 0.426533 0.433832 0.441131 0.44843 0.455729 0.463028 0.470327 0.477626 0.484925 0.492224 0.499523 0.506822 0.514121 0.52142 0.528719 0.536018 0.543317 0.550616 0.557915 0.565214 0.572347 0.579287 0.586034 0.592586 0.598945 0.605111 0.611082 0.61686 0.622445 0.627837 0.633035 0.638041 0.642854 0.647475 0.651903 0.656139 0.660184 0.664036 0.667698 0.671169 0.674449 0.677538 0.680438 0.683149 0.68567 0.688003 0.690147 0.692104 0.693873 0.695456 0.696853 0.698064 0.69909 0.699931 0.700589 0.701063 0.701356 0.701466 0.701395 0.701144 0.700714 0.700104 0.699317 0.698352 0.697212 0.695896 0.694405 0.692741 0.690904 0.688896 0.686717 0.684368 0.681851 0.679167 0.676316 0.673299 0.670119 0.666776 0.66327 0.659605 0.655779 0.651796 0.647656 0.643361 0.638911 0.634308 0.629554 0.62465 0.619597 0.614397 0.609056 0.603705 0.598345 0.592975 0.587595 0.582206 0.576807 0.571398 0.565979 0.56055 0.555111 0.549662 0.544203 0.538734 0.533255 0.527766 0.522267 0.516757 0.511238 0.505708 0.500169 0.494619 0.489059 0.483489 0.477908 0.472318 0.466718 0.461108 0.455487 0.449857 0.444217 0.438567 0.432907 0.427237 0.421557 0.415868 0.410169 0.40446 0.398742 0.393014 0.387277 0.38153 0.375775 0.37001 0.364235 0.358452 0.35266 0.346859 0.341049 0.33523 0.329403 0.323568 0.317723 0.311871 0.30601 0.300142 0.294265 0.288381 0.282488 0.276588 0.270681 0.264766 0.258844 0.252915 0.246979 0.241036 0.235087 0.229131 0.223168 0.2172 0.211225 0.205244 0.199257 0.193265 0.187268 0.181265 0.175257 0.169244 0.163226 0.157203 0.151176 0.145145 0.13911 0.133071 0.127028 0.120981 0.114931 0.108878 0.102822 0.0967633 0.0907019 0.084638 0.0785719 0.0725038 0.0664338 0.0603623 0.0542893 0.0482151 0.04214 0.036064 0.0299874 0.0239105 0.0178334 0.0117564 0.00567956 -0.000396765 -0.0064724 -0.0125471 -0.0186207 -0.024693 -0.0307636 -0.0368325 -0.0428995 -0.0489641 -0.0550263 -0.0610859 -0.0671425 -0.073196 -0.0792462 -0.0852928 -0.0913357 -0.0973744 -0.103409 -0.109439 -0.115464 -0.121485 -0.1275 -0.13351 -0.139514 -0.145512 -0.151505 -0.157491 -0.16347 -0.169443 -0.175409 -0.181367 -0.187318 -0.193262 -0.199197 -0.205125 -0.211044 -0.216954 -0.222856 -0.228748 -0.234632 -0.240506 -0.24637 -0.252224 -0.258069 -0.263903 -0.269726 -0.275539 -0.28134 -0.287131 -0.29291 -0.298677 -0.304432 -0.310176 -0.315907 -0.321626 -0.327332 -0.333025 -0.338705 -0.344372 -0.350025 -0.355665 -0.36129 -0.366902 -0.372499 -0.378082 -0.383651 -0.389204 -0.394742 -0.400266 -0.405774 -0.411266 -0.416742 -0.422203 -0.427647 -0.433076 -0.438487 -0.443883 -0.449261 -0.454623 -0.459967 -0.465103 -0.469979 -0.474597 -0.47896 -0.483069 -0.486926 -0.490534 -0.493894 -0.497008 -0.499878 -0.502507 -0.504896 -0.507048 -0.508963 -0.510645 -0.512095 -0.513316 -0.514309 -0.515076 -0.51562 -0.515942 -0.516045 -0.51593 -0.515599 -0.515056 -0.514301 -0.513337 -0.512166 -0.51079 -0.509211 -0.507431 -0.505453 -0.503278 -0.500908 -0.498347 -0.495595 -0.492655 -0.48953 -0.486221 -0.48273 -0.47906 -0.475214 -0.471192 -0.466998 -0.462634 -0.458101 -0.453403 -0.448541 -0.443518 -0.438335 -0.432996 -0.427503 -0.421857 -0.416062 -0.410119 -0.404031 -0.3978 -0.391429 -0.384919 -0.378274 -0.371496 -0.364586 -0.357548 -0.350384 -0.343095 -0.335797 -0.328498 -0.321199 -0.3139 -0.306601 -0.299302;
+#X coords 0 1 999 -1 500 140 1 0 0;
+#X restore 404 384 graph;
+#X text 686 564 updated for Pd version 0.50-0;
+#X connect 0 0 11 0;
+#X connect 1 0 0 0;
+#X connect 3 0 2 0;
#X connect 4 0 3 0;
-#X connect 5 0 4 0;
-#X connect 6 0 12 1;
-#X connect 7 0 11 0;
-#X connect 8 0 10 0;
-#X connect 9 0 12 0;
-#X connect 10 0 12 4;
-#X connect 11 0 12 2;
-#X connect 12 0 3 0;
-#X connect 14 0 12 3;
-#X connect 19 0 12 5;
-#X connect 32 0 34 0;
-#X connect 43 0 42 0;
+#X connect 5 0 11 1;
+#X connect 6 0 10 0;
+#X connect 7 0 9 0;
+#X connect 8 0 11 0;
+#X connect 9 0 11 4;
+#X connect 10 0 11 2;
+#X connect 11 0 2 0;
+#X connect 13 0 11 3;
+#X connect 18 0 11 5;
+#X connect 31 0 33 0;
+#X connect 41 0 40 0;
diff --git a/doc/5.reference/soundfiler-help.pd b/doc/5.reference/soundfiler-help.pd
index d833e6dbc..7dec38d8f 100644
--- a/doc/5.reference/soundfiler-help.pd
+++ b/doc/5.reference/soundfiler-help.pd
@@ -1,8 +1,4 @@
#N canvas 223 50 1039 619 12;
-#N canvas 0 22 450 300 (subpatch) 0;
-#X array sample 44100 float 2;
-#X coords 0 1 44100 -1 250 100 1 0 0;
-#X restore 269 247 graph;
#X obj 60 316 soundfiler;
#X floatatom 60 345 7 0 0 0 - - - 12;
#X obj 278 581 tabwrite~;
@@ -60,17 +56,9 @@
#X text 678 355 open subpatch to see how to deal with '\$0', f 28;
#X text 577 247 Note that if no array name is given to read to \, no samples are read but you get the number of samples in the file on the left outlet and the info on the right outlet anyway., f 62;
#X text 577 304 Also note that the number of channels is limited to 64 for both reading and writting., f 62;
-#N canvas 85 86 1235 552 read-write-flags 0;
+#N canvas 108 89 1226 553 read-write-flags 0;
#X text 27 83 -resize (resizes arrays to the size of the sound file), f 62;
-#N canvas 0 22 450 300 (subpatch) 0;
-#X array array1 78003 float 2;
-#X coords 0 1 78003 -1 325 120 1 0 0;
-#X restore 887 260 graph;
-#N canvas 0 22 450 300 (subpatch) 0;
-#X array array2 78003 float 2;
-#X coords 0 1 78003 -1 325 120 1 0 0;
-#X restore 887 404 graph;
-#X obj 622 447 soundfiler;
+#X obj 609 447 soundfiler;
#X text 27 23 Flags for 'read' message:, f 62;
#X text 27 347 Flags for 'write' message:, f 69;
#X text 27 101 -maxsize (maximum number of samples to resize to), f 62;
@@ -78,16 +66,16 @@
#X text 27 231 -ascii (read a file containing ascii numbers), f 73;
#X text 48 251 This may only be combined with '-resize'. Newlines in the file are ignored \, non-numeric fields are replaced by zero. If multiple arrays are specified \, the first elements of each array should come first in the file \, followed by all the second elements and so on (interleaved)., f 70;
#X text 27 47 -wave \, -aiff \, -caf \, -next (soundfile format), f 62;
-#X text 1056 131 read a file overriding the header, f 23;
-#X text 904 169 read from an ascii file;
-#X listbox 689 495 17 0 0 0 - - - 0;
-#X msg 625 138 read -resize -raw 128 2 2 b ../sound/bell.aiff array1 array2;
-#X msg 651 192 read -ascii -resize table.txt array1 array2;
-#X floatatom 622 495 6 0 0 0 - - - 0;
-#X obj 586 58 openpanel;
-#X obj 586 23 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
-#X obj 672 289 savepanel;
-#X obj 672 254 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
+#X text 1043 131 read a file overriding the header, f 22;
+#X text 891 169 read from an ascii file;
+#X listbox 676 495 17 0 0 0 - - - 0;
+#X msg 612 138 read -resize -raw 128 2 2 b ../sound/bell.aiff array1 array2;
+#X msg 638 192 read -ascii -resize table.txt array1 array2;
+#X floatatom 609 495 6 0 0 0 - - - 0;
+#X obj 573 58 openpanel;
+#X obj 573 23 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
+#X obj 659 289 savepanel;
+#X obj 659 254 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
#X text 82 500 * note that arrays whose values exceed the -1 to 1 range are automatically normalized, f 42;
#X text 27 442 -bytes (bytes per sample: 2 \, 3 \, or 4 \, default: 2), f 69;
#X text 27 461 -rate (sample rate \, default Pd's running sample rate), f 69;
@@ -98,11 +86,11 @@
#X text 27 367 -wave \, -aiff \, -caf \, -next \, -ascii (soundfile format \, default: 'wave'), f 69;
#X text 27 386 -big \, -little (sample endianness \, default 'little'), f 69;
#X text 27 480 -normalize * (normalize file to '1'), f 69;
-#X msg 672 317 write \$1 array1 array2;
-#X msg 586 86 read -resize \$1 array1 array2;
-#X msg 607 113 read -maxsize 44100 -aiff ../sound/bell.aiff array1 array2;
-#X text 846 89 set max size and extension;
-#X msg 642 169 read -ascii -resize table.txt array1;
+#X msg 659 317 write \$1 array1 array2;
+#X msg 573 86 read -resize \$1 array1 array2;
+#X msg 594 113 read -maxsize 44100 -aiff ../sound/bell.aiff array1 array2;
+#X text 833 89 set max size and extension;
+#X msg 629 169 read -ascii -resize table.txt array1;
#N canvas 411 132 607 507 more-writting-examples 0;
#X msg 171 364 write foo1.txt array1;
#X obj 113 451 outlet;
@@ -126,22 +114,32 @@
#X connect 8 0 1 0;
#X connect 10 0 0 0;
#X connect 11 0 10 0;
-#X restore 681 383 pd more-writting-examples;
-#X text 698 256 Write a stereo fie;
-#X text 618 24 Choose file to save to or read from in your hard disk;
-#X connect 3 0 16 0;
-#X connect 3 1 13 0;
-#X connect 14 0 3 0;
-#X connect 15 0 3 0;
-#X connect 17 0 32 0;
+#X restore 668 383 pd more-writting-examples;
+#X text 685 256 Write a stereo fie;
+#X text 605 24 Choose file to save to or read from in your hard disk;
+#X obj 875 261 cnv 19 323 118 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#X obj 875 405 cnv 19 323 118 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array array1 78003 float 2;
+#X coords 0 1 78003 -1 325 120 1 0 0;
+#X restore 874 260 graph;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array array2 78003 float 2;
+#X coords 0 1 78003 -1 325 120 1 0 0;
+#X restore 874 404 graph;
+#X connect 1 0 14 0;
+#X connect 1 1 11 0;
+#X connect 12 0 1 0;
+#X connect 13 0 1 0;
+#X connect 15 0 30 0;
+#X connect 16 0 15 0;
+#X connect 17 0 29 0;
#X connect 18 0 17 0;
-#X connect 19 0 31 0;
-#X connect 20 0 19 0;
-#X connect 31 0 3 0;
-#X connect 32 0 3 0;
-#X connect 33 0 3 0;
-#X connect 35 0 3 0;
-#X connect 36 0 3 0;
+#X connect 29 0 1 0;
+#X connect 30 0 1 0;
+#X connect 31 0 1 0;
+#X connect 33 0 1 0;
+#X connect 34 0 1 0;
#X restore 779 505 pd read-write-flags & more examples;
#X f 19;
#X text 577 149 When loading a file \, the left outlet sends the number of samples the file contains if the array is equal or greater in size. If you're loading a file into an array that is smaller \, the number or samples is clipped to the array size and you probably want to use the -resize flag to resize the array size to the file size., f 62;
@@ -158,10 +156,15 @@
#X text 29 489 Note: Loading a soundfile into an array might be useful for more flexible playing strategies with table reading objects in the 'see section' below. For a simpler alternative that streams a soundfile directly from your hard drive \, see [readsf~]., f 72;
#X text 29 396 The 'read' message takes a file to load and one or more arrays to load into (in the case the file has more than one channel). The number of channels of the soundfile need not match the number of arrays given to read (extras channels are dropped and unsupplied channels are zeroed out in the extra arrays). The 'write' message takes a filename to save to and one or more arrays (one for each channel)., f 72;
#X text 124 365 info: sample rate \, header size \, channels \, bytes \, endianness;
-#X connect 1 0 2 0;
-#X connect 1 1 13 0;
-#X connect 18 0 1 0;
-#X connect 19 0 1 0;
-#X connect 35 0 37 0;
-#X connect 36 0 35 0;
-#X connect 37 0 1 0;
+#X obj 270 248 cnv 19 248 98 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array sample 44100 float 2;
+#X coords 0 1 44100 -1 250 100 1 0 0;
+#X restore 269 247 graph;
+#X connect 0 0 1 0;
+#X connect 0 1 12 0;
+#X connect 17 0 0 0;
+#X connect 18 0 0 0;
+#X connect 34 0 36 0;
+#X connect 35 0 34 0;
+#X connect 36 0 0 0;
diff --git a/doc/5.reference/stripnote-help.pd b/doc/5.reference/stripnote-help.pd
index 994f6c0ad..f2d612d38 100644
--- a/doc/5.reference/stripnote-help.pd
+++ b/doc/5.reference/stripnote-help.pd
@@ -1,6 +1,6 @@
#N canvas 633 70 509 475 12;
-#X obj 120 382 print x1;
-#X obj 194 382 print x2;
+#X obj 120 385 print x1;
+#X obj 194 385 print x2;
#X obj 120 333 stripnote, f 11;
#X msg 120 280 34.5 67.8;
#X obj 100 436 makenote;
@@ -9,52 +9,33 @@
#X text 21 436 see also:;
#X floatatom 120 359 5 0 0 0 - - - 0;
#X floatatom 194 359 5 0 0 0 - - - 0;
-#X text 33 131 The left inlet takes the note number and the right inlet
-takes velocity values. Alternatively \, you can send it a list that
-spreads the values through the inlets., f 63;
+#X text 33 131 The left inlet takes the note number and the right inlet takes velocity values. Alternatively \, you can send it a list that spreads the values through the inlets., f 63;
#X msg 97 253 70 127;
#X msg 138 305 70 0;
#X text 105 11 - strip "note off" messages;
-#X text 33 182 This is very useful if you want a Note-On message to
-trigger something in Pd but you don't want a Note-Off to trigger anything
-when you release the note., f 63;
+#X text 33 182 This is very useful if you want a Note-On message to trigger something in Pd but you don't want a Note-Off to trigger anything when you release the note., f 63;
#N canvas 683 85 535 307 reference 0;
-#X obj 18 45 cnv 5 500 5 empty empty INLET: 8 18 0 13 #202020 #000000
-0;
-#X obj 18 143 cnv 2 500 2 empty empty OUTLET: 8 12 0 13 #202020 #000000
-0;
-#X obj 18 240 cnv 2 500 2 empty empty ARGUMENTS: 8 12 0 13 #202020
-#000000 0;
-#X obj 17 204 cnv 1 500 1 empty empty 2nd: 8 12 0 13 #7c7c7c #000000
-0;
-#X obj 17 174 cnv 1 500 1 empty empty 1st: 8 12 0 13 #7c7c7c #000000
-0;
-#X obj 17 106 cnv 1 500 1 empty empty 2nd: 8 12 0 13 #7c7c7c #000000
-0;
-#X obj 17 76 cnv 1 500 1 empty empty 1st: 8 12 0 13 #7c7c7c #000000
-0;
+#X obj 18 45 cnv 5 500 5 empty empty INLET: 8 18 0 13 #202020 #000000 0;
+#X obj 18 143 cnv 2 500 2 empty empty OUTLET: 8 12 0 13 #202020 #000000 0;
+#X obj 18 240 cnv 2 500 2 empty empty ARGUMENTS: 8 12 0 13 #202020 #000000 0;
+#X obj 17 204 cnv 1 500 1 empty empty 2nd: 8 12 0 13 #7c7c7c #000000 0;
+#X obj 17 174 cnv 1 500 1 empty empty 1st: 8 12 0 13 #7c7c7c #000000 0;
+#X obj 17 106 cnv 1 500 1 empty empty 2nd: 8 12 0 13 #7c7c7c #000000 0;
+#X obj 17 76 cnv 1 500 1 empty empty 1st: 8 12 0 13 #7c7c7c #000000 0;
#X text 110 83 float - MIDI pitch.;
#X text 110 180 float - MIDI pitch., f 23;
#X text 110 213 float - MIDI velocity., f 23;
#X obj 38 11 stripnote;
#X text 117 11 - strip "note off" messages;
#X text 135 251 NONE;
-#X text 110 114 float - MIDI velocity (no output if equal to zero).
-;
-#X obj 17 279 cnv 5 500 5 empty empty empty 8 18 0 13 #202020 #000000
-0;
+#X text 110 114 float - MIDI velocity (no output if equal to zero).;
+#X obj 17 279 cnv 5 500 5 empty empty empty 8 18 0 13 #202020 #000000 0;
#X restore 327 11 pd reference;
#X text 425 12 <= click;
-#X obj 8 43 cnv 1 490 1 empty empty empty 8 12 0 13 #000000 #000000
-0;
-#X obj 8 420 cnv 1 490 1 empty empty empty 8 12 0 13 #000000 #000000
-0;
+#X obj 8 43 cnv 1 490 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X obj 8 420 cnv 1 490 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 176 306 <-- note off ignored;
-#X text 33 52 [stripnote] ignores note-off (zero-velocity) messages
-from a stream of MIDI-style note message and passes the others through
-unchanged. It can deal with any kind of number (negative \, floats
-\, whatever) even though MIDI values need to be integers from 0 to
-127!, f 63;
+#X text 33 52 [stripnote] ignores note-off (zero-velocity) messages from a stream of MIDI-style note message and passes the others through unchanged. It can deal with any kind of number (negative \, floats \, whatever) even though MIDI values need to be integers from 0 to 127!, f 63;
#X connect 2 0 8 0;
#X connect 2 1 9 0;
#X connect 3 0 2 0;
diff --git a/doc/5.reference/tabosc4~-help.pd b/doc/5.reference/tabosc4~-help.pd
index 3fd4c4430..f582f9886 100644
--- a/doc/5.reference/tabosc4~-help.pd
+++ b/doc/5.reference/tabosc4~-help.pd
@@ -23,16 +23,16 @@
#X msg 111 389 set wave2;
#X obj 217 512 declare -stdpath ./;
#N canvas 715 168 574 404 Dealing_with_"\$0" 0;
-#X text 394 262 <= array with local name, f 13;
-#X obj 262 261 array define \$0-x;
-#X obj 178 279 f \$0;
-#X msg 178 306 \; \$1-x sinesum 512 1 1 1 1 \, normalize;
-#X obj 62 290 output~;
+#X text 414 262 <= array with local name, f 13;
+#X obj 282 261 array define \$0-x;
+#X obj 198 279 f \$0;
+#X msg 198 306 \; \$1-x sinesum 512 1 1 1 1 \, normalize;
+#X obj 62 280 output~;
#X msg 133 205 set \$1;
#X obj 133 179 symbol \$0-x;
#X obj 133 151 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X obj 62 189 sig~ 440;
-#X obj 178 253 loadbang;
+#X obj 198 253 loadbang;
#X obj 62 240 tabosc4~;
#X text 240 185 You can also load '\$0' in a float object and send it to a message that works like a send to send messages to an array., f 40;
#X text 158 151 click to set name;
@@ -45,7 +45,6 @@
#X connect 8 0 10 0;
#X connect 9 0 2 0;
#X connect 10 0 4 0;
-#X connect 10 0 4 1;
#X restore 435 536 pd Dealing_with_"\$0";
#X obj 451 360 array define wave1;
#X obj 451 384 array define wave2;
diff --git a/doc/5.reference/tabplay~-help.pd b/doc/5.reference/tabplay~-help.pd
index 85f93d7dd..b0305e946 100644
--- a/doc/5.reference/tabplay~-help.pd
+++ b/doc/5.reference/tabplay~-help.pd
@@ -1,16 +1,11 @@
-#N canvas 298 23 870 513 12;
+#N canvas 287 58 867 486 12;
#X declare -stdpath ./;
-#N canvas 0 0 450 300 (subpatch) 0;
-#X array sample 155944 float 2;
-#X coords 0 1 155944 -1 250 100 1 0 0;
-#X restore 557 212 graph;
#X text 148 139 "set" message permits you to switch between arrays;
-#X text 174 291 creation argument initializes array name;
-#X obj 105 475 tabwrite~;
+#X obj 105 446 tabwrite~;
#X obj 55 18 tabplay~;
-#X obj 574 143 soundfiler;
-#X obj 177 475 soundfiler;
-#X obj 325 475 tabread4~;
+#X obj 574 139 soundfiler;
+#X obj 177 446 soundfiler;
+#X obj 325 446 tabread4~;
#X msg 90 214 0 44100;
#X msg 84 189 44100;
#X text 101 164 "bang" or 0 plays whole sample;
@@ -18,17 +13,16 @@
#X text 148 212 play starting at beginning for 44100 samples;
#X msg 95 239 44100 1000;
#X text 173 238 play from 44100 through 45099 (1000 samples);
-#X text 647 476 updated for Pd version 0.43;
+#X text 647 447 updated for Pd version 0.43;
#X msg 102 264 stop;
#X text 138 265 stop playing (outputs zeros when stopped);
-#X obj 187 336 bng 23 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X obj 63 291 tabplay~ sample;
+#X obj 207 334 bng 23 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X msg 63 139 set sample;
-#X text 26 475 see also:;
+#X text 26 446 see also:;
#X obj 63 336 output~;
-#X obj 48 417 declare -stdpath ./;
-#X text 641 84 load table;
-#X obj 574 84 loadbang;
+#X obj 699 145 declare -stdpath ./;
+#X text 641 80 load table;
+#X obj 574 80 loadbang;
#N canvas 642 190 593 443 Dealing_with_"\$0" 0;
#X obj 316 280 array define \$0-x;
#X obj 227 300 f \$0;
@@ -58,7 +52,7 @@
#X connect 14 0 4 0;
#X restore 359 383 pd Dealing_with_"\$0";
#X text 197 374 open subpatch to see how to deal with '\$0', f 21;
-#X obj 399 474 array;
+#X obj 399 445 array;
#N canvas 677 98 580 357 reference 0;
#X obj 18 51 cnv 5 550 5 empty empty INLETS: 8 18 0 13 #202020 #000000 0;
#X obj 18 185 cnv 2 550 2 empty empty OUTLETS: 8 12 0 13 #202020 #000000 0;
@@ -84,7 +78,7 @@
#X restore 659 18 pd reference;
#X text 757 17 <= click;
#X obj 8 52 cnv 1 850 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X obj 8 452 cnv 1 850 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X obj 8 423 cnv 1 850 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#N canvas 643 412 384 186 array-examples 0;
#N canvas 491 316 457 285 open 0;
#X obj 120 23 inlet;
@@ -107,24 +101,16 @@
#X text 47 22 See also and the "array" examples from the section 2 of Pd's tutorial:, f 39;
#X connect 1 0 0 0;
#X connect 2 0 0 0;
-#X restore 507 475 pd array-examples;
+#X restore 507 446 pd array-examples;
#X text 62 67 The [tabplay~] object plays a sample \, or part of one \, with no transposition or interpolation. It is cheaper than [tabread4~] and there are none of [tabread4~]'s interpolation artifacts., f 62;
-#X text 217 339 <-- bang when finished playing the table;
+#X text 237 337 <-- bang when finished playing the table;
#X obj 77 165 bng 17 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X obj 259 475 tabread~;
+#X obj 259 446 tabread~;
#N canvas 519 131 758 403 multichannel 0;
#X obj 58 183 tabplay~ left right;
#X obj 58 281 output~;
-#N canvas 0 0 450 300 (subpatch) 0;
-#X array right 62079 float 2;
-#X coords 0 1 62079 -1 250 100 1 0 0;
-#X restore 496 246 graph;
#X obj 308 199 soundfiler;
#X obj 308 125 loadbang;
-#N canvas 0 0 450 300 (subpatch) 0;
-#X array left 155944 float 2;
-#X coords 0 1 155944 -1 250 100 1 0 0;
-#X restore 235 246 graph;
#X text 375 125 load tables;
#X obj 58 121 bng 22 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
#X obj 58 227 snake~ out;
@@ -133,26 +119,43 @@
#X text 82 23 [tabplay~] generates multichannel signals if you give it more than one argument. Each channel then corresponds to an argument/table. The "set" message can also replace more than one table name. Note that the arrays do not need to be of the same length and \, in which case the bang output is only sent when reaching the end of the largest table., f 86;
#X obj 188 215 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
#X msg 308 155 read ../sound/bell.aiff left \, read ../sound/voice.wav right, f 29;
-#X connect 0 0 8 0;
-#X connect 0 1 12 0;
-#X connect 4 0 13 0;
+#X obj 236 247 cnv 19 248 98 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#X obj 497 247 cnv 19 248 98 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array right 62079 float 2;
+#X coords 0 1 62079 -1 250 100 1 0 0;
+#X restore 496 246 graph;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array left 155944 float 2;
+#X coords 0 1 155944 -1 250 100 1 0 0;
+#X restore 235 246 graph;
+#X connect 0 0 6 0;
+#X connect 0 1 10 0;
+#X connect 3 0 11 0;
+#X connect 5 0 0 0;
+#X connect 6 0 1 0;
+#X connect 6 1 1 1;
#X connect 7 0 0 0;
-#X connect 8 0 1 0;
-#X connect 8 1 1 1;
-#X connect 9 0 0 0;
-#X connect 10 0 0 0;
-#X connect 13 0 3 0;
-#X restore 705 382 pd multichannel;
-#X text 554 367 mutichannel signal support ----------->, f 20;
-#X msg 574 114 read ../sound/bell.aiff sample;
+#X connect 8 0 0 0;
+#X connect 11 0 2 0;
+#X restore 721 373 pd multichannel;
+#X text 570 358 mutichannel signal support ----------->, f 20;
#X text 122 17 - play back from tables (non-transposing);
-#X connect 8 0 19 0;
-#X connect 9 0 19 0;
-#X connect 13 0 19 0;
-#X connect 16 0 19 0;
-#X connect 19 0 22 0;
-#X connect 19 1 18 0;
-#X connect 20 0 19 0;
-#X connect 25 0 40 0;
-#X connect 36 0 19 0;
-#X connect 40 0 5 0;
+#X msg 574 110 read ../sound/bell.aiff sample-table;
+#X obj 63 291 tabplay~ sample-table;
+#X text 219 290 argument initializes array name;
+#X obj 578 216 cnv 19 248 98 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array sample-table 155944 float 2;
+#X coords 0 1 155944 -1 250 100 1 0 0;
+#X restore 577 215 graph;
+#X connect 6 0 39 0;
+#X connect 7 0 39 0;
+#X connect 11 0 39 0;
+#X connect 14 0 39 0;
+#X connect 17 0 39 0;
+#X connect 22 0 38 0;
+#X connect 33 0 39 0;
+#X connect 38 0 3 0;
+#X connect 39 0 19 0;
+#X connect 39 1 16 0;
diff --git a/doc/5.reference/tabread-help.pd b/doc/5.reference/tabread-help.pd
index 876583d64..a52cfcd5d 100644
--- a/doc/5.reference/tabread-help.pd
+++ b/doc/5.reference/tabread-help.pd
@@ -1,13 +1,8 @@
-#N canvas 556 34 719 445 12;
+#N canvas 436 56 719 445 12;
#X text 100 149 index;
#X obj 66 18 tabread;
#X floatatom 67 150 4 0 9 0 - - - 0;
#X floatatom 67 268 5 0 0 0 - - - 0;
-#N canvas 0 22 450 300 (subpatch) 0;
-#X array table-ex 10 float 3;
-#A 0 1 4 2 8 5 6 1 4 2 8;
-#X coords 0 10 10 0 250 200 1 0 0;
-#X restore 391 151 graph;
#X text 191 216 creation argument;
#X text 193 232 gives array name;
#X text 177 184 change array name;
@@ -17,7 +12,7 @@
#X obj 67 224 tabread table-ex;
#X msg 83 184 set table-ex;
#X text 110 269 output = table-ex[index];
-#N canvas 746 749 401 220 init-table 0;
+#N canvas 865 115 401 220 init-table 0;
#X obj 35 42 loadbang;
#X msg 35 74 \; table-ex resize 10 \; table-ex bounds 0 10 10 0 \; table-ex xlabel -0.2 0 1 2 3 4 5 6 7 8 9 \; table-ex ylabel -0.3 0 1 2 3 4 5 6 7 8 9 10 \; table-ex 0 1 4 2 8 5 6 1 4 2 8;
#X connect 0 0 1 0;
@@ -93,6 +88,11 @@
#X text 51 61 The [tabread] object reads values from an array ("table") according to an index. The index is rounded down to the next lower integer. Values in the table correspond to indices (starting at 0). Indices outside of the range are replaced by the nearest index in range (from 0 to 9 in this example)., f 84;
#X obj 228 409 tabread~;
#X obj 294 409 array;
-#X connect 2 0 11 0;
-#X connect 11 0 3 0;
-#X connect 12 0 11 0;
+#X obj 392 152 cnv 19 248 198 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array table-ex 10 float 2;
+#X coords 0 10 10 0 250 200 1 0 0;
+#X restore 391 151 graph;
+#X connect 2 0 10 0;
+#X connect 10 0 3 0;
+#X connect 11 0 10 0;
diff --git a/doc/5.reference/tabread4-help.pd b/doc/5.reference/tabread4-help.pd
index d3b069b69..c79ae653d 100644
--- a/doc/5.reference/tabread4-help.pd
+++ b/doc/5.reference/tabread4-help.pd
@@ -1,4 +1,4 @@
-#N canvas 509 36 721 493 12;
+#N canvas 366 43 721 493 12;
#X text 118 198 index;
#X floatatom 70 199 6 1 8 0 - - - 0;
#X floatatom 70 304 6 0 0 0 - - - 0;
@@ -15,16 +15,11 @@
#X msg 80 231 set tabread4-ex;
#X obj 70 271 tabread4 tabread4-ex;
#X text 121 306 output = tabread4-ex[index];
-#N canvas 0 0 450 300 (subpatch) 0;
-#X array tabread4-ex 10 float 3;
-#A 0 8 4 2 8 5 6 1 8 4 2;
-#X coords 0 10 10 0 250 200 1 0 0;
-#X restore 395 183 graph;
-#N canvas 117 649 401 220 init-table 0;
+#N canvas 781 205 401 220 init-table 0;
#X obj 35 42 loadbang;
#X msg 35 74 \; tabread4-ex resize 10 \; tabread4-ex bounds 0 10 10 0 \; tabread4-ex xlabel -0.2 0 1 2 3 4 5 6 7 8 9 \; tabread4-ex ylabel -0.3 0 1 2 3 4 5 6 7 8 9 10 \; tabread4-ex 0 8 4 2 8 5 6 1 8 4 2;
#X connect 0 0 1 0;
-#X restore 548 159 pd init-table;
+#X restore 575 141 pd init-table;
#X obj 73 169 hsl 162 19 1 8 0 0 empty empty empty -2 -8 0 10 #dfdfdf #000000 #000000 0 1;
#N canvas 681 295 593 399 Dealing_with_"\$0" 0;
#X obj 221 291 f \$0;
@@ -95,10 +90,15 @@
#X connect 1 0 0 0;
#X connect 2 0 0 0;
#X restore 298 460 pd array-examples;
-#X text 45 58 The [tabread4] object reads values from an array ("table") according to an index \, applying four-point polynomial interpolation. Indices should range from 1 to (size-2) so that the 4-point interpolation is meaningful. You can shift-drag the number box to see the effect of interpolation. Indices outside of the range are replaced by the nearest index in range (from 1 to 8 in this example)., f 90;
+#X text 33 61 The [tabread4] object reads values from an array ("table") according to an index \, applying four-point polynomial interpolation. Indices should range from 1 to (size-2) so that the 4-point interpolation is meaningful. You can shift-drag the number box to see the effect of interpolation. Indices outside of the range are replaced by the nearest index in range (from 1 to 8 in this example)., f 90;
#X obj 217 431 tabread4~;
#X obj 248 460 array;
+#X obj 423 166 cnv 19 248 198 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array tabread4-ex 10 float 2;
+#X coords 0 10 10 0 250 200 1 0 0;
+#X restore 422 165 graph;
#X connect 1 0 14 0;
#X connect 13 0 14 0;
#X connect 14 0 2 0;
-#X connect 18 0 1 0;
+#X connect 17 0 1 0;
diff --git a/doc/5.reference/tabread4~-help.pd b/doc/5.reference/tabread4~-help.pd
index e4c7e8692..ccd74f68f 100644
--- a/doc/5.reference/tabread4~-help.pd
+++ b/doc/5.reference/tabread4~-help.pd
@@ -1,9 +1,4 @@
-#N canvas 360 57 843 544 12;
-#N canvas 0 22 450 300 (subpatch) 0;
-#X array table2-ex 10 float 3;
-#A 0 1 4 2 8 5 6 1 1 4 2;
-#X coords 0 10 10 0 250 150 1 0 0;
-#X restore 565 132 graph;
+#N canvas 312 52 843 544 12;
#X obj 36 401 snapshot~;
#X obj 36 165 sig~;
#X floatatom 36 139 6 1 8 0 - - - 0;
@@ -16,12 +11,12 @@
#X obj 94 513 tabreceive~;
#X obj 165 487 tabplay~;
#X floatatom 166 250 5 0 10 0 - - - 0;
-#X obj 231 361 ../3.audio.examples/B15.tabread4~-onset;
+#X obj 231 381 ../3.audio.examples/B15.tabread4~-onset;
#X obj 181 513 tabosc4~;
#X obj 249 513 soundfiler;
-#N canvas 515 381 401 220 init-table 0;
+#N canvas 780 240 401 220 init-table 0;
#X obj 35 42 loadbang;
-#X msg 35 74 \; table2-ex resize 10 \; table2-ex bounds 0 10 10 0 \; table2-ex xlabel -0.2 0 1 2 3 4 5 6 7 8 9 \; table2-ex ylabel -0.3 0 1 2 3 4 5 6 7 8 9 10 \; table2-ex 0 1 4 2 8 5 6 1 1 4 2;
+#X msg 35 74 \; table2-ex resize 10 \; table2-ex bounds 0 10 10 0 \; table2-ex xlabel -0.2 0 1 2 3 4 5 6 7 8 9 \; table2-ex ylabel -0.3 0 1 2 3 4 5 6 7 8 9 10 \; table2-ex 0 1 4 2 8 5 6 1 7 4 2;
#X connect 0 0 1 0;
#X restore 720 108 pd init-table;
#X obj 36 313 tabread4~ table2-ex;
@@ -56,7 +51,7 @@
#X connect 12 0 14 0;
#X connect 13 0 12 0;
#X connect 15 0 13 0;
-#X restore 576 422 pd Dealing_with_"\$0";
+#X restore 580 430 pd Dealing_with_"\$0";
#X obj 39 111 hsl 162 19 1 8 0 0 empty empty empty -2 -8 0 10 #dfdfdf #000000 #000000 0 1;
#N canvas 750 87 575 293 reference 0;
#X obj 11 52 cnv 5 550 5 empty empty INLET: 8 18 0 13 #202020 #000000 0;
@@ -79,8 +74,8 @@
#X restore 662 17 pd reference;
#X text 760 16 <= click;
#X obj 8 50 cnv 1 830 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X text 245 322 Open this example for more details on setting onset:, f 35;
-#X text 264 423 open subpatch to see how to deal with '\$0':;
+#X text 245 342 Open this example for more details on setting onset:, f 35;
+#X text 268 431 open subpatch to see how to deal with '\$0':;
#X obj 8 475 cnv 1 830 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 18 500 see also:;
#N canvas 643 412 384 186 array-examples 0;
@@ -106,7 +101,7 @@
#X connect 1 0 0 0;
#X connect 2 0 0 0;
#X restore 331 513 pd array-examples;
-#X text 58 67 [tabread4~] is used to build samplers and other table lookup algorithms. The interpolation scheme is 4-point polynomial as used in [delread4~] and [tabosc4~]., f 90;
+#X text 30 63 [tabread4~] is used to build samplers and other table lookup algorithms. The interpolation scheme is 4-point polynomial as used in [delread4~] and [tabosc4~]., f 81;
#X msg 457 234 \; pd dsp \$1;
#X obj 457 199 set-dsp-tgl;
#X text 374 202 DSP on/off;
@@ -114,16 +109,6 @@
#X obj 68 270 snake~ out, f 12;
#X obj 69 151 sig~;
#X floatatom 69 125 6 0 10 0 - - - 0;
-#N canvas 0 22 450 300 (subpatch) 0;
-#X array array99 10 float 3;
-#A 0 2.824 1.366 3.094 1.636 0.610006 4.552 1.906 0.826005 3.364 1.96001;
-#X coords 0 5.2 10 -0.2 200 100 1 0 0;
-#X restore 310 149 graph;
-#N canvas 0 22 450 300 (subpatch) 0;
-#X array array100 10 float 3;
-#A 0 0.502 0.771999 1.096 1.582 2.122 2.662 3.20199 3.57999 3.95799 4.44399;
-#X coords 0 5.2 10 -0.2 200 100 1 0 0;
-#X restore 309 276 graph;
#X obj 68 347 snapshot~;
#X floatatom 68 376 8 0 0 0 - - - 0;
#X obj 89 304 r bang;
@@ -134,20 +119,32 @@
#X obj 68 222 tabread4~ array99 array100;
#X text 51 12 [tabread4~] generates multichannel signals if you give it more than one argument. Each channel then corresponds to an argument/table. The "set" message can also replace more than one table name. Note that the arrays do not need to be of the same length., f 67;
#X obj 72 96 hsl 162 19 0 10 0 0 empty empty empty -2 -8 0 10 #dfdfdf #000000 #000000 0 1;
-#X connect 0 0 5 0;
-#X connect 0 1 8 0;
-#X connect 1 0 12 0;
+#X obj 310 150 cnv 19 198 98 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#X obj 310 276 cnv 19 198 98 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array array99 10 float 3;
+#A 0 2.824 1.366 3.094 1.636 0.610006 4.552 1.906 0.826005 3.364 1.96001;
+#X coords 0 5.2 10 -0.2 200 100 1 0 0;
+#X restore 310 149 graph;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array array100 10 float 3;
+#A 0 0.502 0.771999 1.096 1.582 2.122 2.662 3.20199 3.57999 3.95799 4.44399;
+#X coords 0 5.2 10 -0.2 200 100 1 0 0;
+#X restore 309 276 graph;
+#X connect 0 0 3 0;
+#X connect 0 1 6 0;
+#X connect 1 0 10 0;
#X connect 2 0 1 0;
+#X connect 3 0 4 0;
+#X connect 5 0 3 0;
#X connect 5 0 6 0;
-#X connect 7 0 5 0;
-#X connect 7 0 8 0;
-#X connect 8 0 9 0;
-#X connect 10 0 12 0;
-#X connect 11 0 12 0;
-#X connect 12 0 0 0;
-#X connect 14 0 2 0;
-#X restore 701 365 pd multichannel;
-#X text 550 350 mutichannel signal support ----------->, f 20;
+#X connect 6 0 7 0;
+#X connect 8 0 10 0;
+#X connect 9 0 10 0;
+#X connect 10 0 0 0;
+#X connect 12 0 2 0;
+#X restore 701 385 pd multichannel;
+#X text 550 370 mutichannel signal support ----------->, f 20;
#X obj 128 392 metro 200;
#X obj 128 365 loadbang;
#X obj 128 420 s bang;
@@ -157,14 +154,19 @@
#X text 212 245 set table onset to improve the accuracy of indexing (useful if you have Pd compiled for single precision), f 31;
#X text 157 200 "set" message lets you switch between arrays, f 22;
#X text 102 250 onset ->;
-#X connect 1 0 4 0;
-#X connect 2 0 17 0;
-#X connect 3 0 2 0;
-#X connect 12 0 17 1;
-#X connect 17 0 1 0;
-#X connect 18 0 17 0;
-#X connect 21 0 3 0;
-#X connect 32 0 31 0;
-#X connect 36 0 38 0;
-#X connect 37 0 36 0;
-#X connect 39 0 1 0;
+#X obj 566 133 cnv 19 248 198 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array table2-ex 10 float 2;
+#X coords 0 10 10 0 250 200 1 0 0;
+#X restore 565 132 graph;
+#X connect 0 0 3 0;
+#X connect 1 0 16 0;
+#X connect 2 0 1 0;
+#X connect 11 0 16 1;
+#X connect 16 0 0 0;
+#X connect 17 0 16 0;
+#X connect 20 0 2 0;
+#X connect 31 0 30 0;
+#X connect 35 0 37 0;
+#X connect 36 0 35 0;
+#X connect 38 0 0 0;
diff --git a/doc/5.reference/tabread~-help.pd b/doc/5.reference/tabread~-help.pd
index aa172afff..5cdc4b28d 100644
--- a/doc/5.reference/tabread~-help.pd
+++ b/doc/5.reference/tabread~-help.pd
@@ -16,10 +16,6 @@
#X obj 99 428 tabread4~;
#X obj 364 428 tabread4;
#X text 24 443 see also:;
-#N canvas 0 22 450 300 (subpatch) 0;
-#X array tabread-ex 10 float 2;
-#X coords 0 5.2 10 -0.2 300 150 1 0 0;
-#X restore 465 147 graph;
#X msg 52 193 set tabread-ex;
#X obj 31 244 tabread~ tabread-ex;
#N canvas 843 85 401 220 init-table 0;
@@ -107,6 +103,17 @@
#X obj 68 257 snake~ out, f 12;
#X obj 69 138 sig~;
#X floatatom 69 112 6 0 10 0 - - - 0;
+#X obj 68 212 tabread~ array77 array88;
+#X msg 124 137 set array77 array88;
+#X msg 137 168 set array88 array77;
+#X obj 68 334 snapshot~;
+#X floatatom 68 363 8 0 0 0 - - - 0;
+#X obj 89 291 r bang;
+#X obj 149 334 snapshot~;
+#X floatatom 149 363 8 0 0 0 - - - 0;
+#X text 51 21 [tabread~] generates multichannel signals if you give it more than one argument. Each channel then corresponds to an argument/table. The "set" message can also replace more than one table name. Note that the arrays do not need to be of the same length., f 66;
+#X obj 311 137 cnv 19 198 98 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#X obj 310 264 cnv 19 198 98 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
#N canvas 0 22 450 300 (subpatch) 0;
#X array array77 10 float 3;
#A 0 2.824 1.366 3.094 1.636 0.610006 4.552 1.906 0.826005 3.364 1.96001;
@@ -117,26 +124,17 @@
#A 0 0.502 0.771999 1.096 1.582 2.122 2.662 3.20199 3.57999 3.95799 4.44399;
#X coords 0 5.2 10 -0.2 200 100 1 0 0;
#X restore 309 263 graph;
-#X obj 68 212 tabread~ array77 array88;
-#X msg 124 137 set array77 array88;
-#X msg 137 168 set array88 array77;
-#X obj 68 334 snapshot~;
-#X floatatom 68 363 8 0 0 0 - - - 0;
-#X obj 89 291 r bang;
-#X obj 149 334 snapshot~;
-#X floatatom 149 363 8 0 0 0 - - - 0;
-#X text 51 21 [tabread~] generates multichannel signals if you give it more than one argument. Each channel then corresponds to an argument/table. The "set" message can also replace more than one table name. Note that the arrays do not need to be of the same length., f 66;
-#X connect 0 0 8 0;
-#X connect 0 1 11 0;
-#X connect 1 0 5 0;
+#X connect 0 0 6 0;
+#X connect 0 1 9 0;
+#X connect 1 0 3 0;
#X connect 2 0 1 0;
-#X connect 5 0 0 0;
-#X connect 6 0 5 0;
-#X connect 7 0 5 0;
+#X connect 3 0 0 0;
+#X connect 4 0 3 0;
+#X connect 5 0 3 0;
+#X connect 6 0 7 0;
+#X connect 8 0 6 0;
#X connect 8 0 9 0;
-#X connect 10 0 8 0;
-#X connect 10 0 11 0;
-#X connect 11 0 12 0;
+#X connect 9 0 10 0;
#X restore 486 356 pd multichannel;
#X text 335 341 mutichannel signal support ----------->, f 20;
#X obj 125 319 metro 200;
@@ -145,12 +143,17 @@
#X obj 53 304 r bang;
#X text 591 445 updated for Pd version 0.54;
#X text 55 67 [tabread~] looks up values from named arrays. Incoming values are truncated to the next lower integer \, and values out of bounds get the nearest (first or last) point., f 87;
+#X obj 466 148 cnv 19 298 148 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array tabread-ex 10 float 2;
+#X coords 0 5.2 10 -0.2 300 150 1 0 0;
+#X restore 465 147 graph;
#X connect 0 0 3 0;
-#X connect 1 0 19 0;
+#X connect 1 0 18 0;
#X connect 2 0 1 0;
-#X connect 18 0 19 0;
-#X connect 19 0 0 0;
-#X connect 30 0 29 0;
-#X connect 34 0 36 0;
-#X connect 35 0 34 0;
-#X connect 37 0 0 0;
+#X connect 17 0 18 0;
+#X connect 18 0 0 0;
+#X connect 29 0 28 0;
+#X connect 33 0 35 0;
+#X connect 34 0 33 0;
+#X connect 36 0 0 0;
diff --git a/doc/5.reference/tabsend-receive~-help.pd b/doc/5.reference/tabsend-receive~-help.pd
index e588dc075..874c49b8f 100644
--- a/doc/5.reference/tabsend-receive~-help.pd
+++ b/doc/5.reference/tabsend-receive~-help.pd
@@ -1,32 +1,24 @@
-#N canvas 438 23 714 548 12;
-#X obj 27 23 tabsend~;
-#X text 499 508 updated for Pd version 0.43;
-#X text 169 268 creation argument: initializes table name, f 22;
-#N canvas 0 22 450 278 (subpatch) 0;
-#X array table-1 64 float 0;
-#X coords 0 1 63 -1 200 100 1 0 0;
-#X restore 490 107 graph;
-#X obj 45 177 osc~ 440;
-#N canvas 0 22 450 278 (subpatch) 0;
-#X array table-2 64 float 0;
-#X coords 0 1 63 -1 200 100 1 0 0;
-#X restore 490 230 graph;
-#X msg 68 214 set table-1;
-#X obj 45 276 tabsend~ table-1;
-#X msg 76 239 set table-2;
-#X text 168 216 use 'set' message to change table's name, f 20;
-#X obj 182 509 block~;
-#X obj 86 509 send~;
-#X obj 233 509 array;
-#X obj 27 46 tabreceive~;
-#X text 193 372 creation argument: initializes table name, f 23;
-#X text 156 322 'set' message to change table name, f 17;
-#X obj 46 379 tabreceive~ table-1;
-#X msg 65 345 set table-1;
-#X msg 46 319 set table-2;
-#X obj 46 442 print~;
-#X obj 64 411 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X obj 277 509 tabwrite~;
+#N canvas 438 23 715 538 12;
+#X obj 27 17 tabsend~;
+#X text 499 499 updated for Pd version 0.43;
+#X text 169 259 creation argument: initializes table name, f 22;
+#X obj 45 168 osc~ 440;
+#X msg 68 205 set table-1;
+#X obj 45 267 tabsend~ table-1;
+#X msg 76 230 set table-2;
+#X text 168 207 use 'set' message to change table's name, f 20;
+#X obj 182 500 block~;
+#X obj 86 500 send~;
+#X obj 233 500 array;
+#X obj 27 40 tabreceive~;
+#X text 193 363 creation argument: initializes table name, f 23;
+#X text 156 313 'set' message to change table name, f 17;
+#X obj 46 370 tabreceive~ table-1;
+#X msg 65 336 set table-1;
+#X msg 46 310 set table-2;
+#X obj 46 433 print~;
+#X obj 64 402 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 277 500 tabwrite~;
#N canvas 647 144 569 384 Dealing_with_"\$0" 0;
#X msg 167 212 set \$1;
#X obj 167 186 symbol \$0-x;
@@ -47,10 +39,10 @@
#X connect 6 0 7 0;
#X connect 9 0 1 0;
#X connect 10 0 7 0;
-#X restore 483 453 pd Dealing_with_"\$0";
-#X text 479 415 open subpatch to see how to deal with '\$0', f 21;
-#X obj 8 80 cnv 1 700 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X obj 7 490 cnv 1 700 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X restore 483 444 pd Dealing_with_"\$0";
+#X text 479 406 open subpatch to see how to deal with '\$0', f 21;
+#X obj 8 71 cnv 1 700 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X obj 7 481 cnv 1 700 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#N canvas 698 99 576 461 reference 0;
#X obj 8 53 cnv 5 550 5 empty empty INLET: 8 18 0 13 #202020 #000000 0;
#X obj 8 117 cnv 2 550 2 empty empty OUTLETS: 8 12 0 13 #202020 #000000 0;
@@ -72,9 +64,9 @@
#X text 109 324 set - set table names.;
#X text 189 406 set table names (default: empty symbol).;
#X text 104 363 signal(s) - outputs 1 or more channels from matching arrays.;
-#X restore 535 27 pd reference;
-#X text 632 28 <= click;
-#X text 12 508 see also:;
+#X restore 535 21 pd reference;
+#X text 632 22 <= click;
+#X text 12 499 see also:;
#N canvas 643 412 384 186 array-examples 0;
#N canvas 491 316 457 285 open 0;
#X obj 120 23 inlet;
@@ -97,10 +89,10 @@
#X text 47 22 See also and the "array" examples from the section 2 of Pd's tutorial:, f 39;
#X connect 1 0 0 0;
#X connect 2 0 0 0;
-#X restore 349 509 pd array-examples;
-#X text 29 108 Use [tabsend~]/[tabreceive~] to write a block of audio to and receive it from an array. By default a block is 64 samples but this can be changed with the [block~] object.;
-#X obj 131 509 throw~;
-#X text 221 424 <-- example with a different block size, f 20;
+#X restore 349 500 pd array-examples;
+#X text 29 99 Use [tabsend~]/[tabreceive~] to write a block of audio to and receive it from an array. By default a block is 64 samples but this can be changed with the [block~] object.;
+#X obj 131 500 throw~;
+#X text 221 415 <-- example with a different block size, f 20;
#N canvas 794 185 528 353 [block~] 0;
#X obj 117 113 block~ 1024;
#X obj 49 159 noise~;
@@ -117,23 +109,15 @@
#X connect 1 0 6 0;
#X connect 7 0 4 0;
#X connect 8 0 4 0;
-#X restore 134 424 pd [block~];
-#X msg 358 243 \; pd dsp \$1;
-#X obj 358 208 set-dsp-tgl;
-#X text 389 212 DSP on/off;
-#N canvas 577 106 609 529 multichannel 0;
+#X restore 134 415 pd [block~];
+#X msg 358 234 \; pd dsp \$1;
+#X obj 358 199 set-dsp-tgl;
+#X text 389 203 DSP on/off;
+#N canvas 577 106 596 554 multichannel 0;
#X msg 453 278 \; pd dsp \$1;
#X text 485 241 DSP on/off;
#X obj 453 237 set-dsp-tgl;
#X text 41 14 [tabsend~] and [tabreceive~] have support for multichannel signals in a similar fashion to the way [tabwrite~] and [tabplay~] work. This way \, [tabsend~] takes multichannel signals and distributes it to arrays and [tabreceive~] generates multichannel signals if it has more than one table argument. The set message also replaces all table names., f 71;
-#N canvas 0 50 450 250 (subpatch) 0;
-#X array array55 64 float 0;
-#X coords 0 1 63 -1 200 140 1 0 0;
-#X restore 95 377 graph;
-#N canvas 0 50 450 250 (subpatch) 0;
-#X array array66 64 float 0;
-#X coords 0 1 63 -1 200 140 1 0 0;
-#X restore 322 377 graph;
#X obj 58 193 snake~ in;
#X obj 285 224 snake~ out;
#X obj 58 129 osc~ 500;
@@ -147,28 +131,48 @@
#X msg 297 155 set array66 array55;
#X msg 285 125 set array55 array66;
#X obj 285 190 tabreceive~ array55 array66;
+#X obj 96 378 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#X obj 323 378 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 250 (subpatch) 0;
+#X array array55 64 float 0;
+#X coords 0 1 63 -1 200 140 1 0 0;
+#X restore 95 377 graph;
+#N canvas 0 50 450 250 (subpatch) 0;
+#X array array66 64 float 0;
+#X coords 0 1 63 -1 200 140 1 0 0;
+#X restore 322 377 graph;
#X connect 2 0 0 0;
-#X connect 6 0 13 0;
-#X connect 7 0 10 0;
-#X connect 7 1 11 0;
-#X connect 8 0 6 0;
-#X connect 9 0 6 1;
+#X connect 4 0 11 0;
+#X connect 5 0 8 0;
+#X connect 5 1 9 0;
+#X connect 6 0 4 0;
+#X connect 7 0 4 1;
+#X connect 10 0 9 0;
+#X connect 10 0 8 0;
#X connect 12 0 11 0;
-#X connect 12 0 10 0;
-#X connect 14 0 13 0;
-#X connect 15 0 13 0;
-#X connect 16 0 18 0;
-#X connect 17 0 18 0;
-#X connect 18 0 7 0;
-#X restore 547 376 pd multichannel;
-#X text 396 361 mutichannel signal support ----------->, f 20;
-#X text 115 46 - read a block of audio from arrays continuously;
-#X text 115 22 - write a block of audio to arrays continuously;
-#X connect 4 0 7 0;
-#X connect 6 0 7 0;
-#X connect 8 0 7 0;
-#X connect 16 0 19 0;
-#X connect 17 0 16 0;
-#X connect 18 0 16 0;
-#X connect 20 0 19 0;
-#X connect 35 0 34 0;
+#X connect 13 0 11 0;
+#X connect 14 0 16 0;
+#X connect 15 0 16 0;
+#X connect 16 0 5 0;
+#X restore 547 367 pd multichannel;
+#X text 396 352 mutichannel signal support ----------->, f 20;
+#X text 115 40 - read a block of audio from arrays continuously;
+#X text 115 16 - write a block of audio to arrays continuously;
+#X obj 491 99 cnv 19 198 98 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 22 450 278 (subpatch) 0;
+#X array table-1 64 float 0;
+#X coords 0 1 63 -1 200 100 1 0 0;
+#X restore 490 98 graph;
+#X obj 491 222 cnv 19 198 98 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 22 450 278 (subpatch) 0;
+#X array table-2 64 float 0;
+#X coords 0 1 63 -1 200 100 1 0 0;
+#X restore 490 221 graph;
+#X connect 3 0 5 0;
+#X connect 4 0 5 0;
+#X connect 6 0 5 0;
+#X connect 14 0 17 0;
+#X connect 15 0 14 0;
+#X connect 16 0 14 0;
+#X connect 18 0 17 0;
+#X connect 33 0 32 0;
diff --git a/doc/5.reference/tabwrite-help.pd b/doc/5.reference/tabwrite-help.pd
index 1e65db631..718d16a81 100644
--- a/doc/5.reference/tabwrite-help.pd
+++ b/doc/5.reference/tabwrite-help.pd
@@ -1,10 +1,6 @@
#N canvas 389 50 666 457 12;
#X obj 26 22 tabwrite;
#X floatatom 28 136 4 0 10 0 - - - 0;
-#N canvas 0 22 450 278 (subpatch) 0;
-#X array tabwrite-ex 10 float 2;
-#X coords 0 10 10 0 250 200 1 0 0;
-#X restore 373 137 graph;
#X floatatom 165 261 4 0 9 0 - - - 0;
#X text 180 284 creation argument;
#X text 182 302 is array name;
@@ -89,6 +85,11 @@
#X connect 2 0 0 0;
#X restore 317 420 pd array-examples;
#X text 22 66 [tabwrite] writes floats into an array \, input values are set in the left inlet \, while the index is set on the right inlet., f 62;
-#X connect 1 0 15 0;
-#X connect 3 0 15 1;
-#X connect 16 0 15 0;
+#X obj 374 138 cnv 19 248 198 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 22 450 278 (subpatch) 0;
+#X array tabwrite-ex 10 float 2;
+#X coords 0 10 10 0 250 200 1 0 0;
+#X restore 373 137 graph;
+#X connect 1 0 14 0;
+#X connect 2 0 14 1;
+#X connect 15 0 14 0;
diff --git a/doc/5.reference/tabwrite~-help.pd b/doc/5.reference/tabwrite~-help.pd
index abb1481b1..9be0456bf 100644
--- a/doc/5.reference/tabwrite~-help.pd
+++ b/doc/5.reference/tabwrite~-help.pd
@@ -1,9 +1,5 @@
#N canvas 366 43 665 518 12;
-#X obj 55 17 tabwrite~;
-#N canvas 0 50 450 300 (subpatch) 0;
-#X array buffer 1000 float 0;
-#X coords 0 1 999 -1 200 100 1 0 0;
-#X restore 431 177 graph;
+#X obj 25 17 tabwrite~;
#X text 167 363 creation argument initializes array name;
#X obj 169 455 tabread;
#X obj 229 455 tabwrite;
@@ -96,14 +92,6 @@
#X obj 414 189 set-dsp-tgl;
#X obj 190 99 osc~ 1000;
#X obj 250 129 osc~ 2000;
-#N canvas 0 50 450 250 (subpatch) 0;
-#X array array11 150 float 0;
-#X coords 0 1 149 -1 200 140 1 0 0;
-#X restore 67 346 graph;
-#N canvas 0 50 450 250 (subpatch) 0;
-#X array array22 100 float 0;
-#X coords 0 1 99 -1 200 140 1 0 0;
-#X restore 294 346 graph;
#X obj 95 212 bng 20 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
#X msg 208 201 set array11 array22;
#X msg 220 231 set array22 array11;
@@ -112,23 +100,38 @@
#X obj 95 138 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
#X text 46 21 [tabwrite~] works with multichannel signals if you give it more than one argument. Each channel is then written to a corresponding argument/table. The "set" message can also replace more than one table name. Note that the arrays do not need to be of the same length., f 66;
#X obj 190 163 snake~ in;
+#X obj 68 347 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#X obj 295 347 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 250 (subpatch) 0;
+#X array array11 150 float 0;
+#X coords 0 1 149 -1 200 140 1 0 0;
+#X restore 67 346 graph;
+#N canvas 0 50 450 250 (subpatch) 0;
+#X array array22 100 float 0;
+#X coords 0 1 99 -1 200 140 1 0 0;
+#X restore 294 346 graph;
#X connect 2 0 0 0;
-#X connect 3 0 14 0;
-#X connect 4 0 14 1;
-#X connect 7 0 10 0;
-#X connect 8 0 10 0;
-#X connect 9 0 10 0;
-#X connect 11 0 7 0;
-#X connect 12 0 11 0;
-#X connect 14 0 10 0;
+#X connect 3 0 12 0;
+#X connect 4 0 12 1;
+#X connect 5 0 8 0;
+#X connect 6 0 8 0;
+#X connect 7 0 8 0;
+#X connect 9 0 5 0;
+#X connect 10 0 9 0;
+#X connect 12 0 8 0;
#X restore 511 320 pd multichannel;
#X text 360 305 mutichannel signal support ----------->, f 20;
#X text 44 69 [tabwrite~] records audio signals sequentially into one or more arrays. Sending it "bang" writes from beginning to end of the array. To avoid writing all the way to the end \, you can send a "stop" message at an appropriate later time. The "start" message allows setting the array location at which the first sample is written. (Starting and stopping occur on block boundaries \, typically multiples of 64 samples \, in the input signal.), f 80;
-#X text 135 17 - write signals to arrays;
+#X text 105 17 - write signals to arrays;
#X text 446 469 updated for Pd version 0.54;
-#X connect 8 0 13 0;
-#X connect 10 0 13 0;
-#X connect 14 0 13 0;
-#X connect 15 0 13 0;
-#X connect 26 0 13 0;
-#X connect 28 0 27 0;
+#X obj 432 178 cnv 19 198 98 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 300 (subpatch) 0;
+#X array buffer 1000 float 0;
+#X coords 0 1 999 -1 200 100 1 0 0;
+#X restore 431 177 graph;
+#X connect 7 0 12 0;
+#X connect 9 0 12 0;
+#X connect 13 0 12 0;
+#X connect 14 0 12 0;
+#X connect 25 0 12 0;
+#X connect 27 0 26 0;
diff --git a/doc/5.reference/text-object-help.pd b/doc/5.reference/text-object-help.pd
index eb596e4c5..e9c010d08 100644
--- a/doc/5.reference/text-object-help.pd
+++ b/doc/5.reference/text-object-help.pd
@@ -869,7 +869,7 @@
#X connect 1 0 3 0;
#X connect 2 0 1 0;
#X restore 454 382 pd open;
-#X text 484 331 open first example of the 4.Data.Structure section., f 20;
+#X text 486 334 open first example of the 4.Data.Structure section., f 25;
#X obj 82 288 print line;
#X text 560 30 <= open to see scalat;
#X connect 0 0 6 0;
diff --git a/doc/5.reference/timer-help.pd b/doc/5.reference/timer-help.pd
index e0eaf0f58..6bd97638d 100644
--- a/doc/5.reference/timer-help.pd
+++ b/doc/5.reference/timer-help.pd
@@ -1,32 +1,32 @@
-#N canvas 421 23 632 630 12;
-#X msg 95 367 bang;
-#X obj 63 397 timer;
-#X obj 71 14 timer;
-#X text 116 13 - measure logical time;
-#X floatatom 63 423 7 0 0 0 - - - 0;
-#X text 33 585 see also:;
-#X obj 331 273 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X obj 113 597 delay;
-#X obj 363 363 sel 1;
-#X floatatom 363 448 5 0 0 0 - - - 0;
-#X obj 331 312 t f f;
-#X obj 158 597 metro;
-#X obj 465 363 metro 1 90 permin;
-#X obj 363 421 timer 90 permin;
-#X text 365 586 updated for Pd version 0.47;
-#X obj 112 573 realtime;
-#X obj 180 573 cputime;
-#X text 41 204 These symbols can also be preceded by "per" (as in "permin" \, "permsec" \, etc.) In this case \, 60 permin means 1/60 min (hence \, the same as 'BPM')., f 78;
-#X text 49 136 - millisecond (msec for short) \; - seconds (sec) \; - minutes (min) \; - samples (samp) - depends on the sample rate the patch is running, f 67;
-#X text 161 305 set tempo units;
-#X msg 63 301 tempo 1 sec;
-#X msg 73 326 tempo 1 msec;
-#X text 390 260 Here \, the metronome outputs at intervals of one beat at 90 beats per minute as the timer also set to that tempo measures., f 29;
-#X text 71 258 reset (set elapsed time to zero), f 18;
-#X text 138 356 output elapsed time. You can click multiple times since it was last reset., f 25;
-#X obj 203 598 text sequence;
-#X text 122 414 elapsed time in the specified time units, f 20;
-#X text 50 478 Note you need to reset the elapsed time to zero when you change the tempo message when the object is runnng \, otherwise you get funny results because the change takes effect immediately and gets applied to the remaining part of the elapsed time., f 75;
+#N canvas 421 23 617 624 12;
+#X msg 84 365 bang;
+#X obj 52 395 timer;
+#X obj 20 12 timer;
+#X text 65 11 - measure logical time;
+#X floatatom 52 421 7 0 0 0 - - - 0;
+#X text 13 580 see also:;
+#X obj 320 271 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X obj 93 592 delay;
+#X obj 352 361 sel 1;
+#X floatatom 352 446 5 0 0 0 - - - 0;
+#X obj 320 310 t f f;
+#X obj 138 592 metro;
+#X obj 454 361 metro 1 90 permin;
+#X obj 352 419 timer 90 permin;
+#X text 407 568 updated for Pd version 0.47;
+#X obj 92 568 realtime;
+#X obj 160 568 cputime;
+#X text 30 202 These symbols can also be preceded by "per" (as in "permin" \, "permsec" \, etc.) In this case \, 60 permin means 1/60 min (hence \, the same as 'BPM')., f 78;
+#X text 38 134 - millisecond (msec for short) \; - seconds (sec) \; - minutes (min) \; - samples (samp) - depends on the sample rate the patch is running, f 67;
+#X text 150 303 set tempo units;
+#X msg 52 299 tempo 1 sec;
+#X msg 62 324 tempo 1 msec;
+#X text 379 258 Here \, the metronome outputs at intervals of one beat at 90 beats per minute as the timer also set to that tempo measures., f 29;
+#X text 60 256 reset (set elapsed time to zero), f 18;
+#X text 127 354 output elapsed time. You can click multiple times since it was last reset., f 25;
+#X obj 183 593 text sequence;
+#X text 111 412 elapsed time in the specified time units, f 20;
+#X text 39 476 Note you need to reset the elapsed time to zero when you change the tempo message when the object is runnng \, otherwise you get funny results because the change takes effect immediately and gets applied to the remaining part of the elapsed time., f 75;
#N canvas 700 98 489 311 reference 0;
#X obj 18 52 cnv 5 450 5 empty empty INLET: 8 18 0 13 #202020 #000000 0;
#X obj 18 229 cnv 2 450 2 empty empty ARGUMENTS: 8 12 0 13 #202020 #000000 0;
@@ -43,14 +43,14 @@
#X obj 18 157 cnv 1 450 1 empty empty 2nd: 8 12 0 13 #7c7c7c #000000 0;
#X obj 18 84 cnv 1 450 1 empty empty 1st: 8 12 0 13 #7c7c7c #000000 0;
#X text 133 201 1) float - elapsed time in msec.;
-#X restore 465 14 pd reference;
-#X text 397 13 click =>;
-#X obj 17 46 cnv 1 600 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X obj 17 555 cnv 1 600 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X text 24 54 The [timer] object measures elapsed logical time. Logical time moves forward as if all computation were instantaneous and as if all [delay] and [metro] objects were exact. By default \, the time unit is 1 millisecond \, but you can change this with the 'tempo' message (as in [delay] \, [metro] and [text sequence]) \, which takes a different tempo number and a time unit symbol. Possible symbols are:, f 82;
-#X obj 45 265 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X obj 363 392 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X obj 465 392 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X restore 504 12 pd reference;
+#X text 436 11 click =>;
+#X obj 6 44 cnv 1 600 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X obj 6 553 cnv 1 600 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 13 52 The [timer] object measures elapsed logical time. Logical time moves forward as if all computation were instantaneous and as if all [delay] and [metro] objects were exact. By default \, the time unit is 1 millisecond \, but you can change this with the 'tempo' message (as in [delay] \, [metro] and [text sequence]) \, which takes a different tempo number and a time unit symbol. Possible symbols are:, f 82;
+#X obj 34 263 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 352 390 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 454 390 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X connect 0 0 1 1;
#X connect 1 0 4 0;
#X connect 6 0 10 0;
diff --git a/doc/5.reference/unpack-help.pd b/doc/5.reference/unpack-help.pd
index 6adb27bef..85c89b76a 100644
--- a/doc/5.reference/unpack-help.pd
+++ b/doc/5.reference/unpack-help.pd
@@ -1,4 +1,4 @@
-#N canvas 626 37 598 499 12;
+#N canvas 529 47 598 499 12;
#X floatatom 281 226 5 0 0 0 - - - 0;
#X obj 116 463 pack;
#X obj 57 14 unpack;
diff --git a/doc/5.reference/vcf~-help.pd b/doc/5.reference/vcf~-help.pd
index 62862a5da..0ff2bc4e7 100644
--- a/doc/5.reference/vcf~-help.pd
+++ b/doc/5.reference/vcf~-help.pd
@@ -57,7 +57,7 @@
#X text 36 129 [vcf~] can take a signal to set the resonant frequency as in an analog voltage controlled filter ("vcf" for short). It is thus more expensive but more powerful than [bp~]. The resonance "Q" or filter sharpness is still only set by control messages., f 83;
#X text 371 395 Listen to how the white noise input is filtered. The higher the Q \, the more attenuation we have for frequencies besides the center frequency \, so the less wide the frequency band is., f 38;
#X text 36 59 [vcf~] is a one-pole complex filter with outlets for the real (left) and imaginary (right) parts \, which are \, respectively \, a band-pass and a low-pass filter (that can be combined to allow other possibilities). The maximum gain is constant at 0dB \, what makes the lowpass output more like a bandpass really \, and similar to [bp~]., f 83;
-#X text 245 475 ("low-pass");
+#X text 255 475 (low-pass);
#X connect 0 0 32 0;
#X connect 1 0 5 2;
#X connect 5 0 15 0;
diff --git a/doc/5.reference/writesf~-help.pd b/doc/5.reference/writesf~-help.pd
index 18fcca3be..44459636e 100644
--- a/doc/5.reference/writesf~-help.pd
+++ b/doc/5.reference/writesf~-help.pd
@@ -1,4 +1,4 @@
-#N canvas 552 38 639 585 12;
+#N canvas 506 40 639 585 12;
#X msg 147 374 print;
#X msg 128 320 start;
#X msg 135 348 stop;
diff --git a/extra/hilbert~-help.pd b/extra/hilbert~-help.pd
index bb23931cc..07bf052a8 100644
--- a/extra/hilbert~-help.pd
+++ b/extra/hilbert~-help.pd
@@ -1,10 +1,5 @@
-#N canvas 608 46 607 415 12;
+#N canvas 443 50 607 415 12;
#X obj 47 214 hilbert~;
-#N canvas 0 22 450 278 (subpatch) 0;
-#X array real 882 float 0;
-#X array imaginary 882 float 0;
-#X coords 0 1 881 -1 300 170 1 0 0;
-#X restore 281 151 graph;
#X floatatom 47 125 4 0 0 0 - - - 0;
#X text 23 379 see also:;
#X obj 100 379 complex-mod~;
@@ -39,7 +34,7 @@
#X obj 47 327 tabwrite~ real;
#X obj 100 298 tabwrite~ imaginary;
#X text 323 328 real = red / imaginary = green;
-#N canvas 1105 147 263 139 init 0;
+#N canvas 1103 147 263 139 init 0;
#X obj 31 22 loadbang;
#X msg 31 48 \; real width 2 \, color 900 \; imaginary width 2 \, color 90;
#X connect 0 0 1 0;
@@ -49,12 +44,18 @@
#X text 95 16 - hilbert transform;
#X text 174 126 DSP on/off;
#X obj 142 123 ../doc/5.reference/set-dsp-tgl;
-#X connect 0 0 17 0;
-#X connect 0 1 18 0;
-#X connect 2 0 7 0;
-#X connect 6 0 8 0;
-#X connect 7 0 0 0;
-#X connect 8 0 17 0;
-#X connect 8 0 18 0;
-#X connect 13 0 0 1;
-#X connect 25 0 9 0;
+#X obj 282 152 cnv 19 298 168 empty empty empty 20 12 0 12 #404040 #404040 0;
+#N canvas 0 22 450 278 (subpatch) 0;
+#X array real 882 float 0;
+#X array imaginary 882 float 0;
+#X coords 0 1 881 -1 300 170 1 0 0;
+#X restore 281 151 graph;
+#X connect 0 0 16 0;
+#X connect 0 1 17 0;
+#X connect 1 0 6 0;
+#X connect 5 0 7 0;
+#X connect 6 0 0 0;
+#X connect 7 0 16 0;
+#X connect 7 0 17 0;
+#X connect 12 0 0 1;
+#X connect 24 0 8 0;
diff --git a/extra/loop~/loop~-help.pd b/extra/loop~/loop~-help.pd
index a6eff62a2..57db08808 100644
--- a/extra/loop~/loop~-help.pd
+++ b/extra/loop~/loop~-help.pd
@@ -4,10 +4,6 @@
#X obj 265 435 print~;
#X floatatom 105 287 7 0 0 0 - - - 0;
#X obj 214 435 print~;
-#N canvas 0 0 450 300 (subpatch) 0;
-#X array sample 155944 float 0;
-#X coords 0 1 155943 -1 250 150 1 0 0;
-#X restore 347 406 graph;
#X obj 296 253 soundfiler;
#X obj 87 422 *~;
#X obj 128 449 samphold~;
@@ -60,26 +56,31 @@
#X obj 93 247 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X obj 214 392 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X obj 265 392 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X connect 0 0 29 0;
-#X connect 2 0 35 0;
-#X connect 5 0 28 0;
-#X connect 6 0 8 0;
-#X connect 7 0 8 1;
-#X connect 8 0 32 0;
-#X connect 9 0 10 0;
-#X connect 10 0 7 0;
-#X connect 11 0 36 0;
-#X connect 22 0 30 0;
-#X connect 29 0 36 0;
-#X connect 30 0 5 0;
-#X connect 31 0 5 0;
-#X connect 32 0 20 0;
-#X connect 35 0 36 1;
-#X connect 36 0 3 0;
-#X connect 36 0 6 0;
-#X connect 36 0 7 1;
-#X connect 36 1 1 0;
-#X connect 36 1 6 1;
-#X connect 38 0 36 0;
-#X connect 39 0 3 0;
-#X connect 40 0 1 0;
+#X obj 348 407 cnv 19 248 148 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 0 450 300 (subpatch) 0;
+#X array sample 155944 float 2;
+#X coords 0 1 155944 -1 250 150 1 0 0;
+#X restore 347 406 graph;
+#X connect 0 0 28 0;
+#X connect 2 0 34 0;
+#X connect 4 0 27 0;
+#X connect 5 0 7 0;
+#X connect 6 0 7 1;
+#X connect 7 0 31 0;
+#X connect 8 0 9 0;
+#X connect 9 0 6 0;
+#X connect 10 0 35 0;
+#X connect 21 0 29 0;
+#X connect 28 0 35 0;
+#X connect 29 0 4 0;
+#X connect 30 0 4 0;
+#X connect 31 0 19 0;
+#X connect 34 0 35 1;
+#X connect 35 0 3 0;
+#X connect 35 0 5 0;
+#X connect 35 0 6 1;
+#X connect 35 1 1 0;
+#X connect 35 1 5 1;
+#X connect 37 0 35 0;
+#X connect 38 0 3 0;
+#X connect 39 0 1 0;
diff --git a/extra/lrshift~/lrshift~-help.pd b/extra/lrshift~/lrshift~-help.pd
index db14fdb62..5dd6e11f6 100644
--- a/extra/lrshift~/lrshift~-help.pd
+++ b/extra/lrshift~/lrshift~-help.pd
@@ -1,19 +1,14 @@
#N canvas 513 80 652 407 12;
-#X obj 265 326 print~;
-#X obj 130 326 print~;
-#X obj 54 326 print~;
-#X text 84 244 shift left, f 5;
-#X text 216 245 shift right, f 6;
-#X obj 130 246 lrshift~ 1;
-#X obj 265 245 lrshift~ -1;
-#N canvas 0 22 450 300 (subpatch) 0;
-#X array shiftin 64 float 1;
-#A 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
-#X coords 0 1 63 0 250 140 1 0 0;
-#X restore 384 144 graph;
-#X obj 55 175 tabreceive~ shiftin;
+#X obj 253 326 print~;
+#X obj 118 326 print~;
+#X obj 42 326 print~;
+#X text 72 244 shift left, f 5;
+#X text 204 245 shift right, f 6;
+#X obj 118 246 lrshift~ 1;
+#X obj 253 245 lrshift~ -1;
+#X obj 43 175 tabreceive~ shiftin;
#X obj 38 11 lrshift~;
-#X msg 235 176 \; pd dsp \$1, f 10;
+#X msg 229 176 \; pd dsp \$1, f 10;
#X text 562 10 <= click;
#N canvas 559 250 572 199 reference 0;
#X obj 8 52 cnv 5 550 5 empty empty INLET: 8 18 0 13 #202020 #000000 0;
@@ -28,13 +23,13 @@
#X restore 468 11 pd reference;
#X obj 5 42 cnv 1 640 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X obj 5 360 cnv 1 640 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X obj 73 290 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X obj 285 292 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X obj 151 293 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 61 290 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 273 292 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 139 293 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X text 106 11 - shift block elements left or right;
-#X text 267 141 DSP on/off;
-#X obj 235 139 ../../doc/5.reference/set-dsp-tgl;
-#N canvas 775 164 356 502 multichannel 0;
+#X text 261 141 DSP on/off;
+#X obj 229 139 ../../doc/5.reference/set-dsp-tgl;
+#N canvas 775 164 356 482 multichannel 0;
#X msg 178 195 \; pd dsp \$1;
#X text 210 158 DSP on/off;
#X obj 63 173 snake~ out;
@@ -42,31 +37,38 @@
#X obj 130 251 print~ R;
#X obj 81 211 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000;
#X obj 178 154 ../../doc/5.reference/set-dsp-tgl;
+#X obj 63 109 tabreceive~ shiftin shiftin2;
+#X obj 63 141 lrshift~ -2;
+#X text 65 18 [lrshift~] has support for multichannel signals as it is possible from the output of [tabreceive~] and other objects in Pd., f 29;
+#X obj 57 312 cnv 19 248 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
#N canvas 0 22 450 300 (subpatch) 0;
#X array shiftin2 64 float 1;
#A 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
#X coords 0 1 63 0 250 140 1 0 0;
-#X restore 38 324 graph;
-#X obj 63 109 tabreceive~ shiftin shiftin2;
-#X obj 63 141 lrshift~ -2;
-#X text 65 18 [lrshift~] has support for multichannel signals as it is possible from the output of [tabreceive~] and other objects in Pd., f 29;
+#X restore 56 311 graph;
#X connect 2 0 3 0;
#X connect 2 1 4 0;
#X connect 5 0 4 0;
#X connect 5 0 3 0;
#X connect 6 0 0 0;
-#X connect 8 0 9 0;
-#X connect 9 0 2 0;
+#X connect 7 0 8 0;
+#X connect 8 0 2 0;
#X restore 501 321 pd multichannel;
#X text 350 306 mutichannel signal support ----------->, f 20;
#X text 418 375 Updated for Pd version 0.54;
#X text 41 58 Acting at whatever vector size the window is running at \, [lrshift~] shifts samples to the left (toward the beginning sample) or to the right. The argument gives the direction and the amount of the shift. The rightmost (or leftmost) samples are set to zero. This is mostly useful for FFT/spectral processing., f 82;
+#X obj 385 145 cnv 19 248 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 22 450 300 (subpatch) 0;
+#X array shiftin 64 float 1;
+#A 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
+#X coords 0 1 63 0 250 140 1 0 0;
+#X restore 384 144 graph;
#X connect 5 0 1 0;
#X connect 6 0 0 0;
-#X connect 8 0 2 0;
-#X connect 8 0 5 0;
-#X connect 8 0 6 0;
-#X connect 15 0 2 0;
-#X connect 16 0 0 0;
-#X connect 17 0 1 0;
-#X connect 20 0 10 0;
+#X connect 7 0 2 0;
+#X connect 7 0 5 0;
+#X connect 7 0 6 0;
+#X connect 14 0 2 0;
+#X connect 15 0 0 0;
+#X connect 16 0 1 0;
+#X connect 19 0 9 0;
diff --git a/extra/output~-help.pd b/extra/output~-help.pd
index 7b2e6f2e2..8e1f695f7 100644
--- a/extra/output~-help.pd
+++ b/extra/output~-help.pd
@@ -25,12 +25,12 @@
#X obj 419 318 osc~ 880;
#X msg 334 318 level \$1;
#X text 381 442 updated for Pd version 0.54;
-#X obj 82 316 noise~;
-#X obj 82 354 output~;
+#X obj 82 299 noise~;
+#X obj 82 337 output~;
#X text 484 317 right input;
#X text 381 253 left input;
#X text 391 290 volume control;
-#X text 22 277 mono input goes to both outputs, f 12;
+#X text 22 260 mono input goes to both outputs, f 12;
#X floatatom 334 291 7 0 1 0 - - - 0;
#X msg 250 294 mute \$1;
#X obj 250 266 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1;
diff --git a/extra/pique/pique-help.pd b/extra/pique/pique-help.pd
index 329204516..30e94a1c3 100644
--- a/extra/pique/pique-help.pd
+++ b/extra/pique/pique-help.pd
@@ -2,14 +2,6 @@
#X obj 47 11 pique;
#X obj 116 194 rfft~;
#X obj 39 151 osc~ 2000;
-#N canvas 0 22 450 278 (subpatch) 0;
-#X array fft-real 64 float 0;
-#X coords 0 64 63 -64 200 140 1;
-#X restore 496 96 graph;
-#N canvas 0 22 450 278 (subpatch) 0;
-#X array fft-imag 64 float 0;
-#X coords 0 64 63 -64 200 140 1;
-#X restore 496 265 graph;
#X obj 116 268 tabwrite~ fft-real;
#X obj 198 238 tabwrite~ fft-imag;
#X obj 198 202 metro 1000;
@@ -20,9 +12,7 @@
#X obj 116 151 osc~ 5000;
#X text 20 308 message arguments: number of FFT points \, fft real part \, fft imaginary part \, maximum number of peaks to report.;
#X text 97 12 - find peaks in an FFT spectrum;
-#X msg 346 180 \; pd dsp \$1;
-#X obj 346 153 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 371 154 DSP on/off;
+#X msg 336 179 \; pd dsp \$1;
#X obj 357 55 sigmund~;
#X obj 5 43 cnv 1 710 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 639 12 <= click;
@@ -45,13 +35,25 @@
#X text 554 458 updated for Pd 0.31;
#X text 18 55 NOTE: [pique] is obsolete - consider using -->;
#X text 17 79 [pique] takes unwindowed FFT analyses as input (they should be stored in arrays) and outputs a list of peaks \, giving their peak number \, frequency \, amplitude \, and phase (as a cosine/sine pair.), f 64;
-#X connect 1 0 5 0;
-#X connect 1 1 6 0;
+#X obj 497 97 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#X obj 497 266 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 22 450 278 (subpatch) 0;
+#X array fft-real 64 float 0;
+#X coords 0 64 63 -64 200 140 1;
+#X restore 496 96 graph;
+#N canvas 0 22 450 278 (subpatch) 0;
+#X array fft-imag 64 float 0;
+#X coords 0 64 63 -64 200 140 1;
+#X restore 496 265 graph;
+#X text 366 146 DSP on/off;
+#X obj 336 143 ../../doc/5.reference/set-dsp-tgl;
+#X connect 1 0 3 0;
+#X connect 1 1 4 0;
#X connect 2 0 1 0;
-#X connect 7 0 5 0;
-#X connect 7 0 6 0;
+#X connect 5 0 3 0;
+#X connect 5 0 4 0;
+#X connect 6 0 5 0;
+#X connect 7 0 9 0;
#X connect 8 0 7 0;
-#X connect 9 0 11 0;
-#X connect 10 0 9 0;
-#X connect 12 0 1 0;
-#X connect 16 0 15 0;
+#X connect 10 0 1 0;
+#X connect 29 0 13 0;
diff --git a/extra/sigmund~/sigmund~-help.pd b/extra/sigmund~/sigmund~-help.pd
index 0d9eab0ba..376ae3b9d 100644
--- a/extra/sigmund~/sigmund~-help.pd
+++ b/extra/sigmund~/sigmund~-help.pd
@@ -1,10 +1,6 @@
#N canvas 426 47 631 621 12;
#X declare -stdpath ./;
#N canvas 629 23 564 665 using-with-tables 0;
-#N canvas 0 50 450 300 (subpatch) 0;
-#X array insignal 1024 float 0;
-#X coords 0 1 1023 -1 200 140 1;
-#X restore 48 500 graph;
#X obj 310 564 phasor~;
#X obj 310 597 tabwrite~ insignal;
#X obj 284 564 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
@@ -33,20 +29,25 @@
#X msg 64 349 list insignal 512 512 44100;
#X text 106 178 - optional debug flag (print debugging info if nonzero);
#X text 22 212 Note that in this mode you can't have 'notes' output! Also note that if you're getting tracks output you may want to 'clear' the tracks before starting a new analysis from the beginning of the table., f 73;
-#X connect 1 0 2 0;
-#X connect 3 0 2 0;
-#X connect 9 0 1 0;
-#X connect 9 0 3 0;
+#X obj 49 501 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0;
+#N canvas 0 50 450 300 (subpatch) 0;
+#X array insignal 1024 float 0;
+#X coords 0 1 1023 -1 200 140 1;
+#X restore 48 500 graph;
+#X connect 0 0 1 0;
+#X connect 2 0 1 0;
+#X connect 8 0 0 0;
+#X connect 8 0 2 0;
+#X connect 13 0 11 0;
#X connect 14 0 12 0;
#X connect 15 0 13 0;
-#X connect 16 0 14 0;
-#X connect 16 1 15 0;
-#X connect 16 2 10 0;
-#X connect 16 3 11 0;
-#X connect 23 0 21 0;
-#X connect 24 0 16 0;
-#X connect 25 0 16 0;
-#X connect 26 0 16 0;
+#X connect 15 1 14 0;
+#X connect 15 2 9 0;
+#X connect 15 3 10 0;
+#X connect 22 0 20 0;
+#X connect 23 0 15 0;
+#X connect 24 0 15 0;
+#X connect 25 0 15 0;
#X restore 457 482 pd using-with-tables;
#X obj 77 490 phasor~;
#X floatatom 77 544 8 0 0 0 - - - 0;
From 5e9739390995f236ef4c2e3ad040b4e32ea05ffa Mon Sep 17 00:00:00 2001
From: porres
Date: Wed, 13 Mar 2024 00:05:53 -0300
Subject: [PATCH 101/450] document 'MPE' (MIDI POLYPHONIC EXPRESSION)
closes https://github.com/pure-data/pddp/issues/171
---
doc/5.reference/clone-help.pd | 20 +-
doc/5.reference/midi-help.pd | 303 +++++++++++++++++++++----------
doc/5.reference/textfile-help.pd | 98 +++++-----
doc/5.reference/textfile.txt | 5 +-
4 files changed, 272 insertions(+), 154 deletions(-)
diff --git a/doc/5.reference/clone-help.pd b/doc/5.reference/clone-help.pd
index 507850ffa..2dc31e729 100644
--- a/doc/5.reference/clone-help.pd
+++ b/doc/5.reference/clone-help.pd
@@ -1,4 +1,4 @@
-#N canvas 305 29 794 703 12;
+#N canvas 305 29 787 709 12;
#X declare -stdpath ./;
#X floatatom 223 250 5 57 83 0 - - - 0;
#X obj 223 290 t b f, f 9;
@@ -126,16 +126,18 @@
#X text 486 467 "all" sends a message to all instances, f 21;
#X text 364 286 <-- resize the number of instances;
#X text 24 46 [clone] creates any number of copies of an abstraction (a patch loaded as an object in another patch). By default "\$1" is set to the instance number within each copy (counted from 0 unless overridden by the "-s" flag). You can prevent '\$1' from reflecting the instance number with the "-x" flag. Arguments must be filename and number of copies \, additional arguments are passed to the copies and appear as \$2 and onward (or \$1 and onward with the "-x" flag)., f 104;
-#X text 23 197 Signal inlets can get non float control messages with the 'fwd' argument in the same way \, but signals are sent to all the instances. See [pd multichannel] example for more details on how signal distribution works in [clone]., f 104;
#X listbox 353 546 7 0 0 0 - - - 0;
-#X text 23 121 [clone]'s inlets/outlets correspond to those of the contained patch \, and may be control and/or signal inlets/outlets (this example has one control inlet plus one signal and another control outlet). You can click on the clone object to see the first of the created instances. At least one control inlet is present even if the abstraction has none so [clone] can receive the 'vis' and 'resize' messages. The way control inlets/outlets forward messages is shown below., f 104;
#X text 410 546 control data is preceded by instance number;
#X obj 193 679 poly;
#X text 80 623 Note: for backwards compatibility \, you can also invoke this as "clone 16 clone-abstraction" (for instance) \, swapping the abstraction name and the number of voices., f 91;
-#X text 54 412 Open or close copy number 2:, f 14;
-#X floatatom 165 344 5 0 3 0 - - - 0;
-#X text 24 257 Check [poly]'s help for a polyphonic synth example with [clone] and a list input., f 25;
-#X text 25 330 Just a float sends an empty list to the instance \, which becomes a bang!, f 19;
+#X text 54 417 Open or close copy number 2:, f 14;
+#X floatatom 165 354 5 0 3 0 - - - 0;
+#X text 24 255 Check [poly]'s help for a polyphonic synth example with [clone] and a list input., f 25;
+#X text 25 340 Just a float sends an empty list to the instance \, which becomes a bang!, f 19;
+#X text 23 121 [clone]'s inlets/outlets correspond to those of the contained patch and may be control and/or signal inlets/outlets. This example has one control inlet. It also has a signal and another control outlet. You can click on the [clone] object to see the first of the cloned instances. At least one control inlet is present even if the abstraction has none \, so [clone] can receive the 'vis' and 'resize' messages. The way control inlets/outlets forward messages is shown below., f 104;
+#X text 23 197 Signal inlets can get non float control messages via their 2nd outlet in the same way \, but signals are sent to all the instances. See [pd multichannel] example for more details on how signal distribution works in [clone]., f 104;
+#X obj 74 303 poly;
+#X obj 236 678 notein;
#X connect 0 0 1 0;
#X connect 1 0 2 0;
#X connect 1 1 11 1;
@@ -156,8 +158,8 @@
#X connect 33 0 4 0;
#X connect 34 0 3 0;
#X connect 36 0 9 0;
-#X connect 36 1 44 0;
+#X connect 36 1 43 0;
#X connect 37 0 38 0;
#X connect 37 0 29 1;
#X connect 38 0 36 0;
-#X connect 50 0 36 0;
+#X connect 48 0 36 0;
diff --git a/doc/5.reference/midi-help.pd b/doc/5.reference/midi-help.pd
index df9d0d7e8..ac370b66c 100644
--- a/doc/5.reference/midi-help.pd
+++ b/doc/5.reference/midi-help.pd
@@ -1,63 +1,62 @@
-#N canvas 207 23 1071 715 12;
+#N canvas 184 23 1071 723 12;
#X obj 529 228 noteout;
#X obj 675 312 pgmout;
#X obj 560 312 bendout;
-#X floatatom 26 447 5 0 0 0 - - - 0;
-#X text 31 379 pitch bend, f 5;
+#X floatatom 26 423 5 0 0 0 - - - 0;
+#X text 31 355 pitch bend, f 5;
#X obj 675 237 ctlout;
#X obj 779 312 touchout;
#X obj 895 312 polytouchout;
-#X obj 69 553 midiin;
-#X obj 411 551 sysexin;
+#X obj 69 523 midiin;
+#X obj 411 521 sysexin;
#X obj 794 641 midiout;
-#X obj 241 561 midirealtimein;
-#X obj 241 419 touchin;
-#X obj 340 399 polytouchin;
+#X obj 241 531 midirealtimein;
+#X obj 241 395 touchin;
+#X obj 350 375 polytouchin;
#X obj 26 167 notein;
#X text 79 219 velocity;
#X text 90 193 channel;
#X obj 280 159 ctlin;
#X text 311 247 value;
-#X text 440 427 channel;
-#X text 235 379 channel aftertouch, f 10;
-#X text 341 358 polyphonic aftertouch, f 10;
-#X text 372 473 aftertouch value;
-#X floatatom 261 330 0 0 0 0 - - - 0;
-#X text 289 331 value;
+#X text 450 403 channel;
+#X text 235 355 channel aftertouch, f 10;
+#X text 351 334 polyphonic aftertouch, f 10;
+#X text 382 449 aftertouch value;
+#X floatatom 251 317 0 0 0 0 - - - 0;
+#X text 279 318 value;
#X text 22 147 (omni);
#X obj 166 192 notein 1;
#X text 157 157 (channel 1);
#X text 324 158 (all controllers \, omni);
-#X floatatom 65 324 0 0 0 0 - - - 0;
-#X text 22 325 value;
-#X obj 65 298 ctlin 4;
-#X floatatom 111 324 0 0 0 0 - - - 0;
+#X floatatom 55 311 0 0 0 0 - - - 0;
+#X text 12 312 value;
+#X obj 55 285 ctlin 4;
+#X floatatom 101 311 0 0 0 0 - - - 0;
#X text 507 172 note;
#X text 886 246 touch;
#X text 931 255 note;
-#X text 121 297 (controller 4);
+#X text 111 284 (controller 4);
#X text 707 158 value;
#X text 740 211 channel;
#X obj 848 210 ctlout 7;
-#X text 24 608 raw MIDI byte by byte (except real-time messages), f 27;
-#X text 236 615 real-time messages;
-#X text 32 510 These three below are always omni \, don't take arguments and output the port number on the right outlet:;
+#X text 236 585 real-time messages;
+#X text 32 480 These three below are always omni \, don't take arguments and output the port number on the right outlet:;
#X text 725 185 controller #;
#X text 327 217 controller #;
#X text 61 241 note;
#X text 159 243 note;
#X text 200 243 velocity;
-#X text 409 450 note;
-#X obj 26 419 bendin, f 7;
+#X text 419 426 note;
+#X obj 26 395 bendin, f 7;
#X text 612 197 channel;
#X text 548 171 velocity;
-#X text 393 607 system exclusive messages only \, byte by byte, f 16;
+#X text 393 577 system exclusive messages only \, byte by byte, f 16;
#X text 886 262 value;
#X text 339 185 channel/port;
#X text 165 171 (port 1);
-#X text 139 326 channel/port;
-#X obj 261 300 ctlin 7 17;
-#X text 339 294 (controller 7 \, channel 1/port 2), f 17;
+#X text 129 313 channel/port;
+#X obj 251 287 ctlin 7 17;
+#X text 329 281 (controller 7 \, channel 1/port 2), f 17;
#X text 15 8 MIDI INPUTS: Inputs are omni by default \, an optional argument sets the channel/port and removes the rightmost outlet (which outputs this information). For [ctlin] \, a first optional argument sets controller number and suppresses its corresponding outlet \, and a second argument sets the channel and also suppresses its corresponding outlet., f 70;
#X text 550 55 MIDI OUTPUTS: Outputs are set to channel 1 / port 1 by default \, but they also take a channel/port argument (where channels from 17 represent port 2 \, from 33 port 3 and so on). The [ctlout] object takes control and channel/port arguments. Inlets are not suppressed by arguments and change the parameters., f 67;
#X text 808 143 (controller 7 \, channel/port 1), f 15;
@@ -72,16 +71,16 @@
#X floatatom 166 221 4 0 127 0 - - - 0;
#X floatatom 280 246 4 0 127 0 - - - 0;
#X floatatom 296 217 4 0 127 0 - - - 0;
-#X floatatom 377 449 4 0 127 0 - - - 0;
-#X floatatom 340 471 4 0 127 0 - - - 0;
-#X floatatom 127 447 4 0 127 0 - - - 0;
-#X floatatom 241 447 4 0 127 0 - - - 0;
-#X floatatom 69 582 4 0 127 0 - - - 0;
-#X floatatom 241 590 4 0 127 0 - - - 0;
-#X floatatom 108 582 4 0 127 0 - - - 0;
-#X floatatom 411 580 4 0 127 0 - - - 0;
-#X floatatom 457 586 4 0 127 0 - - - 0;
-#X floatatom 336 590 4 0 127 0 - - - 0;
+#X floatatom 387 425 4 0 127 0 - - - 0;
+#X floatatom 350 447 4 0 127 0 - - - 0;
+#X floatatom 127 423 4 0 127 0 - - - 0;
+#X floatatom 241 423 4 0 127 0 - - - 0;
+#X floatatom 69 552 4 0 127 0 - - - 0;
+#X floatatom 241 560 4 0 127 0 - - - 0;
+#X floatatom 108 552 4 0 127 0 - - - 0;
+#X floatatom 411 550 4 0 127 0 - - - 0;
+#X floatatom 457 556 4 0 127 0 - - - 0;
+#X floatatom 336 560 4 0 127 0 - - - 0;
#X floatatom 959 183 4 0 127 0 - - - 0;
#X floatatom 848 183 4 0 127 0 - - - 0;
#X floatatom 694 184 4 0 127 0 - - - 0;
@@ -96,18 +95,18 @@
#X floatatom 312 184 0 1 64 0 - - - 0;
#X floatatom 219 220 0 1 64 0 - - - 0;
#X floatatom 65 193 0 1 64 0 - - - 0;
-#X floatatom 72 447 0 1 64 0 - - - 0;
-#X floatatom 287 447 0 1 64 0 - - - 0;
-#X floatatom 414 427 0 1 64 0 - - - 0;
-#X text 561 12 MIDI Input/Output objects;
-#X obj 127 419 pgmin 2;
-#X text 110 377 program change (channel 2), f 14;
-#X text 73 468 ch;
-#X text 289 467 ch;
-#X text 20 468 value;
-#X text 159 448 value;
-#X text 233 467 value;
-#X obj 529 40 cnv 1 540 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X floatatom 72 423 0 1 64 0 - - - 0;
+#X floatatom 287 423 0 1 64 0 - - - 0;
+#X floatatom 424 403 0 1 64 0 - - - 0;
+#X text 558 12 MIDI Input/Output objects;
+#X obj 127 395 pgmin 2;
+#X text 110 353 program change (channel 2), f 14;
+#X text 73 444 ch;
+#X text 289 443 ch;
+#X text 20 444 value;
+#X text 159 424 value;
+#X text 233 443 value;
+#X obj 526 40 cnv 1 540 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X obj 7 671 cnv 1 1055 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#N canvas 502 23 566 293 reference 0;
#N canvas 686 71 588 563 reference 0;
@@ -335,18 +334,17 @@
#X text 350 247 ==>;
#X restore 856 9 pd reference;
#X text 954 10 <= click;
-#X obj 529 4 cnv 1 1 35 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X obj 526 4 cnv 1 1 35 empty empty empty 8 12 0 13 #000000 #000000 0;
#X floatatom 794 591 4 0 0 0 - - - 0;
#X text 563 573 In order to use MIDI Input or output objects \, be sure to set MIDI devices in:, f 29;
#X text 593 624 Preferences --> MIDI;
#X msg 794 562 144 \, 68 \, 120;
#X text 891 556 note on as a stream of raw MIDI., f 19;
#X text 919 592 note off as a MIDI packet list, f 18;
-#X text 37 641 (sysex supported);
#X text 540 498 Raw MIDI output is provided by [midiout]. It deals with a stream of floats or MIDI packet lists. It doesn't take arguments and the 2nd inlet sets port number. You can use [midiout] to send raw real-time and sysex messages as well., f 70;
#X text 75 166 *;
-#X text 81 418 **;
-#X text 184 418 ***;
+#X text 81 394 **;
+#X text 184 394 ***;
#X text 585 229 *;
#X text 615 311 **;
#X text 724 311 ***;
@@ -354,44 +352,163 @@
#X text 539 457 *** Program change values in [pgmin] and [pgmout] are indexed from 1 \, which means that the possible values are from 1 to 128 (not 0 to 127)!, f 70;
#X text 539 346 * Release velocity is not supported \, [noteout] only sends Note On velocities and for [notein] a release velocity becomes 0 (commonly interpreted as a "note off"). Tru "note off" messages are still supported via [midiin] and [midiout]., f 70;
#X msg 838 599 128 68 100;
-#X connect 8 0 77 0;
-#X connect 8 1 79 0;
-#X connect 9 0 80 0;
-#X connect 9 1 81 0;
-#X connect 11 0 78 0;
-#X connect 11 1 82 0;
-#X connect 12 0 76 0;
-#X connect 12 1 98 0;
-#X connect 13 0 74 0;
-#X connect 13 1 73 0;
-#X connect 13 2 99 0;
-#X connect 14 0 66 0;
-#X connect 14 1 69 0;
-#X connect 14 2 96 0;
-#X connect 17 0 71 0;
-#X connect 17 1 72 0;
-#X connect 17 2 94 0;
-#X connect 26 0 70 0;
-#X connect 26 1 95 0;
+#X text 16 578 raw MIDI byte by byte except real-time messages (sysex supported), f 28;
+#X text 357 637 <-- Open for MPE support;
+#N canvas 80 23 1024 708 MPE_(MIDI-POLYPHONIC-EXPRESSION) 0;
+#X obj 247 215 ctlin;
+#X obj 238 277 list prepend;
+#X obj 331 600 swap;
+#X obj 327 568 bendin;
+#X listbox 238 311 12 0 0 0 - - - 0;
+#X listbox 331 629 11 0 0 0 - - - 0;
+#X obj 238 347 route 1 2 3 4, f 30;
+#X obj 331 669 route 1 2 3 4;
+#X obj 238 420 route 74;
+#X obj 238 247 swap;
+#X text 331 312 channel \, controller # \, value;
+#X floatatom 237 461 5 0 0 0 - - - 0;
+#X floatatom 289 385 5 0 0 0 - - - 0;
+#X floatatom 341 385 5 0 0 0 - - - 0;
+#X floatatom 393 385 5 0 0 0 - - - 0;
+#X text 21 18 MIDI Polyphonic Expression (MPE) enables things like control MIDI messages for independent notes. For that \, it uses the MIDI channel to distinguish polyphonic voices \, so that particular MIDI messages coming into that channel can be applied to a single voice note individually., f 70;
+#X obj 115 597 swap;
+#X listbox 115 626 11 0 0 0 - - - 0;
+#X obj 115 666 route 1 2 3 4;
+#X obj 111 565 touchin;
+#X obj 52 226 notein;
+#X obj 46 293 list prepend;
+#X obj 46 263 pack;
+#X obj 46 332 route 1 2 3 4, f 14;
+#X listbox 69 405 9 0 0 0 - - - 0;
+#X listbox 93 382 9 0 0 0 - - - 0;
+#X listbox 117 359 9 0 0 0 - - - 0;
+#X text 21 493 Aftertouch and pitch bend are also common messages used in MPE. You can have up to 16 voices/channels in MPE \, but in these examples we're only considering 4 channels/voices., f 70;
+#X listbox 46 428 9 0 0 0 - - - 0;
+#X obj 813 55 poly;
+#X obj 607 545 route 1;
+#X obj 607 579 route note cc touch bend;
+#X listbox 607 679 11 0 0 0 - - - 0;
+#X listbox 648 655 11 0 0 0 - - - 0;
+#X listbox 689 631 11 0 0 0 - - - 0;
+#X listbox 730 608 11 0 0 0 - - - 0;
+#X text 558 19 When dealing with polyphonic synths in Pure Data \, you'll probably use [clone]. An example for that is given in the help file of [poly]. Check it out., f 61;
+#X text 874 208 see also:;
+#X obj 890 232 clone;
+#X listbox 607 514 14 0 0 0 - - - 0;
+#X obj 613 216 notein;
+#X obj 607 282 list prepend;
+#X obj 607 253 pack;
+#X obj 688 247 list append note;
+#X obj 722 276 ctlin;
+#X obj 713 338 list prepend;
+#X obj 713 308 swap;
+#X obj 794 306 list append cc;
+#X obj 737 370 touchin;
+#X obj 737 405 list prepend;
+#X obj 818 373 list append touch;
+#X obj 761 477 list prepend;
+#X obj 761 442 bendin;
+#X obj 842 445 list append bend;
+#X text 21 90 Pure Data does not have any special object to deal with MPE \, but this subpatch shows a simple strategy to deal with it using regular MIDI objects. Below to the left we prepend the channel number to route Note On messages. We them route by MIDI channel (which corresponds to the voice number). Below to the right we make a list that starts with the MIDI channel \, then controller number and value. You can furtherly route by controller number and 74 is commonly used in MPE., f 70;
+#X text 558 85 So instead of using [route] to access independent data for each voice \, you can just send the list directly into [clone] \, which routes the message to different cloned copies of an abstraction. You should then tag each MIDI message so they can be routed and managed inside the abstraction. The example below shows a template for that. The [route 1] object gets messages for "voice 1" and its output relates to the inlet of a [clone] object., f 61;
+#X text 671 546 messages for "voice 1";
+#X connect 0 0 9 0;
+#X connect 0 1 9 1;
+#X connect 0 2 1 1;
+#X connect 1 0 4 0;
+#X connect 2 0 5 0;
+#X connect 3 0 2 0;
+#X connect 3 1 2 1;
+#X connect 4 0 6 0;
+#X connect 5 0 7 0;
+#X connect 6 0 8 0;
+#X connect 6 1 12 0;
+#X connect 6 2 13 0;
+#X connect 6 3 14 0;
+#X connect 8 0 11 0;
+#X connect 9 0 1 0;
+#X connect 16 0 17 0;
+#X connect 17 0 18 0;
+#X connect 19 0 16 0;
+#X connect 19 1 16 1;
+#X connect 20 0 22 0;
+#X connect 20 1 22 1;
+#X connect 20 2 21 1;
+#X connect 21 0 23 0;
+#X connect 22 0 21 0;
+#X connect 23 0 28 0;
+#X connect 23 1 24 0;
+#X connect 23 2 25 0;
+#X connect 23 3 26 0;
+#X connect 30 0 31 0;
+#X connect 31 0 32 0;
+#X connect 31 1 33 0;
+#X connect 31 2 34 0;
+#X connect 31 3 35 0;
+#X connect 39 0 30 0;
+#X connect 40 0 42 0;
+#X connect 40 1 42 1;
+#X connect 40 2 43 0;
+#X connect 41 0 39 0;
+#X connect 42 0 41 0;
+#X connect 43 0 41 1;
+#X connect 44 0 46 0;
+#X connect 44 1 46 1;
+#X connect 44 2 47 0;
+#X connect 45 0 39 0;
+#X connect 46 0 45 0;
+#X connect 47 0 45 1;
+#X connect 48 0 49 0;
+#X connect 48 1 50 0;
+#X connect 49 0 39 0;
+#X connect 50 0 49 1;
+#X connect 51 0 39 0;
+#X connect 52 0 51 0;
+#X connect 52 1 53 0;
+#X connect 53 0 51 1;
+#X restore 100 637 pd MPE_(MIDI-POLYPHONIC-EXPRESSION);
+#X text 20 685 see also:;
+#X obj 97 686 poly;
+#X obj 138 686 clone;
+#X obj 188 686 makenote;
+#X connect 8 0 76 0;
+#X connect 8 1 78 0;
+#X connect 9 0 79 0;
+#X connect 9 1 80 0;
+#X connect 11 0 77 0;
+#X connect 11 1 81 0;
+#X connect 12 0 75 0;
+#X connect 12 1 97 0;
+#X connect 13 0 73 0;
+#X connect 13 1 72 0;
+#X connect 13 2 98 0;
+#X connect 14 0 65 0;
+#X connect 14 1 68 0;
+#X connect 14 2 95 0;
+#X connect 17 0 70 0;
+#X connect 17 1 71 0;
+#X connect 17 2 93 0;
+#X connect 26 0 69 0;
+#X connect 26 1 94 0;
#X connect 31 0 29 0;
#X connect 31 1 32 0;
-#X connect 49 0 3 0;
-#X connect 49 1 97 0;
-#X connect 57 0 23 0;
-#X connect 67 0 0 2;
-#X connect 68 0 2 0;
-#X connect 83 0 62 0;
-#X connect 84 0 39 0;
-#X connect 85 0 5 1;
-#X connect 86 0 5 0;
-#X connect 87 0 0 1;
-#X connect 88 0 0 0;
-#X connect 89 0 1 0;
-#X connect 90 0 6 0;
-#X connect 91 0 7 0;
-#X connect 92 0 7 1;
-#X connect 93 0 5 2;
-#X connect 101 0 75 0;
-#X connect 113 0 10 0;
-#X connect 116 0 113 0;
-#X connect 130 0 10 0;
+#X connect 48 0 3 0;
+#X connect 48 1 96 0;
+#X connect 56 0 23 0;
+#X connect 66 0 0 2;
+#X connect 67 0 2 0;
+#X connect 82 0 61 0;
+#X connect 83 0 39 0;
+#X connect 84 0 5 1;
+#X connect 85 0 5 0;
+#X connect 86 0 0 1;
+#X connect 87 0 0 0;
+#X connect 88 0 1 0;
+#X connect 89 0 6 0;
+#X connect 90 0 7 0;
+#X connect 91 0 7 1;
+#X connect 92 0 5 2;
+#X connect 100 0 74 0;
+#X connect 112 0 10 0;
+#X connect 115 0 112 0;
+#X connect 128 0 10 0;
diff --git a/doc/5.reference/textfile-help.pd b/doc/5.reference/textfile-help.pd
index 5e5cc87b8..6b228d96e 100644
--- a/doc/5.reference/textfile-help.pd
+++ b/doc/5.reference/textfile-help.pd
@@ -1,34 +1,32 @@
-#N canvas 281 58 921 551 12;
-#X msg 271 61 rewind;
-#X obj 417 434 print done;
-#X text 503 222 read a file;
-#X text 555 250 write one;
-#X text 28 512 see also:;
-#X obj 364 383 textfile;
-#X msg 374 223 read textfile.txt;
-#X obj 107 513 qlist;
+#N canvas 265 44 918 598 12;
+#X msg 259 68 rewind;
+#X obj 412 483 print done;
+#X text 500 265 read a file;
+#X text 516 294 write one;
+#X text 28 560 see also:;
+#X obj 359 432 textfile;
+#X msg 371 266 read textfile.txt;
+#X obj 107 561 qlist;
#X obj 25 14 textfile;
-#X text 324 60 go to beginning;
-#X msg 385 251 write /tmp/textfile.txt;
-#X msg 399 283 write /tmp/textfile2.txt cr;
-#X text 601 275 write a file \, terminating lines only with carriage return (omitting semicolons.) You can read files this way too \, in which case carriage returns are mapped to semicolons., f 42;
-#X msg 448 309 read textfile.txt cr;
-#X msg 311 114 clear;
-#X text 355 113 empty the object;
-#X text 452 142 add a message;
-#X text 40 388 You can also use this object simply for storing heterogeneous sequences of lists., f 33;
-#X msg 363 197 set 2 4 6 8;
-#X text 448 197 clear and then add one message;
-#X msg 332 142 add cis boom bah;
-#X msg 348 171 add2 bang;
-#X text 426 171 add an unterminated message;
-#X text 40 252 To record textual messages and save them to a file \, first send "clear" to empty the qlist and "add" to add messages (terminated with semicolons.) The message \, "add2" adds a list of atoms without finishing with a semicolon in case you want to make variable-length messages., f 33;
-#X msg 454 339 print;
-#X text 496 339 debugging printout;
-#X text 692 512 updated for Pd version 0.33;
+#X text 312 67 go to beginning;
+#X msg 390 328 write /tmp/textfile2.txt cr;
+#X text 592 320 write a file \, terminating lines only with carriage return (omitting semicolons.) You can read files this way too \, in which case carriage returns are mapped to semicolons., f 42;
+#X msg 299 121 clear;
+#X text 343 120 empty the object;
+#X text 440 149 add a message;
+#X text 45 426 You can also use this object simply for storing heterogeneous sequences of lists., f 27;
+#X msg 351 204 set 2 4 6 8;
+#X text 436 204 clear and then add one message;
+#X msg 320 149 add cis boom bah;
+#X msg 336 178 add2 bang;
+#X text 414 178 add an unterminated message;
+#X text 46 262 To record textual messages and save them to a file \, first send "clear" to empty the qlist and "add" to add messages (terminated with semicolons.) The message \, "add2" adds a list of atoms without finishing with a semicolon in case you want to make variable-length messages., f 27;
+#X msg 445 384 print;
+#X text 487 384 debugging printout;
+#X text 692 560 updated for Pd version 0.33;
#X text 106 14 - read and write text files;
-#X obj 159 513 text;
-#X text 197 512 (newer and better replacement for textfile);
+#X obj 159 561 text;
+#X text 197 560 (newer and better replacement for textfile);
#X obj 9 45 cnv 1 900 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#N canvas 677 95 575 388 reference 0;
#X obj 8 42 cnv 5 550 5 empty empty INLET: 8 18 0 13 #202020 #000000 0;
@@ -53,27 +51,31 @@
#X text 150 337 NONE;
#X restore 737 14 pd reference;
#X text 831 14 <= click;
-#X obj 364 463 print line;
-#X text 448 463 output lines in sequence., f 27;
-#X text 500 435 output a bang when you hit the end of the sequence.;
-#X text 435 383 <--;
-#X text 464 382 you can click on the object to edit its contents (like [text define]), f 36;
-#X obj 417 409 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X obj 9 496 cnv 1 900 1 empty empty empty 8 12 0 13 #000000 #000000 0;
-#X text 318 87 output a whole line and go to the next;
-#X obj 293 87 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
-#X text 40 127 The [textfile] object reads and writes text files to and from memory. You can read a file and output sequential lines as lists \, or collect lines and write them out. You can use this object to generate "models" for Gem \, for instance., f 33;
+#X obj 359 512 print line;
+#X text 443 512 output lines in sequence., f 27;
+#X text 495 484 output a bang when you hit the end of the sequence.;
+#X text 430 432 <--;
+#X text 459 431 you can click on the object to edit its contents (like [text define]), f 36;
+#X obj 412 458 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 9 546 cnv 1 900 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X text 306 94 output a whole line and go to the next;
+#X obj 281 94 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X text 47 122 The [textfile] object reads and writes text files to and from memory. You can read a file and output sequential lines as lists \, or collect lines and write them out. You can use this object to generate "models" for Gem \, for instance., f 27;
+#X msg 405 354 read /tmp/textfile.txt cr;
+#X msg 379 295 write textfile.txt;
+#X obj 371 238 loadbang;
#X connect 0 0 5 0;
-#X connect 5 0 33 0;
-#X connect 5 1 38 0;
+#X connect 5 0 31 0;
+#X connect 5 1 36 0;
#X connect 6 0 5 0;
#X connect 10 0 5 0;
-#X connect 11 0 5 0;
-#X connect 13 0 5 0;
-#X connect 14 0 5 0;
+#X connect 12 0 5 0;
+#X connect 16 0 5 0;
#X connect 18 0 5 0;
-#X connect 20 0 5 0;
-#X connect 21 0 5 0;
-#X connect 24 0 5 0;
-#X connect 38 0 1 0;
+#X connect 19 0 5 0;
+#X connect 22 0 5 0;
+#X connect 36 0 1 0;
+#X connect 39 0 5 0;
#X connect 41 0 5 0;
+#X connect 42 0 5 0;
+#X connect 43 0 6 0;
diff --git a/doc/5.reference/textfile.txt b/doc/5.reference/textfile.txt
index 99d21c093..d318b02e5 100644
--- a/doc/5.reference/textfile.txt
+++ b/doc/5.reference/textfile.txt
@@ -1,6 +1,3 @@
2 4 6 8;
cis boom bah;
-cis boom bah;
-cis boom bah;
-cis boom bah;
-cis boom bah;
+bang
\ No newline at end of file
From edc75dbd988cb6e3e70a650585315790d625efca Mon Sep 17 00:00:00 2001
From: porres
Date: Wed, 13 Mar 2024 00:12:47 -0300
Subject: [PATCH 102/450] try and fix trailing white space and compilation
error
---
doc/5.reference/textfile.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/5.reference/textfile.txt b/doc/5.reference/textfile.txt
index d318b02e5..8fe3d870f 100644
--- a/doc/5.reference/textfile.txt
+++ b/doc/5.reference/textfile.txt
@@ -1,3 +1,3 @@
2 4 6 8;
cis boom bah;
-bang
\ No newline at end of file
+bang
\ No newline at end of file
From 87f433c3aaff32d779900d136f04bc703b71b9fc Mon Sep 17 00:00:00 2001
From: Christof Ressi
Date: Wed, 13 Mar 2024 18:07:24 +0100
Subject: [PATCH 103/450] add sys_getfunbyname() API function
This allows to get a Pd API function pointer by name.
It returns NULL if the function does not exist.
For example, this allows to use recently introduced API
functions while providing a fallback for older Pd versions.
---
src/m_pd.h | 5 +++++
src/s_loader.c | 24 ++++++++++++++++++++++++
2 files changed, 29 insertions(+)
diff --git a/src/m_pd.h b/src/m_pd.h
index c658fa555..74988b6e9 100644
--- a/src/m_pd.h
+++ b/src/m_pd.h
@@ -904,6 +904,11 @@ static inline int PD_BIGORSMALL(t_float f) /* exponent outside (-512,512) */
/* get version number at run time */
EXTERN void sys_getversion(int *major, int *minor, int *bugfix);
+ /* get a Pd API function pointer by name. Returns NULL if the function
+ does not exist. For example, This allows to use recently introduced API
+ functions while providing a fallback for older Pd versions. */
+EXTERN t_method sys_getfunbyname(const char *name);
+
/* get floatsize at run time */
EXTERN unsigned int sys_getfloatsize(void);
diff --git a/src/s_loader.c b/src/s_loader.c
index 0aef37259..a9a9289f9 100644
--- a/src/s_loader.c
+++ b/src/s_loader.c
@@ -669,3 +669,27 @@ static int sys_do_load_abs(t_canvas *canvas, const char *objectname,
}
return (0);
}
+
+t_method sys_getfunbyname(const char *name)
+{
+#ifdef _WIN32
+ HMODULE module;
+ /* Get a handle to the actual module that contains the Pd API functions.
+ For this we just have to pass *any* Pd API function to GetModuleHandleEx().
+ NB: GetModuleHandle(NULL) wouldn't work because it would return a handle
+ to the main executable and GetProcAddress(), unlike dlsym(), does not
+ reach into its dependencies. */
+ if (GetModuleHandleEx(
+ GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
+ (LPCSTR)&pd_typedmess, &module))
+ return (t_method)GetProcAddress(module, name);
+ else
+ {
+ fprintf(stderr, "GetModuleHandleEx() failed with error code %d\n",
+ GetLastError());
+ return NULL;
+ }
+#else
+ return (t_method)dlsym(dlopen(NULL, RTLD_NOW), name);
+#endif
+}
From 3823dc0f72fd8abeabcf941292b66b6896ccdd76 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Thu, 14 Mar 2024 13:32:37 +0100
Subject: [PATCH 104/450] Add PD_VERSION and PD_VERSION_CODE macros
to easily do a compile-time check for Pd-versions:
```
#if PD_VERSION_CODE < PD_VERSION(0,56,0)
# error this code requires at least Pd-0.56.0
#endif
```
runtime check:
```
int major, minor, bugfix;
sys_getversion(&major, &minor, &bugfix);
if (PD_VERSION(major, minor, bugfix) < PD_VERSION(0, 52, 0)) {
pd_error(0, "you can only use this in Pd>=0.52.0");
}
```
---
src/m_pd.h | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/src/m_pd.h b/src/m_pd.h
index c658fa555..77d195975 100644
--- a/src/m_pd.h
+++ b/src/m_pd.h
@@ -12,6 +12,16 @@ extern "C" {
#define PD_MINOR_VERSION 54
#define PD_BUGFIX_VERSION 1
#define PD_TEST_VERSION ""
+
+/* compile-time version check:
+ #if PD_VERSION_CODE < PD_VERSION(0, 56, 0)
+ // put legacy code for Pd<<0.56 in here
+ #endif
+ */
+#define PD_VERSION(major, minor, bugfix) \
+ (((major) << 16) + ((minor) << 8) + ((bugfix) > 255 ? 255 : (bugfix)))
+#define PD_VERSION_CODE PD_VERSION(PD_MAJOR_VERSION, PD_MINOR_VERSION, PD_BUGFIX_VERSION)
+
extern int pd_compatibilitylevel; /* e.g., 43 for pd 0.43 compatibility */
/* old name for "MSW" flag -- we have to take it for the sake of many old
From a1b81e945d07ad295d5e4258d1b44fb9d1ba585c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Thu, 14 Mar 2024 13:40:49 +0100
Subject: [PATCH 105/450] have sys_getversion() always return the
PD_VERSION_CODE.
So a runtime version check boils down to:
```
if(sys_getversion(0,0,0) < PD_VERSION_CODE(0,56,0)) {
pd_error(0, "this requires at least Pd-0.56.0");
}
```
---
src/m_glob.c | 4 +++-
src/m_pd.h | 4 ++--
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/src/m_glob.c b/src/m_glob.c
index 0eaf69a28..a356d916e 100644
--- a/src/m_glob.c
+++ b/src/m_glob.c
@@ -198,7 +198,7 @@ void glob_init(void)
/* function to return version number at run time. Any of the
calling pointers may be zero in case you don't need all of them. */
-void sys_getversion(int *major, int *minor, int *bugfix)
+unsigned int sys_getversion(int *major, int *minor, int *bugfix)
{
if (major)
*major = PD_MAJOR_VERSION;
@@ -206,6 +206,8 @@ void sys_getversion(int *major, int *minor, int *bugfix)
*minor = PD_MINOR_VERSION;
if (bugfix)
*bugfix = PD_BUGFIX_VERSION;
+
+ return PD_VERSION_CODE;
}
unsigned int sys_getfloatsize()
diff --git a/src/m_pd.h b/src/m_pd.h
index 77d195975..b02226b0b 100644
--- a/src/m_pd.h
+++ b/src/m_pd.h
@@ -911,8 +911,8 @@ static inline int PD_BIGORSMALL(t_float f) /* exponent outside (-512,512) */
#endif
#endif /* _MSC_VER */
- /* get version number at run time */
-EXTERN void sys_getversion(int *major, int *minor, int *bugfix);
+ /* get major/minor/bugifx version numbers and version code at run time */
+EXTERN unsigned int sys_getversion(int *major, int *minor, int *bugfix);
/* get floatsize at run time */
EXTERN unsigned int sys_getfloatsize(void);
From b38e52b0d6ad5e58153b1422495472984c0cd345 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Thu, 14 Mar 2024 14:19:12 +0100
Subject: [PATCH 106/450] Import deken v0.9.18
- fix crash with macOS>=12 when opening a fileselector box where an extension
contains more than 1 dot (e.g. ".tar.gz")
- spelling mistakes (not userfacing)
- rename ::deken::search::puredata.info namespace to the more generic ::deken::search::dekenserver
---
tcl/pd_deken.tcl | 53 +++++++++++++++++++++++++++---------------------
1 file changed, 30 insertions(+), 23 deletions(-)
diff --git a/tcl/pd_deken.tcl b/tcl/pd_deken.tcl
index 3ec25c512..c8ec72f65 100644
--- a/tcl/pd_deken.tcl
+++ b/tcl/pd_deken.tcl
@@ -103,7 +103,7 @@ proc ::deken::versioncheck {version} {
}
## put the current version of this package here:
-if { [::deken::versioncheck 0.9.16] } {
+if { [::deken::versioncheck 0.9.18] } {
namespace eval ::deken:: {
namespace export open_searchui
@@ -1101,7 +1101,7 @@ proc ::deken::preferences::apply {winid} {
"${::deken::preferences::verify_sha256}"
}
proc ::deken::preferences::cancel {winid} {
- ## FIXXME properly close the window/frame (for re-use in a tabbed pane)
+ ## FIXXME properly close the window/frame (for reuse in a tabbed pane)
destroy .deken_preferences
}
proc ::deken::preferences::ok {winid} {
@@ -1301,7 +1301,7 @@ proc ::deken::verify_sha256_gui {url pkgfile} {
## - -2 user requested ignore via dialog
## - two digits: unable to verify
## - -10 reference could not be read
- ## - -20 an exception occured while verifying
+ ## - -20 an exception occurred while verifying
## - three digits:
## - -100 no sha256 verifier implemented
set err_msg [format [_ "SHA256 verification of '%s' failed!" ] $pkgfile ]
@@ -1339,7 +1339,13 @@ proc ::deken::install_package_from_file {{pkgfile ""}} {
lappend types [list [_ "Deken Packages" ] .dek]
lappend types [list [_ "ZIP Files" ] .zip]
if {$::tcl_platform(platform) ne "windows"} {
- lappend types [list [_ "TAR Files" ] {.tar.gz .tgz} ]
+ lappend types [list [_ "TAR Files" ] {.tgz} ]
+ if {$::windowingsystem eq "aqua"} {
+ # stupid bug on macOS>=12: an extension with two dots crashes the fileselector
+ lappend types [list [_ "TAR Files" ] {.gz} ]
+ } else {
+ lappend types [list [_ "TAR Files" ] {.tar.gz} ]
+ }
}
lappend types [list [_ "All Files" ] * ]
if { "${pkgfile}" eq ""} {
@@ -2701,7 +2707,7 @@ proc ::deken::initialize {} {
set ::deken::installpath [::deken::find_installpath]
- # create an entry for our search in the "help" menu (or re-use an existing one)
+ # create an entry for our search in the "help" menu (or reuse an existing one)
set mymenu .menubar.help
if { [catch {
$mymenu entryconfigure [_ "Find externals"] -command {::deken::open_searchui $::deken::winid}
@@ -2774,31 +2780,32 @@ proc ::deken::register {fun} {
## ####################################################################
## searching puredata.info
-namespace eval ::deken::search::puredata.info { }
+namespace eval ::deken::search::dekenserver { }
-proc ::deken::search::puredata.info::search {term} {
- set dekenserver "${::deken::protocol}://deken.puredata.info/search"
- catch {set dekenserver $::env(DEKENSERVER)} stdout
- set servers [list $dekenserver]
+proc ::deken::search::dekenserver::search {term} {
+ set dekenurl "${::deken::protocol}://deken.puredata.info/search"
+ catch {set dekenurl $::env(DEKENSERVER)} stdout
+ catch {set dekenurl $::env(DEKEN_SEARCH_URL)} stdout
+ set urls [list $dekenurl]
- # search all the servers
+ # search all the urls
array set results {}
- set servercount 0
- foreach s $servers {
- # skip empty servers
+ set urlcount 0
+ foreach s $urls {
+ # skip empty urls
if { $s eq {} } { continue }
::deken::post [format [_ "Searching on %s..."] $s ] debug
set resultcount 0
- # get the results from the given server, and add them to our results set
- foreach r [::deken::search::puredata.info::search_server $term $s] {
+ # get the results from the given url, and add them to our results set
+ foreach r [::deken::search::dekenserver::search_server $term $s] {
set results($r) {}
incr resultcount
}
::deken::post [format [_ "Searching on %1\$s returned %2\$d results"] $s $resultcount] debug
- incr servercount
+ incr urlcount
}
- if { $servercount == 0 } {
+ if { $urlcount == 0 } {
::deken::post [format [_ "No usable servers for searching found..."] $s ] debug
}
set splitCont [array names results]
@@ -2882,7 +2889,7 @@ proc ::deken::search::puredata.info::search {term} {
# the space (or some other character that sorts after "\t") after the ${version} is important,
# as it ensures that "0.2~1" sorts before "1.2"
set sortname "${sortprefix}${vsep}${pkgname}${vsep}${version} ${vsep}${date}"
- set contextcmd [list ::deken::search::puredata.info::contextmenu %W %x %y $pkgname $URL]
+ set contextcmd [list ::deken::search::dekenserver::contextmenu %W %x %y $pkgname $URL]
set res [list $sortname $filename $name $cmd $match $comment $status $contextcmd $pkgname $version $creator $date]
lappend searchresults $res
}
@@ -2897,7 +2904,7 @@ proc ::deken::search::puredata.info::search {term} {
return $sortedresult
}
-proc ::deken::search::puredata.info::search_server {term dekenserver} {
+proc ::deken::search::dekenserver::search_server {term dekenurl} {
set queryterm {}
if { ${::deken::searchtype} eq "translations" && ${term} eq "" } {
# special handling of searching for all translations (so we ONLY get translations)
@@ -2916,7 +2923,7 @@ proc ::deken::search::puredata.info::search_server {term dekenserver} {
# fetch search result
if { [catch {
- set token [::http::geturl "${dekenserver}?${queryterm}"]
+ set token [::http::geturl "${dekenurl}?${queryterm}"]
} stdout ] } {
set msg [format [_ "Searching for '%s' failed!" ] $term ]
tk_messageBox \
@@ -2944,7 +2951,7 @@ proc ::deken::search::puredata.info::search_server {term dekenserver} {
return [split $contents "\n"]
}
-proc ::deken::search::puredata.info::contextmenu {widget theX theY pkgname URL} {
+proc ::deken::search::dekenserver::contextmenu {widget theX theY pkgname URL} {
set winid ${::deken::winid}
set resultsid ${::deken::resultsid}
set with_installmenu 1
@@ -3010,5 +3017,5 @@ proc ::deken::search::puredata.info::contextmenu {widget theX theY pkgname URL}
::deken::initialize
-::deken::register ::deken::search::puredata.info::search
+::deken::register ::deken::search::dekenserver::search
}
From 560d1c74b700d29d93907fc035eb96781c68e2e8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Thu, 14 Mar 2024 18:05:43 +0100
Subject: [PATCH 107/450] update .po files from master
---
po/az.po | 47 ++++++++++++++++++++++++---------------
po/bg.po | 47 ++++++++++++++++++++++++---------------
po/de.po | 57 +++++++++++++++++++++++++++++++-----------------
po/el.po | 47 ++++++++++++++++++++++++---------------
po/en.po | 54 ++++++++++++++++++++++++++++++---------------
po/en_ca.po | 54 ++++++++++++++++++++++++++++++---------------
po/es.po | 54 ++++++++++++++++++++++++++++++---------------
po/eu.po | 47 ++++++++++++++++++++++++---------------
po/fr.po | 54 ++++++++++++++++++++++++++++++---------------
po/gu.po | 47 ++++++++++++++++++++++++---------------
po/he.po | 54 ++++++++++++++++++++++++++++++---------------
po/hi.po | 47 ++++++++++++++++++++++++---------------
po/hu.po | 47 ++++++++++++++++++++++++---------------
po/id.po | 43 ++++++++++++++++++++++--------------
po/it.po | 54 ++++++++++++++++++++++++++++++---------------
po/ja.po | 54 ++++++++++++++++++++++++++++++---------------
po/ko.po | 54 ++++++++++++++++++++++++++++++---------------
po/nl.po | 54 ++++++++++++++++++++++++++++++---------------
po/pa.po | 47 ++++++++++++++++++++++++---------------
po/pl.po | 43 ++++++++++++++++++++++--------------
po/pt_br.po | 54 ++++++++++++++++++++++++++++++---------------
po/pt_pt.po | 54 ++++++++++++++++++++++++++++++---------------
po/ru.po | 58 ++++++++++++++++++++++++++++++++-----------------
po/sq.po | 47 ++++++++++++++++++++++++---------------
po/sv.po | 47 ++++++++++++++++++++++++---------------
po/template.pot | 43 ++++++++++++++++++++++--------------
po/uk.po | 57 ++++++++++++++++++++++++++++++++----------------
po/vi.po | 47 ++++++++++++++++++++++++---------------
po/zh_tw.po | 43 ++++++++++++++++++++++--------------
29 files changed, 936 insertions(+), 519 deletions(-)
diff --git a/po/az.po b/po/az.po
index 348392b9a..fb453ebce 100644
--- a/po/az.po
+++ b/po/az.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Pure Data 0.43\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
-"POT-Creation-Date: 2023-11-07 16:37+0100\n"
+"POT-Creation-Date: 2024-03-14 18:04+0100\n"
"PO-Revision-Date: 2004-03-12 22:22+0200\n"
"Last-Translator: Metin Amiroff \n"
"Language-Team: Azerbaijani \n"
@@ -629,6 +629,12 @@ msgstr ""
msgid "single page"
msgstr ""
+msgid "patching helpers"
+msgstr ""
+
+msgid "Highlight active cord while connecting"
+msgstr ""
+
#, fuzzy
msgid "Preferences"
msgstr "Seçimlər..."
@@ -846,6 +852,14 @@ msgstr ""
msgid "Unable to fetch reference SHA256 for '%s'."
msgstr ""
+#, tcl-format
+msgid "File checksum looks invalid: '%s'."
+msgstr ""
+
+#, tcl-format
+msgid "Reference checksum looks invalid: '%s'."
+msgstr ""
+
#, tcl-format
msgid "Unable to perform SHA256 verification for '%s'."
msgstr ""
@@ -919,6 +933,17 @@ msgstr "Seçimlər..."
msgid "Platform re-detected: %s"
msgstr ""
+#, tcl-format
+msgid "SHA256 verification of '%s' failed!"
+msgstr ""
+
+msgid "SHA256 verification failed"
+msgstr ""
+
+#, tcl-format
+msgid "Checksum mismatch for '%s'"
+msgstr ""
+
msgid "Deken Packages"
msgstr ""
@@ -934,17 +959,6 @@ msgstr "TAR fayllar"
msgid "All Files"
msgstr "barcha fayllar"
-#, tcl-format
-msgid "Checksum mismatch for '%s'"
-msgstr ""
-
-#, tcl-format
-msgid "SHA256 verification of '%s' failed!"
-msgstr ""
-
-msgid "SHA256 verification failed"
-msgstr ""
-
#, tcl-format
msgid "Uninstalling previous installation of '%s'"
msgstr ""
@@ -1169,6 +1183,9 @@ msgstr ""
msgid "Ignoring checksum mismatch"
msgstr ""
+msgid "Ignoring checksum errors"
+msgstr ""
+
#, tcl-format
msgid "[deken] deken-plugin.tcl (Pd externals search) loaded from %s."
msgstr ""
@@ -1637,12 +1654,6 @@ msgstr ""
msgid "Audio off"
msgstr ""
-msgid "(Tcl) MISSING CLOSE-BRACKET ']': "
-msgstr ""
-
-msgid "Tcl:"
-msgstr ""
-
msgid "Pd"
msgstr ""
diff --git a/po/bg.po b/po/bg.po
index 821776166..dcda278a9 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Pure Data 0.43\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
-"POT-Creation-Date: 2023-11-07 16:37+0100\n"
+"POT-Creation-Date: 2024-03-14 18:04+0100\n"
"PO-Revision-Date: 2022-10-30 07:04+0000\n"
"Last-Translator: Max Neupert \n"
"Language-Team: Bulgarian \n"
"Language-Team: German \n"
"Language-Team: Greek \n"
"Language-Team: English \n"
"Language-Team: English (Canada) \n"
"Language-Team: Spanish \n"
"Language-Team: Basque \n"
"Language-Team: French \n"
"Language-Team: Gujarati \n"
"Language-Team: Hebrew \n"
"Language-Team: Hindi \n"
"Language-Team: Hungarian \n"
"Language-Team: Indonesian \n"
"Language-Team: Italian \n"
"Language-Team: Japanese \n"
"Language-Team: Korean \n"
"Language-Team: Dutch \n"
"Language-Team: Punjabi \n"
"Language-Team: Polish \n"
"Language-Team: Portuguese (Brazil) \n"
"Language-Team: Portuguese (Portugal) \n"
"Language-Team: Russian \n"
"Language-Team: Albanian \n"
"Language-Team: Swedish \n"
"Language-Team: LANGUAGE \n"
@@ -580,6 +580,12 @@ msgstr ""
msgid "single page"
msgstr ""
+msgid "patching helpers"
+msgstr ""
+
+msgid "Highlight active cord while connecting"
+msgstr ""
+
msgid "Preferences"
msgstr ""
@@ -788,6 +794,14 @@ msgstr ""
msgid "Unable to fetch reference SHA256 for '%s'."
msgstr ""
+#, tcl-format
+msgid "File checksum looks invalid: '%s'."
+msgstr ""
+
+#, tcl-format
+msgid "Reference checksum looks invalid: '%s'."
+msgstr ""
+
#, tcl-format
msgid "Unable to perform SHA256 verification for '%s'."
msgstr ""
@@ -861,27 +875,27 @@ msgstr ""
msgid "Platform re-detected: %s"
msgstr ""
-msgid "Deken Packages"
+#, tcl-format
+msgid "SHA256 verification of '%s' failed!"
msgstr ""
-msgid "ZIP Files"
+msgid "SHA256 verification failed"
msgstr ""
-msgid "TAR Files"
+#, tcl-format
+msgid "Checksum mismatch for '%s'"
msgstr ""
-msgid "All Files"
+msgid "Deken Packages"
msgstr ""
-#, tcl-format
-msgid "Checksum mismatch for '%s'"
+msgid "ZIP Files"
msgstr ""
-#, tcl-format
-msgid "SHA256 verification of '%s' failed!"
+msgid "TAR Files"
msgstr ""
-msgid "SHA256 verification failed"
+msgid "All Files"
msgstr ""
#, tcl-format
@@ -1105,6 +1119,9 @@ msgstr ""
msgid "Ignoring checksum mismatch"
msgstr ""
+msgid "Ignoring checksum errors"
+msgstr ""
+
#, tcl-format
msgid "[deken] deken-plugin.tcl (Pd externals search) loaded from %s."
msgstr ""
@@ -1545,12 +1562,6 @@ msgstr ""
msgid "Audio off"
msgstr ""
-msgid "(Tcl) MISSING CLOSE-BRACKET ']': "
-msgstr ""
-
-msgid "Tcl:"
-msgstr ""
-
msgid "Pd"
msgstr ""
diff --git a/po/uk.po b/po/uk.po
index c58295453..b3ee7b092 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Pure Data 0.53.0\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
-"POT-Creation-Date: 2023-11-07 16:37+0100\n"
+"POT-Creation-Date: 2024-03-14 18:04+0100\n"
"PO-Revision-Date: 2023-02-13 12:36+0000\n"
"Last-Translator: umläute \n"
"Language-Team: Ukrainian \n"
"Language-Team: Vietnamese \n"
"Language-Team: Chinese (Traditional)
Date: Thu, 14 Mar 2024 15:24:55 -0300
Subject: [PATCH 108/450] document new [file which] depth argument
---
doc/5.reference/file-help.pd | 687 ++++++++++++++++++-----------------
1 file changed, 344 insertions(+), 343 deletions(-)
diff --git a/doc/5.reference/file-help.pd b/doc/5.reference/file-help.pd
index a61688e32..ebbbc89cb 100644
--- a/doc/5.reference/file-help.pd
+++ b/doc/5.reference/file-help.pd
@@ -1,83 +1,59 @@
-#N canvas 437 23 567 721 12;
-#X text 439 70 details:;
-#X text 437 53 click for;
-#N canvas 215 30 1059 652 handle 0;
-#X obj 123 481 file handle;
-#X msg 118 160 open /tmp/test.c r;
-#X msg 192 441 close;
-#X msg 137 219 1024;
-#X text 173 221 read (up to) 1024 bytes;
-#X obj 123 534 print data, f 5;
-#X msg 148 253 seek 3;
-#X text 205 255 seek to the 3rd byte;
-#X text 287 376 seek to the next byte;
-#X msg 130 190 1;
-#X text 167 189 read the next byte;
-#X msg 44 186 open \$1;
-#X obj 44 161 openpanel;
-#X obj 565 481 file handle;
-#X msg 654 443 close;
-#X msg 601 286 seek 3;
-#X text 655 286 seek to the 3rd byte;
-#X obj 486 179 savepanel;
-#X msg 486 204 open \$1 w;
-#X msg 560 178 open /tmp/test.c a;
-#X msg 572 208 open /tmp/test.c c;
-#X msg 586 242 104 101 108 108 111 32 119 111 114 108 100 13 10, f 26;
-#X text 256 162 explicit Read-mode;
-#X text 704 177 open file for writing (Append mode);
-#X text 713 201 open file for writing (Create (or trunCate) mode), f 27;
-#X text 777 249 write some bytes;
+#N canvas 437 23 566 697 12;
+#X text 441 70 details:;
+#X text 439 53 click for;
+#N canvas 190 61 1062 654 handle 0;
+#X obj 123 484 file handle;
+#X msg 110 164 open /tmp/test.c r;
+#X msg 185 444 close;
+#X msg 130 222 1024;
+#X text 168 223 read (up to) 1024 bytes;
+#X obj 123 537 print data, f 5;
+#X msg 141 256 seek 3;
+#X text 198 258 seek to the 3rd byte;
+#X text 280 379 seek to the next byte;
+#X msg 123 193 1;
+#X text 156 192 read the next byte;
+#X msg 35 189 open \$1;
+#X obj 35 164 openpanel;
+#X obj 565 484 file handle;
+#X msg 654 446 close;
+#X msg 601 289 seek 3;
+#X text 655 289 seek to the 3rd byte;
+#X obj 486 182 savepanel;
+#X msg 486 207 open \$1 w;
+#X msg 560 181 open /tmp/test.c a;
+#X msg 572 211 open /tmp/test.c c;
+#X msg 586 245 104 101 108 108 111 32 119 111 114 108 100 13 10, f 26;
+#X text 248 166 explicit Read-mode;
+#X text 704 180 open file for writing (Append mode);
+#X text 713 204 open file for writing (Create (or trunCate) mode), f 27;
+#X text 777 252 write some bytes;
#X obj 351 21 file;
-#X obj 229 554 print INFO;
-#X text 67 526 list of bytes read, f 7;
-#X text 721 489 if opening the file or writing to it fails \, the file is closed and a bang is sent to the 2nd outlet., f 44;
-#X text 330 592 when seeking \, the position from the start of the file (or -1 on error) is output here., f 44;
-#N canvas 453 93 754 409 arguments 0;
-#X obj 136 82 file handle -q;
-#X text 264 82 less verbose (quiet);
-#X obj 136 112 file handle -v;
-#X text 264 112 more verbose (loud);
-#X obj 96 233 file handle -m 0o600;
-#X text 296 228 file creation mode (user/group/other permissions) in octal.;
-#X msg 563 96 verbose \$1;
-#X obj 563 121 file;
-#X obj 563 70 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 138 31 error reporting on the Pd-console;
-#X text 43 98 via flags:;
-#X text 453 96 via a message:;
-#X text 67 167 restricted permissions of created files:;
-#X text 104 298 via a message:;
-#X obj 96 348 file;
-#X text 295 328 the creation mode only affects files that are created after the mode has been set.;
-#X msg 96 323 creationmode 0o600;
-#X text 294 266 the actual permissions of the created file also takes the umask into account. this might be ignored by the underlying filesystem.;
-#X text 99 199 via creation flags:;
-#X connect 6 0 7 0;
-#X connect 8 0 6 0;
-#X connect 16 0 14 0;
-#X restore 384 499 pd arguments;
-#X msg 640 409 creationmode 0o600;
-#X msg 157 286 seek 3 start;
-#X text 255 279 seek to the 3rd byte from the "start", f 21;
-#X msg 165 318 seek 0 end;
-#X msg 172 348 seek -1 end;
-#X msg 179 378 seek 1 current;
-#X msg 186 410 seek -1 relative;
-#X text 311 399 seek to the previous byte ("relative" is an alias for "current"), f 22;
-#X text 244 317 seek to the end-of-file;
-#X text 258 347 seek to the last byte;
-#X msg 621 344 seek 10 end;
-#X text 707 342 seek beyond the end of file;
-#X msg 611 316 seek 10 start;
-#X text 714 317 seek to the 10th byte;
-#X msg 629 375 seek 10 current;
-#X obj 639 505 print INFO;
-#X text 778 403 restrict permissions of the to-be-created file, f 24;
-#X obj 197 527 t a a;
-#X obj 197 588 route bang seek;
-#X floatatom 248 613 5 0 0 1 - - - 0;
-#X text 748 371 seek to the 10th byte from the current position, f 27;
+#X obj 229 557 print INFO;
+#X text 67 529 list of bytes read, f 7;
+#X text 721 492 if opening the file or writing to it fails \, the file is closed and a bang is sent to the 2nd outlet., f 44;
+#X text 330 595 when seeking \, the position from the start of the file (or -1 on error) is output here., f 44;
+#X msg 640 412 creationmode 0o600;
+#X msg 150 289 seek 3 start;
+#X text 248 282 seek to the 3rd byte from the "start", f 21;
+#X msg 158 321 seek 0 end;
+#X msg 165 351 seek -1 end;
+#X msg 172 381 seek 1 current;
+#X msg 179 413 seek -1 relative;
+#X text 304 402 seek to the previous byte ("relative" is an alias for "current"), f 22;
+#X text 237 320 seek to the end-of-file;
+#X text 251 350 seek to the last byte;
+#X msg 621 347 seek 10 end;
+#X text 707 345 seek beyond the end of file;
+#X msg 611 319 seek 10 start;
+#X text 714 320 seek to the 10th byte;
+#X msg 629 378 seek 10 current;
+#X obj 639 508 print INFO;
+#X text 778 406 restrict permissions of the to-be-created file, f 24;
+#X obj 197 530 t a a;
+#X obj 197 591 route bang seek;
+#X floatatom 248 618 5 0 0 1 - - - 0;
+#X text 748 374 seek to the 10th byte from the current position, f 27;
#X obj 48 21 file handle;
#N canvas 692 43 571 468 reference 0;
#X obj 7 44 cnv 5 550 5 empty empty INLETS: 8 18 0 13 #202020 #000000 0;
@@ -108,21 +84,45 @@
#X restore 948 21 pd reference;
#X obj 21 51 cnv 1 1025 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 140 20 - operate on file handles.;
-#X text 238 435 close file, f 5;
-#X text 510 152 <-- open file in Write mode;
-#X text 702 438 close file, f 5;
-#X text 120 118 reading files =============, f 13;
-#X text 497 114 writing files =============, f 13;
-#X text 153 615 close;
-#X obj 44 133 bng 19 250 50 0 empty empty empty -35 10 0 10 #dfdfdf #000000 #000000;
+#X text 231 438 close file, f 5;
+#X text 510 155 <-- open file in Write mode;
+#X text 702 441 close file, f 5;
+#X text 153 620 close;
+#X obj 35 136 bng 19 250 50 0 empty empty empty -35 10 0 10 #dfdfdf #000000 #000000;
#X text 134 62 The data you read from or write to a file are lists of bytes \, which appear in Pd as lists of numbers from 0 to 255 (using out-of-range numbers or symbols leads to undefined behavior.) The 2nd inlet of the [file handle] object is documented in the [pd file define] subpatch., f 121;
#X text 394 20 - short form for [file handle].;
-#X text 314 548 If the file cannot be opened \, a bang is sent to the 2nd outlet. When the end of the file is reached or a read error occurred \, the file is closed and a bang is sent too., f 85;
-#X obj 486 153 bng 19 250 50 0 empty empty empty -35 10 0 10 #dfdfdf #000000 #000000;
-#X obj 197 613 bng 19 250 50 0 empty empty empty -35 10 0 10 #dfdfdf #000000 #000000;
-#X text 288 613 pos;
+#X text 314 551 If the file cannot be opened \, a bang is sent to the 2nd outlet. When the end of the file is reached or a read error occurred \, the file is closed and a bang is sent too., f 85;
+#X obj 486 156 bng 19 250 50 0 empty empty empty -35 10 0 10 #dfdfdf #000000 #000000;
+#X obj 197 618 bng 19 250 50 0 empty empty empty -35 10 0 10 #dfdfdf #000000 #000000;
+#X text 288 618 pos;
+#N canvas 453 93 754 409 flags 0;
+#X obj 136 82 file handle -q;
+#X text 264 82 less verbose (quiet);
+#X obj 136 112 file handle -v;
+#X text 264 112 more verbose (loud);
+#X obj 96 233 file handle -m 0o600;
+#X text 296 228 file creation mode (user/group/other permissions) in octal.;
+#X msg 563 96 verbose \$1;
+#X obj 563 121 file;
+#X obj 563 70 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 138 31 error reporting on the Pd-console;
+#X text 43 98 via flags:;
+#X text 453 96 via a message:;
+#X text 67 167 restricted permissions of created files:;
+#X text 104 298 via a message:;
+#X obj 96 348 file;
+#X text 295 328 the creation mode only affects files that are created after the mode has been set.;
+#X msg 96 323 creationmode 0o600;
+#X text 294 266 the actual permissions of the created file also takes the umask into account. this might be ignored by the underlying filesystem.;
+#X text 99 199 via creation flags:;
+#X connect 6 0 7 0;
+#X connect 8 0 6 0;
+#X connect 16 0 14 0;
+#X restore 384 502 pd flags;
+#X text 127 127 reading files:;
+#X text 538 127 writing files:;
#X connect 0 0 5 0;
-#X connect 0 1 49 0;
+#X connect 0 1 48 0;
#X connect 1 0 0 0;
#X connect 2 0 0 0;
#X connect 3 0 0 0;
@@ -130,7 +130,7 @@
#X connect 9 0 0 0;
#X connect 11 0 0 0;
#X connect 12 0 11 0;
-#X connect 13 1 47 0;
+#X connect 13 1 46 0;
#X connect 14 0 13 0;
#X connect 15 0 13 0;
#X connect 17 0 18 0;
@@ -138,22 +138,22 @@
#X connect 19 0 13 0;
#X connect 20 0 13 0;
#X connect 21 0 13 0;
-#X connect 32 0 13 0;
-#X connect 33 0 0 0;
+#X connect 31 0 13 0;
+#X connect 32 0 0 0;
+#X connect 34 0 0 0;
#X connect 35 0 0 0;
#X connect 36 0 0 0;
#X connect 37 0 0 0;
-#X connect 38 0 0 0;
-#X connect 42 0 13 0;
-#X connect 44 0 13 0;
-#X connect 46 0 13 0;
-#X connect 49 0 50 0;
-#X connect 49 1 27 0;
-#X connect 50 0 68 0;
-#X connect 50 1 51 0;
-#X connect 63 0 12 0;
-#X connect 67 0 17 0;
-#X restore 440 97 pd handle;
+#X connect 41 0 13 0;
+#X connect 43 0 13 0;
+#X connect 45 0 13 0;
+#X connect 48 0 49 0;
+#X connect 48 1 27 0;
+#X connect 49 0 65 0;
+#X connect 49 1 50 0;
+#X connect 60 0 12 0;
+#X connect 64 0 17 0;
+#X restore 442 97 pd handle;
#N canvas 680 67 617 565 glob 0;
#X obj 50 378 file glob;
#X obj 50 443 print DATA;
@@ -217,23 +217,9 @@
#X connect 19 0 10 0;
#X connect 21 0 1 0;
#X connect 22 0 11 0;
-#X restore 183 525 pd recursive globbing;
+#X restore 153 525 pd recursive globbing;
#X text 202 400 if no files are found or an error is encountered \, a bang is sent to the 2nd outlet, f 49;
#X text 149 450 matching files and directories are sent as lists of (including the search directory) and a identifier that indicates if the path is a file (0) or a directory (1).;
-#N canvas 480 231 738 232 arguments 0;
-#X text 274 145 less verbose (quiet);
-#X text 274 175 more verbose (loud);
-#X msg 563 149 verbose \$1;
-#X obj 563 122 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 106 70 error reporting on the Pd-console;
-#X text 239 111 via flags:;
-#X text 524 95 via a message:;
-#X obj 563 174 file glob;
-#X obj 146 145 file glob -q;
-#X obj 146 175 file glob -v;
-#X connect 2 0 7 0;
-#X connect 3 0 2 0;
-#X restore 85 525 pd arguments;
#N canvas 424 264 893 441 cross-platform 0;
#X text 37 329 - files/dirs starting with a "." only match if the matching pattern explicitly contains the leading dot.;
#X msg 483 338 symbol *;
@@ -261,7 +247,7 @@
#X text 45 47 [file glob] attempts to unify the behavior of wildcard matching on different platforms. as such \, it does not support all features of a given pattern matching implementation (or only accidentally)., f 107;
#X text 45 80 the following rules should help you to write patches that use platform independent globbing., f 107;
#X text 27 23 cross-platform notes on globbing:;
-#X restore 344 525 pd cross-platform pattern matching;
+#X restore 314 525 pd cross-platform pattern matching;
#X text 35 525 more:;
#X text 99 60 all files/directories in this directory (that don't start with a dot), f 39;
#X obj 11 47 cnv 1 600 1 empty empty empty 8 12 0 13 #000000 #000000 0;
@@ -285,6 +271,20 @@
#X obj 7 226 cnv 2 550 2 empty empty ARGUMENTS: 8 12 0 13 #202020 #000000 0;
#X obj 7 252 cnv 1 550 1 empty empty flags: 8 12 0 13 #9f9f9f #000000 0;
#X restore 520 17 pd reference;
+#N canvas 480 231 738 232 flags 0;
+#X text 274 145 less verbose (quiet);
+#X text 274 175 more verbose (loud);
+#X msg 563 149 verbose \$1;
+#X obj 563 122 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 106 70 error reporting on the Pd-console;
+#X text 239 111 via flags:;
+#X text 524 95 via a message:;
+#X obj 563 174 file glob;
+#X obj 146 145 file glob -q;
+#X obj 146 175 file glob -v;
+#X connect 2 0 7 0;
+#X connect 3 0 2 0;
+#X restore 85 525 pd flags;
#X connect 0 0 1 0;
#X connect 0 1 2 0;
#X connect 3 0 0 0;
@@ -295,52 +295,33 @@
#X connect 11 0 0 0;
#X connect 12 0 0 0;
#X connect 16 0 0 0;
-#X restore 440 249 pd glob;
-#X obj 38 645 file;
-#X text 75 646 - short for "file handle";
+#X restore 442 249 pd glob;
#X obj 27 97 file handle;
#X obj 27 287 file stat;
-#X text 156 96 - read/write binary files;
-#X text 156 223 - find a file in Pd's search-path;
-#X text 156 250 - list files in directories;
+#X text 154 96 - read/write binary files;
+#X text 154 223 - find a file in Pd's search-path;
+#X text 154 250 - list files in directories;
#X obj 27 249 file glob;
#X obj 27 222 file which;
-#N canvas 560 152 623 461 which 0;
-#X obj 35 187 file which;
-#X symbolatom 35 301 79 0 0 0 - - - 0;
-#X obj 35 327 print found;
-#X obj 102 240 print not!found;
-#X msg 45 157 symbol nada;
-#X msg 35 121 symbol hilbert~.pd;
-#X text 73 364 notes:;
-#X text 126 364 - currently this only works for files \, not for directories!;
-#X text 126 385 - currently only the first match is returned;
-#X text 177 121 a file that ships with Pd;
-#X text 139 156 probably does not exist in Pd's search path;
-#N canvas 628 410 738 232 arguments 0;
-#X text 274 145 less verbose (quiet);
-#X text 274 175 more verbose (loud);
-#X msg 563 149 verbose \$1;
-#X obj 563 122 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 106 70 error reporting on the Pd-console;
-#X text 239 111 via flags:;
-#X text 524 95 via a message:;
-#X obj 146 145 file which -q;
-#X obj 146 175 file which -v;
-#X obj 563 174 file which;
-#X connect 2 0 9 0;
-#X connect 3 0 2 0;
-#X restore 194 422 pd arguments;
-#X symbolatom 102 213 47 0 0 0 - - - 0;
-#X obj 35 273 unpack s f;
-#X floatatom 127 274 3 0 0 1 - - - 0;
+#N canvas 574 25 616 584 which 0;
+#X obj 37 254 file which;
+#X symbolatom 37 368 79 0 0 0 - - - 0;
+#X obj 37 394 print found;
+#X obj 104 307 print not!found;
+#X msg 47 224 symbol nada;
+#X msg 37 188 symbol hilbert~.pd;
+#X text 179 188 a file that ships with Pd;
+#X text 141 223 probably does not exist in Pd's search path;
+#X symbolatom 104 280 47 0 0 0 - - - 0;
+#X obj 37 340 unpack s f;
+#X floatatom 129 341 3 0 0 1 - - - 0;
#X obj 11 47 cnv 1 600 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 137 14 - locate a file;
#X obj 50 15 file which;
-#N canvas 778 127 581 317 reference 0;
+#N canvas 680 125 575 370 reference 0;
#X obj 9 52 cnv 5 550 5 empty empty INLET: 8 18 0 13 #202020 #000000 0;
#X obj 9 111 cnv 2 550 2 empty empty OUTLETS: 8 12 0 13 #202020 #000000 0;
-#X obj 8 286 cnv 5 550 5 empty empty empty 8 18 0 13 #202020 #000000 0;
+#X obj 8 329 cnv 5 550 5 empty empty empty 8 18 0 13 #202020 #000000 0;
#X obj 9 167 cnv 1 550 1 empty empty 2nd: 8 12 0 13 #7c7c7c #000000 0;
#X obj 9 137 cnv 1 550 1 empty empty 1st: 8 12 0 13 #7c7c7c #000000 0;
#X text 155 240 -q: set quiet verbosity., f 49;
@@ -353,20 +334,40 @@
#X obj 7 234 cnv 1 550 1 empty empty flags: 8 12 0 13 #9f9f9f #000000 0;
#X text 98 143 list - symbol path of located file and directory flag.;
#X text 85 174 symbol - the input symbol if file isn't located.;
+#X obj 7 284 cnv 1 550 1 empty empty argument: 8 12 0 13 #9f9f9f #000000 0;
+#X text 119 296 1) float -;
+#X text 199 296 sets patch depth level to search (default 0).;
#X restore 518 15 pd reference;
-#X text 157 273 directory flag: 0 if file \, 1 if directory \, see notes below.;
-#X text 53 65 [file which] tries to locate the file in using Pd's search-paths (via preferences and/or the [declare] object) and returns the resolved path., f 72;
-#X connect 0 0 13 0;
-#X connect 0 1 12 0;
+#X text 27 63 [file which] tries to locate a file using Pd's search-paths. This includes the same relative path (the folder where the patch lives \, and other Pd seatch paths like the ones set via preferences and/or the [declare] object. If the file is found \, the object returns a list in the left outlet with the resolved path and a flag to inform if it is a file (0) or a directory (1) \, though this currently only works for filesT If nothing is found \, the entry is sent to the right outlet., f 79;
+#X text 158 333 directory flag: 0 if file \, 1 if directory (currently this only works for files), f 41;
+#X text 126 395 note: - currently only the first match is returned;
+#N canvas 628 410 738 232 flags 0;
+#X text 274 145 less verbose (quiet);
+#X text 274 175 more verbose (loud);
+#X msg 563 149 verbose \$1;
+#X obj 563 122 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 106 70 error reporting on the Pd-console;
+#X text 239 111 via flags:;
+#X text 524 95 via a message:;
+#X obj 146 145 file which -q;
+#X obj 146 175 file which -v;
+#X obj 563 174 file which;
+#X connect 2 0 9 0;
+#X connect 3 0 2 0;
+#X restore 415 531 pd flags;
+#X obj 44 461 file which 1;
+#X text 150 440 The arguments sets the depth level. This is useful for setting which relative path to search for if the object is used in an abstraction. The default value is '0' \, which means relative to this patch. '1' is the parent patch \, '2' is the grandparent \, and so on., f 62;
+#X connect 0 0 9 0;
+#X connect 0 1 8 0;
#X connect 1 0 2 0;
#X connect 4 0 0 0;
#X connect 5 0 0 0;
-#X connect 12 0 3 0;
-#X connect 13 0 1 0;
-#X connect 13 1 14 0;
-#X restore 440 222 pd which;
+#X connect 8 0 3 0;
+#X connect 9 0 1 0;
+#X connect 9 1 10 0;
+#X restore 442 222 pd which;
#X obj 27 148 file mkdir;
-#X text 157 149 - create a directory;
+#X text 155 149 - create a directory;
#N canvas 593 65 525 590 mkdir 0;
#X obj 42 387 file mkdir;
#X symbolatom 42 470 64 0 0 0 - - - 0;
@@ -381,30 +382,6 @@
#X text 164 305 (re)create an existing directory;
#X text 134 412 on error \, a bang is sent to the 2nd outlet;
#X text 136 497 on success \, the name of the created directory is sent to the 1st outlet, f 36;
-#N canvas 596 129 736 450 arguments 0;
-#X text 209 100 less verbose (quiet);
-#X text 209 130 more verbose (loud);
-#X msg 498 104 verbose \$1;
-#X obj 498 77 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 41 25 error reporting on the Pd-console;
-#X text 174 66 via flags:;
-#X text 459 50 via a message:;
-#X text 89 335 via a message:;
-#X text 84 236 via creation flags:;
-#X text 52 204 restricted permissions of created directories:;
-#X text 279 266 directory creation mode (user/group/other permissions) in octal.;
-#X msg 81 360 creationmode 0o700;
-#X text 277 304 the actual permissions of the created directory also takes the umask into account. this might be ignored by the underlying filesystem.;
-#X text 278 366 the creation mode only affects directories that are created after the mode has been set.;
-#X obj 81 385 file mkdir;
-#X obj 81 270 file mkdir -m 0o700;
-#X obj 81 130 file mkdir -v;
-#X obj 81 100 file mkdir -q;
-#X obj 498 129 file mkdir;
-#X connect 2 0 18 0;
-#X connect 3 0 2 0;
-#X connect 11 0 14 0;
-#X restore 195 551 pd arguments;
#X msg 87 351 creationmode 0o700;
#X obj 62 236 savepanel 1;
#X obj 42 176 savepanel 1;
@@ -434,20 +411,44 @@
#X obj 42 149 bng 19 250 50 0 empty empty empty -35 10 0 10 #dfdfdf #000000 #000000;
#X obj 62 211 bng 19 250 50 0 empty empty empty -35 10 0 10 #dfdfdf #000000 #000000;
#X obj 109 413 bng 19 250 50 0 empty empty empty -35 10 0 10 #dfdfdf #000000 #000000;
+#N canvas 596 129 736 450 flags 0;
+#X text 209 100 less verbose (quiet);
+#X text 209 130 more verbose (loud);
+#X msg 498 104 verbose \$1;
+#X obj 498 77 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 41 25 error reporting on the Pd-console;
+#X text 174 66 via flags:;
+#X text 459 50 via a message:;
+#X text 89 335 via a message:;
+#X text 84 236 via creation flags:;
+#X text 52 204 restricted permissions of created directories:;
+#X text 279 266 directory creation mode (user/group/other permissions) in octal.;
+#X msg 81 360 creationmode 0o700;
+#X text 277 304 the actual permissions of the created directory also takes the umask into account. this might be ignored by the underlying filesystem.;
+#X text 278 366 the creation mode only affects directories that are created after the mode has been set.;
+#X obj 81 385 file mkdir;
+#X obj 81 270 file mkdir -m 0o700;
+#X obj 81 130 file mkdir -v;
+#X obj 81 100 file mkdir -q;
+#X obj 498 129 file mkdir;
+#X connect 2 0 18 0;
+#X connect 3 0 2 0;
+#X connect 11 0 14 0;
+#X restore 195 551 pd flags;
#X connect 0 0 1 0;
-#X connect 0 1 24 0;
+#X connect 0 1 23 0;
#X connect 1 0 2 0;
#X connect 4 0 0 0;
#X connect 5 0 0 0;
-#X connect 14 0 0 0;
-#X connect 15 0 4 0;
-#X connect 16 0 0 0;
-#X connect 22 0 16 0;
-#X connect 23 0 15 0;
-#X connect 24 0 3 0;
-#X restore 440 148 pd mkdir;
+#X connect 13 0 0 0;
+#X connect 14 0 4 0;
+#X connect 15 0 0 0;
+#X connect 21 0 15 0;
+#X connect 22 0 14 0;
+#X connect 23 0 3 0;
+#X restore 442 148 pd mkdir;
#X obj 27 451 file delete;
-#X text 157 452 - delete files and directories;
+#X text 155 452 - delete files and directories;
#N canvas 521 23 666 648 delete 0;
#X obj 85 216 file delete;
#X obj 159 243 print ERR:delete;
@@ -466,20 +467,6 @@
#X text 225 522 on error \, a bang is sent to the 2nd outlet;
#X text 118 581 on success \, the deleted path is sent to the 1st outlet;
#X text 212 464 if nada is a file (rather than a directory) \, it will be deleted just so.;
-#N canvas 577 348 738 232 arguments 0;
-#X text 274 145 less verbose (quiet);
-#X text 274 175 more verbose (loud);
-#X msg 563 149 verbose \$1;
-#X obj 563 124 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 106 70 error reporting on the Pd-console;
-#X text 239 111 via flags:;
-#X text 524 97 via a message:;
-#X obj 146 145 file delete -q;
-#X obj 146 175 file delete -v;
-#X obj 563 174 file delete;
-#X connect 2 0 9 0;
-#X connect 3 0 2 0;
-#X restore 505 314 pd arguments;
#X text 60 346 ------------------;
#X text 82 365 if you are sure that you want to remove an entire directory tree with all the files and subdirectories \, you can also remove it *recursively* using the "recursive" message.;
#X obj 11 47 cnv 1 650 1 empty empty empty 8 12 0 13 #000000 #000000 0;
@@ -502,14 +489,28 @@
#X restore 567 15 pd reference;
#X obj 36 15 file delete;
#X text 132 15 - remove files and directories.;
+#N canvas 577 348 738 232 flags 0;
+#X text 274 145 less verbose (quiet);
+#X text 274 175 more verbose (loud);
+#X msg 563 149 verbose \$1;
+#X obj 563 124 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 106 70 error reporting on the Pd-console;
+#X text 239 111 via flags:;
+#X text 524 97 via a message:;
+#X obj 146 145 file delete -q;
+#X obj 146 175 file delete -v;
+#X obj 563 174 file delete;
+#X connect 2 0 9 0;
+#X connect 3 0 2 0;
+#X restore 512 157 pd flags;
#X connect 0 0 2 0;
#X connect 0 1 1 0;
#X connect 4 0 0 0;
#X connect 7 0 10 0;
#X connect 7 1 9 0;
#X connect 8 0 7 0;
-#X restore 440 451 pd delete;
-#N canvas 495 139 674 330 copy 0;
+#X restore 442 451 pd delete;
+#N canvas 504 123 674 330 copy 0;
#X msg 48 115 list source destination;
#X text 233 114 copies the file 'source' to the new file 'destination';
#X obj 48 284 print copy;
@@ -560,19 +561,18 @@
#X connect 12 0 2 0;
#X connect 12 1 3 0;
#X connect 13 0 12 0;
-#X restore 440 399 pd copy;
+#X restore 442 399 pd copy;
#X obj 27 399 file copy;
-#X text 157 400 - copy files;
+#X text 155 400 - copy files;
#X obj 27 425 file move;
-#X text 157 426 - move files;
+#X text 155 426 - move files;
#X obj 27 488 file split;
#X obj 27 513 file join;
#X obj 27 538 file splitext;
#X obj 27 563 file splitname;
-#X text 157 519 - filename operations;
+#X text 155 519 - filename operations;
#X obj 31 12 file;
#X text 78 11 - low-level file operations;
-#X text 28 68 The file object's first argument sets its function:;
#X obj 27 312 file isfile;
#X obj 27 337 file isdirectory;
#X obj 27 362 file size;
@@ -604,20 +604,6 @@
#X obj 36 274 r \$0-info-path;
#X obj 48 391 r \$0-info-path;
#X obj 538 278 r \$0-info-path;
-#N canvas 143 98 738 232 arguments 0;
-#X text 274 145 less verbose (quiet);
-#X text 274 175 more verbose (loud);
-#X msg 563 149 verbose \$1;
-#X obj 563 123 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 106 70 error reporting on the Pd-console;
-#X text 239 111 via flags:;
-#X text 524 96 via a message:;
-#X obj 146 145 file size -q;
-#X obj 146 175 file isfile -v;
-#X obj 563 174 file isdirectory;
-#X connect 2 0 9 0;
-#X connect 3 0 2 0;
-#X restore 544 142 pd arguments;
#X symbolatom 189 234 0 0 0 0 - - - 0;
#N canvas 578 479 645 307 info-path 0;
#X obj 44 107 openpanel;
@@ -674,29 +660,43 @@
#X obj 138 325 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X obj 136 443 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X obj 647 328 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#N canvas 143 98 738 232 flags 0;
+#X text 274 145 less verbose (quiet);
+#X text 274 175 more verbose (loud);
+#X msg 563 149 verbose \$1;
+#X obj 563 123 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 106 70 error reporting on the Pd-console;
+#X text 239 111 via flags:;
+#X text 524 96 via a message:;
+#X obj 146 145 file size -q;
+#X obj 146 175 file isfile -v;
+#X obj 563 174 file isdirectory;
+#X connect 2 0 9 0;
+#X connect 3 0 2 0;
+#X restore 626 175 pd flags;
#X connect 0 0 1 0;
-#X connect 0 1 39 0;
+#X connect 0 1 38 0;
#X connect 1 0 11 0;
#X connect 2 0 10 0;
#X connect 3 0 2 0;
-#X connect 3 1 41 0;
-#X connect 6 0 29 2;
-#X connect 8 0 29 2;
+#X connect 3 1 40 0;
+#X connect 6 0 28 2;
+#X connect 8 0 28 2;
#X connect 14 0 16 0;
#X connect 15 0 14 0;
-#X connect 15 1 40 0;
+#X connect 15 1 39 0;
#X connect 24 0 0 0;
#X connect 25 0 15 0;
#X connect 26 0 3 0;
-#X connect 28 0 30 0;
-#X connect 29 0 28 0;
-#X connect 37 0 29 0;
-#X connect 38 0 29 1;
-#X connect 39 0 18 0;
-#X connect 40 0 19 0;
-#X connect 41 0 9 0;
-#X restore 440 340 pd info;
-#N canvas 453 23 827 708 stat 0;
+#X connect 27 0 29 0;
+#X connect 28 0 27 0;
+#X connect 36 0 28 0;
+#X connect 37 0 28 1;
+#X connect 38 0 18 0;
+#X connect 39 0 19 0;
+#X connect 40 0 9 0;
+#X restore 442 340 pd info;
+#N canvas 302 23 827 708 stat 0;
#X text 27 59 select a file, f 6;
#X text 140 63 select a directory;
#X msg 161 94 symbol .;
@@ -757,20 +757,6 @@
#X connect 8 0 0 0;
#X restore 80 121 pd openpanel;
#X obj 80 180 file stat;
-#N canvas 565 317 738 232 arguments 0;
-#X text 274 145 less verbose (quiet);
-#X text 274 175 more verbose (loud);
-#X msg 563 149 verbose \$1;
-#X obj 563 124 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 106 70 error reporting on the Pd-console;
-#X text 239 111 via flags:;
-#X text 524 97 via a message:;
-#X obj 146 145 file stat -q;
-#X obj 146 175 file stat -v;
-#X obj 563 174 file stat;
-#X connect 2 0 9 0;
-#X connect 3 0 2 0;
-#X restore 613 153 pd arguments;
#X text 445 70 [file stat] queries the filesystem about the given path \, and outputs the collected data as a number of routable messages., f 46;
#X text 385 384 (the symlink flag is additional: e.g. \, if the path is a symlink to a directory \, both isdirectory and issymlink will be true);
#X symbolatom 80 150 66 0 0 0 - - - 0;
@@ -812,15 +798,29 @@
#X text 151 403 F;
#X text 228 404 D;
#X text 307 404 L;
+#N canvas 565 317 738 232 flags 0;
+#X text 274 145 less verbose (quiet);
+#X text 274 175 more verbose (loud);
+#X msg 563 149 verbose \$1;
+#X obj 563 124 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 106 70 error reporting on the Pd-console;
+#X text 239 111 via flags:;
+#X text 524 97 via a message:;
+#X obj 146 145 file stat -q;
+#X obj 146 175 file stat -v;
+#X obj 563 174 file stat;
+#X connect 2 0 9 0;
+#X connect 3 0 2 0;
+#X restore 671 194 pd flags;
#X connect 2 0 41 2;
#X connect 4 0 41 2;
#X connect 7 0 28 0;
#X connect 7 1 8 0;
#X connect 10 0 11 0;
#X connect 11 0 13 0;
-#X connect 12 0 62 0;
-#X connect 12 1 63 0;
-#X connect 12 2 64 0;
+#X connect 12 0 61 0;
+#X connect 12 1 62 0;
+#X connect 12 2 63 0;
#X connect 16 0 33 0;
#X connect 17 0 18 0;
#X connect 17 1 20 0;
@@ -835,26 +835,26 @@
#X connect 25 0 23 0;
#X connect 25 1 10 0;
#X connect 26 0 17 0;
-#X connect 26 1 48 0;
+#X connect 26 1 47 0;
#X connect 28 0 22 0;
#X connect 28 1 30 0;
#X connect 30 0 27 0;
#X connect 31 0 9 0;
-#X connect 31 1 57 0;
-#X connect 31 2 58 0;
-#X connect 31 3 59 0;
+#X connect 31 1 56 0;
+#X connect 31 2 57 0;
+#X connect 31 3 58 0;
#X connect 32 0 16 0;
#X connect 33 0 34 0;
-#X connect 41 0 46 0;
+#X connect 41 0 45 0;
#X connect 42 0 7 0;
-#X connect 42 1 55 0;
-#X connect 46 0 42 0;
-#X connect 48 0 14 0;
-#X connect 48 1 15 0;
-#X connect 53 0 41 0;
-#X connect 54 0 41 1;
-#X connect 55 0 6 0;
-#X restore 440 311 pd stat;
+#X connect 42 1 54 0;
+#X connect 45 0 42 0;
+#X connect 47 0 14 0;
+#X connect 47 1 15 0;
+#X connect 52 0 41 0;
+#X connect 53 0 41 1;
+#X connect 54 0 6 0;
+#X restore 442 311 pd stat;
#N canvas 549 160 676 359 move 0;
#X msg 53 110 list source destination;
#N canvas 305 121 542 398 arguments 0;
@@ -905,12 +905,12 @@
#X connect 1 0 7 0;
#X connect 7 0 8 0;
#X connect 7 1 9 0;
-#X restore 440 425 pd move;
-#X text 22 695 see also:;
-#X obj 97 694 text;
-#X obj 139 694 array;
-#X obj 188 694 list;
-#X text 157 328 - get information on existing files;
+#X restore 442 425 pd move;
+#X text 22 665 see also:;
+#X obj 97 664 text;
+#X obj 139 664 array;
+#X obj 188 664 list;
+#X text 155 328 - get information on existing files;
#N canvas 451 65 791 637 split+join 0;
#N canvas 140 311 547 369 path 0;
#X obj 103 233 symbol;
@@ -1035,7 +1035,7 @@
#X connect 25 0 2 0;
#X connect 28 0 21 1;
#X connect 29 0 21 0;
-#X restore 440 518 pd split+join;
+#X restore 442 518 pd split+join;
#N canvas 395 48 794 632 base+ext 0;
#N canvas 375 327 547 369 path 0;
#X obj 103 233 symbol;
@@ -1165,9 +1165,9 @@
#X connect 25 0 24 0;
#X connect 26 0 29 0;
#X connect 27 0 28 0;
-#X restore 440 548 pd base+ext;
+#X restore 442 548 pd base+ext;
#X obj 27 123 file define \$0.f;
-#X text 156 122 - shared file handles;
+#X text 154 122 - shared file handles;
#N canvas 565 43 617 557 define 0;
#X obj 63 177 file define \$0.foo;
#X text 213 177 declare a file-handle with a given name.;
@@ -1194,7 +1194,7 @@
#X obj 30 20 file define z;
#X text 164 103 NONE;
#X text 164 65 NONE;
-#X text 143 140 1 symbol - declared file-handle name.;
+#X text 143 140 1) symbol - declared file-handle name.;
#X restore 513 18 pd reference;
#X obj 225 439 bng 19 250 50 0 empty empty empty -35 10 0 10 #dfdfdf #000000 #000000;
#X text 17 122 In this case \, you can use the [file define] object to provide a file handle that can then be accessed by multiple [file handle] objects., f 77;
@@ -1203,7 +1203,7 @@
#X connect 5 0 9 0;
#X connect 10 0 9 1;
#X connect 17 0 10 0;
-#X restore 440 123 pd define;
+#X restore 442 123 pd define;
#X obj 10 44 cnv 1 550 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#N canvas 765 68 566 232 reference 0;
#X obj 7 163 cnv 5 550 5 empty empty empty 8 18 0 13 #202020 #000000 0;
@@ -1215,7 +1215,7 @@
#X text 73 18 - low-level file operations;
#X text 160 86 sets the function of [file] \, possible values: handle \, define \, mkdir \, which \, glob \, stat \, isfile \, isdirectory \, size \, copy \, move \, delete \, split \, join \, splitext and splitname. The default value is 'define'., f 54;
#X restore 469 12 pd reference;
-#X obj 9 683 cnv 1 550 1 empty empty empty 8 12 0 13 #000000 #000000 0;
+#X obj 9 653 cnv 1 550 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X obj 27 197 file patchpath;
#N canvas 513 87 618 571 patchpath 0;
#X symbolatom 88 529 0 0 0 0 - - - 0;
@@ -1265,25 +1265,11 @@
#X connect 7 0 1 0;
#X connect 8 0 1 0;
#X connect 19 0 1 0;
-#X restore 440 197 pd patchpath;
-#X text 157 196 - get path relative to the patch;
+#X restore 442 197 pd patchpath;
+#X text 155 196 - get path relative to the patch;
#X obj 27 172 file cwd;
-#X text 157 171 - get/set the current working directory;
+#X text 155 171 - get/set the current working directory;
#N canvas 536 54 569 586 cwd 0;
-#N canvas 373 310 531 228 arguments 0;
-#X text 164 93 less verbose (quiet);
-#X text 164 123 more verbose (loud);
-#X msg 354 113 verbose \$1;
-#X obj 354 81 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
-#X text 34 29 error reporting on the Pd-console;
-#X text 129 59 via flags:;
-#X text 380 82 via a message:;
-#X obj 36 93 file cwd -q;
-#X obj 36 123 file cwd -v;
-#X obj 354 138 file cwd;
-#X connect 2 0 9 0;
-#X connect 3 0 2 0;
-#X restore 350 533 pd arguments;
#X obj 196 467 bng 20 250 50 0 empty empty empty -35 10 0 10 #dfdfdf #000000 #000000;
#X obj 108 425 file cwd, f 13;
#X text 115 172 get the Current Working Directory;
@@ -1292,10 +1278,10 @@
#X msg 108 216 symbol ..;
#X text 185 215 change to the parent directory;
#X text 202 257 change to the HOME-directory;
-#X msg 145 295 symbol /foo;
-#X text 238 294 change to some other (most likely nonexistent) directory, f 29;
+#X msg 145 298 symbol /foo;
+#X text 237 292 change to some other (most likely nonexistent) directory, f 29;
#X obj 160 366 openpanel 1;
-#X text 191 340 select a new working directory;
+#X text 189 340 select a new working directory;
#X text 52 63 [file cwd] allows you to query and set the Current Working Directory., f 69;
#X text 53 90 The Current Working Directory is typically the directory where you started Pd from (and is distinct from the directory your patch or abstraction lives in \, or where Pd is installed to), f 69;
#X obj 11 47 cnv 1 550 1 empty empty empty 8 12 0 13 #000000 #000000 0;
@@ -1323,15 +1309,29 @@
#X obj 83 172 bng 20 250 50 0 empty empty empty -35 10 0 10 #dfdfdf #000000 #000000;
#X obj 160 341 bng 20 250 50 0 empty empty empty -35 10 0 10 #dfdfdf #000000 #000000;
#X text 242 431 In case of an error \, the 2nd outlet sends out a bang. An error occurs for example \, if you try to change the CWD to a path that is not a directory., f 37;
-#X connect 2 0 4 0;
-#X connect 2 1 1 0;
-#X connect 5 0 2 0;
-#X connect 6 0 2 0;
-#X connect 9 0 2 0;
-#X connect 11 0 2 0;
-#X connect 20 0 2 0;
-#X connect 21 0 11 0;
-#X restore 440 172 pd cwd;
+#N canvas 373 310 531 228 flags 0;
+#X text 164 93 less verbose (quiet);
+#X text 164 123 more verbose (loud);
+#X msg 354 113 verbose \$1;
+#X obj 354 81 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1;
+#X text 34 29 error reporting on the Pd-console;
+#X text 129 59 via flags:;
+#X text 380 82 via a message:;
+#X obj 36 93 file cwd -q;
+#X obj 36 123 file cwd -v;
+#X obj 354 138 file cwd;
+#X connect 2 0 9 0;
+#X connect 3 0 2 0;
+#X restore 350 533 pd flags;
+#X connect 1 0 3 0;
+#X connect 1 1 0 0;
+#X connect 4 0 1 0;
+#X connect 5 0 1 0;
+#X connect 8 0 1 0;
+#X connect 10 0 1 0;
+#X connect 19 0 1 0;
+#X connect 20 0 10 0;
+#X restore 442 172 pd cwd;
#X obj 27 614 file isabsolute;
#N canvas 469 92 627 573 isabsolute 0;
#X floatatom 89 529 5 0 0 0 - - - 0;
@@ -1379,7 +1379,7 @@
#X connect 11 0 17 0;
#X connect 17 0 0 0;
#X connect 20 0 1 0;
-#X restore 440 614 pd isabsolute;
+#X restore 442 614 pd isabsolute;
#X obj 27 587 file normalize;
#N canvas 493 23 705 716 normalize 0;
#X symbolatom 77 403 0 0 0 0 - - - 0;
@@ -1396,20 +1396,6 @@
#X msg 116 258 symbol /../foo;
#X text 235 251 you cannot go up from the root directory (/) \, so the ".." component doesn't do anything. "foo" however does.;
#X msg 134 301 symbol C:/../foo;
-#N canvas 19 51 868 238 arguments 0;
-#X text 274 145 less verbose (quiet);
-#X text 274 175 more verbose (loud);
-#X msg 563 149 verbose \$1;
-#X obj 563 127 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1;
-#X text 106 70 error reporting on the Pd-console;
-#X text 239 111 via flags:;
-#X text 524 100 via a message:;
-#X obj 146 145 file normalize -q;
-#X obj 146 175 file normalize -v;
-#X obj 563 174 file normalize;
-#X connect 2 0 9 0;
-#X connect 3 0 2 0;
-#X restore 474 684 pd arguments;
#X symbolatom 56 690 0 0 0 0 - - - 0;
#X symbolatom 56 609 0 0 0 0 - - - 0;
#X obj 56 635 file normalize;
@@ -1445,6 +1431,20 @@
#X text 42 432 [file normalize] can also be used to check whether a path is valid. Invalid paths will also print an error to the Pd-console \, which can be suppressed by reducing the verbosity., f 89;
#X text 268 296 On Microsoft Windows (MSW) \, "C:/" this is an absolute path \, so going up from it is just discarded. However \, on un*x (Linux \, macOS \, ...) \, C: is just a relative path that is made redundant by the following "..", f 53;
#X text 219 591 The 2nd outlet gives an error code \, indicating whether the path is valid (0) \, invalid (2) or invalid-on-other-systems (1)., f 63;
+#N canvas 19 51 868 238 flags 0;
+#X text 274 145 less verbose (quiet);
+#X text 274 175 more verbose (loud);
+#X msg 563 149 verbose \$1;
+#X obj 563 127 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1;
+#X text 106 70 error reporting on the Pd-console;
+#X text 239 111 via flags:;
+#X text 524 100 via a message:;
+#X obj 146 145 file normalize -q;
+#X obj 146 175 file normalize -v;
+#X obj 563 174 file normalize;
+#X connect 2 0 9 0;
+#X connect 3 0 2 0;
+#X restore 513 680 pd flags;
#X connect 1 0 3 0;
#X connect 2 0 1 0;
#X connect 3 0 0 0;
@@ -1453,11 +1453,12 @@
#X connect 8 0 1 0;
#X connect 11 0 1 0;
#X connect 13 0 1 0;
-#X connect 16 0 17 0;
-#X connect 17 0 15 0;
-#X connect 17 1 18 0;
-#X connect 19 0 16 0;
-#X connect 21 0 16 0;
-#X connect 22 0 16 0;
-#X restore 440 587 pd normalize;
-#X text 349 694 updated for Pd version 0.54;
+#X connect 15 0 16 0;
+#X connect 16 0 14 0;
+#X connect 16 1 17 0;
+#X connect 18 0 15 0;
+#X connect 20 0 15 0;
+#X connect 21 0 15 0;
+#X restore 442 587 pd normalize;
+#X text 349 664 updated for Pd version 0.55;
+#X text 28 68 The first argument of [file] sets its function:;
From f795f548975c1958068c9bbbe095af5151d06b52 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?uml=C3=A4ute?=
Date: Thu, 14 Mar 2024 17:07:37 +0000
Subject: [PATCH 109/450] Translated using Weblate (German)
Currently translated at 100.0% (494 of 494 strings)
Translation: pure-data/Interface
Translate-URL: https://hosted.weblate.org/projects/pure-data/pure-data/de/
---
po/de.po | 19 +++++++++----------
1 file changed, 9 insertions(+), 10 deletions(-)
diff --git a/po/de.po b/po/de.po
index dc838575b..04f3be96e 100644
--- a/po/de.po
+++ b/po/de.po
@@ -10,16 +10,16 @@ msgstr ""
"Project-Id-Version: Pure Data 0.52\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
"POT-Creation-Date: 2024-03-14 18:04+0100\n"
-"PO-Revision-Date: 2023-10-23 10:04+0000\n"
+"PO-Revision-Date: 2024-03-14 20:00+0000\n"
"Last-Translator: umläute \n"
-"Language-Team: German \n"
+"Language-Team: German \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.1.1-dev\n"
+"X-Generator: Weblate 5.5-dev\n"
msgid "linear"
msgstr "linear"
@@ -595,10 +595,10 @@ msgid "single page"
msgstr "alles auf einer Seite"
msgid "patching helpers"
-msgstr ""
+msgstr "Patching-Hilfen"
msgid "Highlight active cord while connecting"
-msgstr ""
+msgstr "Aktive Verbindung während des Verbindens hervorheben"
msgid "Preferences"
msgstr "Einstellungen"
@@ -816,11 +816,11 @@ msgstr "Referenz-SHA256 für '%s' nicht verfügbar."
#, tcl-format
msgid "File checksum looks invalid: '%s'."
-msgstr ""
+msgstr "Die Checksumme der Datei sieht ungültig aus: '%s'."
#, tcl-format
msgid "Reference checksum looks invalid: '%s'."
-msgstr ""
+msgstr "Die Referenzchecksumme sieht ungültig aus: '%s'."
#, tcl-format
msgid "Unable to perform SHA256 verification for '%s'."
@@ -1149,9 +1149,8 @@ msgstr "Download abgeschlossen! Überprüfung..."
msgid "Ignoring checksum mismatch"
msgstr "Ignoriere Checksummen-Fehler"
-#, fuzzy
msgid "Ignoring checksum errors"
-msgstr "Ignoriere Checksummen-Fehler"
+msgstr "Checksummen-Fehler werden ignoriert"
#, tcl-format
msgid "[deken] deken-plugin.tcl (Pd externals search) loaded from %s."
From 6ea584ebb3501e03d7f01ef08b20c01389bdd7a6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?uml=C3=A4ute?=
Date: Thu, 14 Mar 2024 17:06:47 +0000
Subject: [PATCH 110/450] Translated using Weblate (English)
Currently translated at 100.0% (494 of 494 strings)
Translation: pure-data/Interface
Translate-URL: https://hosted.weblate.org/projects/pure-data/pure-data/en/
---
po/en.po | 19 +++++++++----------
1 file changed, 9 insertions(+), 10 deletions(-)
diff --git a/po/en.po b/po/en.po
index 9c3e15c39..d2e95a078 100644
--- a/po/en.po
+++ b/po/en.po
@@ -7,16 +7,16 @@ msgstr ""
"Project-Id-Version: Pure Data 0.51.4\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
"POT-Creation-Date: 2024-03-14 18:04+0100\n"
-"PO-Revision-Date: 2023-06-27 06:05+0000\n"
+"PO-Revision-Date: 2024-03-14 20:00+0000\n"
"Last-Translator: umläute \n"
-"Language-Team: English \n"
+"Language-Team: English \n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.18.1\n"
+"X-Generator: Weblate 5.5-dev\n"
msgid "linear"
msgstr "linear"
@@ -583,10 +583,10 @@ msgid "single page"
msgstr "single page"
msgid "patching helpers"
-msgstr ""
+msgstr "patching helpers"
msgid "Highlight active cord while connecting"
-msgstr ""
+msgstr "Highlight active cord while connecting"
msgid "Preferences"
msgstr "Preferences"
@@ -798,11 +798,11 @@ msgstr "Unable to fetch reference SHA256 for '%s'."
#, tcl-format
msgid "File checksum looks invalid: '%s'."
-msgstr ""
+msgstr "File checksum looks invalid: '%s'."
#, tcl-format
msgid "Reference checksum looks invalid: '%s'."
-msgstr ""
+msgstr "Reference checksum looks invalid: '%s'."
#, tcl-format
msgid "Unable to perform SHA256 verification for '%s'."
@@ -1125,9 +1125,8 @@ msgstr "Download completed! Verifying..."
msgid "Ignoring checksum mismatch"
msgstr "Ignoring checksum mismatch"
-#, fuzzy
msgid "Ignoring checksum errors"
-msgstr "Ignoring checksum mismatch"
+msgstr "Ignoring checksum errors"
#, tcl-format
msgid "[deken] deken-plugin.tcl (Pd externals search) loaded from %s."
From 06a5e38ad29668586230fd2c89f0d3d3e0e2bee8 Mon Sep 17 00:00:00 2001
From: cyrille henry
Date: Thu, 14 Mar 2024 19:43:38 +0000
Subject: [PATCH 111/450] Translated using Weblate (French)
Currently translated at 100.0% (494 of 494 strings)
Translation: pure-data/Interface
Translate-URL: https://hosted.weblate.org/projects/pure-data/pure-data/fr/
---
po/fr.po | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/po/fr.po b/po/fr.po
index 8985bce39..0d33b2a24 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -11,16 +11,16 @@ msgstr ""
"Project-Id-Version: Pure Data 0.53-0\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
"POT-Creation-Date: 2024-03-14 18:04+0100\n"
-"PO-Revision-Date: 2023-10-23 10:04+0000\n"
-"Last-Translator: umläute \n"
-"Language-Team: French \n"
+"PO-Revision-Date: 2024-03-14 20:00+0000\n"
+"Last-Translator: cyrille henry \n"
+"Language-Team: French \n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 5.1.1-dev\n"
+"X-Generator: Weblate 5.5-dev\n"
msgid "linear"
msgstr "linéaire"
@@ -586,10 +586,10 @@ msgid "use tabs"
msgstr "en onglets"
msgid "single page"
-msgstr "sur une seule page"
+msgstr "une seule page"
msgid "patching helpers"
-msgstr ""
+msgstr "aide au patch"
msgid "Highlight active cord while connecting"
msgstr ""
From 19bb95d65c0a8fb3423736301983b013d77de4c9 Mon Sep 17 00:00:00 2001
From: baptiste
Date: Thu, 14 Mar 2024 19:43:32 +0000
Subject: [PATCH 112/450] Translated using Weblate (French)
Currently translated at 100.0% (494 of 494 strings)
Translation: pure-data/Interface
Translate-URL: https://hosted.weblate.org/projects/pure-data/pure-data/fr/
---
po/fr.po | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/po/fr.po b/po/fr.po
index 0d33b2a24..7731ac66b 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -12,7 +12,7 @@ msgstr ""
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
"POT-Creation-Date: 2024-03-14 18:04+0100\n"
"PO-Revision-Date: 2024-03-14 20:00+0000\n"
-"Last-Translator: cyrille henry \n"
+"Last-Translator: baptiste \n"
"Language-Team: French \n"
"Language: fr\n"
@@ -298,7 +298,7 @@ msgid "Send"
msgstr "Envoyer"
msgid "Done"
-msgstr "Terminé"
+msgstr "Fermer"
#, tcl-format
msgid "Found '%1$s' in %2$s"
@@ -364,7 +364,7 @@ msgid "Receive symbol:"
msgstr "Recevoir du symbole :"
msgid "auto"
-msgstr "auto"
+msgstr "automatique"
msgid "Width:"
msgstr "Largeur :"
@@ -592,7 +592,7 @@ msgid "patching helpers"
msgstr "aide au patch"
msgid "Highlight active cord while connecting"
-msgstr ""
+msgstr "Mettre le câble actif en surbrillance lors de la connexion"
msgid "Preferences"
msgstr "Préférences"
@@ -808,11 +808,11 @@ msgstr "Impossible de récupérer le SHA256 de référence pour '%s'."
#, tcl-format
msgid "File checksum looks invalid: '%s'."
-msgstr ""
+msgstr "La somme de contrôle semble non valide : '%s'."
#, tcl-format
msgid "Reference checksum looks invalid: '%s'."
-msgstr ""
+msgstr "La somme de contrôle de référence semble non valide : '%s'."
#, tcl-format
msgid "Unable to perform SHA256 verification for '%s'."
@@ -1155,9 +1155,8 @@ msgstr "Téléchargement terminé ! Vérification..."
msgid "Ignoring checksum mismatch"
msgstr "Ignorer l'erreur de somme de contrôle"
-#, fuzzy
msgid "Ignoring checksum errors"
-msgstr "Ignorer l'erreur de somme de contrôle"
+msgstr "Ignorer les erreurs de somme de contrôle"
#, tcl-format
msgid "[deken] deken-plugin.tcl (Pd externals search) loaded from %s."
From e010f6af8ae145226e297a11e1db404bd0b83eb6 Mon Sep 17 00:00:00 2001
From: porres
Date: Thu, 14 Mar 2024 17:24:50 -0300
Subject: [PATCH 113/450] properly document [file which] new depth level
I got it wrong last time
---
doc/5.reference/file-help.pd | 75 +++++++++++++++++-------------------
1 file changed, 36 insertions(+), 39 deletions(-)
diff --git a/doc/5.reference/file-help.pd b/doc/5.reference/file-help.pd
index ebbbc89cb..41c5016d9 100644
--- a/doc/5.reference/file-help.pd
+++ b/doc/5.reference/file-help.pd
@@ -303,44 +303,41 @@
#X text 154 250 - list files in directories;
#X obj 27 249 file glob;
#X obj 27 222 file which;
-#N canvas 574 25 616 584 which 0;
-#X obj 37 254 file which;
-#X symbolatom 37 368 79 0 0 0 - - - 0;
-#X obj 37 394 print found;
-#X obj 104 307 print not!found;
-#X msg 47 224 symbol nada;
-#X msg 37 188 symbol hilbert~.pd;
-#X text 179 188 a file that ships with Pd;
-#X text 141 223 probably does not exist in Pd's search path;
-#X symbolatom 104 280 47 0 0 0 - - - 0;
-#X obj 37 340 unpack s f;
-#X floatatom 129 341 3 0 0 1 - - - 0;
+#N canvas 535 52 616 613 which 0;
+#X obj 45 365 file which;
+#X symbolatom 45 479 79 0 0 0 - - - 0;
+#X obj 45 505 print found;
+#X obj 112 418 print not!found;
+#X msg 45 279 symbol hilbert~.pd;
+#X text 187 279 a file that ships with Pd;
+#X text 162 327 probably does not exist in Pd's search path;
+#X symbolatom 112 391 47 0 0 0 - - - 0;
+#X obj 45 451 unpack s f;
+#X floatatom 137 452 3 0 0 1 - - - 0;
#X obj 11 47 cnv 1 600 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X text 137 14 - locate a file;
#X obj 50 15 file which;
-#N canvas 680 125 575 370 reference 0;
+#N canvas 680 125 563 321 reference 0;
#X obj 9 52 cnv 5 550 5 empty empty INLET: 8 18 0 13 #202020 #000000 0;
-#X obj 9 111 cnv 2 550 2 empty empty OUTLETS: 8 12 0 13 #202020 #000000 0;
-#X obj 8 329 cnv 5 550 5 empty empty empty 8 18 0 13 #202020 #000000 0;
-#X obj 9 167 cnv 1 550 1 empty empty 2nd: 8 12 0 13 #7c7c7c #000000 0;
-#X obj 9 137 cnv 1 550 1 empty empty 1st: 8 12 0 13 #7c7c7c #000000 0;
-#X text 155 240 -q: set quiet verbosity., f 49;
-#X text 155 258 -v: set loud verbosity., f 49;
+#X obj 9 131 cnv 2 550 2 empty empty OUTLETS: 8 12 0 13 #202020 #000000 0;
+#X obj 8 304 cnv 5 550 5 empty empty empty 8 18 0 13 #202020 #000000 0;
+#X obj 9 187 cnv 1 550 1 empty empty 2nd: 8 12 0 13 #7c7c7c #000000 0;
+#X obj 9 157 cnv 1 550 1 empty empty 1st: 8 12 0 13 #7c7c7c #000000 0;
+#X text 155 260 -q: set quiet verbosity., f 49;
+#X text 155 278 -v: set loud verbosity., f 49;
#X obj 31 22 file which;
#X text 114 22 - locate a file;
-#X text 127 65 symbol - file to locate using Pd's search-paths.;
-#X text 64 86 verbose - set verbosity on or off., f 57;
-#X obj 7 208 cnv 2 550 2 empty empty ARGUMENTS: 8 12 0 13 #202020 #000000 0;
-#X obj 7 234 cnv 1 550 1 empty empty flags: 8 12 0 13 #9f9f9f #000000 0;
-#X text 98 143 list - symbol path of located file and directory flag.;
-#X text 85 174 symbol - the input symbol if file isn't located.;
-#X obj 7 284 cnv 1 550 1 empty empty argument: 8 12 0 13 #9f9f9f #000000 0;
-#X text 119 296 1) float -;
-#X text 199 296 sets patch depth level to search (default 0).;
+#X text 137 65 symbol - file to locate using Pd's search-paths., f 51;
+#X text 74 103 verbose - set verbosity on or off., f 60;
+#X obj 7 228 cnv 2 550 2 empty empty ARGUMENTS: 8 12 0 13 #202020 #000000 0;
+#X obj 7 254 cnv 1 550 1 empty empty flags: 8 12 0 13 #9f9f9f #000000 0;
+#X text 118 163 list - symbol path of located file and directory flag.;
+#X text 105 194 symbol - the input symbol if file isn't located.;
+#X text 39 83 list - file name and patch depth level to search., f 65;
#X restore 518 15 pd reference;
#X text 27 63 [file which] tries to locate a file using Pd's search-paths. This includes the same relative path (the folder where the patch lives \, and other Pd seatch paths like the ones set via preferences and/or the [declare] object. If the file is found \, the object returns a list in the left outlet with the resolved path and a flag to inform if it is a file (0) or a directory (1) \, though this currently only works for filesT If nothing is found \, the entry is sent to the right outlet., f 79;
-#X text 158 333 directory flag: 0 if file \, 1 if directory (currently this only works for files), f 41;
-#X text 126 395 note: - currently only the first match is returned;
+#X text 166 444 directory flag: 0 if file \, 1 if directory (currently this only works for files), f 41;
+#X text 134 506 note: - currently only the first match is returned;
#N canvas 628 410 738 232 flags 0;
#X text 274 145 less verbose (quiet);
#X text 274 175 more verbose (loud);
@@ -354,17 +351,17 @@
#X obj 563 174 file which;
#X connect 2 0 9 0;
#X connect 3 0 2 0;
-#X restore 415 531 pd flags;
-#X obj 44 461 file which 1;
-#X text 150 440 The arguments sets the depth level. This is useful for setting which relative path to search for if the object is used in an abstraction. The default value is '0' \, which means relative to this patch. '1' is the parent patch \, '2' is the grandparent \, and so on., f 62;
-#X connect 0 0 9 0;
-#X connect 0 1 8 0;
+#X restore 336 559 pd flags;
+#X msg 68 328 list nada 1;
+#X text 26 180 The [file which] object takes a symbol with the file name to search \, but you can Also provide a list with file name and depth level. The depth level is useful for setting which relative path to search for if the object is used in an abstraction. The default value is '0' \, which means relative to this patch. '1' is the parent patch \, '2' is the grandparent \, and so on., f 79;
+#X connect 0 0 8 0;
+#X connect 0 1 7 0;
#X connect 1 0 2 0;
#X connect 4 0 0 0;
-#X connect 5 0 0 0;
-#X connect 8 0 3 0;
-#X connect 9 0 1 0;
-#X connect 9 1 10 0;
+#X connect 7 0 3 0;
+#X connect 8 0 1 0;
+#X connect 8 1 9 0;
+#X connect 18 0 0 0;
#X restore 442 222 pd which;
#X obj 27 148 file mkdir;
#X text 155 149 - create a directory;
From 44345a63349b6cf3b2d95814e80c436cce70bbda Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Fri, 15 Mar 2024 10:33:33 +0100
Subject: [PATCH 114/450] pdtk_open/savepanel: normalize dirnames
so ~/ gets expanded on macOS
Closes: https://github.com/pure-data/pure-data/issues/2214
---
tcl/wheredoesthisgo.tcl | 2 ++
1 file changed, 2 insertions(+)
diff --git a/tcl/wheredoesthisgo.tcl b/tcl/wheredoesthisgo.tcl
index 76e61b435..abdf70223 100644
--- a/tcl/wheredoesthisgo.tcl
+++ b/tcl/wheredoesthisgo.tcl
@@ -36,6 +36,7 @@ proc open_file {filename} {
# ------------------------------------------------------------------------------
# procs for panels (openpanel, savepanel)
proc pdtk_openpanel {target localdir {mode 0} {parent .pdwindow}} {
+ set localdir [file normalize $localdir]
if { $::pd::private::lastopendir == "" } {
if { ! [file isdirectory $::fileopendir]} {
set ::fileopendir $::env(HOME)
@@ -89,6 +90,7 @@ proc pdtk_openpanel {target localdir {mode 0} {parent .pdwindow}} {
proc pdtk_savepanel {target localdir {parent .pdwindow}} {
+ set localdir [file normalize $localdir]
if { $::pd::private::lastsavedir == "" } {
if { ! [file isdirectory $::filenewdir]} {
set ::filenewdir $::env(HOME)
From 56873a217d2e82d737ddbdf8b7616d693916d4b2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Fri, 15 Mar 2024 10:49:45 +0100
Subject: [PATCH 115/450] canvas_makefilename: expand leading "~" and envvars
(at least on windows)
also re-use sys_isabsolutepath() rather than making our own naive implementation
Closes: https://github.com/pure-data/pure-data/issues/2214
---
src/g_canvas.c | 5 +++--
src/s_path.c | 2 +-
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/g_canvas.c b/src/g_canvas.c
index ccb3b0398..d893116a6 100644
--- a/src/g_canvas.c
+++ b/src/g_canvas.c
@@ -54,6 +54,7 @@ static void canvas_pop(t_canvas *x, t_floatarg fvis);
static void canvas_bind(t_canvas *x);
static void canvas_unbind(t_canvas *x);
void canvas_declare(t_canvas *x, t_symbol *s, int argc, t_atom *argv);
+void sys_expandpath(const char *from, char *to, int bufsize);
/* ---------------- generic widget behavior ------------------------- */
@@ -305,9 +306,9 @@ t_symbol *canvas_getdir(const t_canvas *x)
void canvas_makefilename(const t_canvas *x, const char *file, char *result, int resultsize)
{
const char *dir = canvas_getenv(x)->ce_dir->s_name;
- if (file[0] == '/' || (file[0] && file[1] == ':') || !*dir)
+ if (sys_isabsolutepath(file) || !*dir)
{
- strncpy(result, file, resultsize);
+ sys_expandpath(file, result, resultsize);
result[resultsize-1] = 0;
}
else
diff --git a/src/s_path.c b/src/s_path.c
index 2b1df870c..ad7b4d523 100644
--- a/src/s_path.c
+++ b/src/s_path.c
@@ -86,7 +86,7 @@ int sys_isabsolutepath(const char *dir)
}
/* expand env vars and ~ at the beginning of a path and make a copy to return */
-static void sys_expandpath(const char *from, char *to, int bufsize)
+void sys_expandpath(const char *from, char *to, int bufsize)
{
if ((strlen(from) == 1 && from[0] == '~') || (strncmp(from,"~/", 2) == 0))
{
From 63f8cf0ed679f94bf122ec8330258ce595c6359d Mon Sep 17 00:00:00 2001
From: gallegonovato
Date: Thu, 14 Mar 2024 20:56:34 +0000
Subject: [PATCH 116/450] Translated using Weblate (Spanish)
Currently translated at 100.0% (494 of 494 strings)
Translation: pure-data/Interface
Translate-URL: https://hosted.weblate.org/projects/pure-data/pure-data/es/
---
po/es.po | 19 +++++++++----------
1 file changed, 9 insertions(+), 10 deletions(-)
diff --git a/po/es.po b/po/es.po
index 402eb33df..119c4bb36 100644
--- a/po/es.po
+++ b/po/es.po
@@ -13,16 +13,16 @@ msgstr ""
"Project-Id-Version: Pure Data 0.53.0\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
"POT-Creation-Date: 2024-03-14 18:04+0100\n"
-"PO-Revision-Date: 2023-06-28 06:21+0000\n"
+"PO-Revision-Date: 2024-03-15 10:44+0000\n"
"Last-Translator: gallegonovato \n"
-"Language-Team: Spanish \n"
+"Language-Team: Spanish \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.18.1\n"
+"X-Generator: Weblate 5.5-dev\n"
msgid "linear"
msgstr "Lineal"
@@ -594,10 +594,10 @@ msgid "single page"
msgstr "pagina única"
msgid "patching helpers"
-msgstr ""
+msgstr "Ayudas para parchear"
msgid "Highlight active cord while connecting"
-msgstr ""
+msgstr "Resalte la conexión activa mientras se conecta"
msgid "Preferences"
msgstr "Preferencias"
@@ -813,11 +813,11 @@ msgstr "No se pudo conseguir la referencia SHA256 para '%s'."
#, tcl-format
msgid "File checksum looks invalid: '%s'."
-msgstr ""
+msgstr "La suma de comprobación del archivo parece no válida: '%s'."
#, tcl-format
msgid "Reference checksum looks invalid: '%s'."
-msgstr ""
+msgstr "La suma de comprobación de referencia parece no válida: '%s'."
#, tcl-format
msgid "Unable to perform SHA256 verification for '%s'."
@@ -1146,9 +1146,8 @@ msgstr "¡Descarga completa! Verificando..."
msgid "Ignoring checksum mismatch"
msgstr "Ignorando diferencia de checksum"
-#, fuzzy
msgid "Ignoring checksum errors"
-msgstr "Ignorando diferencia de checksum"
+msgstr "Los errores de suma de comprobación se ignoran"
#, tcl-format
msgid "[deken] deken-plugin.tcl (Pd externals search) loaded from %s."
From c4b07174787365fab838118650a8f06272da93a1 Mon Sep 17 00:00:00 2001
From: porres
Date: Fri, 15 Mar 2024 19:23:45 -0300
Subject: [PATCH 117/450] add note about [delay 0]
closes https://github.com/pure-data/pddp/issues/160
---
doc/5.reference/delay-help.pd | 26 ++++++++++++++++++++------
1 file changed, 20 insertions(+), 6 deletions(-)
diff --git a/doc/5.reference/delay-help.pd b/doc/5.reference/delay-help.pd
index a46d8fbfd..593b1870d 100644
--- a/doc/5.reference/delay-help.pd
+++ b/doc/5.reference/delay-help.pd
@@ -1,4 +1,4 @@
-#N canvas 437 23 706 639 12;
+#N canvas 407 23 706 639 12;
#X obj 24 11 delay;
#X obj 25 36 del;
#X floatatom 233 462 5 0 0 0 - - - 0;
@@ -9,7 +9,7 @@
#X obj 64 270 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X text 491 602 updated for Pd version 0.45;
#X obj 117 491 delay 1000 1 msec;
-#X text 251 508 - tempo (float) and time unit (symbol) as in "tempo" message;
+#X text 415 510 - tempo (float) and time unit (symbol) as in "tempo" message, f 30;
#X msg 162 325 tempo 0.5 msec;
#X floatatom 117 325 5 0 0 0 - - - 0;
#X msg 117 298 1000;
@@ -59,9 +59,9 @@
#X obj 8 587 cnv 1 690 1 empty empty empty 8 12 0 13 #000000 #000000 0;
#X obj 117 530 bng 25 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X text 20 75 The [delay] object outputs a bang after a given delay time (via argument or right inlet). A bang starts the delay. A float specifies the time delay and starts it. If the delay is running and scheduled to output \, sending a bang or a float cancels the previous setting and reschedules the output., f 94;
-#X text 247 491 <-- creation arguments: - delay time (float);
+#X text 247 491 <-- creation arguments: - delay time (float), f 54;
#X text 59 36 <-- abbreviation;
-#N canvas 514 198 736 437 examples 0;
+#N canvas 570 48 709 670 examples 0;
#X obj 131 169 delay 1 60 permin;
#X obj 49 328 delay 1 1 sec;
#X obj 527 172 delay 1 44100 samp;
@@ -84,6 +84,14 @@
#X obj 527 275 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X obj 527 378 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
#X obj 527 339 delay 44100 1 samp;
+#X obj 110 444 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 195 559 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000;
+#X obj 195 524 delay 0;
+#X obj 142 594 realtime;
+#X floatatom 142 622 7 0 0 0 - - - 0;
+#X obj 110 478 t b b;
+#X text 292 492 When [delay] receives a message it schedules a message for the future \, even if the time delay is 0! Here we use [realtime] for a nondeterministic result of how long it actually takes., f 49;
+#X text 292 563 Check the 'Scheduling' section in Pd's manual \, Chapter 2 \, for more details on how Pd operates., f 49;
#X connect 0 0 6 0;
#X connect 1 0 13 0;
#X connect 2 0 18 0;
@@ -98,8 +106,14 @@
#X connect 16 0 2 0;
#X connect 19 0 21 0;
#X connect 21 0 20 0;
-#X restore 450 550 pd examples;
-#X text 320 549 open for more -->;
+#X connect 22 0 27 0;
+#X connect 23 0 25 1;
+#X connect 24 0 23 0;
+#X connect 25 0 26 0;
+#X connect 27 0 24 0;
+#X connect 27 1 25 0;
+#X restore 213 551 pd examples;
+#X text 303 550 <- open for more;
#X connect 2 0 9 1;
#X connect 3 0 9 0;
#X connect 7 0 9 0;
From 691472b803e2291696fd313150276fdc74f7e901 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Mon, 18 Mar 2024 08:44:22 +0100
Subject: [PATCH 118/450] add PD_DEPRECATED macro
---
src/m_pd.h | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/src/m_pd.h b/src/m_pd.h
index 74988b6e9..255a1399a 100644
--- a/src/m_pd.h
+++ b/src/m_pd.h
@@ -59,6 +59,18 @@ extern int pd_compatibilitylevel; /* e.g., 43 for pd 0.43 compatibility */
#define ATTRIBUTE_FORMAT_PRINTF(a, b)
#endif
+/* deprecation warning */
+#ifndef PD_DEPRECATED
+# ifdef __GNUC__
+# define PD_DEPRECATED __attribute__ ((deprecated))
+# elif defined(_MSC_VER) && _MSC_VER >= 1300
+# define PD_DEPRECATED __declspec(deprecated)
+# else
+# define PD_DEPRECATED
+# pragma message("PD_DEPRECATED not defined for this compiler")
+# endif
+#endif
+
#if !defined(_SIZE_T) && !defined(_SIZE_T_)
#include /* just for size_t -- how lame! */
#endif
From cb8ac67e2ef15b3c9bbfc0291ccbf82c92226a42 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Mon, 18 Mar 2024 08:45:04 +0100
Subject: [PATCH 119/450] mark deprecated functions as such
---
src/m_pd.h | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/m_pd.h b/src/m_pd.h
index 255a1399a..9e2d97d01 100644
--- a/src/m_pd.h
+++ b/src/m_pd.h
@@ -390,7 +390,7 @@ EXTERN void clock_delay(t_clock *x, double delaytime);
EXTERN void clock_unset(t_clock *x);
EXTERN void clock_setunit(t_clock *x, double timeunit, int sampflag);
EXTERN double clock_getlogicaltime(void);
-EXTERN double clock_getsystime(void); /* OBSOLETE; use clock_getlogicaltime() */
+PD_DEPRECATED EXTERN double clock_getsystime(void); /* use clock_getlogicaltime() */
EXTERN double clock_gettimesince(double prevsystime);
EXTERN double clock_gettimesincewithunits(double prevsystime,
double units, int sampflag);
@@ -742,12 +742,12 @@ EXTERN_STRUCT _garray;
#define t_garray struct _garray
EXTERN t_class *garray_class;
-EXTERN int garray_getfloatarray(t_garray *x, int *size, t_float **vec);
+PD_DEPRECATED EXTERN int garray_getfloatarray(t_garray *x, int *size, t_float **vec); /* use garray_getfloatwords() */
EXTERN int garray_getfloatwords(t_garray *x, int *size, t_word **vec);
EXTERN void garray_redraw(t_garray *x);
EXTERN int garray_npoints(t_garray *x);
EXTERN char *garray_vec(t_garray *x);
-EXTERN void garray_resize(t_garray *x, t_floatarg f); /* avoid; use this: */
+PD_DEPRECATED EXTERN void garray_resize(t_garray *x, t_floatarg f); /* use garray_resize_long() */
EXTERN void garray_resize_long(t_garray *x, long n); /* better version */
EXTERN void garray_usedindsp(t_garray *x);
EXTERN void garray_setsaveit(t_garray *x, int saveit);
From c2098f108725b5d4bde493165d696773b0505eef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Mon, 18 Mar 2024 09:20:59 +0100
Subject: [PATCH 120/450] use clock_getlogicaltime() instead of the deprecated
clock_getsystime()
---
src/g_bang.c | 4 ++--
src/s_audio_mmio.c | 2 +-
src/x_text.c | 4 ++--
src/x_time.c | 14 +++++++-------
4 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/src/g_bang.c b/src/g_bang.c
index 49d3e9863..31f84b5eb 100644
--- a/src/g_bang.c
+++ b/src/g_bang.c
@@ -173,7 +173,7 @@ static void bng_set(t_bng *x)
{
int holdtime = x->x_flashtime_hold;
int sincelast = clock_gettimesince(x->x_lastflashtime);
- x->x_lastflashtime = clock_getsystime();
+ x->x_lastflashtime = clock_getlogicaltime();
if (sincelast < x->x_flashtime_hold*2)
holdtime = sincelast/2;
if (holdtime < x->x_flashtime_break)
@@ -392,7 +392,7 @@ static void *bng_new(t_symbol *s, int argc, t_atom *argv)
bng_check_minmax(x, ftbreak, fthold);
x->x_gui.x_isa.x_locked = 0;
iemgui_verify_snd_ne_rcv(&x->x_gui);
- x->x_lastflashtime = clock_getsystime();
+ x->x_lastflashtime = clock_getlogicaltime();
x->x_clock_hld = clock_new(x, (t_method)bng_tick_hld);
x->x_clock_lck = clock_new(x, (t_method)bng_tick_lck);
iemgui_newzoom(&x->x_gui);
diff --git a/src/s_audio_mmio.c b/src/s_audio_mmio.c
index e30b76925..d886762e6 100644
--- a/src/s_audio_mmio.c
+++ b/src/s_audio_mmio.c
@@ -270,7 +270,7 @@ static double initsystime = -1;
/* call this whenever we reset audio */
static void nt_resetmidisync(void)
{
- initsystime = clock_getsystime();
+ initsystime = clock_getlogicaltime();
nt_hibuftime = sys_getrealtime();
}
diff --git a/src/x_text.c b/src/x_text.c
index 03d5408b7..109bd5982 100644
--- a/src/x_text.c
+++ b/src/x_text.c
@@ -1953,7 +1953,7 @@ static void qlist_donext(t_qlist *x, int drop, int automatic)
{
clock_delay(x->x_clock,
x->x_clockdelay = ap->a_w.w_float * x->x_tempo);
- x->x_whenclockset = clock_getsystime();
+ x->x_whenclockset = clock_getlogicaltime();
}
else outlet_list(x->x_ob.ob_outlet, 0, onset2-onset, ap);
x->x_innext = 0;
@@ -2020,7 +2020,7 @@ static void qlist_bang(t_qlist *x)
up to do this non-reentrantly after a delay of 0 */
if (x->x_innext)
{
- x->x_whenclockset = clock_getsystime();
+ x->x_whenclockset = clock_getlogicaltime();
x->x_clockdelay = 0;
clock_delay(x->x_clock, 0);
}
diff --git a/src/x_time.c b/src/x_time.c
index bcb7d2b7f..290b02a41 100644
--- a/src/x_time.c
+++ b/src/x_time.c
@@ -240,7 +240,7 @@ typedef struct _line
static void line_tick(t_line *x)
{
- double timenow = clock_getsystime();
+ double timenow = clock_getlogicaltime();
double msectogo = - clock_gettimesince(x->x_targettime);
if (msectogo < 1E-9)
{
@@ -260,7 +260,7 @@ static void line_tick(t_line *x)
static void line_float(t_line *x, t_float f)
{
- double timenow = clock_getsystime();
+ double timenow = clock_getlogicaltime();
if (x->x_gotinlet && x->x_in1val > 0)
{
if (timenow > x->x_targettime) x->x_setval = x->x_targetval;
@@ -298,10 +298,10 @@ static void line_stop(t_line *x)
{
if (pd_compatibilitylevel >= 48)
{
- if (clock_getsystime() >= x->x_targettime)
+ if (clock_getlogicaltime() >= x->x_targettime)
x->x_setval = x->x_targetval;
else x->x_setval += x->x_1overtimediff *
- (clock_getsystime() - x->x_prevtime) *
+ (clock_getlogicaltime() - x->x_prevtime) *
(x->x_targetval - x->x_setval);
}
x->x_targetval = x->x_setval;
@@ -326,7 +326,7 @@ static void *line_new(t_floatarg f, t_floatarg grain)
x->x_gotinlet = 0;
x->x_1overtimediff = 1;
x->x_clock = clock_new(x, (t_method)line_tick);
- x->x_targettime = x->x_prevtime = clock_getsystime();
+ x->x_targettime = x->x_prevtime = clock_getlogicaltime();
x->x_grain = grain;
outlet_new(&x->x_obj, gensym("float"));
inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("ft1"));
@@ -361,7 +361,7 @@ typedef struct _timer
static void timer_bang(t_timer *x)
{
- x->x_settime = clock_getsystime();
+ x->x_settime = clock_getlogicaltime();
x->x_moreelapsed = 0;
}
@@ -376,7 +376,7 @@ static void timer_tempo(t_timer *x, t_symbol *unitname, t_floatarg tempo)
{
x->x_moreelapsed += clock_gettimesincewithunits(x->x_settime,
x->x_unit, x->x_samps);
- x->x_settime = clock_getsystime();
+ x->x_settime = clock_getlogicaltime();
parsetimeunits(x, tempo, unitname, &x->x_unit, &x->x_samps);
}
From 825a3ff8bc45e0fb42315e70bffc69eccf001b15 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
Date: Mon, 18 Mar 2024 09:21:58 +0100
Subject: [PATCH 121/450] use garray_resize_long() instead of the deprecated
garray_resize()
---
src/g_array.c | 7 ++++++-
src/x_array.c | 2 +-
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/g_array.c b/src/g_array.c
index b78c7a674..5f0956efb 100644
--- a/src/g_array.c
+++ b/src/g_array.c
@@ -1245,6 +1245,11 @@ void garray_resize_long(t_garray *x, long n)
}
/* float version to use as Pd method */
+static void garray_doresize(t_garray *x, t_floatarg f)
+{
+ garray_resize_long(x, f);
+}
+ /* deprecated function, kept only for ABI compatibility */
void garray_resize(t_garray *x, t_floatarg f)
{
garray_resize_long(x, f);
@@ -1299,7 +1304,7 @@ void g_array_setup(void)
A_SYMBOL, A_NULL);
class_addmethod(garray_class, (t_method)garray_write, gensym("write"),
A_SYMBOL, A_NULL);
- class_addmethod(garray_class, (t_method)garray_resize, gensym("resize"),
+ class_addmethod(garray_class, (t_method)garray_doresize, gensym("resize"),
A_FLOAT, A_NULL);
class_addmethod(garray_class, (t_method)garray_zoom, gensym("zoom"),
A_FLOAT, 0);
diff --git a/src/x_array.c b/src/x_array.c
index 93ad80a6b..e0336e445 100644
--- a/src/x_array.c
+++ b/src/x_array.c
@@ -440,7 +440,7 @@ static void array_size_float(t_array_size *x, t_floatarg f)
pd_error(x, "no such array '%s'", x->x_tc.tc_sym->s_name);
return;
}
- garray_resize(y, f);
+ garray_resize_long(y, f);
}
else
{
From 7f02fc89a2d050336a80fe0ff6adf04973161252 Mon Sep 17 00:00:00 2001
From: danomatika
Date: Mon, 18 Mar 2024 23:51:32 +0100
Subject: [PATCH 122/450] soundfile comment typo and indentation fixes
---
src/d_soundfile_aiff.c | 2 +-
src/d_soundfile_caf.c | 2 +-
src/d_soundfile_next.c | 16 ++++++++--------
src/d_soundfile_wave.c | 2 +-
4 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/src/d_soundfile_aiff.c b/src/d_soundfile_aiff.c
index ce6e30d32..1ae7dd35f 100644
--- a/src/d_soundfile_aiff.c
+++ b/src/d_soundfile_aiff.c
@@ -204,7 +204,7 @@ static off_t aiff_firstchunk(const t_soundfile *sf, t_chunk *chunk)
}
/** read next chunk, chunk should be filled when calling
- returns fills chunk offset on success or -1 */
+ returns filled chunk offset on success or -1 */
static off_t aiff_nextchunk(const t_soundfile *sf, off_t offset, t_chunk *chunk)
{
int32_t chunksize = swap4s(chunk->c_size, !sys_isbigendian());
diff --git a/src/d_soundfile_caf.c b/src/d_soundfile_caf.c
index 554a69ea1..ef4d875b8 100644
--- a/src/d_soundfile_caf.c
+++ b/src/d_soundfile_caf.c
@@ -127,7 +127,7 @@ static off_t caf_firstchunk(const t_soundfile *sf, t_chunk *chunk)
}
/** read next chunk, chunk should be filled when calling
- returns fills chunk offset on success or -1 */
+ returns filled chunk offset on success or -1 */
static off_t caf_nextchunk(const t_soundfile *sf, off_t offset, t_chunk *chunk)
{
int64_t chunksize = caf_getchunksize(chunk, !sys_isbigendian());
diff --git a/src/d_soundfile_next.c b/src/d_soundfile_next.c
index 43a3d77b3..993feac04 100644
--- a/src/d_soundfile_next.c
+++ b/src/d_soundfile_next.c
@@ -25,14 +25,14 @@
this implementation:
- * does not support headerless files
- * supports big and little endian, system endianness used by default
- * sets a default info string: "Pd "
- * tries to set sound data length, otherwise falls back to "unknown size"
- * sample format: 16 and 24 bit lpcm, 32 bit float, no 32 bit lpcm
-
- Pd versions < 0.51 did *not* write the actual data chunk size when updating
- the header, but set "unknown size" instead.
+ * does not support headerless files
+ * supports big and little endian, system endianness used by default
+ * sets a default info string: "Pd "
+ * tries to set sound data length, otherwise falls back to "unknown size"
+ * sample format: 16 and 24 bit lpcm, 32 bit float, no 32 bit lpcm
+
+ Pd versions < 0.51 did *not* write the actual data chunk size when updating
+ the header, but set "unknown size" instead.
*/
diff --git a/src/d_soundfile_wave.c b/src/d_soundfile_wave.c
index 1128982de..7cc112a04 100644
--- a/src/d_soundfile_wave.c
+++ b/src/d_soundfile_wave.c
@@ -124,7 +124,7 @@ static off_t wave_firstchunk(const t_soundfile *sf, t_chunk *chunk)
}
/** read next chunk, chunk should be filled when calling
- returns fills chunk offset on success or -1 */
+ returns filled chunk offset on success or -1 */
static off_t wave_nextchunk(const t_soundfile *sf, off_t offset, t_chunk *chunk)
{
uint32_t chunksize = swap4(chunk->c_size, sys_isbigendian());
From 74998f60c6c953fe0c0156861ef077e91981064f Mon Sep 17 00:00:00 2001
From: Alberto Zin
Date: Tue, 19 Mar 2024 20:25:59 +0000
Subject: [PATCH 123/450] Translated using Weblate (Italian)
Currently translated at 100.0% (494 of 494 strings)
Translation: pure-data/Interface
Translate-URL: https://hosted.weblate.org/projects/pure-data/pure-data/it/
---
po/it.po | 50 +++++++++++++++++++++++---------------------------
1 file changed, 23 insertions(+), 27 deletions(-)
diff --git a/po/it.po b/po/it.po
index 70e8e7f2e..bbbcc7144 100644
--- a/po/it.po
+++ b/po/it.po
@@ -10,16 +10,16 @@ msgstr ""
"Project-Id-Version: Pure Data 0.43\n"
"Report-Msgid-Bugs-To: pd-dev@iem.at\n"
"POT-Creation-Date: 2024-03-14 18:04+0100\n"
-"PO-Revision-Date: 2023-10-26 07:01+0000\n"
-"Last-Translator: umläute \n"
-"Language-Team: Italian \n"
+"PO-Revision-Date: 2024-03-20 21:01+0000\n"
+"Last-Translator: Alberto Zin \n"
+"Language-Team: Italian \n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.1.1\n"
+"X-Generator: Weblate 5.5-dev\n"
msgid "linear"
msgstr "lineare"
@@ -83,7 +83,7 @@ msgid "Redo duplicate"
msgstr "Ripeti duplicazione"
msgid "Redo motion"
-msgstr "Annulla spostamento"
+msgstr "Ripeti spostamento"
msgid "Redo paste"
msgstr "Ripeti incolla"
@@ -588,10 +588,10 @@ msgid "single page"
msgstr "pagina singola"
msgid "patching helpers"
-msgstr ""
+msgstr "aiuti per le connessioni"
msgid "Highlight active cord while connecting"
-msgstr ""
+msgstr "Evidenzia linee attive durante il collegamento"
msgid "Preferences"
msgstr "Preferenze"
@@ -623,28 +623,26 @@ msgstr "I settaggi sotto richiedono dei riavviare Pd!"
msgid "Pd libraries to load on startup"
msgstr "Librerie Pd da caricare all'avvio"
-#, fuzzy
msgid "GUI options"
-msgstr "impostazioni GUI"
+msgstr "Opzioni della GUI"
msgid "language"
msgstr "lingua"
msgid "Menu language"
-msgstr "menu lingua"
+msgstr "Menu lingua"
msgid "float (32bit)"
-msgstr ""
+msgstr "singola precisione (32bit)"
msgid "double (64bit) EXPERIMENTAL"
-msgstr ""
+msgstr "double (64bit) SPERIMENTALE"
msgid "double (64bit)"
-msgstr ""
+msgstr "doppia precisione (64bit)"
-#, fuzzy
msgid "float size"
-msgstr "Dimensione del blocco:"
+msgstr "dimensione del valore float"
msgid "Numeric precision of Pd-core"
msgstr "Precisione numerica di Pd-core"
@@ -723,20 +721,19 @@ msgid "Failed to find plugins in %s ...skipping!"
msgstr "Impossibile trovare plugin in %s ...scartato!"
msgid "Pd startup failure"
-msgstr ""
+msgstr "Errore nella partenza di Pd"
-#, fuzzy
msgid "Failed to start Pd-core"
-msgstr "Impossibile installare '%s'!"
+msgstr "Errore nella partenza del core Pd"
msgid "(Tcl) MISSING CLOSE-BRACE '}': "
msgstr "(Tcl) MANCA LA PARENTESI GRAFFA DI CHIUSURA'}': "
msgid "(Tcl) INVALID COMMAND NAME: "
-msgstr "(Tcl) INVALID COMMAND NAME: "
+msgstr "(Tcl) NOME DI COMANDO NON VALIDO: "
msgid "(Tcl) UNHANDLED ERROR: "
-msgstr "(Tcl) UNHANDLED ERROR: "
+msgstr "(Tcl) ERRORE NON GESTITO: "
#, tcl-format
msgid "[deken] installed version [%1$s] > %2$s...skipping!"
@@ -809,11 +806,11 @@ msgstr "Impossibile recuperare il riferimento SHA256 per '%s'."
#, tcl-format
msgid "File checksum looks invalid: '%s'."
-msgstr ""
+msgstr "Il checksum del file sembra non valido: '%s'."
#, tcl-format
msgid "Reference checksum looks invalid: '%s'."
-msgstr ""
+msgstr "Il checksum di riferimento sembra non valido: '%s'."
#, tcl-format
msgid "Unable to perform SHA256 verification for '%s'."
@@ -1146,9 +1143,8 @@ msgstr "Scaricamento completato! Sto verificando..."
msgid "Ignoring checksum mismatch"
msgstr "Ignoro la non corrispondenza del checksum"
-#, fuzzy
msgid "Ignoring checksum errors"
-msgstr "Ignoro la non corrispondenza del checksum"
+msgstr "Trascurare gli errori di checksum"
#, tcl-format
msgid "[deken] deken-plugin.tcl (Pd externals search) loaded from %s."
@@ -1616,11 +1612,11 @@ msgid "Pd"
msgstr "Pd"
msgid "EXPERIMENTAL double (64bit) precision"
-msgstr ""
+msgstr "SPERIMENTALE doppia precisione (64 bit)"
#, tcl-format
msgid "%dbit-floats EXPERIMENTAL"
-msgstr ""
+msgstr "%dbit-floats SPERIMENTALE"
msgid "DSP"
msgstr "DSP"
From c2249df4757494e8b59923600838c0ee9b687469 Mon Sep 17 00:00:00 2001
From: porres
Date: Wed, 27 Mar 2024 23:55:36 -0300
Subject: [PATCH 124/450] Manual chapter2 revsion (#2233)
* revision up to 2.3
* revise the rest quickly
* Update x2.htm
add `` for referring to keys
* add one more
* more revisions
explained how to open or create a patch, change the font size, documented 'aligning' with arrow keys, and other minor details
* add new 2.3 section in advanced editing
* documenting tab navigation, autopatch, duplicate connections and 'shift' key
* document cmd+k
* document 'Clear Console' and 'Tidy up'
* Document "Paste Replace"
* document "shift + tab" to circle back
* document triggerize
* document tab cycle inlets
* fix typos from CODESPELL
* break long lines
* anchors
* update index
* html: update internal links
* html: typos
* html: update images
* html: fix broken link to subpatches
* language, typos, image tags
* remove trailing spaces, img tag fixes, alt-attributes
* add missing alt attribute
* add nowrap to css
* first bunch of images
* more pictures
* more pictures
* images, language
* html: add screens for File, Edit, Put and Media menus
* fix image for connection-insert, remove INCLUDE comments
* Revert "add nowrap to css"
This reverts commit 6a362857992c07f0f288956f1d367f8d39d071ac.
* add
s where shortcuts might break
* ascelerator -> shortcut
* consistently capitalize first letters in shortcuts
* add missing space
* -> , css changes
* fix filenames, add text change picture
* image for tidying up in selected state (more consistent with the rest)
* better autopatch-subpatch image
* nowrap for
* img url fix
* paint it black
* fix subpatch-autopatching once more. wasn't logical
* align kbd background with font color
* fix border color for
* minor edits
* there is no 'pure documentation' thing defined anywhere
* more minor edits
* frags does not exist anymore
* html: sections and links start with upper case.
* images: add cursors and deken install
* fix images
* image: add step to deken install
* actually fix image of deken install
* revise 2.3.4.
* all jpg->png, add dsp on/off img, abstractions with window
* adapt doc/Makefile.am to changed images
* minor revisions
* add connecting-boxes img, typo
* replace cmd for ctrl and more revisions
* further revision up to 2.4
* one last edit before giving to ben to include some pics
* oops, typo
* refer to 'preferences' in chapter 3
* move file menu pic earlier back
* html: add edit-mode pic
* html: update fig-ch2-console-edit-menu.png to highlight 'font' entry
* more final revisions
* fix 3 typos caught by CODESPELL
* capitalize "Introduction"
* html: remove deprecated tag.
* mention Pd can also be in double precision
* add link to the manual in example 2.editing.pd on control examples
* mention the 'X' shape cursor to delete connections
* fix renaming outlet to inlet
* html: single vs double max and min integers
* typo
* html: center table and remove external links
* add formula to min/max float values
* explain what pd64 is
* html: add space in table
* less space
* AKA
* remove 'include' pic
* disconnect img,
syntax, language
* rephrase 'object proper' paragraphs
* remove whitespaces
* update Makefile.am
* minor revision
* html: move images and resources to new folders
* white space
* html: move charset to meta tag
* line breaks, rephrased few paragraphs
* consistent 'menu' lowercase, rephrased paragraph
* rephrased
* more rephrasing and corrections
* whitespace removed
* img corrected
* one last big revision
---------
Co-authored-by: Lucas Cordiviola
Co-authored-by: Ben Wesch
Co-authored-by: Ben Wesch <1923787+ben-wes@users.noreply.github.com>
---
doc/1.manual/{ => css}/favicon.ico | Bin
doc/1.manual/{ => css}/pdmanual.css | 17 +
doc/1.manual/deken.gif | Bin 158852 -> 0 bytes
doc/1.manual/fig1.1.png | Bin 17051 -> 0 bytes
doc/1.manual/fig1.2.jpg | Bin 5802 -> 0 bytes
doc/1.manual/fig1.3.jpg | Bin 1476 -> 0 bytes
doc/1.manual/fig1.4.png | Bin 4528 -> 0 bytes
doc/1.manual/fig1.5.jpg | Bin 7900 -> 0 bytes
doc/1.manual/fig11.1.png | Bin 66292 -> 0 bytes
doc/1.manual/fig3.1.jpg | Bin 1739 -> 0 bytes
doc/1.manual/fig3.10.jpg | Bin 3681 -> 0 bytes
doc/1.manual/fig3.2.jpg | Bin 3653 -> 0 bytes
doc/1.manual/fig3.3.jpg | Bin 2954 -> 0 bytes
doc/1.manual/fig3.4.jpg | Bin 3226 -> 0 bytes
doc/1.manual/fig3.5.jpg | Bin 2838 -> 0 bytes
doc/1.manual/fig3.6.jpg | Bin 3383 -> 0 bytes
doc/1.manual/fig3.7.jpg | Bin 4312 -> 0 bytes
doc/1.manual/fig3.8.jpg | Bin 1815 -> 0 bytes
doc/1.manual/fig3.9.jpg | Bin 7867 -> 0 bytes
doc/1.manual/fig4.1.png | Bin 50014 -> 0 bytes
doc/1.manual/fig4.3.png | Bin 36402 -> 0 bytes
doc/1.manual/fig4.5.png | Bin 19454 -> 0 bytes
doc/1.manual/fig4.6.png | Bin 45050 -> 0 bytes
doc/1.manual/fig7.1.jpg | Bin 4225 -> 0 bytes
doc/1.manual/fig7.2.jpg | Bin 17523 -> 0 bytes
doc/1.manual/fig7.3.jpg | Bin 4908 -> 0 bytes
doc/1.manual/fig7.4.jpg | Bin 6095 -> 0 bytes
doc/1.manual/fig7.5.jpg | Bin 4982 -> 0 bytes
doc/1.manual/fig7.6.jpg | Bin 20680 -> 0 bytes
doc/1.manual/fig8.1.jpg | Bin 4919 -> 0 bytes
doc/1.manual/fig8.2.jpg | Bin 4950 -> 0 bytes
doc/1.manual/fig8.3.jpg | Bin 3745 -> 0 bytes
doc/1.manual/fig8.4.jpg | Bin 6588 -> 0 bytes
doc/1.manual/fig8.5.jpg | Bin 38855 -> 0 bytes
doc/1.manual/fig8.6.jpg | Bin 50282 -> 0 bytes
doc/1.manual/fig9.1.jpg | Bin 15267 -> 0 bytes
doc/1.manual/fig9.2.jpg | Bin 17390 -> 0 bytes
doc/1.manual/fig9.3.jpg | Bin 38881 -> 0 bytes
.../img/fig-ch2-autopatching-objects.png | Bin 0 -> 12094 bytes
.../img/fig-ch2-autopatching-subpatches.png | Bin 0 -> 42563 bytes
doc/1.manual/img/fig-ch2-changing-text.png | Bin 0 -> 17473 bytes
doc/1.manual/img/fig-ch2-connecting-boxes.png | Bin 0 -> 3999 bytes
.../img/fig-ch2-console-edit-menu.png | Bin 0 -> 25264 bytes
.../img/fig-ch2-console-media-menu.png | Bin 0 -> 12927 bytes
...is-connect-exclude-box-from-connection.png | Bin 0 -> 19001 bytes
.../img/fig-ch2-dis-connect-fan-out-audio.png | Bin 0 -> 10118 bytes
...2-dis-connect-insert-box-to-connection.png | Bin 0 -> 17474 bytes
doc/1.manual/img/fig-ch2-dis-connect-menu.png | Bin 0 -> 53885 bytes
.../img/fig-ch2-dis-connect-parallel.png | Bin 0 -> 8387 bytes
.../img/fig-ch2-disconnecting-boxes.png | Bin 0 -> 9491 bytes
doc/1.manual/img/fig-ch2-dsp-on-off.png | Bin 0 -> 11259 bytes
.../img/fig-ch2-duplicate-connections.png | Bin 0 -> 10801 bytes
doc/1.manual/img/fig-ch2-editmode.png | Bin 0 -> 14998 bytes
doc/1.manual/img/fig-ch2-file-menu.png | Bin 0 -> 12694 bytes
...ig-ch2-managing-connections-box-to-box.png | Bin 0 -> 10113 bytes
...-ch2-managing-connections-drag-fan-out.png | Bin 0 -> 9733 bytes
.../fig-ch2-managing-connections-fan-in.png | Bin 0 -> 16071 bytes
.../fig-ch2-managing-connections-fan-out.png | Bin 0 -> 17966 bytes
...g-ch2-managing-connections-many-to-one.png | Bin 0 -> 17391 bytes
...g-ch2-managing-connections-one-to-many.png | Bin 0 -> 12422 bytes
...g-ch2-managing-connections-shift-click.png | Bin 0 -> 13694 bytes
.../img/fig-ch2-paste-replace-boxes.png | Bin 0 -> 20165 bytes
.../img/fig-ch2-paste-replace-menu.png | Bin 0 -> 15066 bytes
.../fig-ch2-paste-replace-similar-type.png | Bin 0 -> 16156 bytes
doc/1.manual/img/fig-ch2-put-menu.png | Bin 0 -> 19401 bytes
...ems-and-moving-them-or-tidying-them-up.png | Bin 0 -> 10554 bytes
.../img/fig-ch2-tab-navigation-boxes.png | Bin 0 -> 6923 bytes
.../img/fig-ch2-tab-navigation-cords.png | Bin 0 -> 7248 bytes
.../fig-ch2-tab-navigation-inlets-outlets.png | Bin 0 -> 5843 bytes
...h2-triggerize-insert-box-to-connection.png | Bin 0 -> 16037 bytes
.../img/fig-ch2-triggerize-object.png | Bin 0 -> 17657 bytes
doc/1.manual/img/fig-ch4-deken-install.png | Bin 0 -> 84760 bytes
doc/1.manual/img/fig1.1.png | Bin 0 -> 40421 bytes
doc/1.manual/img/fig1.2.png | Bin 0 -> 9050 bytes
doc/1.manual/img/fig1.3.png | Bin 0 -> 4737 bytes
doc/1.manual/img/fig1.4.png | Bin 0 -> 12150 bytes
doc/1.manual/img/fig1.5.png | Bin 0 -> 12088 bytes
doc/1.manual/img/fig11.1.png | Bin 0 -> 259715 bytes
doc/1.manual/{ => img}/fig11.2.png | Bin
doc/1.manual/{ => img}/fig11.3.png | Bin
doc/1.manual/{ => img}/fig11.4.png | Bin
doc/1.manual/img/fig3.1.png | Bin 0 -> 5138 bytes
doc/1.manual/img/fig3.10.png | Bin 0 -> 7533 bytes
doc/1.manual/img/fig3.2.png | Bin 0 -> 6664 bytes
doc/1.manual/img/fig3.3.png | Bin 0 -> 6073 bytes
doc/1.manual/img/fig3.4.png | Bin 0 -> 6643 bytes
doc/1.manual/img/fig3.5.png | Bin 0 -> 5666 bytes
doc/1.manual/img/fig3.6.png | Bin 0 -> 6481 bytes
doc/1.manual/img/fig3.7.png | Bin 0 -> 7766 bytes
doc/1.manual/img/fig3.8.png | Bin 0 -> 5200 bytes
doc/1.manual/img/fig3.9.png | Bin 0 -> 10506 bytes
doc/1.manual/img/fig4.1.png | Bin 0 -> 229132 bytes
doc/1.manual/{ => img}/fig4.2.png | Bin
doc/1.manual/img/fig4.3.png | Bin 0 -> 163892 bytes
doc/1.manual/{ => img}/fig4.4.png | Bin
doc/1.manual/img/fig4.5.png | Bin 0 -> 146929 bytes
doc/1.manual/img/fig4.6.png | Bin 0 -> 230443 bytes
doc/1.manual/{ => img}/fig4.7.png | Bin
doc/1.manual/img/fig7.1.png | Bin 0 -> 8418 bytes
doc/1.manual/img/fig7.2.png | Bin 0 -> 42819 bytes
doc/1.manual/img/fig7.3.png | Bin 0 -> 7907 bytes
doc/1.manual/img/fig7.4.png | Bin 0 -> 50531 bytes
doc/1.manual/img/fig7.5.png | Bin 0 -> 8480 bytes
doc/1.manual/img/fig7.6.png | Bin 0 -> 66585 bytes
doc/1.manual/img/fig8.1.png | Bin 0 -> 9617 bytes
doc/1.manual/img/fig8.2.png | Bin 0 -> 8402 bytes
doc/1.manual/img/fig8.3.png | Bin 0 -> 7716 bytes
doc/1.manual/img/fig8.4.png | Bin 0 -> 10959 bytes
doc/1.manual/img/fig8.5.png | Bin 0 -> 83699 bytes
doc/1.manual/img/fig8.6.png | Bin 0 -> 93500 bytes
doc/1.manual/img/fig9.1.png | Bin 0 -> 90701 bytes
doc/1.manual/img/fig9.2.png | Bin 0 -> 21898 bytes
doc/1.manual/img/fig9.3.png | Bin 0 -> 65522 bytes
doc/1.manual/index.htm | 196 +-
doc/1.manual/x1.htm | 55 +-
doc/1.manual/x2.htm | 2172 ++++++++++-------
doc/1.manual/x3.htm | 100 +-
doc/1.manual/x4.htm | 26 +-
doc/1.manual/x5.htm | 135 +-
doc/1.manual/x6-a.htm | 9 +-
doc/1.manual/x6-b.htm | 9 +-
doc/1.manual/x6-c.htm | 8 +-
doc/1.manual/x6.htm | 11 +-
doc/2.control.examples/02.editing.pd | 54 +-
doc/2.control.examples/11.review.pd | 82 +-
doc/2.control.examples/21.markov.chain.pd | 2 +-
doc/Makefile.am | 121 +-
127 files changed, 1733 insertions(+), 1264 deletions(-)
rename doc/1.manual/{ => css}/favicon.ico (100%)
rename doc/1.manual/{ => css}/pdmanual.css (90%)
delete mode 100644 doc/1.manual/deken.gif
delete mode 100644 doc/1.manual/fig1.1.png
delete mode 100644 doc/1.manual/fig1.2.jpg
delete mode 100644 doc/1.manual/fig1.3.jpg
delete mode 100644 doc/1.manual/fig1.4.png
delete mode 100644 doc/1.manual/fig1.5.jpg
delete mode 100644 doc/1.manual/fig11.1.png
delete mode 100644 doc/1.manual/fig3.1.jpg
delete mode 100644 doc/1.manual/fig3.10.jpg
delete mode 100644 doc/1.manual/fig3.2.jpg
delete mode 100644 doc/1.manual/fig3.3.jpg
delete mode 100644 doc/1.manual/fig3.4.jpg
delete mode 100644 doc/1.manual/fig3.5.jpg
delete mode 100644 doc/1.manual/fig3.6.jpg
delete mode 100644 doc/1.manual/fig3.7.jpg
delete mode 100644 doc/1.manual/fig3.8.jpg
delete mode 100644 doc/1.manual/fig3.9.jpg
delete mode 100644 doc/1.manual/fig4.1.png
delete mode 100644 doc/1.manual/fig4.3.png
delete mode 100644 doc/1.manual/fig4.5.png
delete mode 100644 doc/1.manual/fig4.6.png
delete mode 100644 doc/1.manual/fig7.1.jpg
delete mode 100644 doc/1.manual/fig7.2.jpg
delete mode 100644 doc/1.manual/fig7.3.jpg
delete mode 100644 doc/1.manual/fig7.4.jpg
delete mode 100644 doc/1.manual/fig7.5.jpg
delete mode 100644 doc/1.manual/fig7.6.jpg
delete mode 100644 doc/1.manual/fig8.1.jpg
delete mode 100644 doc/1.manual/fig8.2.jpg
delete mode 100644 doc/1.manual/fig8.3.jpg
delete mode 100644 doc/1.manual/fig8.4.jpg
delete mode 100644 doc/1.manual/fig8.5.jpg
delete mode 100644 doc/1.manual/fig8.6.jpg
delete mode 100644 doc/1.manual/fig9.1.jpg
delete mode 100644 doc/1.manual/fig9.2.jpg
delete mode 100644 doc/1.manual/fig9.3.jpg
create mode 100644 doc/1.manual/img/fig-ch2-autopatching-objects.png
create mode 100644 doc/1.manual/img/fig-ch2-autopatching-subpatches.png
create mode 100644 doc/1.manual/img/fig-ch2-changing-text.png
create mode 100644 doc/1.manual/img/fig-ch2-connecting-boxes.png
create mode 100644 doc/1.manual/img/fig-ch2-console-edit-menu.png
create mode 100644 doc/1.manual/img/fig-ch2-console-media-menu.png
create mode 100644 doc/1.manual/img/fig-ch2-dis-connect-exclude-box-from-connection.png
create mode 100644 doc/1.manual/img/fig-ch2-dis-connect-fan-out-audio.png
create mode 100644 doc/1.manual/img/fig-ch2-dis-connect-insert-box-to-connection.png
create mode 100644 doc/1.manual/img/fig-ch2-dis-connect-menu.png
create mode 100644 doc/1.manual/img/fig-ch2-dis-connect-parallel.png
create mode 100644 doc/1.manual/img/fig-ch2-disconnecting-boxes.png
create mode 100644 doc/1.manual/img/fig-ch2-dsp-on-off.png
create mode 100644 doc/1.manual/img/fig-ch2-duplicate-connections.png
create mode 100644 doc/1.manual/img/fig-ch2-editmode.png
create mode 100644 doc/1.manual/img/fig-ch2-file-menu.png
create mode 100644 doc/1.manual/img/fig-ch2-managing-connections-box-to-box.png
create mode 100644 doc/1.manual/img/fig-ch2-managing-connections-drag-fan-out.png
create mode 100644 doc/1.manual/img/fig-ch2-managing-connections-fan-in.png
create mode 100644 doc/1.manual/img/fig-ch2-managing-connections-fan-out.png
create mode 100644 doc/1.manual/img/fig-ch2-managing-connections-many-to-one.png
create mode 100644 doc/1.manual/img/fig-ch2-managing-connections-one-to-many.png
create mode 100644 doc/1.manual/img/fig-ch2-managing-connections-shift-click.png
create mode 100644 doc/1.manual/img/fig-ch2-paste-replace-boxes.png
create mode 100644 doc/1.manual/img/fig-ch2-paste-replace-menu.png
create mode 100644 doc/1.manual/img/fig-ch2-paste-replace-similar-type.png
create mode 100644 doc/1.manual/img/fig-ch2-put-menu.png
create mode 100644 doc/1.manual/img/fig-ch2-selecting-items-and-moving-them-or-tidying-them-up.png
create mode 100644 doc/1.manual/img/fig-ch2-tab-navigation-boxes.png
create mode 100644 doc/1.manual/img/fig-ch2-tab-navigation-cords.png
create mode 100644 doc/1.manual/img/fig-ch2-tab-navigation-inlets-outlets.png
create mode 100644 doc/1.manual/img/fig-ch2-triggerize-insert-box-to-connection.png
create mode 100644 doc/1.manual/img/fig-ch2-triggerize-object.png
create mode 100644 doc/1.manual/img/fig-ch4-deken-install.png
create mode 100644 doc/1.manual/img/fig1.1.png
create mode 100644 doc/1.manual/img/fig1.2.png
create mode 100644 doc/1.manual/img/fig1.3.png
create mode 100644 doc/1.manual/img/fig1.4.png
create mode 100644 doc/1.manual/img/fig1.5.png
create mode 100644 doc/1.manual/img/fig11.1.png
rename doc/1.manual/{ => img}/fig11.2.png (100%)
rename doc/1.manual/{ => img}/fig11.3.png (100%)
rename doc/1.manual/{ => img}/fig11.4.png (100%)
create mode 100644 doc/1.manual/img/fig3.1.png
create mode 100644 doc/1.manual/img/fig3.10.png
create mode 100644 doc/1.manual/img/fig3.2.png
create mode 100644 doc/1.manual/img/fig3.3.png
create mode 100644 doc/1.manual/img/fig3.4.png
create mode 100644 doc/1.manual/img/fig3.5.png
create mode 100644 doc/1.manual/img/fig3.6.png
create mode 100644 doc/1.manual/img/fig3.7.png
create mode 100644 doc/1.manual/img/fig3.8.png
create mode 100644 doc/1.manual/img/fig3.9.png
create mode 100644 doc/1.manual/img/fig4.1.png
rename doc/1.manual/{ => img}/fig4.2.png (100%)
create mode 100644 doc/1.manual/img/fig4.3.png
rename doc/1.manual/{ => img}/fig4.4.png (100%)
create mode 100644 doc/1.manual/img/fig4.5.png
create mode 100644 doc/1.manual/img/fig4.6.png
rename doc/1.manual/{ => img}/fig4.7.png (100%)
create mode 100644 doc/1.manual/img/fig7.1.png
create mode 100644 doc/1.manual/img/fig7.2.png
create mode 100644 doc/1.manual/img/fig7.3.png
create mode 100644 doc/1.manual/img/fig7.4.png
create mode 100644 doc/1.manual/img/fig7.5.png
create mode 100644 doc/1.manual/img/fig7.6.png
create mode 100644 doc/1.manual/img/fig8.1.png
create mode 100644 doc/1.manual/img/fig8.2.png
create mode 100644 doc/1.manual/img/fig8.3.png
create mode 100644 doc/1.manual/img/fig8.4.png
create mode 100644 doc/1.manual/img/fig8.5.png
create mode 100644 doc/1.manual/img/fig8.6.png
create mode 100644 doc/1.manual/img/fig9.1.png
create mode 100644 doc/1.manual/img/fig9.2.png
create mode 100644 doc/1.manual/img/fig9.3.png
diff --git a/doc/1.manual/favicon.ico b/doc/1.manual/css/favicon.ico
similarity index 100%
rename from doc/1.manual/favicon.ico
rename to doc/1.manual/css/favicon.ico
diff --git a/doc/1.manual/pdmanual.css b/doc/1.manual/css/pdmanual.css
similarity index 90%
rename from doc/1.manual/pdmanual.css
rename to doc/1.manual/css/pdmanual.css
index 375964007..82d6ac1a9 100644
--- a/doc/1.manual/pdmanual.css
+++ b/doc/1.manual/css/pdmanual.css
@@ -88,6 +88,18 @@ CODE {
font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
}
+KBD {
+ background-color: #3E4349;
+ border: 1px solid #27292B;
+ color: #ffffff;
+ border-radius: 4px;
+ padding: 2px 4px;
+ margin: 0 2px;
+ white-space: nowrap;
+ font-size: 80%;
+ font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+}
+
ol {
font-size: 14.5pt;
text-align: left;
@@ -206,6 +218,11 @@ blockquote p {
text-align: right;
}
+.center {
+ margin-left: auto;
+ margin-right: auto;
+}
+
/* responsive css for small "devices" */
diff --git a/doc/1.manual/deken.gif b/doc/1.manual/deken.gif
deleted file mode 100644
index 9167dc6441f777c6ea415972e386a90a0372c68d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 158852
zcmeF&S5y;k9H{FdbVvds(v_e{M-i1O5b0f{3xY_OZb3jGhTe-Hy@lQ((mSCey>}wL
z_ujMl@3YrB`>b^t7z~C&p?B`wp{Az3_wYH*6Gd8DS~@y9dU_l^0|OHi)BO)m
z?|bsy_vd3~W@cq&WfM{7xFu=KsrZ%4T8EpPn@3!g_dmENhOtk-_we2F)Z*vofBrG<
z`KR2Mx6D(8Zuu+;3*$u06Gc9kii(Q9@}7F-za;jfMa*Yf{FZ&5xc8K}FIK|kpM=k}
zM8G0EaQU_8faI;f1t}?ie|`=mKILyTZEQdo|fOd
zc2JLwj*f2J>ihTa4Lu7DfAtwAtsC8nnKm{tF^(EC32iYo#hIF!nWEOr{7cLdXU)yc
zKLwRp-SSGX%Gk6`U$QH{vA>mn{5hfb>({T}N^Tr)Mb$Xwt~usyIp%MD|NhZ*6UDYs0m-w|8`ObPg|c-5Oi!?#A`>
z;Cd#OdvDF1_4oG=4h{~DTn-Npk6_nFM@PrU$0u(s+)PbPP2XDFoVm4mGdnwr#r~UH
z-CbB%SX{&{FE6jIuC8qztnXZGY;0_8ZSCyr>>Zx%@9!VpIzB%>K0Y}D@m!cXtvh*aAUT+viM&k5}*8maus^M
z#s4n1VNcbc#g6btO3BLACClBhkdN)upTbD5;T6GT=URer
z%x@a%&JWjy^FQ=A)L)+NEq158X>7Q@JUiU{*WcKP!vRDbb4UUj%Q+7cwwyUnu)x}!
z7o{x6yf?MB<-8A_dCt5q)AzM`KbSAaf$^z?4k!rG>%fB_XKP^Y;n&&P@zyH3z9Ao6m
zxe{v{Eu2McnU%W|Z&R_plHkzJxteInMcQO{e=iLp;&!sWnt~+aT0?o$Sgob{v*oR&
z1q*DfrH9LMt!Mn!w&E1ow@hEpO8mZ&D-eg^%F9j-wc^UjPG+DGS+qPNgh!N|!@XPG(PO<^f3}jp+i-QVx!VX3^Xy>=Xl?eI
zNZ1P;FzZw^dl(9Grq7t;WY?goiq~pNY)lqklsn=QVHg0PY0sY>mff@8!Bx3+(9PGu
zbJ+7@+~%-XXmy64(Wb14h&e1L(dUi_s^D-?p1tsBNO`lTWLRDzsdR)%0#r5_r+fcf
zm-@KpXIqBn4+S1|1oz65uu>QS%z?4n6%&|h{mhpA}`&ux8F%hTv
z9*Y2Te!?C31(Oc3it(z~=q^|t`4{rtx*+8eyf1+L)qXKk@zp_(;O^DofZWsTqY)kZ
z>*Km?WWU4=P9u!|3qi9losj0?8zvj0;+u=D%H5mGiOarMjOJ&DVf5?VPk&xDGWYvj
z&u%`TCHPo(jTZ*V*y|A4Bd&Ek^P;vP@!pRhuG4Z05umJUy)WSGr{k~(W#_}-$@=?I
z#D{z33Z;_ibT-q}?D_Bor-CiyTNtL)e5Nkt9%AOeKi%+&g-}wgIDexCp~QJ#dF3>!
zn9f$Vhl5`1ukh){n(7^q^ZxAK3y|{8*AD?c;eThFzTzkPzS`kC8uJ()0e9w@&XCUnG8B5YxPqz5!UtB-p;(6SZ4I8u}6@Dqa
z=Qjhk6uB3#{H_@l2UW2YtfeH>EP6y{u$CnmB3z`T_L>}KMj-$C2Zu=79rcv|6o_x(=0!5|s97-4!zrxcxPEr0W
zJx;1t5pD0@zez0AMFa|jdxrmV@MC%8frigXi|fHCs4+3Feti5)!OF{A`sZD`eI?PA
zJ
zG=GZU)~W=4O_!H!^C$bdS>_2Ls+XvP-#%O34_5mq?v7EjaSYb_IbptPI44jY))#u4TOx|~4Oe7*Y6>62aafoPfC3=aA#jAf?bb!Qvh28FpWwwNWWl&39d9jDVm)r|T
zzPwtMUVGh}jXX?ayk3)kQ!^CPca$Z1y{;BkGm@=(oTq=iq1#_GR+)U1pfkIvNqjld
z_QWx5{MCw4w-@=?4u}
z9HYbPw=CXVPEFsOq!qjE9H7Fmj2A(^(1ty~H&+XcxU%-2*
zo6~;W%_R(N146z4GtS48MC(nfEa)$>Wo!9*}&lkF0Ttc3+7A|NH7j{c8@iQ+t
zo%brcmvpR$q_elY{7)fWPr4-}N36FRosYUMQbyP3TF^(=-$yCOtGLN)KE}t0&evET
zp{?tCF6e8y=A~cdDi-T&cjgPX^fe>#`$p$!edcbf>-VF|kCwwvyVDOz=ixMgbeTYK
z!$}sL{Av7w3K%pH$Kew;fe2pnh@=a+YZ