From a5f9c89d9f0810c95ec906bfe5056deccd48087a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Tue, 11 Jun 2024 09:15:07 +0200 Subject: [PATCH 01/89] properly export pd_compatibilitylevel with EXTERN (again) Closes: https://github.com/pure-data/pure-data/issues/2122 --- src/m_pd.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/m_pd.h b/src/m_pd.h index 55581ba1..409bfcb9 100644 --- a/src/m_pd.h +++ b/src/m_pd.h @@ -22,8 +22,6 @@ extern "C" { (((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 "nmakefiles" for externs, which will define NT and not MSW */ #if defined(NT) && !defined(MSW) @@ -157,6 +155,8 @@ typedef unsigned __int64 uint64_t; # error invalid FLOATSIZE: must be 32 or 64 #endif +EXTERN int pd_compatibilitylevel; /* e.g., 43 for pd 0.43 compatibility */ + typedef PD_LONGINTTYPE t_int; /* pointer-size integer */ typedef PD_FLOATTYPE t_float; /* a float type at most the same size */ typedef PD_FLOATTYPE t_floatarg; /* float type for function calls */ From 8fc1bc9bac4a204ad5a9256f67000df0b3d131f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Tue, 11 Jun 2024 09:21:04 +0200 Subject: [PATCH 02/89] move pd_compatibilitylevel within the header so it's not inbetween all the type definitions --- src/m_pd.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/m_pd.h b/src/m_pd.h index 409bfcb9..55586f27 100644 --- a/src/m_pd.h +++ b/src/m_pd.h @@ -126,6 +126,8 @@ typedef unsigned __int64 uint64_t; /* for FILE, needed by sys_fopen() and sys_fclose() only */ #include +EXTERN int pd_compatibilitylevel; /* e.g., 43 for pd 0.43 compatibility */ + #define MAXPDSTRING 1000 /* use this for anything you want */ #define MAXPDARG 5 /* max number of args we can typecheck today */ @@ -155,8 +157,6 @@ typedef unsigned __int64 uint64_t; # error invalid FLOATSIZE: must be 32 or 64 #endif -EXTERN int pd_compatibilitylevel; /* e.g., 43 for pd 0.43 compatibility */ - typedef PD_LONGINTTYPE t_int; /* pointer-size integer */ typedef PD_FLOATTYPE t_float; /* a float type at most the same size */ typedef PD_FLOATTYPE t_floatarg; /* float type for function calls */ From ef2f7949efea0c06bc6388d46299390c80467d19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Tue, 11 Jun 2024 09:26:42 +0200 Subject: [PATCH 03/89] improved metainfo to meet flathub's guidelines - https://docs.flathub.org/docs/for-app-authors/metainfo-guidelines/quality-guidelines#not-too-long-1 - https://docs.flathub.org/docs/for-app-authors/metainfo-guidelines/#screenshots --- linux/org.puredata.pd-gui.metainfo.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/linux/org.puredata.pd-gui.metainfo.xml b/linux/org.puredata.pd-gui.metainfo.xml index e16a3596..b1b5d1b5 100644 --- a/linux/org.puredata.pd-gui.metainfo.xml +++ b/linux/org.puredata.pd-gui.metainfo.xml @@ -4,7 +4,7 @@ Pure Data (Pd) Miller S. Puckette et al. - A real-time graphical programming environment for live interactive computer music + realtime computer music system FSFAP BSD-3-Clause @@ -32,6 +32,7 @@ https://screenshots.debian.net/shrine/screenshot/12081/simage/large-f07fad807ae33903b32a38d2c7cedd66.png + Pure Data with many patches open (netpd project) From 48cad5fb333a169bbb766717970808077e8f1620 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Tue, 11 Jun 2024 13:19:24 +0200 Subject: [PATCH 04/89] sys_exit(): use the first received exit-code Closes: https://github.com/pure-data/pure-data/issues/2339 --- src/m_sched.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/m_sched.c b/src/m_sched.c index 67d8b164..e2638c85 100644 --- a/src/m_sched.c +++ b/src/m_sched.c @@ -241,7 +241,11 @@ void dsp_tick(void); void sys_exit(int status) { pthread_mutex_lock(&sched_mutex); - sys_exitcode = status; + if (SYS_QUIT_QUIT != sys_quit) { + sys_exitcode = status; + } else { + pd_error(0, "quit already called with exit code %d", sys_exitcode); + } sys_quit = SYS_QUIT_QUIT; pthread_cond_signal(&sched_cond); pthread_mutex_unlock(&sched_mutex); From a3f229a05a883d57c68235e19df6447baefdbc1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Tue, 11 Jun 2024 14:15:33 +0200 Subject: [PATCH 05/89] do not install "d_osc.h" it's an implementation detail --- src/Makefile.am | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 841b24a5..a60663f2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -201,13 +201,13 @@ libpdbindir = $(pkglibdir)/bin # these install to ${includedir}/pd pkginclude_HEADERS = m_pd.h m_imp.h g_canvas.h g_undo.h g_all_guis.h s_stuff.h \ - s_net.h x_vexp.h d_osc.h + s_net.h x_vexp.h # compatibility: m_pd.h also goes into ${includedir}/ 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_dispatch.h +noinst_HEADERS += m_dispatch.h d_osc.h if LIBPD libpdinclude_HEADERS += m_pd.h z_libpd.h From 35c83d2be9e4c766f4341d7eefe5324816d40926 Mon Sep 17 00:00:00 2001 From: Timothy Schoen <44585538+timothyschoen@users.noreply.github.com> Date: Wed, 12 Jun 2024 19:50:56 +0200 Subject: [PATCH 06/89] Fix read at index -1 in [sigmund~] If bestbin comes back at index 0, it will try to read the adjacent bin at index bestbin-1, which is out of bounds. Instead, if bestbin is 0, we can just sample bin 0 twice. This solves the memory error, and should lead to well defined behaviour if bestbin equals 0. --- extra/sigmund~/sigmund~.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extra/sigmund~/sigmund~.c b/extra/sigmund~/sigmund~.c index e8e7b826..8c51d57e 100644 --- a/extra/sigmund~/sigmund~.c +++ b/extra/sigmund~/sigmund~.c @@ -488,9 +488,9 @@ static void sigmund_getpitch(int npeak, t_peak *peakv, t_float *freqp, /* first guess by parabolic peak fitting */ fbestbin = bestbin + (ppt[bestbin+1].p_weight - - ppt[bestbin-1].p_weight) / + - ppt[bestbin == 0 ? 0 : bestbin-1].p_weight) / (ppt[bestbin+1].p_weight + ppt[bestbin].p_weight + - ppt[bestbin-1].p_weight); + ppt[bestbin == 0 ? 0 : bestbin-1].p_weight); freq = 2*fperbin * exp((LOG2/STEPSPEROCTAVE)*fbestbin); for (sumamp = sumweight = sumfreq = 0, i = 0; i < nsalient; i++) From 7dfc24a9472b57495e080a8bc654b4e5123e1e47 Mon Sep 17 00:00:00 2001 From: Christof Ressi Date: Thu, 13 Jun 2024 17:07:50 +0200 Subject: [PATCH 07/89] restore old behavior of "quit" message and add new "exit" message "quit" exits forcefully, like it did before Pd 0.55 "exit" exits gracefully, but only after the current clock tick + don't export glob_quit() --- src/g_editor.c | 2 +- src/m_glob.c | 4 +++- src/m_imp.h | 1 - src/s_inter.c | 11 +++++++---- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/g_editor.c b/src/g_editor.c index 17f13fa2..b0aa6516 100644 --- a/src/g_editor.c +++ b/src/g_editor.c @@ -3321,7 +3321,7 @@ void glob_verifyquit(void *dummy, t_floatarg f) ".pdwindow", 1, &msg, "pd quit", "yes"); - else glob_quit(0); + else glob_exit(0, 0); } /* close a window (or possibly quit Pd), checking for dirty flags. diff --git a/src/m_glob.c b/src/m_glob.c index 5c9a2b7c..310098df 100644 --- a/src/m_glob.c +++ b/src/m_glob.c @@ -15,6 +15,7 @@ int pd_compatibilitylevel = 100000; /* e.g., 43 for pd 0.43 compatibility */ over. Some others are prototyped in m_imp.h as well. */ void glob_menunew(void *dummy, t_symbol *name, t_symbol *dir); +void glob_quit(void *dummy, t_floatarg status); void glob_verifyquit(void *dummy, t_floatarg f); void glob_dsp(void *dummy, t_symbol *s, int argc, t_atom *argv); void glob_key(void *dummy, t_symbol *s, int ac, t_atom *av); @@ -131,7 +132,8 @@ void glob_init(void) A_SYMBOL, A_SYMBOL, 0); class_addmethod(glob_pdobject, (t_method)glob_open, gensym("open"), A_SYMBOL, A_SYMBOL, A_DEFFLOAT, 0); - class_addmethod(glob_pdobject, (t_method)glob_exit, gensym("quit"), A_DEFFLOAT, 0); + class_addmethod(glob_pdobject, (t_method)glob_quit, gensym("quit"), A_DEFFLOAT, 0); + class_addmethod(glob_pdobject, (t_method)glob_exit, gensym("exit"), A_DEFFLOAT, 0); class_addmethod(glob_pdobject, (t_method)glob_verifyquit, gensym("verifyquit"), A_DEFFLOAT, 0); class_addmethod(glob_pdobject, (t_method)glob_foo, gensym("foo"), A_GIMME, 0); diff --git a/src/m_imp.h b/src/m_imp.h index 04d2d980..aad67a5e 100644 --- a/src/m_imp.h +++ b/src/m_imp.h @@ -107,7 +107,6 @@ void pd_globalunlock(void); 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); diff --git a/src/s_inter.c b/src/s_inter.c index 9194e08f..65419833 100644 --- a/src/s_inter.c +++ b/src/s_inter.c @@ -1758,7 +1758,7 @@ void sys_setrealtime(const char *libdir) void sys_do_close_audio(void); /* This is called when something bad has happened, like a segfault. -Call glob_quit() below to exit cleanly. +Call glob_exit() below to exit cleanly. LATER try to save dirty documents even in the bad case. */ void sys_bail(int n) { @@ -1782,13 +1782,16 @@ void sys_bail(int n) void sys_exit(int status); -void glob_exit(void *dummy, t_float status) + /* exit scheduler and shut down gracefully */ +void glob_exit(void *dummy, t_floatarg status) { sys_exit(status); } -void glob_quit(void *dummy) + + /* force-quit */ +void glob_quit(void *dummy, t_floatarg status) { - glob_exit(dummy, 0); + exit(status); } /* recursively descend to all canvases and send them "vis" messages From 6746a7dee919d05c3d0370e25b6705e4fd51e7d7 Mon Sep 17 00:00:00 2001 From: Christof Ressi Date: Fri, 14 Jun 2024 23:55:26 +0200 Subject: [PATCH 08/89] m_private_utils: add macros for cross-platform atomic integer operations try to use C11 atomics if available; otherwise emulate with Win32 resp. GCC/Clang intrinsics --- src/m_private_utils.h | 57 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/src/m_private_utils.h b/src/m_private_utils.h index 589791f6..16aa887a 100644 --- a/src/m_private_utils.h +++ b/src/m_private_utils.h @@ -18,6 +18,63 @@ # include "config.h" #endif +/* ------------------------------ atomics ----------------------------------- */ + +#ifdef _MSC_VER +/* NB: Visual Studio only added C11 atomics support in version 17.5 */ +#if _MSC_VER >= 1935 +#define HAVE_C11_ATOMICS +#endif +#elif __STDC_VERSION__ >= 201112L +#define HAVE_C11_ATOMICS +#endif + +#ifdef HAVE_C11_ATOMICS +/* use C11 stdatomic if available. */ +#include +#define atomic_int _Atomic int +#define atomic_int_load atomic_load +#define atomic_int_store atomic_store +#define atomic_int_fetch_add atomic_fetch_add +#define atomic_int_fetch_sub atomic_fetch_sub +#define atomic_int_exchange atomic_exchange +#define atomic_int_compare_exchange atomic_compare_exchange_strong +#else +/* emulate C11 atomics with platform specific intrinsics */ +#ifdef _MSC_VER +/* Win32 instrinsics */ +#include +#define atomic_int volatile int +#define atomic_int_load(ptr) _InterlockedOr((volatile long *)(ptr), 0) +#define atomic_int_store(ptr, value) _InterlockedExchange((volatile long *)(ptr), value) +#define atomic_int_fetch_add(ptr, value) _InterlockedExchangeAdd((volatile long *)(ptr), value) +#define atomic_int_fetch_sub(ptr, value) _InterlockedExchangeAdd((volatile long *)(ptr), -(value)) +#define atomic_int_exchange(ptr, value) _InterlockedExchange((volatile long *)(ptr), value) +static int atomic_int_compare_exchange(volatile int *ptr, int *expected, int desired) +{ + long old = _InterlockedCompareExchange((volatile long *)ptr, *expected, desired); + if (old == *expected) + return 1; + else + { + *expected = old; + return 0; + } +} +#elif __GNUC__ +/* GCC/Clang atomics */ +#define atomic_int volatile int +#define atomic_int_load(ptr) __atomic_load_4(ptr, __ATOMIC_SEQ_CST) +#define atomic_int_store(ptr, value) __atomic_store_4(ptr, value, __ATOMIC_SEQ_CST) +#define atomic_int_fetch_add(ptr, value) __atomic_fetch_add(ptr, value, __ATOMIC_SEQ_CST) +#define atomic_int_fetch_sub(ptr, value) __atomic_fetch_sub(ptr, value, __ATOMIC_SEQ_CST) +#define atomic_int_exchange(ptr, value) __atomic_exchange_4(ptr, value, __ATOMIC_SEQ_CST) +#define atomic_int_compare_exchange(ptr, expected, desired) \ + __atomic_compare_exchange_4(ptr, expected, desired, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST) +#else +#error "compiler not supported" +#endif +#endif /* --------------------------- stack allocation helpers --------------------- */ /* alloca helpers From e72039c58467c6fc0610e13c500fc8eb58030d7d Mon Sep 17 00:00:00 2001 From: Christof Ressi Date: Fri, 14 Jun 2024 23:58:11 +0200 Subject: [PATCH 09/89] z_ringbuffer: use new atomic_int_* macros --- src/z_ringbuffer.c | 44 +++++++++----------------------------------- src/z_ringbuffer.h | 6 ++++-- 2 files changed, 13 insertions(+), 37 deletions(-) diff --git a/src/z_ringbuffer.c b/src/z_ringbuffer.c index 0ca29af0..2bf78820 100644 --- a/src/z_ringbuffer.c +++ b/src/z_ringbuffer.c @@ -14,29 +14,6 @@ #include #include -#if __STDC_VERSION__ >= 201112L // use stdatomic if C11 is available - #include - #define SYNC_FETCH(ptr) atomic_fetch_or((_Atomic int *)ptr, 0) - #define SYNC_COMPARE_AND_SWAP(ptr, oldval, newval) \ - atomic_compare_exchange_strong((_Atomic int *)ptr, &oldval, newval) -#else // use platform specfics - #ifdef __APPLE__ // apple atomics - #include - #define SYNC_FETCH(ptr) OSAtomicOr32Barrier(0, (volatile uint32_t *)ptr) - #define SYNC_COMPARE_AND_SWAP(ptr, oldval, newval) \ - OSAtomicCompareAndSwap32Barrier(oldval, newval, ptr) - #elif defined(_WIN32) || defined(_WIN64) // win api atomics - #include - #define SYNC_FETCH(ptr) InterlockedOr(ptr, 0) - #define SYNC_COMPARE_AND_SWAP(ptr, oldval, newval) \ - InterlockedCompareExchange(ptr, newval, oldval) - #else // gcc atomics - #define SYNC_FETCH(ptr) __sync_fetch_and_or(ptr, 0) - #define SYNC_COMPARE_AND_SWAP(ptr, oldval, newval) \ - __sync_val_compare_and_swap(ptr, oldval, newval) - #endif -#endif - ring_buffer *rb_create(int size) { if (size & 0xff) return NULL; // size must be a multiple of 256 ring_buffer *buffer = malloc(sizeof(ring_buffer)); @@ -62,8 +39,8 @@ int rb_available_to_write(ring_buffer *buffer) { // note: the largest possible result is buffer->size - 1 because // we adopt the convention that read_idx == write_idx means that the // buffer is empty - int read_idx = SYNC_FETCH(&(buffer->read_idx)); - int write_idx = SYNC_FETCH(&(buffer->write_idx)); + int read_idx = atomic_int_load(&buffer->read_idx); + int write_idx = atomic_int_load(&buffer->write_idx); return (buffer->size + read_idx - write_idx - 1) % buffer->size; } else { return 0; @@ -72,8 +49,8 @@ int rb_available_to_write(ring_buffer *buffer) { int rb_available_to_read(ring_buffer *buffer) { if (buffer) { - int read_idx = SYNC_FETCH(&(buffer->read_idx)); - int write_idx = SYNC_FETCH(&(buffer->write_idx)); + int read_idx = atomic_int_load(&buffer->read_idx); + int write_idx = atomic_int_load(&buffer->write_idx); return (buffer->size + write_idx - read_idx) % buffer->size; } else { return 0; @@ -102,8 +79,7 @@ int rb_write_to_buffer(ring_buffer *buffer, int n, ...) { write_idx = (write_idx + len) % buffer->size; } va_end(args); - SYNC_COMPARE_AND_SWAP(&(buffer->write_idx), buffer->write_idx, - write_idx); // includes memory barrier + atomic_int_store(&buffer->write_idx, write_idx); // includes memory barrier return 0; } @@ -121,8 +97,7 @@ int rb_write_value_to_buffer(ring_buffer *buffer, int value, int n) { memset(buffer->buf_ptr, value, n - d); } write_idx = (write_idx + n) % buffer->size; - SYNC_COMPARE_AND_SWAP(&(buffer->write_idx), buffer->write_idx, - write_idx); // includes memory barrier + atomic_int_store(&buffer->write_idx, write_idx); // includes memory barrier return 0; } @@ -140,15 +115,14 @@ int rb_read_from_buffer(ring_buffer *buffer, char *dest, int len) { memcpy(dest, buffer->buf_ptr + read_idx, d); memcpy(dest + d, buffer->buf_ptr, len - d); } - SYNC_COMPARE_AND_SWAP(&(buffer->read_idx), buffer->read_idx, - (read_idx + len) % buffer->size); // includes memory barrier + atomic_int_store(&buffer->read_idx, read_idx); // includes memory barrier return 0; } // simply reset the indices void rb_clear_buffer(ring_buffer *buffer) { if (buffer) { - SYNC_COMPARE_AND_SWAP(&(buffer->read_idx), buffer->read_idx, 0); - SYNC_COMPARE_AND_SWAP(&(buffer->write_idx), buffer->write_idx, 0); + atomic_int_store(&buffer->read_idx, 0); + atomic_int_store(&buffer->write_idx, 0); } } diff --git a/src/z_ringbuffer.h b/src/z_ringbuffer.h index 21e4b904..259e8729 100644 --- a/src/z_ringbuffer.h +++ b/src/z_ringbuffer.h @@ -11,13 +11,15 @@ #ifndef __Z_RING_BUFFER_H__ #define __Z_RING_BUFFER_H__ +#include "m_private_utils.h" + /// simple lock-free ring buffer implementation for one writer thread /// and one consumer thread typedef struct ring_buffer { int size; char *buf_ptr; - int write_idx; - int read_idx; + atomic_int write_idx; + atomic_int read_idx; } ring_buffer; /// create a ring buffer, size must be a multiple of 256 From 580c95261e014e8ac40b5ce2bd43f49aaa6cef99 Mon Sep 17 00:00:00 2001 From: Christof Ressi Date: Sat, 15 Jun 2024 10:40:22 +0200 Subject: [PATCH 10/89] s_audio_paring: use new atomic macros the current code does not contain any memory barriers and is not guaranteed to work on non-x86 platforms. + get rid of unnecessary PA_VOLATILE + some reformating --- src/s_audio_jack.c | 8 +-- src/s_audio_pa.c | 8 +-- src/s_audio_paring.c | 127 ++++++++++++++++++++++--------------------- src/s_audio_paring.h | 32 +++++------ 4 files changed, 88 insertions(+), 87 deletions(-) diff --git a/src/s_audio_jack.c b/src/s_audio_jack.c index e91616a9..25cf9b00 100644 --- a/src/s_audio_jack.c +++ b/src/s_audio_jack.c @@ -92,10 +92,10 @@ static int jack_blocksize = 0; /* should this be PERTHREAD? */ #ifdef THREADSIGNAL t_semaphore *jack_sem; #endif -static PA_VOLATILE char *jack_outbuf; -static PA_VOLATILE sys_ringbuf jack_outring; -static PA_VOLATILE char *jack_inbuf; -static PA_VOLATILE sys_ringbuf jack_inring; +static char *jack_outbuf; +static sys_ringbuf jack_outring; +static char *jack_inbuf; +static sys_ringbuf jack_inring; /* callback routine for non-callback client... throw samples into and read them out of a FIFO. Since we don't know at compile time diff --git a/src/s_audio_pa.c b/src/s_audio_pa.c index 00062d27..3e132cde 100644 --- a/src/s_audio_pa.c +++ b/src/s_audio_pa.c @@ -53,10 +53,10 @@ static t_audiocallback pa_callback; static int pa_started; static volatile int pa_dio_error; -static PA_VOLATILE char *pa_outbuf; -static PA_VOLATILE sys_ringbuf pa_outring; -static PA_VOLATILE char *pa_inbuf; -static PA_VOLATILE sys_ringbuf pa_inring; +static char *pa_outbuf; +static sys_ringbuf pa_outring; +static char *pa_inbuf; +static sys_ringbuf pa_inring; #ifdef THREADSIGNAL t_semaphore *pa_sem; #endif diff --git a/src/s_audio_paring.c b/src/s_audio_paring.c index 3c2ac65b..13eb98ef 100644 --- a/src/s_audio_paring.c +++ b/src/s_audio_paring.c @@ -68,67 +68,67 @@ #endif /* _WIN32 */ /* Clear buffer. Should only be called when buffer is NOT being read. */ -static void sys_ringbuf_Flush(PA_VOLATILE sys_ringbuf *rbuf, - PA_VOLATILE void *dataPtr, long nfill); +static void sys_ringbuf_Flush(sys_ringbuf *rbuf, + void *dataPtr, long nfill); /* Get address of region(s) to which we can write data. ** If the region is contiguous, size2 will be zero. ** If non-contiguous, size2 will be the size of second region. ** Returns room available to be written or numBytes, whichever is smaller. */ -static long sys_ringbuf_GetWriteRegions(PA_VOLATILE sys_ringbuf *rbuf, - long numBytes, PA_VOLATILE void **dataPtr1, long *sizePtr1, - PA_VOLATILE void **dataPtr2, long *sizePtr2, PA_VOLATILE char *buffer); -static long sys_ringbuf_AdvanceWriteIndex(PA_VOLATILE sys_ringbuf *rbuf, - long numBytes); +static long sys_ringbuf_GetWriteRegions(sys_ringbuf *rbuf, + long numBytes, void **dataPtr1, long *sizePtr1, + void **dataPtr2, long *sizePtr2, char *buffer); + +static long sys_ringbuf_AdvanceWriteIndex(sys_ringbuf *rbuf, long numBytes); /* Get address of region(s) from which we can read data. ** If the region is contiguous, size2 will be zero. ** If non-contiguous, size2 will be the size of second region. ** Returns room available to be read or numBytes, whichever is smaller. */ -static long sys_ringbuf_GetReadRegions(PA_VOLATILE sys_ringbuf *rbuf, - long numBytes, PA_VOLATILE void **dataPtr1, long *sizePtr1, - PA_VOLATILE void **dataPtr2, long *sizePtr2, PA_VOLATILE char *buffer); +static long sys_ringbuf_GetReadRegions(sys_ringbuf *rbuf, + long numBytes, void **dataPtr1, long *sizePtr1, + void **dataPtr2, long *sizePtr2, char *buffer); -static long sys_ringbuf_AdvanceReadIndex(PA_VOLATILE sys_ringbuf *rbuf, - long numBytes ); +static long sys_ringbuf_AdvanceReadIndex(sys_ringbuf *rbuf, long numBytes); /*************************************************************************** * Initialize FIFO. */ -long sys_ringbuf_init(PA_VOLATILE sys_ringbuf *rbuf, long numBytes, - PA_VOLATILE char *dataPtr, long nfill) +long sys_ringbuf_init(sys_ringbuf *rbuf, long numBytes, + char *dataPtr, long nfill) { rbuf->bufferSize = numBytes; - sys_ringbuf_Flush(rbuf, dataPtr, nfill); + sys_ringbuf_Flush(rbuf, dataPtr, nfill); return 0; } /*************************************************************************** ** Return number of bytes available for reading. */ -long sys_ringbuf_getreadavailable(PA_VOLATILE sys_ringbuf *rbuf) +long sys_ringbuf_getreadavailable(sys_ringbuf *rbuf) { - long ret = rbuf->writeIndex - rbuf->readIndex; + long ret = atomic_int_load(&rbuf->writeIndex) + - atomic_int_load(&rbuf->readIndex); if (ret < 0) ret += 2 * rbuf->bufferSize; if (ret < 0 || ret > rbuf->bufferSize) fprintf(stderr, "consistency check failed: sys_ringbuf_getreadavailable\n"); - return ( ret ); + return (ret); } /*************************************************************************** ** Return number of bytes available for writing. */ -long sys_ringbuf_getwriteavailable(PA_VOLATILE sys_ringbuf *rbuf) +long sys_ringbuf_getwriteavailable(sys_ringbuf *rbuf) { - return ( rbuf->bufferSize - sys_ringbuf_getreadavailable(rbuf)); + return (rbuf->bufferSize - sys_ringbuf_getreadavailable(rbuf)); } /*************************************************************************** ** Clear buffer. Should only be called when buffer is NOT being read. */ -static void sys_ringbuf_Flush(PA_VOLATILE sys_ringbuf *rbuf, - PA_VOLATILE void *dataPtr, long nfill) +static void sys_ringbuf_Flush(sys_ringbuf *rbuf, + void *dataPtr, long nfill) { - PA_VOLATILE char *s; + char *s; long n; rbuf->readIndex = 0; rbuf->writeIndex = nfill; @@ -142,21 +142,22 @@ static void sys_ringbuf_Flush(PA_VOLATILE sys_ringbuf *rbuf, ** If non-contiguous, size2 will be the size of second region. ** Returns room available to be written or numBytes, whichever is smaller. */ -static long sys_ringbuf_GetWriteRegions(PA_VOLATILE sys_ringbuf *rbuf, - long numBytes, PA_VOLATILE void **dataPtr1, long *sizePtr1, - PA_VOLATILE void **dataPtr2, long *sizePtr2, PA_VOLATILE char *buffer) +static long sys_ringbuf_GetWriteRegions(sys_ringbuf *rbuf, + long numBytes, void **dataPtr1, long *sizePtr1, + void **dataPtr2, long *sizePtr2, char *buffer) { - long index; - long available = sys_ringbuf_getwriteavailable( rbuf ); - if( numBytes > available ) numBytes = available; - /* Check to see if write is not contiguous. */ + long index; + long available = sys_ringbuf_getwriteavailable(rbuf); + if (numBytes > available) numBytes = available; + /* Check to see if write is not contiguous. NB: this is always called + by the writer, so we don't need an atomic load */ index = rbuf->writeIndex; while (index >= rbuf->bufferSize) index -= rbuf->bufferSize; if( (index + numBytes) > rbuf->bufferSize ) { /* Write data in two blocks that wrap the buffer. */ - long firstHalf = rbuf->bufferSize - index; + long firstHalf = rbuf->bufferSize - index; *dataPtr1 = &buffer[index]; *sizePtr1 = firstHalf; *dataPtr2 = &buffer[0]; @@ -175,13 +176,13 @@ static long sys_ringbuf_GetWriteRegions(PA_VOLATILE sys_ringbuf *rbuf, /*************************************************************************** */ -static long sys_ringbuf_AdvanceWriteIndex(PA_VOLATILE sys_ringbuf *rbuf, - long numBytes) +static long sys_ringbuf_AdvanceWriteIndex(sys_ringbuf *rbuf, long numBytes) { long ret = (rbuf->writeIndex + numBytes); - if ( ret >= 2 * rbuf->bufferSize) + if (ret >= 2 * rbuf->bufferSize) ret -= 2 * rbuf->bufferSize; /* check for end of buffer */ - return rbuf->writeIndex = ret; + atomic_int_store(&rbuf->writeIndex, ret); + return ret; } /*************************************************************************** @@ -190,19 +191,20 @@ static long sys_ringbuf_AdvanceWriteIndex(PA_VOLATILE sys_ringbuf *rbuf, ** If non-contiguous, size2 will be the size of second region. ** Returns room available to be written or numBytes, whichever is smaller. */ -static long sys_ringbuf_GetReadRegions(PA_VOLATILE sys_ringbuf *rbuf, - long numBytes, PA_VOLATILE void **dataPtr1, long *sizePtr1, - PA_VOLATILE void **dataPtr2, long *sizePtr2, PA_VOLATILE char *buffer) +static long sys_ringbuf_GetReadRegions(sys_ringbuf *rbuf, + long numBytes, void **dataPtr1, long *sizePtr1, + void **dataPtr2, long *sizePtr2, char *buffer) { - long index; - long available = sys_ringbuf_getreadavailable( rbuf ); + long index; + long available = sys_ringbuf_getreadavailable(rbuf); if( numBytes > available ) numBytes = available; - /* Check to see if read is not contiguous. */ + /* Check to see if read is not contiguous. NB: this is always called + by the reader, so we don't need an atomic load */ index = rbuf->readIndex; while (index >= rbuf->bufferSize) index -= rbuf->bufferSize; - if( (index + numBytes) > rbuf->bufferSize ) + if((index + numBytes) > rbuf->bufferSize) { /* Write data in two blocks that wrap the buffer. */ long firstHalf = rbuf->bufferSize - index; @@ -222,59 +224,60 @@ static long sys_ringbuf_GetReadRegions(PA_VOLATILE sys_ringbuf *rbuf, } /*************************************************************************** */ -static long sys_ringbuf_AdvanceReadIndex(PA_VOLATILE sys_ringbuf *rbuf, +static long sys_ringbuf_AdvanceReadIndex(sys_ringbuf *rbuf, long numBytes) { long ret = (rbuf->readIndex + numBytes); if( ret >= 2 * rbuf->bufferSize) ret -= 2 * rbuf->bufferSize; - return rbuf->readIndex = ret; + atomic_int_store(&rbuf->readIndex, ret); + return ret; } /*************************************************************************** ** Return bytes written. */ -long sys_ringbuf_write(PA_VOLATILE sys_ringbuf *rbuf, const void *data, - long numBytes, PA_VOLATILE char *buffer) +long sys_ringbuf_write(sys_ringbuf *rbuf, const void *data, + long numBytes, char *buffer) { long size1, size2, numWritten; - PA_VOLATILE void *data1, *data2; - numWritten = sys_ringbuf_GetWriteRegions( rbuf, numBytes, &data1, &size1, + void *data1, *data2; + numWritten = sys_ringbuf_GetWriteRegions(rbuf, numBytes, &data1, &size1, &data2, &size2, buffer); - if( size2 > 0 ) + if (size2 > 0) { - memcpy((void *)data1, data, size1 ); + memcpy((void *)data1, data, size1); data = ((char *)data) + size1; - memcpy((void *)data2, data, size2 ); + memcpy((void *)data2, data, size2); } else { - memcpy((void *)data1, data, size1 ); + memcpy((void *)data1, data, size1); } - sys_ringbuf_AdvanceWriteIndex( rbuf, numWritten ); + sys_ringbuf_AdvanceWriteIndex(rbuf, numWritten); return numWritten; } /*************************************************************************** ** Return bytes read. */ -long sys_ringbuf_read(PA_VOLATILE sys_ringbuf *rbuf, void *data, long numBytes, - PA_VOLATILE char *buffer) +long sys_ringbuf_read(sys_ringbuf *rbuf, void *data, long numBytes, + char *buffer) { long size1, size2, numRead; - PA_VOLATILE void *data1, *data2; - numRead = sys_ringbuf_GetReadRegions( rbuf, numBytes, &data1, &size1, + void *data1, *data2; + numRead = sys_ringbuf_GetReadRegions(rbuf, numBytes, &data1, &size1, &data2, &size2, buffer); - if( size2 > 0 ) + if (size2 > 0) { - memcpy(data, (void *)data1, size1 ); + memcpy(data, (void *)data1, size1); data = ((char *)data) + size1; - memcpy(data, (void *)data2, size2 ); + memcpy(data, (void *)data2, size2); } else { - memcpy( data, (void *)data1, size1 ); + memcpy(data, (void *)data1, size1); } - sys_ringbuf_AdvanceReadIndex( rbuf, numRead ); + sys_ringbuf_AdvanceReadIndex(rbuf, numRead); return numRead; } diff --git a/src/s_audio_paring.h b/src/s_audio_paring.h index 2f59ee27..4a00bcc0 100644 --- a/src/s_audio_paring.h +++ b/src/s_audio_paring.h @@ -40,34 +40,32 @@ extern "C" * */ -/* If it's ever desired to use shared memory so that one process reads and -another one writes to the same ring buffer, define this as 'volatile' : */ -#define PA_VOLATILE +#include "m_private_utils.h" typedef struct { - long bufferSize; /* Number of bytes in FIFO. - Set by sys_ringbuf_init */ - PA_VOLATILE long writeIndex; /* Index of next writable byte. - Set by sys_ringbuf_AdvanceWriteIndex */ - PA_VOLATILE long readIndex; /* Index of next readable byte. - Set by sys_ringbuf_AdvanceReadIndex */ + long bufferSize; /* Number of bytes in FIFO. + Set by sys_ringbuf_init */ + atomic_int writeIndex; /* Index of next writable byte. + Set by sys_ringbuf_AdvanceWriteIndex */ + atomic_int readIndex; /* Index of next readable byte. + Set by sys_ringbuf_AdvanceReadIndex */ } sys_ringbuf; /* Initialize Ring Buffer. */ -long sys_ringbuf_init(PA_VOLATILE sys_ringbuf *rbuf, long numBytes, - PA_VOLATILE char *dataPtr, long nfill); +long sys_ringbuf_init(sys_ringbuf *rbuf, long numBytes, + char *dataPtr, long nfill); /* Return number of bytes available for writing. */ -long sys_ringbuf_getwriteavailable(PA_VOLATILE sys_ringbuf *rbuf); +long sys_ringbuf_getwriteavailable(sys_ringbuf *rbuf); /* Return number of bytes available for read. */ -long sys_ringbuf_getreadavailable(PA_VOLATILE sys_ringbuf *rbuf); +long sys_ringbuf_getreadavailable(sys_ringbuf *rbuf); /* Return bytes written. */ -long sys_ringbuf_write(PA_VOLATILE sys_ringbuf *rbuf, const void *data, - long numBytes, PA_VOLATILE char *buffer); +long sys_ringbuf_write(sys_ringbuf *rbuf, const void *data, + long numBytes, char *buffer); /* Return bytes read. */ -long sys_ringbuf_read(PA_VOLATILE sys_ringbuf *rbuf, void *data, long numBytes, - PA_VOLATILE char *buffer); +long sys_ringbuf_read(sys_ringbuf *rbuf, void *data, long numBytes, + char *buffer); /* semaphore for signaling the consumer thread */ struct _semaphore; From e182080061ea6fcb17ad4b3ee667342a5e65861d Mon Sep 17 00:00:00 2001 From: porres Date: Mon, 10 Jun 2024 17:19:32 -0300 Subject: [PATCH 11/89] add icon.png to makefile and other minor changes closes https://github.com/pure-data/pddp/issues/219 also, add Chris McCormick to readme also also, revise text in soundfiler-help.pd and... update manual version and some cosmetic changes and and improve [file] help a bit (add some symbol and list boxes) --- README.txt | 8 +- doc/1.manual/index.htm | 2 +- doc/5.reference/file-help.pd | 142 +++++++++++++++------------ doc/5.reference/openpanel-help.pd | 44 ++++----- doc/5.reference/osc~-help.pd | 51 +++++----- doc/5.reference/phasor~-help.pd | 24 ++--- doc/5.reference/send-receive-help.pd | 21 ++-- doc/5.reference/soundfiler-help.pd | 20 ++-- doc/5.reference/swap-help.pd | 2 +- doc/Makefile.am | 1 + 10 files changed, 168 insertions(+), 147 deletions(-) diff --git a/README.txt b/README.txt index 8fb0bb45..bed44c2f 100644 --- a/README.txt +++ b/README.txt @@ -57,7 +57,7 @@ Guenter Geiger, Kerry Hagan, Trevor Johnson, Fernando Lopez-Lezcano, Adam Lindsay, Karl MacMillan, Thomas Musil, Toshinori Ohkouchi, Winfried Ritsch, Vibeke Sorensen, Rand Steiger, Hans-Christoph Steiner, Shahrokh Yadegari, Dan Wilcox, David Zicarelli, IOhannes m zmoelnig, Christof Ressi, Antoine Rousseau, -Alexandre Torres Porres, Claude Heiland-Allen, Roman Haefeli, Lucarda, Seb Shader -and probably many others for contributions of code, documentation, ideas, and -expertise. This work has received support from Intel, Keith McMillen Instruments, -ZKM, IEM, and UCSD. +Alexandre Torres Porres, Claude Heiland-Allen, Roman Haefeli, Lucarda, Chris +McCormick, Seb Shader and probably many others for contributions of code, +documentation, ideas, and expertise. This work has received support from Intel, +Keith McMillen Instruments, ZKM, IEM, and UCSD. diff --git a/doc/1.manual/index.htm b/doc/1.manual/index.htm index 493d8834..1ff27787 100644 --- a/doc/1.manual/index.htm +++ b/doc/1.manual/index.htm @@ -20,7 +20,7 @@

Pure Data Manual

-

Updated for Pd version 0.55-0

+

Updated for Pd version 0.55-1

Table of contents:

  1. Introduction diff --git a/doc/5.reference/file-help.pd b/doc/5.reference/file-help.pd index 41c5016d..1ea42b39 100644 --- a/doc/5.reference/file-help.pd +++ b/doc/5.reference/file-help.pd @@ -154,9 +154,9 @@ #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; +#N canvas 556 65 617 565 glob 0; #X obj 50 378 file glob; -#X obj 50 443 print DATA; +#X obj 50 463 print DATA; #X obj 110 405 print ERROR; #X msg 71 153 symbol ~/*.*; #X msg 134 331 symbol; @@ -219,7 +219,6 @@ #X connect 22 0 11 0; #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 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 *; @@ -285,6 +284,7 @@ #X connect 2 0 7 0; #X connect 3 0 2 0; #X restore 85 525 pd flags; +#X text 141 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).; #X connect 0 0 1 0; #X connect 0 1 2 0; #X connect 3 0 0 0; @@ -446,26 +446,24 @@ #X restore 442 148 pd mkdir; #X obj 27 451 file delete; #X text 155 452 - delete files and directories; -#N canvas 521 23 666 648 delete 0; +#N canvas 521 23 673 679 delete 0; #X obj 85 216 file delete; -#X obj 159 243 print ERR:delete; -#X obj 85 273 print deleted; +#X obj 187 221 print ERR:delete; +#X obj 85 279 print deleted; #X text 51 84 NOTE: deleting destroys data. there is no confirmation dialog or anything of that kind., f 74; #X msg 85 155 symbol nada; #X text 173 157 file or directory to be deleted; -#X text 60 331 recursive deletion; -#X obj 95 520 file delete; -#X msg 95 439 recursive nada; -#X obj 169 547 print ERR:recursive-delete; -#X obj 95 605 print recursively-deleted; -#X text 208 440 remove the nada/ directory with all its content.; -#X text 283 239 on error \, a bang is sent to the 2nd outlet; -#X text 197 275 on success \, the deleted path is sent to the 1st outlet; -#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.; -#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 text 78 338 recursive deletion; +#X obj 113 527 file delete; +#X msg 113 446 recursive nada; +#X obj 209 556 print ERR:recursive-delete; +#X text 226 447 remove the nada/ directory with all its content.; +#X text 310 222 on error \, a bang is sent to the 2nd outlet; +#X text 195 281 on success \, the deleted path is sent to the 1st outlet; +#X text 236 529 on error \, a bang is sent to the 2nd outlet; +#X text 230 471 if nada is a file (rather than a directory) \, it will be deleted just so.; +#X text 78 353 ------------------; +#X text 100 372 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; #N canvas 599 129 573 316 reference 0; #X obj 9 48 cnv 5 550 5 empty empty INLET: 8 18 0 13 #202020 #000000 0; @@ -500,18 +498,27 @@ #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 symbolatom 85 251 0 0 0 0 - - - 0; +#X obj 187 193 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 209 530 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 113 632 print recursively-deleted; +#X text 304 623 on success \, the deleted path is sent to the 1st outlet, f 28; +#X symbolatom 113 590 0 0 0 0 - - - 0; +#X connect 0 0 22 0; +#X connect 0 1 23 0; #X connect 4 0 0 0; -#X connect 7 0 10 0; -#X connect 7 1 9 0; +#X connect 7 0 27 0; +#X connect 7 1 24 0; #X connect 8 0 7 0; +#X connect 22 0 2 0; +#X connect 23 0 1 0; +#X connect 24 0 9 0; +#X connect 27 0 25 0; #X restore 442 451 pd delete; -#N canvas 504 123 674 330 copy 0; +#N canvas 504 123 674 386 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; -#X obj 129 285 print ERR:copy; +#X obj 148 267 print ERR:copy; #N canvas 648 181 502 408 arguments 0; #X msg 136 143 verbose \$1; #X obj 136 122 tgl 17 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1; @@ -553,11 +560,17 @@ #X obj 48 239 file copy, f 12; #X msg 63 153 list \$1 porra; #X text 64 68 [file copy] duplicates the content of a file to a destination., f 64; -#X connect 0 0 12 0; -#X connect 4 0 12 0; -#X connect 12 0 2 0; -#X connect 12 1 3 0; -#X connect 13 0 12 0; +#X obj 148 240 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X listbox 48 303 0 0 0 0 - - - 0; +#X obj 48 340 print copy; +#X text 134 341 source and destination on success; +#X connect 0 0 11 0; +#X connect 3 0 11 0; +#X connect 11 0 15 0; +#X connect 11 1 14 0; +#X connect 12 0 11 0; +#X connect 14 0 2 0; +#X connect 15 0 16 0; #X restore 442 399 pd copy; #X obj 27 399 file copy; #X text 155 400 - copy files; @@ -852,7 +865,7 @@ #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; +#N canvas 549 160 668 434 move 0; #X msg 53 110 list source destination; #N canvas 305 121 542 398 arguments 0; #X msg 136 143 verbose \$1; @@ -874,9 +887,7 @@ #X text 70 68 [file move] moves (renames) files; #X text 241 109 renames the file 'source' to the new file 'destination'; #X obj 53 234 file move, f 12; -#X obj 53 259 print move; -#X obj 134 260 print ERR:move; -#X text 55 313 NOTE: moving a file removes the original file.; +#X text 202 388 NOTE: moving a file removes the original file.; #X obj 11 47 cnv 1 650 1 empty empty empty 8 12 0 13 #000000 #000000 0; #N canvas 599 129 573 331 reference 0; #X obj 9 52 cnv 5 550 5 empty empty INLET: 8 18 0 13 #202020 #000000 0; @@ -898,10 +909,17 @@ #X restore 567 15 pd reference; #X obj 36 15 file move; #X text 112 15 - move a file to a new destination.; +#X obj 158 230 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X listbox 53 293 0 0 0 0 - - - 0; +#X text 139 331 source and destination on success; +#X obj 158 257 print ERR:move; +#X obj 53 330 print move; #X connect 0 0 7 0; #X connect 1 0 7 0; -#X connect 7 0 8 0; -#X connect 7 1 9 0; +#X connect 7 0 14 0; +#X connect 7 1 13 0; +#X connect 13 0 16 0; +#X connect 14 0 17 0; #X restore 442 425 pd move; #X text 22 665 see also:; #X obj 97 664 text; @@ -1266,19 +1284,18 @@ #X text 155 196 - get path relative to the patch; #X obj 27 172 file cwd; #X text 155 171 - get/set the current working directory; -#N canvas 536 54 569 586 cwd 0; -#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; -#X obj 108 470 print CWD; -#X msg 129 257 symbol ~; -#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 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 189 340 select a new working directory; +#N canvas 536 54 569 599 cwd 0; +#X obj 178 457 bng 20 250 50 0 empty empty empty -35 10 0 10 #dfdfdf #000000 #000000; +#X obj 90 424 file cwd, f 13; +#X text 97 171 get the Current Working Directory; +#X msg 111 256 symbol ~; +#X msg 90 215 symbol ..; +#X text 167 214 change to the parent directory; +#X text 184 256 change to the HOME-directory; +#X msg 127 297 symbol /foo; +#X text 219 291 change to some other (most likely nonexistent) directory, f 29; +#X obj 142 365 openpanel 1; +#X text 171 339 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; @@ -1302,10 +1319,10 @@ #X restore 447 14 pd reference; #X text 112 15 - the Current Working Directory; #X obj 36 15 file cwd; -#X text 189 491 error; -#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 text 171 481 error; +#X obj 65 171 bng 20 250 50 0 empty empty empty -35 10 0 10 #dfdfdf #000000 #000000; +#X obj 142 340 bng 20 250 50 0 empty empty empty -35 10 0 10 #dfdfdf #000000 #000000; +#X text 226 430 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; #N canvas 373 310 531 228 flags 0; #X text 164 93 less verbose (quiet); #X text 164 123 more verbose (loud); @@ -1319,15 +1336,18 @@ #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 restore 380 554 pd flags; +#X symbolatom 90 509 64 0 0 0 - - - 0; +#X obj 90 543 print CWD; +#X connect 1 0 22 0; #X connect 1 1 0 0; +#X connect 3 0 1 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 connect 7 0 1 0; +#X connect 9 0 1 0; +#X connect 18 0 1 0; +#X connect 19 0 9 0; +#X connect 22 0 23 0; #X restore 442 172 pd cwd; #X obj 27 614 file isabsolute; #N canvas 469 92 627 573 isabsolute 0; diff --git a/doc/5.reference/openpanel-help.pd b/doc/5.reference/openpanel-help.pd index 531e0911..8554dd4e 100644 --- a/doc/5.reference/openpanel-help.pd +++ b/doc/5.reference/openpanel-help.pd @@ -1,9 +1,9 @@ #N canvas 499 27 538 647 12; -#X obj 82 276 openpanel; +#X obj 87 280 openpanel; #X text 11 601 see also:; #X obj 81 602 savepanel; -#X msg 98 170 symbol /tmp; -#X msg 108 196 symbol C:/; +#X msg 103 174 symbol /tmp; +#X msg 113 200 symbol C:/; #X obj 233 468 openpanel 1; #X obj 355 468 openpanel 2; #X text 231 419 directory; @@ -11,11 +11,10 @@ #X obj 108 468 openpanel 0; #X obj 23 13 openpanel; #X text 96 13 - query for files or directories; -#X text 47 65 When openpanel gets a "bang" \, a file browser appears on the screen. By default \, if you select a file \, its name appears on the outlet.; -#X text 56 368 A mode argument allow you to select a directory or multiple files. See below; +#X text 56 372 A mode argument allow you to select a directory or multiple files. See below; #X text 86 417 file (default); -#X text 193 173 Start in a specified directory given as a symbol, f 31; -#X symbolatom 82 305 60 0 0 0 - - - 0; +#X text 198 177 Start in a specified directory given as a symbol, f 31; +#X symbolatom 87 309 60 0 0 0 - - - 0; #N canvas 683 137 587 238 reference 0; #X obj 18 52 cnv 5 550 5 empty empty INLET: 8 18 0 13 #202020 #000000 0; #X obj 18 119 cnv 2 550 2 empty empty OUTLET: 8 12 0 13 #202020 #000000 0; @@ -33,30 +32,31 @@ #X text 456 15 <= click; #X obj 8 45 cnv 1 525 1 empty empty empty 8 12 0 13 #000000 #000000 0; #X obj 8 589 cnv 1 525 1 empty empty empty 8 12 0 13 #000000 #000000 0; -#X obj 82 132 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 87 136 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X obj 233 440 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X obj 355 440 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X obj 108 440 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X obj 108 495 print file; #X obj 233 495 print dir; #X obj 355 495 print multiple; -#X obj 82 332 print openpanel; +#X obj 87 336 print openpanel; #X text 310 602 updated for Pd version 0.55-0; -#X msg 119 237 symbol ~; -#X text 110 132 Starts in current patch's directory by default.; -#X text 191 231 The "~" symbol expands to the home directory, f 22; +#X msg 124 241 symbol ~; +#X text 115 136 Starts in current patch's directory by default.; +#X text 196 235 The "~" symbol expands to the home directory, f 22; #X obj 153 602 soundfiler; #X obj 233 602 readsf~; #X text 51 530 You can use this object to feed file names to objects like [readsf~] \, [soundfiler] \, [array] \, [text] and others.; -#X connect 0 0 16 0; +#X text 53 64 When [openpanel] gets a "bang" \, a file browser appears on the screen. By default \, if you select a file \, its name appears on the outlet.; +#X connect 0 0 15 0; #X connect 3 0 0 0; #X connect 4 0 0 0; -#X connect 5 0 26 0; -#X connect 6 0 27 0; -#X connect 9 0 25 0; -#X connect 16 0 28 0; -#X connect 21 0 0 0; -#X connect 22 0 5 0; -#X connect 23 0 6 0; -#X connect 24 0 9 0; -#X connect 30 0 0 0; +#X connect 5 0 25 0; +#X connect 6 0 26 0; +#X connect 9 0 24 0; +#X connect 15 0 27 0; +#X connect 20 0 0 0; +#X connect 21 0 5 0; +#X connect 22 0 6 0; +#X connect 23 0 9 0; +#X connect 29 0 0 0; diff --git a/doc/5.reference/osc~-help.pd b/doc/5.reference/osc~-help.pd index c0d4be33..84d9a074 100644 --- a/doc/5.reference/osc~-help.pd +++ b/doc/5.reference/osc~-help.pd @@ -1,23 +1,20 @@ -#N canvas 495 23 565 439 12; +#N canvas 495 23 564 438 12; #X declare -stdpath ./; #X floatatom 173 134 5 0 0 0 - - - 0; -#X text 18 401 see also:; -#X obj 215 401 cos~; -#X obj 255 401 tabread4~; +#X text 15 401 see also:; +#X obj 212 401 cos~; +#X obj 252 401 tabread4~; #X obj 27 18 osc~; #X text 62 18 - cosine wave oscillator; -#X obj 206 229 metro 500; -#X obj 90 401 phasor~; -#X obj 196 266 tabwrite~ \$0-array; +#X obj 87 401 phasor~; #X obj 173 299 output~; -#X obj 206 201 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1; #X obj 173 166 osc~ 440; #X msg 226 134 0; #X msg 260 134 0.5; #X text 71 133 set frequency; #X obj 37 206 sig~ 440; #X obj 37 245 osc~; -#X obj 408 343 declare -stdpath ./; +#X obj 394 341 declare -stdpath ./; #N canvas 731 147 586 252 reference 0; #X obj 18 52 cnv 5 550 5 empty empty INLETS: 8 18 0 13 #202020 #000000 0; #X obj 18 153 cnv 2 550 2 empty empty OUTLET: 8 12 0 13 #202020 #000000 0; @@ -37,16 +34,14 @@ #X text 477 18 <= click; #X obj 8 49 cnv 1 550 1 empty empty empty 8 12 0 13 #000000 #000000 0; #X obj 7 383 cnv 1 550 1 empty empty empty 8 12 0 13 #000000 #000000 0; -#X text 40 62 The [osc~] object outputs a cosine wave. The frequency input can be either a float or a signal. 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 67; -#X text 230 201 <-- graph; -#X obj 149 401 tabosc4~; +#X obj 146 401 tabosc4~; #X text 295 133 <-- reset phase; #X text 19 167 (note it also takes signals), f 14; -#X obj 353 220 cnv 19 198 98 empty empty empty 20 12 0 12 #e0e0e0 #404040 0; +#X obj 339 218 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 352 219 graph; +#X array \$0-osc 441 float 0; +#X coords 0 1 440 -1 200 100 1 0 0; +#X restore 338 217 graph; #N canvas 572 114 468 431 compatibility 0; #X text 38 22 Up to version 0.54 \, [osc~] relied on a 512-point cosine table \, which was adequate for most "computer music" applications in the 90s with a signal-to-noise ratio of about 110 dB. The default table size is now increased to 2048 points \, improving signal-to-noise by an additional 36 dB. To get the original 512-point tables you can run Pd with compatiblity level set to 0.54., f 56; #X msg 61 177 \; pd compatibility 0.54; @@ -56,15 +51,19 @@ #X text 73 153 (old table size); #X text 273 153 (new table size); #X connect 3 0 4 0; -#X restore 20 333 pd compatibility; -#X text 26 295 compatibility note (open):, f 13; +#X restore 20 328 pd compatibility; +#X text 26 290 compatibility note (open):, f 13; #X text 240 166 <-- argument sets initial frequency; #X text 356 402 updated for Pd version 0.55; -#X connect 0 0 11 0; -#X connect 6 0 8 0; -#X connect 10 0 6 0; -#X connect 11 0 8 0; -#X connect 11 0 9 0; -#X connect 12 0 11 1; -#X connect 13 0 11 1; -#X connect 15 0 16 0; +#X obj 196 266 tabwrite~ \$0-osc; +#X obj 206 232 metro 100; +#X obj 206 203 loadbang; +#X text 40 62 The [osc~] object outputs a cosine wave. The frequency input can be either a float or a signal. 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 67; +#X connect 0 0 8 0; +#X connect 8 0 7 0; +#X connect 8 0 28 0; +#X connect 9 0 8 1; +#X connect 10 0 8 1; +#X connect 12 0 13 0; +#X connect 29 0 28 0; +#X connect 30 0 29 0; diff --git a/doc/5.reference/phasor~-help.pd b/doc/5.reference/phasor~-help.pd index 1ba40910..9fd24774 100644 --- a/doc/5.reference/phasor~-help.pd +++ b/doc/5.reference/phasor~-help.pd @@ -14,7 +14,6 @@ #X text 58 525 -1; #X text 65 479 0; #X text 66 428 1; -#X obj 96 373 tabwrite~ phasor; #X obj 325 358 phasor~; #X obj 325 309 sig~ 440; #X text 411 351 the frequency; @@ -39,7 +38,7 @@ #X text 477 18 <= click; #X obj 8 49 cnv 1 550 1 empty empty empty 8 12 0 13 #000000 #000000 0; #X obj 7 565 cnv 1 550 1 empty empty empty 8 12 0 13 #000000 #000000 0; -#X text 216 374 <-- graph the output, f 10; +#X text 193 318 <-- graph the output, f 10; #X text 139 211 <-- specify frequency; #X text 195 243 <-- right inlet resets phase, f 15; #X text 344 334 <------- signal controlling; @@ -52,15 +51,16 @@ #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 array \$0-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; +#X obj 96 373 tabwrite~ \$0-phasor; +#X connect 0 0 34 0; +#X connect 8 0 34 1; +#X connect 9 0 37 0; +#X connect 10 0 34 1; +#X connect 15 0 31 0; +#X connect 16 0 15 0; +#X connect 18 0 9 0; +#X connect 28 0 19 0; +#X connect 34 0 37 0; diff --git a/doc/5.reference/send-receive-help.pd b/doc/5.reference/send-receive-help.pd index fdb55a51..4f3288bf 100644 --- a/doc/5.reference/send-receive-help.pd +++ b/doc/5.reference/send-receive-help.pd @@ -46,18 +46,19 @@ #X obj 590 139 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X obj 718 183 value \$0-x; #X floatatom 718 218 5 0 0 0 - - - 0; -#N canvas 0 22 450 278 (subpatch) 0; -#X array \$0-array 515 float 0; -#X coords 0 1 514 -1 150 100 1 0 0; -#X restore 710 297 graph; -#X obj 587 351 send \$0-array; -#X msg 587 319 sinesum 512 1; +#X obj 606 343 send \$0-array; +#X msg 606 311 sinesum 512 1; #X floatatom 820 183 5 0 0 0 - \$0-x - 0; #X text 559 24 Note that "\$0" is also used in send/receive names in GUIs \, array names and as well as variable names in value objects. In order to use the 'send' method from [float] \, [int] and [list store] objects \, you also need to pass the "\$0" value to the message., f 45; #X obj 718 154 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X obj 281 292 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X obj 151 301 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X text 36 33 '\$0' - the patch ID number used to force locality in Pd - is widely used in send and receive names \, especially in abstractions so each copy has local connections instead of global., f 67; +#X obj 731 299 cnv 19 126 76 empty empty empty 20 12 0 12 #e0e0e0 #404040 0; +#N canvas 0 22 450 278 (subpatch) 0; +#X array \$0-array 515 float 0; +#X coords 0 1 514 -1 127 78 1 0 0; +#X restore 731 298 graph; #X connect 1 0 2 0; #X connect 3 0 0 0; #X connect 6 0 4 0; @@ -70,10 +71,10 @@ #X connect 16 0 15 0; #X connect 17 0 16 0; #X connect 18 0 19 0; -#X connect 22 0 21 0; -#X connect 25 0 18 0; -#X connect 26 0 11 0; -#X connect 27 0 7 0; +#X connect 21 0 20 0; +#X connect 24 0 18 0; +#X connect 25 0 11 0; +#X connect 26 0 7 0; #X restore 596 159 pd Dealing_with_"\$0"; #X msg 223 639 message; #X obj 285 639 pd-messages; diff --git a/doc/5.reference/soundfiler-help.pd b/doc/5.reference/soundfiler-help.pd index 736fbb82..4ef75134 100644 --- a/doc/5.reference/soundfiler-help.pd +++ b/doc/5.reference/soundfiler-help.pd @@ -27,11 +27,10 @@ #X text 68 117 write -; #X obj 30 15 soundfiler; #X text 234 309 NONE; -#X text 112 15 - import/export soundfiles to/from arrays.; #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 text 112 15 - import/export sound or ascii files to/from arrays.; #X restore 822 15 pd reference; -#X text 120 14 - import/export soundfiles to/from arrays; #X msg 34 156 read ../sound/bell.aiff sample; #X msg 60 191 read -resize ../sound/bell.aiff sample; #X text 340 184 optionally resize array to fit the whole file, f 23; @@ -90,7 +89,6 @@ #X obj 657 301 savepanel; #X obj 657 266 bng 23 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X text 18 522 -rate (sample rate \, default Pd's running sample rate), f 71; -#X text 18 485 -nframes (maximum points to write \, default whole array), f 69; #X text 18 468 -skip (number of points to skip in array \, default 0), f 69; #X text 27 49 -skip (sample frames to skip in the file as an offset), f 73; #X text 27 100 -raw (header size \, channels \, bytes per sample \, endianness), f 73; @@ -148,25 +146,27 @@ #X text 696 548 info: sample rate \, header size \, channels \, bytes \, endianness; #X text 27 83 -maxsize (maximum number of samples to resize to *), f 73; #X text 27 66 -resize (resizes arrays to the size of the sound file *), f 73; -#X text 17 291 * When loading a file \, [soundfiler] populates the array until reaching its size. If the sound file is smaller \, the remaining points are zeroed out. The -resize flag resizes in both cases to the sample size. The -maxsize flag sets a maximum size to clip to and it imposes a maximum limit even when used in conjunction with the '-resize' flag (also \, errors are given to warn you). The -maxsize was needed for historical reasons when the its default value used to be rather small (4 million). The default now is much bigger \, hence \, this flag can be ingored., f 80; #X text 1043 131 read overriding the file's header, f 17; +#X text 17 288 * When loading a file \, [soundfiler] populates the array until reaching its size. If the sound file is smaller \, the remaining points are zeroed out. The -resize flag resizes the array to the sample size \, while the -maxsize flag sets a maximum size to clip to even if used in conjunction with the '-resize' flag (also \, errors are given to warn you about the truncation). The -maxsize was needed for historical reasons when its default value used to be rather small (4 million). The default now is much bigger \, hence \, this flag can just be ingored., f 78; +#X text 18 485 -nframes (maximum points to write \, default from skip point to end of array), f 83; #X connect 0 0 11 0; #X connect 0 1 8 0; #X connect 9 0 0 0; #X connect 10 0 0 0; -#X connect 12 0 24 0; +#X connect 12 0 23 0; #X connect 13 0 12 0; -#X connect 14 0 23 0; +#X connect 14 0 22 0; #X connect 15 0 14 0; +#X connect 22 0 0 0; #X connect 23 0 0 0; #X connect 24 0 0 0; -#X connect 25 0 0 0; +#X connect 26 0 0 0; #X connect 27 0 0 0; -#X connect 28 0 0 0; #X restore 784 529 pd read-write-flags; #X text 577 157 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 that is bigger than the array size \, the number or samples gets clipped to the array size (you probably want to use the -resize flag in this case to automatically resize the array size to the file size)., f 62; +#X text 120 13 - import/export sound or ascii files to/from arrays; #X connect 0 0 1 0; #X connect 0 1 11 0; +#X connect 15 0 0 0; #X connect 16 0 0 0; -#X connect 17 0 0 0; -#X connect 37 0 0 0; +#X connect 36 0 0 0; diff --git a/doc/5.reference/swap-help.pd b/doc/5.reference/swap-help.pd index 5b12cc5d..3f348e6d 100644 --- a/doc/5.reference/swap-help.pd +++ b/doc/5.reference/swap-help.pd @@ -19,7 +19,7 @@ #X obj 78 333 print L; #X obj 145 332 print R; #N canvas 686 206 587 339 reference 0; -#X obj 18 52 cnv 5 550 5 empty empty INLET: 8 18 0 13 #202020 #000000 0; +#X obj 18 52 cnv 5 550 5 empty empty INLETS: 8 18 0 13 #202020 #000000 0; #X obj 18 171 cnv 2 550 2 empty empty OUTLETS: 8 12 0 13 #202020 #000000 0; #X obj 18 265 cnv 2 550 2 empty empty ARGUMENT: 8 12 0 13 #202020 #000000 0; #X obj 17 307 cnv 5 550 5 empty empty empty 8 18 0 13 #202020 #000000 0; diff --git a/doc/Makefile.am b/doc/Makefile.am index f90f326f..3ff6d491 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -56,6 +56,7 @@ nobase_dist_libpd_DATA = \ ./1.manual/1.introduction.txt \ ./1.manual/resources/favicon.ico \ ./1.manual/resources/pdmanual.css \ + ./1.manual/resources/icon.png \ ./1.manual/resources/1.2.1.png \ ./1.manual/resources/1.2.2.png \ ./1.manual/resources/1.2.3.png \ From 48cd704a2fa3e90083c2dd5091b7a3ef3a9c106e Mon Sep 17 00:00:00 2001 From: porres Date: Fri, 21 Jun 2024 13:40:44 -0300 Subject: [PATCH 12/89] mention page and q8_sqrt~ and q8_rsqrt~ as aliases q8_sqrt~ and q8_rsqrt~ are described as "old quick 8 bit versions" but they are just aliases now. Also mention mention [page] as a deprecated alias name of [pd] closes https://github.com/pure-data/pddp/issues/220 --- doc/5.reference/canvas-help.pd | 6 +++++- doc/5.reference/help-intro.pd | 4 ++-- doc/5.reference/list-help.pd | 16 +++++++++++---- doc/5.reference/unops-tilde-help.pd | 32 +++++++++++++++-------------- 4 files changed, 36 insertions(+), 22 deletions(-) diff --git a/doc/5.reference/canvas-help.pd b/doc/5.reference/canvas-help.pd index 4a993af2..5ecc51a5 100644 --- a/doc/5.reference/canvas-help.pd +++ b/doc/5.reference/canvas-help.pd @@ -1,4 +1,4 @@ -#N canvas 299 39 1004 645 12; +#N canvas 239 53 1004 645 12; #X obj 508 180 table; #X obj 552 557 table help-tab1 25; #N canvas 1 51 450 300 (subpatch) 0; @@ -145,5 +145,9 @@ #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; +#N canvas 47 74 450 300 (subpatch) 0; +#X restore 266 23 page; +#X text 308 23 (deprecated alias); +#X text 241 23 or; #X connect 24 0 23 0; #X connect 25 0 23 0; diff --git a/doc/5.reference/help-intro.pd b/doc/5.reference/help-intro.pd index eb10ffe2..fac5a7f5 100644 --- a/doc/5.reference/help-intro.pd +++ b/doc/5.reference/help-intro.pd @@ -1,4 +1,4 @@ -#N canvas 462 23 590 723 12; +#N canvas 419 23 590 723 12; #X declare; #X obj 54 2364 delay; #X obj 54 2416 metro; @@ -506,4 +506,4 @@ #X text 172 225 click and open for all Graphical User Interface (GUI) objects in Pd, f 48; #X obj 76 226 all_guis; #X text 143 225 <--; -#X text 183 7476 - cheap 8 bits versions of square root functions (use [srqt~]/[rsqrt~] instead), f 40; +#X text 183 7473 - these used to be cheap 8 bits versions of square root functions but now are the same as srqt~] and [rsqrt~] (so just use them instead), f 51; diff --git a/doc/5.reference/list-help.pd b/doc/5.reference/list-help.pd index 0852024b..cb2faeb1 100644 --- a/doc/5.reference/list-help.pd +++ b/doc/5.reference/list-help.pd @@ -661,7 +661,7 @@ #X obj 182 527 float; #X obj 143 527 text; #X obj 230 527 symbol; -#N canvas 592 78 607 430 from/to 0; +#N canvas 485 65 613 631 from/to 1; #X symbolatom 47 221 10 0 0 0 - - - 0; #X obj 47 251 list fromsymbol; #X msg 239 163 115 101 118 101 110 116 101 101 110; @@ -699,15 +699,23 @@ #X obj 252 192 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X text 361 210 outputs an empty symbol; #X text 277 192 <-- a bang is zero element list and; -#X obj 286 374 fudiformat; -#X obj 374 374 fudiparse; -#X text 87 347 For an alternative to manipulate generic messages and not only symbols \, see:, f 49; +#X obj 314 556 fudiformat; +#X obj 402 556 fudiparse; +#X text 115 529 For an alternative to manipulate generic messages and not only symbols \, see:, f 49; +#X floatatom 112 346 5 0 0 0 - - - 0; +#X obj 112 381 makefilename %s; +#X obj 112 418 list fromsymbol; +#X listbox 112 454 11 0 0 0 - - - 0; +#X text 283 397 You can use [makefilename] to convert floats; #X connect 0 0 1 0; #X connect 1 0 8 0; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 5 0 0 0; #X connect 15 0 3 0; +#X connect 21 0 22 0; +#X connect 22 0 23 0; +#X connect 23 0 24 0; #X restore 473 283 pd from/to symbol; #X f 10; #X text 65 433 Some examples showing how to use these objects to compose and/or use variable length messages., f 32; diff --git a/doc/5.reference/unops-tilde-help.pd b/doc/5.reference/unops-tilde-help.pd index df795ef3..e7d357a4 100644 --- a/doc/5.reference/unops-tilde-help.pd +++ b/doc/5.reference/unops-tilde-help.pd @@ -33,17 +33,17 @@ #X floatatom 174 301 9 0 0 0 - - - 0; #X obj 135 235 sqrt~; #X obj 174 271 snapshot~; -#X obj 443 137 q8_sqrt~; +#X obj 439 135 q8_sqrt~; #X obj 135 201 sig~ 4; -#X msg 531 281 \; pd dsp \$1; -#X obj 531 246 set-dsp-tgl; -#X text 562 250 DSP on/off; -#X obj 541 417 metro 100; -#X obj 541 392 loadbang; -#X obj 541 441 s bang; +#X msg 539 275 \; pd dsp \$1; +#X obj 539 240 set-dsp-tgl; +#X text 570 244 DSP on/off; +#X obj 448 277 metro 100; +#X obj 448 252 loadbang; +#X obj 448 301 s bang; #X obj 75 235 r bang; #X obj 108 15 rsqrt~; -#X obj 508 137 q8_rsqrt~; +#X obj 504 135 q8_rsqrt~; #X floatatom 205 173 5 0 0 0 - - - 0; #X floatatom 269 301 9 0 0 0 - - - 0; #X obj 269 271 snapshot~; @@ -89,7 +89,7 @@ #X connect 6 0 4 0; #X connect 7 0 2 0; #X connect 9 0 8 0; -#X restore 217 498 pd compatibility; +#X restore 519 482 pd compatibility; #N canvas 648 122 373 442 multichannel 0; #X obj 86 163 snake~ in, f 10; #X obj 86 271 snake~ out; @@ -120,9 +120,9 @@ #X connect 12 0 4 0; #X connect 13 0 0 1; #X connect 15 0 0 0; -#X restore 540 496 pd multichannel; -#X text 389 481 mutichannel signal support ----------->, f 20; -#X text 103 393 <-- shift-drag here to get non-integers to try; +#X restore 500 421 pd multichannel; +#X text 349 406 mutichannel signal support ----------->, f 20; +#X text 103 393 <-- shift-drag here to get non-integers to try, f 23; #X obj 101 560 abs; #X obj 373 560 +~; #X obj 101 589 expr~; @@ -132,9 +132,11 @@ #X text 137 559 (etc.) - control rate versions; #X obj 187 589 clip~; #X text 446 589 updated for Pd version 0.55; -#X text 223 458 compatibility notes (open):, f 13; -#X text 580 137 (deprecated); -#X text 18 64 The [abs~] object passes nonnegative values unchanged \, but replaces negative ones with their (positive) inverses. The [sqrt~] and [rsqrt~] output \, respectively \, the square root and inverse square root - the same as 1/sqrt(input). By the way \, [q8_sqrt~]/[q8_rsqrt~] are cheap versions accurate to 8 bits that are deprecated and should not be used:, f 89; +#X text 414 475 compatibility notes (open):, f 13; +#X text 576 135 (deprecated); +#X text 38 63 The [abs~] object passes nonnegative values unchanged \, but replaces negative ones with their (positive) inverses. The [sqrt~] and [rsqrt~] output \, respectively \, the square root and inverse square root - the same as 1/sqrt(input). By the way \, there used to be cheap versions accurate to 8 bits ([q8_sqrt~] and [q8_rsqrt~]) that have been "deleted" and are now the same as [sqrt~] and [rsqrt~]:, f 87; +#X text 198 453 see also:; +#X obj 187 475 expr~ fmod($v1 \, $v2); #X connect 8 0 10 0; #X connect 9 0 12 0; #X connect 11 0 8 0; From 45e370e1a08e3231596e7032b738f696576dfef9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Thu, 27 Jun 2024 15:03:00 +0200 Subject: [PATCH 13/89] initialize Pd from GUI once the GUI is done initializing itself `::pdwindow::create_window_finalize` waits until the PdWindow is visible. this blocks any commands that were sent together with (but after) `pdtk_pd_startup`. if Pd-core sends more stuff in the meantime, the new stuff will overtake the pending commands leading to weird races. Closes: https://github.com/pure-data/pure-data/issues/2310 --- tcl/pd-gui.tcl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tcl/pd-gui.tcl b/tcl/pd-gui.tcl index 6dcd578d..40704352 100755 --- a/tcl/pd-gui.tcl +++ b/tcl/pd-gui.tcl @@ -532,8 +532,6 @@ proc pdtk_pd_startup {major minor bugfix test set_base_font $sys_font $sys_fontweight set ::font_measured [fit_font_into_metrics $::font_family $::font_weight $::font_metrics] set ::font_zoom2_measured [fit_font_into_metrics $::font_family $::font_weight $::font_zoom2_metrics] - pdsend "pd init [enquote_path [pwd]] $oldtclversion \ - $::font_measured $::font_zoom2_measured" ::pd_bindings::class_bindings ::pd_bindings::global_bindings ::pd_menus::create_menubar @@ -542,6 +540,8 @@ proc pdtk_pd_startup {major minor bugfix test ::pd_menus::configure_for_pdwindow ::pdwindow::create_window_finalize load_startup_plugins + pdsend "pd init [enquote_path [pwd]] $oldtclversion \ + $::font_measured $::font_zoom2_measured" open_filestoopen set ::done_init 1 } From 7d8887cf5ea16ff6def1babd111c9d560f4d3320 Mon Sep 17 00:00:00 2001 From: Ben Wesch Date: Thu, 27 Jun 2024 16:28:02 +0200 Subject: [PATCH 14/89] document connection removal with cmd+k for single box --- doc/1.manual/resources/2.3.19.png | Bin 17657 -> 20059 bytes doc/1.manual/resources/2.3.20.png | Bin 16037 -> 17657 bytes doc/1.manual/resources/2.3.21.png | Bin 23364 -> 16037 bytes doc/1.manual/resources/2.3.22.png | Bin 20517 -> 23364 bytes doc/1.manual/resources/2.3.23.png | Bin 23941 -> 20517 bytes doc/1.manual/resources/2.3.24.png | Bin 15066 -> 23941 bytes doc/1.manual/resources/2.3.25.png | Bin 20165 -> 15066 bytes doc/1.manual/resources/2.3.26.png | Bin 16156 -> 20165 bytes doc/1.manual/resources/2.3.27.png | Bin 0 -> 16156 bytes doc/1.manual/x2.htm | 44 +++++++++++++++++++----------- doc/Makefile.am | 1 + 11 files changed, 29 insertions(+), 16 deletions(-) create mode 100644 doc/1.manual/resources/2.3.27.png diff --git a/doc/1.manual/resources/2.3.19.png b/doc/1.manual/resources/2.3.19.png index 1cfc325c4e8ad10bacca4f7c0e7e90616e6a619a..918c0e48c7116d372b064b2728cc95f7df6fd1e2 100644 GIT binary patch literal 20059 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 p3l7{1QRQ8`jY<5-tI8Ia{u?|{sdi70G$8; literal 17657 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 delta 12235 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 diff --git a/doc/1.manual/resources/2.3.22.png b/doc/1.manual/resources/2.3.22.png index 12754fc6d774ec53d3b18723db31d260e38c33b3..cf38d8036e35cfa9b6f409a98d229fbc134155a5 100644 GIT binary patch delta 22156 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%0AWcP*5KFd5;{?sno=k0dIrRqve0Obj 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 DeHvAO literal 20517 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 Oe(o+lM=B46ru-jlOdr?) diff --git a/doc/1.manual/resources/2.3.23.png b/doc/1.manual/resources/2.3.23.png index b92f51da567984d689f7698ac85cc44cf98375e5..12754fc6d774ec53d3b18723db31d260e38c33b3 100644 GIT binary patch literal 20517 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 Oe(o+lM=B46ru-jlOdr?) delta 22742 zcma&OXH-+)6D~|sM5IVZgrIe`|+;D2i7`g&zU`Y_TDqkJd^xv!Vk@a6}v>&ge9efB@>T`9$XW7 zEF~$AuhrHMDmRozlf046Mjhv5n+BS5vwMFR zwh=$#d?IFL@z`484gQI>Ilr~A$YXwUQ3?EumgYj1V&YHCMa(S|DM>gv--wA?Sqq7a z@r#R#Tk(sCSxNA}u@;l$7dIER6c!e;5)qNKO4K9K{eOFLkmT!rmes<3OM7ay( zO^JK8yRYO>=WzP4NARrE$kJ1esbbk;29Z;rBp!yZ?$3!52vnXc*ir;<^UBN71X(BC z;+#e!PFf~s&NH?WGmzRvptW<2P%DUtnuPG?6lnX}NeC>?#h5Aq zHG<-5%NWAo|G=wJShZ5RVN=-)lOu4*0|I5)3)^j-q+HOizmGG95~%uzoQkC%1`}Sg znZ~B=Hk6CcKb6Qjl*~Hx`^i{&=jHc9l9tF%(&;FwPn7Tyy4W-Z{P102 zofw5yvEwy&?>hl*`iv~a9K0|7n~xH#k$=^nw5bcXdO{&LWqPgu-#YB7!Jn6_;tewz)YKSlfR~ z8B~7saKE-{yOYb6!A9Nz$7A{5Cp}==)O#zJ!v@ou>K}>B+hdF-2rH#Nl{^mo-@s2U zF$wF9G_|q9ywofMN!W=2EaiVgQ3p=ut)u(Q^B+3iqK;hIL;mT45{KPR=WAmDT-t7> zQiL;Klf8SLUx+2pYBcaaUGG6TS1Bq|wV%J>m$kn+Zk8a#Qd!17LcjXons+c>dvx#_ zuFF6G^P!E}lIN@ZP)GhQrhtL$|2i!R;U6`La6he?Z)zO2q50oJh?s?LIH>(+=IW&= zYrpT?jX=9}rCY7te3FWr&IHA(QKW=C+20j)1?6ko^0$)JcN> zJ=1~T;NvD0 zNPQv3jy9)Xz$>&lRz{%Xe?Gh`0_D_cO`U(`2PV{dgBkb+`dZb++!be>@!vi&JaF>) zbRwEHt7XkL6FSKD-y|~^i61_r+NYb1NqhrPFVw!eydGYNw&%W0%{$AE5j=s{y(3Jc zEvKHb_`Ii`SgRhiwe@S}(l1dk@_xuL=%T;^MgRnGs$5{}`U+;ucOuijdv8!}4cg0y zYmJ>gS#rf?xU59UItJ4qQD~fU&D@=e4UIgGM};?R`-5rxUh_SqW}X~5nZzFhC`H(f zhD-2o$bHc=rOpo@mhBB)EeIMBJ#)_qA}qP6cblqK{)wX{C_^Bzv9@|Jg0we`5e>kl zWo_ZBBxv&k^+>`YexwPEC7hngoE8xHO`f9S&#c8f#MDu6~HhHp}4l_S$SH7U- z)@a$AJ7g4i{k9B1PdW*7qOF}?;f za}4n;ga{uld7}KfT#nN5+w0butl7^nf}3sRxKz;Y`B?KVHuiF14S-Ap`Om z2n+gp9-IA?>xgC0HV;bl1w-vqo&|+Q3*H=8$(D?~ew4WqM{Vh-7?!NQ)=on5IM|6g zEAydLe8wlYy~Q6kfcR6_E>@18Kjmx+zK%~IC4XP-#{zdH-&@++u9p~|nx5@QZ>5uS zBQB-*`T6~yxA1n0KE3y5r8fy#R91vVZ=w^2c@nu9=;(CyOtrsgK37e9yD_Rrk2^*} z%e@u@bN2TG1It1}Lc;XQN?!KPY}%NE+Aw@)4|WvZRc^Yo0Ah{}xRcvCZ|;5P;W@5# z*Ej=YO~vgk4Ga*5)z&5rdzyX^jV`IYHD)4f&b*f0pA{iry?XT>3zU?nwDR$M&wh-^ zt&%&D>ev-1GUdKe00(2*i0$N;!W!a`6q*K&_M(r_8W04W?M%S_N9d^huVhbxXKl2C z&stJRqZMzA1A?pu*7x4}n>d;Lj-W*&^O56|^N0(0_F{Iw-?_bm!@078*DA30gA{Sr zA-DrSFSuH}YRO1SI_^c_STqJ9{uc^wen*myIx|bv6c(;8`K2l!e$12x#2((ry!W;z zfr};tS*GWAg{$p|Vk}m~9>;27Fqke)I=YhQYAi)SGEU-fY9w!MD3kow%}t;4xA38} zHdtQSx9i>}K0ZUl;dQ_vSOLVS4D)aEZefUo3Uqyh(mj z|Eml@4H1Di6ndfHe#)+ggIVG&ABTs^%elerYzde8K^|1Io)Z>a=TtFaGu5wRdwQ`% zWU|h>dV1gdXQrm6CTC^@t_G!dw@{GWZ{M!Bj?B#X^zr|q784ZIl%Z}#1+n`uFPE>6 zWn|oa4XCQ#v@bElh)yUOVscVsEQ_-~_!$7R2$ut^(@6}}(kdq^e8=`PQna?NwysaV zr3~OdkRr=na$)u%|Ls08Q5uO>O)~Tb_nRUCe!QbCcX3wO( zgfLraqGtT<8FiDS9|6hJgOUP2O>B|ap~1uc3`t=D0X;v61ZO)ANk;?Q6wa8RGdd+#AbIO?`4-U zhp3&|=Czl0c6mm6vR1{8$JJG_ZTLVbU5z2Y;~TTEO?yYj_pp!;!1pa?g)kyMPS1mi;~mR8SUub)}@F#9ltzY%{b{ zRi!j%v3-1qMknt+nM|K{eD_j~Shy!2Bg8IzwYf%o(oCI0IEKFa*mL1&`I$a1?<^lYr+3w{(xJju5qFV;^5 z9n1FtNw2s230(K7{iSwxj9pr5lMe3E3);(%(p@cb1143DWO1!KWwXw&Wb|xx`-swU zV;9(_rKljV4#7GP7{);o8UW~CF`)Cz)4z4|nz?yUfTP)%R_L!*1I6Mf^ZWZa!O9=Y&7jIn!>C`hv(d1ReBcl*XJqkn#GOGAV0>5d8c zD!;8JqI{d_4Sq0(fidpAO)r^HoS}ipipkuNJ3G{9G0X~ z(SblYeXQL&j2t37Nz1_y&IBW9{Sy`%LaD~&A+l@hV4N4x=o`svbb6VNReAQ~oyEth{FTm?(Y~~`hghmDNWegq-BoT;QErRezEmQR zm!Dr!aw{q3<3~NzOl%9K&)=PG47X(n9)A7U!7_$J@ANkCI8oJEmvohjGoddPwoNf& ze2KV-1$dfYUUvT~c76X|%+U+)zE?`qXaV3Z6P?!;?i2)uoyG8{$1by~Xlg>Vy@+~Y z0f*Y$HTk7Z$D3ioPcB_i@P0IMM23OnIw?OCezBJlR_{2Ske*%-_A`0&CeWNq9BVkG zya=0w0ks~43kO##-wVoKH|BcH=TNYSU2LbjMBkpwW?z=%rTqRS&&%Z5Z!*})3oe}7 zT*GAD9m3` zD@PlMfizKG0+MW33Raq{83%;C=A|$Pao5E7c!{6+wmR|k!V?M4oeb>82BODGQF{kU z6{Bo*#hQ8plTqr=@NfI{Fjny3@2vHe^IaRSK4sH->w!D9?<2y)4KTy1M_cRKP9K2- zmjcbcFSP8w8Zg+!uK#J;pV_O3!{TCx$ubjZ*?lRuG11nYqmAh%Bt?Adj_47myv}p< z8WKs20;}fERMe8sl~awqp@3}XbIFs9yx`2copHcg#c40^ZplEWyS^(>U| z;cz0@(%IB3RWN{n+W09x^=OWwaexHMgd+^^ia1sa&FBanThb)&HupfxfVBkKD~ zEYsQ>@>d=ObP;ds96L(Xpuh3wWu%uh+E%^YpG+gG^)4ybD(>n;Hgub;&Y z89~-gW#R1R8U?td*0Qd3yj{qkbnD%Y*q4U)UqITBZx?HM-Nx>>4?ZimAWl=V%Kf2# zAuu`=O(l_aEi2qK{}6aXHHzOAv|w=4uC*RMZwwBYyJ_}$ZXsO4hQHLA-oA$YdsvlV2$30Uin z0)asR{oK%f18bUY3~3W}J7(1q!~%A}WuRy=g)H9%KK(w~0Fq$0XYHu=A;Z=Tgnw}E z4-L|SmCjkyNOfScTheoOEcP6ife0N>S-6L3w(kBJs!L4JcarCEo*_d)KG{g}7TS*Bf#8+<7~=PYT70-XA7 zp_?SqWYo|p!tE;Cs%3e6dPfd=e|}^QcL(LCZxB=se$A7(xxEckIYkLAR!K6c<_z6U5cGR>jeX?NHcA^&5mOyM=pc>8 z5aF}4fi4e5*YhJe`16?J_;+t|2)1%1Kg&A@6tU+xfh}NjlvOMLsphivZTX-5M@r82 z+M5+#164-jMXI)AZ8UplkOrz$SfCK-EqKlN%;1OwZ;S3Ojzfak+oHBgoWH0DyjsEiNOp{l4@154*s$y9trzK{qdLTPUK< zYK^qDKWgP#-yTjjbBLF88}Yet&dzt_SQ83hZ^7j7!Uf@bkCm<2 zZ-YtA+w!$e+)F3cf4 zO{)R|&pZc|h(q3Non<0j9$L2l_eu811kPi<^F{9kY{ON!$Bov5yxjC@9wO?|>g;W` zBW3vTuYVchr;?G@3GlE}ML2j3k}DZTTzR+3ax7_vGCS*rLm_ec6rmew3J+ood#w|n zf0+!1wa$U#&SQN_;G6V|BlI!y6xZS|fh1yCOW_|6i0AX2eqfC2>zwAM{;2sE920lq zw@h<}CT_7FUVFR}!_w&I1A?+Ky0RPv-CTEJy#H&Iy(TvDK_tbd)b-=S@$qlfHosT; z?!o{3vmh7K;K#qmlQBkhl)C3(YC@XN&Q@w)ikfejUo^Y^9H5|9WcnVR2uw%bpIoru zCA&BMrbf5z%#!3;AnU5ULkQ6t_L?}Xb=#phtJY5asjy0io7!+P`>i zYt(q4^oqWxAn*D!ds46t-pi!@=VOmm*5fmD}3H zJFO4j3k-ZlMn=Y~U)p5kK9F-+jsPFa&JfElEtxzkd-E%_^mXHb(FE`+468j|Q&V$x zmQ$83yVAm2EaF*U{`TF~?bktHs5Ol5kPnbF7~Exbl;lqm8+2ZfMI3H4KF%3EyvF|U zxj~BrwcV_DZSAISgI9!_)4db4Cg+@67sUVdBR)r8_5pf`?o;i#Vb2mL%h&E9EIbr;PCs&XT?!;{pr@L9;%2L@t-ZR?Z{e*x^hKJ5j&82((xU6*8Y2TAG~T0+ zUv>J0?#a~jVWFc|Gd30kF*PtaBPi+~_KsSq`j?&UWEe5r0WcyBSB0?)FB zMig-NiyN~*MHLl3R^%YP`+o`bO3UTFWrb^nC{)ihYGtyO7#APEc;VgP;?lSBGAHL*!(Qgob>GsP zM1Au=_vYL9o`;^oEIv8ivucZv1tCQ!-G3KBH}V(}K?HR_a=6v`1zFu|j<4Og$uj8|*bY zGy~2U3es$+qu6CMHPtrNzshq3{MFPP?50<~ekB_j(SBrgm36vwULmvYV%PYtu|@>% z$WlIWtM2DiOynP)qFwA-wI8LZv(d5U`yZ^~&XW=pf*f}skDzpg-4^(mPxk1703J$Q zZZgj|-lcD*Jv(i6Y2r!vUEQd)34@ES^E;m@gSupa=s5YHY;Vshj?RGr{>H|aK0a!1 za%Ol#w>PQq{+iNE338sT$`=(cR~Im5AMqqy)c$w7(t>~c78)aGX0Y8w6U@xa=O^iI>^gi#02STR8*9Vr#1_y;kI!wj&iY zV<0A`8W`qgJ|7_E!uH5lPExRTG4ee29c#tD|LNF`1O>KxBRbb^c)PI+BYid(Q{|+l36UXVh=~)!nyepe3x20keQj%-Ue4>raRu_Nc_LIsk?s zmH!jgax&wv-j%X{d5#wd=1QSg^gg@KmV}#kSVu-|YH?$)9%P-GvPa4auv|4GP34K6 zTnhhMs($NT6}T3Q+nK5xlJwB#Nr>5NspA!Du3 z^j1`K)v=KK`IZ-|;U(}4|3TSwW~W-*wkpX~6}Dd~keNjNJIB<%bU9SvxTGxZ+TR$u z{(v~(F0`b6Mw!H%MKo|ai4Xoy|4vd6BTJyD|8!C(LKf&Bjs z%Sn|jV4NZS6DW~!_R_mfzr<_-1=m+5H_t@)FPiKmp~_7+EaERKg{c!V1G#3a*qYdEjL zE%|S_AiYd%(F*r&T&aAb5(FPD=Q<@i8>PIV;C*u;>?A&M*9^wN70Fei2Ra7Do5FGj zT<%Es5z;4v%y|zTXC4#PKBO7~tCTN)fUinVxI_|KlP$Fk9{yFS0Cs`3_al0)Fo&-3 zCx>QA9aZ{02Qv@=Y3H#*K8u();xpIzE#7}QBzZ_XL6n)P>3oD-G72B89#IQ57$aNk zTOc?VOXby&A(+`ekLMTKri@e`Km7BX{9n*Hy20q1xEC@^V%v-4^$I0?z9R0dRqsTPlIv^KCxC zY=BR4yW1mjxCPEoa=QBE4h0qY{Ql0zwJbmXnVRpr+jAT8e>1k-jM&rF&l`+QKf!qT zM;g8$JCWuc_c_~RHYNWXb94kr-qUyc3(bJS6`p>`t_oVYMUWG z1b~q_<#a;9DUJoCdu&P(^#`n!30{2wDPeA%RamOOwxJ6Cd{hF{?LY$7weQe_0*Kfc z^x8%r#2xwuRW3){o4s*=*qAc^HyNTl2E5mY$9Z&?AH7(My(3vvSor)FH4W`9Sm))a z3SQsVWYj{Q1&q&!NElb)u=NYq6&kC&TFI9udf!e~E_$TqgXNR^s*m5X-2!?)?>+}S zGzLpPP18a6_#D?hW)8`m&W+oRdF;$hGyfHqv|Ay$$`4}k+mJc=eQB{bv2x7^rdVX9 zS-ZRbEh9aZq|aG1L-0C*>%cu?{N(XL(0rq7m(1ylij}Nqt$izf+%G;?_|2XSSHzXo zP_6muWJ#{jE-^VCMag~w#_hC{PY73YiFP0lpzT3jn^6w^tKxd^NQ zA&IHWDMF}-%idyoEB)TiSVR{qFkTq{e)lC^SM1eBYJ#wd9ca)6!L=#_UB8KogQ9l+ zL^au%sk@Z8s)}99S!g3RI5XJ3S{9)gjv|IEuUWFDN&0=e+t35ZfQ|*OYAm`!*S@6q zrbsWKbxt-+{m+Rl77nkSU_S^{Q7v9ttV9vH(}Z*NO?oEF%f(gFvl@wIF3FhkaW!P^ zyHc+7r^)n@UHyJle0Xr+e>&p=@?QQO+8GKq&vIV#b&kRm_~-s^8~&SoBnggc5FKfY z*p@vLrd58nSq4~BPRuTRblk0Yfzdd!v9THYlKCeNV*lx>Cz-bM-O%cP2zzN|TPy%y&ee0#4OEv$E((55U zu9O5Y2D&EJ_+v(Y4GoXYt!dW9a-+sgTjw3b)j0yvg8khY8oFSgwX-5!(%Z61-hWJP zVhQTTb@d|kTZx`F-51Kt=H|*_@F#e}LO!12F~!qywww$@9nMZ%DSDjn=|;JSL*9=U z{-pf?5DFmYJ!26@uO|4hzTzlDS2!^&u-4y9;l7m~=4}B|m<@-; z!U5iAD$jc1Yw5>P;LZYnIZLn2n^zl5(3n?!gO|C6FYwS#U!NOsnhwd7U4ROgI8bD< zArVf+&iV7F&>!E)ti(iD!A%Vh4Fq$td=>#m-aFxO)Y$fJ2+G;GU-OuJ3p30l{qjqo z^B(AGIZ8=#;2|}Ek2*;zti7t1d}^LQhix}&6@Nmo9p@Q2PWBsSj+fgUeTu%wrh)T@ z*LND>zwBP_?2})cpN}pVbU2Ul82e(`Oko6}@3&=kYo;TTb=-FoPW=(N z`wa2)p~tQxFpRir3tY?cE!$8^)W`ZZ;WGDULG!yeK#!4vk5|s+t^$ckzxeH7I=_8$ zZh%K`3mVyI5o+^{vc7x|=yTU>?Gq_@JP6!rH$S9!amIFJV`Vd>k-ANVRbC+RobxfQL%i18FclBeQ{l`zxku$dsylMU*&e$vhkM|vM2)Bm@bj?`ycorb? z^H=bNJ-p%eNO9C^O{8xMwlxPA&I)juhqJrd*aH74MLhl_0ZKm!4jNa1b7JCgiU-u9 zyA{bx>e;k$@)rs5QYB8{>Ob5VA`5uy<;BHCJO}W^tW6y}4xH`%R%Y|#6A%y(5pmp_ zs+_HNIaGpl4-BM>S*hCEc6V#%QL=(V&{yBST8`vm@Tn?}V2?;Otp#?O9{yJ4=KZ5YJ%<%B;#`n|0mu5f)!gX!1LoN9N zGjwijY}^ugFvE2@tqnHoM}m|oS^bYjl$ZX5vX?ijoiuH0U~ck>?{8@V7#S26v)Mgg?^B^*!vX=x%Be#k~k=;s^aYw?;jkL>u^DA*A*59YL=LsAL(2@vFwhE zN)gDR(#+KB3kA3M)V>ybA>g~B>RmqzS_4j|3y59d%-$A`j{U;;O2*RcAp;yqHH2NM z3*J4Nol(|$86^CN1zTM9-PE(s#ncNR#K+}T$kMmn(0T!r<0i!@2Jq2gSWs|K98y$F zw3r)%9p4y^tEhN8fo3D8B2Sc2-j_O#PddK#$bWXbKCj4rd!|-X=9uoFNv#`A7ppjN z|4|F}%`_T&Odh+ALR|DF2~;DpK?FTkTHB3DmgjO+yb5~*K8X~l%)ev_0KiTcfX5N8 zVHqdtaN5mSvF`)-028c~o0|82KI4Qq2wHtTCo(E>B4u4K6#UAxHw+|sz$LYTJw^)w zy-K^;P30veFZf6C)!><#$S+^Ne!H(bqW|b-l1z~4w_>a2iOcaNB^_7m)h>K$#~Gi$Kumypc?|X`aMGVFgJ-YId@{!;H{p@he!~W7g7&o<`P2iaV{s9Y`?P>&mei{@xn+-+S2fII zBgNt<7;g*oY@BC|h9)$EKw?Gh;QVlPPzR&)K-2#;)3eO9R7>zAer_&qF|M=_DB8Io z9$vZ0_wXV6{ZGViI$MRcZ1h(0SW2GgjwFZmhK4u-4lHz>x-^-}ZjCors=#%?vp1Ka zHe$~WTu}z^YL z`yIAx)q?PuC@RSEFKTM)?75qd#6Byy=!)*~mi`sMVqc@dAH>yOT(lG{0q7F4UxBQ$?4k}2HdOmWuw zc=ggjVC&mSgn>cxRrq@oCztA!<-KC+sdzUWU=)-zeTXtMFJLbc~?qkW# ziihPy!LQd3WmgQJSMX|)v|ld^?d+VvVzEs=NB5t$WC2V045pi5nFk>5lRzRhcp2dJ za}O!*Qr2SBXg{&}`-3Ja6}`PJbaZre z-P~)pJVa{`u2T36#e{g6KU?e^Fk$Ds4|)7Mk|I}Em6qKhy2!~(c1FdJe6{2U#oxV~ zIxkORM1fh#51i9t=&vU;xHIC+Bp#IBmGIEh!%;QC%3;*p9PHvuXnc?I)~yzc_8Var z?&!&TeaMN4@1ULOYEqMQ-1%u=8_R&XY}?OkQQ-+43ox9PfwTQc|_#6Lb50C{%{_lK9Dm4 z;LF3V{QUg={r&C3z&nc58I?lLiiI6PJIUS3BlB-%mkG+Zg43ieI-_NL_^9TowGFQ- zAswizH5?WA$n4i~Xx7CtH)8&1HVkAc^L#<;x7W0TC%S$`z7zHuV!xu1CP9Yt-2d6p zA1f?c?vNt5$-?wbJ>i1RdwzYy;v*{{9hqiEd|hD*O?q+}Y&2sL*Tp8Sr=wr&ZIUvJ zQe1vYV2~nDp`ethG(Q(&!&`6M8qJ>_D4RXxwEX1F&-!)cP8rv4mVeqK;1gF}^(f56 z*w7f8!8^5|73ByiOb25YO8D|i!<57!jrSt2gE=S8a;BF_#lmIgsQ0I0R3|s^pv<(< zr?Y>9QNZM4_X;cMmi0nY6PbKY;5xzF0l1Ixk~0XrxSJL3b9c<<1;TCr=U@KMPet-E zWWHw#uJi&;fgIEODzksKr1MRkw#Cn_ACe<@JUdHTv5dx|ywA5aAvnJ6z?wJpx6bio ztt{YjS|%dmo&2ASy}-Jcw}8!iA?)yP{$noUIc#k*5li}IuSG3ZqoWuFFOj4mKBES9 z89y0Q)SKIT>X+Zt)3uCmVXk_UcngLy-fjHppwgPYMm|{zMJb+mO7U{1X?%IQ5tjvDIFjnwYtlSn3G4Yn%jhu9)a?rX^^{v$T6sg; zdg{P)cP2Qcb^fRcD62rk+fRYNnwXYkkf2x8biY*^eFpDyV)2{6hpgy0P7lLkVotflhap5tvk&GSEsap@n zZD=bJf7@vj_|N_rB4Kxzixhmks)GfpUEf;|G}W(d{?#FE*E03P>3_II+&u*E5xI;3 zge|qJDtfYz>fXN9z+(`#(N0{O&nzbe#YW@bkiT_B+UcWrPuJvA_hww9 zKkCpVD3yW=aIbmk_Pk* zDBU$}4YhomcX;bvd0*(5t*xII2^Eyv`x=piFK zEkW8g!h3*m{dw2iCBAU3Nk!|Max{?{WD+$j5yj;ySp)d#JH!)_scxM$Tz;PVfx%oO z`xPqmr+N})gZVOR&bmmfO$q*`i)i^Qn{al#%>d3M?%7I}v-n6r;CM>stuGuF=~Qei zZs)~xK!LM?^N^8mq&(&eyp5;i!uwBkBizF^w@IyXP&6%RP*mAclx`OC^)b=bd7Jo5|LMyFh zWIfASZijbw=_~3(fq=Z6MjY9n0;0G(q^?UD{bvWoTU+>P+Eg#$zaEAeRO$pSv=D9O zF7^A0)t@Ivf>)nV@W)q3DhB-OrcOBP)O;?w_6`iUkGTe&z(WJVzLSm~c#!n`31a@9 z8Dv6m4?XJy%U=0JP)AG^bS_{oZNYS=N|hlVQ5Eb-ZDZa` zoe4W^WoB~i75{U)a!gZk^*4a5=f&j83LJ^kh9@TG1>AYfe#f7>Sia}xSW`TKG4@AL zEVz4U2w^eaO&Bl!*D;1L+a3>FSBUZOkqIINzo@^X7?#lFeOug!d+eQy*^OCkQ~D(8 ztUK354GwbVGBaeNSpO2V2R(ey*b`8x_e;DQjEybU%hgDxWL&(GQfZc2~1*Op9YJ3syQ=+wlV?|Y`C z+;0o8mRyQ$&&V;8!c=q+rrfG&a!MyVv{vue$HhZxrn>aA_1Rh#r_6c?8jU80>vLFs zJTs~zypAOVZmi$_OWSEd8zx+!fTMdV7iNVYh6z2;Lo=+czoW|XcCkW-up>Ih(rfilZ||Y5um!(jP{YOz`THcVG^-$-GwSAyNGjH) zD5A!WmoaXoHBNhzck6(F?hr>|&M5vHKZqy^&2@obW>olt{I6xNHpQU$>T?!+(50O6 zP!Q+k#!Aqe7kj1AG;<${}II5|dIsJ)b)qpcvTNTGBwYeWt=iqWncyxj;|G1kd`x#`Vsqvr(nuO9)6}@1lB0 zR7}jh>-d_?Pe7q>TOl)|9*gg=I+dTm?c#?dAZ=$y-N_)hS06Jh&3}=?#{|3D=;t>{vDbFK`rmL03!0iiknXYG+B;P}4?n@Tx+DcxRAcWQ z$wAifVnz)Gj!(pEaCfw_0pb|qS>OC=nwq}co`mvs$i+$y9@r5PaDHxJJM~$*%NYfq zCquyDU`ZYxJGuAI{GWL%c7$+ZI@-T}jY<(Dn>y~6d2iV}-gEC>PM%T>7`Fbn46&S^ zfFWm4P*he_Q0P}tk#t?<8x(x>NbVvy>%!_+C+CgZ*g2Ustgam&@$hSPfPGweL*$| z(S9AWNJ_;9^Y~Q_a5#hT;8R*c+RLyO4M_!F7JB;I%<*YyJ`CQh)}Sf*i!Lki2z5@g z`$3QY^r#S|R(||g^G1crjCtu$2nsBnJD^bYj^37*SE8Cv!F#LeCnu*jBN0c(8|yu|Q&gW{nwKHH*PC8n;eIP8K6sEN<0~L0#$fRB#J%^jq}*iwtFHL1>;dz34y>$1o(RfB6*M#L5e>JtwC#0r?-jIrti3GnAodYBNTD zYI7yTp!XZ7VVt5pxaaMakKlO5QjyjhNQPqHool3(QQj6@`c+paR({4)trONsRk;bR zcV@khIQtW|>FY3A^6WYunbeDwt$%W~p?{!;ImB~Ovs2K>a`CfiL&J5}WhJY8{c(#s zEG&SrvC&APg!3#b!M+Nan!e#g2Jt;!itJjvFUbblXVpdY1xhWgnXg96oKkk9u=-%FOaTXSq z86#tgSbl-gyAmmT24q(r_1Ps9a9INfIJN`2ITJ58_4 zf`W+5kSx2=I72A(YI%t^0=`0yHFCu>hhJRfc+G$Mt`o**~G-ppll}XvppRl4UVb{+7h6afwY8sj%UCo!K&ZdtKnjnse zoTWC5*KsC@Gy0Rhul$H&KN;M)fs1u%CR z$+%X5H+`!Euk`V}F(Y^M-tTqFu+1CgXTvf6*>kjA(afdEv05!<>V{xFZS9fq@w@b* z)ZVY%OaI8!imIjXsinn5AKr%jxbXgT`F^=_AZDZ+4OdotRbSlbGClhB>sK~UKNACr z?`1#Q7~|#M*B1kgLIer(MtMP;=}#?FnEn{wnA$rY8XFq}Fnv&e_bM-BSn~o5UE0NF z?7A~&SbmmJt5zQ7Ow82DB+bM`k7rCjcAjgH@jbnftSg`eDp07W(;d^s=3Q6H^IdF^ z?%JNNo=vzuUG<^F^~A={50~gNhx8i~KUEEO#}miB4getIso}+lGU#5p@nO3KzWjHZ z?79Eu4#G`s5^={4tGGA>&)xr1}e9#nFg}i-H7^qEX-qz3@hujuQd^dJ-+o%1Q zejt)cHqc<%`UQL3#QnzQSX(nPuM1G0+oJ%t1u*JhzsJC;(BFLYD<0Z1ZFu_wbGW7| zm?E{72WULAQdIQA#nxd5C?hR9<>U%jWUP-WExNRL`)Q%E3}I-ho0NB@eflexlt)@W z)#A<{pe~MuCqZ;uX%g@LtPZ3z^1t@lnXAWxID?oszuy!(y}GiH=?EiGBfoX)D&DRe z-5EXdw2K2}KySI3()W>-*VoZWT@wM%mDI2@0hEf7VLoaE5ZO}0d!ml=?uM25xkT~5 zLI_cXHCJaRv%I6pdFOBZpIz2D%|fp3^S**BZ`JaC>ndq0>1 z$QN#9NV+bZ;aF~M{XKLz@OAEeA=FuBYfOtXCej47{V1;0d6p3h69Nmp3x7hl5(k_% zG{+-LO=~y(mfcfRkt}8Mu0nyvxO6cmIhmgJ{UxYBW<|c+)dQYVC`9`w#fOB+|I@9x`PXV0X8LV*`>MGPQE&>)>xKLI?YAQ25 zeX0M_oXj72IeBs!E)*7%a22Q`sAEe##^9vV4V+s#n?EE_?cpULi1FuX$i3hl)#z;g69eWAKrRD%b)n* z`udiFx2aW3?0vhy%Yh6d_)76*yAj~IpJeo6vk}{zqM2`acn_7vQ6@eO-8#VLSirQi z^)}4&0%TE!lo7`@o&VU-0$RT0{fF=T@s+#!Sm?nUm%7*u&&$#*xUzQY!j`?8B%2RNW=U5aQvlO0sLA z`>fIS37^<|?i1E)a-YR9Lo3RN7EgBHgC}=uH`44m-VNX3VUU~s^!|kLPL^#_bD9Lg?+73Slml_^CU)_kewf~X;aC65E|3Eu%O683q$UGVspVPbfbFq+2 zvwxi_1g{WV)pLr4Sds__5LJ-9(G*Q4gjWWD$D@fxO<+e5Nnx{s|88p3g(x-+#BSd> zcrk~stalx1V~>xyIuq83d*)o66%CS_N&{4uFkk+4Y$$-mtb4b|$T9bYn1N>>3z+ZC zggdRZ8Pt+Q+#`J6q0dn0M{;6e311`r+d;mo0~_JHUYXsXG%3MuM#gmGvr2w&*0Z9< zutUP6q(S6g($L=@5kQ^UA4xnt&+rQ#9#wR*xkQaHg1svn&#n{zxZVU&-{>Z)yH>=^R7dDmvcDO+(D zOb{F*3ve6YVKMEJwj0f+tQ9c7qb{{ry z1}dsu#hygF2ozI9HQ(En4H-p9=Wh!9!|wFkE$@_;QP1-LR`Hu{XBTgUOY_F_?AKti zl&*|T%RuUeHbi9L>~02C;OtU%c(h#KFl=q|e6OoCy$snC>YW2_sd;2hP)RUqsEv)-Nh~v2f@^{h zX?zVV?olLCIpYPmL$qY~*AFIirk7p2pMb2csj)uIcYvmnaP;)_O?ZmY$ua!{Q^BR$ zN0;{?Ps6O$^xLLeXKE2n)&y4o8WwIx?DO2pRMQq~sq<*1%h{Y-1j43tJZJVAbxguJ z_vZJx%nxl~Ezr*8LW`Fd5Z}@wXo6-RGrD=@fcuI8c&XKPV`V)~hi%@G@>AmO<$G#& zGZ@ymj%F`u6>(}t_1b)E(Vo0~oSCW*qxEg#Xn3tsCUd|=rlKuE*NP5_Cg>#e}L z^YYs6wxFJG$n;=AaV!syy1;`xq*Sx#*mubC@7;LNeVMD0!8pLybh(WbyK@lHQIKMA z17agHJRS9)-At50C6%N-V};{;^=;uzXr^_W+8syz^>onmx_B1l_?`K|d*pgl+*O%f zrw~?CoC>fBxuC`gREgL=@iJ07psCQ3Pbvrk-RV~Bx`GFnVmbBq@RC76L3uaw4jpav zWX}FwZ?k^I>mS7A<>e(LB&0P+D_QE-$SHjJnWF$CM9@lIR2i;oo*CwUzH!K>_kKypZ;A8iea2VMGf8a;tUHr+#Y zX-NYo`4k0CYp}RQ4-cnthw!d!(d&|l2*@KvWld#8MGNgUNFeqP$=}3XD`>9JQEPBJ zGO%MyP({|g2ucjTS7edJEySnkOOOqbxUNt9%}7*{ZUl@xeV?s-{eXP-EIu_Q6}n4E z_15we2>KE?P_>?xmIjV1k^pAqF(W;1B9IQ8^!~bsp|Uuc+T}M@rVuKd%%B;QqWQQ{ zE2-AIW2H=!=RELLQT)JW_81Hxx8~@7xY>Rp_F$;UD$iF!@!Sfy-9;U2eEIzOlcc0X zPi30z9y7aWtw-xcGwO&usk!0c&=IG^gIyW^QgSJ`-P9c-CRKWa#oe z7UB<6QIu!j&l4D&$u)?xGc0$mVfulq{cua2bvbfxu_&gE6BDvneSLcwJr7sNK<=p8 z*F&z3P`h~x%HJkx*251U44}UogDfpA4G;>n`&4yfVF`{x)&!Fr&l41|;;`sgh@tym zfyT$3%V}i>3y=#wRhr5%hLvs~`LxA?@l`ieayJ7|V4vt^zVHfbie1+A>dkCx+ZfJ} z-~DxFD*?5?1ZPK|WM?(jA|2XZ{*h(5eT{G5s65ihug1C-fqDaCG!nQjU&{gH3?sQnu-HVMB*5&@duLev)6n@6_QO zx`L-AY*Jc(Gyrv1m>?RN_6SzXgNaoqavl$i8ob8hH>hAk{3xqyl-I$R$;A0@R9`R=t}o1)6z?f zh0X}MxVjDwX;;hJT(^JwU4}oMwbzQpLe^&Iaxc(>pQFL(*5D~D2hGFHKCMAL|L)-uFm9DEt20}GP7WnpzI?g(!uyJqxr-WA z3&FgnPY>)xCZL8-n|}PQHFJg?UhTknP4mRGyq%jdxLR|DJ?`zCL7%iDwOC3NdEd{N3kBvVM7i^g499LJ=oF zskDaf?&~{gOz@vbgYcI2Cwn@gT3J6smqy33)V(@7+Dn3MV;yaZ3@?cl)BQWBvc@qu( zu?AOTOc!gD3I6F*l1(EHFz9xMn|Aj}###q0GIzZtOFBU&-lE4{NNaxm|WBVmI zMp{Gq_UMXpG08sg;JmMtWoBTa1mFs77am_Gs9U}{xBEJDrlh>w0A4WjNSXK>H274H zmFONsD72)*GSTdrJunN+vHv{s?r7(*otIE?u=@`hWu*S0POcOGj6*5ApV1diTc!B$4AgID+0`BA;taY=N?qY10Q7b@p#Xug z+L=!WW7>Vi6At7{bqB?}dG&=}<0uD`YJ?do%uv76_3yvzNt_~(Gr7!Ff>F?xt9mHPPhzY^YYFYC+i3PFmMi3`W8|yQ9{)XSGx8o`j@Fh%_>2++PqH9;H-;fMN_m%0-_BxJGU`3(_vGBkFFBEIE9R z<;=N&2zC#6le(rr!F*7Xu-o1O2_dl11fas-YT~u%^4^*C;i>oSd_S1um zEHygL2pX)9!PeGZ)cqYpOGk`H@ z8-ndC?SoVL1C}ekzu8`#I$t7!S<-4CW+=IyRf)ickF!!Mn^qea3$tx&I%-&d^=GNe zdR2Lomk{QI2wpH?HLdZZFncl?;^#w z&Z7rqb$AqMsA;u%^Q;ji&xHus#M4&r6|5A5!!YH#`#lMM-p4xGT0gXLEL~@|%#l{Z z=fZN1dgv;cx6@mO$>;E2$A)xuk&p{{u}qTafls4*Ga9pA@-a1x}Hi%P#m&As`{PFK<(|8uj?$m(fhd z=+$lB1#|9c)c)&Q-aAduJz0HyU}C!h7QSITx3kfal;lk*%hq&oq$Xu%ehB($5^^VW zby6E#oSlI;8!npm5zBbf6|R*(1W%5H&j%WeB=$E+__v!j5jF#6>i@)l)wi~=?=M@| z`q;>dSp^j!^23tgt*H^`Ah5le;@Q`m1RWlVS(7Aj!c2$ zfBy-cwsL(>hnU&`4XFbortTS;0{r~TQMg53(1SAaGkNS|^Txo9DXn_Hye$>C>Mh^f z(!P2h!4rxcF|?g197on9eollQ$Wk9twksxT(l$8+)!Mqi$<^Oiny5ol2#S}@3y>Mq z@(GsAa|rGm{BbHy3}L~}>!taE$@4I?=fCd54=C*4ppPr4eks6hB0O>@-5){E`3zVK zrChRlkV1OxSs^{;@EqU!WQy&HEwI+pYozzU!S4Ho>af7zpQSx+GjUn=$6%Y z`a25XQ98=ISRdNIXYTOnKiOThB-Na*&;ltRNF&hVR;Q#8JG2$Z>*Oa`P3N`jaW zw>Y+s{?_B5l%;p*J|Y!#->fnIgFn=)4_6JytbK5CUsnc+sia7>FTVnPMdQ*i#!p(% zf~~QUQSu6PKWpy(rzlpQ;ZO&(9pH0gb~c`0Y43zS`pdHGRS9$%05Y^14`){L%o}XPD0%}9f2OyJJ>l#?*)=VvIYl> z6CG2eOUApAC!RE7Vg}V#j0CI-7>++A2{t`WMDGxJ$Obtn_3-KO+Re^uZPUW;(Kp!E0aMtCyTOze zO&k#-FO2oj;-{JX>s0q#Nt;ab=W6N^p76K&YKI3iz}>y$G>Z3_%B2vkYe7c)fBB1#R4dI|4jtWzxbBQ& zc%vK)3|9_5kv+o>ZC(UPc9so?sFLG)_3i|W#-FNr*AW%fw_6y9ZI$>x81Wqxp$nYHV6tjrNx4dYm0s{c;ejneN z5sN6g_dtu+i?rkVOXFVu6KvA#ys3BdMC3HE>aUx8bODzdo-E`j`Sa7o;JR{*YQ*G> z=e48(O_;`UpQvMH1>o`;!d0~gRmuwW;xzEqS#P=|9r5GKu2>CWtY!D9(8z8vh8F)@ zgHzR9z;Ux7MB@r+=H70OOWA|BDpHxu224G&)N%{%fB+Kkao5Zb73{l2!Fs}6eO|Qg zSNQ5Z{rWBiqpk!JOpnySLx8E5+khd&iiIxVd8q5F<8}yw=+Z+{2OpX4zepVi;l~~1 zw*!PErgU$4Ir20@^6#yK91~D+{i_74y|j=H;hpNWIyF#qK98UKP`CnVt{q=G+8MM| z&&AEx;J0YGzOy#o$V&hBN7^tL>BRcNvyMEIs=Geg5V7hk0TKIF<@tY^nd;a{zC(D% zciMUJ5J~rY^>(yi)erfr`zb2l?tUw-u=Zl}lQfF?7hJkT+q3XO;<)F)!NxaqRzVzm z*E1D~=UU#T&_+aHFsVBr7Ur;KjIc%9xx2Tg&apfdv|$d?tR2m{_%A5*3qK<*Y?ZT* zVU9qM6*HMEb`UwTH}S9>b-|Tgi``M#r*9N&<)78Rdv*ml*LT-F>-=$82_(;+Ju`dCer9IRLzIS^A~E3uLM$vSVx{MDT3A@v zX_(I^cW^MjDb#skm_GzA&-LA~u!tyb-q=_fSu|K!x4CU~^xXASUr2zR9eKZxil z$~wDRGK%x?bA$Q#1Q0?TdYifYH$V&Uzi=)dt`2|rv;gy3I#@bdI=Q=HVEO+=>SE*U?(Amc z{QrUa-{Jp80HX+1)qiRHkGwcK{!7BmUEUM3;(uiKKSI0d__$c|YFWBDd$@uvs=58s6c}p>2Y(R*cPmo)XPlr!TLQov@;^gC(;N$xXs_JZEYvuDl zfeP_S2#WnTP>c;)n7Nz%{{mZpC9IrX9nCPD**cn8Tk^U%Su-*ID`^Q?X9s6j3}Fm+ zf`7PBRh3Y3a&tFx0$VD{NikuTz+-D`Az>yUC?+B%D#k4!ZYIJl#BV9UEiNV`$ZaWP zX~xIT2Nn_)#famNt|a7~!5%llxS9XgYb>0>7##nLs(^?kn9oYg3^U!zoZCuJh>zP` zSPX;B!kphiL{z|B$lT&T*wkHZF^+5I@L#dsaAk4Bm58vV6~Cwmx2UM7CAW}>r5LxF zm54aEsJXC(pdi1ckdV0Ljc@$r>$$C)yR)m$Ki;No`R1Qb4z`Sc%tpcteB(J%Om1eL zmKgefFWUZ3()iz@`_FtY8%qqz|E~J~rq91*+?=i4z06!KpIQGgqraPq#(x}!Q9zhS zn2}x83~cLk<3b$&;SOwL=45S&+0J;Gc>m9r^S`CszkL2*T@LTfCiYiRy#H?<{u%o( z8y;r$e=cEm(VLI|?%wT!Rc+w^G-nKIG$+yi0sS^-wtDvlM<1O)~RL zMA(y?;WdaA#Md40bzZY^Q|POd(XG}krAT!_Q(Rw>8oo6*;F=p$9jVNH`&K0h%M(>; zk!>4I25VY8uxH3$+QcT~#<*4NLe%!fs?YMx@ZU$_qL+sS5T;P<{i8RS>A~D%|MTj*@9Bz5|JP2~vrKT%k=6vyYH42ah?$rSN#xC^gDY49y z@vZ(pO4w6@J}*})s0GrhjK-=5ecvJ=^iHF;Ya(1H{43=gRuiEZ+vF57lP>Jw9wv3% z7f%>b)va@LN|4sSY78kqWqq3H@M{`*GrRWLKB->xP8rGXuSAB+GB<(Hfhqt-;>4Ggsga3;BkqOHxaYef3^B3IGc7)@mN&Ix*%eY7G zum06{2lcHdhaaFiR9FySikNL#uJ3PaiQdE&Q4#!WuXxzMRm39wHD*4mFx!L|eh$N- z<-cRE@>j@JOEFgdUv?VWCBM7Z*v_XYxob}luNp*)$rAjr2cRs}rc7*1Hg(zpS{;JD z04ij%Axq)?JEjf2!^MWXy1@EGhZzXYRV1lQQMqNg{Fk#%uPWnykv{TI1t`C%cC~M6 zOaE}3#^~OJqq-1hOOe;l;~m}$IdVFQ zaest79=R)#jL1$E4InH%X|v9kAb_$J)VHI*VmKZoE_)tN7Rp(Ad{zinGo~i zcEw8yHnrycxg%R}$RZ+yT#xpIcf#;E*# z^aAgI&M_)KN zPHH^V&I6^5MeQu~^kDi`Rz~&v>i+BoSEN2_Gtt%O-pd}(zQSL=eE9_xSX!Re!o~3= zmk*X-DRU~(vB&e(nC(sx6o_oawUu3ps84_stLrt`2|w9V1HqsS=R9^l!bfF)rg~vL zYo*|Q)|`$XD}QI4mtN26kxPJ)qtUM@iY<5{e0*{qb_va0%5511vLypW*zaUN za_LE8B@cs_z4E_C*L1{Cm&l_|;x&*+WS2T6W$AMjy058dv7@Pxg0-P+qPv8fz85ag zq4QQqLD}cqK1RO25{K0ndoX}cM^}3Kx{sVinDrGt;PNcF5it!9mURSR*7!Mm6mp#@+eN=t8jH_wb9qX^qsFKU2Eg zLfubNWFR4EeX%zJ>aXZ_G?*jW{BC%tyqpc#&X9Da8{$bi>ooypy&#Q?n5lXh-_wi2 zA&_>`dG+dZz|7Rt)a1+z&-I|>-Zlc1|M~OnmXVnm-#+f2WFox0>QZDah!93!+U4@~ zv8=3zuLG5p3GGVtk-`%S`pCRADT|VvxBhywFy}+dvq_|hg=Jn$LiU zb6Ftwp#(wxk~6I@(JzmQiEq(c${A~=MJ*(4(_c7>zgw*^$2)ekIMMHXuMY_Dm)bXK zFU8JPn5Z6iIVWor_s7C}dRSWIua5dEa-_%JpCvBH!}H1?B*xNC-V(Z6S6iJ5IT~o| zh+$@C9-+g=#!hBaPihMDZ4wY*I-GSL+M8~wE3H2El?{CwgNNr%%5pr0Yx)4>D!q(6 zLhQ~qt!dfX78tyewk&Ztsj7@`#e_wfDpWz9pJ@fH+dDeGM1+Om)%7{s+M-wY0!^wd zl)^SW7)=k~_oRWES=MJqnDFnOpEhrM6h^OIf(G2mejNtODGI;5R!~r2ET3(%9$Kla zRG0(roE&X!rS1t#W==c2(Ne(`>?uU@GYVdBuHl|Gk>z2JZ9U}kT6kK1uFJ_e%fj*G zNw2rpT>TqBz-19Um5ojxP9}Qn z64kgA69Ux6TIT>lnDN4cbgrqk3d}P7JxvLaN51AqnvA@ z=mL~48g;xMfPT_jPDxF@H*+#_>2nlk`y!c_{2=<+Dt+$WojvM+!u;m?dYiLdBcfGq z8+BOu4zmk%54j9|iVR&Z4mLi(U*PgHGTQM7y}rIWP(~5dnFERBz=FcU z($c#raqr%}Ld?WBllb1av?0`nDs=cYpS?vK^Q*Iae96jAI{2%sEJ=OokR9R?!z}`Y)>Ze<5;s>@5eILK;a)3DZ}9{^q@nb_MxOzIkn=e1%=l$`C3SU>rZ-M6BPy$PRh)z1Ns}8nFX7(ilX$V6c-_r zkQz_yg~RKWFGXdq8}hy9^N8t0E_X7WWA9DoGA@gAl6?7C;BEBm7Xjq-1uNQpu70w1 z@@2^@OA8B&-PsFp=v*Zc31QDou?DUg9 zXNYHxAAQWu;`mM-%_u2Jmo3V?TkZIihH~GRLpBP3$?KU>#>yA+%+MMQ?$IM zPrrlA`W8U-$8mb7D>yK>sr8kMJ!|hiMdLcFfd@6NQIU~)$YJHU|$6 z82!{BkjuS*vy9)f*HK3$CH9kLMv~G867FNdExX4X(~WTA#Fky*V-{KM=UZ!VI4%OH zoIg`hLo`=TI%Y-;+9_m}B^Y_ZQgGKZ+(g?jR3e^P@tu3a>&emk_fu3=RezF`OSG03 zzwdj@!ooMPcklxVUB?O;GF|YJ00%U=s#gue8vuWtxDY1-nT1egG~DKaBTMBWT1tU zv1vMQ5Ehx?Q%oM$6hrE0by0t1ybfaezI_)kFj;m|(CBQtfdW@}$%4LT&N0j)a+vEM#V7%~8@ok>F( z&DDy~DJ^AP>lmpJm{6{FJD{}mnO=Ze;Vz3cobF>x?Ss$C!MGU;mia$)FL_3XVoAkv zZskN87ap0Bj$+(_0tjr}vwDR|4MT(G2u)wmCj9gm?ytwL9(kkPF#8nR8mUm?l-!0} zV5^Q@t+KuLh$7ed+;u@sT#%9TqM|ksv0P%jMtU{I56!iBwgRs+0%|;v!_q6dKR3jr zXGPwP#BU^PN3L1`=z#Xr5zp#*)h6;BwVV{AIoai3AAbhxP!r`nNe6mev~Y9syE60*YEnVi;t*al}jOo}!SA-u9_CXO|&G0@a}r;%@UZ#dP| zK2h9##P`xEx6pxkjX#KiwS(4#1WK{02C~0!0TMxr7X%;iDOxe!1LB*?UVC0CHLG4S z+k8)JN{ok=v(&t~);wi;W>b|L3d|zIGnEu1c7Id6ErBmG?LUB4&tCE}24TS;-L>wz zF@tXqVZ$%JX@Z;-x$iUP2;kHjT5;SMe38Uh`;|!Vf#=jKcbjQetR~L&u3#j_*NY6VhhXwhW(;PTtqgA;(D#wb@;h%r9!1tviEfc_D z$BIbc8Yo{p0{8pFN{g|S8Is(bJNCu6nN!&A_-P!lG1RS2Op;|Z7|}8ZOt^^mEro90 zUmUp~Crf-Q;VK1J+CuQhW8C>d#~(<;x?0D%soyFAMJKqO7+-11Qb#Y=L2FJ{;^-Ru zeE}v6)NXXgA%yGB)J#7|8LQ)?A4d~!O58pv9v}Z)W&LZV?-BI(ANjG;48FVBl?;)} zqhvko=}8&ByW8n~X)1mZ{;`a@bAfUyUyWV2lBc7YCKte*1dpc8s&!h=E%2TN)33_f zhvBTDZizx#cI-=XYW&4=hymmfY5Do1cjZGKp3gzs_5RiDH6oDUi}+sZ0dukkQfkl2 zFB!=y@b2REe@dd82-a8q04P>+-`aY+{Hc?mC+^lQ$CUewwlZU3%b!0juc}bzQCz`I zRBUZU!#hRsZi}$62$jB`)_Tb*HXgXCL-&LZfLJHAd-2@Hpy5#A<^7(bg4@sR@PXPG z1CtDxk3UgbPt4LuFwrp9OwST}7LYFVYqXCmZ;b{X z19?~FFyM*w46f|blF_p=v!CJLUN;;XOuURhX--#HSD&BfmE}sWG;@{+c@>$vyt%&j zI^-jnn&AVY0la#>hx88O+$kc1P7Bhoqm2f>ywRgujO@?#n#IU$XMJjFHvQ_oqf{Ip zoo=bK%(-`g0$xAia`0muxDV2KsyUaMKAn-qmJI?tq`5OQ5qL}^XE`>C6W$s6+ngXp z%2!9ii-%GvABTQ=%i0kzXx&LlLTFIwPGC3kTAM+IiZ{4dc`5*XA^r;h@@(Fh`*nDq zbWXtCMpILBb)g^Zqd4?Yl8%ycuIvij^=^%tipwO?vyWSO`i0Kv)bvrYgGLi79sn}d z(>urd+CA(Ovr_pd1>4Ospn8B5s=qFN$#|O34@$afTfNh>T4>={e@Yg%B^KzZtbLhq z+Zib=Tv0RdRKVX~kSw6T$JQes_F2KsQCNRt%b8J0Ji>q&%6NHaHn5_S6cZOR<98uB zI5-Yums(cfljGI38NgZ|DSEV>D+#@8e$JE3k5Dz9%;Y7xKvh*o`^=4;jV%rR1UL4s zOI2))DWOI!zdSxUr#bEEoEV06GGAK%HLY%(&w#0zR(_avieQY7-R_R=8 z_md>RJzAfuOJs}RS!!ykh{)^f-8T7Yx3X9FirfkSytBi@F3-6Ab}}e1Nbey&g6gdI zpp|`va5_3@lMA*#%6~#Q)VaJ5$L`%jJ~?MH$p^MKjJ?9#*OmN z2mndC)Ha#Xx6020(aVd!3sr*dbj}O!)*3oDjf{o>ZS9;~^DzlhXfZBl8olUl?W~i% zZK70#rf1XXN#J2xsEVdO<2yPp>L;@^qah2zUfwM3RxQ>t}qHQpNMDQ*fMCl2tJJF z)A58W{y190C)?7)W4a2;^#8)O^Aq{vyqy79Nb%UWgF3g`35^Osqf$)1us`8hsPTh` zAdj%!KbdUEd_LPkz?v_W`JXh|!!MCX6Cb#CHWe-5tIDmu1%C+TrBO7_qem`d)z&%Fx3|g{b`)7qhv-PyL`O+&R1#)Kt&6IMMgNNI@PKHYM*ZP9#^rpiD` zUl?$>hQ3Hik_&Oz1wApLEbazl;ydZ%ODt$OZn@Ds*Lat%spjmo<&}{a_7_!ymPRBx zw$}e*rp&}S2SCZfWy0WcUU7Uez}?WG9r(Mw;8FJ83WMJR6~%2gT{l4E!@qJ5iO*n{z2GC}X%T>Zvc1%swqpVpwQ5XNh--Pf5ER~y=+rPFcw zkZ+KjLaoK z)njMIq?De|G-wmKHkj?!2J%N8m+DsqL16f@zayGYXYALz(hjaJF!+G1Y4_!Q&Y2ie z(DU}|@Tg4n6CdERMjH;Lk-)w9zi;5Mj4W#Kig%m>y*3fbDG=TO7e;*&L^hY$q5Nqr4UvD^3`0*klh&~Yy`zjb zRf+0X2&TnT{lYwTAX#oAcT!rGaO);ot~ zVElMSPLAuQkvn$%OhAE58*{st4d(tkD=%HThnDH!!c*eY-C^JG(p`de!dPLuWd(;sQ=Cyv)Y{N9UXtKVU)aGsv_)R;ew zns`bwZU;VoMdxrtfGIk^r;+NrJ6urjo_Z4*=&Iy| zb2PRU!BXqs(G5pMkV}-EKhATxxvlB|B9m;1=Y9?+1ct&$M7YC$ib=+m2kZ=g2lcCtP_!RPBkg4nS+Z&ZvGvTXvOiP-@l0d#Fx|S zwFiK@^8NP2$;(8lp)$gG-Tqt zQ8+U*^U3eA!#q@qi)*|NGKmsLhyxaor^^c5q|yDlbvy<#Gaq3H)CbZfzIM z{BrMnWA{Y}ZyXZFm@thyg~0}TpDgIS+e{(f(aO3Yb+wz6M2`5Qg*AvBLV2hrzO}rZ z-h^_S%@vE~c2W?OC+@CNFxz~qZzzLrYP`hj-mlc1u`eB2*u?>hR?MOlwq$e_b58J)Evl$>*(s@-@g6zvdVgh3l@l!I%9D}K#5OyBzvsC!Rij_Ns_$#@Uio2EhEwc zH1(A*o1y}cau*b|uKD0TAP9$n>Q(FLknhW}cBW9@ejnm78gIiOGZwy2h`RYRl=~_l8RU;07JNZaRkv7_S-+vUE%SHtKYc_gqdum zWnxFF-&zPTDf7KyxZC?-?|Go7+F>;VMxpCVu&)vCc+8bOcdlllV z+yFZN4XM*#SK$4Lm0P|L`LCAhHGAuyvoh21`kd6WcyD954LridEFBZ_%s04oNu9l@ zSjl6)K*j`#}25{<)gjP(0)TaDCH?A3gnUC?8b_K>d4 z82kQJ(N}L|AT5OLb{eW-9@6(g$?3~!{D`Ql-je&4y1kw8urB(*@!~|+JuS+v`0I`I zBtauvz@RgXbydn_oe-U1g4q2X(`ap~>RjrkEOIMvp%qu}TyN)kS%`Qz1{buvW%E0T%Xg?A2n6)%u#$JW-?Lm#t$CxGnU zKlLJzJJ`)xFghF%z1a$Pbj<00Yun=LuXlwC9&OEbKt`O_UzA^V&(GE-Qe%f5a}}>m zvp&@V;s!LKc#Z4Nmrk|{6yse76jujZFO6xooU?Q~_85bVTE6o>Lqh=gX-O z#L?`;wY=vkmrjgFB*=BVxQ*g1HV=H>D;{R>a)KM>CyLN_gW^JhYXVH=m@FLuyC5oH z1)f2be&UFew8QqgXMX-Y!)x08*$IH4*kc$Y;sx%nmH<(D`lrI>2jh2$<=zp=sE|>q z*F7;g)WqgeFcqDGNkNyKB19ovNrar}bxP${&Bu_ot;UH!iO#gRf_i%9i+ViYFSM;# z(zBP5q#f8Q^~_RN)VY4;zKc9feS@)kN`XpBO5WbZT5mmG!59~Lu()4V5hKX0d&Y*^ zjH1uf4zaQ3Z36Kj*396ALyWzAKktREWuC+UJBtEjEW9@fuQzB+;$HR*Ughh*z|?K} z`rL6dwDG2FgOpfBzk)Z!B1sup+S>Sk`%UH~C%f@(s(GrxXj5f#u$T+p2#zDhcJ{&$ zPKN#JCq&!GVH!!TkHJp+fa~QL1@QrPGAv(JymUx=Wew5PJa-<$Ud}3JXJ9xfFmRac z*Uug=w?2L!dzniPN{>xLDA7u>CH>IK|1C`^7~_{Ilj?F$U(!;iw*L6TnfE zG-zzA&j4m4sf<6T79jgHDi}##B0F$PXm}_0whGh`&8GhGAvqm|ptnoi)=+P+ujSb1 zR61_sjlGRiuWl~^l?`q{C0zZ)+rRHDDqz{8+{w4Frm%3UoY(#$#&hhWMH8_B=zhNq zt$PzCj(=149KW&+g=AfnUn4sEU=}dHcL%@+=jB_u zkhu=V#sBEPi|qXT*{L2HyTfZ>t%0q{F-ouHs>@creSjn9`8asD-Ta97#W};VwWalt zTKWztN}f?8D*Pe@gN?rjB>a zEZ80%)HP$#<5dJJEL_2y&|$>3kB=r(X~Z`x+EE`|I4?qHAI&F=7Gxq?{*X*~uOf9xHJ2hm_A)6^qSO&s^_vZe1BSL-U0z-$G6xEnwyFZh1JCz= zDKhwT@$m2n2{~*}eV?s!K2iX64-90ASSs7tba!hOkkA9ewyr;avKYxnVzN;*Gn2Nq z_E461%xqC{v5kz@=#S9A>55l!43yc~&A*2AsEk&%((`J+^Yu)-LdE{i0nYlNb^HR_b#9XFTZ2+uK|0@M~oyXQycY;Gj&0Gi;}}xHwq7 z)ac?^`&z)FJ0T{GCy!J;`&C~!u-Uifwa5z|zZGSlx>>+l;OTS`t}~R@2khX`FNisq zSeiYeg2G9MP%E{ed&jdgiW*uWg1_ldC1qcXz51Muy|FRzcP0FrOSefKkI_k^d<+%v z_$VSIG$a8oEFxUOhD42T3@21nxJ+y@5RnokODP^moFt~4+s-CE>2(b5KYT7$Bj;S6boKlZLR3I}3~pQ~HHfuE##t6Dbw(D6i6NQj9-JxAhY ztIV>e)^#=Q*hq;e0>asBaz4&6Mou0cg(bG4a(HpHI;f4*eykpFmhDw${7r-RG;wY& zVKL!bap2e8OWffVLN0c8MyB_;W}Pj98rH8?3g}7&bVgDmdc(sU0`2K2S#-#=72O*M zS1N(EfzQmY!mUM~>$xHH-c&EOoIT-u5`gX(L>U`-JXV1ezIO+uKi<(i^ zE>fdQO<;_~CPBI~KfL3%HlY1hEkl67$LOUzt8efoUWZ#qo%8JD^(_Ki+}Frkw-nI1 zo(H?x;(}B@*=?jG1TP=xYdJZ6-1eBQttBw%m(k7Tgz=fIKe>oWZD%%EP_DX&QvbO~ zAoqwR%}L{@x1NSVaQ8_6d*_nt^^v)zu6R;nqO-g!!w6DDGxDUjH~J-~?!2#k+ozu7 zqr-Q;KdC!o8A=W{$LL!eY*V(v4iBSOKUtQv5o(Q)^v+4dB!IlNBe(ih?9p#1>eJ)}X+`5bWsbfiSDt|}~hfOO!KSB%v1VTCHG zk4wJzGq=O5oExqG)6 z+k*Ge~FF5TL8i%4pUjZ?*G7IuAgK?!R>Do9JW z=D&@(9JqQFU}S{OxjJSWPn4@03BrQ=pCP>Vlhq9jXLEn@6sDoR(?5ldIMmH@YsSru@^z?K&rvHZsT}&YG<~PeR z;w=$1@am|mu(0sp;9%z{_<{U%)^~m<`Qna{-PCTyk$D&CWvue;&HvM@Lo^!d(2Ae;gjQ|)+JzvoH&%~ z8+<$aH>i1xF88icyzV(K)Yajs7g%l+v>kySW1K`(JTD&RMEX7)vwi_{KWMw@+i8<0 z8iN;lrJ=uFZV|)BUVV}}IA7BKtV+@B@7@o}<2{+3#jjZ2LLq!EcGN*=uASg&v%0$% zm=3F)z^iGgsHiuxzq9s(YqjofJ_=)mehwIO7R_U5m5N%@Eqg5tUX6{R=DmXB1Go(8 z8KwNCj1gw{_EoPwt7d8#-bG&brf?PwWxd(>-9f4`eT!)Fn+Zbx)JuYcr6H4Pe^{j2 zXDVx?2(rcOX0kfh;O1Wj5_B`s(Rpw8bANwdo`^c<67@+I`Wlc|>+j!!a@|{K>Ajt( z9*gU_w?IKh2fh?ih^0B$FaZey@-b>3pKc`NKo^cBdiERDPw66hK2lKIkJEI!0e?Palay54 z(6pL5^xB&VO>3DyZY-;SCE85^Kjvq)rhZIDCw(95_KwpVSA7gAxjOdP((t>0!>($E zP6}Yfc{+whf_CG@i;Jc?TfCf{C8doIB*i+5Q?icAUvqqGHn>kgK|x0`+j6>h2jQmO z?*}B4_kiYP2QYnpTaK&`a8He)=9!qh;&UChncjjp1}=N(a+a8b@jKc(eM$f+-x_^A zT>2OFY8-T@5kP_X!ur<;Y}2#gd3`B7)=9U4s^5ku@tA~dZIC`Hio&<}CT=f35Amu= z*M@3#RE+Wdt`jx+H|(CxeNIMH_x$*E6irQnLBq(^aA|S%)rSKPbjtk{5Up?}DgqGn zUF)mjO}KqV0Uf2X0e?m4L-?;J5CuED8DQsxsWZI(X(87Vn$|O!Uy?%D#tV;MVN-JX zoIr+(jsX(y-S+y^;pPYM`-hZS#hOj6I9=w`YH=5($rBoX12`dLV}M zuFBZSV$w$kmIHhMGK1ZOR^M3`WDtMOa1OV1&WnwPo6x>xMbhz|Pfyq6Q;#NeLjdB) zC?uVWU^Fu=_oL0NsWQDW{JCPR>4dMg1i)79PQJw@6z}VLmzH0s4sz7`sNhWw|esDRnHJ=^Ir;CEP94ri1;x`GkWjwObow%#;{ z#As_M2LaJW8Xs5iJxuQ`wEs*e$|F*J2j4OeLEfBUf+$;x(aC|oKEYXks@}TmNzl#3 zMnZLg^%)`?c$$}`U$tlX=j3>vbjNQ1lTr~~qC5d6LTfI$j(6_9z;0j-dQNOfEgAGs zbJs55-FK~0>rG5UZN$rTI3&0sAQ)58S;7VDW)D!YJxQ!zG^68~?5p`ApbE7dD~(5P z!jkatNt%({>29Im+ut$A%ZMW6J16+Ufp9taiwPcf63fBXEH^|rnT|p1p-HS2SM*P^ zVW*XMsVqi}qXX$|Zi1v8LFJnupGq+v9w(ONqdU*< z@ag{clI(~ls35NaP4K%2C*c9U+fr8l`C-ZSHfEL9RZAG+5y(M>&PxqgYq@jXfqd16 z$&t`i0b=gN3UT?MpWS3h=bh@$h1cEyp>}b%OeQd?zo6fwgD0l+c_9Fse`E@p;N9Pv zb%f-uyvM4=B@MaYv6BSToGX)N@#1KtXsWd#>g88U*UVHEl+hH7bxsBfDM_K2}_F}ES7bxIdcm45fOu-;+b zTy~aJ4E;?P^`O@<%~1yF^j48?Ge)VbChmf7BHwNYd5%Q~y>p0g6k@COp6RpbRNU+3 z@7QfgyO{(XaE9?u-UFJJnJmKVF3wwd2qi~6YD%Ybot}Pva%N=C^(9+e<`)>KA(Lj) zGjc*BHx(O#EVpc&oYKw>uX*+J-Qp1$O>O4+`fQDoV|E>AYio-Ls>^Kg?%bdj`!)*u z&icKZcAMrc{iI7o;PE4+OVi@F!`Pl%Lo@U(KS|$uUlQiN+huN&rh+iylq%WPif`C8 zx}o%EyXZ}ZP$SwWl52G)K0ZTT5exn$fclL)vP^g{)hj_PGpgp)a8mlE7@URHrENIMMOR>{8aXGQ^W*wfSdyzbS@`3;zfJAb1i8w z58=X~Mn9=-NLN(zYeO#>0tXD6JjEOEn+jGd>}+E~$NthH5~aYz4Zg@&K;8JndDC7^`*~Z<+Z2+OxJiDbyZqgsw?W)I5N{V2rS*%TZ44Dy*EC@7DVH?U07IK!VWh- zPo}1p!Jsmv2Y`_zZ@CU>OvWIJt{8AKSY|YAXnp$OH-?FINwi^|<9z*rWyuvTKFQOI zxuXH%f$i-jHCXEhQgk#TKzNlEATY*z-VZdab3&YtDwJG-0Al->RYSreA|72Qx1`zv z<@$EyvZFdKiiRCf_wLbQS363M)=9+!nXb41Oq0$zEkZl3 z5*O0?0<@p*FL1Wwf2O`SvmRkVT255XyZz{jS>}QPI@0>XN(h^tXwdN!vC8$kEDQ6W z_|P%luGahWoA{_(yPpE?I7Wm_&A{;Y>F@5JDPKgMVjeFtz*!P>hqkO zidLf^XyoF?;m-OMPLo&n<@Y3&uY)dE@-RgkAs(madNxxZB)gmt(0KwF6bcmQ;INf( zeHQS{N4_JB1=-R5=~GM^FTvDFx0I_z?|9FnM|lMbaX`pAUm0vUGYLsVB`2>aFDKWp zq$KXP$~DOQXwIeO&v0U9g}Hm=R3d(-+kmaj*h(VJ>EL3A>v3@oR_novDpLCk zuV}>8BJ>Q>{Q`6<207mccW;?TgoTH{qxV}AnckXNgQNB0=kB6)KbYugmU(Ayzg0@( zHE#E7Z}4f*{``V~h?rK`^*B#9!UfH0txU!Kk%IPKVn&kh>I;HFkml>KMSM~Qi098L zW+woqu9T6Kp%u}rCN9TGcmMu9+Qf_uUn(DZE5MZOWtXLBlq!oUQwZPh9wn^w@9*AK zn<nGn*=Uh*dq{i4n7tZ*TU*gf%~hOM1+J@RaH5c9mzX~p&=nuy!tqgnroLH z_;Tqt>rG66ngIb{@Av8UXJjYUns@BZHvv${A=t&PjLUOAiQQv_y84TckrlSKwwPkG zA|OEQjrn1^oAqz=-#P(~j*ey{QO746>pkc*M7-MB8!IbSN5|{PNLV&7`{^5Ut+3wP zjjylKzZ8=nKhBZz;}H>|($hNi=)Ec}cV0sd8kjE}VEjO0(O{zHVz-GG)9;boEU54P{;voCCb`*&-4^G60xN4gZI8;w1g-X4_Pa3k z)5aGaTf=cwDXJge$2QV)GCU`uGy()1n;m|NvL4EkH?|%lI`;_#7= zcOi`V8C^w2Z!iIZac{1HLP~Lmcj;$stw{MfN0oL&C+YW1lR77QCfND!m`y+X$_Voy^ zJu&_KMi!HrjsxMAKR>6VsFO-Wa)X@T3wYTjCeOO}eY^!&&v}spq>pUN#MJ2+7=Rv| zdfBE{GmJ}Q2DTvcX$JwB# zTP!_Ml}2T4ZIG|mf^MDt_4Q&YWaQ*ub=0+tos9Vo8$k}qEZ?lDbG?n?o1pnk@^)l< zk#+;3|9QSj!_Q1I7)$RUZ{g$trU`o$UZ55-+*29?nlyeLI^c^^0J zvDWqAiDC@Tm5rV~qlG<6N}v7l0Mj`qCnqYvdxsrG5DzKwgccsNzSV)3x|mik1COo! zU+W|hn|I33hvNcr=P0^jX}_h$Yc!Xs>H}YCYL1MLKfEtY=JVR)+i$5FVU;v4m5hYg zqkE7amp<>WT$jHO#Eo=sK^5g+)|E6kPmg~3^ohaC-$;-6OWBWB>O>h=%w>M8q zlbz?_{zIZ?%Ap>Z=5Fu9z^teGmm`XRN9Be`?O@C?-dRcjWAu4!NQNVa@~Om|IU~?~ zl{IMxH6QS>F}M*`^o)*Xj185y=AKxj0qD=4a@O1 zrUc%XfIjypLGBAc#Nk1Yo@H@>`RFH1)ylZul+{2kn-!P!q?5>FMeMM_BWP|~;m`;y{F%ljJi#bd13-fUje}-WrimR{BPiHwtQwuK40-jyf zI?jTwnK<7-%;yrs)*$1b>>M49YJ5Eu6gr_T7iFSCizrOje_+!_-NeL1RMe8mO#Q*| zub+~L+4PJI)P?8**}74U2+G7~<-QJ@_3>k;xpUXSJlW#yEOEDmb2Q!E?VG)Z8FNy7 zz>hf3Zi#DlLPi?_cAg}(IL%UYEbb-;8TE{g*w`)8TYwvTppr zhUiQYM;WP}_Jbvp0OX2nx0@$4?W^Cr9=P%-$^=;#Sn`a)PyM$F-9)A2+F<&HUk%qt z&i=(#j4I9Z2XkgJsRNIFAS@v!)*XS$o+{c_o}MUq$sd~N*Y4fN z%PDWknW){l8DKj@+*US%xHy+SAf|$lVO1LzAEJK0jVZ?bSB3HJ+{FZ*+M$%nO6BRT z+nk&o%}Z&ikII`K&`FAkJSJJQhjCoPpu^j)v)sv#Z?A95`50Tq#WUFkUkzj#Kvznx z+6@A|4pIzWY&M{p($ov}j~*d1n9D?`O|}nFd0>cU?yC*+f*@(c|5L@8$3yx3eb~N~ zsALUe%^F{XkU`n93)x~+LbgF7%M8j^zGV-oY-MNc8p{lY?E9KsBl|Xt7-r_VCq2*e z`~5rfn)^QI%$a-6`JC&0*)YGvRk#0PmZeRD&-U#3z=0#Ux;O~-KD0J&HGo)}iPAMo zpWSe~*+P8g!m?Mk;*QdHE=4ySYV_$a1(y-GmSS@fH^V9CYE#DDH=qQ6co2-7;?~^^ zsWzwCm+16KGj2`>HtqqtlyxSehw)sH@-nLVgKb~%*mlk8J2xSp0d8^jn^VcY2OQj) zt|?VTdQyiPt(_(N0UQt-Ox^lppbOAyaR4c|m2B!EQusY3479Af3#;S~qZ$2?^LlK4 zaFNS2ll-546o8kgAJqvfMmW*Phf$R?-ZxQrONpuo1CRVmHDn*MudXcbn1A}$Ja?ji ze+S}sL-w6a14rZE_ssA(oJf1(3U%i+)JxksrM@)m_Rph_f8rEcU`6My&Ed00g0fti zZ}PbWe#Ce#H(S@xycD3+YqMf6fYBU0bV4mtlSACw<{^VpbQM`&bjGgpJ2G-Iq}~4f zB2%*n8NElDlF~O$hJDB({<%Z9{p&Z5-@{%E3~771oMBr_N(eK&E8QhYCrsWJE2BlR zrS9ecYt0I|L=%EkXFn6evo7CHMbllx95b5j6v;^QilyS7pVVK9p1K2w3?O8hoco`M z=o_(HyIk1EkIvxV_}^vp|AScl)&f_=B~Im!?`p3%UPavxGnAK}-wiKd5^YbGD38ea zyylqq=f=8N;JX5n6BAC9aIoW*F=3(0i8fjS6}tK$R6rHN-2J@VX=osk1!$i9pW|Tz z=9h)E5;5tW)vdJc!>$k9O?Ry`q>ccfs=Vz|qiM?I&&Ne3eX79F9rbRCm;DT+?4tXe}A+QdVp?|NgH&{@-zr z5`oOZ)sxfdt>DN%;RzsKP43?um`}OzaiUWOSAkNjKYr(sf@ z_uD)+B{e%mfyNM$5W>mNr@?$1LY$Jx<&eN*pL54iFkn``=sSK1Pw4Y4tV83DXf!-? z6f)rPwjbPiZh859?Ybiwm{N6|*l&v_k$+sO2eSGr;x*wwGUhgF9*XD1fXm%EhRk@T z3N6&UGWW?WAPIAMb><7~3#|TM6VbwbYJwn={cVZ&)yekNwM!rr^+6Kj2wXykJVN9- zns#MZiD1FnY2W7{uOL&sLizT=*6~ou;qyex;Pu+N5fhy^_|Bq~Vpw;8OD3>qW)(d{ z!a+y@rl$O7QS=1C^HZ2`?YqF$g2Q3bsc(T@pwT%`bze+JO7Y#NuVIx{RVJ6%PY@&= znwpxrVS=c2c3k~Lmusy$SPu_+8Dt`--a6YdR~=|=g0TY!g_vV|o%Yk@l=+)$99yU| z_hwc@gJx8m=J53@Iw36hrQ`DkWOS<;+_9c#`0hsFP;wZB&%$$Bd*@7G`!E14GCrs; zt3|6YEm;wN3cBk(ku#q|GRCxLXncSnK(9NL}#{=7U<-^}_-f?6H zu085kw{hr&W9|IJxnr}weRRO3=H@p$m|GCd$|}$4pA8dkbQ=EwT3nN->V zrUt!MT=d~dSbJ`w#(j{f=*Vouzej0sjWQBWdCnNk{(flXV?dfotK4HN^_>&|PhGtN zxB5ZvUjf^Rh`A$rWbMbOiJ_cF#Ip@f!9^)Cf_vaZTTIVjv#s-qLSU2l$XED-TV^RXcujWU!vLO9dEAJhw zBbK0&sjx#?i(1f~QBoIMZpo)O#aig;Ix7lRR8-`}?QQt?`F$tK@5^NEdBK4ZQA>O49MllKuIk*A z*4nx|k}7fZ>+=3<`0*O_9OCRbMr|b=8Cdy8jN$3y4DO6;SfB^;L1OPf+xhq>$U6V@?gI#_l&j`wM8s=Fd=iO4F?#Zn z&i2APVf`?SvqnFU%c$<}fUSv_AG-r?5(dY{e#K|1h+3L@39V)5zTwfd>;zyBal(t7 zTn_7Yn}Cf8O3WUyWxlTFHXTS|{XFupSP=JgD?x_#wG;u{DQX{H78OOe^ur~$oqq_w z)v%r89=I_f+nX5{2IpIQIaU(L(g-|n~AtFMc!bVpzde#sZRaE) zI2F;5k$6px0zKrJF1C}4P4`H}xMbpr<_puQ=poWeLrbD!CXhBayXb{KXn=S{@!kP&K8E%I0I`M#G_Q_Att3 zvVfhsC0z57mHucQH}_?`DJO(MdQwr=NM+($#V>^6^IG%gGwbToIhs=E&0rmMxLqa9 zxr>ZFFLse8@{3W9)h9hBz)>nQ#k0L$r9m~%u8~3@1C=ADvXF~N2*Bv+=@s0lDBW1R zsZhS+%XaC~06zRReB_dD)3VasNnH8P&SUdDvE|Xd$=l~^ddwcW9gle?*1l$3@9Dz}N~)`aX6RVAk-8vly1nIIE1b!@8@LYvv!zmK ziRr7`h_2q=v)UNXsbmmaQD1_S6}*M<8+dJOJYC+oy}hl_*DTt~6t$g-M79WMPGPtq zT*&j;-E91+krZ|@KPP|!7=pBW?zrc@bnuKFY1jFgE4pwvUzjNgfnr5%JPkw&v}8}! zc}8p8iINC2@MGhVX=Z8Hedt3l&+m_KBK(F%Mn{=^09%5gVQ*Kz?%{yvD7VVPL94b~ zP^5^0$fL0hn*yAL_sMlPVWTwfI6*sb8_(oAM&9V-wWALKbA=@(8qnOiU}@|!0OnMV z7pk6wNj9fI(h%p;x*>*&EhL^anV(5ZNB0Y!ZWr2w;#XG( z42fa`pW{%?vJbx(2nq_}vqSBsYzH#f*p>YY|2J~2kXXs$zv zH@b*yY;3)~MuUTc3M*%Yj0#+hW`;f+BqeQM2zx|VW=~#@!Mny^2{Qpnb6R_X<;t2U zQ|7hDa`kxQ!vcqR77Pw_>eFz(0iLz_PB!^s6ZG@&h1QqiqNS9OQQCOlzpwR4H30} zQ(7Ghsv{V`4APVy@tzX&aA`^l3VHJ639;hm`fzCETBIu6H<}eJaq;~5a_@z&{;BCq z+}B*UrjfPyjEr|c$nMR%??C8K9r=?P*L%6QcZF{y{D#Lw`BHc49H81E;nhi^Yu5o) zK-R&}SeX-@C4|BF-K~P<37}jPgbXE7+U&i)3{W?MaqmViy!t&Cnu$j#y?aNkm0H#{ z3w~b7@kyxLJA_;kGMS`D#{1)5P;Hx*!5czm*4e9zA$uwf(LS?T&CM6^fm2N=#*X#7 zCDvDhXApEOV~u^BUo_P8!%8{Ko3@&XghZl&O|@e-{c)Cqgai?;6Xld35jv+0&_0mk ztH;1&+@ImL+cMMJ3)c&Ik!wnI*wm|bS7gFaA(M=xvWBht)w~R|s`e_zUw!HFV$S6* zgtb6}!9X@3^)#z6pO-P60J1$gj~xVP%=fpV`2sP67wYETc+mo@lJo@=1`$M%K<0&c&#a5IGt~b^* zL`{MIc$M12#*0eIP z61xm-)Lhl=#TK)rNZu`Z2Al%%T=&)(jq7U=^lZ~@!0dU=)o#Z2tD6{F^cC+YHPtgB zR{?@Xh6|&7#wO4(LvC|zw74Kp6}C140Gq_0AQHoQ>O8}bhKgx`&+PU%dUe$5g7WUi z)>I|08zCzL%#kO-AEe?lhQ*GdK{z%{j9z}u+D_kZ|GxC%)JQxkH2TjlCPF8cHv?vk z?JB4OXLbR0bYN81AvKMYgJV4cy~>7pI{GtVys2?_;QowKtw;90jD6+4+anP-wI<-a zA(J0r&Id&k6tUmpz$ap)XT*cjsjB2XW-htbPT+~^=_Z0zp~wSjl8q~%Ir#b+hO}#e z7w>b#$XL?^`P%Fh-hCaeV!w*wD1F2bFZ3hr<8T%*V zJ~)+%%vipe=y@^2^ujE3ySqnA&EL}OnKfEFmIHVe3@L|>1L%%yMSB33?1NSSS=3)e zl$H`E`}wqtME%|}-oCvymHs1eN%z^a!yN5cG!ZY{r|T)ES}FI<9viT4{Db=ON}#8` zy{W0`gGIHdg8hBJeb2S^_0fQXjTy{YVo+2WQLt_OJ%9sEia=<;DuHwN$4AEq8>Hj( z#iw5*7+FUGED`3RuJ;!fVmYqj&!{85uiM=bL=*!uD*A!F`uZR9S@W&CFC)eo>&G=8 zBNm?)99$C?M<-v;y*PMcBiATR4|^VzTzfEgHMrymw*BR&zs230pkyLOU1N&t5s(Y- z654W=%!gTA3)I(pj&CY7O7935lE2~l#$KuV4% zKLl8KdzW7&>D#Q178Olsc2GX>c*$F9^4NyUZJ@24>CNlcPwHsLc+u7S`j(cDdgjxt zM?#vTt-=dt1%A|!&%-lArokPX()Svz?abBO_FXN6{K6o2ZT)dSM$Z;h(3$(_s4!tI%%vXUH`xmld33f&w#xH5FaBZR+RI7fuxX z{2G22O5KkwY`Wl|cAr7&u1dYtZTIlR#^4lkxp4! z_e}IiK#M~f$r@ehc$Q?Byw#Byez*E+u9iJc%UmFTcbfMD^H}5a~2w_5vl)rD&H$P6by{1P0~r9 zZ)qr-AX3W3AsSrR?1MD|uW1{DX|)B5rIz z&1d->1(7B#*s!8j_*5|XM?Ofc#m=Gk-Bq}SVmp(H>P$>m>Zut~90DXA2VaO?J_l}G z1!QqXb!0=xX|s9`y~biMRK0805=WUgdr6NtZ;kY_`=5#!A-f_l{o!BPZRPY^!q4It z0>v5r+zy2}6#TGsXS-}|k1_03{zF9qzidkw?=26X#Zz@*S3tw++>?fZi^2snMjNMh zG6X~(B4*zq)|Ib^M*+7J{e~#(sjV;_tNqZKg2XvMdECo>dDJk1sv@-6`EBxP>qXEX z{_)jmwAoX8a3*{uz|E1{oXZ~E4hAZ5d*=bY}w4=6$uPDex@CB_Mr zP~a)AJ}H-$tQDYuwk)_%#j6OMzHNt6;6WL6T?h#8;-_i$d^k8$dH%H1Agp$&2z^f% z^R0}*hown$`UAR->2g`Qj{)xo@I6;84d)))MnJlQ>|Ecr9GAMOz3l&-h?KwjpI%UB z`vFamF$0y?n*h7_r`_NJjG$yi20MZ3zZ4lKA*aLRap)J9*tPF$#aa)_d9nl8Lx3{s z@2imNTPrCbwwWH|3j_JrvpFu3OHzO#wf%d08;z3ewV0)Fe=kTL{< zJF~O$sy$n$+}%|f#9x`t$!pOfz4X^cDUX_FCu=KyP%a7h2{}BeHK#nC!^ep-L+(Qb zr6$fy9zt4Ce|4a1l-(@b5mBh;McYYj=iM{+N zX(sWi_VcT2YgS6@s;AQfsH-K#T~zO~w`Tfnq)vbH@2lTPB+5o(rq|4}YTwDC^xN9T KT4gsKpZ^aBLhkMW delta 14074 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 Wq@v_JcT(8p;N+x~B`d|h1pY6jEnqDG diff --git a/doc/1.manual/resources/2.3.25.png b/doc/1.manual/resources/2.3.25.png index 93ddffc011383537e297e5968fe49382dbb4d628..b9f5c81199019284047eba30ef9e474e9f99d93e 100644 GIT binary patch delta 11300 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 Fe*y5g|r3|ihKviWKY)l9y8X6k5oUEie8rnmA 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 Q&VQrGNhwPfiyQg;U;kwGhX4Qo diff --git a/doc/1.manual/resources/2.3.26.png b/doc/1.manual/resources/2.3.26.png index 156fe1d71222ffda1e9686259dc3275cd9fbe1e3..93ddffc011383537e297e5968fe49382dbb4d628 100644 GIT binary patch delta 16443 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 diff --git a/doc/1.manual/resources/2.3.27.png b/doc/1.manual/resources/2.3.27.png new file mode 100644 index 0000000000000000000000000000000000000000..156fe1d71222ffda1e9686259dc3275cd9fbe1e3 GIT binary patch literal 16156 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 2.3.5. (Dis)Connect selection
    Fig. 2.3.14 The "(Dis)Connect selection" entry from the Edit menu
    +

    If one box is selected you can use Ctrl+K to connect +them. Repeat using Ctrl+K to make multiple connections +from possible remaining outlets to inlets. +

    For 2 selected boxes you can use Ctrl+K to connect them. Repeat using Ctrl+K to make multiple connections from possible remaining outlets to inlets. @@ -804,6 +808,14 @@

    2.3.5. (Dis)Connect selection

    Fig. 2.3.18 Exclude box
    +

    If you select only one connected box, Ctrl+K will remove all of +its connections. + +

    + exclude box +
    Fig. 2.3.19 Remove connections
    +
    +

    2.3.6. Triggerize

    The "Triggerize" entry in the Edit menu (with the Ctrl+T @@ -829,8 +841,8 @@

    2.3.6. Triggerize

    connections.
    - triggerize object -
    Fig. 2.3.19 Add a [trigger] object
    + triggerize object +
    Fig. 2.3.20 Add a [trigger] object

    Additionally, the "Triggerize" option can be used to insert a dummy object. To do so, @@ -841,8 +853,8 @@

    2.3.6. Triggerize

    - insert dummy -
    Fig. 2.3.20 Insert a dummy subpatch
    + insert dummy +
    Fig. 2.3.21 Insert a dummy subpatch

    Triggerize also allows you to create or remove outlets of a selected @@ -851,16 +863,16 @@

    2.3.6. Triggerize

    outlet on the left.
    - add 1st outlet -
    Fig. 2.3.21 Add a leftmost outlet
    + add 1st outlet +
    Fig. 2.3.22 Add a leftmost outlet
    Now, if the [trigger] object has more outlets than outgoing connections, "Triggerize" removes the unused outlets.
    - reduce outlets -
    Fig. 2.3.22 Reduce outlets
    + reduce outlets +
    Fig. 2.3.23 Reduce outlets
    In case there are more connections than outlets, "Triggerize" adds outlets @@ -868,8 +880,8 @@

    2.3.6. Triggerize

    of the connections from right to left).
    - distribute connections -
    Fig. 2.3.23 Distribute connections
    + distribute connections +
    Fig. 2.3.24 Distribute connections

    2.3.7. Paste replace

    @@ -883,8 +895,8 @@

    2.3.7. Paste replace

    connections are preserved.
    - paste replace entry -
    Fig. 2.3.24 Paste replacing an object
    + paste replace entry +
    Fig. 2.3.25 Paste replacing an object

    Alternatively, you can copy a number box instead of a [float] object @@ -898,8 +910,8 @@

    2.3.7. Paste replace

    count as the same object group type.
    - paste replace boxes -
    Fig. 2.3.25 Paste replacing a number box
    + paste replace boxes +
    Fig. 2.3.26 Paste replacing a number box

    If you have a selection of boxes to replace that includes different @@ -907,8 +919,8 @@

    2.3.7. Paste replace

    same type that was copied.
    - paste replace similar type -
    >Fig. 2.3.26 Paste replacing the same box type
    + paste replace similar type +
    Fig. 2.3.27 Paste replacing the same box type

    2.4. Messages

    diff --git a/doc/Makefile.am b/doc/Makefile.am index 3ff6d491..1c6d443b 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -110,6 +110,7 @@ nobase_dist_libpd_DATA = \ ./1.manual/resources/2.3.24.png \ ./1.manual/resources/2.3.25.png \ ./1.manual/resources/2.3.26.png \ + ./1.manual/resources/2.3.27.png \ ./1.manual/resources/2.3.3.png \ ./1.manual/resources/2.3.4.png \ ./1.manual/resources/2.3.5.png \ From 056991b6b2e6e3c10c9e44785964af756a8e4325 Mon Sep 17 00:00:00 2001 From: porres Date: Thu, 27 Jun 2024 13:22:36 -0300 Subject: [PATCH 15/89] minor changes/fixes to array help --- doc/2.control.examples/15.array.pd | 50 ++++++++++++------------ doc/2.control.examples/16.more.arrays.pd | 50 +++++++++++++----------- doc/5.reference/canvas-help.pd | 3 +- 3 files changed, 53 insertions(+), 50 deletions(-) diff --git a/doc/2.control.examples/15.array.pd b/doc/2.control.examples/15.array.pd index 1b9d4d4d..120df785 100644 --- a/doc/2.control.examples/15.array.pd +++ b/doc/2.control.examples/15.array.pd @@ -1,8 +1,8 @@ -#N canvas 182 23 1035 695 12; +#N canvas 267 75 1035 695 12; #X text 69 15 ARRAYS; #N canvas 0 0 450 300 (subpatch) 0; -#X array array99 67 float 0; -#X coords 0 1 66 -1 403 199 1 0 0; +#X array array99 5 float 2; +#X coords 0 1 5 -1 403 199 1 0 0; #X restore 31 340 graph; #X msg 630 130 \; array99 resize \$1; #X floatatom 492 65 4 0 0 0 - - - 0; @@ -21,13 +21,11 @@ #X msg 798 155 \; array99 normalize 0.5; #X text 791 91 normalize to 1 or otherwise; #X obj 263 618 tabosc4~; -#X msg 490 208 \; array99 sinesum 64 0.2 0.2 0.2 0.2; -#X msg 749 208 \; array99 cosinesum 64 0.2 0.2 0.2 0.2; #X text 494 184 Fourier synthesis (resizes table); #X obj 131 645 tabread4; #X obj 228 593 tabread~; -#X obj 741 467 savepanel; -#X msg 741 494 \; array99 write \$1; +#X obj 728 473 savepanel; +#X msg 728 500 \; array99 write \$1; #X text 807 655 updated for Pd version 0.51; #X text 911 37 print info; #X obj 509 619 array size array99; @@ -36,13 +34,12 @@ #X obj 699 323 soundfiler; #X msg 699 270 read -resize ../sound/voice2.wav array99; #X msg 712 297 read -ascii -resize 15.file.txt array99; -#X msg 779 371 \; array99 read 15.file.txt; #X text 133 566 control:; #X text 578 565 get size, f 9; #X obj 331 618 tabplay~; #X text 26 587 Objects are provided for reading and writing --->, f 13; #X floatatom 630 97 4 0 0 0 - - - 0; -#X obj 741 437 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 728 443 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X text 531 64 <-- set to a constant value; #X text 686 555 See also [array] for many array operations and [expr] for C-style expressions and functions with array access., f 42; #X obj 652 619 expr size("array99"); @@ -53,21 +50,24 @@ #X text 31 233 Arrays live in graphs. When you make an array you can choose to include it in a new graph or in a 'last' graph \, which allows you to include more than one array in the same graph (as the next example shows.) You can click on arrays and drag to set and change values., f 57; #X text 31 174 It's also possible to change most of these settings with messages sent to the array name \, like changing the array size with the "resize" message shown to the right., f 57; #X msg 509 460 \; array99 write ~/test.txt; -#X text 471 366 A simpler way to read a text file (but no resizing available). The write message also exist for writting. Both the 'read' and 'write' message expand "~" to the home directory., f 41; -#X text 769 429 You can also use these objects, f 16; -#X obj 894 437 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X msg 894 494 \; array99 read \$1; -#X obj 894 467 openpanel; +#X text 756 435 You can also use these objects, f 16; +#X obj 900 443 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X msg 900 500 \; array99 read \$1; +#X obj 900 473 openpanel; +#X msg 477 208 \; array99 sinesum 4096 0.2 0.2 0.2 0.2; +#X msg 749 208 \; array99 cosinesum 4096 0.2 0.2 0.2 0.2; +#X msg 803 363 \; array99 read 15.file.txt \, resize 5, f 25; +#X text 470 355 A simpler way to read a text file is with the 'read' message (but it lacks a -resize flag). The write message also exist for writting and both 'read'/'write' expand "~" to the home directory., f 45; #X connect 3 0 4 0; #X connect 4 0 5 0; -#X connect 24 0 25 0; -#X connect 28 0 30 0; -#X connect 29 0 28 0; -#X connect 29 0 43 0; -#X connect 32 0 31 0; -#X connect 33 0 31 0; -#X connect 39 0 2 0; -#X connect 40 0 24 0; -#X connect 43 0 44 0; -#X connect 53 0 55 0; -#X connect 55 0 54 0; +#X connect 22 0 23 0; +#X connect 26 0 28 0; +#X connect 27 0 26 0; +#X connect 27 0 40 0; +#X connect 30 0 29 0; +#X connect 31 0 29 0; +#X connect 36 0 2 0; +#X connect 37 0 22 0; +#X connect 40 0 41 0; +#X connect 49 0 51 0; +#X connect 51 0 50 0; diff --git a/doc/2.control.examples/16.more.arrays.pd b/doc/2.control.examples/16.more.arrays.pd index 58661586..cb5e3cba 100644 --- a/doc/2.control.examples/16.more.arrays.pd +++ b/doc/2.control.examples/16.more.arrays.pd @@ -1,31 +1,27 @@ -#N canvas 273 23 887 709 12; +#N canvas 409 38 887 709 12; #X text 105 13 MORE ON ARRAYS; #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 msg 518 659 \; array98 style \$1; +#X floatatom 506 430 4 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 742 455 900; +#X msg 708 455 9, f 2; +#X msg 739 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 486 374 show/hide arrays:; -#X text 546 455 set line width; -#X text 751 483 set color; +#X text 753 485 set color; #X floatatom 518 629 5 0 0 0 - - - 0; #X msg 302 166 \; array97 3 -0.5 0.5; #X msg 27 229 \; array97 rename george; #X msg 231 229 \; george rename array97; #X msg 28 296 \; array97 bounds 0 2 10 -2; -#X msg 255 294 \; array97 bounds 0 1 6 -1; #X msg 29 395 \; array97 xticks 0 1 1; #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 291 478 \; array97 ylabel -0.1 -1 0 1; #X msg 736 399 \; array97 vis \$1; #N canvas 162 212 568 393 locality 0; #N canvas 0 22 450 278 (subpatch) 0; @@ -70,18 +66,26 @@ #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 coords 0 1 7 -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 msg 650 455 444; +#X msg 255 294 \; array97 bounds 0 1 7 -1; +#X msg 20 478 \; array97 xlabel -1.1 0 1 2 3 4 5 6 7; +#X msg 682 455 0, f 2; +#X text 544 425 line width, f 5; +#X msg 388 659 \; array97 style \$1; +#X msg 506 467 \; array97 width \$1 \; array98 width \$1; #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; +#X connect 4 0 53 0; +#X connect 5 0 6 0; +#X connect 7 0 5 0; +#X connect 8 0 5 0; +#X connect 15 0 3 0; +#X connect 15 0 52 0; +#X connect 26 0 30 0; +#X connect 27 0 30 0; +#X connect 38 0 23 0; +#X connect 39 0 15 0; +#X connect 47 0 5 0; +#X connect 50 0 5 0; diff --git a/doc/5.reference/canvas-help.pd b/doc/5.reference/canvas-help.pd index 5ecc51a5..18298723 100644 --- a/doc/5.reference/canvas-help.pd +++ b/doc/5.reference/canvas-help.pd @@ -137,11 +137,10 @@ #X text 24 352 With the put menu \, you can create a 'graph' \, which is a subpatch with the canvas properties set to "graph on parent". This creates a rectangular subregion of the canvas' window in which you can display GUIs \, comments \, arrays and data structures scalars. Below we have a graph displaying a couple of GUI objects., f 55; #X text 554 179 - create subpatch with an array; #X obj 665 608 all_guis; -#X text 592 608 anf also:; #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; +#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.528571 0.528571 0.5 0.428572 0.378573 0.328573 0.285716 0.24286 0.214289 0.185717 0.164289 0.142861 0.135718 0.128575 0.121432 0.11429 0.111432 0.108575 0.105718 0.102861 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.102045 0.104086 0.106126 0.108167 0.110208 0.112249 0.11429 0.117147 0.120004 0.122861 0.125718 0.128575 0.131432 0.134289 0.137146 0.140004 0.142861 0.142861 0.142861 0.142861 0.142861 0.142861 0.142861 0.142861 0.142861 0.142861 0.142861 0.142861 0.142861 0.128575 0.128575 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; From 835c8cff8c368f08e1983e5390b714c3e34a4bc5 Mon Sep 17 00:00:00 2001 From: porres Date: Fri, 28 Jun 2024 13:53:10 -0300 Subject: [PATCH 16/89] improve ctrl+k section of manual --- doc/1.manual/resources/2.3.17.png | Bin 17474 -> 20059 bytes doc/1.manual/resources/2.3.18.png | Bin 19001 -> 17474 bytes doc/1.manual/resources/2.3.19.png | Bin 20059 -> 19001 bytes doc/1.manual/x2.htm | 35 ++++++++++++++---------------- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/doc/1.manual/resources/2.3.17.png b/doc/1.manual/resources/2.3.17.png index 535a3c9dffcab5693227f4f88d2e5e2b0c1caeba..918c0e48c7116d372b064b2728cc95f7df6fd1e2 100644 GIT binary patch literal 20059 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 p3l7{1QRQ8`jY<5-tI8Ia{u?|{sdi70G$8; delta 16623 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 PtQQKhDl%nKrqKTffYskP delta 15311 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 diff --git a/doc/1.manual/resources/2.3.19.png b/doc/1.manual/resources/2.3.19.png index 918c0e48c7116d372b064b2728cc95f7df6fd1e2..3f9763f415318926a1c61f6f08a816789e2e1185 100644 GIT binary patch delta 18160 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%0DqLOlDO2l9G?1Ct+ zW{yio)&#AUoHbXbbM=yKdKc3bem3nEY|7L85Z2k#^XuL2orQ(K35c`661`%5+}=;0 zJ_9Ez{u~vL&$+QdQOQW?_>Uh3z#6{vj`Z6W?xcKvuBS+HC z&dU4!w|vj6Ns|t-MW;;_^1oc-;J^@f;p$aMi-HT>&1M;r3LlGXPN~eAJxM&jGis}% z{x9RTxfk=bCQTR$J?&phX(%x7N}SNA#p|JbD})Zw7P$PSao*ix>P;XHY#9Z&F!eRMIEOXzS(!Udd7p|l;e6&jw>sA zFy3PV_UjMJFZFxEk^Wq8&Zn@YY6o}sWXAj7-uJkFu621-Wc2c7_wMiipYQH|{GIKt z{TdO|lh4lDYU0}($942{J#f8Jc!ER1^>wi^?tLulO_SnkE$%Nm_4w5N>lYo`px)Yt6kpO zIZPY!Vh`Nh{Iyyv-aa1K2Hsa{ZS}3{i^sy1BKD&9(i4)CgH6}AwSCe~zFU9y?!&_D z#mnUCgpN#FVl?52@10%=rKfyGIbPTPIc7I+kgqtdc(UsE$|vH74PKm^yJVT0o9>x2 zQj7mO)Kn%rSo5n^>CW=tpSKePjxxVDst>J~UN5*+hu4Sk*VSaNf-hFryLLAIVe zW?q{v^%nWt0rxT@KW@JMCof1ZMNM>{qk7Kc_?^p3RQAhi&goH^vVBj~zXcy1n7Q9d zubTT{wOhn)g$|(I0pTtIpuLvB7Bmoe0H@l4?%@X#4M%|U=y2gGARDJ7P!6I8i$=H{ h*gRB2QRNu6KKbuv@N}Q1oV*uE#?#f$Wt~$(69BqjIV%7F literal 20059 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 p3l7{1QRQ8`jY<5-tI8Ia{u?|{sdi70G$8; diff --git a/doc/1.manual/x2.htm b/doc/1.manual/x2.htm index cf361252..9849170e 100644 --- a/doc/1.manual/x2.htm +++ b/doc/1.manual/x2.htm @@ -763,17 +763,15 @@

    2.3.5. (Dis)Connect selection

    Fig. 2.3.14 The "(Dis)Connect selection" entry from the Edit menu
    -

    If one box is selected you can use Ctrl+K to connect -them. Repeat using Ctrl+K to make multiple connections -from possible remaining outlets to inlets. -

    For 2 selected boxes you can use Ctrl+K to connect -them. Repeat using Ctrl+K to make multiple connections -from possible remaining outlets to inlets. +them. It starts by connecting the leftmost outlet to the leftmost inlet. It +there are more outlets and inlets to connect, you can repeat using +Ctrl+K to make multiple connections from possible the +remaining outlets to inlets.

    repeat ctrl+k -
    Fig. 2.3.15 Repeating ctrl+k for multiple connections
    +
    Fig. 2.3.15 Using ctrl+k for one or multiple connections between 2 selected boxes
    @@ -783,9 +781,16 @@

    2.3.5. (Dis)Connect selection

    fan out audio -
    Fig. 2.3.16 Fan out audio connections
    +
    Fig. 2.3.16 Fan out audio connections with ctrl+k
    +

    As for disconneting, you can use this shortcut to remove all connections from a +single selected box. + +

    + exclude box +
    Fig. 2.3.17 Remove connections
    +

    For last, you can include or bypass a box into or from a connection (being it any connection from any outlet into any inlet). To include a box, @@ -796,24 +801,16 @@

    2.3.5. (Dis)Connect selection

    to include the third one in the connection.
    - insert box -
    Fig. 2.3.17 Insert box
    + insert box +
    Fig. 2.3.18 Insert box

    To bypass a box, you can select 3 boxes connected in a row and use Ctrl+K to bypass and remove the middle box from the connection. -

    - exclude box -
    Fig. 2.3.18 Exclude box
    -
    - -

    If you select only one connected box, Ctrl+K will remove all of -its connections. -

    exclude box -
    Fig. 2.3.19 Remove connections
    +
    Fig. 2.3.19 Exclude box

    2.3.6. Triggerize

    From 6d1e5928987e0d5dfc7afcaeb072091e20acce0c Mon Sep 17 00:00:00 2001 From: Ben Wesch Date: Sat, 29 Jun 2024 19:28:31 +0200 Subject: [PATCH 17/89] change image for 2.3.17 --- doc/1.manual/resources/2.3.17.png | Bin 20059 -> 9316 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/1.manual/resources/2.3.17.png b/doc/1.manual/resources/2.3.17.png index 918c0e48c7116d372b064b2728cc95f7df6fd1e2..598472776e617b19f833bc0ca88835fe930d56c3 100644 GIT binary patch delta 8096 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 p3l7{1QRQ8`jY<5-tI8Ia{u?|{sdi70G$8; From 2a11875335ba0e024feb74328a676173fd61241a Mon Sep 17 00:00:00 2001 From: Ben Wesch Date: Sat, 29 Jun 2024 19:28:43 +0200 Subject: [PATCH 18/89] add info for shift+tab navigation through inlets while dragging cords --- doc/1.manual/x2.htm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/doc/1.manual/x2.htm b/doc/1.manual/x2.htm index 9849170e..4c52b4ec 100644 --- a/doc/1.manual/x2.htm +++ b/doc/1.manual/x2.htm @@ -623,10 +623,12 @@

    2.3.1. Tab navigation

    Fig. 2.3.3 Navigating through outlets with Tab
    -

    In Linux and Windows you can also cycle between inlets. This is currently -not possible on macOS. When dragging a connection into an inlet area, without -releasing the mouse, you can use Tab to navigate to the next inlet, -or Shift+Tab to navigate to the previous one. +

    In Linux and Windows you can also cycle between inlets (this is currently +not possible on macOS). When dragging a connection into an inlet area without +releasing the mouse, you can use Tab to navigate to the next inlet. +Shift+Tab is also possible, but it might produce unexpected +results since pressing Shift while dragging a cord on an inlet creates +a connection (see "fan out" interaction below).

    2.3.2. Autopatching

    From 3c1a1d8404d6eeb8ce8ee86f9662961a6925b945 Mon Sep 17 00:00:00 2001 From: Ben Wesch Date: Sat, 29 Jun 2024 20:13:51 +0200 Subject: [PATCH 19/89] fix number typo --- doc/1.manual/x2.htm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/1.manual/x2.htm b/doc/1.manual/x2.htm index 4c52b4ec..0dfa5fc2 100644 --- a/doc/1.manual/x2.htm +++ b/doc/1.manual/x2.htm @@ -1048,7 +1048,7 @@

    2.4.1. Message types (selectors) and numerica min integer −224 (−16777216) -−253 (−007199254740992) +−253 (−9007199254740992) max integer From 34bbe7856653ad01b885ec5efa12167964c30ec3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Mon, 1 Jul 2024 09:09:18 +0200 Subject: [PATCH 20/89] expand array's listview if window size changes Closes: https://github.com/pure-data/pure-data/issues/2362 --- tcl/dialog_array.tcl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tcl/dialog_array.tcl b/tcl/dialog_array.tcl index 7ec2a254..c0375e61 100644 --- a/tcl/dialog_array.tcl +++ b/tcl/dialog_array.tcl @@ -125,7 +125,7 @@ proc ::dialog_array::pdtk_array_listview_new {id arrayName page} { frame $windowName.data - pack $windowName.data -fill "both" -side top + pack $windowName.data -fill "both" -side top -expand 1 frame $windowName.buttons pack $windowName.buttons -fill "x" -side bottom From 4cce6d082f56efd4ab1c5ba78ff293a39397e4c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Mon, 1 Jul 2024 09:10:21 +0200 Subject: [PATCH 21/89] display total number of pages in array's listview --- tcl/dialog_array.tcl | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tcl/dialog_array.tcl b/tcl/dialog_array.tcl index c0375e61..d4d5ab85 100644 --- a/tcl/dialog_array.tcl +++ b/tcl/dialog_array.tcl @@ -12,6 +12,7 @@ namespace eval ::dialog_array:: { array set ::dialog_array::listview_entry {} array set ::dialog_array::listview_id {} array set ::dialog_array::listview_page {} +array set ::dialog_array::listview_numpages {} set ::dialog_array::listview_pagesize 1000 # this stores the state of the "save me" check button array set ::dialog_array::saveme_button {} @@ -33,6 +34,7 @@ proc ::dialog_array::listview_lbname {arrayName} { proc ::dialog_array::listview_setpage {arrayName page {numpages {}} {pagesize {}}} { set ::dialog_array::listview_page($arrayName) $page + set ::dialog_array::listview_numpages($arrayName) $numpages if {$pagesize ne {} && [string is double $pagesize]} { set ::dialog_array::listview_pagesize $pagesize } @@ -173,11 +175,19 @@ proc ::dialog_array::pdtk_array_listview_new {id arrayName page} { button $windowName.buttons.next -text "\u2192" \ -command "::dialog_array::listview_changepage \{$arrayName\} 1" - entry $windowName.buttons.page -textvariable ::dialog_array::listview_page($arrayName) \ + frame $windowName.buttons.page + + entry $windowName.buttons.page.current -textvariable ::dialog_array::listview_page($arrayName) \ -validate key -validatecommand "string is double %P" \ -justify "right" -width 5 - bind $windowName.buttons.page \ + bind $windowName.buttons.page.current \ "::dialog_array::listview_changepage \{$arrayName\} 0" + label $windowName.buttons.page.slash -text "/" + label $windowName.buttons.page.total -text 0 -textvariable ::dialog_array::listview_numpages($arrayName) + pack $windowName.buttons.page.current -side left + pack $windowName.buttons.page.slash -side left + pack $windowName.buttons.page.total -side left + pack $windowName.buttons.prev -side left -ipadx 20 -pady 10 -anchor s pack $windowName.buttons.page -side left -padx 20 -pady 10 -anchor s From 08534e28c24b5538c406e660f3de3fdc38426f3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Mon, 1 Jul 2024 10:09:57 +0200 Subject: [PATCH 22/89] use [split] to count characters in strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit there's a bug in Tcl/Tk<9, where the length of a high-unicode character would return 2 (e.g. [string length 🤷]), but splitting the same string (e.g. [split 🤷 {}]) would only give us a single-element list. Closes: https://github.com/pure-data/pure-data/issues/1444 Closes: https://github.com/pure-data/pure-data/issues/1900 --- tcl/pd_bindings.tcl | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tcl/pd_bindings.tcl b/tcl/pd_bindings.tcl index a24ec31d..fa86a9db 100644 --- a/tcl/pd_bindings.tcl +++ b/tcl/pd_bindings.tcl @@ -434,11 +434,13 @@ proc ::pd_bindings::sendkey {window state key iso shift {keycode ""} } { # : do some substitution based on $key # : else use $key - if { [string length $iso] == 0 && $state == 0 } { + set isosplit [split $iso {}] + + if { [llength $isosplit] == 0 && $state == 0 } { catch {set iso [dict get $::pd_bindings::key2iso $keycode] } } - switch -- [string length $iso] { + switch -- [llength $isosplit] { 0 { switch -- $key { "BackSpace" { set key 8 } @@ -466,7 +468,7 @@ proc ::pd_bindings::sendkey {window state key iso shift {keycode ""} } { } default { # split a multi-char $iso in single chars - foreach k [split $iso {}] { + foreach k $isosplit { ::pd_bindings::sendkey $window $state $key $k $shift $keycode } return From c570e57171ef7aeb5616b6c77d87d5499de68bad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Mon, 1 Jul 2024 13:01:14 +0200 Subject: [PATCH 23/89] only send backspace for interim compose keys if we are actually editing text Closes: https://github.com/pure-data/pure-data/issues/2224 --- tcl/pd_bindings.tcl | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/tcl/pd_bindings.tcl b/tcl/pd_bindings.tcl index fa86a9db..62cf7414 100644 --- a/tcl/pd_bindings.tcl +++ b/tcl/pd_bindings.tcl @@ -174,6 +174,23 @@ proc ::pd_bindings::dialog_bindings {mytoplevel dialogname} { } # this is for canvas windows +proc ::pd_bindings::clear_compose_keys {window} { + # this is an ugly hack! + # on macOS we might need to clear interim compose characters + # but only while editing. + # otherwise, we might send the BackSpace only to a selected object + # and delete that (https://github.com/pure-data/pure-data/issues/2224) + set skip 0 + catch { + if { $::editingtext([winfo toplevel $window]) == 0 } { + set skip 1 + } + } + if { $skip } { return } + + ::pd_bindings::sendkey ${window} 1 BackSpace "" 0 + ::pd_bindings::sendkey ${window} 0 BackSpace "" 0 +} proc ::pd_bindings::patch_bindings {mytoplevel} { variable modifier set tkcanvas [tkcanvas_name $mytoplevel] @@ -260,13 +277,11 @@ proc ::pd_bindings::patch_bindings {mytoplevel} { # } bind $tkcanvas <> { # ::pdwindow::post "%W clear marked text\n" - ::pd_bindings::sendkey %W 1 BackSpace "" 0 - ::pd_bindings::sendkey %W 0 BackSpace "" 0 + ::pd_bindings::clear_compose_keys %W } bind $tkcanvas <> { # ::pdwindow::post "%W accent backspace\n" - ::pd_bindings::sendkey %W 1 BackSpace "" 0 - ::pd_bindings::sendkey %W 0 BackSpace "" 0 + ::pd_bindings::clear_compose_keys %W } } stderr From 20c3801e1d00f6a9a9cc0c50e9f743a2007b36de Mon Sep 17 00:00:00 2001 From: phlostically Date: Thu, 4 Jul 2024 18:02:25 +0200 Subject: [PATCH 24/89] Added translation using Weblate (Esperanto) --- po/eo.po | 1615 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1615 insertions(+) create mode 100644 po/eo.po diff --git a/po/eo.po b/po/eo.po new file mode 100644 index 00000000..6db84182 --- /dev/null +++ b/po/eo.po @@ -0,0 +1,1615 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Pure Data 0.54.1\n" +"Report-Msgid-Bugs-To: pd-dev@iem.at\n" +"POT-Creation-Date: 2024-05-06 10:09+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: eo\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "linear" +msgstr "" + +msgid "logarithmic" +msgstr "" + +msgid "new-only" +msgstr "" + +msgid "new&old" +msgstr "" + +msgid "no scale" +msgstr "" + +msgid "scale" +msgstr "" + +#, tcl-format +msgid "Discard changes to '%s'?" +msgstr "" + +msgid "Undo clear" +msgstr "" + +msgid "Undo connect" +msgstr "" + +msgid "Undo cut" +msgstr "" + +msgid "Undo disconnect" +msgstr "" + +msgid "Undo duplicate" +msgstr "" + +msgid "Undo motion" +msgstr "" + +msgid "Undo paste" +msgstr "" + +msgid "Undo typing" +msgstr "" + +msgid "Redo clear" +msgstr "" + +msgid "Redo connect" +msgstr "" + +msgid "Redo cut" +msgstr "" + +msgid "Redo disconnect" +msgstr "" + +msgid "Redo duplicate" +msgstr "" + +msgid "Redo motion" +msgstr "" + +msgid "Redo paste" +msgstr "" + +msgid "Redo typing" +msgstr "" + +msgid "no Pd settings to clear" +msgstr "" + +msgid "removed .pdsettings file" +msgstr "" + +msgid "couldn't delete .pdsettings file" +msgstr "" + +msgid "failed to erase Pd settings" +msgstr "" + +msgid "erased Pd settings" +msgstr "" + +msgid "no Pd settings to erase" +msgstr "" + +msgid "skipping loading preferences... Pd seems to have crashed on startup" +msgstr "" + +msgid "(re-save preferences to reinstate them)" +msgstr "" + +msgid "File" +msgstr "" + +msgid "Edit" +msgstr "" + +msgid "Put" +msgstr "" + +msgid "Find" +msgstr "" + +msgid "Media" +msgstr "" + +msgid "Window" +msgstr "" + +msgid "Help" +msgstr "" + +msgid "Show &Hidden Files and Directories" +msgstr "" + +msgid "Copy" +msgstr "" + +msgid "Paste" +msgstr "" + +msgid "Array Properties" +msgstr "" + +msgid "Array" +msgstr "" + +msgid "Name:" +msgstr "" + +msgid "Size:" +msgstr "" + +msgid "Save contents" +msgstr "" + +msgid "Draw as:" +msgstr "" + +msgid "Polygon" +msgstr "" + +msgid "Points" +msgstr "" + +msgid "Bezier curve" +msgstr "" + +msgid "Put array into:" +msgstr "" + +msgid "New graph" +msgstr "" + +msgid "Last graph" +msgstr "" + +msgid "Options" +msgstr "" + +msgid "Open List View..." +msgstr "" + +msgid "Delete array" +msgstr "" + +msgid "Cancel" +msgstr "" + +msgid "Apply" +msgstr "" + +msgid "OK" +msgstr "" + +msgid "no device" +msgstr "" + +msgid "(same as input device)..." +msgstr "" + +msgid "Channels:" +msgstr "" + +msgid "Input Devices" +msgstr "" + +msgid "Output Devices" +msgstr "" + +msgid "Use Multiple Devices" +msgstr "" + +msgid "audio system" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "Sample rate:" +msgstr "" + +msgid "Delay (msec):" +msgstr "" + +msgid "48k" +msgstr "" + +msgid "44.1k" +msgstr "" + +msgid "96k" +msgstr "" + +msgid "Block size:" +msgstr "" + +msgid "Use callbacks" +msgstr "" + +msgid "Audio Settings" +msgstr "" + +msgid "Save All Settings" +msgstr "" + +msgid "WARNING: unknown graphme flags received in pdtk_canvas_dialog" +msgstr "" + +msgid "Canvas Properties" +msgstr "" + +msgid "Scale" +msgstr "" + +msgid "X units per pixel:" +msgstr "" + +msgid "Y units per pixel:" +msgstr "" + +msgid "Appearance on parent patch" +msgstr "" + +msgid "Graph-On-Parent" +msgstr "" + +msgid "Hide object name and arguments" +msgstr "" + +msgid "Range and size" +msgstr "" + +msgid "X range: from" +msgstr "" + +msgid "to" +msgstr "" + +msgid "Margin:" +msgstr "" + +msgid "Y range: from" +msgstr "" + +msgid "Data Properties" +msgstr "" + +msgid "Send" +msgstr "" + +msgid "Done" +msgstr "" + +#, tcl-format +msgid "Found '%1$s' in %2$s" +msgstr "" + +#, tcl-format +msgid "Couldn't find '%1$s' in %2$s" +msgstr "" + +#, tcl-format +msgid "Search in %s for:" +msgstr "" + +#, tcl-format +msgid "Showed last '%1$s' in %2$s" +msgstr "" + +#, tcl-format +msgid "Showing '%1$d' out of %2$d items in %3$s" +msgstr "" + +msgid "Pd window" +msgstr "" + +msgid "Match whole word only" +msgstr "" + +msgid "Close" +msgstr "" + +#, tcl-format +msgid "%s Font" +msgstr "" + +msgid "Font" +msgstr "" + +msgid "Font Size" +msgstr "" + +msgid "Stretch" +msgstr "" + +msgid "X and Y" +msgstr "" + +msgid "X only" +msgstr "" + +msgid "Y only" +msgstr "" + +msgid "GUI Box Properties" +msgstr "" + +msgid "Messages" +msgstr "" + +msgid "Send symbol:" +msgstr "" + +msgid "Receive symbol:" +msgstr "" + +msgid "auto" +msgstr "" + +msgid "Width:" +msgstr "" + +msgid "Limits" +msgstr "" + +msgid "Lower:" +msgstr "" + +msgid "Upper:" +msgstr "" + +msgid "Label" +msgstr "" + +msgid "Left" +msgstr "" + +msgid "Right" +msgstr "" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "Background color" +msgstr "" + +msgid "Foreground color" +msgstr "" + +msgid "Label color" +msgstr "" + +msgid "Bang" +msgstr "" + +msgid "Flash Time (msec)" +msgstr "" + +msgid "Min:" +msgstr "" + +msgid "Max:" +msgstr "" + +msgid "Toggle" +msgstr "" + +msgid "Non Zero Value" +msgstr "" + +msgid "Value:" +msgstr "" + +msgid "Number2" +msgstr "" + +msgid "Width (digits):" +msgstr "" + +msgid "Height:" +msgstr "" + +msgid "Output Range" +msgstr "" + +msgid "Log height:" +msgstr "" + +msgid "Vslider" +msgstr "" + +msgid "Hslider" +msgstr "" + +msgid "Vradio" +msgstr "" + +msgid "Num cells:" +msgstr "" + +msgid "Hradio" +msgstr "" + +msgid "VU Meter" +msgstr "" + +msgid "Canvas" +msgstr "" + +msgid "Visible Rectangle (pix)" +msgstr "" + +#, tcl-format +msgid "%s Properties" +msgstr "" + +msgid "Parameters" +msgstr "" + +msgid "Init" +msgstr "" + +msgid "No init" +msgstr "" + +msgid "Jump on click" +msgstr "" + +msgid "Steady on click" +msgstr "" + +msgid "X offset:" +msgstr "" + +msgid "Y offset:" +msgstr "" + +msgid "Colors" +msgstr "" + +msgid "Background" +msgstr "" + +msgid "Front" +msgstr "" + +msgid "Compose color" +msgstr "" + +msgid "Test label" +msgstr "" + +msgid "Send a Pd message" +msgstr "" + +msgid "(use arrow keys for history)" +msgstr "" + +msgid "no input devices" +msgstr "" + +msgid "In Ports:" +msgstr "" + +msgid "Out Ports:" +msgstr "" + +msgid "MIDI system" +msgstr "" + +msgid "MIDI Settings" +msgstr "" + +msgid "ALSA MIDI Settings" +msgstr "" + +msgid "Pd search path for objects, help, audio, text and other files" +msgstr "" + +msgid "Use standard paths" +msgstr "" + +msgid "Verbose" +msgstr "" + +msgid "Pd Documents Directory" +msgstr "" + +msgid "Browse" +msgstr "" + +msgid "Reset" +msgstr "" + +msgid "Disable" +msgstr "" + +msgid "Externals Install Directory" +msgstr "" + +msgid "Clear" +msgstr "" + +msgid "path preferences" +msgstr "" + +msgid "Choose Pd documents directory:" +msgstr "" + +msgid "Install externals to directory:" +msgstr "" + +msgid "Add a new path" +msgstr "" + +#, tcl-format +msgid "Edit existing path [%s]" +msgstr "" + +msgid "Patch windows" +msgstr "" + +msgid "Zoom New Windows" +msgstr "" + +msgid "GUI settings" +msgstr "" + +msgid "preference layout (reopen the preferences to see the effect)" +msgstr "" + +msgid "use tabs" +msgstr "" + +msgid "single page" +msgstr "" + +msgid "patching helpers" +msgstr "" + +msgid "Highlight active cord while connecting" +msgstr "" + +msgid "Preferences" +msgstr "" + +msgid "startup preferences" +msgstr "" + +msgid "audio preferences" +msgstr "" + +msgid "MIDI preferences" +msgstr "" + +msgid "deken preferences" +msgstr "" + +msgid "misc preferences" +msgstr "" + +msgid "Add new library" +msgstr "" + +msgid "Edit library" +msgstr "" + +msgid "Settings below require a restart of Pd!" +msgstr "" + +msgid "Pd libraries to load on startup" +msgstr "" + +msgid "GUI options" +msgstr "" + +msgid "language" +msgstr "" + +msgid "Menu language" +msgstr "" + +msgid "float (32bit)" +msgstr "" + +msgid "double (64bit) EXPERIMENTAL" +msgstr "" + +msgid "double (64bit)" +msgstr "" + +msgid "float size" +msgstr "" + +msgid "Numeric precision of Pd-core" +msgstr "" + +msgid "Startup options" +msgstr "" + +msgid "Defeat real-time scheduling" +msgstr "" + +msgid "Startup flags:" +msgstr "" + +msgid "Help Browser" +msgstr "" + +msgid "Associated Files" +msgstr "" + +msgid "Pd Files" +msgstr "" + +msgid "Max Patch Files" +msgstr "" + +msgid "Max Text Files" +msgstr "" + +msgid "Max Patch Files (.pat)" +msgstr "" + +msgid "Max Text Files (.mxt)" +msgstr "" + +#, tcl-format +msgid "detected font: %s" +msgstr "" + +#, tcl-format +msgid "WARNING: font family '%1$s' not found, using default (%2$s)" +msgstr "" + +#, tcl-format +msgid "WARNING: font weight '%1$s' not found, using default (%2$s)" +msgstr "" + +#, tcl-format +msgid "using font: %1$s %2$s" +msgstr "" + +#, tcl-format +msgid "'%1$s' already loaded, ignoring: '%2$s'" +msgstr "" + +#, tcl-format +msgid "Loading plugin: %s" +msgstr "" + +#, tcl-format +msgid "UNHANDLED ERROR: %s" +msgstr "" + +#, tcl-format +msgid "FAILED TO LOAD %s" +msgstr "" + +#, tcl-format +msgid "Failed to read plugin %s ...skipping!" +msgstr "" + +#, tcl-format +msgid "Failed to find plugins in %s ...skipping!" +msgstr "" + +msgid "Pd startup failure" +msgstr "" + +msgid "Failed to start Pd-core" +msgstr "" + +msgid "(Tcl) MISSING CLOSE-BRACE '}': " +msgstr "" + +msgid "(Tcl) INVALID COMMAND NAME: " +msgstr "" + +msgid "(Tcl) UNHANDLED ERROR: " +msgstr "" + +#, tcl-format +msgid "[deken] installed version [%1$s] > %2$s...skipping!" +msgstr "" + +#, tcl-format +msgid "[deken] installed version [%1$s] < %2$s...overwriting!" +msgstr "" + +#, tcl-format +msgid "[deken] installed version [%1$s] == %2$s...skipping!" +msgstr "" + +#, tcl-format +msgid "installing deken package '%s'" +msgstr "" + +#, tcl-format +msgid "ignoring '%s': doesn't look like a deken package" +msgstr "" + +#, tcl-format +msgid "Installing '%s'" +msgstr "" + +#, tcl-format +msgid "Successfully unzipped %1$s into %2$s." +msgstr "" + +msgid "Unable to extract package automatically." +msgstr "" + +msgid "Please perform the following steps manually:" +msgstr "" + +#, tcl-format +msgid "1. Unzip %s." +msgstr "" + +msgid "You might need to change the file-extension from .dek to .zip" +msgstr "" + +#, tcl-format +msgid "2. Copy the contents into %s." +msgstr "" + +#, tcl-format +msgid "3. Remove %s. (optional)" +msgstr "" + +#, tcl-format +msgid "Removing '%s'" +msgstr "" + +#, tcl-format +msgid "Uninstalling %1$s from %2$s failed!" +msgstr "" + +#, tcl-format +msgid "Skipping SHA256 verification of '%s'." +msgstr "" + +#, tcl-format +msgid "SHA256 verification of '%s'" +msgstr "" + +#, tcl-format +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 "" + +#, tcl-format +msgid "Unable to download from %1$s [%2$s]" +msgstr "" + +#, tcl-format +msgid "Unable to download from '%s'!" +msgstr "" + +msgid "Download failed" +msgstr "" + +#, tcl-format +msgid "Unable to remove stray file '%s'" +msgstr "" + +#, tcl-format +msgid "Unable to rename downloaded file to '%s'" +msgstr "" + +msgid "Create" +msgstr "" + +msgid "Check" +msgstr "" + +msgid "Installation options:" +msgstr "" + +msgid "Try to verify the libraries' checksum before (re)installing them" +msgstr "" + +msgid "Try to remove libraries before (re)installing them" +msgstr "" + +msgid "Show README of newly installed libraries (if present)" +msgstr "" + +msgid "Keep package files after installation" +msgstr "" + +msgid "Add newly installed libraries to Pd's search path" +msgstr "" + +msgid "Platform settings:" +msgstr "" + +#, tcl-format +msgid "Default platform: %s" +msgstr "" + +msgid "User-defined platform:" +msgstr "" + +msgid "Hide foreign architectures" +msgstr "" + +msgid "" +"Only show the newest version of a library\n" +"(treats other versions like foreign architectures)" +msgstr "" + +#, tcl-format +msgid "Deken %s Preferences" +msgstr "" + +#, tcl-format +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 "" + +msgid "ZIP Files" +msgstr "" + +msgid "TAR Files" +msgstr "" + +msgid "All Files" +msgstr "" + +#, tcl-format +msgid "Uninstalling previous installation of '%s'" +msgstr "" + +#, tcl-format +msgid "Temporarily moving %1$s into %2$s failed." +msgstr "" + +#, tcl-format +msgid "Installing package '%s'" +msgstr "" + +msgid "Installation completed!" +msgstr "" + +#, tcl-format +msgid "Successfully installed '%s'!" +msgstr "" + +msgid "Installation failed!" +msgstr "" + +#, tcl-format +msgid "Failed to install '%s'!" +msgstr "" + +msgid "Package installation failed" +msgstr "" + +#, tcl-format +msgid "" +"Failed to completely remove %1$s.\n" +"Please manually remove the directory %2$s after quitting Pd." +msgstr "" + +#, tcl-format +msgid "Unable to add %s to search paths" +msgstr "" + +#, tcl-format +msgid "Add %s to the Pd search paths?" +msgstr "" + +#, tcl-format +msgid "Added %s to search paths" +msgstr "" + +msgid "No packages selected for installation." +msgstr "" + +#, tcl-format +msgid "Processed %d packages selected for installation." +msgstr "" + +msgid "Show all" +msgstr "" + +msgid "Search" +msgstr "" + +#, tcl-format +msgid "Install (%d)" +msgstr "" + +msgid "Install" +msgstr "" + +#, tcl-format +msgid "%s%% of download completed" +msgstr "" + +msgid "Enter an exact library or object name." +msgstr "" + +msgid "e.g. 'freeverb~'" +msgstr "" + +msgid "Use the '*' wildcard to match any number of characters." +msgstr "" + +msgid "e.g. '*-plugin' will match 'deken-plugin' (and more)." +msgstr "" + +msgid "You can restrict the search to only-libraries or only-objects." +msgstr "" + +msgid "To get a list of all available externals, try an empty search." +msgstr "" + +msgid "Right-clicking a search result will give you more options..." +msgstr "" + +msgid "You can also search for libraries & objects via your web browser:" +msgstr "" + +msgid "Find externals" +msgstr "" + +msgid "Install DEK file..." +msgstr "" + +msgid "Preferences..." +msgstr "" + +msgid "Search for: " +msgstr "" + +msgid "libraries" +msgstr "" + +msgid "objects" +msgstr "" + +msgid "both" +msgstr "" + +msgid "translations" +msgstr "" + +msgid "Only install externals uploaded by people you trust." +msgstr "" + +msgid "Disabling tabbed view: incompatible Tcl/Tk detected" +msgstr "" + +msgid "Library" +msgstr "" + +msgid "Version" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Uploader" +msgstr "" + +msgid "Date" +msgstr "" + +msgid "Search Results" +msgstr "" + +msgid "Log" +msgstr "" + +#, tcl-format +msgid "Searching for \"%s\"..." +msgstr "" + +#, tcl-format +msgid "online? %s" +msgstr "" + +msgid "Unable to perform search. Are you online?" +msgstr "" + +#, tcl-format +msgid "Found %1$d usable packages (of %2$d packages in total)." +msgstr "" + +msgid "It appears that there are no matching packages for your architecture." +msgstr "" + +msgid "No matching externals found." +msgstr "" + +msgid "Try using the full name e.g. 'freeverb~'." +msgstr "" + +msgid "Or use wildcards like 'freeverb*'." +msgstr "" + +msgid "Please select a (writable) installation directory!" +msgstr "" + +#, tcl-format +msgid "Install %1$s to %2$s?" +msgstr "" + +#, tcl-format +msgid "Cancelling download of '%s': No installation directory given." +msgstr "" + +msgid "Installing to non-existent directory failed" +msgstr "" + +#, tcl-format +msgid "Unable to install to '%s'" +msgstr "" + +msgid "Directory does not exist!" +msgstr "" + +msgid "Directory is not writable!" +msgstr "" + +#, tcl-format +msgid "Downloading '%s'" +msgstr "" + +#, tcl-format +msgid "Commencing download of '%1$s' into '%2$s'..." +msgstr "" + +msgid "aborting." +msgstr "" + +#, tcl-format +msgid "Downloading '%s' failed" +msgstr "" + +msgid "Download failed!" +msgstr "" + +msgid "Download completed! Verifying..." +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 "" + +#, tcl-format +msgid "[deken] Platform detected: %s" +msgstr "" + +#, tcl-format +msgid "Searching on %s..." +msgstr "" + +#, tcl-format +msgid "Searching on %1$s returned %2$d results" +msgstr "" + +msgid "No usable servers for searching found..." +msgstr "" + +#, tcl-format +msgid "Uploaded by %1$s @ %2$s" +msgstr "" + +#, tcl-format +msgid "Searching for '%s' failed!" +msgstr "" + +msgid "Search failed" +msgstr "" + +msgid "Unable to perform search." +msgstr "" + +msgid "Select package for installation" +msgstr "" + +msgid "Deselect package" +msgstr "" + +msgid "Open package webpage" +msgstr "" + +msgid "Copy package URL" +msgstr "" + +msgid "Copy SHA256 checksum URL" +msgstr "" + +msgid "Copy OpenGPG signature URL" +msgstr "" + +#, tcl-format +msgid "Uninstall '%s'" +msgstr "" + +#, tcl-format +msgid "" +"Do you want Pd to use the existing documents directory for patches and " +"external libraries?\n" +"\n" +"Location: %s\n" +"\n" +"You can change or disable this later in the Path preferences." +msgstr "" + +#, tcl-format +msgid "" +"Do you want Pd to create a documents directory for patches and external " +"libraries?\n" +"\n" +"Location: %s\n" +"\n" +"You can change or disable this later in the Path preferences." +msgstr "" + +#, tcl-format +msgid "" +"Pd documents directory cannot be found:\n" +"\n" +"%s\n" +"\n" +"Choose a new location?" +msgstr "" + +#, tcl-format +msgid "couldn't create Pd documents directory: %s" +msgstr "" + +#, tcl-format +msgid "couldn't create \"externals\" directory in: %s" +msgstr "" + +msgid "refusing to delete empty domain" +msgstr "" + +#, tcl-format +msgid "Couldn't create preferences \"%1$s\" in %2$s" +msgstr "" + +msgid "The language can only be set during startup." +msgstr "" + +msgid "Afrikaans" +msgstr "" + +msgid "Arabic" +msgstr "" + +msgid "Azerbaijani" +msgstr "" + +msgid "Belarusian" +msgstr "" + +msgid "Bulgarian" +msgstr "" + +msgid "German" +msgstr "" + +msgid "German (Austria)" +msgstr "" + +msgid "Greek" +msgstr "" + +msgid "English" +msgstr "" + +msgid "English (Canada)" +msgstr "" + +msgid "English (UK)" +msgstr "" + +msgid "English (USA)" +msgstr "" + +msgid "Spanish" +msgstr "" + +msgid "Basque" +msgstr "" + +msgid "Finnish" +msgstr "" + +msgid "French" +msgstr "" + +msgid "Gujarati" +msgstr "" + +msgid "Hebrew" +msgstr "" + +msgid "Hindi" +msgstr "" + +msgid "Hungarian" +msgstr "" + +msgid "Armenian" +msgstr "" + +msgid "Italian" +msgstr "" + +msgid "Indonesian" +msgstr "" + +msgid "Japanese" +msgstr "" + +msgid "Korean" +msgstr "" + +msgid "Dutch" +msgstr "" + +msgid "Panjabi" +msgstr "" + +msgid "Polish" +msgstr "" + +msgid "Portuguese" +msgstr "" + +msgid "Portuguese (Brazil)" +msgstr "" + +msgid "Portuguese (Portugal)" +msgstr "" + +msgid "Russian" +msgstr "" + +msgid "Albanian" +msgstr "" + +msgid "Swedish" +msgstr "" + +msgid "Turkish" +msgstr "" + +msgid "Ukrainian" +msgstr "" + +msgid "Vietnamese" +msgstr "" + +msgid "Chinese (Traditional)" +msgstr "" + +msgid "(no translation)" +msgstr "" + +#, tcl-format +msgid "(default language: %s)" +msgstr "" + +#, tcl-format +msgid "ignoring '%s': doesn't exist" +msgstr "" + +msgid "About Pd" +msgstr "" + +#, tcl-format +msgid "couldn't read \"%s\" document" +msgstr "" + +msgid "Save" +msgstr "" + +msgid "Save As..." +msgstr "" + +msgid "Print..." +msgstr "" + +msgid "Paste Replace" +msgstr "" + +msgid "Duplicate" +msgstr "" + +msgid "Zoom In" +msgstr "" + +msgid "Zoom Out" +msgstr "" + +msgid "Tidy Up" +msgstr "" + +msgid "(Dis)Connect Selection" +msgstr "" + +msgid "Triggerize" +msgstr "" + +msgid "Edit Mode" +msgstr "" + +msgid "Undo" +msgstr "" + +msgid "Redo" +msgstr "" + +msgid "New" +msgstr "" + +msgid "Open" +msgstr "" + +msgid "Message..." +msgstr "" + +msgid "Cut" +msgstr "" + +msgid "Select All" +msgstr "" + +msgid "Clear Console" +msgstr "" + +msgid "Object" +msgstr "" + +msgid "Message" +msgstr "" + +msgid "Number" +msgstr "" + +msgid "List" +msgstr "" + +msgid "Symbol" +msgstr "" + +msgid "Comment" +msgstr "" + +msgid "Graph" +msgstr "" + +msgid "Find..." +msgstr "" + +msgid "Find Again" +msgstr "" + +msgid "Find Last Error" +msgstr "" + +msgid "DSP On" +msgstr "" + +msgid "DSP Off" +msgstr "" + +msgid "Test Audio and MIDI..." +msgstr "" + +msgid "Load Meter" +msgstr "" + +msgid "Audio Settings..." +msgstr "" + +msgid "MIDI Settings..." +msgstr "" + +msgid "Minimize" +msgstr "" + +msgid "Zoom" +msgstr "" + +msgid "Bring All to Front" +msgstr "" + +msgid "Next Window" +msgstr "" + +msgid "Previous Window" +msgstr "" + +msgid "Parent Window" +msgstr "" + +msgid "HTML Manual..." +msgstr "" + +msgid "Browser..." +msgstr "" + +msgid "List of objects..." +msgstr "" + +msgid "puredata.info" +msgstr "" + +msgid "Check for updates" +msgstr "" + +msgid "Report a bug" +msgstr "" + +msgid "Clear Menu" +msgstr "" + +msgid "" +"Delete all preferences?\n" +"(takes effect when Pd is restarted)" +msgstr "" + +msgid "removed GUI settings" +msgstr "" + +msgid "no Pd-GUI settings to clear" +msgstr "" + +msgid "Edit Preferences..." +msgstr "" + +msgid "Save All Preferences" +msgstr "" + +msgid "Save to..." +msgstr "" + +msgid "Load from..." +msgstr "" + +msgid "Forget All..." +msgstr "" + +msgid "Tabbed preferences" +msgstr "" + +msgid "Open Recent" +msgstr "" + +msgid "Quit" +msgstr "" + +#, tcl-format +msgid "Do you want to save the changes you made in '%s'?" +msgstr "" + +msgid "Properties" +msgstr "" + +#, tcl-format +msgid "Accept changes to '%s'?" +msgstr "" + +msgid "" +"Accepting will update the contents in the associated object. You still have " +"to save the patch to make the changes persistent." +msgstr "" + +#, tcl-format +msgid "dropped %d lines from the Pd window" +msgstr "" + +#, tcl-format +msgid "the Pd window filtered %d lines" +msgstr "" + +msgid "Audio on" +msgstr "" + +msgid "Audio off" +msgstr "" + +msgid "Pd" +msgstr "" + +msgid "EXPERIMENTAL double (64bit) precision" +msgstr "" + +#, tcl-format +msgid "%dbit-floats EXPERIMENTAL" +msgstr "" + +msgid "DSP" +msgstr "" + +msgid "Audio I/O error" +msgstr "" + +msgid "Log:" +msgstr "" + +msgid "fatal" +msgstr "" + +msgid "error" +msgstr "" + +msgid "normal" +msgstr "" + +msgid "debug" +msgstr "" + +msgid "all" +msgstr "" + +msgid "y1" +msgstr "" + +msgid "New..." +msgstr "" + +msgid "Edit..." +msgstr "" + +msgid "Delete" +msgstr "" + +#, tcl-format +msgid "ignoring '%s': doesn't look like a Pd file" +msgstr "" From 87f10216f1ab0eb22bd1b6801031091f08bbd741 Mon Sep 17 00:00:00 2001 From: phlostically Date: Thu, 4 Jul 2024 16:09:27 +0000 Subject: [PATCH 25/89] Translated using Weblate (Esperanto) Currently translated at 54.3% (269 of 495 strings) Translation: pure-data/Interface Translate-URL: https://hosted.weblate.org/projects/pure-data/pure-data/eo/ --- po/eo.po | 547 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 275 insertions(+), 272 deletions(-) diff --git a/po/eo.po b/po/eo.po index 6db84182..c1db12a0 100644 --- a/po/eo.po +++ b/po/eo.po @@ -7,83 +7,86 @@ msgstr "" "Project-Id-Version: Pure Data 0.54.1\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" "POT-Creation-Date: 2024-05-06 10:09+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2024-07-05 16:09+0000\n" +"Last-Translator: phlostically \n" +"Language-Team: Esperanto \n" "Language: eo\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.7-dev\n" msgid "linear" -msgstr "" +msgstr "lineara" msgid "logarithmic" -msgstr "" +msgstr "logaritma" msgid "new-only" -msgstr "" +msgstr "nur novaj" msgid "new&old" -msgstr "" +msgstr "novaj & malnovaj" msgid "no scale" -msgstr "" +msgstr "sen skalo" msgid "scale" -msgstr "" +msgstr "kun skalo" #, tcl-format msgid "Discard changes to '%s'?" -msgstr "" +msgstr "Ĉu forĵeti ŝanĝojn pri «%s»?" msgid "Undo clear" msgstr "" msgid "Undo connect" -msgstr "" +msgstr "Malfari konekton" msgid "Undo cut" -msgstr "" +msgstr "Malfari eltondon" msgid "Undo disconnect" -msgstr "" +msgstr "Malfari malkonekton" msgid "Undo duplicate" msgstr "" msgid "Undo motion" -msgstr "" +msgstr "Malfari movon" msgid "Undo paste" -msgstr "" +msgstr "Malfari algluon" msgid "Undo typing" -msgstr "" +msgstr "Malfari tajpadon" msgid "Redo clear" msgstr "" msgid "Redo connect" -msgstr "" +msgstr "Refari konekton" msgid "Redo cut" -msgstr "" +msgstr "Refari eltondon" msgid "Redo disconnect" -msgstr "" +msgstr "Refari malkonekton" msgid "Redo duplicate" msgstr "" msgid "Redo motion" -msgstr "" +msgstr "Refari movon" msgid "Redo paste" -msgstr "" +msgstr "Refari algluon" msgid "Redo typing" -msgstr "" +msgstr "Refari tajpadon" msgid "no Pd settings to clear" msgstr "" @@ -110,130 +113,130 @@ msgid "(re-save preferences to reinstate them)" msgstr "" msgid "File" -msgstr "" +msgstr "Dosiero" msgid "Edit" -msgstr "" +msgstr "Redakti" msgid "Put" -msgstr "" +msgstr "Meti" msgid "Find" -msgstr "" +msgstr "Trovi" msgid "Media" -msgstr "" +msgstr "Aŭdvidaĵo" msgid "Window" -msgstr "" +msgstr "Fenestro" msgid "Help" -msgstr "" +msgstr "Helpo" msgid "Show &Hidden Files and Directories" msgstr "" msgid "Copy" -msgstr "" +msgstr "Kopii" msgid "Paste" -msgstr "" +msgstr "Alglui" msgid "Array Properties" -msgstr "" +msgstr "Atributoj pri tabelo" msgid "Array" -msgstr "" +msgstr "Tabelo" msgid "Name:" -msgstr "" +msgstr "Nomo:" msgid "Size:" -msgstr "" +msgstr "Grando:" msgid "Save contents" -msgstr "" +msgstr "Konservi la enhavon" msgid "Draw as:" -msgstr "" +msgstr "Desegni kiel jenon:" msgid "Polygon" -msgstr "" +msgstr "Plurlatero" msgid "Points" -msgstr "" +msgstr "Punktoj" msgid "Bezier curve" -msgstr "" +msgstr "Bézier-kurbo" msgid "Put array into:" -msgstr "" +msgstr "Meti tabelon en la jenon:" msgid "New graph" -msgstr "" +msgstr "Nova grafo" msgid "Last graph" -msgstr "" +msgstr "Lasta grafo" msgid "Options" -msgstr "" +msgstr "Opcioj" msgid "Open List View..." -msgstr "" +msgstr "Malfermi listan vidon…" msgid "Delete array" -msgstr "" +msgstr "Forviŝi tabelon" msgid "Cancel" -msgstr "" +msgstr "Nuligi" msgid "Apply" -msgstr "" +msgstr "Efektivigi" msgid "OK" -msgstr "" +msgstr "Bone" msgid "no device" -msgstr "" +msgstr "neniu aparato" msgid "(same as input device)..." -msgstr "" +msgstr "(sama kiel eniga aparato)…" msgid "Channels:" -msgstr "" +msgstr "Kanaloj:" msgid "Input Devices" -msgstr "" +msgstr "Enigaj aparatoj" msgid "Output Devices" -msgstr "" +msgstr "Eligaj aparatoj" msgid "Use Multiple Devices" -msgstr "" +msgstr "Uzi plurajn aparatojn" msgid "audio system" -msgstr "" +msgstr "sonsistemo" msgid "Settings" -msgstr "" +msgstr "Agordoj" msgid "Sample rate:" -msgstr "" +msgstr "Sampla ofto:" msgid "Delay (msec):" msgstr "" msgid "48k" -msgstr "" +msgstr "48k" msgid "44.1k" -msgstr "" +msgstr "44,1k" msgid "96k" -msgstr "" +msgstr "96k" msgid "Block size:" -msgstr "" +msgstr "Grando de bloko:" msgid "Use callbacks" msgstr "" @@ -242,16 +245,16 @@ msgid "Audio Settings" msgstr "" msgid "Save All Settings" -msgstr "" +msgstr "Konservi ĉiujn agordojn" msgid "WARNING: unknown graphme flags received in pdtk_canvas_dialog" msgstr "" msgid "Canvas Properties" -msgstr "" +msgstr "Atributoj de kanvaso" msgid "Scale" -msgstr "" +msgstr "Skalo" msgid "X units per pixel:" msgstr "" @@ -263,46 +266,46 @@ msgid "Appearance on parent patch" msgstr "" msgid "Graph-On-Parent" -msgstr "" +msgstr "Grafo-sur-patro" msgid "Hide object name and arguments" msgstr "" msgid "Range and size" -msgstr "" +msgstr "Gamo kaj grando" msgid "X range: from" -msgstr "" +msgstr "X-gamo: de" msgid "to" -msgstr "" +msgstr "al" msgid "Margin:" -msgstr "" +msgstr "Marĝeno:" msgid "Y range: from" -msgstr "" +msgstr "Y-gamo: de" msgid "Data Properties" -msgstr "" +msgstr "Datenaj atributoj" msgid "Send" -msgstr "" +msgstr "Sendi" msgid "Done" -msgstr "" +msgstr "Farite" #, tcl-format msgid "Found '%1$s' in %2$s" -msgstr "" +msgstr "Trovis «%1$s» en %2$s" #, tcl-format msgid "Couldn't find '%1$s' in %2$s" -msgstr "" +msgstr "Ne trovis «%1$s» en %2$s" #, tcl-format msgid "Search in %s for:" -msgstr "" +msgstr "Serĉi en %s pri:" #, tcl-format msgid "Showed last '%1$s' in %2$s" @@ -313,86 +316,86 @@ msgid "Showing '%1$d' out of %2$d items in %3$s" msgstr "" msgid "Pd window" -msgstr "" +msgstr "Pd-fenestro" msgid "Match whole word only" msgstr "" msgid "Close" -msgstr "" +msgstr "Fermi" #, tcl-format msgid "%s Font" -msgstr "" +msgstr "Tiparo %s" msgid "Font" -msgstr "" +msgstr "Tiparo" msgid "Font Size" -msgstr "" +msgstr "Tipara grando" msgid "Stretch" msgstr "" msgid "X and Y" -msgstr "" +msgstr "X kaj Y" msgid "X only" -msgstr "" +msgstr "Nur X" msgid "Y only" -msgstr "" +msgstr "Nur Y" msgid "GUI Box Properties" msgstr "" msgid "Messages" -msgstr "" +msgstr "Mesaĝoj" msgid "Send symbol:" -msgstr "" +msgstr "Sendi simbolon:" msgid "Receive symbol:" -msgstr "" +msgstr "Ricevi simbolon:" msgid "auto" -msgstr "" +msgstr "aŭtomata" msgid "Width:" -msgstr "" +msgstr "Larĝo:" msgid "Limits" -msgstr "" +msgstr "Limoj" msgid "Lower:" -msgstr "" +msgstr "Malsupra:" msgid "Upper:" -msgstr "" +msgstr "Supra:" msgid "Label" -msgstr "" +msgstr "Etikedo" msgid "Left" -msgstr "" +msgstr "Maldekstra" msgid "Right" -msgstr "" +msgstr "Dekstra" msgid "Top" -msgstr "" +msgstr "Supra" msgid "Bottom" -msgstr "" +msgstr "Malsupra" msgid "Background color" -msgstr "" +msgstr "Fona koloro" msgid "Foreground color" -msgstr "" +msgstr "Malfona koloro" msgid "Label color" -msgstr "" +msgstr "Etikeda koloro" msgid "Bang" msgstr "" @@ -401,34 +404,34 @@ msgid "Flash Time (msec)" msgstr "" msgid "Min:" -msgstr "" +msgstr "Minimumo:" msgid "Max:" -msgstr "" +msgstr "Maksimumo:" msgid "Toggle" -msgstr "" +msgstr "Baskuligi" msgid "Non Zero Value" -msgstr "" +msgstr "Nenula valoro" msgid "Value:" -msgstr "" +msgstr "Valoro:" msgid "Number2" -msgstr "" +msgstr "Nombro2" msgid "Width (digits):" -msgstr "" +msgstr "Larĝo (ciferoj):" msgid "Height:" -msgstr "" +msgstr "Alto:" msgid "Output Range" -msgstr "" +msgstr "Eliga gamo" msgid "Log height:" -msgstr "" +msgstr "Logaritma alto:" msgid "Vslider" msgstr "" @@ -449,7 +452,7 @@ msgid "VU Meter" msgstr "" msgid "Canvas" -msgstr "" +msgstr "Kanvaso" msgid "Visible Rectangle (pix)" msgstr "" @@ -459,7 +462,7 @@ msgid "%s Properties" msgstr "" msgid "Parameters" -msgstr "" +msgstr "Parametroj" msgid "Init" msgstr "" @@ -480,13 +483,13 @@ msgid "Y offset:" msgstr "" msgid "Colors" -msgstr "" +msgstr "Koloroj" msgid "Background" -msgstr "" +msgstr "Fono" msgid "Front" -msgstr "" +msgstr "Malfono" msgid "Compose color" msgstr "" @@ -495,7 +498,7 @@ msgid "Test label" msgstr "" msgid "Send a Pd message" -msgstr "" +msgstr "Sendi Pd-mesaĝon" msgid "(use arrow keys for history)" msgstr "" @@ -504,16 +507,16 @@ msgid "no input devices" msgstr "" msgid "In Ports:" -msgstr "" +msgstr "En-pordoj:" msgid "Out Ports:" -msgstr "" +msgstr "El-pordoj:" msgid "MIDI system" -msgstr "" +msgstr "MIDI-sistemo" msgid "MIDI Settings" -msgstr "" +msgstr "Agordoj pri MIDI" msgid "ALSA MIDI Settings" msgstr "" @@ -522,7 +525,7 @@ msgid "Pd search path for objects, help, audio, text and other files" msgstr "" msgid "Use standard paths" -msgstr "" +msgstr "Uzi normajn dosierlokojn" msgid "Verbose" msgstr "" @@ -531,13 +534,13 @@ msgid "Pd Documents Directory" msgstr "" msgid "Browse" -msgstr "" +msgstr "Foliumi" msgid "Reset" msgstr "" msgid "Disable" -msgstr "" +msgstr "Malŝalti" msgid "Externals Install Directory" msgstr "" @@ -568,7 +571,7 @@ msgid "Zoom New Windows" msgstr "" msgid "GUI settings" -msgstr "" +msgstr "Agordoj pri grafika fasado" msgid "preference layout (reopen the preferences to see the effect)" msgstr "" @@ -586,7 +589,7 @@ msgid "Highlight active cord while connecting" msgstr "" msgid "Preferences" -msgstr "" +msgstr "Preferoj" msgid "startup preferences" msgstr "" @@ -595,7 +598,7 @@ msgid "audio preferences" msgstr "" msgid "MIDI preferences" -msgstr "" +msgstr "Preferoj pri MIDI" msgid "deken preferences" msgstr "" @@ -604,10 +607,10 @@ msgid "misc preferences" msgstr "" msgid "Add new library" -msgstr "" +msgstr "Aldoni novan bibliotekon" msgid "Edit library" -msgstr "" +msgstr "Modifi bibliotekon" msgid "Settings below require a restart of Pd!" msgstr "" @@ -619,22 +622,22 @@ msgid "GUI options" msgstr "" msgid "language" -msgstr "" +msgstr "lingvo" msgid "Menu language" -msgstr "" +msgstr "Menua lingvo" msgid "float (32bit)" -msgstr "" +msgstr "32-bita glitkomo" msgid "double (64bit) EXPERIMENTAL" -msgstr "" +msgstr "64-bita glitkomo EKSPERIMENTA" msgid "double (64bit)" -msgstr "" +msgstr "64-bita glitkomo" msgid "float size" -msgstr "" +msgstr "glitkoma grando" msgid "Numeric precision of Pd-core" msgstr "" @@ -649,13 +652,13 @@ msgid "Startup flags:" msgstr "" msgid "Help Browser" -msgstr "" +msgstr "Helpo-legilo" msgid "Associated Files" -msgstr "" +msgstr "Asociitaj dosieroj" msgid "Pd Files" -msgstr "" +msgstr "Pd-dosieroj" msgid "Max Patch Files" msgstr "" @@ -825,10 +828,10 @@ msgid "Unable to rename downloaded file to '%s'" msgstr "" msgid "Create" -msgstr "" +msgstr "Krei" msgid "Check" -msgstr "" +msgstr "Kontroli" msgid "Installation options:" msgstr "" @@ -955,14 +958,14 @@ msgid "Show all" msgstr "" msgid "Search" -msgstr "" +msgstr "Serĉi" #, tcl-format msgid "Install (%d)" -msgstr "" +msgstr "Instali (%d)" msgid "Install" -msgstr "" +msgstr "Instali" #, tcl-format msgid "%s%% of download completed" @@ -972,7 +975,7 @@ msgid "Enter an exact library or object name." msgstr "" msgid "e.g. 'freeverb~'" -msgstr "" +msgstr "ekz. «freeverb~»" msgid "Use the '*' wildcard to match any number of characters." msgstr "" @@ -996,25 +999,25 @@ msgid "Find externals" msgstr "" msgid "Install DEK file..." -msgstr "" +msgstr "Instali DEK-dosieron…" msgid "Preferences..." -msgstr "" +msgstr "Preferoj…" msgid "Search for: " -msgstr "" +msgstr "Serĉi la jenon: " msgid "libraries" -msgstr "" +msgstr "bibliotekoj" msgid "objects" -msgstr "" +msgstr "objektoj" msgid "both" -msgstr "" +msgstr "ambaŭ" msgid "translations" -msgstr "" +msgstr "tradukoj" msgid "Only install externals uploaded by people you trust." msgstr "" @@ -1023,29 +1026,29 @@ msgid "Disabling tabbed view: incompatible Tcl/Tk detected" msgstr "" msgid "Library" -msgstr "" +msgstr "Biblioteko" msgid "Version" -msgstr "" +msgstr "Versio" msgid "Description" -msgstr "" +msgstr "Priskribo" msgid "Uploader" -msgstr "" +msgstr "Alŝutinto" msgid "Date" -msgstr "" +msgstr "Dato" msgid "Search Results" -msgstr "" +msgstr "Serĉaj rezultoj" msgid "Log" -msgstr "" +msgstr "Protokolo" #, tcl-format msgid "Searching for \"%s\"..." -msgstr "" +msgstr "Serĉante «%s»…" #, tcl-format msgid "online? %s" @@ -1075,7 +1078,7 @@ msgstr "" #, tcl-format msgid "Install %1$s to %2$s?" -msgstr "" +msgstr "Ĉu instali %1$s al %2$s?" #, tcl-format msgid "Cancelling download of '%s': No installation directory given." @@ -1086,17 +1089,17 @@ msgstr "" #, tcl-format msgid "Unable to install to '%s'" -msgstr "" +msgstr "Ne povas instali al «%s»" msgid "Directory does not exist!" -msgstr "" +msgstr "Dosierujo ne ekzistas!" msgid "Directory is not writable!" msgstr "" #, tcl-format msgid "Downloading '%s'" -msgstr "" +msgstr "Elŝutante «%s»" #, tcl-format msgid "Commencing download of '%1$s' into '%2$s'..." @@ -1110,7 +1113,7 @@ msgid "Downloading '%s' failed" msgstr "" msgid "Download failed!" -msgstr "" +msgstr "Elŝuto malsukcesis!" msgid "Download completed! Verifying..." msgstr "" @@ -1149,7 +1152,7 @@ msgid "Searching for '%s' failed!" msgstr "" msgid "Search failed" -msgstr "" +msgstr "Serĉo malsukcesis" msgid "Unable to perform search." msgstr "" @@ -1158,23 +1161,23 @@ msgid "Select package for installation" msgstr "" msgid "Deselect package" -msgstr "" +msgstr "Malelekti pakon" msgid "Open package webpage" msgstr "" msgid "Copy package URL" -msgstr "" +msgstr "Kopii retadreson de pako" msgid "Copy SHA256 checksum URL" -msgstr "" +msgstr "Kopii adreson de SHA256-kontrolsumo" msgid "Copy OpenGPG signature URL" -msgstr "" +msgstr "Kopii adreson de OpenGPG-signaturo" #, tcl-format msgid "Uninstall '%s'" -msgstr "" +msgstr "Malinstali «%s»" #, tcl-format msgid "" @@ -1224,145 +1227,145 @@ msgid "The language can only be set during startup." msgstr "" msgid "Afrikaans" -msgstr "" +msgstr "Afrikanso" msgid "Arabic" -msgstr "" +msgstr "Araba" msgid "Azerbaijani" -msgstr "" +msgstr "Azerbajĝana" msgid "Belarusian" -msgstr "" +msgstr "Belorusa" msgid "Bulgarian" -msgstr "" +msgstr "Bulgara" msgid "German" -msgstr "" +msgstr "Germana" msgid "German (Austria)" -msgstr "" +msgstr "Germana (aŭstra)" msgid "Greek" -msgstr "" +msgstr "Greka" msgid "English" -msgstr "" +msgstr "Angla" msgid "English (Canada)" -msgstr "" +msgstr "Angla (Kanada)" msgid "English (UK)" -msgstr "" +msgstr "Angla (brita)" msgid "English (USA)" -msgstr "" +msgstr "Angla (Usona)" msgid "Spanish" -msgstr "" +msgstr "Hispana" msgid "Basque" -msgstr "" +msgstr "Eŭska" msgid "Finnish" -msgstr "" +msgstr "Finna" msgid "French" -msgstr "" +msgstr "Franca" msgid "Gujarati" -msgstr "" +msgstr "Guĝarata" msgid "Hebrew" -msgstr "" +msgstr "Hebrea" msgid "Hindi" -msgstr "" +msgstr "Hindia" msgid "Hungarian" -msgstr "" +msgstr "Hungara" msgid "Armenian" -msgstr "" +msgstr "Armena" msgid "Italian" -msgstr "" +msgstr "Itala" msgid "Indonesian" -msgstr "" +msgstr "Indonezia" msgid "Japanese" -msgstr "" +msgstr "Japana" msgid "Korean" -msgstr "" +msgstr "Korea" msgid "Dutch" -msgstr "" +msgstr "Nederlanda" msgid "Panjabi" -msgstr "" +msgstr "Panĝaba" msgid "Polish" -msgstr "" +msgstr "Pola" msgid "Portuguese" -msgstr "" +msgstr "Portugala" msgid "Portuguese (Brazil)" -msgstr "" +msgstr "Portugala (Brazila)" msgid "Portuguese (Portugal)" -msgstr "" +msgstr "Portugala (Portugalia)" msgid "Russian" -msgstr "" +msgstr "Rusa" msgid "Albanian" -msgstr "" +msgstr "Albana" msgid "Swedish" -msgstr "" +msgstr "Sveda" msgid "Turkish" -msgstr "" +msgstr "Turka" msgid "Ukrainian" -msgstr "" +msgstr "Ukraina" msgid "Vietnamese" -msgstr "" +msgstr "Vjetnama" msgid "Chinese (Traditional)" -msgstr "" +msgstr "Ĉina (tradicia)" msgid "(no translation)" -msgstr "" +msgstr "(sen traduko)" #, tcl-format msgid "(default language: %s)" -msgstr "" +msgstr "(implicita lingvo: %s)" #, tcl-format msgid "ignoring '%s': doesn't exist" msgstr "" msgid "About Pd" -msgstr "" +msgstr "Pri Pd" #, tcl-format msgid "couldn't read \"%s\" document" msgstr "" msgid "Save" -msgstr "" +msgstr "Konservi" msgid "Save As..." -msgstr "" +msgstr "Konservi kiel…" msgid "Print..." -msgstr "" +msgstr "Presi…" msgid "Paste Replace" msgstr "" @@ -1371,10 +1374,10 @@ msgid "Duplicate" msgstr "" msgid "Zoom In" -msgstr "" +msgstr "Enzomi" msgid "Zoom Out" -msgstr "" +msgstr "Elzomi" msgid "Tidy Up" msgstr "" @@ -1386,61 +1389,61 @@ msgid "Triggerize" msgstr "" msgid "Edit Mode" -msgstr "" +msgstr "Redakta reĝimo" msgid "Undo" -msgstr "" +msgstr "Malfari" msgid "Redo" -msgstr "" +msgstr "Refari" msgid "New" -msgstr "" +msgstr "Nova" msgid "Open" -msgstr "" +msgstr "Malfermi" msgid "Message..." -msgstr "" +msgstr "Mesaĝo…" msgid "Cut" -msgstr "" +msgstr "Eltondi" msgid "Select All" -msgstr "" +msgstr "Elekti ĉiujn" msgid "Clear Console" -msgstr "" +msgstr "Forviŝi konzolon" msgid "Object" -msgstr "" +msgstr "Objekto" msgid "Message" -msgstr "" +msgstr "Mesaĝo" msgid "Number" -msgstr "" +msgstr "Nombro" msgid "List" -msgstr "" +msgstr "Listo" msgid "Symbol" -msgstr "" +msgstr "Simbolo" msgid "Comment" -msgstr "" +msgstr "Komento" msgid "Graph" -msgstr "" +msgstr "Grafo" msgid "Find..." -msgstr "" +msgstr "Trovi…" msgid "Find Again" -msgstr "" +msgstr "Retrovi" msgid "Find Last Error" -msgstr "" +msgstr "Trovi lastan eraron" msgid "DSP On" msgstr "" @@ -1455,49 +1458,49 @@ msgid "Load Meter" msgstr "" msgid "Audio Settings..." -msgstr "" +msgstr "Sonaj agordoj…" msgid "MIDI Settings..." -msgstr "" +msgstr "Agordoj pri MIDI…" msgid "Minimize" -msgstr "" +msgstr "Minimumigi" msgid "Zoom" -msgstr "" +msgstr "Zomi" msgid "Bring All to Front" -msgstr "" +msgstr "Malfonigi ĉiujn" msgid "Next Window" -msgstr "" +msgstr "Sekva fenestro" msgid "Previous Window" -msgstr "" +msgstr "Malsekva fenestro" msgid "Parent Window" -msgstr "" +msgstr "Patra fenestro" msgid "HTML Manual..." -msgstr "" +msgstr "HTML-manlibro…" msgid "Browser..." -msgstr "" +msgstr "Foliumilo…" msgid "List of objects..." -msgstr "" +msgstr "Listo de objektoj…" msgid "puredata.info" -msgstr "" +msgstr "puredata.info" msgid "Check for updates" -msgstr "" +msgstr "Kontroli ĝisdatigojn" msgid "Report a bug" -msgstr "" +msgstr "Raporti cimon" msgid "Clear Menu" -msgstr "" +msgstr "Forviŝi menuon" msgid "" "Delete all preferences?\n" @@ -1511,39 +1514,39 @@ msgid "no Pd-GUI settings to clear" msgstr "" msgid "Edit Preferences..." -msgstr "" +msgstr "Modifi preferojn…" msgid "Save All Preferences" -msgstr "" +msgstr "Konservi ĉiujn preferojn" msgid "Save to..." -msgstr "" +msgstr "Konservi al…" msgid "Load from..." -msgstr "" +msgstr "Ŝargi de…" msgid "Forget All..." -msgstr "" +msgstr "Forgesi ĉion…" msgid "Tabbed preferences" msgstr "" msgid "Open Recent" -msgstr "" +msgstr "Malfermi lastajn" msgid "Quit" -msgstr "" +msgstr "Forlasi" #, tcl-format msgid "Do you want to save the changes you made in '%s'?" msgstr "" msgid "Properties" -msgstr "" +msgstr "Atributoj" #, tcl-format msgid "Accept changes to '%s'?" -msgstr "" +msgstr "Ĉu akcepti ŝanĝojn pri «%s»?" msgid "" "Accepting will update the contents in the associated object. You still have " @@ -1565,50 +1568,50 @@ msgid "Audio off" msgstr "" msgid "Pd" -msgstr "" +msgstr "Pd" msgid "EXPERIMENTAL double (64bit) precision" -msgstr "" +msgstr "EKSPERIMENTA duobla (64-bita) glitkomo" #, tcl-format msgid "%dbit-floats EXPERIMENTAL" -msgstr "" +msgstr "%d-bita glitkomo EKSPERIMENTA" msgid "DSP" msgstr "" msgid "Audio I/O error" -msgstr "" +msgstr "Sona eneliga eraro" msgid "Log:" -msgstr "" +msgstr "Protokolo:" msgid "fatal" msgstr "" msgid "error" -msgstr "" +msgstr "eraro" msgid "normal" -msgstr "" +msgstr "normala" msgid "debug" -msgstr "" +msgstr "sencimiga" msgid "all" -msgstr "" +msgstr "ĉiaj" msgid "y1" -msgstr "" +msgstr "y1" msgid "New..." -msgstr "" +msgstr "Nova…" msgid "Edit..." -msgstr "" +msgstr "Redakti…" msgid "Delete" -msgstr "" +msgstr "Forigi" #, tcl-format msgid "ignoring '%s': doesn't look like a Pd file" From 3f34f164b84cbffcef007986ac9e7cac7bb37f5b Mon Sep 17 00:00:00 2001 From: phlostically Date: Fri, 5 Jul 2024 16:22:18 +0000 Subject: [PATCH 26/89] Translated using Weblate (Esperanto) Currently translated at 61.6% (305 of 495 strings) Translation: pure-data/Interface Translate-URL: https://hosted.weblate.org/projects/pure-data/pure-data/eo/ --- po/eo.po | 74 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/po/eo.po b/po/eo.po index c1db12a0..b96479be 100644 --- a/po/eo.po +++ b/po/eo.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: Pure Data 0.54.1\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" "POT-Creation-Date: 2024-05-06 10:09+0200\n" -"PO-Revision-Date: 2024-07-05 16:09+0000\n" +"PO-Revision-Date: 2024-07-06 17:09+0000\n" "Last-Translator: phlostically \n" "Language-Team: Esperanto \n" @@ -134,7 +134,7 @@ msgid "Help" msgstr "Helpo" msgid "Show &Hidden Files and Directories" -msgstr "" +msgstr "Montri &kaŝitajn dosierojn kaj dosierujojn" msgid "Copy" msgstr "Kopii" @@ -242,7 +242,7 @@ msgid "Use callbacks" msgstr "" msgid "Audio Settings" -msgstr "" +msgstr "Agordoj pri sono" msgid "Save All Settings" msgstr "Konservi ĉiujn agordojn" @@ -257,10 +257,10 @@ msgid "Scale" msgstr "Skalo" msgid "X units per pixel:" -msgstr "" +msgstr "X-unuoj en bildero:" msgid "Y units per pixel:" -msgstr "" +msgstr "Y-unuoj en bildero:" msgid "Appearance on parent patch" msgstr "" @@ -504,7 +504,7 @@ msgid "(use arrow keys for history)" msgstr "" msgid "no input devices" -msgstr "" +msgstr "neniu eniga aparato" msgid "In Ports:" msgstr "En-pordoj:" @@ -519,7 +519,7 @@ msgid "MIDI Settings" msgstr "Agordoj pri MIDI" msgid "ALSA MIDI Settings" -msgstr "" +msgstr "Agordoj pri ALSA MIDI" msgid "Pd search path for objects, help, audio, text and other files" msgstr "" @@ -568,7 +568,7 @@ msgid "Patch windows" msgstr "" msgid "Zoom New Windows" -msgstr "" +msgstr "Zomi novajn fenestrojn" msgid "GUI settings" msgstr "Agordoj pri grafika fasado" @@ -577,10 +577,10 @@ msgid "preference layout (reopen the preferences to see the effect)" msgstr "" msgid "use tabs" -msgstr "" +msgstr "uzi langetojn" msgid "single page" -msgstr "" +msgstr "unu paĝo" msgid "patching helpers" msgstr "" @@ -619,7 +619,7 @@ msgid "Pd libraries to load on startup" msgstr "" msgid "GUI options" -msgstr "" +msgstr "Opcioj pri grafika fasado" msgid "language" msgstr "lingvo" @@ -686,7 +686,7 @@ msgstr "" #, tcl-format msgid "using font: %1$s %2$s" -msgstr "" +msgstr "uzante la tiparon %1$s %2$s" #, tcl-format msgid "'%1$s' already loaded, ignoring: '%2$s'" @@ -702,7 +702,7 @@ msgstr "" #, tcl-format msgid "FAILED TO LOAD %s" -msgstr "" +msgstr "MALSUKCESIS ŜARGI %s" #, tcl-format msgid "Failed to read plugin %s ...skipping!" @@ -716,16 +716,16 @@ msgid "Pd startup failure" msgstr "" msgid "Failed to start Pd-core" -msgstr "" +msgstr "Malsukcesis lanĉi Pd-core" msgid "(Tcl) MISSING CLOSE-BRACE '}': " -msgstr "" +msgstr "(Tcl) MANKAS FERMA KUNIGA KRAMPO «}»: " msgid "(Tcl) INVALID COMMAND NAME: " -msgstr "" +msgstr "(Tcl) NEVALIDA NOMO DE KOMANDO: " msgid "(Tcl) UNHANDLED ERROR: " -msgstr "" +msgstr "(Tcl) NETRAKTITA ERARO: " #, tcl-format msgid "[deken] installed version [%1$s] > %2$s...skipping!" @@ -741,7 +741,7 @@ msgstr "" #, tcl-format msgid "installing deken package '%s'" -msgstr "" +msgstr "instalante deken-pakon «%s»" #, tcl-format msgid "ignoring '%s': doesn't look like a deken package" @@ -749,7 +749,7 @@ msgstr "" #, tcl-format msgid "Installing '%s'" -msgstr "" +msgstr "Instalante «%s»" #, tcl-format msgid "Successfully unzipped %1$s into %2$s." @@ -889,16 +889,16 @@ msgid "Checksum mismatch for '%s'" msgstr "" msgid "Deken Packages" -msgstr "" +msgstr "Deken-pakoj" msgid "ZIP Files" -msgstr "" +msgstr "ZIP-dosieroj" msgid "TAR Files" -msgstr "" +msgstr "TAR-dosieroj" msgid "All Files" -msgstr "" +msgstr "Ĉiuj dosieroj" #, tcl-format msgid "Uninstalling previous installation of '%s'" @@ -910,21 +910,21 @@ msgstr "" #, tcl-format msgid "Installing package '%s'" -msgstr "" +msgstr "Instalante la pakon «%s»" msgid "Installation completed!" -msgstr "" +msgstr "Finis instali!" #, tcl-format msgid "Successfully installed '%s'!" -msgstr "" +msgstr "Sukcese instalis «%s»!" msgid "Installation failed!" -msgstr "" +msgstr "Malsukcesis instali!" #, tcl-format msgid "Failed to install '%s'!" -msgstr "" +msgstr "Malsukcesis instali «%s»!" msgid "Package installation failed" msgstr "" @@ -955,7 +955,7 @@ msgid "Processed %d packages selected for installation." msgstr "" msgid "Show all" -msgstr "" +msgstr "Montri ĉion" msgid "Search" msgstr "Serĉi" @@ -1095,7 +1095,7 @@ msgid "Directory does not exist!" msgstr "Dosierujo ne ekzistas!" msgid "Directory is not writable!" -msgstr "" +msgstr "Ne eblas skribi en dosierujon!" #, tcl-format msgid "Downloading '%s'" @@ -1103,14 +1103,14 @@ msgstr "Elŝutante «%s»" #, tcl-format msgid "Commencing download of '%1$s' into '%2$s'..." -msgstr "" +msgstr "Ekelŝutante «%1$s» al «%2$s»…" msgid "aborting." msgstr "" #, tcl-format msgid "Downloading '%s' failed" -msgstr "" +msgstr "Malsukcesis elŝuti «%s»" msgid "Download failed!" msgstr "Elŝuto malsukcesis!" @@ -1119,10 +1119,10 @@ msgid "Download completed! Verifying..." msgstr "" msgid "Ignoring checksum mismatch" -msgstr "" +msgstr "Ignorante malsamecon de kontrolsumoj" msgid "Ignoring checksum errors" -msgstr "" +msgstr "Ignorante kontrolsumajn erarojn" #, tcl-format msgid "[deken] deken-plugin.tcl (Pd externals search) loaded from %s." @@ -1145,7 +1145,7 @@ msgstr "" #, tcl-format msgid "Uploaded by %1$s @ %2$s" -msgstr "" +msgstr "Alŝutita de %1$s je %2$s" #, tcl-format msgid "Searching for '%s' failed!" @@ -1529,7 +1529,7 @@ msgid "Forget All..." msgstr "Forgesi ĉion…" msgid "Tabbed preferences" -msgstr "" +msgstr "Langetaj preferoj" msgid "Open Recent" msgstr "Malfermi lastajn" @@ -1587,7 +1587,7 @@ msgid "Log:" msgstr "Protokolo:" msgid "fatal" -msgstr "" +msgstr "fatala" msgid "error" msgstr "eraro" From 69e6d416eb695eef9f1ed01e6ecfc3440c082c2a Mon Sep 17 00:00:00 2001 From: porres Date: Sat, 6 Jul 2024 18:51:50 -0300 Subject: [PATCH 27/89] add envelope and slew examples to slop~ closes https://github.com/pure-data/pddp/issues/226 --- doc/5.reference/slop~-help.pd | 434 +++++++++++++++++++++++----------- 1 file changed, 291 insertions(+), 143 deletions(-) diff --git a/doc/5.reference/slop~-help.pd b/doc/5.reference/slop~-help.pd index 7dc46fa7..1c3fc186 100644 --- a/doc/5.reference/slop~-help.pd +++ b/doc/5.reference/slop~-help.pd @@ -1,25 +1,23 @@ -#N canvas 304 34 927 598 12; -#X obj 35 122 osc~; +#N canvas 330 49 927 598 12; #X floatatom 35 96 5 0 0 0 - - - 0; -#X obj 81 478 tabwrite~ \$0-graph; -#X obj 107 447 metro 500; -#X obj 107 401 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1; -#X floatatom 116 159 5 0 10000 0 - - - 0; -#X floatatom 152 186 5 0 10000 0 - - - 0; -#X floatatom 224 269 5 0 0 0 - - - 0; -#X msg 83 133 set 0; -#X obj 224 292 / 100; -#X obj 152 209 / 100; -#X obj 81 363 slop~ 1000 1e+09 0 1e+09 0; -#X text 158 159 cutoff frequency in linear region; -#X floatatom 188 236 5 0 10000 0 - - - 0; -#X text 198 186 maximum downward slew of linear region; -#X text 231 226 asymptotic downward cutoff frequency (for downward slews greater than maximum), f 41; -#X text 273 267 maximum upward slew of linear region; -#X text 305 316 asymptotic upward cutoff frequency (for upward slews greater than maximum), f 41; -#X floatatom 260 323 5 0 10000 0 - - - 0; +#X obj 81 486 tabwrite~ \$0-graph; +#X obj 107 455 metro 500; +#X obj 107 414 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1; +#X floatatom 116 179 5 0 10000 0 - - - 0; +#X floatatom 152 206 5 0 10000 0 - - - 0; +#X floatatom 224 289 5 0 10000 0 - - - 0; +#X msg 83 153 set 0; +#X obj 224 312 / 100; +#X obj 152 229 / 100; +#X text 158 179 cutoff frequency in linear region; +#X floatatom 188 256 5 0 10000 0 - - - 0; +#X text 198 206 maximum downward slew of linear region; +#X text 231 246 asymptotic downward cutoff frequency (for downward slews greater than maximum), f 41; +#X text 273 287 maximum upward slew of linear region; +#X text 305 332 asymptotic upward cutoff frequency (for upward slews greater than maximum), f 40; +#X floatatom 260 343 5 0 10000 0 - - - 0; #X text 76 96 frequency of test oscillator; -#N canvas 321 28 964 672 compander-limiter 0; +#N canvas 477 38 964 672 compander-limiter 0; #N canvas 622 189 476 482 generate-test 0; #X obj 77 159 osc~ 440; #X obj 197 162 line~; @@ -57,7 +55,7 @@ #X connect 1 0 4 0; #X restore 607 610 pd resize; #X msg 624 579 20000; -#N canvas 455 23 698 690 parameters 0; +#N canvas 455 38 698 690 parameters 0; #X obj 191 14 inlet; #X obj 29 32 r \$0-limit; #X obj 37 55 r \$0-knee; @@ -104,7 +102,7 @@ #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; +#N canvas 92 344 334 253 set-speed 0; #X msg 115 81 set \$1; #X obj 95 43 inlet; #X obj 115 111 s \$0-speed-set; @@ -231,9 +229,7 @@ #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; -#X obj 161 107 f; -#X obj 161 132 / 10; +#X obj 161 112 r \$0-speed; #X obj 343 231 r \$0-testpulse; #X obj 357 289 tabwrite~ \$0-slop-out; #X obj 83 142 abs~; @@ -245,39 +241,35 @@ #X obj 47 428 *~; #X obj 47 563 outlet~; #X obj 343 517 tabwrite~ \$0-compander-out; -#X text 241 168 same envelope follower as in the peak meter example, f 26; +#X text 231 167 same envelope follower as in the peak meter example, f 26; #X text 130 322 "correct" the level by applying a gain calculated from the difference between the measured and desired level, f 27; -#X connect 0 0 7 0; -#X connect 0 0 13 0; -#X connect 1 0 6 0; -#X connect 1 0 12 0; -#X connect 2 0 3 0; +#X floatatom 161 138 5 0 0 0 - - - 0; +#X text 203 139 hz; +#X connect 0 0 5 0; +#X connect 0 0 11 0; +#X connect 1 0 4 0; +#X connect 1 0 10 0; +#X connect 2 0 16 0; #X connect 3 0 4 0; -#X connect 4 0 1 3; -#X connect 5 0 6 0; -#X connect 5 0 15 0; -#X connect 7 0 1 0; +#X connect 3 0 13 0; +#X connect 5 0 1 0; +#X connect 6 0 7 0; +#X connect 7 0 8 0; #X connect 8 0 9 0; -#X connect 9 0 10 0; -#X connect 10 0 11 0; -#X connect 11 0 13 1; -#X connect 12 0 9 1; -#X connect 12 0 8 0; -#X connect 13 0 14 0; -#X connect 13 0 15 0; +#X connect 9 0 11 1; +#X connect 10 0 7 1; +#X connect 10 0 6 0; +#X connect 11 0 12 0; +#X connect 11 0 13 0; +#X connect 16 0 1 3; #X restore 221 149 pd run-compander; #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; -#X text 841 397 limit; -#X text 872 422 expand; -#X text 872 452 compress; -#X text 876 480 noise gate; -#X msg 750 481 100 0 0 200 60 30; -#X msg 740 452 100 0 0 50 100 100; -#X msg 720 397 90 10 0 100 0 50; +#X text 827 367 no change; +#X text 835 397 limit; +#X text 868 422 expand; +#X text 868 452 compress; +#X text 872 480 noise gate; #N canvas 601 360 267 339 (subpatch) 0; #X obj 108 109 hsl 100 15 0 1 0 0 empty empty Volume 32 9 0 12 #dcdcdc #000000 #000000 0 1; #X obj 87 43 inlet~; @@ -338,72 +330,123 @@ #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 msg 710 368 100 0 0 100 0 5; +#X msg 720 397 90 10 0 100 0 5; +#X msg 730 424 100 0 0 200 100 10; +#X msg 740 452 100 0 0 50 100 10; +#X msg 750 481 100 0 0 200 60 3; #X connect 0 0 13 0; -#X connect 0 0 26 0; +#X connect 0 0 21 0; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 5 0 4 0; -#X connect 13 0 27 0; +#X connect 13 0 22 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 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; +#X connect 24 0 37 0; +#X connect 27 0 26 0; +#X connect 37 0 6 0; +#X connect 38 0 6 0; +#X connect 39 0 6 0; +#X connect 40 0 6 0; +#X connect 41 0 6 0; +#X restore 701 291 pd compander-limiter; +#N canvas 392 78 880 817 slew-limiter 0; +#X floatatom 134 76 6 0 1000 0 - - - 0; +#X obj 134 100 t f b; +#X obj 166 129 samplerate~; +#X obj 134 129 /; +#X obj 74 368 metro 500; +#X obj 54 402 tabwrite~ \$0-slew-graph; +#X floatatom 214 187 6 0 1000 0 - - - 0; +#X obj 214 211 t f b; +#X obj 246 239 samplerate~; +#X obj 214 240 /; +#X obj 54 191 osc~ 100; +#X text 184 75 max downward slope; +#X text 265 186 max upward slope; +#X text 419 32 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 61; +#X obj 74 326 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1; +#X text 98 325 <- start metronome to graph output, f 18; +#X text 83 17 Using [slop~] to make a slew limiter; +#X msg 280 372 \; pd dsp \$1; +#X obj 280 337 set-dsp-tgl; +#X text 310 341 DSP on/off; +#X obj 442 282 cnv 19 402 182 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 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 coords 0 1 999 -1 402 182 1 0 0; +#X restore 441 281 graph; +#X obj 137 49 hsl 162 19 628.3 100 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 217 161 hsl 162 19 628.3 100 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X floatatom 134 160 9 0 0 0 - - - 0; +#X obj 54 292 slop~ 1e+09 0.0142 0 0.0142 0; +#X floatatom 214 265 9 0 0 0 - - - 0; +#X text 419 174 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. See the HTML documentation (link on main page of this patch) for details., f 61; +#X floatatom 212 506 5 10 125 0 - - - 0; +#X floatatom 212 598 8 0 0 0 - - - 0; +#X obj 125 628 slop~ 1e+09, f 16; +#X obj 125 595 sig~; +#X obj 125 465 tgl 20 0 empty empty empty 17 7 0 10 #dcdcdc #000000 #000000 0 1; +#X floatatom 125 565 5 0 0 0 - - - 0; +#X text 254 489 amplitude per second, f 10; +#X obj 212 534 t f b; +#X obj 244 563 samplerate~; +#X obj 212 563 /; +#X obj 142 659 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1; +#X obj 142 686 metro 25; +#X obj 125 716 snapshot~; +#X obj 128 771 hsl 162 19 0 1 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X msg 212 483 1; +#X text 434 502 One way to look at it is that we define a maximum amplitude jump limit \, which slows the rising and falling of audio signals. On the example to the left we have immediate signal jumps that are slowed and smoothened by [slop~]., f 57; +#X text 434 582 Now \, instead of a fixed period of time that the change is smoothened \, like what you get with [line~] and [vline~] \, you get a fixed ramp step (or 'limit') no matter what the target point is. This means it has a fixed speed \, whereas [line~] and [vline~] provide a fixed time., f 57; +#X text 435 665 The input parameter is the step per sample. Hence \, the speed is then defined as "amplitude per second" when you divide it by the sample rate \, where a value of "1" means it takes one second to move from an amplitude value of 0 to 1 \, but it will take half a second to move from 0 to 0.5 \, test the values to the left., f 57; +#X floatatom 125 743 8 0 0 0 - - - 0; +#X text 166 659 <- convert to control data; +#X msg 140 498 0.5; +#X msg 149 527 0; +#X obj 212 458 loadbang; +#X text 278 590 amplitude per sample, f 11; #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 26 2; +#X connect 3 0 24 0; #X connect 4 0 5 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 420 78 763 564 peak-meter 0; +#X connect 9 0 26 0; +#X connect 10 0 25 0; +#X connect 14 0 4 0; +#X connect 18 0 17 0; +#X connect 22 0 0 0; +#X connect 23 0 6 0; +#X connect 24 0 25 2; +#X connect 25 0 5 0; +#X connect 26 0 25 4; +#X connect 28 0 35 0; +#X connect 29 0 30 4; +#X connect 29 0 30 2; +#X connect 30 0 40 0; +#X connect 31 0 30 0; +#X connect 32 0 33 0; +#X connect 33 0 31 0; +#X connect 35 0 37 0; +#X connect 35 1 36 0; +#X connect 36 0 37 1; +#X connect 37 0 29 0; +#X connect 38 0 39 0; +#X connect 39 0 40 0; +#X connect 40 0 46 0; +#X connect 42 0 28 0; +#X connect 46 0 41 0; +#X connect 48 0 33 0; +#X connect 49 0 33 0; +#X connect 50 0 42 0; +#X restore 701 243 pd slew-limiter; +#N canvas 590 165 749 548 peak-meter 0; #X floatatom 217 132 5 0 50 0 - \$0-decay-speed-init - 0; #N canvas 422 246 639 450 generate-test 0; #X obj 45 196 osc~ 440; @@ -498,25 +541,22 @@ #X connect 18 0 10 3; #X connect 20 0 1 2; #X connect 28 0 27 0; -#X restore 704 274 pd peak-meter; -#X text 129 132 set state (previously stored output); +#X restore 701 267 pd peak-meter; +#X text 129 152 set state (previously stored output); #N canvas 467 45 850 454 jitter-remover 0; -#X floatatom 132 194 5 0 100 0 - - - 0; +#X floatatom 132 204 7 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; #X obj 69 70 osc~ 100; #X obj 69 385 tabwrite~ \$0-jitter-graph; #X obj 69 101 clip~ -0.3 0.3; #X obj 186 85 osc~ 1000; -#X obj 186 110 *~ 0.03; #X obj 69 146 +~; #X obj 69 255 slop~ 0 0 1e+09 0 1e+09; -#X obj 132 218 / 1000; -#X text 179 193 jitter range \, 0 to 0.1; #X text 69 27 jitter remover; -#X text 411 150 Set the jitter range to zero to see the original signal and raise it to see smoothing.; -#X text 412 59 If you have a noisy sensor \, one approach to smoothing it is to set slop~ up to only react to motion past a certain window. The linear frequency cutoff is set to zero so that the output only changes when the input strays by more than the maximum upward or downward slew.; -#X text 120 308 <-- start metronome to graph output, f 20; +#X text 417 150 Set the jitter range to zero to see the original signal and raise it to see smoothing., f 53; +#X text 417 59 If you have a noisy sensor \, one approach to smoothing it is to set slop~ up to only react to motion past a certain window. The linear frequency cutoff is set to zero so that the output only changes when the input strays by more than the maximum upward or downward slew., f 53; +#X text 120 308 <-- start metronome to graph output, f 19; #X msg 281 108 \; pd dsp \$1; #X obj 281 73 set-dsp-tgl; #X text 312 77 DSP on/off; @@ -525,23 +565,26 @@ #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 obj 135 175 hsl 162 19 0 0.1 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 186 110 *~ 0.1; +#X text 190 203 jitter range (0 to 0.1); +#X connect 0 0 8 2; +#X connect 0 0 8 4; #X connect 1 0 4 0; #X connect 2 0 1 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 connect 5 0 7 0; +#X connect 6 0 19 0; +#X connect 7 0 8 0; +#X connect 8 0 4 0; +#X connect 14 0 13 0; +#X connect 18 0 0 0; +#X connect 19 0 7 1; +#X restore 701 317 pd jitter-remover; +#X text 688 216 Examples:; #X text 22 565 see also:; -#X obj 101 564 lop~; -#X obj 151 564 fexpr~; +#X obj 101 565 lop~; +#X obj 151 565 fexpr~; #X obj 24 44 slop~, f 7; #X obj 10 75 cnv 1 910 1 empty empty empty 8 12 0 13 #000000 #000000 0; #X obj 436 15 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; @@ -586,32 +629,137 @@ #X text 84 14 - slew-limiting / low-pass filter; #X restore 739 44 pd reference; #X text 837 43 <= click; -#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 497 103 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 412 <- start metronome to graph output, f 18; #X text 459 14 <- Open HTML reference; #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 obj 405 385 cnv 19 498 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0; +#X obj 405 398 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 array \$0-graph 1000 float 0; #X coords 0 1 999 -1 500 140 1 0 0; -#X restore 404 384 graph; +#X restore 404 397 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 obj 35 122 osc~ 110; +#X obj 81 377 slop~ 55 1e+09 0 1e+09 0, f 26; +#N canvas 460 83 810 730 non-linear-envelope 0; +#X obj 207 585 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1; +#X text 232 585 <-- start metronome to graph output, f 19; +#X obj 469 514 cnv 19 248 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0; +#N canvas 0 50 450 250 (subpatch) 0; +#X array \$0-adsr 4410 float 0; +#X coords 0 1 4409 0 250 140 1 0 0; +#X restore 468 513 graph; +#X obj 181 662 tabwrite~ \$0-adsr; +#X obj 181 383 vline~; +#X obj 293 202 t f f; +#X obj 181 82 trigger float float; +#X obj 254 414 expr 1000./$f1; +#X obj 181 548 slop~ 1e+09, f 18; +#X msg 181 328 0; +#X obj 181 110 != 0; +#X obj 535 387 v D_\$0; +#X floatatom 466 359 5 0 0 0 - - - 0; +#X obj 466 278 loadbang; +#X obj 466 329 unpack float float float float; +#X floatatom 535 359 5 0 0 0 - - - 0; +#X floatatom 604 359 5 0 0 0 - - - 0; +#X floatatom 673 359 5 0 0 0 - - - 0; +#X obj 306 361 v D_\$0; +#X obj 604 387 s S_\$0; +#X obj 343 174 r S_\$0; +#X obj 466 387 s A_\$0; +#X obj 304 490 expr 1000./$f1; +#X obj 304 445 r A_\$0; +#X obj 254 360 v R_\$0; +#X obj 673 387 v R_\$0; +#X obj 292 257 pack f f f; +#X obj 359 229 r A_\$0; +#X msg 292 286 \$1 \, \$2 0 \$3; +#X obj 293 174 f; +#X obj 181 140 sel 0 1; +#X obj 325 229 *; +#X obj 181 24 tgl 22 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X floatatom 181 55 4 0 0 0 - - - 0; +#X msg 466 305 500 250 0.5 1500; +#X obj 207 631 metro 150; +#X text 453 644 0; +#X text 453 504 1; +#X obj 49 595 *~; +#X obj 49 513 osc~ 440; +#X obj 49 634 output~; +#X text 212 24 gate; +#X floatatom 304 520 6 0 0 0 - - - 0; +#X floatatom 254 520 6 0 0 0 - - - 0; +#X text 464 416 attack; +#X text 537 416 decay; +#X text 601 416 sustain; +#X text 669 416 release; +#X floatatom 254 390 6 0 0 0 - - - 0; +#X floatatom 304 467 6 0 0 0 - - - 0; +#X floatatom 343 200 6 0 0 0 - - - 0; +#X text 446 48 Here we use [vline~] and [slop~] to make a non-linear ADSR envelope. This example is hopefully simple enough to not require more details in the HTML reference., f 43; +#X text 446 118 This example uses [vline~] to schedule an attack and decay stage when receiving a gate on message. The sustain point is defined as a ratio of the gate value. The attack \, decay and release time are defined in ms and are converted to values in Hz., f 43; +#X connect 0 0 36 0; +#X connect 5 0 9 0; +#X connect 6 0 27 0; +#X connect 6 1 32 0; +#X connect 7 0 11 0; +#X connect 7 1 30 1; +#X connect 8 0 44 0; +#X connect 9 0 4 0; +#X connect 9 0 39 1; +#X connect 10 0 5 0; +#X connect 11 0 31 0; +#X connect 13 0 22 0; +#X connect 14 0 35 0; +#X connect 15 0 13 0; +#X connect 15 1 16 0; +#X connect 15 2 17 0; +#X connect 15 3 18 0; +#X connect 16 0 12 0; +#X connect 17 0 20 0; +#X connect 18 0 26 0; +#X connect 19 0 49 0; +#X connect 21 0 51 0; +#X connect 23 0 43 0; +#X connect 24 0 50 0; +#X connect 25 0 49 0; +#X connect 27 0 29 0; +#X connect 28 0 27 2; +#X connect 29 0 5 0; +#X connect 30 0 6 0; +#X connect 31 0 25 0; +#X connect 31 0 10 0; +#X connect 31 1 19 0; +#X connect 31 1 30 0; +#X connect 32 0 27 1; +#X connect 33 0 34 0; +#X connect 34 0 7 0; +#X connect 35 0 15 0; +#X connect 36 0 4 0; +#X connect 39 0 41 0; +#X connect 40 0 39 0; +#X connect 43 0 9 5; +#X connect 44 0 9 3; +#X connect 49 0 8 0; +#X connect 50 0 23 0; +#X connect 51 0 32 1; +#X restore 701 343 pd non-linear-envelope; +#X connect 0 0 44 0; +#X connect 2 0 1 0; #X connect 3 0 2 0; -#X connect 4 0 3 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; +#X connect 4 0 45 1; +#X connect 5 0 9 0; +#X connect 6 0 8 0; +#X connect 7 0 45 0; +#X connect 8 0 45 4; +#X connect 9 0 45 2; +#X connect 11 0 45 3; +#X connect 16 0 45 5; +#X connect 29 0 31 0; +#X connect 39 0 38 0; +#X connect 44 0 45 0; +#X connect 45 0 1 0; From b30cd6e7f04cc4771847fcbd6659b478e765284c Mon Sep 17 00:00:00 2001 From: porres Date: Sat, 6 Jul 2024 19:44:55 -0300 Subject: [PATCH 28/89] add 'monophonic] example to [poly] --- doc/3.audio.examples/C10.monophonic.synth.pd | 59 +++++++------ doc/3.audio.examples/J08.classicsynth.pd | 79 +++++++++-------- doc/5.reference/poly-help.pd | 90 +++++++++++++++----- 3 files changed, 139 insertions(+), 89 deletions(-) diff --git a/doc/3.audio.examples/C10.monophonic.synth.pd b/doc/3.audio.examples/C10.monophonic.synth.pd index 85827341..19332103 100644 --- a/doc/3.audio.examples/C10.monophonic.synth.pd +++ b/doc/3.audio.examples/C10.monophonic.synth.pd @@ -1,4 +1,4 @@ -#N canvas 413 23 549 723 12; +#N canvas 450 38 576 870 12; #X declare -stdpath ./; #X obj 109 552 mtof; #X obj 109 501 stripnote; @@ -17,13 +17,11 @@ #X obj 190 613 line~; #X msg 190 582 \$1 100; #X msg 260 583 0 1000; -#X text 39 100 First \, at top \, incoming MIDI notes are parsed and used to set pitch and trigger an ADSR envelope. Second \, the envelope generator itself has been extended to offer controls over the time and target values via number boxes.; -#X text 41 46 This patch shows how to make a monophonic synthesizer that could be controlled from a MIDI or voltage-control keyboard--in this example we assume MIDI.; #X msg 232 333 55 64; #X msg 325 333 55 0; #X msg 184 333 48 64; #X msg 282 333 48 0; -#X text 38 167 The note-off testing is complicated by the fact that we have to test both that the velocity is zero \, and further that the note-off pitch matches the pitch that is now playing (the most recent note-on pitch.); +#X text 39 142 The note-off testing is complicated by the fact that we have to test both that the velocity is zero \, and further that the note-off pitch matches the pitch that is now playing (the most recent note-on pitch.), f 58; #X text 311 427 b - bang to recall velocity; #X obj 251 480 sel 0; #X text 273 501 on; @@ -44,21 +42,22 @@ #X text 355 573 note-on pitch; #X obj 99 729 *~; #X obj 190 555 / 127; -#X text 38 233 The synthesis technique is the same as in the previous patch \, done in a simpler (but less general) way with a cos~ object replacing the wavetable lookup.; #X obj 172 693 *~ 2; #X obj 190 642 +~ 0.5; -#X text 218 713 The +~ 0.5 and *~ 2 are fudge factors.; -#X text 218 674 This replaces the tabread4~; #X text 216 694 in the previous patch.; #X text 144 308 These buttons simulate MIDI input.; -#X text 49 476 filter note-on messages, f 8; #X text 240 606 envelope generator now controls amplitude as well as grain size, f 31; #X obj 390 7 declare -stdpath ./; -#X connect 0 0 30 0; +#X text 41 45 This patch shows how to make a monophonic synthesizer that could be controlled from a MIDI keyboard. First \, at top \, incoming MIDI notes are parsed and used to set pitch and trigger an ADSR envelope. Second \, the envelope generator itself has been extended to offer controls over the time and target values via number boxes., f 58; +#X text 37 481 filter note-off messages, f 8; +#X text 38 212 The synthesis technique is the same as in the previous patch \, done in a simpler (but less general) way with a [cos~] object replacing the wavetable lookup., f 58; +#X text 218 713 The [+~ 0.5] and [*~ 2] are fudge factors.; +#X text 218 674 This replaces the [tabread4~]; +#X connect 0 0 28 0; #X connect 1 0 2 1; #X connect 1 0 0 0; #X connect 2 0 16 0; -#X connect 3 0 25 0; +#X connect 3 0 23 0; #X connect 4 0 3 0; #X connect 4 1 5 1; #X connect 5 0 2 0; @@ -69,27 +68,27 @@ #X connect 12 0 13 0; #X connect 12 1 13 1; #X connect 13 0 11 0; -#X connect 14 0 42 1; -#X connect 14 0 46 0; +#X connect 14 0 40 1; +#X connect 14 0 43 0; #X connect 15 0 14 0; #X connect 16 0 14 0; +#X connect 17 0 11 0; +#X connect 18 0 11 0; #X connect 19 0 11 0; #X connect 20 0 11 0; -#X connect 21 0 11 0; -#X connect 22 0 11 0; -#X connect 25 0 5 0; -#X connect 25 1 43 0; -#X connect 28 0 27 0; -#X connect 29 0 42 0; -#X connect 30 0 31 0; -#X connect 31 0 33 0; -#X connect 31 0 32 0; -#X connect 32 0 34 0; -#X connect 33 0 45 0; -#X connect 34 0 29 0; -#X connect 36 0 29 1; -#X connect 37 0 11 0; -#X connect 42 0 28 0; -#X connect 43 0 15 0; -#X connect 45 0 36 0; -#X connect 46 0 33 1; +#X connect 23 0 5 0; +#X connect 23 1 41 0; +#X connect 26 0 25 0; +#X connect 27 0 40 0; +#X connect 28 0 29 0; +#X connect 29 0 31 0; +#X connect 29 0 30 0; +#X connect 30 0 32 0; +#X connect 31 0 42 0; +#X connect 32 0 27 0; +#X connect 34 0 27 1; +#X connect 35 0 11 0; +#X connect 40 0 26 0; +#X connect 41 0 15 0; +#X connect 42 0 34 0; +#X connect 43 0 31 1; diff --git a/doc/3.audio.examples/J08.classicsynth.pd b/doc/3.audio.examples/J08.classicsynth.pd index 2668c7ec..e878c086 100644 --- a/doc/3.audio.examples/J08.classicsynth.pd +++ b/doc/3.audio.examples/J08.classicsynth.pd @@ -67,21 +67,20 @@ #X connect 28 5 25 1; #X restore 108 224 pd 16x; #X obj 108 331 output~; -#X text 313 585 Updated for Pd version 0.39; +#X text 313 612 Updated for Pd version 0.39; #X text 45 22 THE CLASSIC SUBTRACTIVE SYNTH SOUND; -#X obj 189 196 *~; +#X obj 188 196 *~; #X obj 188 166 +~ 0.2; -#X obj 188 220 *~ 2000; +#X obj 188 221 *~ 2000; #X obj 175 296 *~; #X obj 108 292 *~; #X obj 108 186 mtof; #X obj 68 66 r \$0-note; #X obj 68 121 makenote 1; -#X obj 379 233 + 20; -#X obj 379 182 metro 300; -#X obj 379 158 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 379 291 s \$0-note; -#X obj 379 205 random 70; +#X obj 372 210 + 20; +#X obj 372 125 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 372 299 s \$0-note; +#X obj 372 182 random 70; #X obj 108 256 vcf~ 3; #X floatatom 265 173 6 0 0 0 - - - 0; #X floatatom 265 221 7 0 0 0 - - - 0; @@ -89,39 +88,47 @@ #X obj 175 260 adsr 2 30 200 50 500; #X obj 188 141 adsr 1 10 200 50 500; #X obj 82 151 poly 1 1; -#X floatatom 439 158 6 0 0 0 - - - 0; -#X floatatom 446 241 5 0 0 0 - - - 0; -#X text 54 404 Now that we can make reasonably high-quality classic waveforms using upsampling \, we combine an upsampled oscillator with a "vcf" filter and ADSR generators to control the filter resonant frequency and the amplitude to make the classic subtractive synthesis sound. Send an "s \$0-note" object a (pitch \, duration) pair to play a note. (Classic VC synths did not have velocity sensitive keyboards!) You can add controls to change the parameters of the ADSR envelopes and/or the vcf~ "Q" parameter. The oscillators' waveforms and tuning relationship is controlled by other parameters set within the "pd 16x" window., f 64; +#X floatatom 432 125 6 0 0 0 - - - 0; +#X floatatom 439 218 5 0 0 0 - - - 0; #X obj 68 92 unpack f f; #X obj 386 27 declare -stdpath ./; -#X obj 379 265 pack f 200; -#X connect 0 0 17 0; +#X listbox 372 271 10 0 0 0 - - - 0; +#X text 448 267 picth and duration, f 9; +#X text 478 217 duration; +#X obj 175 108 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 372 242 pack f 300; +#X obj 372 159 metro 500; +#X text 54 545 You can add controls to change the parameters of the ADSR envelopes and/or the [vcf~] "Q" parameter. The oscillators' waveforms and tuning relationship is controlled by other parameters set within the [pd 16x] subwindow., f 67; +#X text 54 407 Now that we can make reasonably high-quality classic waveforms using upsampling \, we combine an upsampled oscillator with a "VCF" filter and ADSR generators to control the filter resonant frequency and the amplitude to make the classic subtractive synthesis sound. Send an [s \$0-note] object a pitch/duration pair to play a note \, wihch is sent to [makenote] to generate note ons/offs and the [poly] object is used here to make it a simple polyphonic synth. The velocity is set in [makenote] to an amplitude of "1" (note that classic VC synths did not have velocity sensitive keyboards!), f 67; +#X connect 0 0 16 0; #X connect 4 0 6 0; #X connect 5 0 4 0; #X connect 5 0 4 1; -#X connect 6 0 17 1; +#X connect 6 0 16 1; #X connect 7 0 8 1; #X connect 8 0 1 0; #X connect 9 0 0 0; -#X connect 10 0 27 0; -#X connect 11 0 23 0; -#X connect 11 1 23 1; -#X connect 12 0 29 0; -#X connect 13 0 16 0; -#X connect 14 0 13 0; -#X connect 16 0 12 0; -#X connect 17 0 8 0; -#X connect 18 0 20 0; -#X connect 19 0 6 1; -#X connect 20 0 19 0; -#X connect 21 0 7 0; -#X connect 21 0 7 1; -#X connect 22 0 5 0; -#X connect 23 1 9 0; -#X connect 23 2 22 0; -#X connect 23 2 21 0; -#X connect 24 0 13 1; -#X connect 25 0 29 1; -#X connect 27 0 11 0; -#X connect 27 1 11 2; -#X connect 29 0 15 0; +#X connect 10 0 25 0; +#X connect 11 0 22 0; +#X connect 11 1 22 1; +#X connect 12 0 31 0; +#X connect 13 0 32 0; +#X connect 15 0 12 0; +#X connect 16 0 8 0; +#X connect 17 0 19 0; +#X connect 18 0 6 1; +#X connect 19 0 18 0; +#X connect 20 0 7 0; +#X connect 20 0 7 1; +#X connect 21 0 5 0; +#X connect 22 1 9 0; +#X connect 22 2 30 0; +#X connect 23 0 32 1; +#X connect 24 0 31 1; +#X connect 25 0 11 0; +#X connect 25 1 11 2; +#X connect 27 0 14 0; +#X connect 30 0 21 0; +#X connect 30 0 20 0; +#X connect 31 0 27 0; +#X connect 32 0 15 0; diff --git a/doc/5.reference/poly-help.pd b/doc/5.reference/poly-help.pd index 9911141b..c2b6a21d 100644 --- a/doc/5.reference/poly-help.pd +++ b/doc/5.reference/poly-help.pd @@ -1,4 +1,4 @@ -#N canvas 420 23 567 557 12; +#N canvas 459 95 567 557 12; #X declare -stdpath ./; #X text 16 519 see also:; #X obj 29 16 poly; @@ -9,10 +9,6 @@ #X text 68 16 - MIDI-style polyphonic voice allocator; #X listbox 92 379 13 0 0 0 - - - 0; #X obj 92 349 pack f f f; -#X msg 52 231 60 \$1; -#X msg 99 231 62 \$1; -#X msg 146 231 65 \$1; -#X msg 194 231 69 \$1; #X text 248 260 clear memory; #X text 249 286 flush hanging note on messages; #X obj 9 50 cnv 1 550 1 empty empty empty 8 12 0 13 #000000 #000000 0; @@ -88,7 +84,7 @@ #X connect 13 0 8 0; #X connect 14 0 6 0; #X connect 14 1 6 1; -#X restore 464 449 pd clone; +#X restore 444 449 pd clone; #X text 166 319 <-- first argument \, number of voices second; #X text 195 335 argument selects voice stealing; #X text 339 521 updated for Pd version 0.54-1; @@ -96,26 +92,74 @@ #X obj 163 518 notein; #X text 40 62 The [poly] object takes pitch in the left inlet and velocity in the right inlet \, but the example here takes a list input \, which gets spread at inlets (as is common in Pd). The output is voice number (left outlet) \, pitch (mid outlet) and velocity (right outlet)., f 68; #X text 39 125 You can pack the output and use the [route] object to route messages to different voices (as below) or feed it [clone] (see example in [pd clone]). The [poly] object can be configured to do voice stealing with the 2nd argument (the default is 'no stealing')., f 68; +#X msg 52 231 72 \$1; +#X msg 99 231 74 \$1; +#X msg 146 231 77 \$1; +#X msg 194 231 81 \$1; +#N canvas 661 49 444 661 monophonic 0; +#X obj 163 454 output~; +#X obj 171 240 notein; +#X obj 163 354 osc~; +#X obj 163 393 *~; +#X obj 163 318 mtof; +#X obj 209 416 pow~ 4; +#X obj 209 311 / 127; +#X obj 209 377 line~; +#X msg 209 341 \$1 150; +#X obj 137 274 poly 1 1; +#X obj 232 131 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 64; +#X obj 90 131 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 64; +#X obj 137 131 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 64; +#X obj 184 131 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 64; +#X msg 90 157 72 \$1; +#X msg 184 157 77 \$1; +#X msg 232 157 81 \$1; +#X listbox 137 207 10 0 0 0 - - - 0; +#X msg 137 157 74 \$1; +#X text 33 19 If you set [poly] to a single voice you can make it manage a monophonic synth control a single polyhonic synth. Without this minimum management you may end up getting undesired note off messages from releasing keys that were previously pressed instead from the currently pressed one., f 50; +#X text 59 542 Note however that some monophonic synths may have a more sophisticated management where it goes back to the previously pressed key (if you're still pressing it) \, but [poly] can only manage this in a much simpler way., f 45; +#X text 228 233 you can also try your MIDI keyboard., f 19; +#X connect 1 0 9 0; +#X connect 1 1 9 1; +#X connect 2 0 3 0; +#X connect 3 0 0 0; +#X connect 4 0 2 0; +#X connect 5 0 3 1; +#X connect 6 0 8 0; +#X connect 7 0 5 0; +#X connect 8 0 7 0; +#X connect 9 1 4 0; +#X connect 9 2 6 0; +#X connect 10 0 16 0; +#X connect 11 0 14 0; +#X connect 12 0 18 0; +#X connect 13 0 15 0; +#X connect 14 0 17 0; +#X connect 15 0 17 0; +#X connect 16 0 17 0; +#X connect 17 0 9 0; +#X connect 18 0 17 0; +#X restore 444 419 pd monophonic; #X connect 3 0 8 0; #X connect 3 1 8 1; #X connect 3 2 8 2; #X connect 4 0 3 0; #X connect 5 0 3 0; -#X connect 7 0 24 0; +#X connect 7 0 20 0; #X connect 8 0 7 0; -#X connect 9 0 3 0; -#X connect 10 0 3 0; -#X connect 11 0 3 0; -#X connect 12 0 3 0; -#X connect 19 0 12 0; -#X connect 21 0 9 0; -#X connect 22 0 10 0; -#X connect 23 0 11 0; -#X connect 24 0 25 0; -#X connect 24 1 27 0; -#X connect 24 2 28 0; -#X connect 24 3 29 0; -#X connect 25 0 26 0; -#X connect 27 0 30 0; -#X connect 28 0 31 0; -#X connect 29 0 32 0; +#X connect 15 0 40 0; +#X connect 17 0 37 0; +#X connect 18 0 38 0; +#X connect 19 0 39 0; +#X connect 20 0 21 0; +#X connect 20 1 23 0; +#X connect 20 2 24 0; +#X connect 20 3 25 0; +#X connect 21 0 22 0; +#X connect 23 0 26 0; +#X connect 24 0 27 0; +#X connect 25 0 28 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; From 15cf7c1b7a6ce3556223d587c3cbb1dde4b84d05 Mon Sep 17 00:00:00 2001 From: porres Date: Sat, 6 Jul 2024 20:10:00 -0300 Subject: [PATCH 29/89] use [poly] in the C10.monophonic.synth.pd example closes https://github.com/pure-data/pddp/issues/229 --- doc/3.audio.examples/C10.monophonic.synth.pd | 152 ++++++++----------- 1 file changed, 61 insertions(+), 91 deletions(-) diff --git a/doc/3.audio.examples/C10.monophonic.synth.pd b/doc/3.audio.examples/C10.monophonic.synth.pd index 19332103..b16ee02f 100644 --- a/doc/3.audio.examples/C10.monophonic.synth.pd +++ b/doc/3.audio.examples/C10.monophonic.synth.pd @@ -1,94 +1,64 @@ -#N canvas 450 38 576 870 12; +#N canvas 502 38 542 797 12; #X declare -stdpath ./; -#X obj 109 552 mtof; -#X obj 109 501 stripnote; -#X obj 260 557 select; -#X obj 251 451 float; -#X obj 260 419 t b f; -#X obj 260 525 float; -#X text 310 410 f - store pitch below; -#X text 300 453 velocity stored here; -#X text 224 497 off; -#X text 304 525 recall pitch; -#X text 156 7 MONOPHONIC MIDI SYNTH; -#X obj 130 384 unpack; -#X obj 86 303 notein; -#X obj 86 330 pack; -#X obj 190 613 line~; -#X msg 190 582 \$1 100; -#X msg 260 583 0 1000; -#X msg 232 333 55 64; -#X msg 325 333 55 0; -#X msg 184 333 48 64; -#X msg 282 333 48 0; -#X text 39 142 The note-off testing is complicated by the fact that we have to test both that the velocity is zero \, and further that the note-off pitch matches the pitch that is now playing (the most recent note-on pitch.), f 58; -#X text 311 427 b - bang to recall velocity; -#X obj 251 480 sel 0; -#X text 273 501 on; -#X obj 99 793 output~; -#X obj 99 757 hip~ 5; -#X obj 99 696 *~; -#X obj 109 579 phasor~; -#X obj 109 603 -~ 0.5; -#X obj 99 644 cos~; -#X obj 172 669 *~; -#X obj 99 668 +~ 1; -#X text 304 804 updated for Pd version 0.37; -#X obj 172 717 cos~; -#X msg 130 333 48 128; -#X text 114 529 pitch; -#X text 303 481 test for note on or off; -#X text 313 558 test against latest; -#X text 355 573 note-on pitch; -#X obj 99 729 *~; -#X obj 190 555 / 127; -#X obj 172 693 *~ 2; -#X obj 190 642 +~ 0.5; -#X text 216 694 in the previous patch.; -#X text 144 308 These buttons simulate MIDI input.; -#X text 240 606 envelope generator now controls amplitude as well as grain size, f 31; -#X obj 390 7 declare -stdpath ./; -#X text 41 45 This patch shows how to make a monophonic synthesizer that could be controlled from a MIDI keyboard. First \, at top \, incoming MIDI notes are parsed and used to set pitch and trigger an ADSR envelope. Second \, the envelope generator itself has been extended to offer controls over the time and target values via number boxes., f 58; -#X text 37 481 filter note-off messages, f 8; -#X text 38 212 The synthesis technique is the same as in the previous patch \, done in a simpler (but less general) way with a [cos~] object replacing the wavetable lookup., f 58; -#X text 218 713 The [+~ 0.5] and [*~ 2] are fudge factors.; -#X text 218 674 This replaces the [tabread4~]; -#X connect 0 0 28 0; -#X connect 1 0 2 1; -#X connect 1 0 0 0; -#X connect 2 0 16 0; -#X connect 3 0 23 0; +#X obj 131 474 mtof; +#X text 115 14 MONOPHONIC MIDI SYNTH; +#X obj 139 386 notein; +#X obj 222 532 line~; +#X msg 222 501 \$1 100; +#X obj 131 716 output~; +#X obj 131 680 hip~ 5; +#X obj 131 619 *~; +#X obj 131 501 phasor~; +#X obj 131 525 -~ 0.5; +#X obj 131 567 cos~; +#X obj 204 588 *~; +#X obj 131 591 +~ 1; +#X obj 204 636 cos~; +#X text 90 453 pitch; +#X obj 131 652 *~; +#X obj 222 474 / 127; +#X obj 204 612 *~ 2; +#X obj 222 561 +~ 0.5; +#X text 272 525 envelope generator now controls amplitude as well as grain size, f 31; +#X obj 314 15 declare -stdpath ./; +#X text 71 241 The synthesis technique is the same as in the previous patch \, done in a simpler (but less general) way with a [cos~] object replacing the wavetable lookup., f 58; +#X obj 105 424 poly 1 1; +#X text 208 443 velocity; +#X text 304 751 updated for Pd version 0.55; +#X msg 153 322 55 64; +#X msg 246 322 55 0; +#X msg 105 322 48 64; +#X msg 203 322 48 0; +#X msg 51 322 48 128; +#X listbox 105 358 7 0 0 0 - - - 0; +#X text 71 140 The [poly] object is actually better suited to handle polyphony \, but you can set it to a single voice with the first argument and ignore the left outlet output. The second argument sets the object to "voice stealing" so new pressed notes will replace previous ones that are still pressed (which can then get released without interfering)., f 58; +#X text 293 314 These simulate MIDI messages, f 15; +#X text 71 49 This patch shows how to make a monophonic synthesizer that could be controlled from a MIDI keyboard. First \, at top \, incoming MIDI notes are parsed via the [poly] object and used to set pitch and trigger an attack/release envelope. You can use your MIDI keyboard with [notein] to test it or the messages below.; +#X text 250 596 This replaces the [tabread4~] in the previous patch (the [+~ 0.5] and [*~ 2] are fudge factors)., f 33; +#X connect 0 0 8 0; +#X connect 2 0 22 0; +#X connect 2 1 22 1; +#X connect 3 0 15 1; +#X connect 3 0 18 0; #X connect 4 0 3 0; -#X connect 4 1 5 1; -#X connect 5 0 2 0; -#X connect 11 0 1 0; -#X connect 11 0 4 0; -#X connect 11 1 1 1; -#X connect 11 1 3 1; -#X connect 12 0 13 0; -#X connect 12 1 13 1; -#X connect 13 0 11 0; -#X connect 14 0 40 1; -#X connect 14 0 43 0; -#X connect 15 0 14 0; -#X connect 16 0 14 0; -#X connect 17 0 11 0; -#X connect 18 0 11 0; -#X connect 19 0 11 0; -#X connect 20 0 11 0; -#X connect 23 0 5 0; -#X connect 23 1 41 0; -#X connect 26 0 25 0; -#X connect 27 0 40 0; -#X connect 28 0 29 0; -#X connect 29 0 31 0; +#X connect 6 0 5 0; +#X connect 7 0 15 0; +#X connect 8 0 9 0; +#X connect 9 0 11 0; +#X connect 9 0 10 0; +#X connect 10 0 12 0; +#X connect 11 0 17 0; +#X connect 12 0 7 0; +#X connect 13 0 7 1; +#X connect 15 0 6 0; +#X connect 16 0 4 0; +#X connect 17 0 13 0; +#X connect 18 0 11 1; +#X connect 22 1 0 0; +#X connect 22 2 16 0; +#X connect 25 0 30 0; +#X connect 26 0 30 0; +#X connect 27 0 30 0; +#X connect 28 0 30 0; #X connect 29 0 30 0; -#X connect 30 0 32 0; -#X connect 31 0 42 0; -#X connect 32 0 27 0; -#X connect 34 0 27 1; -#X connect 35 0 11 0; -#X connect 40 0 26 0; -#X connect 41 0 15 0; -#X connect 42 0 34 0; -#X connect 43 0 31 1; +#X connect 30 0 22 0; From 036ee117925763acde70cd02837b688082ead4ae Mon Sep 17 00:00:00 2001 From: porres Date: Sat, 6 Jul 2024 21:04:26 -0300 Subject: [PATCH 30/89] use [dbtorms~] and [mtof~] instead of [tabread4~] this closes https://github.com/pure-data/pddp/issues/228 and the discussion is there, the idea is to use these lookup tables in the first time they were rpesented in the examples but mention about the efficiency concern reason, but don't use them in the next examples. --- doc/3.audio.examples/D03.envelope.dB.pd | 26 ++-- doc/3.audio.examples/D05.envelope.pitch.pd | 141 +++++++----------- .../D06.envelope.portamento.pd | 86 +++++------ doc/3.audio.examples/D10.sampler.notes.pd | 24 +-- doc/3.audio.examples/G08.reverb.pd | 93 ++---------- doc/3.audio.examples/H04.filter.sweep.pd | 88 +++++------ doc/3.audio.examples/H05.filter.floyd.pd | 70 ++++----- doc/3.audio.examples/I04.noisegate.pd | 4 +- 8 files changed, 188 insertions(+), 344 deletions(-) diff --git a/doc/3.audio.examples/D03.envelope.dB.pd b/doc/3.audio.examples/D03.envelope.dB.pd index c6f78735..a73b4ecf 100644 --- a/doc/3.audio.examples/D03.envelope.dB.pd +++ b/doc/3.audio.examples/D03.envelope.dB.pd @@ -1,4 +1,4 @@ -#N canvas 542 31 549 702 12; +#N canvas 542 38 559 760 12; #X declare -stdpath ./; #X obj 72 115 r trigger; #X text 110 14 USING ADSR'S OUTPUT AS dB; @@ -20,14 +20,14 @@ #X obj 147 264 dbtorms; #X obj 178 180 t f f; #X obj 101 296 tabwrite dbtorms; -#X floatatom 389 140 0 0 0 0 - - - 0; -#X floatatom 389 210 0 0 0 0 - - - 0; -#X obj 389 181 tabread4 dbtorms; -#X floatatom 315 210 0 0 0 0 - - - 0; -#X obj 315 181 dbtorms; +#X floatatom 399 140 4 0 0 0 - - - 0; +#X floatatom 399 210 12 0 0 0 - - - 0; +#X obj 399 181 tabread4 dbtorms; +#X floatatom 295 210 12 0 0 0 - - - 0; +#X obj 295 181 dbtorms; #X text 103 33 bang to recalculate the table; #X obj 133 150 sel 123; -#X text 267 91 check accuracy of reading table against the "real" dbtorms object., f 34; +#X text 267 91 check accuracy of reading table against the "real" [dbtorms] object., f 39; #X connect 0 0 7 0; #X connect 0 1 8 0; #X connect 1 0 2 0; @@ -53,22 +53,22 @@ #X obj 90 192 osc~ 440; #X text 477 278 0; #X text 478 179 10; -#X text 294 288 ------ 123 samples ------; +#X text 286 291 ------ 123 samples ------; #X msg 71 382 \; pd dsp 1 \; trigger 0; #X obj 72 217 *~; #X msg 70 327 \; pd dsp 1 \; trigger 1; #X obj 72 141 adsr 100 100 200 70 300; #X text 68 444 The table is indexed from 1 to 120 so that 1 gives a true zero out and 120 gives 10 (a 20 dB boost.) The extra 20 dB are for headroom.; -#X text 65 494 (There's also a "real" dbtorms~ object... but it's almost certainly much more compute-intensive than tabread4~ \, since it has to call a library "exp" function.); -#X text 66 553 Notice how the attack sounds different when you retrigger than when you start from zero. This is because if you go from the steady state you only rise 30 dB instead of 100 \, so it sounds slower... a slur effect. If you don't want this \, you might try increasing the amplitude of retriggered notes in comparison to isolated ones.; -#X text 69 45 For more natural sounding amplitude control \, you can use the ADSR's output as log amplitude. In practice this is best done using a lookup table:; +#X text 66 613 Notice how the attack sounds different when you retrigger than when you start from zero. This is because if you go from the steady state you only rise 30 dB instead of 100 \, so it sounds slower... a slur effect. If you don't want this \, you might try increasing the amplitude of retriggered notes in comparison to isolated ones.; #X obj 72 251 output~; -#X text 309 665 updated for Pd version 0.37; +#X text 317 714 updated for Pd version 0.37; #X text 147 341 <= attack; #X text 146 396 <= release; #X obj 387 13 declare -stdpath ./; +#X text 62 45 For more natural sounding amplitude control \, you can use the ADSR's output as log amplitude. Technically \, this is more efficient if done using a lookup table.; +#X text 64 494 There's also a "real" [dbtorms~] object that you can just use instead if CPU cost is not a concern and the next example will use that instead \, but for didatical reasons it's shown how to implement a lookup table instead in cases where you might be really concerned (as running Pd in a microcontroller) since [dbtorms~] it's almost certainly much more compute-intensive than ptabread4~] \, since it has to call a library "exp" function.); #X connect 0 0 13 0; #X connect 2 0 11 0; #X connect 6 0 11 1; -#X connect 11 0 18 0; +#X connect 11 0 16 0; #X connect 13 0 2 0; diff --git a/doc/3.audio.examples/D05.envelope.pitch.pd b/doc/3.audio.examples/D05.envelope.pitch.pd index e5892fef..f7cd4acc 100644 --- a/doc/3.audio.examples/D05.envelope.pitch.pd +++ b/doc/3.audio.examples/D05.envelope.pitch.pd @@ -1,9 +1,31 @@ -#N canvas 482 23 613 689 12; +#N canvas 529 38 616 720 12; #X declare -stdpath ./; #X obj 68 164 r trigger; -#X obj 68 242 tabread4~ dbtorms; #X obj 68 286 *~; -#N canvas 513 374 809 554 make-table 0; +#X text 43 20 PITCH ENVELOPES; +#X obj 260 164 r trigger2; +#X obj 260 276 tabread4~ mtof; +#X obj 260 303 osc~; +#X msg 38 429 \; pd dsp 1 \; trigger 1 \; trigger2 1; +#X msg 211 429 \; pd dsp 1 \; trigger 1 \; trigger2 -1; +#X msg 404 429 \; pd dsp 1 \; trigger 0 \; trigger2 0; +#X obj 260 245 +~ 69; +#X text 297 449 restarting; +#X text 297 462 pitch env; +#X text 62 612 This is an extreme use of pitch enveloping. In a real situation you might want an envelope controlling vibrato depth or the like instead of straight pitch., f 69; +#X obj 68 208 adsr 100 50 200 90 1000; +#X obj 260 208 adsr 20 200 100 100 1000; +#X text 394 665 updated for Pd version 0.37; +#X obj 68 327 output~; +#X obj 403 20 declare -stdpath ./; +#X text 117 455 <-- attack; +#X text 297 435 <-- attack; +#X text 485 453 <-- release; +#X text 34 63 For pitch envelopes \, unlike amplitude envelopes \, discontinuities are allowed and sometimes you would rather the envelope generator actually jump to zero when it's triggered. The [adsr] abstraction does this for you if you send a negative trigger instead of a positive one:, f 65; +#X text 448 208 <-- click to open and check the inner workings of the abstraction., f 17; +#X obj 68 242 dbtorms~; +#X text 62 513 We have added a new table ("mtof") for converting audio signals from pitch to frequency. Like in the previous example \, there's also a real [mtof~] object you can use instead and that we'll use in the next examples. The table lookup is \, again \, for CPU efficiency concerns and its range is 1-127 \, so you want to add a base pitch in before you start reading from it., f 69; +#N canvas 453 231 801 286 mtof-table 0; #X msg 67 39 bang; #X obj 67 68 t b b; #X obj 130 100 f; @@ -11,107 +33,48 @@ #X msg 148 70 0; #X obj 67 97 until; #X obj 176 156 t f f; -#X floatatom 335 132 0 0 0 0 - - - 0; -#X floatatom 335 196 0 0 0 0 - - - 0; -#N canvas 0 0 450 300 (subpatch) 0; -#X array dbtorms 123 float 1; -#A 0 0 0 1.25893e-05 1.41254e-05 1.58489e-05 1.77828e-05 1.99526e-05 2.23872e-05 2.51189e-05 2.81838e-05 3.16228e-05 3.54813e-05 3.98107e-05 4.46684e-05 5.01187e-05 5.62341e-05 6.30957e-05 7.07946e-05 7.94328e-05 8.91251e-05 0.0001 0.000112202 0.000125893 0.000141254 0.000158489 0.000177828 0.000199526 0.000223872 0.000251189 0.000281838 0.000316228 0.000354813 0.000398107 0.000446684 0.000501187 0.000562341 0.000630957 0.000707946 0.000794328 0.000891251 0.001 0.00112202 0.00125893 0.00141254 0.00158489 0.00177828 0.00199526 0.00223872 0.00251189 0.00281838 0.00316228 0.00354813 0.00398107 0.00446684 0.00501187 0.00562341 0.00630957 0.00707946 0.00794328 0.00891251 0.01 0.0112202 0.0125893 0.0141254 0.0158489 0.0177828 0.0199526 0.0223872 0.0251189 0.0281838 0.0316228 0.0354813 0.0398107 0.0446684 0.0501187 0.0562341 0.0630957 0.0707946 0.0794328 0.0891251 0.1 0.112202 0.125893 0.141254 0.158489 0.177828 0.199526 0.223872 0.251189 0.281838 0.316228 0.354813 0.398107 0.446684 0.501187 0.562341 0.630957 0.707946 0.794328 0.891251 1 1.12202 1.25893 1.41254 1.58489 1.77828 1.99526 2.23872 2.51189 2.81838 3.16228 3.54813 3.98107 4.46684 5.01187 5.62341 6.30957 7.07946 7.94328 8.91251 10 11.2202 12.5893; -#X coords 0 10 123 0 200 100 1; -#X restore 483 265 graph; -#X text 685 358 0; -#X text 687 258 10; -#X text 489 370 ------ 123 samples ------; +#X floatatom 335 132 5 0 0 0 - - - 0; #N canvas 0 0 450 300 (subpatch) 0; #X array mtof 130 float 1; #A 0 8.1758 8.66196 9.17702 9.72272 10.3009 10.9134 11.5623 12.2499 12.9783 13.75 14.5676 15.4339 16.3516 17.3239 18.354 19.4454 20.6017 21.8268 23.1247 24.4997 25.9565 27.5 29.1352 30.8677 32.7032 34.6478 36.7081 38.8909 41.2034 43.6535 46.2493 48.9994 51.9131 55 58.2705 61.7354 65.4064 69.2957 73.4162 77.7817 82.4069 87.3071 92.4986 97.9989 103.826 110 116.541 123.471 130.813 138.591 146.832 155.563 164.814 174.614 184.997 195.998 207.652 220 233.082 246.942 261.626 277.183 293.665 311.127 329.628 349.228 369.994 391.995 415.305 440 466.164 493.883 523.251 554.365 587.33 622.254 659.255 698.456 739.989 783.991 830.609 880 932.328 987.767 1046.5 1108.73 1174.66 1244.51 1318.51 1396.91 1479.98 1567.98 1661.22 1760 1864.66 1975.53 2093 2217.46 2349.32 2489.02 2637.02 2793.83 2959.96 3135.96 3322.44 3520 3729.31 3951.07 4186.01 4434.92 4698.64 4978.03 5274.04 5587.65 5919.91 6271.93 6644.88 7040 7458.62 7902.13 8372.02 8869.84 9397.27 9956.06 10548.1 11175.3 11839.8 12543.9 13289.8 14080; #X coords 0 12000 130 0 200 100 1; -#X restore 482 97 graph; +#X restore 470 71 graph; #X obj 259 167 mtof; -#X floatatom 259 196 0 0 0 0 - - - 0; -#X text 486 204 ------ 130 samples ------; -#X text 691 190 0; -#X text 693 90 12000; +#X floatatom 259 196 10 0 0 0 - - - 0; +#X text 474 178 ------ 130 samples ------; +#X text 679 164 0; +#X text 681 64 12000; #X obj 120 185 mtof; #X obj 130 127 sel 129; #X obj 120 214 tabwrite mtof; #X obj 335 167 tabread4 mtof; -#X obj 141 420 moses 2; -#X msg 115 269 bang; -#X obj 115 298 t b b; -#X obj 173 334 f; -#X obj 211 334 + 1; -#X msg 191 306 0; -#X obj 115 349 until; -#X msg 141 451 0; -#X obj 187 452 dbtorms; -#X obj 218 387 t f f; -#X obj 141 484 tabwrite dbtorms; #X text 248 105 ... and test accuracy; #X text 105 38 patch to recalculate the mtof table; -#X text 157 269 bang to recalculate dbtorms table; -#X obj 173 362 sel 123; +#X floatatom 335 196 10 0 0 0 - - - 0; #X connect 0 0 1 0; #X connect 1 0 5 0; #X connect 1 1 4 0; #X connect 2 0 3 0; -#X connect 2 0 20 0; +#X connect 2 0 15 0; #X connect 3 0 2 1; #X connect 4 0 2 1; #X connect 5 0 2 0; -#X connect 6 0 19 0; -#X connect 6 1 21 1; -#X connect 7 0 14 0; -#X connect 7 0 22 0; -#X connect 14 0 15 0; -#X connect 19 0 21 0; -#X connect 20 0 5 1; -#X connect 20 1 6 0; -#X connect 22 0 8 0; -#X connect 23 0 30 0; -#X connect 23 1 31 0; -#X connect 24 0 25 0; -#X connect 25 0 29 0; -#X connect 25 1 28 0; -#X connect 26 0 27 0; -#X connect 26 0 37 0; -#X connect 27 0 26 1; -#X connect 28 0 26 1; -#X connect 29 0 26 0; -#X connect 30 0 33 0; -#X connect 31 0 33 0; -#X connect 32 0 23 0; -#X connect 32 1 33 1; -#X connect 37 0 29 1; -#X connect 37 1 32 0; -#X restore 338 322 pd make-table; -#X text 43 20 PITCH ENVELOPES; -#X obj 260 164 r trigger2; -#X obj 260 276 tabread4~ mtof; -#X obj 260 303 osc~; -#X msg 38 429 \; pd dsp 1 \; trigger 1 \; trigger2 1; -#X msg 211 429 \; pd dsp 1 \; trigger 1 \; trigger2 -1; -#X msg 404 429 \; pd dsp 1 \; trigger 0 \; trigger2 0; -#X obj 260 245 +~ 69; -#X text 297 449 restarting; -#X text 297 462 pitch env; -#X text 62 583 This is an extreme use of pitch enveloping. In a real situation you might want an envelope controlling vibrato depth or the like instead of straight pitch., f 61; -#X obj 68 208 adsr 100 50 200 90 1000; -#X obj 260 208 adsr 20 200 100 100 1000; -#X text 394 645 updated for Pd version 0.37; -#X obj 68 327 output~; -#X obj 403 20 declare -stdpath ./; -#X text 117 455 <-- attack; -#X text 297 435 <-- attack; -#X text 485 453 <-- release; -#X text 34 63 For pitch envelopes \, unlike amplitude envelopes \, discontinuities are allowed and sometimes you would rather the envelope generator actually jump to zero when it's triggered. The [adsr] abstraction does this for you if you send a negative trigger instead of a positive one:, f 65; -#X text 62 528 We have added a new table ("mtof") for converting audio signals from pitch to frequency. Its range is 1-127 \, so you want to add a base pitch in before you start reading from it., f 61; -#X text 448 208 <-- click to open and check the inner workings of the abstraction., f 17; -#X connect 0 0 15 0; -#X connect 1 0 2 0; -#X connect 2 0 18 0; -#X connect 5 0 16 0; -#X connect 6 0 7 0; -#X connect 7 0 2 1; -#X connect 11 0 6 0; -#X connect 15 0 1 0; -#X connect 16 0 11 0; +#X connect 6 0 14 0; +#X connect 6 1 16 1; +#X connect 7 0 9 0; +#X connect 7 0 17 0; +#X connect 9 0 10 0; +#X connect 14 0 16 0; +#X connect 15 0 5 1; +#X connect 15 1 6 0; +#X connect 17 0 20 0; +#X restore 330 307 pd mtof-table; +#X connect 0 0 13 0; +#X connect 1 0 16 0; +#X connect 3 0 14 0; +#X connect 4 0 5 0; +#X connect 5 0 1 1; +#X connect 9 0 4 0; +#X connect 13 0 23 0; +#X connect 14 0 9 0; +#X connect 23 0 1 0; diff --git a/doc/3.audio.examples/D06.envelope.portamento.pd b/doc/3.audio.examples/D06.envelope.portamento.pd index a4418519..8e5f1eb4 100644 --- a/doc/3.audio.examples/D06.envelope.portamento.pd +++ b/doc/3.audio.examples/D06.envelope.portamento.pd @@ -1,62 +1,44 @@ #N canvas 481 68 579 354 12; #X declare -stdpath ./; -#X obj 50 187 tabread4~ mtof; #X obj 50 213 osc~; -#N canvas 940 286 457 394 tables 0; -#N canvas 0 0 450 300 (subpatch) 0; -#X array dbtorms 123 float 1; -#A 0 0 0 1.25893e-05 1.41254e-05 1.58489e-05 1.77828e-05 1.99526e-05 2.23872e-05 2.51189e-05 2.81838e-05 3.16228e-05 3.54813e-05 3.98107e-05 4.46684e-05 5.01187e-05 5.62341e-05 6.30957e-05 7.07946e-05 7.94328e-05 8.91251e-05 0.0001 0.000112202 0.000125893 0.000141254 0.000158489 0.000177828 0.000199526 0.000223872 0.000251189 0.000281838 0.000316228 0.000354813 0.000398107 0.000446684 0.000501187 0.000562341 0.000630957 0.000707946 0.000794328 0.000891251 0.001 0.00112202 0.00125893 0.00141254 0.00158489 0.00177828 0.00199526 0.00223872 0.00251189 0.00281838 0.00316228 0.00354813 0.00398107 0.00446684 0.00501187 0.00562341 0.00630957 0.00707946 0.00794328 0.00891251 0.01 0.0112202 0.0125893 0.0141254 0.0158489 0.0177828 0.0199526 0.0223872 0.0251189 0.0281838 0.0316228 0.0354813 0.0398107 0.0446684 0.0501187 0.0562341 0.0630957 0.0707946 0.0794328 0.0891251 0.1 0.112202 0.125893 0.141254 0.158489 0.177828 0.199526 0.223872 0.251189 0.281838 0.316228 0.354813 0.398107 0.446684 0.501187 0.562341 0.630957 0.707946 0.794328 0.891251 1 1.12202 1.25893 1.41254 1.58489 1.77828 1.99526 2.23872 2.51189 2.81838 3.16228 3.54813 3.98107 4.46684 5.01187 5.62341 6.30957 7.07946 7.94328 8.91251 10 11.2202 12.5893; -#X coords 0 10 123 0 200 100 1; -#X restore 113 53 graph; -#X text 315 146 0; -#X text 317 46 10; -#X text 111 161 ------ 123 samples ------; -#N canvas 0 0 450 300 (subpatch) 0; -#X array mtof 130 float 1; -#A 0 8.1758 8.66196 9.17702 9.72272 10.3009 10.9134 11.5623 12.2499 12.9783 13.75 14.5676 15.4339 16.3516 17.3239 18.354 19.4454 20.6017 21.8268 23.1247 24.4997 25.9565 27.5 29.1352 30.8677 32.7032 34.6478 36.7081 38.8909 41.2034 43.6535 46.2493 48.9994 51.9131 55 58.2705 61.7354 65.4064 69.2957 73.4162 77.7817 82.4069 87.3071 92.4986 97.9989 103.826 110 116.541 123.471 130.813 138.591 146.832 155.563 164.814 174.614 184.997 195.998 207.652 220 233.082 246.942 261.626 277.183 293.665 311.127 329.628 349.228 369.994 391.995 415.305 440 466.164 493.883 523.251 554.365 587.33 622.254 659.255 698.456 739.989 783.991 830.609 880 932.328 987.767 1046.5 1108.73 1174.66 1244.51 1318.51 1396.91 1479.98 1567.98 1661.22 1760 1864.66 1975.53 2093 2217.46 2349.32 2489.02 2637.02 2793.83 2959.96 3135.96 3322.44 3520 3729.31 3951.07 4186.01 4434.92 4698.64 4978.03 5274.04 5587.65 5919.91 6271.93 6644.88 7040 7458.62 7902.13 8372.02 8869.84 9397.27 9956.06 10548.1 11175.3 11839.8 12543.9 13289.8 14080; -#X coords 0 12000 130 0 200 100 1; -#X restore 120 230 graph; -#X text 112 340 ------ 130 samples ------; -#X text 324 322 0; -#X text 326 222 12000; -#X restore 452 220 pd tables; #X text 45 18 PORTAMENTO; #X obj 50 161 line~; #X obj 50 113 r pitch; -#X msg 202 163 36; -#X msg 231 163 48; -#X msg 258 163 60; -#X msg 315 163 72; -#X msg 287 163 67; -#X msg 369 163 76; -#X msg 343 163 74; -#X obj 343 228 s pitch; -#X msg 400 163 84; -#X msg 430 163 96; +#X msg 178 175 36, f 2; +#X msg 207 175 48, f 2; +#X msg 234 175 60, f 2; +#X msg 291 175 72, f 2; +#X msg 263 175 67, f 2; +#X msg 344 175 76, f 2; +#X msg 319 175 74, f 2; +#X obj 319 240 s pitch; +#X msg 371 175 84, f 2; +#X msg 400 175 96, f 2; #X floatatom 117 111 4 0 0 0 - - - 0; -#X floatatom 343 202 6 0 0 0 - - - 0; -#X text 44 49 Portamento can be done using just line~ \, but you still might want to sweep in pitch \, not frequency:; -#X text 358 290 updated for Pd version 0.35; -#X obj 315 137 loadbang; -#X text 459 163 <= set pitch; +#X floatatom 319 214 6 0 0 0 - - - 0; +#X text 334 302 updated for Pd version 0.35; +#X obj 291 149 loadbang; +#X text 429 175 <= set pitch; #X obj 50 257 output~; -#X obj 181 290 declare -stdpath ./; +#X obj 407 97 declare -stdpath ./; #X obj 50 137 pack f 100; #X text 156 112 <-- change speed; -#X connect 0 0 1 0; -#X connect 1 0 22 0; -#X connect 4 0 0 0; -#X connect 5 0 24 0; -#X connect 6 0 17 0; -#X connect 7 0 17 0; -#X connect 8 0 17 0; -#X connect 9 0 17 0; -#X connect 10 0 17 0; -#X connect 11 0 17 0; -#X connect 12 0 17 0; -#X connect 14 0 17 0; -#X connect 15 0 17 0; -#X connect 16 0 24 1; -#X connect 17 0 13 0; -#X connect 20 0 9 0; -#X connect 24 0 4 0; +#X obj 50 187 mtof~; +#X text 44 49 Portamento can be done using just [line~] \, but you still might want to sweep in pitch \, not frequency:; +#X connect 0 0 19 0; +#X connect 2 0 23 0; +#X connect 3 0 21 0; +#X connect 4 0 15 0; +#X connect 5 0 15 0; +#X connect 6 0 15 0; +#X connect 7 0 15 0; +#X connect 8 0 15 0; +#X connect 9 0 15 0; +#X connect 10 0 15 0; +#X connect 12 0 15 0; +#X connect 13 0 15 0; +#X connect 14 0 21 1; +#X connect 15 0 11 0; +#X connect 17 0 7 0; +#X connect 21 0 2 0; +#X connect 23 0 0 0; diff --git a/doc/3.audio.examples/D10.sampler.notes.pd b/doc/3.audio.examples/D10.sampler.notes.pd index e0474d13..c7213f6d 100644 --- a/doc/3.audio.examples/D10.sampler.notes.pd +++ b/doc/3.audio.examples/D10.sampler.notes.pd @@ -1,4 +1,4 @@ -#N canvas 402 23 794 723 12; +#N canvas 402 38 816 789 12; #X declare -stdpath ./; #X obj 243 64 delay 5; #X text 419 290 end of note; @@ -67,7 +67,6 @@ #X msg 69 151 set \$1; #X obj 57 192 tabread4~ sample1; #X obj 75 319 r envelope; -#X obj 75 377 dbtorms; #X obj 75 406 sqrt; #X obj 75 435 sqrt; #X obj 75 463 line~; @@ -84,9 +83,10 @@ #X text 141 407 take the fourth root. This because we want to raise the line~'s output to the 4th power afterwards. This is an inexpensive way to give the rise and decay a more natural sounding evolution than just a straight line., f 52; #X text 112 505 square the output twice to get the fourth power.; #X obj 75 348 unpack f f; +#X obj 75 377 dbtorms; #X connect 0 0 10 0; #X connect 1 0 2 1; -#X connect 2 0 16 0; +#X connect 2 0 15 0; #X connect 3 0 1 0; #X connect 4 0 0 0; #X connect 6 0 5 0; @@ -94,18 +94,18 @@ #X connect 8 0 9 0; #X connect 9 0 10 0; #X connect 10 0 2 0; -#X connect 11 0 28 0; +#X connect 11 0 27 0; #X connect 12 0 13 0; #X connect 13 0 14 0; -#X connect 14 0 15 0; -#X connect 15 0 17 0; -#X connect 15 0 17 1; -#X connect 16 0 6 0; -#X connect 17 0 18 0; -#X connect 17 0 18 1; -#X connect 18 0 16 1; +#X connect 14 0 16 0; +#X connect 14 0 16 1; +#X connect 15 0 6 0; +#X connect 16 0 17 0; +#X connect 16 0 17 1; +#X connect 17 0 15 1; +#X connect 27 0 28 0; +#X connect 27 1 14 1; #X connect 28 0 12 0; -#X connect 28 1 15 1; #X restore 434 651 pd playback; #X msg 631 77 record 2; #X text 50 272 ARGUMENTS FOR NOTES:; diff --git a/doc/3.audio.examples/G08.reverb.pd b/doc/3.audio.examples/G08.reverb.pd index 90606f00..32d9863d 100644 --- a/doc/3.audio.examples/G08.reverb.pd +++ b/doc/3.audio.examples/G08.reverb.pd @@ -1,6 +1,6 @@ #N canvas 514 73 468 523 12; #X declare -stdpath ./; -#N canvas 647 153 533 471 test-input 0; +#N canvas 647 153 495 454 test-input 0; #X obj 240 392 outlet~; #X obj 156 305 -~; #X obj 65 261 *~ 3; @@ -10,98 +10,25 @@ #X obj 174 147 mtof; #X msg 258 154 1; #X obj 240 359 *~; -#X obj 258 222 tabread4~ dbtorms; #X obj 258 188 adsr 100 100 2000 0 2000; #X obj 174 56 inlet; -#N canvas 746 319 600 392 conversion-tables 0; -#N canvas 0 0 450 300 (subpatch) 0; -#X array dbtorms 123 float 1; -#A 0 0 0 1.25893e-05 1.41254e-05 1.58489e-05 1.77828e-05 1.99526e-05 2.23872e-05 2.51189e-05 2.81838e-05 3.16228e-05 3.54813e-05 3.98107e-05 4.46684e-05 5.01187e-05 5.62341e-05 6.30957e-05 7.07946e-05 7.94328e-05 8.91251e-05 0.0001 0.000112202 0.000125893 0.000141254 0.000158489 0.000177828 0.000199526 0.000223872 0.000251189 0.000281838 0.000316228 0.000354813 0.000398107 0.000446684 0.000501187 0.000562341 0.000630957 0.000707946 0.000794328 0.000891251 0.001 0.00112202 0.00125893 0.00141254 0.00158489 0.00177828 0.00199526 0.00223872 0.00251189 0.00281838 0.00316228 0.00354813 0.00398107 0.00446684 0.00501187 0.00562341 0.00630957 0.00707946 0.00794328 0.00891251 0.01 0.0112202 0.0125893 0.0141254 0.0158489 0.0177828 0.0199526 0.0223872 0.0251189 0.0281838 0.0316228 0.0354813 0.0398107 0.0446684 0.0501187 0.0562341 0.0630957 0.0707946 0.0794328 0.0891251 0.1 0.112202 0.125893 0.141254 0.158489 0.177828 0.199526 0.223872 0.251189 0.281838 0.316228 0.354813 0.398107 0.446684 0.501187 0.562341 0.630957 0.707946 0.794328 0.891251 1 1.12202 1.25893 1.41254 1.58489 1.77828 1.99526 2.23872 2.51189 2.81838 3.16228 3.54813 3.98107 4.46684 5.01187 5.62341 6.30957 7.07946 7.94328 8.91251 10 11.2202 12.5893; -#X coords 0 10 123 0 200 100 1; -#X restore 70 45 graph; -#X text 272 138 0; -#X text 274 38 10; -#X text 89 148 ------ 123 samples ------; -#N canvas 0 0 450 300 (subpatch) 0; -#X array mtof 130 float 1; -#A 0 8.1758 8.66196 9.17702 9.72272 10.3009 10.9134 11.5623 12.2499 12.9783 13.75 14.5676 15.4339 16.3516 17.3239 18.354 19.4454 20.6017 21.8268 23.1247 24.4997 25.9565 27.5 29.1352 30.8677 32.7032 34.6478 36.7081 38.8909 41.2034 43.6535 46.2493 48.9994 51.9131 55 58.2705 61.7354 65.4064 69.2957 73.4162 77.7817 82.4069 87.3071 92.4986 97.9989 103.826 110 116.541 123.471 130.813 138.591 146.832 155.563 164.814 174.614 184.997 195.998 207.652 220 233.082 246.942 261.626 277.183 293.665 311.127 329.628 349.228 369.994 391.995 415.305 440 466.164 493.883 523.251 554.365 587.33 622.254 659.255 698.456 739.989 783.991 830.609 880 932.328 987.767 1046.5 1108.73 1174.66 1244.51 1318.51 1396.91 1479.98 1567.98 1661.22 1760 1864.66 1975.53 2093 2217.46 2349.32 2489.02 2637.02 2793.83 2959.96 3135.96 3322.44 3520 3729.31 3951.07 4186.01 4434.92 4698.64 4978.03 5274.04 5587.65 5919.91 6271.93 6644.88 7040 7458.62 7902.13 8372.02 8869.84 9397.27 9956.06 10548.1 11175.3 11839.8 12543.9 13289.8 14080; -#X coords 0 12000 130 0 200 100 1; -#X restore 77 222 graph; -#X text 87 330 ------ 130 samples ------; -#X text 286 315 0; -#X text 288 215 12000; -#N canvas 765 417 672 338 regenerate-tables 0; -#X msg 415 84 bang; -#X obj 415 113 t b b; -#X obj 474 177 f; -#X obj 512 177 + 1; -#X msg 483 147 0; -#X obj 415 142 until; -#X obj 474 211 t f f; -#X obj 414 238 mtof; -#X obj 405 202 sel 129; -#X obj 413 264 tabwrite mtof; -#X obj 35 227 moses 2; -#X msg 19 76 bang; -#X obj 19 105 t b b; -#X obj 90 166 f; -#X obj 128 166 + 1; -#X msg 112 138 0; -#X obj 19 134 until; -#X obj 11 194 sel 122; -#X msg 35 258 0; -#X obj 79 259 dbtorms; -#X obj 90 194 t f f; -#X obj 35 291 tabwrite dbtorms; -#X text 18 49 bang to recalculate dbtorms table; -#X text 356 50 bang to recalculate the mtof table; -#X connect 0 0 1 0; -#X connect 1 0 5 0; -#X connect 1 1 4 0; -#X connect 2 0 3 0; -#X connect 2 0 6 0; -#X connect 2 0 8 0; -#X connect 3 0 2 1; -#X connect 4 0 2 1; -#X connect 5 0 2 0; -#X connect 6 0 7 0; -#X connect 6 1 9 1; -#X connect 7 0 9 0; -#X connect 8 0 5 1; -#X connect 10 0 18 0; -#X connect 10 1 19 0; -#X connect 11 0 12 0; -#X connect 12 0 16 0; -#X connect 12 1 15 0; -#X connect 13 0 14 0; -#X connect 13 0 17 0; -#X connect 13 0 20 0; -#X connect 14 0 13 1; -#X connect 15 0 13 1; -#X connect 16 0 13 0; -#X connect 17 0 16 1; -#X connect 18 0 21 0; -#X connect 19 0 21 0; -#X connect 20 0 10 0; -#X connect 20 1 21 1; -#X restore 375 76 pd regenerate-tables; -#X restore 323 316 pd conversion-tables; #X obj 174 181 phasor~; #X text 221 93 <-- pitch; +#X obj 258 222 dbtorms~; #X connect 1 0 8 0; #X connect 2 0 1 0; #X connect 3 0 1 1; #X connect 4 0 6 0; #X connect 4 0 7 0; #X connect 5 0 2 0; -#X connect 6 0 13 0; -#X connect 7 0 10 0; +#X connect 6 0 11 0; +#X connect 7 0 9 0; #X connect 8 0 0 0; -#X connect 9 0 8 1; -#X connect 10 0 9 0; -#X connect 11 0 4 0; -#X connect 13 0 3 0; -#X connect 13 0 5 0; +#X connect 9 0 13 0; +#X connect 10 0 4 0; +#X connect 11 0 3 0; +#X connect 11 0 5 0; +#X connect 13 0 8 1; #X restore 87 185 pd test-input; #X text 60 21 REVERBERATOR; #X floatatom 87 155 6 10 130 0 - - - 0; @@ -109,7 +36,7 @@ #X obj 87 294 output~; #X text 211 476 updated for Pd version 0.37-1; #X text 27 57 Here is a simple recirculating reverberator. "Feedback" should be between 0 and 100 - if 100 \, the reverberation lasts forever.; -#N canvas 342 28 742 700 reverb 1; +#N canvas 342 38 753 717 reverb 0; #X obj 34 19 inlet~; #X obj 34 281 +~; #X obj 164 261 +~; diff --git a/doc/3.audio.examples/H04.filter.sweep.pd b/doc/3.audio.examples/H04.filter.sweep.pd index 95ae7f50..8cc75be7 100644 --- a/doc/3.audio.examples/H04.filter.sweep.pd +++ b/doc/3.audio.examples/H04.filter.sweep.pd @@ -1,25 +1,24 @@ -#N canvas 553 23 507 587 12; +#N canvas 553 38 514 633 12; #X declare -stdpath ./; -#X floatatom 113 163 5 0 150 0 - \$0-pitch - 0; -#X text 114 17 SWEEPING FILTERS; -#X obj 113 210 phasor~; -#X obj 125 368 +~; -#X floatatom 143 343 5 0 100 0 - \$0-offset - 0; -#X floatatom 126 239 5 0 0 0 - \$0-speed - 0; -#X floatatom 144 290 5 0 100 0 - \$0-depth - 0; -#X floatatom 138 423 5 0 1000 0 - \$0-q - 0; -#X obj 113 448 vcf~; -#X obj 125 397 tabread4~ mtof; -#X text 184 199 sawtooth; -#X text 185 215 oscillator; -#X text 203 262 LFO for sweep; -#X text 161 367 add base to sweep; -#X text 237 397 convert to Hz.; -#X obj 113 489 output~; -#X obj 113 186 mtof; -#X obj 126 261 phasor~; -#X obj 126 315 *~; -#X text 297 545 updated for Pd version 0.39; +#X floatatom 126 203 5 0 150 0 - \$0-pitch - 0; +#X text 102 27 SWEEPING FILTERS; +#X obj 126 250 phasor~; +#X obj 138 408 +~; +#X floatatom 156 383 5 0 100 0 - \$0-offset - 0; +#X floatatom 139 279 5 0 0 0 - \$0-speed - 0; +#X floatatom 157 330 5 0 100 0 - \$0-depth - 0; +#X floatatom 151 463 5 0 1000 0 - \$0-q - 0; +#X obj 126 488 vcf~; +#X text 197 239 sawtooth; +#X text 198 255 oscillator; +#X text 216 302 LFO for sweep; +#X text 174 407 add base to sweep; +#X text 183 437 convert to Hz.; +#X obj 126 529 output~; +#X obj 126 226 mtof; +#X obj 139 301 phasor~; +#X obj 139 355 *~; +#X text 269 595 updated for Pd version 0.39; #N canvas 706 247 304 285 startup 0; #X obj 85 23 loadbang; #X obj 85 47 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; @@ -29,34 +28,25 @@ #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 2 0 3 0; -#X restore 293 506 pd startup; -#X text 35 118 Note the different effects of negative and positive sweep speeds.; -#N canvas 783 322 378 247 conversion-tables 0; -#N canvas 0 22 450 300 (subpatch) 0; -#X array mtof 130 float 1; -#A 0 8.1758 8.66196 9.17702 9.72272 10.3009 10.9134 11.5623 12.2499 12.9783 13.75 14.5676 15.4339 16.3516 17.3239 18.354 19.4454 20.6017 21.8268 23.1247 24.4997 25.9565 27.5 29.1352 30.8677 32.7032 34.6478 36.7081 38.8909 41.2034 43.6535 46.2493 48.9994 51.9131 55 58.2705 61.7354 65.4064 69.2957 73.4162 77.7817 82.4069 87.3071 92.4986 97.9989 103.826 110 116.541 123.471 130.813 138.591 146.832 155.563 164.814 174.614 184.997 195.998 207.652 220 233.082 246.942 261.626 277.183 293.665 311.127 329.628 349.228 369.994 391.995 415.305 440 466.164 493.883 523.251 554.365 587.33 622.254 659.255 698.456 739.989 783.991 830.609 880 932.328 987.767 1046.5 1108.73 1174.66 1244.51 1318.51 1396.91 1479.98 1567.98 1661.22 1760 1864.66 1975.53 2093 2217.46 2349.32 2489.02 2637.02 2793.83 2959.96 3135.96 3322.44 3520 3729.31 3951.07 4186.01 4434.92 4698.64 4978.03 5274.04 5587.65 5919.91 6271.93 6644.88 7040 7458.62 7902.13 8372.02 8869.84 9397.27 9956.06 10548.1 11175.3 11839.8 12543.9 13289.8 14080; -#X coords 0 12000 130 0 200 100 1; -#X restore 73 60 graph; -#X text 83 168 ------ 130 samples ------; -#X text 282 153 0; -#X text 284 53 12000; -#X restore 293 478 pd conversion-tables; -#X text 159 163 <= pitch; -#X text 168 238 <= sweep speed; -#X text 186 291 <= sweep depth; -#X text 186 343 <= base center frequency; -#X text 190 422 <= Q (selectivity); -#X text 34 46 If you want actively changing center frequencies \, use "vcf~" instead of "bp~". The vcf~ module takes an audio signal to set center frequency. (Q is still set by messages though.) Vcf~ is computationally somewhat more expensive than bp~.; -#X obj 338 17 declare -stdpath ./; -#X connect 0 0 16 0; +#X restore 303 532 pd startup; +#X text 67 140 Note the different effects of negative and positive sweep speeds., f 53; +#X text 172 203 <= pitch; +#X text 181 278 <= sweep speed; +#X text 199 331 <= sweep depth; +#X text 199 383 <= base center frequency; +#X text 203 462 <= Q (selectivity); +#X obj 307 22 declare -stdpath ./; +#X obj 138 437 mtof~; +#X text 67 59 If you want actively changing center frequencies \, use [vcf~] instead of [bp~]. The [vcf~] module takes an audio signal to set center frequency (Q is still set by messages though) \, which makes it computationally somewhat more expensive than [bp~]., f 53; +#X connect 0 0 15 0; #X connect 2 0 8 0; -#X connect 3 0 9 0; +#X connect 3 0 27 0; #X connect 4 0 3 1; -#X connect 5 0 17 0; -#X connect 6 0 18 1; +#X connect 5 0 16 0; +#X connect 6 0 17 1; #X connect 7 0 8 2; -#X connect 8 0 15 0; -#X connect 9 0 8 1; -#X connect 16 0 2 0; -#X connect 17 0 18 0; -#X connect 18 0 3 0; +#X connect 8 0 14 0; +#X connect 15 0 2 0; +#X connect 16 0 17 0; +#X connect 17 0 3 0; +#X connect 27 0 8 1; diff --git a/doc/3.audio.examples/H05.filter.floyd.pd b/doc/3.audio.examples/H05.filter.floyd.pd index 7d4e37d5..b56c11a0 100644 --- a/doc/3.audio.examples/H05.filter.floyd.pd +++ b/doc/3.audio.examples/H05.filter.floyd.pd @@ -1,29 +1,10 @@ -#N canvas 488 23 587 719 12; +#N canvas 488 38 587 719 12; #X declare -stdpath ./; -#N canvas 357 23 418 396 conversion-tables 0; -#N canvas 0 22 450 300 (subpatch) 0; -#X array dbtorms 123 float 1; -#A 0 0 0 1.25893e-05 1.41254e-05 1.58489e-05 1.77828e-05 1.99526e-05 2.23872e-05 2.51189e-05 2.81838e-05 3.16228e-05 3.54813e-05 3.98107e-05 4.46684e-05 5.01187e-05 5.62341e-05 6.30957e-05 7.07946e-05 7.94328e-05 8.91251e-05 0.0001 0.000112202 0.000125893 0.000141254 0.000158489 0.000177828 0.000199526 0.000223872 0.000251189 0.000281838 0.000316228 0.000354813 0.000398107 0.000446684 0.000501187 0.000562341 0.000630957 0.000707946 0.000794328 0.000891251 0.001 0.00112202 0.00125893 0.00141254 0.00158489 0.00177828 0.00199526 0.00223872 0.00251189 0.00281838 0.00316228 0.00354813 0.00398107 0.00446684 0.00501187 0.00562341 0.00630957 0.00707946 0.00794328 0.00891251 0.01 0.0112202 0.0125893 0.0141254 0.0158489 0.0177828 0.0199526 0.0223872 0.0251189 0.0281838 0.0316228 0.0354813 0.0398107 0.0446684 0.0501187 0.0562341 0.0630957 0.0707946 0.0794328 0.0891251 0.1 0.112202 0.125893 0.141254 0.158489 0.177828 0.199526 0.223872 0.251189 0.281838 0.316228 0.354813 0.398107 0.446684 0.501187 0.562341 0.630957 0.707946 0.794328 0.891251 1 1.12202 1.25893 1.41254 1.58489 1.77828 1.99526 2.23872 2.51189 2.81838 3.16228 3.54813 3.98107 4.46684 5.01187 5.62341 6.30957 7.07946 7.94328 8.91251 10 11.2202 12.5893; -#X coords 0 10 123 0 200 100 1; -#X restore 93 50 graph; -#X text 295 143 0; -#X text 297 43 10; -#X text 112 153 ------ 123 samples ------; -#N canvas 0 22 450 300 (subpatch) 0; -#X array mtof 130 float 1; -#A 0 8.1758 8.66196 9.17702 9.72272 10.3009 10.9134 11.5623 12.2499 12.9783 13.75 14.5676 15.4339 16.3516 17.3239 18.354 19.4454 20.6017 21.8268 23.1247 24.4997 25.9565 27.5 29.1352 30.8677 32.7032 34.6478 36.7081 38.8909 41.2034 43.6535 46.2493 48.9994 51.9131 55 58.2705 61.7354 65.4064 69.2957 73.4162 77.7817 82.4069 87.3071 92.4986 97.9989 103.826 110 116.541 123.471 130.813 138.591 146.832 155.563 164.814 174.614 184.997 195.998 207.652 220 233.082 246.942 261.626 277.183 293.665 311.127 329.628 349.228 369.994 391.995 415.305 440 466.164 493.883 523.251 554.365 587.33 622.254 659.255 698.456 739.989 783.991 830.609 880 932.328 987.767 1046.5 1108.73 1174.66 1244.51 1318.51 1396.91 1479.98 1567.98 1661.22 1760 1864.66 1975.53 2093 2217.46 2349.32 2489.02 2637.02 2793.83 2959.96 3135.96 3322.44 3520 3729.31 3951.07 4186.01 4434.92 4698.64 4978.03 5274.04 5587.65 5919.91 6271.93 6644.88 7040 7458.62 7902.13 8372.02 8869.84 9397.27 9956.06 10548.1 11175.3 11839.8 12543.9 13289.8 14080; -#X coords 0 12000 130 0 200 100 1; -#X restore 100 227 graph; -#X text 110 335 ------ 130 samples ------; -#X text 309 320 0; -#X text 311 220 12000; -#X restore 390 330 pd conversion-tables; #X obj 167 451 line~; #X obj 167 427 pack 0 100; #X floatatom 167 379 3 0 150 0 - \$0-cf - 0; #X floatatom 179 505 3 0 999 0 - \$0-q - 0; #X obj 122 557 vcf~; -#X obj 167 476 tabread4~ mtof; #X text 51 28 ANOTHER SWEEPING FILTER EXAMPLE; #X obj 149 318 clip~ 0 0.5; #X obj 149 340 *~ 2; @@ -53,7 +34,7 @@ #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 2 0 3 0; -#X restore 390 353 pd startup; +#X restore 401 335 pd startup; #X text 220 401 at least 61; #X obj 139 285 phasor~; #X text 357 665 updated for Pd version 0.39; @@ -70,27 +51,28 @@ #X text 213 505 <= Q (selectivity); #X text 200 376 <= center frequency; #X obj 408 22 declare -stdpath ./; -#X connect 1 0 6 0; -#X connect 2 0 1 0; +#X obj 167 477 mtof~; +#X connect 0 0 39 0; +#X connect 1 0 0 0; +#X connect 2 0 28 0; #X connect 3 0 30 0; -#X connect 4 0 32 0; -#X connect 5 0 29 0; -#X connect 6 0 5 1; -#X connect 6 0 29 1; -#X connect 8 0 9 0; -#X connect 9 0 10 0; -#X connect 10 0 5 0; -#X connect 14 0 15 0; -#X connect 14 0 28 0; -#X connect 15 0 17 0; -#X connect 16 0 26 0; -#X connect 17 0 14 1; -#X connect 19 0 14 0; -#X connect 23 0 19 0; -#X connect 26 0 8 0; -#X connect 26 0 10 1; -#X connect 28 0 16 0; -#X connect 29 0 22 0; -#X connect 30 0 2 0; -#X connect 32 0 5 2; -#X connect 32 0 29 2; +#X connect 4 0 27 0; +#X connect 6 0 7 0; +#X connect 7 0 8 0; +#X connect 8 0 4 0; +#X connect 12 0 13 0; +#X connect 12 0 26 0; +#X connect 13 0 15 0; +#X connect 14 0 24 0; +#X connect 15 0 12 1; +#X connect 17 0 12 0; +#X connect 21 0 17 0; +#X connect 24 0 6 0; +#X connect 24 0 8 1; +#X connect 26 0 14 0; +#X connect 27 0 20 0; +#X connect 28 0 1 0; +#X connect 30 0 4 2; +#X connect 30 0 27 2; +#X connect 39 0 4 1; +#X connect 39 0 27 1; diff --git a/doc/3.audio.examples/I04.noisegate.pd b/doc/3.audio.examples/I04.noisegate.pd index 7e4805af..50bbc095 100644 --- a/doc/3.audio.examples/I04.noisegate.pd +++ b/doc/3.audio.examples/I04.noisegate.pd @@ -1,4 +1,4 @@ -#N canvas 496 32 564 552 12; +#N canvas 496 38 564 552 12; #X declare -stdpath ./; #X floatatom 274 372 4 0 1000 0 - - - 0; #X floatatom 82 358 6 0 100 0 - - - 0; @@ -226,7 +226,7 @@ #X text 275 295 masking; #X text 107 12 DENOISER; #X msg 319 335 0; -#N canvas 500 29 431 582 test-signal 0; +#N canvas 500 38 431 582 test-signal 0; #X obj 89 316 line~; #X obj 213 152 r insamprate; #X obj 246 451 *~; From e6247e80e9df691239f550baffe7f59c8d9e3c96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Micha=C3=ABl=20Celerier?= Date: Sun, 7 Jul 2024 04:46:07 -0400 Subject: [PATCH 31/89] Fix build when dprintf is defined as a macro This avois errors when building with clang on NixOS --- src/s_inter_gui.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/s_inter_gui.c b/src/s_inter_gui.c index e358d6aa..43c5960f 100644 --- a/src/s_inter_gui.c +++ b/src/s_inter_gui.c @@ -170,6 +170,9 @@ static void print_val(t_val v) { } #else static void print_val(t_val v) { ; } +#ifdef dprintf +#undef dprintf +#endif int dprintf(int fd, const char* format, ...) { return -1; } #endif From f6f9bfa0ac4eb3e8a7bf0a6e1a2c146211e75acd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Mon, 8 Jul 2024 14:58:49 +0200 Subject: [PATCH 32/89] Add "Esperanto" translation to build-system --- po/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/po/Makefile.am b/po/Makefile.am index 1f4e747d..f027b389 100644 --- a/po/Makefile.am +++ b/po/Makefile.am @@ -78,7 +78,7 @@ ALL_LINGUAS = \ az \ bg \ de \ - el en en_ca es eu \ + el en en_ca eo es eu \ fr \ gu \ he hi hu \ From 6450621203f4c1a3f7df687f6d3903407e767e5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Mon, 8 Jul 2024 15:22:48 +0200 Subject: [PATCH 33/89] add more potential translations to the language pulldown menu so we don't have to add language by language whenever a new one is added. only languages for which translations exist will be shown --- tcl/pd_i18n.tcl | 146 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 145 insertions(+), 1 deletion(-) diff --git a/tcl/pd_i18n.tcl b/tcl/pd_i18n.tcl index e13de821..a1ff7b59 100644 --- a/tcl/pd_i18n.tcl +++ b/tcl/pd_i18n.tcl @@ -71,44 +71,188 @@ proc ::pd_i18n::get_available_languages {{podir ""}} { set ::pd_i18n::podir $podir # translate language-codes set polanguagelist [list \ + aa "Afar" [_ "Afar" ] \ + ab "Abkhazian" [_ "Abkhazian" ] \ + ae "Avestan" [_ "Avestan" ] \ af "Afrikaans" [_ "Afrikaans" ] \ + ak "Akan" [_ "Akan" ] \ + am "Amharic" [_ "Amharic" ] \ + an "Aragonese" [_ "Aragonese" ] \ ar "Arabic" [_ "Arabic" ] \ + as "Assamese" [_ "Assamese" ] \ + av "Avaric" [_ "Avaric" ] \ + ay "Aymara" [_ "Aymara" ] \ az "Azerbaijani" [_ "Azerbaijani" ] \ + ba "Bashkir" [_ "Bashkir" ] \ be "Belarusian" [_ "Belarusian" ] \ bg "Bulgarian" [_ "Bulgarian" ] \ + bh "Bihari" [_ "Bihari" ] \ + bi "Bislama" [_ "Bislama" ] \ + bm "Bambara" [_ "Bambara" ] \ + bn "Bengali" [_ "Bengali" ] \ + bo "Tibetan" [_ "Tibetan" ] \ + br "Breton" [_ "Breton" ] \ + bs "Bosnian" [_ "Bosnian" ] \ + ca "Catalan" [_ "Catalan" ] \ + ce "Chechen" [_ "Chechen" ] \ + ch "Chamorro" [_ "Chamorro" ] \ + co "Corsican" [_ "Corsican" ] \ + cr "Cree" [_ "Cree" ] \ + cs "Czech" [_ "Czech" ] \ + cv "Chuvash" [_ "Chuvash" ] \ + cy "Welsh" [_ "Welsh" ] \ + da "Danish" [_ "Danish" ] \ de "German" [_ "German" ] \ de_at "German (Austria)" [_ "German (Austria)" ] \ + dv "Dhivehi" [_ "Dhivehi" ] \ + dz "Dzongkha" [_ "Dzongkha" ] \ + ee "Ewe" [_ "Ewe" ] \ el "Greek" [_ "Greek" ] \ en "English" [_ "English" ] \ en_ca "English (Canada)" [_ "English (Canada)" ] \ en_gb "English (UK)" [_ "English (UK)" ] \ en_us "English (USA)" [_ "English (USA)" ] \ + eo "Esperanto" [_ "Esperanto" ] \ es "Spanish" [_ "Spanish" ] \ + et "Estonian" [_ "Estonian" ] \ eu "Basque" [_ "Basque" ] \ + fa "Persian" [_ "Persian" ] \ + ff "Fulah" [_ "Fulah" ] \ fi "Finnish" [_ "Finnish" ] \ + fj "Fijian" [_ "Fijian" ] \ + fo "Faroese" [_ "Faroese" ] \ fr "French" [_ "French" ] \ + fy "Frisian" [_ "Frisian" ] \ + ga "Irish" [_ "Irish" ] \ + gd "Gaelic" [_ "Gaelic" ] \ + gl "Galician" [_ "Galician" ] \ + gn "Guarani" [_ "Guarani" ] \ gu "Gujarati" [_ "Gujarati" ] \ + gv "Manx" [_ "Manx" ] \ + ha "Hausa" [_ "Hausa" ] \ he "Hebrew" [_ "Hebrew" ] \ hi "Hindi" [_ "Hindi" ] \ + ho "Hiri Motu" [_ "Hiri Motu" ] \ + hr "Croatian" [_ "Croatian" ] \ + ht "Haitian" [_ "Haitian" ] \ hu "Hungarian" [_ "Hungarian" ] \ hy "Armenian" [_ "Armenian" ] \ - it "Italian" [_ "Italian" ] \ + hz "Herero" [_ "Herero" ] \ + ia "Interlingua" [_ "Interlingua" ] \ id "Indonesian" [_ "Indonesian" ] \ + ie "Occidental" [_ "Occidental" ] \ + ig "Igbo" [_ "Igbo" ] \ + ii "Nuosu" [_ "Nuosu" ] \ + ik "Inupiaq" [_ "Inupiaq" ] \ + io "Ido" [_ "Ido" ] \ + is "Icelandic" [_ "Icelandic" ] \ + it "Italian" [_ "Italian" ] \ + iu "Inuktitut" [_ "Inuktitut" ] \ ja "Japanese" [_ "Japanese" ] \ + jv "Javanese" [_ "Javanese" ] \ + ka "Georgian" [_ "Georgian" ] \ + kg "Kongo" [_ "Kongo" ] \ + ki "Gikuyu" [_ "Gikuyu" ] \ + kj "Kwanyama" [_ "Kwanyama" ] \ + kk "Kazakh" [_ "Kazakh" ] \ + kl "Greenlandic" [_ "Greenlandic" ] \ + kn "Kannada" [_ "Kannada" ] \ ko "Korean" [_ "Korean" ] \ + kr "Kanuri" [_ "Kanuri" ] \ + ks "Kashmiri" [_ "Kashmiri" ] \ + ku "Kurdish" [_ "Kurdish" ] \ + kv "Komi" [_ "Komi" ] \ + kw "Cornish" [_ "Cornish" ] \ + ky "Kyrgyz" [_ "Kyrgyz" ] \ + la "Latin" [_ "Latin" ] \ + lb "Luxembourgish" [_ "Luxembourgish" ] \ + lg "Luganda" [_ "Luganda" ] \ + li "Limburgish" [_ "Limburgish" ] \ + ln "Lingala" [_ "Lingala" ] \ + lo "Lao" [_ "Lao" ] \ + lt "Lithuanian" [_ "Lithuanian" ] \ + lu "Luba-Katanga" [_ "Luba-Katanga" ] \ + lv "Latvian" [_ "Latvian" ] \ + mg "Malagasy" [_ "Malagasy" ] \ + mh "Marshallese" [_ "Marshallese" ] \ + mi "Maori" [_ "Maori" ] \ + mk "Macedonian" [_ "Macedonian" ] \ + ml "Malayalam" [_ "Malayalam" ] \ + mn "Mongolian" [_ "Mongolian" ] \ + mr "Marathi" [_ "Marathi" ] \ + ms "Malay" [_ "Malay" ] \ + mt "Maltese" [_ "Maltese" ] \ + my "Burmese" [_ "Burmese" ] \ + na "Nauru" [_ "Nauru" ] \ + ne "Nepali" [_ "Nepali" ] \ + ng "Ndonga" [_ "Ndonga" ] \ nl "Dutch" [_ "Dutch" ] \ + nn "Norwegian Nynorsk" [_ "Norwegian Nynorsk" ] \ + nv "Navaho" [_ "Navaho" ] \ + ny "Nyanja" [_ "Nyanja" ] \ + oc "Occitan" [_ "Occitan" ] \ + oj "Ojibwe" [_ "Ojibwe" ] \ + om "Oromo" [_ "Oromo" ] \ + or "Odia" [_ "Odia" ] \ + os "Ossetian" [_ "Ossetian" ] \ pa "Panjabi" [_ "Panjabi" ] \ + pi "Pali" [_ "Pali" ] \ pl "Polish" [_ "Polish" ] \ + ps "Pashto" [_ "Pashto" ] \ pt "Portuguese" [_ "Portuguese" ] \ pt_br "Portuguese (Brazil)" [_ "Portuguese (Brazil)" ] \ pt_pt "Portuguese (Portugal)" [_ "Portuguese (Portugal)" ] \ + qu "Quechua" [_ "Quechua" ] \ + rm "Romansh" [_ "Romansh" ] \ + rn "Rundi" [_ "Rundi" ] \ + ro "Romanian" [_ "Romanian" ] \ ru "Russian" [_ "Russian" ] \ + rw "Kinyarwanda" [_ "Kinyarwanda" ] \ + sa "Sanskrit" [_ "Sanskrit" ] \ + sc "Sardinian" [_ "Sardinian" ] \ + sd "Sindhi" [_ "Sindhi" ] \ + sg "Sango" [_ "Sango" ] \ + si "Sinhala" [_ "Sinhala" ] \ + sk "Slovak" [_ "Slovak" ] \ + sl "Slovenian" [_ "Slovenian" ] \ + sm "Samoan" [_ "Samoan" ] \ + sn "Shona" [_ "Shona" ] \ + so "Somali" [_ "Somali" ] \ sq "Albanian" [_ "Albanian" ] \ + sr "Serbian" [_ "Serbian" ] \ + ss "Swati" [_ "Swati" ] \ + su "Sundanese" [_ "Sundanese" ] \ sv "Swedish" [_ "Swedish" ] \ + sw "Swahili" [_ "Swahili" ] \ + ta "Tamil" [_ "Tamil" ] \ + te "Telugu" [_ "Telugu" ] \ + tg "Tajik" [_ "Tajik" ] \ + th "Thai" [_ "Thai" ] \ + ti "Tigrinya" [_ "Tigrinya" ] \ + tk "Turkmen" [_ "Turkmen" ] \ + tl "Tagalog" [_ "Tagalog" ] \ + tn "Tswana" [_ "Tswana" ] \ + to "Tongan" [_ "Tongan" ] \ tr "Turkish" [_ "Turkish" ] \ + ts "Tsonga" [_ "Tsonga" ] \ + tt "Tatar" [_ "Tatar" ] \ + tw "Twi" [_ "Twi" ] \ + ty "Tahitian" [_ "Tahitian" ] \ + ug "Uyghur" [_ "Uyghur" ] \ uk "Ukrainian" [_ "Ukrainian" ] \ + ur "Urdu" [_ "Urdu" ] \ + uz "Uzbek" [_ "Uzbek" ] \ + ve "Venda" [_ "Venda" ] \ vi "Vietnamese" [_ "Vietnamese" ] \ + vo "Volapük" [_ "Volapük" ] \ + wa "Walloon" [_ "Walloon" ] \ + wo "Wolof" [_ "Wolof" ] \ + xh "Xhosa" [_ "Xhosa" ] \ + yi "Yiddish" [_ "Yiddish" ] \ + yo "Yoruba" [_ "Yoruba" ] \ + za "Zhuang" [_ "Zhuang" ] \ zh_tw "Chinese (Traditional)" [_ "Chinese (Traditional)" ] \ + zu "Zulu" [_ "Zulu" ] \ ] set polanguages [dict create] From 24e7bd0f0981d5469f893a4658db30cae795da89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Mon, 8 Jul 2024 16:27:14 +0200 Subject: [PATCH 34/89] template for language translations --- po/template.pot | 440 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 436 insertions(+), 4 deletions(-) diff --git a/po/template.pot b/po/template.pot index 02de2083..460d4bc1 100644 --- a/po/template.pot +++ b/po/template.pot @@ -5,15 +5,15 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: Pure Data 0.54.1\n" +"Project-Id-Version: Pure Data 0.55.0\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" -"POT-Creation-Date: 2024-05-06 10:09+0200\n" +"POT-Creation-Date: 2024-07-08 15:19+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "linear" @@ -1224,27 +1224,114 @@ msgstr "" msgid "The language can only be set during startup." msgstr "" +msgid "Afar" +msgstr "" + +msgid "Abkhazian" +msgstr "" + +msgid "Avestan" +msgstr "" + msgid "Afrikaans" msgstr "" +msgid "Akan" +msgstr "" + +msgid "Amharic" +msgstr "" + +msgid "Aragonese" +msgstr "" + msgid "Arabic" msgstr "" +msgid "Assamese" +msgstr "" + +msgid "Avaric" +msgstr "" + +msgid "Aymara" +msgstr "" + msgid "Azerbaijani" msgstr "" +msgid "Bashkir" +msgstr "" + msgid "Belarusian" msgstr "" msgid "Bulgarian" msgstr "" +msgid "Bihari" +msgstr "" + +msgid "Bislama" +msgstr "" + +msgid "Bambara" +msgstr "" + +msgid "Bengali" +msgstr "" + +msgid "Tibetan" +msgstr "" + +msgid "Breton" +msgstr "" + +msgid "Bosnian" +msgstr "" + +msgid "Catalan" +msgstr "" + +msgid "Chechen" +msgstr "" + +msgid "Chamorro" +msgstr "" + +msgid "Corsican" +msgstr "" + +msgid "Cree" +msgstr "" + +msgid "Czech" +msgstr "" + +msgid "Chuvash" +msgstr "" + +msgid "Welsh" +msgstr "" + +msgid "Danish" +msgstr "" + msgid "German" msgstr "" msgid "German (Austria)" msgstr "" +msgid "Dhivehi" +msgstr "" + +msgid "Dzongkha" +msgstr "" + +msgid "Ewe" +msgstr "" + msgid "Greek" msgstr "" @@ -1260,54 +1347,267 @@ msgstr "" msgid "English (USA)" msgstr "" +msgid "Esperanto" +msgstr "" + msgid "Spanish" msgstr "" +msgid "Estonian" +msgstr "" + msgid "Basque" msgstr "" +msgid "Persian" +msgstr "" + +msgid "Fulah" +msgstr "" + msgid "Finnish" msgstr "" +msgid "Fijian" +msgstr "" + +msgid "Faroese" +msgstr "" + msgid "French" msgstr "" +msgid "Frisian" +msgstr "" + +msgid "Irish" +msgstr "" + +msgid "Gaelic" +msgstr "" + +msgid "Galician" +msgstr "" + +msgid "Guarani" +msgstr "" + msgid "Gujarati" msgstr "" +msgid "Manx" +msgstr "" + +msgid "Hausa" +msgstr "" + msgid "Hebrew" msgstr "" msgid "Hindi" msgstr "" +msgid "Hiri Motu" +msgstr "" + +msgid "Croatian" +msgstr "" + +msgid "Haitian" +msgstr "" + msgid "Hungarian" msgstr "" msgid "Armenian" msgstr "" -msgid "Italian" +msgid "Herero" +msgstr "" + +msgid "Interlingua" msgstr "" msgid "Indonesian" msgstr "" +msgid "Occidental" +msgstr "" + +msgid "Igbo" +msgstr "" + +msgid "Nuosu" +msgstr "" + +msgid "Inupiaq" +msgstr "" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "" + +msgid "Italian" +msgstr "" + +msgid "Inuktitut" +msgstr "" + msgid "Japanese" msgstr "" +msgid "Javanese" +msgstr "" + +msgid "Georgian" +msgstr "" + +msgid "Kongo" +msgstr "" + +msgid "Gikuyu" +msgstr "" + +msgid "Kwanyama" +msgstr "" + +msgid "Kazakh" +msgstr "" + +msgid "Greenlandic" +msgstr "" + +msgid "Kannada" +msgstr "" + msgid "Korean" msgstr "" +msgid "Kanuri" +msgstr "" + +msgid "Kashmiri" +msgstr "" + +msgid "Kurdish" +msgstr "" + +msgid "Komi" +msgstr "" + +msgid "Cornish" +msgstr "" + +msgid "Kyrgyz" +msgstr "" + +msgid "Latin" +msgstr "" + +msgid "Luxembourgish" +msgstr "" + +msgid "Luganda" +msgstr "" + +msgid "Limburgish" +msgstr "" + +msgid "Lingala" +msgstr "" + +msgid "Lao" +msgstr "" + +msgid "Lithuanian" +msgstr "" + +msgid "Luba-Katanga" +msgstr "" + +msgid "Latvian" +msgstr "" + +msgid "Malagasy" +msgstr "" + +msgid "Marshallese" +msgstr "" + +msgid "Maori" +msgstr "" + +msgid "Macedonian" +msgstr "" + +msgid "Malayalam" +msgstr "" + +msgid "Mongolian" +msgstr "" + +msgid "Marathi" +msgstr "" + +msgid "Malay" +msgstr "" + +msgid "Maltese" +msgstr "" + +msgid "Burmese" +msgstr "" + +msgid "Nauru" +msgstr "" + +msgid "Nepali" +msgstr "" + +msgid "Ndonga" +msgstr "" + msgid "Dutch" msgstr "" +msgid "Norwegian Nynorsk" +msgstr "" + +msgid "Navaho" +msgstr "" + +msgid "Nyanja" +msgstr "" + +msgid "Occitan" +msgstr "" + +msgid "Ojibwe" +msgstr "" + +msgid "Oromo" +msgstr "" + +msgid "Odia" +msgstr "" + +msgid "Ossetian" +msgstr "" + msgid "Panjabi" msgstr "" +msgid "Pali" +msgstr "" + msgid "Polish" msgstr "" +msgid "Pashto" +msgstr "" + msgid "Portuguese" msgstr "" @@ -1317,27 +1617,159 @@ msgstr "" msgid "Portuguese (Portugal)" msgstr "" +msgid "Quechua" +msgstr "" + +msgid "Romansh" +msgstr "" + +msgid "Rundi" +msgstr "" + +msgid "Romanian" +msgstr "" + msgid "Russian" msgstr "" +msgid "Kinyarwanda" +msgstr "" + +msgid "Sanskrit" +msgstr "" + +msgid "Sardinian" +msgstr "" + +msgid "Sindhi" +msgstr "" + +msgid "Sango" +msgstr "" + +msgid "Sinhala" +msgstr "" + +msgid "Slovak" +msgstr "" + +msgid "Slovenian" +msgstr "" + +msgid "Samoan" +msgstr "" + +msgid "Shona" +msgstr "" + +msgid "Somali" +msgstr "" + msgid "Albanian" msgstr "" +msgid "Serbian" +msgstr "" + +msgid "Swati" +msgstr "" + +msgid "Sundanese" +msgstr "" + msgid "Swedish" msgstr "" +msgid "Swahili" +msgstr "" + +msgid "Tamil" +msgstr "" + +msgid "Telugu" +msgstr "" + +msgid "Tajik" +msgstr "" + +msgid "Thai" +msgstr "" + +msgid "Tigrinya" +msgstr "" + +msgid "Turkmen" +msgstr "" + +msgid "Tagalog" +msgstr "" + +msgid "Tswana" +msgstr "" + +msgid "Tongan" +msgstr "" + msgid "Turkish" msgstr "" +msgid "Tsonga" +msgstr "" + +msgid "Tatar" +msgstr "" + +msgid "Twi" +msgstr "" + +msgid "Tahitian" +msgstr "" + +msgid "Uyghur" +msgstr "" + msgid "Ukrainian" msgstr "" +msgid "Urdu" +msgstr "" + +msgid "Uzbek" +msgstr "" + +msgid "Venda" +msgstr "" + msgid "Vietnamese" msgstr "" +msgid "Volapük" +msgstr "" + +msgid "Walloon" +msgstr "" + +msgid "Wolof" +msgstr "" + +msgid "Xhosa" +msgstr "" + +msgid "Yiddish" +msgstr "" + +msgid "Yoruba" +msgstr "" + +msgid "Zhuang" +msgstr "" + msgid "Chinese (Traditional)" msgstr "" +msgid "Zulu" +msgstr "" + msgid "(no translation)" msgstr "" From 8511a01589720bceb350a760ff6c49926c10384a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Mon, 8 Jul 2024 16:27:43 +0200 Subject: [PATCH 35/89] empty language translations --- po/az.po | 436 +++++++++++++++++++++++++++++++++++++++++++++++++- po/bg.po | 436 +++++++++++++++++++++++++++++++++++++++++++++++++- po/de.po | 452 +++++++++++++++++++++++++++++++++++++++++++++++++++- po/el.po | 436 +++++++++++++++++++++++++++++++++++++++++++++++++- po/en.po | 452 +++++++++++++++++++++++++++++++++++++++++++++++++++- po/en_ca.po | 452 +++++++++++++++++++++++++++++++++++++++++++++++++++- po/eo.po | 452 +++++++++++++++++++++++++++++++++++++++++++++++++++- po/es.po | 452 +++++++++++++++++++++++++++++++++++++++++++++++++++- po/eu.po | 436 +++++++++++++++++++++++++++++++++++++++++++++++++- po/fr.po | 452 +++++++++++++++++++++++++++++++++++++++++++++++++++- po/gu.po | 436 +++++++++++++++++++++++++++++++++++++++++++++++++- po/he.po | 448 ++++++++++++++++++++++++++++++++++++++++++++++++++- po/hi.po | 436 +++++++++++++++++++++++++++++++++++++++++++++++++- po/hu.po | 436 +++++++++++++++++++++++++++++++++++++++++++++++++- po/id.po | 436 +++++++++++++++++++++++++++++++++++++++++++++++++- po/it.po | 448 ++++++++++++++++++++++++++++++++++++++++++++++++++- po/ja.po | 440 +++++++++++++++++++++++++++++++++++++++++++++++++- po/ko.po | 440 +++++++++++++++++++++++++++++++++++++++++++++++++- po/nl.po | 440 +++++++++++++++++++++++++++++++++++++++++++++++++- po/pa.po | 436 +++++++++++++++++++++++++++++++++++++++++++++++++- po/pl.po | 436 +++++++++++++++++++++++++++++++++++++++++++++++++- po/pt_br.po | 448 ++++++++++++++++++++++++++++++++++++++++++++++++++- po/pt_pt.po | 448 ++++++++++++++++++++++++++++++++++++++++++++++++++- po/ru.po | 440 +++++++++++++++++++++++++++++++++++++++++++++++++- po/sq.po | 436 +++++++++++++++++++++++++++++++++++++++++++++++++- po/sv.po | 436 +++++++++++++++++++++++++++++++++++++++++++++++++- po/uk.po | 440 +++++++++++++++++++++++++++++++++++++++++++++++++- po/vi.po | 436 +++++++++++++++++++++++++++++++++++++++++++++++++- po/zh_tw.po | 436 +++++++++++++++++++++++++++++++++++++++++++++++++- 29 files changed, 12728 insertions(+), 80 deletions(-) diff --git a/po/az.po b/po/az.po index c3074c63..f561e88f 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: 2024-05-06 10:09+0200\n" +"POT-Creation-Date: 2024-07-08 15:19+0200\n" "PO-Revision-Date: 2004-03-12 22:22+0200\n" "Last-Translator: Metin Amiroff \n" "Language-Team: Azerbaijani \n" @@ -1289,27 +1289,114 @@ msgstr "" msgid "The language can only be set during startup." msgstr "" +msgid "Afar" +msgstr "" + +msgid "Abkhazian" +msgstr "" + +msgid "Avestan" +msgstr "" + msgid "Afrikaans" msgstr "" +msgid "Akan" +msgstr "" + +msgid "Amharic" +msgstr "" + +msgid "Aragonese" +msgstr "" + msgid "Arabic" msgstr "" +msgid "Assamese" +msgstr "" + +msgid "Avaric" +msgstr "" + +msgid "Aymara" +msgstr "" + msgid "Azerbaijani" msgstr "" +msgid "Bashkir" +msgstr "" + msgid "Belarusian" msgstr "" msgid "Bulgarian" msgstr "" +msgid "Bihari" +msgstr "" + +msgid "Bislama" +msgstr "" + +msgid "Bambara" +msgstr "" + +msgid "Bengali" +msgstr "" + +msgid "Tibetan" +msgstr "" + +msgid "Breton" +msgstr "" + +msgid "Bosnian" +msgstr "" + +msgid "Catalan" +msgstr "" + +msgid "Chechen" +msgstr "" + +msgid "Chamorro" +msgstr "" + +msgid "Corsican" +msgstr "" + +msgid "Cree" +msgstr "" + +msgid "Czech" +msgstr "" + +msgid "Chuvash" +msgstr "" + +msgid "Welsh" +msgstr "" + +msgid "Danish" +msgstr "" + msgid "German" msgstr "" msgid "German (Austria)" msgstr "" +msgid "Dhivehi" +msgstr "" + +msgid "Dzongkha" +msgstr "" + +msgid "Ewe" +msgstr "" + msgid "Greek" msgstr "" @@ -1325,54 +1412,267 @@ msgstr "" msgid "English (USA)" msgstr "" +msgid "Esperanto" +msgstr "" + msgid "Spanish" msgstr "" +msgid "Estonian" +msgstr "" + msgid "Basque" msgstr "" +msgid "Persian" +msgstr "" + +msgid "Fulah" +msgstr "" + msgid "Finnish" msgstr "" +msgid "Fijian" +msgstr "" + +msgid "Faroese" +msgstr "" + msgid "French" msgstr "" +msgid "Frisian" +msgstr "" + +msgid "Irish" +msgstr "" + +msgid "Gaelic" +msgstr "" + +msgid "Galician" +msgstr "" + +msgid "Guarani" +msgstr "" + msgid "Gujarati" msgstr "" +msgid "Manx" +msgstr "" + +msgid "Hausa" +msgstr "" + msgid "Hebrew" msgstr "" msgid "Hindi" msgstr "" +msgid "Hiri Motu" +msgstr "" + +msgid "Croatian" +msgstr "" + +msgid "Haitian" +msgstr "" + msgid "Hungarian" msgstr "" msgid "Armenian" msgstr "" -msgid "Italian" +msgid "Herero" +msgstr "" + +msgid "Interlingua" msgstr "" msgid "Indonesian" msgstr "" +msgid "Occidental" +msgstr "" + +msgid "Igbo" +msgstr "" + +msgid "Nuosu" +msgstr "" + +msgid "Inupiaq" +msgstr "" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "" + +msgid "Italian" +msgstr "" + +msgid "Inuktitut" +msgstr "" + msgid "Japanese" msgstr "" +msgid "Javanese" +msgstr "" + +msgid "Georgian" +msgstr "" + +msgid "Kongo" +msgstr "" + +msgid "Gikuyu" +msgstr "" + +msgid "Kwanyama" +msgstr "" + +msgid "Kazakh" +msgstr "" + +msgid "Greenlandic" +msgstr "" + +msgid "Kannada" +msgstr "" + msgid "Korean" msgstr "" +msgid "Kanuri" +msgstr "" + +msgid "Kashmiri" +msgstr "" + +msgid "Kurdish" +msgstr "" + +msgid "Komi" +msgstr "" + +msgid "Cornish" +msgstr "" + +msgid "Kyrgyz" +msgstr "" + +msgid "Latin" +msgstr "" + +msgid "Luxembourgish" +msgstr "" + +msgid "Luganda" +msgstr "" + +msgid "Limburgish" +msgstr "" + +msgid "Lingala" +msgstr "" + +msgid "Lao" +msgstr "" + +msgid "Lithuanian" +msgstr "" + +msgid "Luba-Katanga" +msgstr "" + +msgid "Latvian" +msgstr "" + +msgid "Malagasy" +msgstr "" + +msgid "Marshallese" +msgstr "" + +msgid "Maori" +msgstr "" + +msgid "Macedonian" +msgstr "" + +msgid "Malayalam" +msgstr "" + +msgid "Mongolian" +msgstr "" + +msgid "Marathi" +msgstr "" + +msgid "Malay" +msgstr "" + +msgid "Maltese" +msgstr "" + +msgid "Burmese" +msgstr "" + +msgid "Nauru" +msgstr "" + +msgid "Nepali" +msgstr "" + +msgid "Ndonga" +msgstr "" + msgid "Dutch" msgstr "" +msgid "Norwegian Nynorsk" +msgstr "" + +msgid "Navaho" +msgstr "" + +msgid "Nyanja" +msgstr "" + +msgid "Occitan" +msgstr "" + +msgid "Ojibwe" +msgstr "" + +msgid "Oromo" +msgstr "" + +msgid "Odia" +msgstr "" + +msgid "Ossetian" +msgstr "" + msgid "Panjabi" msgstr "" +msgid "Pali" +msgstr "" + msgid "Polish" msgstr "" +msgid "Pashto" +msgstr "" + msgid "Portuguese" msgstr "" @@ -1382,27 +1682,159 @@ msgstr "" msgid "Portuguese (Portugal)" msgstr "" +msgid "Quechua" +msgstr "" + +msgid "Romansh" +msgstr "" + +msgid "Rundi" +msgstr "" + +msgid "Romanian" +msgstr "" + msgid "Russian" msgstr "" +msgid "Kinyarwanda" +msgstr "" + +msgid "Sanskrit" +msgstr "" + +msgid "Sardinian" +msgstr "" + +msgid "Sindhi" +msgstr "" + +msgid "Sango" +msgstr "" + +msgid "Sinhala" +msgstr "" + +msgid "Slovak" +msgstr "" + +msgid "Slovenian" +msgstr "" + +msgid "Samoan" +msgstr "" + +msgid "Shona" +msgstr "" + +msgid "Somali" +msgstr "" + msgid "Albanian" msgstr "" +msgid "Serbian" +msgstr "" + +msgid "Swati" +msgstr "" + +msgid "Sundanese" +msgstr "" + msgid "Swedish" msgstr "" +msgid "Swahili" +msgstr "" + +msgid "Tamil" +msgstr "" + +msgid "Telugu" +msgstr "" + +msgid "Tajik" +msgstr "" + +msgid "Thai" +msgstr "" + +msgid "Tigrinya" +msgstr "" + +msgid "Turkmen" +msgstr "" + +msgid "Tagalog" +msgstr "" + +msgid "Tswana" +msgstr "" + +msgid "Tongan" +msgstr "" + msgid "Turkish" msgstr "" +msgid "Tsonga" +msgstr "" + +msgid "Tatar" +msgstr "" + +msgid "Twi" +msgstr "" + +msgid "Tahitian" +msgstr "" + +msgid "Uyghur" +msgstr "" + msgid "Ukrainian" msgstr "" +msgid "Urdu" +msgstr "" + +msgid "Uzbek" +msgstr "" + +msgid "Venda" +msgstr "" + msgid "Vietnamese" msgstr "" +msgid "Volapük" +msgstr "" + +msgid "Walloon" +msgstr "" + +msgid "Wolof" +msgstr "" + +msgid "Xhosa" +msgstr "" + +msgid "Yiddish" +msgstr "" + +msgid "Yoruba" +msgstr "" + +msgid "Zhuang" +msgstr "" + msgid "Chinese (Traditional)" msgstr "" +msgid "Zulu" +msgstr "" + msgid "(no translation)" msgstr "" diff --git a/po/bg.po b/po/bg.po index 91e61bbf..5b40aecd 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: 2024-05-06 10:09+0200\n" +"POT-Creation-Date: 2024-07-08 15:19+0200\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" @@ -1271,27 +1271,117 @@ msgstr "Konnte Einstellungen '%1$s' nicht in %2$s erstellen" msgid "The language can only be set during startup." msgstr "Die Sprache kann nur während des Startens von Pd gesetzt werden." +msgid "Afar" +msgstr "" + +msgid "Abkhazian" +msgstr "" + +msgid "Avestan" +msgstr "" + msgid "Afrikaans" msgstr "Afrikaans" +msgid "Akan" +msgstr "" + +msgid "Amharic" +msgstr "" + +msgid "Aragonese" +msgstr "" + msgid "Arabic" msgstr "Arabisch" +msgid "Assamese" +msgstr "" + +msgid "Avaric" +msgstr "" + +msgid "Aymara" +msgstr "" + msgid "Azerbaijani" msgstr "Aserbaidschanisch" +msgid "Bashkir" +msgstr "" + msgid "Belarusian" msgstr "Belarussisch" msgid "Bulgarian" msgstr "Bulgarisch" +msgid "Bihari" +msgstr "" + +msgid "Bislama" +msgstr "" + +msgid "Bambara" +msgstr "" + +msgid "Bengali" +msgstr "" + +msgid "Tibetan" +msgstr "" + +msgid "Breton" +msgstr "" + +msgid "Bosnian" +msgstr "" + +#, fuzzy +msgid "Catalan" +msgstr "schwerwiegende Fehler" + +#, fuzzy +msgid "Chechen" +msgstr "Überprüfen" + +msgid "Chamorro" +msgstr "" + +msgid "Corsican" +msgstr "" + +msgid "Cree" +msgstr "" + +msgid "Czech" +msgstr "" + +msgid "Chuvash" +msgstr "" + +msgid "Welsh" +msgstr "" + +#, fuzzy +msgid "Danish" +msgstr "Spanisch" + msgid "German" msgstr "Deutsch" msgid "German (Austria)" msgstr "Deutsch (Österreich)" +msgid "Dhivehi" +msgstr "" + +msgid "Dzongkha" +msgstr "" + +msgid "Ewe" +msgstr "" + msgid "Greek" msgstr "Griechisch" @@ -1307,54 +1397,272 @@ msgstr "Englisch (UK)" msgid "English (USA)" msgstr "Englisch (USA)" +msgid "Esperanto" +msgstr "" + msgid "Spanish" msgstr "Spanisch" +msgid "Estonian" +msgstr "" + msgid "Basque" msgstr "Baskisch" +#, fuzzy +msgid "Persian" +msgstr "Version" + +msgid "Fulah" +msgstr "" + msgid "Finnish" msgstr "Finnisch" +msgid "Fijian" +msgstr "" + +msgid "Faroese" +msgstr "" + msgid "French" msgstr "Französisch" +msgid "Frisian" +msgstr "" + +msgid "Irish" +msgstr "" + +msgid "Gaelic" +msgstr "" + +msgid "Galician" +msgstr "" + +msgid "Guarani" +msgstr "" + msgid "Gujarati" msgstr "Gujarati" +msgid "Manx" +msgstr "" + +msgid "Hausa" +msgstr "" + msgid "Hebrew" msgstr "Hebräisch" msgid "Hindi" msgstr "Hindi" +msgid "Hiri Motu" +msgstr "" + +msgid "Croatian" +msgstr "" + +msgid "Haitian" +msgstr "" + msgid "Hungarian" msgstr "Ungarisch" msgid "Armenian" msgstr "Armenisch" -msgid "Italian" -msgstr "Italienisch" +msgid "Herero" +msgstr "" + +msgid "Interlingua" +msgstr "" msgid "Indonesian" msgstr "Indonesisch" +msgid "Occidental" +msgstr "" + +msgid "Igbo" +msgstr "" + +msgid "Nuosu" +msgstr "" + +msgid "Inupiaq" +msgstr "" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "" + +msgid "Italian" +msgstr "Italienisch" + +msgid "Inuktitut" +msgstr "" + msgid "Japanese" msgstr "Japanisch" +#, fuzzy +msgid "Javanese" +msgstr "Japanisch" + +msgid "Georgian" +msgstr "" + +msgid "Kongo" +msgstr "" + +msgid "Gikuyu" +msgstr "" + +msgid "Kwanyama" +msgstr "" + +msgid "Kazakh" +msgstr "" + +msgid "Greenlandic" +msgstr "" + +msgid "Kannada" +msgstr "" + msgid "Korean" msgstr "Koreanisch" +msgid "Kanuri" +msgstr "" + +msgid "Kashmiri" +msgstr "" + +msgid "Kurdish" +msgstr "" + +msgid "Komi" +msgstr "" + +msgid "Cornish" +msgstr "" + +msgid "Kyrgyz" +msgstr "" + +msgid "Latin" +msgstr "" + +msgid "Luxembourgish" +msgstr "" + +msgid "Luganda" +msgstr "" + +msgid "Limburgish" +msgstr "" + +msgid "Lingala" +msgstr "" + +#, fuzzy +msgid "Lao" +msgstr "Protokoll" + +msgid "Lithuanian" +msgstr "" + +msgid "Luba-Katanga" +msgstr "" + +msgid "Latvian" +msgstr "" + +msgid "Malagasy" +msgstr "" + +msgid "Marshallese" +msgstr "" + +msgid "Maori" +msgstr "" + +msgid "Macedonian" +msgstr "" + +msgid "Malayalam" +msgstr "" + +msgid "Mongolian" +msgstr "" + +#, fuzzy +msgid "Marathi" +msgstr "Gujarati" + +msgid "Malay" +msgstr "" + +msgid "Maltese" +msgstr "" + +msgid "Burmese" +msgstr "" + +msgid "Nauru" +msgstr "" + +msgid "Nepali" +msgstr "" + +msgid "Ndonga" +msgstr "" + msgid "Dutch" msgstr "Niederländisch" +msgid "Norwegian Nynorsk" +msgstr "" + +msgid "Navaho" +msgstr "" + +#, fuzzy +msgid "Nyanja" +msgstr "Panjabi" + +msgid "Occitan" +msgstr "" + +msgid "Ojibwe" +msgstr "" + +msgid "Oromo" +msgstr "" + +msgid "Odia" +msgstr "" + +msgid "Ossetian" +msgstr "" + msgid "Panjabi" msgstr "Panjabi" +msgid "Pali" +msgstr "" + msgid "Polish" msgstr "Polnisch" +msgid "Pashto" +msgstr "" + msgid "Portuguese" msgstr "Portugiesisch" @@ -1364,27 +1672,161 @@ msgstr "Portugiesisch (Brasilien)" msgid "Portuguese (Portugal)" msgstr "Portugiesisch (Portugal)" +msgid "Quechua" +msgstr "" + +msgid "Romansh" +msgstr "" + +msgid "Rundi" +msgstr "" + +#, fuzzy +msgid "Romanian" +msgstr "Albanisch" + msgid "Russian" msgstr "Russisch" +msgid "Kinyarwanda" +msgstr "" + +msgid "Sanskrit" +msgstr "" + +#, fuzzy +msgid "Sardinian" +msgstr "Ukrainisch" + +msgid "Sindhi" +msgstr "" + +msgid "Sango" +msgstr "" + +msgid "Sinhala" +msgstr "" + +msgid "Slovak" +msgstr "" + +msgid "Slovenian" +msgstr "" + +msgid "Samoan" +msgstr "" + +msgid "Shona" +msgstr "" + +msgid "Somali" +msgstr "" + msgid "Albanian" msgstr "Albanisch" +msgid "Serbian" +msgstr "" + +msgid "Swati" +msgstr "" + +msgid "Sundanese" +msgstr "" + msgid "Swedish" msgstr "Schwedisch" +msgid "Swahili" +msgstr "" + +msgid "Tamil" +msgstr "" + +msgid "Telugu" +msgstr "" + +msgid "Tajik" +msgstr "" + +msgid "Thai" +msgstr "" + +msgid "Tigrinya" +msgstr "" + +msgid "Turkmen" +msgstr "" + +msgid "Tagalog" +msgstr "" + +msgid "Tswana" +msgstr "" + +msgid "Tongan" +msgstr "" + msgid "Turkish" msgstr "Türkisch" +msgid "Tsonga" +msgstr "" + +msgid "Tatar" +msgstr "" + +msgid "Twi" +msgstr "" + +msgid "Tahitian" +msgstr "" + +msgid "Uyghur" +msgstr "" + msgid "Ukrainian" msgstr "Ukrainisch" +msgid "Urdu" +msgstr "" + +msgid "Uzbek" +msgstr "" + +msgid "Venda" +msgstr "" + msgid "Vietnamese" msgstr "Vietnamesisch" +msgid "Volapük" +msgstr "" + +msgid "Walloon" +msgstr "" + +msgid "Wolof" +msgstr "" + +msgid "Xhosa" +msgstr "" + +msgid "Yiddish" +msgstr "" + +msgid "Yoruba" +msgstr "" + +msgid "Zhuang" +msgstr "" + msgid "Chinese (Traditional)" msgstr "Chinesisch (traditionell)" +msgid "Zulu" +msgstr "" + msgid "(no translation)" msgstr "(keine Übersetzung)" diff --git a/po/el.po b/po/el.po index 2e047ebb..117e730f 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: 2024-05-06 10:09+0200\n" +"POT-Creation-Date: 2024-07-08 15:19+0200\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" @@ -1247,27 +1247,117 @@ msgstr "Couldn't create preferences \"%1$s\" in %2$s" msgid "The language can only be set during startup." msgstr "The language can only be set during startup." +msgid "Afar" +msgstr "" + +msgid "Abkhazian" +msgstr "" + +msgid "Avestan" +msgstr "" + msgid "Afrikaans" msgstr "Afrikaans" +msgid "Akan" +msgstr "" + +msgid "Amharic" +msgstr "" + +msgid "Aragonese" +msgstr "" + msgid "Arabic" msgstr "Arabic" +msgid "Assamese" +msgstr "" + +msgid "Avaric" +msgstr "" + +msgid "Aymara" +msgstr "" + msgid "Azerbaijani" msgstr "Azerbaijani" +msgid "Bashkir" +msgstr "" + msgid "Belarusian" msgstr "Belarusian" msgid "Bulgarian" msgstr "Bulgarian" +msgid "Bihari" +msgstr "" + +msgid "Bislama" +msgstr "" + +msgid "Bambara" +msgstr "" + +msgid "Bengali" +msgstr "" + +msgid "Tibetan" +msgstr "" + +msgid "Breton" +msgstr "" + +msgid "Bosnian" +msgstr "" + +#, fuzzy +msgid "Catalan" +msgstr "fatal" + +#, fuzzy +msgid "Chechen" +msgstr "Check" + +msgid "Chamorro" +msgstr "" + +msgid "Corsican" +msgstr "" + +msgid "Cree" +msgstr "" + +msgid "Czech" +msgstr "" + +msgid "Chuvash" +msgstr "" + +msgid "Welsh" +msgstr "" + +#, fuzzy +msgid "Danish" +msgstr "Spanish" + msgid "German" msgstr "German" msgid "German (Austria)" msgstr "German (Austria)" +msgid "Dhivehi" +msgstr "" + +msgid "Dzongkha" +msgstr "" + +msgid "Ewe" +msgstr "" + msgid "Greek" msgstr "Greek" @@ -1283,54 +1373,272 @@ msgstr "English (UK)" msgid "English (USA)" msgstr "English (USA)" +msgid "Esperanto" +msgstr "" + msgid "Spanish" msgstr "Spanish" +msgid "Estonian" +msgstr "" + msgid "Basque" msgstr "Basque" +#, fuzzy +msgid "Persian" +msgstr "Version" + +msgid "Fulah" +msgstr "" + msgid "Finnish" msgstr "Finnish" +msgid "Fijian" +msgstr "" + +msgid "Faroese" +msgstr "" + msgid "French" msgstr "French" +msgid "Frisian" +msgstr "" + +msgid "Irish" +msgstr "" + +msgid "Gaelic" +msgstr "" + +msgid "Galician" +msgstr "" + +msgid "Guarani" +msgstr "" + msgid "Gujarati" msgstr "Gujarati" +msgid "Manx" +msgstr "" + +msgid "Hausa" +msgstr "" + msgid "Hebrew" msgstr "Hebrew" msgid "Hindi" msgstr "Hindi" +msgid "Hiri Motu" +msgstr "" + +msgid "Croatian" +msgstr "" + +msgid "Haitian" +msgstr "" + msgid "Hungarian" msgstr "Hungarian" msgid "Armenian" msgstr "Armenian" -msgid "Italian" -msgstr "Italian" +msgid "Herero" +msgstr "" + +msgid "Interlingua" +msgstr "" msgid "Indonesian" msgstr "Indonesian" +msgid "Occidental" +msgstr "" + +msgid "Igbo" +msgstr "" + +msgid "Nuosu" +msgstr "" + +msgid "Inupiaq" +msgstr "" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "" + +msgid "Italian" +msgstr "Italian" + +msgid "Inuktitut" +msgstr "" + msgid "Japanese" msgstr "Japanese" +#, fuzzy +msgid "Javanese" +msgstr "Japanese" + +msgid "Georgian" +msgstr "" + +msgid "Kongo" +msgstr "" + +msgid "Gikuyu" +msgstr "" + +msgid "Kwanyama" +msgstr "" + +msgid "Kazakh" +msgstr "" + +msgid "Greenlandic" +msgstr "" + +msgid "Kannada" +msgstr "" + msgid "Korean" msgstr "Korean" +msgid "Kanuri" +msgstr "" + +msgid "Kashmiri" +msgstr "" + +msgid "Kurdish" +msgstr "" + +msgid "Komi" +msgstr "" + +msgid "Cornish" +msgstr "" + +msgid "Kyrgyz" +msgstr "" + +msgid "Latin" +msgstr "" + +msgid "Luxembourgish" +msgstr "" + +msgid "Luganda" +msgstr "" + +msgid "Limburgish" +msgstr "" + +msgid "Lingala" +msgstr "" + +#, fuzzy +msgid "Lao" +msgstr "Log" + +msgid "Lithuanian" +msgstr "" + +msgid "Luba-Katanga" +msgstr "" + +msgid "Latvian" +msgstr "" + +msgid "Malagasy" +msgstr "" + +msgid "Marshallese" +msgstr "" + +msgid "Maori" +msgstr "" + +msgid "Macedonian" +msgstr "" + +msgid "Malayalam" +msgstr "" + +msgid "Mongolian" +msgstr "" + +#, fuzzy +msgid "Marathi" +msgstr "Gujarati" + +msgid "Malay" +msgstr "" + +msgid "Maltese" +msgstr "" + +msgid "Burmese" +msgstr "" + +msgid "Nauru" +msgstr "" + +msgid "Nepali" +msgstr "" + +msgid "Ndonga" +msgstr "" + msgid "Dutch" msgstr "Dutch" +msgid "Norwegian Nynorsk" +msgstr "" + +msgid "Navaho" +msgstr "" + +#, fuzzy +msgid "Nyanja" +msgstr "Panjabi" + +msgid "Occitan" +msgstr "" + +msgid "Ojibwe" +msgstr "" + +msgid "Oromo" +msgstr "" + +msgid "Odia" +msgstr "" + +msgid "Ossetian" +msgstr "" + msgid "Panjabi" msgstr "Panjabi" +msgid "Pali" +msgstr "" + msgid "Polish" msgstr "Polish" +msgid "Pashto" +msgstr "" + msgid "Portuguese" msgstr "Portuguese" @@ -1340,27 +1648,161 @@ msgstr "Portuguese (Brazil)" msgid "Portuguese (Portugal)" msgstr "Portuguese (Portugal)" +msgid "Quechua" +msgstr "" + +msgid "Romansh" +msgstr "" + +msgid "Rundi" +msgstr "" + +#, fuzzy +msgid "Romanian" +msgstr "Albanian" + msgid "Russian" msgstr "Russian" +msgid "Kinyarwanda" +msgstr "" + +msgid "Sanskrit" +msgstr "" + +#, fuzzy +msgid "Sardinian" +msgstr "Ukrainian" + +msgid "Sindhi" +msgstr "" + +msgid "Sango" +msgstr "" + +msgid "Sinhala" +msgstr "" + +msgid "Slovak" +msgstr "" + +msgid "Slovenian" +msgstr "" + +msgid "Samoan" +msgstr "" + +msgid "Shona" +msgstr "" + +msgid "Somali" +msgstr "" + msgid "Albanian" msgstr "Albanian" +msgid "Serbian" +msgstr "" + +msgid "Swati" +msgstr "" + +msgid "Sundanese" +msgstr "" + msgid "Swedish" msgstr "Swedish" +msgid "Swahili" +msgstr "" + +msgid "Tamil" +msgstr "" + +msgid "Telugu" +msgstr "" + +msgid "Tajik" +msgstr "" + +msgid "Thai" +msgstr "" + +msgid "Tigrinya" +msgstr "" + +msgid "Turkmen" +msgstr "" + +msgid "Tagalog" +msgstr "" + +msgid "Tswana" +msgstr "" + +msgid "Tongan" +msgstr "" + msgid "Turkish" msgstr "Turkish" +msgid "Tsonga" +msgstr "" + +msgid "Tatar" +msgstr "" + +msgid "Twi" +msgstr "" + +msgid "Tahitian" +msgstr "" + +msgid "Uyghur" +msgstr "" + msgid "Ukrainian" msgstr "Ukrainian" +msgid "Urdu" +msgstr "" + +msgid "Uzbek" +msgstr "" + +msgid "Venda" +msgstr "" + msgid "Vietnamese" msgstr "Vietnamese" +msgid "Volapük" +msgstr "" + +msgid "Walloon" +msgstr "" + +msgid "Wolof" +msgstr "" + +msgid "Xhosa" +msgstr "" + +msgid "Yiddish" +msgstr "" + +msgid "Yoruba" +msgstr "" + +msgid "Zhuang" +msgstr "" + msgid "Chinese (Traditional)" msgstr "Chinese (Traditional)" +msgid "Zulu" +msgstr "" + msgid "(no translation)" msgstr "(no translation)" diff --git a/po/en_ca.po b/po/en_ca.po index 1020192f..3c7f9275 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: 2024-05-06 10:09+0200\n" +"POT-Creation-Date: 2024-07-08 15:19+0200\n" "PO-Revision-Date: 2024-05-06 09:48+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" @@ -1248,27 +1248,117 @@ msgstr "Couldn't create preferences \"%1$s\" in %2$s" msgid "The language can only be set during startup." msgstr "The language can only be set during startup." +msgid "Afar" +msgstr "" + +msgid "Abkhazian" +msgstr "" + +msgid "Avestan" +msgstr "" + msgid "Afrikaans" msgstr "Afrikaans" +msgid "Akan" +msgstr "" + +msgid "Amharic" +msgstr "" + +msgid "Aragonese" +msgstr "" + msgid "Arabic" msgstr "Arabic" +msgid "Assamese" +msgstr "" + +msgid "Avaric" +msgstr "" + +msgid "Aymara" +msgstr "" + msgid "Azerbaijani" msgstr "Azerbaijani" +msgid "Bashkir" +msgstr "" + msgid "Belarusian" msgstr "Belarusian" msgid "Bulgarian" msgstr "Bulgarian" +msgid "Bihari" +msgstr "" + +msgid "Bislama" +msgstr "" + +msgid "Bambara" +msgstr "" + +msgid "Bengali" +msgstr "" + +msgid "Tibetan" +msgstr "" + +msgid "Breton" +msgstr "" + +msgid "Bosnian" +msgstr "" + +#, fuzzy +msgid "Catalan" +msgstr "fatal" + +#, fuzzy +msgid "Chechen" +msgstr "Check" + +msgid "Chamorro" +msgstr "" + +msgid "Corsican" +msgstr "" + +msgid "Cree" +msgstr "" + +msgid "Czech" +msgstr "" + +msgid "Chuvash" +msgstr "" + +msgid "Welsh" +msgstr "" + +#, fuzzy +msgid "Danish" +msgstr "Spanish" + msgid "German" msgstr "German" msgid "German (Austria)" msgstr "German (Austria)" +msgid "Dhivehi" +msgstr "" + +msgid "Dzongkha" +msgstr "" + +msgid "Ewe" +msgstr "" + msgid "Greek" msgstr "Greek" @@ -1284,54 +1374,272 @@ msgstr "English (UK)" msgid "English (USA)" msgstr "English (USA)" +msgid "Esperanto" +msgstr "" + msgid "Spanish" msgstr "Spanish" +msgid "Estonian" +msgstr "" + msgid "Basque" msgstr "Basque" +#, fuzzy +msgid "Persian" +msgstr "Version" + +msgid "Fulah" +msgstr "" + msgid "Finnish" msgstr "Finnish" +msgid "Fijian" +msgstr "" + +msgid "Faroese" +msgstr "" + msgid "French" msgstr "French" +msgid "Frisian" +msgstr "" + +msgid "Irish" +msgstr "" + +msgid "Gaelic" +msgstr "" + +msgid "Galician" +msgstr "" + +msgid "Guarani" +msgstr "" + msgid "Gujarati" msgstr "Gujarati" +msgid "Manx" +msgstr "" + +msgid "Hausa" +msgstr "" + msgid "Hebrew" msgstr "Hebrew" msgid "Hindi" msgstr "Hindi" +msgid "Hiri Motu" +msgstr "" + +msgid "Croatian" +msgstr "" + +msgid "Haitian" +msgstr "" + msgid "Hungarian" msgstr "Hungarian" msgid "Armenian" msgstr "Armenian" -msgid "Italian" -msgstr "Italian" +msgid "Herero" +msgstr "" + +msgid "Interlingua" +msgstr "" msgid "Indonesian" msgstr "Indonesian" +msgid "Occidental" +msgstr "" + +msgid "Igbo" +msgstr "" + +msgid "Nuosu" +msgstr "" + +msgid "Inupiaq" +msgstr "" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "" + +msgid "Italian" +msgstr "Italian" + +msgid "Inuktitut" +msgstr "" + msgid "Japanese" msgstr "Japanese" +#, fuzzy +msgid "Javanese" +msgstr "Japanese" + +msgid "Georgian" +msgstr "" + +msgid "Kongo" +msgstr "" + +msgid "Gikuyu" +msgstr "" + +msgid "Kwanyama" +msgstr "" + +msgid "Kazakh" +msgstr "" + +msgid "Greenlandic" +msgstr "" + +msgid "Kannada" +msgstr "" + msgid "Korean" msgstr "Korean" +msgid "Kanuri" +msgstr "" + +msgid "Kashmiri" +msgstr "" + +msgid "Kurdish" +msgstr "" + +msgid "Komi" +msgstr "" + +msgid "Cornish" +msgstr "" + +msgid "Kyrgyz" +msgstr "" + +msgid "Latin" +msgstr "" + +msgid "Luxembourgish" +msgstr "" + +msgid "Luganda" +msgstr "" + +msgid "Limburgish" +msgstr "" + +msgid "Lingala" +msgstr "" + +#, fuzzy +msgid "Lao" +msgstr "Log" + +msgid "Lithuanian" +msgstr "" + +msgid "Luba-Katanga" +msgstr "" + +msgid "Latvian" +msgstr "" + +msgid "Malagasy" +msgstr "" + +msgid "Marshallese" +msgstr "" + +msgid "Maori" +msgstr "" + +msgid "Macedonian" +msgstr "" + +msgid "Malayalam" +msgstr "" + +msgid "Mongolian" +msgstr "" + +#, fuzzy +msgid "Marathi" +msgstr "Gujarati" + +msgid "Malay" +msgstr "" + +msgid "Maltese" +msgstr "" + +msgid "Burmese" +msgstr "" + +msgid "Nauru" +msgstr "" + +msgid "Nepali" +msgstr "" + +msgid "Ndonga" +msgstr "" + msgid "Dutch" msgstr "Dutch" +msgid "Norwegian Nynorsk" +msgstr "" + +msgid "Navaho" +msgstr "" + +#, fuzzy +msgid "Nyanja" +msgstr "Panjabi" + +msgid "Occitan" +msgstr "" + +msgid "Ojibwe" +msgstr "" + +msgid "Oromo" +msgstr "" + +msgid "Odia" +msgstr "" + +msgid "Ossetian" +msgstr "" + msgid "Panjabi" msgstr "Panjabi" +msgid "Pali" +msgstr "" + msgid "Polish" msgstr "Polish" +msgid "Pashto" +msgstr "" + msgid "Portuguese" msgstr "Portuguese" @@ -1341,27 +1649,161 @@ msgstr "Portuguese (Brazil)" msgid "Portuguese (Portugal)" msgstr "Portuguese (Portugal)" +msgid "Quechua" +msgstr "" + +msgid "Romansh" +msgstr "" + +msgid "Rundi" +msgstr "" + +#, fuzzy +msgid "Romanian" +msgstr "Albanian" + msgid "Russian" msgstr "Russian" +msgid "Kinyarwanda" +msgstr "" + +msgid "Sanskrit" +msgstr "" + +#, fuzzy +msgid "Sardinian" +msgstr "Ukrainian" + +msgid "Sindhi" +msgstr "" + +msgid "Sango" +msgstr "" + +msgid "Sinhala" +msgstr "" + +msgid "Slovak" +msgstr "" + +msgid "Slovenian" +msgstr "" + +msgid "Samoan" +msgstr "" + +msgid "Shona" +msgstr "" + +msgid "Somali" +msgstr "" + msgid "Albanian" msgstr "Albanian" +msgid "Serbian" +msgstr "" + +msgid "Swati" +msgstr "" + +msgid "Sundanese" +msgstr "" + msgid "Swedish" msgstr "Swedish" +msgid "Swahili" +msgstr "" + +msgid "Tamil" +msgstr "" + +msgid "Telugu" +msgstr "" + +msgid "Tajik" +msgstr "" + +msgid "Thai" +msgstr "" + +msgid "Tigrinya" +msgstr "" + +msgid "Turkmen" +msgstr "" + +msgid "Tagalog" +msgstr "" + +msgid "Tswana" +msgstr "" + +msgid "Tongan" +msgstr "" + msgid "Turkish" msgstr "Turkish" +msgid "Tsonga" +msgstr "" + +msgid "Tatar" +msgstr "" + +msgid "Twi" +msgstr "" + +msgid "Tahitian" +msgstr "" + +msgid "Uyghur" +msgstr "" + msgid "Ukrainian" msgstr "Ukrainian" +msgid "Urdu" +msgstr "" + +msgid "Uzbek" +msgstr "" + +msgid "Venda" +msgstr "" + msgid "Vietnamese" msgstr "Vietnamese" +msgid "Volapük" +msgstr "" + +msgid "Walloon" +msgstr "" + +msgid "Wolof" +msgstr "" + +msgid "Xhosa" +msgstr "" + +msgid "Yiddish" +msgstr "" + +msgid "Yoruba" +msgstr "" + +msgid "Zhuang" +msgstr "" + msgid "Chinese (Traditional)" msgstr "Chinese (Traditional)" +msgid "Zulu" +msgstr "" + msgid "(no translation)" msgstr "(no translation)" diff --git a/po/eo.po b/po/eo.po index b96479be..382d0c05 100644 --- a/po/eo.po +++ b/po/eo.po @@ -6,11 +6,11 @@ msgid "" msgstr "" "Project-Id-Version: Pure Data 0.54.1\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" -"POT-Creation-Date: 2024-05-06 10:09+0200\n" +"POT-Creation-Date: 2024-07-08 15:19+0200\n" "PO-Revision-Date: 2024-07-06 17:09+0000\n" "Last-Translator: phlostically \n" -"Language-Team: Esperanto \n" +"Language-Team: Esperanto \n" "Language: eo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -1226,27 +1226,117 @@ msgstr "" msgid "The language can only be set during startup." msgstr "" +msgid "Afar" +msgstr "" + +msgid "Abkhazian" +msgstr "" + +msgid "Avestan" +msgstr "" + msgid "Afrikaans" msgstr "Afrikanso" +msgid "Akan" +msgstr "" + +msgid "Amharic" +msgstr "" + +msgid "Aragonese" +msgstr "" + msgid "Arabic" msgstr "Araba" +msgid "Assamese" +msgstr "" + +msgid "Avaric" +msgstr "" + +msgid "Aymara" +msgstr "" + msgid "Azerbaijani" msgstr "Azerbajĝana" +msgid "Bashkir" +msgstr "" + msgid "Belarusian" msgstr "Belorusa" msgid "Bulgarian" msgstr "Bulgara" +msgid "Bihari" +msgstr "" + +msgid "Bislama" +msgstr "" + +msgid "Bambara" +msgstr "" + +msgid "Bengali" +msgstr "" + +msgid "Tibetan" +msgstr "" + +msgid "Breton" +msgstr "" + +msgid "Bosnian" +msgstr "" + +#, fuzzy +msgid "Catalan" +msgstr "fatala" + +#, fuzzy +msgid "Chechen" +msgstr "Kontroli" + +msgid "Chamorro" +msgstr "" + +msgid "Corsican" +msgstr "" + +msgid "Cree" +msgstr "" + +msgid "Czech" +msgstr "" + +msgid "Chuvash" +msgstr "" + +msgid "Welsh" +msgstr "" + +#, fuzzy +msgid "Danish" +msgstr "Hispana" + msgid "German" msgstr "Germana" msgid "German (Austria)" msgstr "Germana (aŭstra)" +msgid "Dhivehi" +msgstr "" + +msgid "Dzongkha" +msgstr "" + +msgid "Ewe" +msgstr "" + msgid "Greek" msgstr "Greka" @@ -1262,54 +1352,272 @@ msgstr "Angla (brita)" msgid "English (USA)" msgstr "Angla (Usona)" +msgid "Esperanto" +msgstr "" + msgid "Spanish" msgstr "Hispana" +msgid "Estonian" +msgstr "" + msgid "Basque" msgstr "Eŭska" +#, fuzzy +msgid "Persian" +msgstr "Versio" + +msgid "Fulah" +msgstr "" + msgid "Finnish" msgstr "Finna" +msgid "Fijian" +msgstr "" + +msgid "Faroese" +msgstr "" + msgid "French" msgstr "Franca" +msgid "Frisian" +msgstr "" + +msgid "Irish" +msgstr "" + +msgid "Gaelic" +msgstr "" + +msgid "Galician" +msgstr "" + +msgid "Guarani" +msgstr "" + msgid "Gujarati" msgstr "Guĝarata" +msgid "Manx" +msgstr "" + +msgid "Hausa" +msgstr "" + msgid "Hebrew" msgstr "Hebrea" msgid "Hindi" msgstr "Hindia" +msgid "Hiri Motu" +msgstr "" + +msgid "Croatian" +msgstr "" + +msgid "Haitian" +msgstr "" + msgid "Hungarian" msgstr "Hungara" msgid "Armenian" msgstr "Armena" -msgid "Italian" -msgstr "Itala" +msgid "Herero" +msgstr "" + +msgid "Interlingua" +msgstr "" msgid "Indonesian" msgstr "Indonezia" +msgid "Occidental" +msgstr "" + +msgid "Igbo" +msgstr "" + +msgid "Nuosu" +msgstr "" + +msgid "Inupiaq" +msgstr "" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "" + +msgid "Italian" +msgstr "Itala" + +msgid "Inuktitut" +msgstr "" + msgid "Japanese" msgstr "Japana" +#, fuzzy +msgid "Javanese" +msgstr "Japana" + +msgid "Georgian" +msgstr "" + +msgid "Kongo" +msgstr "" + +msgid "Gikuyu" +msgstr "" + +msgid "Kwanyama" +msgstr "" + +msgid "Kazakh" +msgstr "" + +msgid "Greenlandic" +msgstr "" + +msgid "Kannada" +msgstr "" + msgid "Korean" msgstr "Korea" +msgid "Kanuri" +msgstr "" + +msgid "Kashmiri" +msgstr "" + +msgid "Kurdish" +msgstr "" + +msgid "Komi" +msgstr "" + +msgid "Cornish" +msgstr "" + +msgid "Kyrgyz" +msgstr "" + +msgid "Latin" +msgstr "" + +msgid "Luxembourgish" +msgstr "" + +msgid "Luganda" +msgstr "" + +msgid "Limburgish" +msgstr "" + +msgid "Lingala" +msgstr "" + +#, fuzzy +msgid "Lao" +msgstr "Protokolo" + +msgid "Lithuanian" +msgstr "" + +msgid "Luba-Katanga" +msgstr "" + +msgid "Latvian" +msgstr "" + +msgid "Malagasy" +msgstr "" + +msgid "Marshallese" +msgstr "" + +msgid "Maori" +msgstr "" + +msgid "Macedonian" +msgstr "" + +msgid "Malayalam" +msgstr "" + +msgid "Mongolian" +msgstr "" + +#, fuzzy +msgid "Marathi" +msgstr "Guĝarata" + +msgid "Malay" +msgstr "" + +msgid "Maltese" +msgstr "" + +msgid "Burmese" +msgstr "" + +msgid "Nauru" +msgstr "" + +msgid "Nepali" +msgstr "" + +msgid "Ndonga" +msgstr "" + msgid "Dutch" msgstr "Nederlanda" +msgid "Norwegian Nynorsk" +msgstr "" + +msgid "Navaho" +msgstr "" + +#, fuzzy +msgid "Nyanja" +msgstr "Panĝaba" + +msgid "Occitan" +msgstr "" + +msgid "Ojibwe" +msgstr "" + +msgid "Oromo" +msgstr "" + +msgid "Odia" +msgstr "" + +msgid "Ossetian" +msgstr "" + msgid "Panjabi" msgstr "Panĝaba" +msgid "Pali" +msgstr "" + msgid "Polish" msgstr "Pola" +msgid "Pashto" +msgstr "" + msgid "Portuguese" msgstr "Portugala" @@ -1319,27 +1627,161 @@ msgstr "Portugala (Brazila)" msgid "Portuguese (Portugal)" msgstr "Portugala (Portugalia)" +msgid "Quechua" +msgstr "" + +msgid "Romansh" +msgstr "" + +msgid "Rundi" +msgstr "" + +#, fuzzy +msgid "Romanian" +msgstr "Albana" + msgid "Russian" msgstr "Rusa" +msgid "Kinyarwanda" +msgstr "" + +msgid "Sanskrit" +msgstr "" + +#, fuzzy +msgid "Sardinian" +msgstr "Ukraina" + +msgid "Sindhi" +msgstr "" + +msgid "Sango" +msgstr "" + +msgid "Sinhala" +msgstr "" + +msgid "Slovak" +msgstr "" + +msgid "Slovenian" +msgstr "" + +msgid "Samoan" +msgstr "" + +msgid "Shona" +msgstr "" + +msgid "Somali" +msgstr "" + msgid "Albanian" msgstr "Albana" +msgid "Serbian" +msgstr "" + +msgid "Swati" +msgstr "" + +msgid "Sundanese" +msgstr "" + msgid "Swedish" msgstr "Sveda" +msgid "Swahili" +msgstr "" + +msgid "Tamil" +msgstr "" + +msgid "Telugu" +msgstr "" + +msgid "Tajik" +msgstr "" + +msgid "Thai" +msgstr "" + +msgid "Tigrinya" +msgstr "" + +msgid "Turkmen" +msgstr "" + +msgid "Tagalog" +msgstr "" + +msgid "Tswana" +msgstr "" + +msgid "Tongan" +msgstr "" + msgid "Turkish" msgstr "Turka" +msgid "Tsonga" +msgstr "" + +msgid "Tatar" +msgstr "" + +msgid "Twi" +msgstr "" + +msgid "Tahitian" +msgstr "" + +msgid "Uyghur" +msgstr "" + msgid "Ukrainian" msgstr "Ukraina" +msgid "Urdu" +msgstr "" + +msgid "Uzbek" +msgstr "" + +msgid "Venda" +msgstr "" + msgid "Vietnamese" msgstr "Vjetnama" +msgid "Volapük" +msgstr "" + +msgid "Walloon" +msgstr "" + +msgid "Wolof" +msgstr "" + +msgid "Xhosa" +msgstr "" + +msgid "Yiddish" +msgstr "" + +msgid "Yoruba" +msgstr "" + +msgid "Zhuang" +msgstr "" + msgid "Chinese (Traditional)" msgstr "Ĉina (tradicia)" +msgid "Zulu" +msgstr "" + msgid "(no translation)" msgstr "(sen traduko)" diff --git a/po/es.po b/po/es.po index dde261ff..dacbb38b 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: 2024-05-06 10:09+0200\n" +"POT-Creation-Date: 2024-07-08 15:19+0200\n" "PO-Revision-Date: 2024-05-07 19:07+0000\n" "Last-Translator: Lucas Cordiviola \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" @@ -1265,27 +1265,117 @@ msgstr "No se pudo crear el archivo de preferencias '%1$s' en %2$s" msgid "The language can only be set during startup." msgstr "El idioma sólo se puede establecer durante el inicio." +msgid "Afar" +msgstr "" + +msgid "Abkhazian" +msgstr "" + +msgid "Avestan" +msgstr "" + msgid "Afrikaans" msgstr "Afrikaans" +msgid "Akan" +msgstr "" + +msgid "Amharic" +msgstr "" + +msgid "Aragonese" +msgstr "" + msgid "Arabic" msgstr "Árabe" +msgid "Assamese" +msgstr "" + +msgid "Avaric" +msgstr "" + +msgid "Aymara" +msgstr "" + msgid "Azerbaijani" msgstr "Azerbaiyano" +msgid "Bashkir" +msgstr "" + msgid "Belarusian" msgstr "Bielorruso" msgid "Bulgarian" msgstr "Búlgaro" +msgid "Bihari" +msgstr "" + +msgid "Bislama" +msgstr "" + +msgid "Bambara" +msgstr "" + +msgid "Bengali" +msgstr "" + +msgid "Tibetan" +msgstr "" + +msgid "Breton" +msgstr "" + +msgid "Bosnian" +msgstr "" + +#, fuzzy +msgid "Catalan" +msgstr "fatal" + +#, fuzzy +msgid "Chechen" +msgstr "Probar" + +msgid "Chamorro" +msgstr "" + +msgid "Corsican" +msgstr "" + +msgid "Cree" +msgstr "" + +msgid "Czech" +msgstr "" + +msgid "Chuvash" +msgstr "" + +msgid "Welsh" +msgstr "" + +#, fuzzy +msgid "Danish" +msgstr "Español" + msgid "German" msgstr "Alemán" msgid "German (Austria)" msgstr "Alemán (Austria)" +msgid "Dhivehi" +msgstr "" + +msgid "Dzongkha" +msgstr "" + +msgid "Ewe" +msgstr "" + msgid "Greek" msgstr "Griego" @@ -1301,54 +1391,272 @@ msgstr "Inglés (UK)" msgid "English (USA)" msgstr "Inglés (USA)" +msgid "Esperanto" +msgstr "" + msgid "Spanish" msgstr "Español" +msgid "Estonian" +msgstr "" + msgid "Basque" msgstr "Vasco" +#, fuzzy +msgid "Persian" +msgstr "Versión" + +msgid "Fulah" +msgstr "" + msgid "Finnish" msgstr "Finlandés" +msgid "Fijian" +msgstr "" + +msgid "Faroese" +msgstr "" + msgid "French" msgstr "Francés" +msgid "Frisian" +msgstr "" + +msgid "Irish" +msgstr "" + +msgid "Gaelic" +msgstr "" + +msgid "Galician" +msgstr "" + +msgid "Guarani" +msgstr "" + msgid "Gujarati" msgstr "Gujarati" +msgid "Manx" +msgstr "" + +msgid "Hausa" +msgstr "" + msgid "Hebrew" msgstr "Hebreo" msgid "Hindi" msgstr "Hindi" +msgid "Hiri Motu" +msgstr "" + +msgid "Croatian" +msgstr "" + +msgid "Haitian" +msgstr "" + msgid "Hungarian" msgstr "Húngaro" msgid "Armenian" msgstr "Armenio" -msgid "Italian" -msgstr "Italiano" +msgid "Herero" +msgstr "" + +msgid "Interlingua" +msgstr "" msgid "Indonesian" msgstr "Indonesio" +msgid "Occidental" +msgstr "" + +msgid "Igbo" +msgstr "" + +msgid "Nuosu" +msgstr "" + +msgid "Inupiaq" +msgstr "" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "" + +msgid "Italian" +msgstr "Italiano" + +msgid "Inuktitut" +msgstr "" + msgid "Japanese" msgstr "Japonés" +#, fuzzy +msgid "Javanese" +msgstr "Japonés" + +msgid "Georgian" +msgstr "" + +msgid "Kongo" +msgstr "" + +msgid "Gikuyu" +msgstr "" + +msgid "Kwanyama" +msgstr "" + +msgid "Kazakh" +msgstr "" + +msgid "Greenlandic" +msgstr "" + +msgid "Kannada" +msgstr "" + msgid "Korean" msgstr "Coreano" +msgid "Kanuri" +msgstr "" + +msgid "Kashmiri" +msgstr "" + +msgid "Kurdish" +msgstr "" + +msgid "Komi" +msgstr "" + +msgid "Cornish" +msgstr "" + +msgid "Kyrgyz" +msgstr "" + +msgid "Latin" +msgstr "" + +msgid "Luxembourgish" +msgstr "" + +msgid "Luganda" +msgstr "" + +msgid "Limburgish" +msgstr "" + +msgid "Lingala" +msgstr "" + +#, fuzzy +msgid "Lao" +msgstr "Log" + +msgid "Lithuanian" +msgstr "" + +msgid "Luba-Katanga" +msgstr "" + +msgid "Latvian" +msgstr "" + +msgid "Malagasy" +msgstr "" + +msgid "Marshallese" +msgstr "" + +msgid "Maori" +msgstr "" + +msgid "Macedonian" +msgstr "" + +msgid "Malayalam" +msgstr "" + +msgid "Mongolian" +msgstr "" + +#, fuzzy +msgid "Marathi" +msgstr "Gujarati" + +msgid "Malay" +msgstr "" + +msgid "Maltese" +msgstr "" + +msgid "Burmese" +msgstr "" + +msgid "Nauru" +msgstr "" + +msgid "Nepali" +msgstr "" + +msgid "Ndonga" +msgstr "" + msgid "Dutch" msgstr "Dutch" +msgid "Norwegian Nynorsk" +msgstr "" + +msgid "Navaho" +msgstr "" + +#, fuzzy +msgid "Nyanja" +msgstr "Panyabí" + +msgid "Occitan" +msgstr "" + +msgid "Ojibwe" +msgstr "" + +msgid "Oromo" +msgstr "" + +msgid "Odia" +msgstr "" + +msgid "Ossetian" +msgstr "" + msgid "Panjabi" msgstr "Panyabí" +msgid "Pali" +msgstr "" + msgid "Polish" msgstr "Polaco" +msgid "Pashto" +msgstr "" + msgid "Portuguese" msgstr "Portugués" @@ -1358,27 +1666,161 @@ msgstr "Portugués (Brasil)" msgid "Portuguese (Portugal)" msgstr "Portugués (Portugal)" +msgid "Quechua" +msgstr "" + +msgid "Romansh" +msgstr "" + +msgid "Rundi" +msgstr "" + +#, fuzzy +msgid "Romanian" +msgstr "Albanés" + msgid "Russian" msgstr "Ruso" +msgid "Kinyarwanda" +msgstr "" + +msgid "Sanskrit" +msgstr "" + +#, fuzzy +msgid "Sardinian" +msgstr "Ucraniano" + +msgid "Sindhi" +msgstr "" + +msgid "Sango" +msgstr "" + +msgid "Sinhala" +msgstr "" + +msgid "Slovak" +msgstr "" + +msgid "Slovenian" +msgstr "" + +msgid "Samoan" +msgstr "" + +msgid "Shona" +msgstr "" + +msgid "Somali" +msgstr "" + msgid "Albanian" msgstr "Albanés" +msgid "Serbian" +msgstr "" + +msgid "Swati" +msgstr "" + +msgid "Sundanese" +msgstr "" + msgid "Swedish" msgstr "Sueco" +msgid "Swahili" +msgstr "" + +msgid "Tamil" +msgstr "" + +msgid "Telugu" +msgstr "" + +msgid "Tajik" +msgstr "" + +msgid "Thai" +msgstr "" + +msgid "Tigrinya" +msgstr "" + +msgid "Turkmen" +msgstr "" + +msgid "Tagalog" +msgstr "" + +msgid "Tswana" +msgstr "" + +msgid "Tongan" +msgstr "" + msgid "Turkish" msgstr "Turco" +msgid "Tsonga" +msgstr "" + +msgid "Tatar" +msgstr "" + +msgid "Twi" +msgstr "" + +msgid "Tahitian" +msgstr "" + +msgid "Uyghur" +msgstr "" + msgid "Ukrainian" msgstr "Ucraniano" +msgid "Urdu" +msgstr "" + +msgid "Uzbek" +msgstr "" + +msgid "Venda" +msgstr "" + msgid "Vietnamese" msgstr "Vietnamita" +msgid "Volapük" +msgstr "" + +msgid "Walloon" +msgstr "" + +msgid "Wolof" +msgstr "" + +msgid "Xhosa" +msgstr "" + +msgid "Yiddish" +msgstr "" + +msgid "Yoruba" +msgstr "" + +msgid "Zhuang" +msgstr "" + msgid "Chinese (Traditional)" msgstr "Chino (tradicional)" +msgid "Zulu" +msgstr "" + msgid "(no translation)" msgstr "(sin traducciones)" diff --git a/po/eu.po b/po/eu.po index 7efefdb9..e355eb5a 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: 2024-05-06 10:09+0200\n" +"POT-Creation-Date: 2024-07-08 15:19+0200\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" @@ -1278,27 +1278,117 @@ msgstr "Impossible de créer des préférences \"%1$s\" dans %2$s" msgid "The language can only be set during startup." msgstr "Le changement de langue prendra effet au prochain démarrage." +msgid "Afar" +msgstr "" + +msgid "Abkhazian" +msgstr "" + +msgid "Avestan" +msgstr "" + msgid "Afrikaans" msgstr "Afrikaans" +msgid "Akan" +msgstr "" + +msgid "Amharic" +msgstr "" + +msgid "Aragonese" +msgstr "" + msgid "Arabic" msgstr "Arabe" +msgid "Assamese" +msgstr "" + +msgid "Avaric" +msgstr "" + +msgid "Aymara" +msgstr "" + msgid "Azerbaijani" msgstr "Azéri" +msgid "Bashkir" +msgstr "" + msgid "Belarusian" msgstr "Biélorusse" msgid "Bulgarian" msgstr "Bulgare" +msgid "Bihari" +msgstr "" + +msgid "Bislama" +msgstr "" + +msgid "Bambara" +msgstr "" + +msgid "Bengali" +msgstr "" + +msgid "Tibetan" +msgstr "" + +msgid "Breton" +msgstr "" + +msgid "Bosnian" +msgstr "" + +#, fuzzy +msgid "Catalan" +msgstr "fatal" + +#, fuzzy +msgid "Chechen" +msgstr "Vérifier" + +msgid "Chamorro" +msgstr "" + +msgid "Corsican" +msgstr "" + +msgid "Cree" +msgstr "" + +msgid "Czech" +msgstr "" + +msgid "Chuvash" +msgstr "" + +msgid "Welsh" +msgstr "" + +#, fuzzy +msgid "Danish" +msgstr "Espagnol" + msgid "German" msgstr "Allemand" msgid "German (Austria)" msgstr "Allemand (Autriche)" +msgid "Dhivehi" +msgstr "" + +msgid "Dzongkha" +msgstr "" + +msgid "Ewe" +msgstr "" + msgid "Greek" msgstr "Grec" @@ -1314,54 +1404,272 @@ msgstr "Anglais (Royaume-Uni)" msgid "English (USA)" msgstr "Anglais (USA)" +msgid "Esperanto" +msgstr "" + msgid "Spanish" msgstr "Espagnol" +msgid "Estonian" +msgstr "" + msgid "Basque" msgstr "Basque" +#, fuzzy +msgid "Persian" +msgstr "Version" + +msgid "Fulah" +msgstr "" + msgid "Finnish" msgstr "Finnois" +msgid "Fijian" +msgstr "" + +msgid "Faroese" +msgstr "" + msgid "French" msgstr "Français" +msgid "Frisian" +msgstr "" + +msgid "Irish" +msgstr "" + +msgid "Gaelic" +msgstr "" + +msgid "Galician" +msgstr "" + +msgid "Guarani" +msgstr "" + msgid "Gujarati" msgstr "Gujarati" +msgid "Manx" +msgstr "" + +msgid "Hausa" +msgstr "" + msgid "Hebrew" msgstr "Hébreu" msgid "Hindi" msgstr "Hindi" +msgid "Hiri Motu" +msgstr "" + +msgid "Croatian" +msgstr "" + +msgid "Haitian" +msgstr "" + msgid "Hungarian" msgstr "Hongrois" msgid "Armenian" msgstr "Arménien" -msgid "Italian" -msgstr "Italien" +msgid "Herero" +msgstr "" + +msgid "Interlingua" +msgstr "" msgid "Indonesian" msgstr "Indonésien" +msgid "Occidental" +msgstr "" + +msgid "Igbo" +msgstr "" + +msgid "Nuosu" +msgstr "" + +msgid "Inupiaq" +msgstr "" + +msgid "Ido" +msgstr "" + +msgid "Icelandic" +msgstr "" + +msgid "Italian" +msgstr "Italien" + +msgid "Inuktitut" +msgstr "" + msgid "Japanese" msgstr "Japonais" +#, fuzzy +msgid "Javanese" +msgstr "Japonais" + +msgid "Georgian" +msgstr "" + +msgid "Kongo" +msgstr "" + +msgid "Gikuyu" +msgstr "" + +msgid "Kwanyama" +msgstr "" + +msgid "Kazakh" +msgstr "" + +msgid "Greenlandic" +msgstr "" + +msgid "Kannada" +msgstr "" + msgid "Korean" msgstr "Coréen" +msgid "Kanuri" +msgstr "" + +msgid "Kashmiri" +msgstr "" + +msgid "Kurdish" +msgstr "" + +msgid "Komi" +msgstr "" + +msgid "Cornish" +msgstr "" + +msgid "Kyrgyz" +msgstr "" + +msgid "Latin" +msgstr "" + +msgid "Luxembourgish" +msgstr "" + +msgid "Luganda" +msgstr "" + +msgid "Limburgish" +msgstr "" + +msgid "Lingala" +msgstr "" + +#, fuzzy +msgid "Lao" +msgstr "Journal" + +msgid "Lithuanian" +msgstr "" + +msgid "Luba-Katanga" +msgstr "" + +msgid "Latvian" +msgstr "" + +msgid "Malagasy" +msgstr "" + +msgid "Marshallese" +msgstr "" + +msgid "Maori" +msgstr "" + +msgid "Macedonian" +msgstr "" + +msgid "Malayalam" +msgstr "" + +msgid "Mongolian" +msgstr "" + +#, fuzzy +msgid "Marathi" +msgstr "Gujarati" + +msgid "Malay" +msgstr "" + +msgid "Maltese" +msgstr "" + +msgid "Burmese" +msgstr "" + +msgid "Nauru" +msgstr "" + +msgid "Nepali" +msgstr "" + +msgid "Ndonga" +msgstr "" + msgid "Dutch" msgstr "Néerlandais" +msgid "Norwegian Nynorsk" +msgstr "" + +msgid "Navaho" +msgstr "" + +#, fuzzy +msgid "Nyanja" +msgstr "Pendjabi" + +msgid "Occitan" +msgstr "" + +msgid "Ojibwe" +msgstr "" + +msgid "Oromo" +msgstr "" + +msgid "Odia" +msgstr "" + +msgid "Ossetian" +msgstr "" + msgid "Panjabi" msgstr "Pendjabi" +msgid "Pali" +msgstr "" + msgid "Polish" msgstr "Polonais" +msgid "Pashto" +msgstr "" + msgid "Portuguese" msgstr "Portugais" @@ -1371,27 +1679,161 @@ msgstr "Portugais (Brésil)" msgid "Portuguese (Portugal)" msgstr "Portugais (Portugal)" +msgid "Quechua" +msgstr "" + +msgid "Romansh" +msgstr "" + +msgid "Rundi" +msgstr "" + +#, fuzzy +msgid "Romanian" +msgstr "Albanais" + msgid "Russian" msgstr "Russe" +msgid "Kinyarwanda" +msgstr "" + +msgid "Sanskrit" +msgstr "" + +#, fuzzy +msgid "Sardinian" +msgstr "Ukrainien" + +msgid "Sindhi" +msgstr "" + +msgid "Sango" +msgstr "" + +msgid "Sinhala" +msgstr "" + +msgid "Slovak" +msgstr "" + +msgid "Slovenian" +msgstr "" + +msgid "Samoan" +msgstr "" + +msgid "Shona" +msgstr "" + +msgid "Somali" +msgstr "" + msgid "Albanian" msgstr "Albanais" +msgid "Serbian" +msgstr "" + +msgid "Swati" +msgstr "" + +msgid "Sundanese" +msgstr "" + msgid "Swedish" msgstr "Suédois" +msgid "Swahili" +msgstr "" + +msgid "Tamil" +msgstr "" + +msgid "Telugu" +msgstr "" + +msgid "Tajik" +msgstr "" + +msgid "Thai" +msgstr "" + +msgid "Tigrinya" +msgstr "" + +msgid "Turkmen" +msgstr "" + +msgid "Tagalog" +msgstr "" + +msgid "Tswana" +msgstr "" + +msgid "Tongan" +msgstr "" + msgid "Turkish" msgstr "Turc" +msgid "Tsonga" +msgstr "" + +msgid "Tatar" +msgstr "" + +msgid "Twi" +msgstr "" + +msgid "Tahitian" +msgstr "" + +msgid "Uyghur" +msgstr "" + msgid "Ukrainian" msgstr "Ukrainien" +msgid "Urdu" +msgstr "" + +msgid "Uzbek" +msgstr "" + +msgid "Venda" +msgstr "" + msgid "Vietnamese" msgstr "Vietnamien" +msgid "Volapük" +msgstr "" + +msgid "Walloon" +msgstr "" + +msgid "Wolof" +msgstr "" + +msgid "Xhosa" +msgstr "" + +msgid "Yiddish" +msgstr "" + +msgid "Yoruba" +msgstr "" + +msgid "Zhuang" +msgstr "" + msgid "Chinese (Traditional)" msgstr "Chinois (traditionnel)" +msgid "Zulu" +msgstr "" + msgid "(no translation)" msgstr "(pas de traduction)" diff --git a/po/gu.po b/po/gu.po index 41734008..9523b9d2 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: 2024-05-06 10:09+0200\n" +"POT-Creation-Date: 2024-07-08 15:19+0200\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: 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: Ukrainian \n" "Language-Team: Vietnamese \n" "Language-Team: Chinese (Traditional) Date: Mon, 8 Jul 2024 17:42:58 +0200 Subject: [PATCH 36/89] translations of language names --- po/bg.po | 356 ++++++++++++++++++++++++------------------------ po/de.po | 302 ++++++++++++++++++++--------------------- po/el.po | 356 ++++++++++++++++++++++++------------------------ po/en.po | 302 ++++++++++++++++++++--------------------- po/en_ca.po | 304 ++++++++++++++++++++--------------------- po/es.po | 312 +++++++++++++++++++++--------------------- po/fr.po | 304 ++++++++++++++++++++--------------------- po/he.po | 310 +++++++++++++++++++++--------------------- po/hu.po | 356 ++++++++++++++++++++++++------------------------ po/id.po | 356 ++++++++++++++++++++++++------------------------ po/it.po | 308 +++++++++++++++++++++--------------------- po/ja.po | 379 ++++++++++++++++++++++++++-------------------------- po/nl.po | 364 +++++++++++++++++++++++++------------------------ po/pl.po | 360 ++++++++++++++++++++++++------------------------- po/pt_br.po | 314 +++++++++++++++++++++---------------------- po/pt_pt.po | 318 +++++++++++++++++++++---------------------- po/ru.po | 364 +++++++++++++++++++++++++------------------------ po/sq.po | 359 ++++++++++++++++++++++++------------------------- po/sv.po | 356 ++++++++++++++++++++++++------------------------ po/uk.po | 364 +++++++++++++++++++++++++------------------------ 20 files changed, 3320 insertions(+), 3424 deletions(-) diff --git a/po/bg.po b/po/bg.po index 5b40aecd..84a311eb 100644 --- a/po/bg.po +++ b/po/bg.po @@ -1277,121 +1277,121 @@ msgid "The language can only be set during startup." msgstr "" msgid "Afar" -msgstr "" +msgstr "Афарски" msgid "Abkhazian" -msgstr "" +msgstr "Абхазки" msgid "Avestan" -msgstr "" +msgstr "Авестийски" msgid "Afrikaans" -msgstr "" +msgstr "Африканс" msgid "Akan" -msgstr "" +msgstr "Акан" msgid "Amharic" -msgstr "" +msgstr "Амхарски" msgid "Aragonese" -msgstr "" +msgstr "Арагонски" msgid "Arabic" -msgstr "" +msgstr "Арабски" msgid "Assamese" -msgstr "" +msgstr "Асамски" msgid "Avaric" -msgstr "" +msgstr "Аварски" msgid "Aymara" -msgstr "" +msgstr "Аймараски" msgid "Azerbaijani" -msgstr "" +msgstr "Азербайджански" msgid "Bashkir" -msgstr "" +msgstr "Башкирски" msgid "Belarusian" -msgstr "" +msgstr "Беларуски" msgid "Bulgarian" -msgstr "" +msgstr "Български" msgid "Bihari" -msgstr "" +msgstr "Бихарски" msgid "Bislama" -msgstr "" +msgstr "Бислама" msgid "Bambara" -msgstr "" +msgstr "Бамбара" msgid "Bengali" -msgstr "" +msgstr "Бенгалски" msgid "Tibetan" -msgstr "" +msgstr "Тибетски" msgid "Breton" -msgstr "" +msgstr "Бретонски" msgid "Bosnian" -msgstr "" +msgstr "Босненски" msgid "Catalan" -msgstr "" +msgstr "Каталонски" msgid "Chechen" -msgstr "" +msgstr "Чеченски" msgid "Chamorro" -msgstr "" +msgstr "Чаморо" msgid "Corsican" -msgstr "" +msgstr "Корсикански" msgid "Cree" -msgstr "" +msgstr "Кри" msgid "Czech" -msgstr "" +msgstr "Чешки" msgid "Chuvash" -msgstr "" +msgstr "Чувашки" msgid "Welsh" -msgstr "" +msgstr "Уелски" msgid "Danish" -msgstr "" +msgstr "Датски" msgid "German" -msgstr "" +msgstr "Немски" msgid "German (Austria)" -msgstr "" +msgstr "Немски (Австрия)" msgid "Dhivehi" -msgstr "" +msgstr "Дивехи" msgid "Dzongkha" -msgstr "" +msgstr "Дзонгкха" msgid "Ewe" -msgstr "" +msgstr "Еве" msgid "Greek" -msgstr "" +msgstr "Гръцки" msgid "English" -msgstr "" +msgstr "Английски" msgid "English (Canada)" -msgstr "" +msgstr "Английски (Канада)" msgid "English (UK)" msgstr "" @@ -1400,427 +1400,427 @@ msgid "English (USA)" msgstr "" msgid "Esperanto" -msgstr "" +msgstr "Есперанто" msgid "Spanish" -msgstr "" +msgstr "Испански" msgid "Estonian" -msgstr "" +msgstr "Естонски" msgid "Basque" -msgstr "" +msgstr "Баски" msgid "Persian" -msgstr "" +msgstr "Персийски" msgid "Fulah" -msgstr "" +msgstr "Фула" msgid "Finnish" -msgstr "" +msgstr "Фински" msgid "Fijian" -msgstr "" +msgstr "Фиджийски" msgid "Faroese" -msgstr "" +msgstr "Фарьорски" msgid "French" -msgstr "" +msgstr "Френски" msgid "Frisian" -msgstr "" +msgstr "Фризийски" msgid "Irish" -msgstr "" +msgstr "Ирландски" msgid "Gaelic" -msgstr "" +msgstr "Келтски" msgid "Galician" -msgstr "" +msgstr "Галисийски" msgid "Guarani" -msgstr "" +msgstr "Гуарански" msgid "Gujarati" -msgstr "" +msgstr "Гуджаратски" msgid "Manx" -msgstr "" +msgstr "Мански" msgid "Hausa" -msgstr "" +msgstr "Хауса" msgid "Hebrew" -msgstr "" +msgstr "Иврит" msgid "Hindi" -msgstr "" +msgstr "Хинди" msgid "Hiri Motu" -msgstr "" +msgstr "Хири моту" msgid "Croatian" -msgstr "" +msgstr "Хърватски" msgid "Haitian" -msgstr "" +msgstr "Хаитянски креолски" msgid "Hungarian" -msgstr "" +msgstr "Унгарски" msgid "Armenian" -msgstr "" +msgstr "Арменски" msgid "Herero" -msgstr "" +msgstr "Хереро" msgid "Interlingua" -msgstr "" +msgstr "Интерлингва" msgid "Indonesian" -msgstr "" +msgstr "Индонезийски" msgid "Occidental" -msgstr "" +msgstr "Окцидентал" msgid "Igbo" -msgstr "" +msgstr "Игбо" msgid "Nuosu" -msgstr "" +msgstr "Носу" msgid "Inupiaq" -msgstr "" +msgstr "Инупиак" msgid "Ido" -msgstr "" +msgstr "Идо" msgid "Icelandic" -msgstr "" +msgstr "Исландски" msgid "Italian" -msgstr "" +msgstr "Италиански" msgid "Inuktitut" -msgstr "" +msgstr "Инуктитут" msgid "Japanese" -msgstr "" +msgstr "Японски" msgid "Javanese" -msgstr "" +msgstr "Явански" msgid "Georgian" -msgstr "" +msgstr "Грузински" msgid "Kongo" -msgstr "" +msgstr "Конго" msgid "Gikuyu" -msgstr "" +msgstr "Кикую" msgid "Kwanyama" -msgstr "" +msgstr "Кваняма" msgid "Kazakh" -msgstr "" +msgstr "Казахски" msgid "Greenlandic" -msgstr "" +msgstr "Гренландски" msgid "Kannada" -msgstr "" +msgstr "Каннада" msgid "Korean" -msgstr "" +msgstr "Корейски" msgid "Kanuri" -msgstr "" +msgstr "Канури" msgid "Kashmiri" -msgstr "" +msgstr "Кашмирски" msgid "Kurdish" -msgstr "" +msgstr "Кюрдски" msgid "Komi" -msgstr "" +msgstr "Коми" msgid "Cornish" -msgstr "" +msgstr "Корнуолски" msgid "Kyrgyz" -msgstr "" +msgstr "Киргизки" msgid "Latin" -msgstr "" +msgstr "Латински" msgid "Luxembourgish" -msgstr "" +msgstr "Люксембургски" msgid "Luganda" -msgstr "" +msgstr "Луганда" msgid "Limburgish" -msgstr "" +msgstr "Лимбургски" msgid "Lingala" -msgstr "" +msgstr "Лингала" msgid "Lao" -msgstr "" +msgstr "Лаоски" msgid "Lithuanian" -msgstr "" +msgstr "Литовски" msgid "Luba-Katanga" -msgstr "" +msgstr "Луба-катанга" msgid "Latvian" -msgstr "" +msgstr "Латвийски" msgid "Malagasy" -msgstr "" +msgstr "Малгашки" msgid "Marshallese" -msgstr "" +msgstr "Маршалски" msgid "Maori" -msgstr "" +msgstr "Маорски" msgid "Macedonian" -msgstr "" +msgstr "Македонска лит. норма" msgid "Malayalam" -msgstr "" +msgstr "Малаялам" msgid "Mongolian" -msgstr "" +msgstr "Монголски" msgid "Marathi" -msgstr "" +msgstr "Маратхи" msgid "Malay" -msgstr "" +msgstr "Малайски" msgid "Maltese" -msgstr "" +msgstr "Малтийски" msgid "Burmese" -msgstr "" +msgstr "Бирмански" msgid "Nauru" -msgstr "" +msgstr "Науруански" msgid "Nepali" -msgstr "" +msgstr "Непалски" msgid "Ndonga" -msgstr "" +msgstr "Ндонга" msgid "Dutch" -msgstr "" +msgstr "Нидерландски" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "Норвежки нюношк" msgid "Navaho" -msgstr "" +msgstr "Навахо" msgid "Nyanja" -msgstr "" +msgstr "Нянджа" msgid "Occitan" -msgstr "" +msgstr "Окситански" msgid "Ojibwe" -msgstr "" +msgstr "Оджибве" msgid "Oromo" -msgstr "" +msgstr "Оромо" msgid "Odia" -msgstr "" +msgstr "Одия" msgid "Ossetian" -msgstr "" +msgstr "Осетински" msgid "Panjabi" msgstr "" msgid "Pali" -msgstr "" +msgstr "Пали" msgid "Polish" -msgstr "" +msgstr "Полски" msgid "Pashto" -msgstr "" +msgstr "Пущунски" msgid "Portuguese" -msgstr "" +msgstr "Португалски" msgid "Portuguese (Brazil)" -msgstr "" +msgstr "Португалски (Бразилия)" msgid "Portuguese (Portugal)" -msgstr "" +msgstr "Португалски (Португалия)" msgid "Quechua" -msgstr "" +msgstr "Кечуа" msgid "Romansh" -msgstr "" +msgstr "Романшки" msgid "Rundi" -msgstr "" +msgstr "Рунди" msgid "Romanian" -msgstr "" +msgstr "Румънски" msgid "Russian" -msgstr "" +msgstr "Руски" msgid "Kinyarwanda" -msgstr "" +msgstr "Руанда" msgid "Sanskrit" -msgstr "" +msgstr "Санскрит" msgid "Sardinian" -msgstr "" +msgstr "Сардински" msgid "Sindhi" -msgstr "" +msgstr "Синдхи" msgid "Sango" -msgstr "" +msgstr "Санго" msgid "Sinhala" -msgstr "" +msgstr "Синхалски" msgid "Slovak" -msgstr "" +msgstr "Словашки" msgid "Slovenian" -msgstr "" +msgstr "Словенски" msgid "Samoan" -msgstr "" +msgstr "Самоански" msgid "Shona" -msgstr "" +msgstr "Шона" msgid "Somali" -msgstr "" +msgstr "Сомалийски" msgid "Albanian" -msgstr "" +msgstr "Албански" msgid "Serbian" -msgstr "" +msgstr "Сръбски" msgid "Swati" -msgstr "" +msgstr "Свази" msgid "Sundanese" -msgstr "" +msgstr "Сундански" msgid "Swedish" -msgstr "" +msgstr "Шведски" msgid "Swahili" -msgstr "" +msgstr "Суахили" msgid "Tamil" -msgstr "" +msgstr "Тамилски" msgid "Telugu" -msgstr "" +msgstr "Телугу" msgid "Tajik" -msgstr "" +msgstr "Таджикски" msgid "Thai" -msgstr "" +msgstr "Тайски" msgid "Tigrinya" -msgstr "" +msgstr "Тигриня" msgid "Turkmen" -msgstr "" +msgstr "Туркменски" msgid "Tagalog" -msgstr "" +msgstr "Тагалог" msgid "Tswana" -msgstr "" +msgstr "Тсвана" msgid "Tongan" -msgstr "" +msgstr "Тонгански" msgid "Turkish" -msgstr "" +msgstr "Турски" msgid "Tsonga" -msgstr "" +msgstr "Цонга" msgid "Tatar" -msgstr "" +msgstr "Татарски" msgid "Twi" -msgstr "" +msgstr "Чви" msgid "Tahitian" -msgstr "" +msgstr "Таитянски" msgid "Uyghur" -msgstr "" +msgstr "Уйгурски" msgid "Ukrainian" -msgstr "" +msgstr "Украински" msgid "Urdu" -msgstr "" +msgstr "Урду" msgid "Uzbek" -msgstr "" +msgstr "Узбекски" msgid "Venda" -msgstr "" +msgstr "Венда" msgid "Vietnamese" -msgstr "" +msgstr "Виетнамски" msgid "Volapük" -msgstr "" +msgstr "Волапюк" msgid "Walloon" -msgstr "" +msgstr "Валонски" msgid "Wolof" -msgstr "" +msgstr "Волоф" msgid "Xhosa" -msgstr "" +msgstr "Кхоса" msgid "Yiddish" -msgstr "" +msgstr "Идиш" msgid "Yoruba" -msgstr "" +msgstr "Йоруба" msgid "Zhuang" -msgstr "" +msgstr "Джуански" msgid "Chinese (Traditional)" msgstr "" msgid "Zulu" -msgstr "" +msgstr "Зулуски" msgid "(no translation)" msgstr "" diff --git a/po/de.po b/po/de.po index 27f5180b..0f26393e 100644 --- a/po/de.po +++ b/po/de.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: Pure Data 0.52\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" "POT-Creation-Date: 2024-07-08 15:19+0200\n" -"PO-Revision-Date: 2024-05-06 09:48+0000\n" +"PO-Revision-Date: 2024-07-08 17:15+0200\n" "Last-Translator: umläute \n" "Language-Team: German \n" @@ -19,7 +19,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 5.5.3\n" +"X-Generator: Poedit 3.4.4\n" msgid "linear" msgstr "linear" @@ -1272,43 +1272,43 @@ msgid "The language can only be set during startup." msgstr "Die Sprache kann nur während des Startens von Pd gesetzt werden." msgid "Afar" -msgstr "" +msgstr "Afar" msgid "Abkhazian" -msgstr "" +msgstr "Abchasisch" msgid "Avestan" -msgstr "" +msgstr "Avestisch" msgid "Afrikaans" msgstr "Afrikaans" msgid "Akan" -msgstr "" +msgstr "Akan" msgid "Amharic" -msgstr "" +msgstr "Amharisch" msgid "Aragonese" -msgstr "" +msgstr "Aragonesisch" msgid "Arabic" msgstr "Arabisch" msgid "Assamese" -msgstr "" +msgstr "Assamesisch" msgid "Avaric" -msgstr "" +msgstr "Awarisch" msgid "Aymara" -msgstr "" +msgstr "Aymara" msgid "Azerbaijani" msgstr "Aserbaidschanisch" msgid "Bashkir" -msgstr "" +msgstr "Baschkirisch" msgid "Belarusian" msgstr "Belarussisch" @@ -1317,55 +1317,52 @@ msgid "Bulgarian" msgstr "Bulgarisch" msgid "Bihari" -msgstr "" +msgstr "Bihari" msgid "Bislama" -msgstr "" +msgstr "Bislama" msgid "Bambara" -msgstr "" +msgstr "Bambara" msgid "Bengali" -msgstr "" +msgstr "Bengalisch" msgid "Tibetan" -msgstr "" +msgstr "Tibetisch" msgid "Breton" -msgstr "" +msgstr "Bretonisch" msgid "Bosnian" -msgstr "" +msgstr "Bosnisch" -#, fuzzy msgid "Catalan" -msgstr "schwerwiegende Fehler" +msgstr "Katalanisch" -#, fuzzy msgid "Chechen" -msgstr "Überprüfen" +msgstr "Tschetschenisch" msgid "Chamorro" -msgstr "" +msgstr "Chamorro" msgid "Corsican" -msgstr "" +msgstr "Korsisch" msgid "Cree" -msgstr "" +msgstr "Cree" msgid "Czech" -msgstr "" +msgstr "Tschechisch" msgid "Chuvash" -msgstr "" +msgstr "Tschuwaschisch" msgid "Welsh" -msgstr "" +msgstr "Walisisch" -#, fuzzy msgid "Danish" -msgstr "Spanisch" +msgstr "Dänisch" msgid "German" msgstr "Deutsch" @@ -1374,13 +1371,13 @@ msgid "German (Austria)" msgstr "Deutsch (Österreich)" msgid "Dhivehi" -msgstr "" +msgstr "Dhivehi/Maledivisch" msgid "Dzongkha" -msgstr "" +msgstr "Dzongkha/Bhutanisch" msgid "Ewe" -msgstr "" +msgstr "Ewe" msgid "Greek" msgstr "Griechisch" @@ -1398,59 +1395,58 @@ msgid "English (USA)" msgstr "Englisch (USA)" msgid "Esperanto" -msgstr "" +msgstr "Esperanto" msgid "Spanish" msgstr "Spanisch" msgid "Estonian" -msgstr "" +msgstr "Estnisch" msgid "Basque" msgstr "Baskisch" -#, fuzzy msgid "Persian" -msgstr "Version" +msgstr "Persisch" msgid "Fulah" -msgstr "" +msgstr "Fulfulde" msgid "Finnish" msgstr "Finnisch" msgid "Fijian" -msgstr "" +msgstr "Fidschi/Fidschianisch" msgid "Faroese" -msgstr "" +msgstr "Färöisch" msgid "French" msgstr "Französisch" msgid "Frisian" -msgstr "" +msgstr "Westfriesisch" msgid "Irish" -msgstr "" +msgstr "Irisch" msgid "Gaelic" -msgstr "" +msgstr "Schottisch-Gälisch" msgid "Galician" -msgstr "" +msgstr "Galicisch/Galegisch" msgid "Guarani" -msgstr "" +msgstr "Guaraní" msgid "Gujarati" msgstr "Gujarati" msgid "Manx" -msgstr "" +msgstr "Manx" msgid "Hausa" -msgstr "" +msgstr "Hausa" msgid "Hebrew" msgstr "Hebräisch" @@ -1459,13 +1455,13 @@ msgid "Hindi" msgstr "Hindi" msgid "Hiri Motu" -msgstr "" +msgstr "Hiri Motu" msgid "Croatian" -msgstr "" +msgstr "Kroatisch" msgid "Haitian" -msgstr "" +msgstr "Haitianisch" msgid "Hungarian" msgstr "Ungarisch" @@ -1474,194 +1470,190 @@ msgid "Armenian" msgstr "Armenisch" msgid "Herero" -msgstr "" +msgstr "Otjiherero/Herero" msgid "Interlingua" -msgstr "" +msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesisch" msgid "Occidental" -msgstr "" +msgstr "Interlingue" msgid "Igbo" -msgstr "" +msgstr "Igbo" msgid "Nuosu" -msgstr "" +msgstr "Sichuan-Yi" msgid "Inupiaq" -msgstr "" +msgstr "Inupiaq" msgid "Ido" -msgstr "" +msgstr "Ido" msgid "Icelandic" -msgstr "" +msgstr "Isländisch" msgid "Italian" msgstr "Italienisch" msgid "Inuktitut" -msgstr "" +msgstr "Inuktitut" msgid "Japanese" msgstr "Japanisch" -#, fuzzy msgid "Javanese" -msgstr "Japanisch" +msgstr "Javanisch" msgid "Georgian" -msgstr "" +msgstr "Georgisch" msgid "Kongo" -msgstr "" +msgstr "Kikongo" msgid "Gikuyu" -msgstr "" +msgstr "Kikuyu" msgid "Kwanyama" -msgstr "" +msgstr "oshiKwanyama" msgid "Kazakh" -msgstr "" +msgstr "Kasachisch" msgid "Greenlandic" -msgstr "" +msgstr "Grönländisch" msgid "Kannada" -msgstr "" +msgstr "Kannada" msgid "Korean" msgstr "Koreanisch" msgid "Kanuri" -msgstr "" +msgstr "Kanuri" msgid "Kashmiri" -msgstr "" +msgstr "Kashmiri/Kaschmiri" msgid "Kurdish" -msgstr "" +msgstr "Kurdisch" msgid "Komi" -msgstr "" +msgstr "Komi" msgid "Cornish" -msgstr "" +msgstr "Kornisch" msgid "Kyrgyz" -msgstr "" +msgstr "Kirgisisch" msgid "Latin" -msgstr "" +msgstr "Latein(isch)" msgid "Luxembourgish" -msgstr "" +msgstr "Luxemburgisch" msgid "Luganda" -msgstr "" +msgstr "Luganda" msgid "Limburgish" -msgstr "" +msgstr "Limburgisch" msgid "Lingala" -msgstr "" +msgstr "Lingala" -#, fuzzy msgid "Lao" -msgstr "Protokoll" +msgstr "Laotisch" msgid "Lithuanian" -msgstr "" +msgstr "Litauisch" msgid "Luba-Katanga" -msgstr "" +msgstr "Kiluba" msgid "Latvian" -msgstr "" +msgstr "Lettisch" msgid "Malagasy" -msgstr "" +msgstr "Malagasy/Malagassi/Madagassisch" msgid "Marshallese" -msgstr "" +msgstr "Marshallesisch" msgid "Maori" -msgstr "" +msgstr "Maori(sch)" msgid "Macedonian" -msgstr "" +msgstr "Mazedonisch" msgid "Malayalam" -msgstr "" +msgstr "Malayalam" msgid "Mongolian" -msgstr "" +msgstr "Mongolisch" -#, fuzzy msgid "Marathi" -msgstr "Gujarati" +msgstr "Marathi" msgid "Malay" -msgstr "" +msgstr "Malaiisch" msgid "Maltese" -msgstr "" +msgstr "Maltesisch" msgid "Burmese" -msgstr "" +msgstr "Birmanisch/Burmesisch" msgid "Nauru" -msgstr "" +msgstr "Nauruisch" msgid "Nepali" -msgstr "" +msgstr "Nepali" msgid "Ndonga" -msgstr "" +msgstr "Ndonga" msgid "Dutch" msgstr "Niederländisch" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "Nynorsk" msgid "Navaho" -msgstr "" +msgstr "Navajo" -#, fuzzy msgid "Nyanja" -msgstr "Panjabi" +msgstr "Chichewa/Nyanja" msgid "Occitan" -msgstr "" +msgstr "Okzitanisch" msgid "Ojibwe" -msgstr "" +msgstr "Ojibwe" msgid "Oromo" -msgstr "" +msgstr "Oromo" msgid "Odia" -msgstr "" +msgstr "Oriya/Odia" msgid "Ossetian" -msgstr "" +msgstr "Ossetisch" msgid "Panjabi" msgstr "Panjabi" msgid "Pali" -msgstr "" +msgstr "Pali" msgid "Polish" msgstr "Polnisch" msgid "Pashto" -msgstr "" +msgstr "Paschtu(nisch)" msgid "Portuguese" msgstr "Portugiesisch" @@ -1673,159 +1665,157 @@ msgid "Portuguese (Portugal)" msgstr "Portugiesisch (Portugal)" msgid "Quechua" -msgstr "" +msgstr "Quechua" msgid "Romansh" -msgstr "" +msgstr "Rätoromanisch" msgid "Rundi" -msgstr "" +msgstr "Kirundi" -#, fuzzy msgid "Romanian" -msgstr "Albanisch" +msgstr "Rumänisch" msgid "Russian" msgstr "Russisch" msgid "Kinyarwanda" -msgstr "" +msgstr "Kinyarwanda/Ruandisch" msgid "Sanskrit" -msgstr "" +msgstr "Sanskrit" -#, fuzzy msgid "Sardinian" -msgstr "Ukrainisch" +msgstr "Sardisch" msgid "Sindhi" -msgstr "" +msgstr "Sindhi" msgid "Sango" -msgstr "" +msgstr "Sango" msgid "Sinhala" -msgstr "" +msgstr "Singhalesisch" msgid "Slovak" -msgstr "" +msgstr "Slowakisch" msgid "Slovenian" -msgstr "" +msgstr "Slowenisch" msgid "Samoan" -msgstr "" +msgstr "Samoanisch" msgid "Shona" -msgstr "" +msgstr "Shona" msgid "Somali" -msgstr "" +msgstr "Somali" msgid "Albanian" msgstr "Albanisch" msgid "Serbian" -msgstr "" +msgstr "Serbisch" msgid "Swati" -msgstr "" +msgstr "Siswati" msgid "Sundanese" -msgstr "" +msgstr "Sundanesisch" msgid "Swedish" msgstr "Schwedisch" msgid "Swahili" -msgstr "" +msgstr "Swahili" msgid "Tamil" -msgstr "" +msgstr "Tamil" msgid "Telugu" -msgstr "" +msgstr "Telugu" msgid "Tajik" -msgstr "" +msgstr "Tadschikisch" msgid "Thai" -msgstr "" +msgstr "Thai" msgid "Tigrinya" -msgstr "" +msgstr "Tigrinya" msgid "Turkmen" -msgstr "" +msgstr "Turkmenisch" msgid "Tagalog" -msgstr "" +msgstr "Tagalog" msgid "Tswana" -msgstr "" +msgstr "Setswana" msgid "Tongan" -msgstr "" +msgstr "Tongaisch" msgid "Turkish" msgstr "Türkisch" msgid "Tsonga" -msgstr "" +msgstr "Xitsonga" msgid "Tatar" -msgstr "" +msgstr "Tatarisch" msgid "Twi" -msgstr "" +msgstr "Twi" msgid "Tahitian" -msgstr "" +msgstr "Tahitianisch/Tahitisch" msgid "Uyghur" -msgstr "" +msgstr "Uigurisch" msgid "Ukrainian" msgstr "Ukrainisch" msgid "Urdu" -msgstr "" +msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Usbekisch" msgid "Venda" -msgstr "" +msgstr "Tshivenda" msgid "Vietnamese" msgstr "Vietnamesisch" msgid "Volapük" -msgstr "" +msgstr "Volapük" msgid "Walloon" -msgstr "" +msgstr "Wallonisch" msgid "Wolof" -msgstr "" +msgstr "Wolof" msgid "Xhosa" -msgstr "" +msgstr "isiXhosa" msgid "Yiddish" -msgstr "" +msgstr "Jiddisch" msgid "Yoruba" -msgstr "" +msgstr "Yoruba" msgid "Zhuang" -msgstr "" +msgstr "Zhuang" msgid "Chinese (Traditional)" msgstr "Chinesisch (traditionell)" msgid "Zulu" -msgstr "" +msgstr "isiZulu/Zulu" msgid "(no translation)" msgstr "(keine Übersetzung)" diff --git a/po/el.po b/po/el.po index 117e730f..343e7646 100644 --- a/po/el.po +++ b/po/el.po @@ -1278,121 +1278,121 @@ msgid "The language can only be set during startup." msgstr "" msgid "Afar" -msgstr "" +msgstr "Αφάρ" msgid "Abkhazian" -msgstr "" +msgstr "Αμπχαζιανά" msgid "Avestan" -msgstr "" +msgstr "Αβεστικά" msgid "Afrikaans" -msgstr "" +msgstr "Αφρικάνικα" msgid "Akan" -msgstr "" +msgstr "Ακανικά" msgid "Amharic" -msgstr "" +msgstr "Αμχαρικά" msgid "Aragonese" -msgstr "" +msgstr "Αραγονικά" msgid "Arabic" -msgstr "" +msgstr "Αραβικά" msgid "Assamese" -msgstr "" +msgstr "Ασσαμέζικα" msgid "Avaric" -msgstr "" +msgstr "Αβάρικα" msgid "Aymara" -msgstr "" +msgstr "Αϊμάρα" msgid "Azerbaijani" -msgstr "" +msgstr "Αζέρικα" msgid "Bashkir" -msgstr "" +msgstr "Βασκιρικά" msgid "Belarusian" -msgstr "" +msgstr "Λευκορωσικά" msgid "Bulgarian" -msgstr "" +msgstr "Βουλγαρικά" msgid "Bihari" -msgstr "" +msgstr "Μπιχαριανός" msgid "Bislama" -msgstr "" +msgstr "Μπισλάμα" msgid "Bambara" -msgstr "" +msgstr "Μπαμπαρικά" msgid "Bengali" -msgstr "" +msgstr "Βεγγαλικά" msgid "Tibetan" -msgstr "" +msgstr "Θιβετιανά" msgid "Breton" -msgstr "" +msgstr "Βρετονικά" msgid "Bosnian" -msgstr "" +msgstr "Βοσνιακά" msgid "Catalan" -msgstr "" +msgstr "Καταλανικά" msgid "Chechen" -msgstr "" +msgstr "Τσετσενικά" msgid "Chamorro" -msgstr "" +msgstr "Καμόρρο" msgid "Corsican" -msgstr "" +msgstr "Κορσικανικά" msgid "Cree" -msgstr "" +msgstr "Κρεεϊκά" msgid "Czech" -msgstr "" +msgstr "Τσέχικα" msgid "Chuvash" -msgstr "" +msgstr "Τσουβασικά" msgid "Welsh" -msgstr "" +msgstr "Ουαλικά" msgid "Danish" -msgstr "" +msgstr "Δανέζικα" msgid "German" -msgstr "" +msgstr "Γερμανικά" msgid "German (Austria)" -msgstr "" +msgstr "Γερμανικά (Αυστρίας)" msgid "Dhivehi" -msgstr "" +msgstr "Ντιβέχι" msgid "Dzongkha" -msgstr "" +msgstr "Ντζονγκικά" msgid "Ewe" -msgstr "" +msgstr "Έουε" msgid "Greek" -msgstr "" +msgstr "Ελληνικά" msgid "English" -msgstr "" +msgstr "Αγγλικά" msgid "English (Canada)" -msgstr "" +msgstr "Αγγλικά (Καναδά)" msgid "English (UK)" msgstr "" @@ -1401,427 +1401,427 @@ msgid "English (USA)" msgstr "" msgid "Esperanto" -msgstr "" +msgstr "Εσπεράντο" msgid "Spanish" -msgstr "" +msgstr "Ισπανικά" msgid "Estonian" -msgstr "" +msgstr "Εσθονικά" msgid "Basque" -msgstr "" +msgstr "Βάσκικα" msgid "Persian" -msgstr "" +msgstr "Περσικά" msgid "Fulah" -msgstr "" +msgstr "Φούλα" msgid "Finnish" -msgstr "" +msgstr "Φινλανδικά" msgid "Fijian" -msgstr "" +msgstr "Φιτζιανά" msgid "Faroese" -msgstr "" +msgstr "Φαροϊκά" msgid "French" -msgstr "" +msgstr "Γαλλικά" msgid "Frisian" -msgstr "" +msgstr "Φριζική" msgid "Irish" -msgstr "" +msgstr "Ιρλανδικά" msgid "Gaelic" -msgstr "" +msgstr "Γαελικά" msgid "Galician" -msgstr "" +msgstr "Γαλικιανά" msgid "Guarani" -msgstr "" +msgstr "Γκουαράνι" msgid "Gujarati" -msgstr "" +msgstr "Γκουτζαράτ" msgid "Manx" -msgstr "" +msgstr "Μανξ" msgid "Hausa" -msgstr "" +msgstr "Χαουσανικά" msgid "Hebrew" -msgstr "" +msgstr "Εβραϊκά" msgid "Hindi" -msgstr "" +msgstr "Χίντι" msgid "Hiri Motu" -msgstr "" +msgstr "Χίρι Μότου" msgid "Croatian" -msgstr "" +msgstr "Κροατικά" msgid "Haitian" -msgstr "" +msgstr "Αϊτικά" msgid "Hungarian" -msgstr "" +msgstr "Ουγγρικά" msgid "Armenian" -msgstr "" +msgstr "Αρμένικα" msgid "Herero" -msgstr "" +msgstr "Χερέρο" msgid "Interlingua" -msgstr "" +msgstr "Ιντερλίνγκουα" msgid "Indonesian" -msgstr "" +msgstr "Ινδονησιακά" msgid "Occidental" -msgstr "" +msgstr "Οξιντένταλ" msgid "Igbo" -msgstr "" +msgstr "Ίγκμπο" msgid "Nuosu" -msgstr "" +msgstr "Νουοσού" msgid "Inupiaq" -msgstr "" +msgstr "Ινουπιάκ" msgid "Ido" -msgstr "" +msgstr "Ίντο" msgid "Icelandic" -msgstr "" +msgstr "Ισλανδικά" msgid "Italian" -msgstr "" +msgstr "Ιταλικά" msgid "Inuktitut" -msgstr "" +msgstr "Ινούκτιτουτ" msgid "Japanese" -msgstr "" +msgstr "Ιαπωνικά" msgid "Javanese" -msgstr "" +msgstr "Ιαβανέζικα" msgid "Georgian" -msgstr "" +msgstr "Γεωργιανά" msgid "Kongo" -msgstr "" +msgstr "Κονγκό" msgid "Gikuyu" -msgstr "" +msgstr "Κικούγιου" msgid "Kwanyama" -msgstr "" +msgstr "Κουανγιάμα" msgid "Kazakh" -msgstr "" +msgstr "Καζακικά" msgid "Greenlandic" -msgstr "" +msgstr "Γροιλανδικά" msgid "Kannada" -msgstr "" +msgstr "Κανάντα" msgid "Korean" -msgstr "" +msgstr "Κορεάτικα" msgid "Kanuri" -msgstr "" +msgstr "Κανούρι" msgid "Kashmiri" -msgstr "" +msgstr "Κασμιρικά" msgid "Kurdish" -msgstr "" +msgstr "Κουρδικά" msgid "Komi" -msgstr "" +msgstr "Κόμι" msgid "Cornish" -msgstr "" +msgstr "Κορνουαλικά" msgid "Kyrgyz" -msgstr "" +msgstr "Κυργκιζικά" msgid "Latin" -msgstr "" +msgstr "Λατινικά" msgid "Luxembourgish" -msgstr "" +msgstr "Λουξεμβρουργικά" msgid "Luganda" -msgstr "" +msgstr "Λουγκάντα" msgid "Limburgish" -msgstr "" +msgstr "Λιμβουργικά" msgid "Lingala" -msgstr "" +msgstr "Λινγκαλανικά" msgid "Lao" -msgstr "" +msgstr "Λαοτινά" msgid "Lithuanian" -msgstr "" +msgstr "Λιθουανικά" msgid "Luba-Katanga" -msgstr "" +msgstr "Λούμπα-Κατάνγκα" msgid "Latvian" -msgstr "" +msgstr "Λεττονικά" msgid "Malagasy" -msgstr "" +msgstr "Μαλαγασικά" msgid "Marshallese" -msgstr "" +msgstr "Μαρσαλέζικα" msgid "Maori" -msgstr "" +msgstr "Μαορικά" msgid "Macedonian" -msgstr "" +msgstr "Σλαβομακεδονικά" msgid "Malayalam" -msgstr "" +msgstr "Μαλαγιάλαμ" msgid "Mongolian" -msgstr "" +msgstr "Μογγολικά" msgid "Marathi" -msgstr "" +msgstr "Μαραθικά" msgid "Malay" -msgstr "" +msgstr "Μαλαϊκά" msgid "Maltese" -msgstr "" +msgstr "Μαλτέζικα" msgid "Burmese" -msgstr "" +msgstr "Μπουρμεσεϊκά" msgid "Nauru" -msgstr "" +msgstr "Ναούρου" msgid "Nepali" -msgstr "" +msgstr "Νεπαλέζικα" msgid "Ndonga" -msgstr "" +msgstr "Νντόγκα" msgid "Dutch" -msgstr "" +msgstr "Ολλανδικά" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "Νορβηγικά Nynorsk" msgid "Navaho" -msgstr "" +msgstr "Ναβάχο" msgid "Nyanja" -msgstr "" +msgstr "Νιανιανικά" msgid "Occitan" -msgstr "" +msgstr "Οτσιτανικά" msgid "Ojibwe" -msgstr "" +msgstr "Οτζιβουεϊκά" msgid "Oromo" -msgstr "" +msgstr "Ορόμο" msgid "Odia" -msgstr "" +msgstr "Όντια" msgid "Ossetian" -msgstr "" +msgstr "Οσσετικά" msgid "Panjabi" msgstr "" msgid "Pali" -msgstr "" +msgstr "Πάλι" msgid "Polish" -msgstr "" +msgstr "Πολωνικά" msgid "Pashto" -msgstr "" +msgstr "Παστού" msgid "Portuguese" -msgstr "" +msgstr "Πορτογαλικά" msgid "Portuguese (Brazil)" -msgstr "" +msgstr "Πορτογαλικά (Βραζιλία)" msgid "Portuguese (Portugal)" -msgstr "" +msgstr "Πορτογαλικά (Πορτογαλία)" msgid "Quechua" -msgstr "" +msgstr "Κέτσουα" msgid "Romansh" -msgstr "" +msgstr "Ρομανσικά" msgid "Rundi" -msgstr "" +msgstr "Ρούντι" msgid "Romanian" -msgstr "" +msgstr "Ρουμανικά" msgid "Russian" -msgstr "" +msgstr "Ρωσικά" msgid "Kinyarwanda" -msgstr "" +msgstr "Κινυαργανταϊκά" msgid "Sanskrit" -msgstr "" +msgstr "Σανσκριτικά" msgid "Sardinian" -msgstr "" +msgstr "Σαρδινικά" msgid "Sindhi" -msgstr "" +msgstr "Σιντχικά" msgid "Sango" -msgstr "" +msgstr "Σάνγκο" msgid "Sinhala" -msgstr "" +msgstr "Σιναλεζικά" msgid "Slovak" -msgstr "" +msgstr "Σλοβακικά" msgid "Slovenian" -msgstr "" +msgstr "Σλοβενικά" msgid "Samoan" -msgstr "" +msgstr "Σαμοανά" msgid "Shona" -msgstr "" +msgstr "Σόνα" msgid "Somali" -msgstr "" +msgstr "Σομαλέζικα" msgid "Albanian" -msgstr "" +msgstr "Αλβανικά" msgid "Serbian" -msgstr "" +msgstr "Σερβικά" msgid "Swati" -msgstr "" +msgstr "Σουάτι" msgid "Sundanese" -msgstr "" +msgstr "Σουντικά" msgid "Swedish" -msgstr "" +msgstr "Σουηδικά" msgid "Swahili" -msgstr "" +msgstr "Σουαχίλι" msgid "Tamil" -msgstr "" +msgstr "Ταμίλ" msgid "Telugu" -msgstr "" +msgstr "Τελούγκου" msgid "Tajik" -msgstr "" +msgstr "Τατζικικά" msgid "Thai" -msgstr "" +msgstr "Ταϊλανδικά" msgid "Tigrinya" -msgstr "" +msgstr "Τιγκρινιανικά" msgid "Turkmen" -msgstr "" +msgstr "Τουρκμενικά" msgid "Tagalog" -msgstr "" +msgstr "Ταγκαλογικά" msgid "Tswana" -msgstr "" +msgstr "Τσουάνα" msgid "Tongan" -msgstr "" +msgstr "Τόγκα" msgid "Turkish" -msgstr "" +msgstr "Τουρκικά" msgid "Tsonga" -msgstr "" +msgstr "Τσονγκαϊκά" msgid "Tatar" -msgstr "" +msgstr "Ταταρικά" msgid "Twi" -msgstr "" +msgstr "Τούι" msgid "Tahitian" -msgstr "" +msgstr "Ταϊτιανά" msgid "Uyghur" -msgstr "" +msgstr "Ουιγούρ" msgid "Ukrainian" -msgstr "" +msgstr "Ουκρανικά" msgid "Urdu" -msgstr "" +msgstr "Ούρντου" msgid "Uzbek" -msgstr "" +msgstr "Ουζμπεκικά" msgid "Venda" -msgstr "" +msgstr "Βέντακικά" msgid "Vietnamese" -msgstr "" +msgstr "Βιετναμέζικα" msgid "Volapük" -msgstr "" +msgstr "Βολαπιούκ" msgid "Walloon" -msgstr "" +msgstr "Βαλλωνικά" msgid "Wolof" -msgstr "" +msgstr "Γουολοφικά" msgid "Xhosa" -msgstr "" +msgstr "Κόσα" msgid "Yiddish" -msgstr "" +msgstr "Γίντις" msgid "Yoruba" -msgstr "" +msgstr "Γιορούμπα" msgid "Zhuang" -msgstr "" +msgstr "Ζουάνγκ" msgid "Chinese (Traditional)" msgstr "" msgid "Zulu" -msgstr "" +msgstr "Ζουλού" msgid "(no translation)" msgstr "" diff --git a/po/en.po b/po/en.po index b059bdec..df7ea468 100644 --- a/po/en.po +++ b/po/en.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: Pure Data 0.51.4\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" "POT-Creation-Date: 2024-07-08 15:19+0200\n" -"PO-Revision-Date: 2024-05-06 09:48+0000\n" +"PO-Revision-Date: 2024-07-08 17:16+0200\n" "Last-Translator: umläute \n" "Language-Team: English \n" @@ -16,7 +16,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 5.5.3\n" +"X-Generator: Poedit 3.4.4\n" msgid "linear" msgstr "linear" @@ -1248,43 +1248,43 @@ msgid "The language can only be set during startup." msgstr "The language can only be set during startup." msgid "Afar" -msgstr "" +msgstr "Afar" msgid "Abkhazian" -msgstr "" +msgstr "Abkhazian" msgid "Avestan" -msgstr "" +msgstr "Avestan" msgid "Afrikaans" msgstr "Afrikaans" msgid "Akan" -msgstr "" +msgstr "Akan" msgid "Amharic" -msgstr "" +msgstr "Amharic" msgid "Aragonese" -msgstr "" +msgstr "Aragonese" msgid "Arabic" msgstr "Arabic" msgid "Assamese" -msgstr "" +msgstr "Assamese" msgid "Avaric" -msgstr "" +msgstr "Avaric" msgid "Aymara" -msgstr "" +msgstr "Aymara" msgid "Azerbaijani" msgstr "Azerbaijani" msgid "Bashkir" -msgstr "" +msgstr "Bashkir" msgid "Belarusian" msgstr "Belarusian" @@ -1293,55 +1293,52 @@ msgid "Bulgarian" msgstr "Bulgarian" msgid "Bihari" -msgstr "" +msgstr "Bihari" msgid "Bislama" -msgstr "" +msgstr "Bislama" msgid "Bambara" -msgstr "" +msgstr "Bambara" msgid "Bengali" -msgstr "" +msgstr "Bengali" msgid "Tibetan" -msgstr "" +msgstr "Tibetan" msgid "Breton" -msgstr "" +msgstr "Breton" msgid "Bosnian" -msgstr "" +msgstr "Bosnian" -#, fuzzy msgid "Catalan" -msgstr "fatal" +msgstr "Catalan" -#, fuzzy msgid "Chechen" -msgstr "Check" +msgstr "Chechen" msgid "Chamorro" -msgstr "" +msgstr "Chamorro" msgid "Corsican" -msgstr "" +msgstr "Corsican" msgid "Cree" -msgstr "" +msgstr "Cree" msgid "Czech" -msgstr "" +msgstr "Czech" msgid "Chuvash" -msgstr "" +msgstr "Chuvash" msgid "Welsh" -msgstr "" +msgstr "Welsh" -#, fuzzy msgid "Danish" -msgstr "Spanish" +msgstr "Danish" msgid "German" msgstr "German" @@ -1350,13 +1347,13 @@ msgid "German (Austria)" msgstr "German (Austria)" msgid "Dhivehi" -msgstr "" +msgstr "Dhivehi" msgid "Dzongkha" -msgstr "" +msgstr "Dzongkha" msgid "Ewe" -msgstr "" +msgstr "Ewe" msgid "Greek" msgstr "Greek" @@ -1374,59 +1371,58 @@ msgid "English (USA)" msgstr "English (USA)" msgid "Esperanto" -msgstr "" +msgstr "Esperanto" msgid "Spanish" msgstr "Spanish" msgid "Estonian" -msgstr "" +msgstr "Estonian" msgid "Basque" msgstr "Basque" -#, fuzzy msgid "Persian" -msgstr "Version" +msgstr "Persian" msgid "Fulah" -msgstr "" +msgstr "Fulah" msgid "Finnish" msgstr "Finnish" msgid "Fijian" -msgstr "" +msgstr "Fijian" msgid "Faroese" -msgstr "" +msgstr "Faroese" msgid "French" msgstr "French" msgid "Frisian" -msgstr "" +msgstr "Frisian" msgid "Irish" -msgstr "" +msgstr "Irish" msgid "Gaelic" -msgstr "" +msgstr "Gaelic" msgid "Galician" -msgstr "" +msgstr "Galician" msgid "Guarani" -msgstr "" +msgstr "Guarani" msgid "Gujarati" msgstr "Gujarati" msgid "Manx" -msgstr "" +msgstr "Manx" msgid "Hausa" -msgstr "" +msgstr "Hausa" msgid "Hebrew" msgstr "Hebrew" @@ -1435,13 +1431,13 @@ msgid "Hindi" msgstr "Hindi" msgid "Hiri Motu" -msgstr "" +msgstr "Hiri Motu" msgid "Croatian" -msgstr "" +msgstr "Croatian" msgid "Haitian" -msgstr "" +msgstr "Haitian" msgid "Hungarian" msgstr "Hungarian" @@ -1450,194 +1446,190 @@ msgid "Armenian" msgstr "Armenian" msgid "Herero" -msgstr "" +msgstr "Herero" msgid "Interlingua" -msgstr "" +msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesian" msgid "Occidental" -msgstr "" +msgstr "Occidental" msgid "Igbo" -msgstr "" +msgstr "Igbo" msgid "Nuosu" -msgstr "" +msgstr "Nuosu" msgid "Inupiaq" -msgstr "" +msgstr "Inupiaq" msgid "Ido" -msgstr "" +msgstr "Ido" msgid "Icelandic" -msgstr "" +msgstr "Icelandic" msgid "Italian" msgstr "Italian" msgid "Inuktitut" -msgstr "" +msgstr "Inuktitut" msgid "Japanese" msgstr "Japanese" -#, fuzzy msgid "Javanese" -msgstr "Japanese" +msgstr "Javanese" msgid "Georgian" -msgstr "" +msgstr "Georgian" msgid "Kongo" -msgstr "" +msgstr "Kongo" msgid "Gikuyu" -msgstr "" +msgstr "Gikuyu" msgid "Kwanyama" -msgstr "" +msgstr "Kwanyama" msgid "Kazakh" -msgstr "" +msgstr "Kazakh" msgid "Greenlandic" -msgstr "" +msgstr "Greenlandic" msgid "Kannada" -msgstr "" +msgstr "Kannada" msgid "Korean" msgstr "Korean" msgid "Kanuri" -msgstr "" +msgstr "Kanuri" msgid "Kashmiri" -msgstr "" +msgstr "Kashmiri" msgid "Kurdish" -msgstr "" +msgstr "Kurdish" msgid "Komi" -msgstr "" +msgstr "Komi" msgid "Cornish" -msgstr "" +msgstr "Cornish" msgid "Kyrgyz" -msgstr "" +msgstr "Kyrgyz" msgid "Latin" -msgstr "" +msgstr "Latin" msgid "Luxembourgish" -msgstr "" +msgstr "Luxembourgish" msgid "Luganda" -msgstr "" +msgstr "Luganda" msgid "Limburgish" -msgstr "" +msgstr "Limburgish" msgid "Lingala" -msgstr "" +msgstr "Lingala" -#, fuzzy msgid "Lao" -msgstr "Log" +msgstr "Lao" msgid "Lithuanian" -msgstr "" +msgstr "Lithuanian" msgid "Luba-Katanga" -msgstr "" +msgstr "Luba-Katanga" msgid "Latvian" -msgstr "" +msgstr "Latvian" msgid "Malagasy" -msgstr "" +msgstr "Malagasy" msgid "Marshallese" -msgstr "" +msgstr "Marshallese" msgid "Maori" -msgstr "" +msgstr "Maori" msgid "Macedonian" -msgstr "" +msgstr "Macedonian" msgid "Malayalam" -msgstr "" +msgstr "Malayalam" msgid "Mongolian" -msgstr "" +msgstr "Mongolian" -#, fuzzy msgid "Marathi" -msgstr "Gujarati" +msgstr "Marathi" msgid "Malay" -msgstr "" +msgstr "Malay" msgid "Maltese" -msgstr "" +msgstr "Maltese" msgid "Burmese" -msgstr "" +msgstr "Burmese" msgid "Nauru" -msgstr "" +msgstr "Nauru" msgid "Nepali" -msgstr "" +msgstr "Nepali" msgid "Ndonga" -msgstr "" +msgstr "Ndonga" msgid "Dutch" msgstr "Dutch" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "Norwegian Nynorsk" msgid "Navaho" -msgstr "" +msgstr "Navaho" -#, fuzzy msgid "Nyanja" -msgstr "Panjabi" +msgstr "Nyanja" msgid "Occitan" -msgstr "" +msgstr "Occitan" msgid "Ojibwe" -msgstr "" +msgstr "Ojibwe" msgid "Oromo" -msgstr "" +msgstr "Oromo" msgid "Odia" -msgstr "" +msgstr "Odia" msgid "Ossetian" -msgstr "" +msgstr "Ossetian" msgid "Panjabi" msgstr "Panjabi" msgid "Pali" -msgstr "" +msgstr "Pali" msgid "Polish" msgstr "Polish" msgid "Pashto" -msgstr "" +msgstr "Pashto" msgid "Portuguese" msgstr "Portuguese" @@ -1649,159 +1641,157 @@ msgid "Portuguese (Portugal)" msgstr "Portuguese (Portugal)" msgid "Quechua" -msgstr "" +msgstr "Quechua" msgid "Romansh" -msgstr "" +msgstr "Romansh" msgid "Rundi" -msgstr "" +msgstr "Rundi" -#, fuzzy msgid "Romanian" -msgstr "Albanian" +msgstr "Romanian" msgid "Russian" msgstr "Russian" msgid "Kinyarwanda" -msgstr "" +msgstr "Kinyarwanda" msgid "Sanskrit" -msgstr "" +msgstr "Sanskrit" -#, fuzzy msgid "Sardinian" -msgstr "Ukrainian" +msgstr "Sardinian" msgid "Sindhi" -msgstr "" +msgstr "Sindhi" msgid "Sango" -msgstr "" +msgstr "Sango" msgid "Sinhala" -msgstr "" +msgstr "Sinhala" msgid "Slovak" -msgstr "" +msgstr "Slovak" msgid "Slovenian" -msgstr "" +msgstr "Slovenian" msgid "Samoan" -msgstr "" +msgstr "Samoan" msgid "Shona" -msgstr "" +msgstr "Shona" msgid "Somali" -msgstr "" +msgstr "Somali" msgid "Albanian" msgstr "Albanian" msgid "Serbian" -msgstr "" +msgstr "Serbian" msgid "Swati" -msgstr "" +msgstr "Swati" msgid "Sundanese" -msgstr "" +msgstr "Sundanese" msgid "Swedish" msgstr "Swedish" msgid "Swahili" -msgstr "" +msgstr "Swahili" msgid "Tamil" -msgstr "" +msgstr "Tamil" msgid "Telugu" -msgstr "" +msgstr "Telugu" msgid "Tajik" -msgstr "" +msgstr "Tajik" msgid "Thai" -msgstr "" +msgstr "Thai" msgid "Tigrinya" -msgstr "" +msgstr "Tigrinya" msgid "Turkmen" -msgstr "" +msgstr "Turkmen" msgid "Tagalog" -msgstr "" +msgstr "Tagalog" msgid "Tswana" -msgstr "" +msgstr "Tswana" msgid "Tongan" -msgstr "" +msgstr "Tongan" msgid "Turkish" msgstr "Turkish" msgid "Tsonga" -msgstr "" +msgstr "Tsonga" msgid "Tatar" -msgstr "" +msgstr "Tatar" msgid "Twi" -msgstr "" +msgstr "Twi" msgid "Tahitian" -msgstr "" +msgstr "Tahitian" msgid "Uyghur" -msgstr "" +msgstr "Uyghur" msgid "Ukrainian" msgstr "Ukrainian" msgid "Urdu" -msgstr "" +msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Uzbek" msgid "Venda" -msgstr "" +msgstr "Venda" msgid "Vietnamese" msgstr "Vietnamese" msgid "Volapük" -msgstr "" +msgstr "Volapük" msgid "Walloon" -msgstr "" +msgstr "Walloon" msgid "Wolof" -msgstr "" +msgstr "Wolof" msgid "Xhosa" -msgstr "" +msgstr "Xhosa" msgid "Yiddish" -msgstr "" +msgstr "Yiddish" msgid "Yoruba" -msgstr "" +msgstr "Yoruba" msgid "Zhuang" -msgstr "" +msgstr "Zhuang" msgid "Chinese (Traditional)" msgstr "Chinese (Traditional)" msgid "Zulu" -msgstr "" +msgstr "Zulu" msgid "(no translation)" msgstr "(no translation)" diff --git a/po/en_ca.po b/po/en_ca.po index 3c7f9275..a5ebdf17 100644 --- a/po/en_ca.po +++ b/po/en_ca.po @@ -8,16 +8,16 @@ msgstr "" "Project-Id-Version: Pure Data 0.43\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" "POT-Creation-Date: 2024-07-08 15:19+0200\n" -"PO-Revision-Date: 2024-05-06 09:48+0000\n" +"PO-Revision-Date: 2024-07-08 17:16+0200\n" "Last-Translator: umläute \n" "Language-Team: English (Canada) \n" -"Language: en_ca\n" +"Language: en_CA\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.5.3\n" +"X-Generator: Poedit 3.4.4\n" msgid "linear" msgstr "linear" @@ -1249,43 +1249,43 @@ msgid "The language can only be set during startup." msgstr "The language can only be set during startup." msgid "Afar" -msgstr "" +msgstr "Afar" msgid "Abkhazian" -msgstr "" +msgstr "Abkhazian" msgid "Avestan" -msgstr "" +msgstr "Avestan" msgid "Afrikaans" msgstr "Afrikaans" msgid "Akan" -msgstr "" +msgstr "Akan" msgid "Amharic" -msgstr "" +msgstr "Amharic" msgid "Aragonese" -msgstr "" +msgstr "Aragonese" msgid "Arabic" msgstr "Arabic" msgid "Assamese" -msgstr "" +msgstr "Assamese" msgid "Avaric" -msgstr "" +msgstr "Avaric" msgid "Aymara" -msgstr "" +msgstr "Aymara" msgid "Azerbaijani" msgstr "Azerbaijani" msgid "Bashkir" -msgstr "" +msgstr "Bashkir" msgid "Belarusian" msgstr "Belarusian" @@ -1294,55 +1294,52 @@ msgid "Bulgarian" msgstr "Bulgarian" msgid "Bihari" -msgstr "" +msgstr "Bihari" msgid "Bislama" -msgstr "" +msgstr "Bislama" msgid "Bambara" -msgstr "" +msgstr "Bambara" msgid "Bengali" -msgstr "" +msgstr "Bengali" msgid "Tibetan" -msgstr "" +msgstr "Tibetan" msgid "Breton" -msgstr "" +msgstr "Breton" msgid "Bosnian" -msgstr "" +msgstr "Bosnian" -#, fuzzy msgid "Catalan" -msgstr "fatal" +msgstr "Catalan" -#, fuzzy msgid "Chechen" -msgstr "Check" +msgstr "Chechen" msgid "Chamorro" -msgstr "" +msgstr "Chamorro" msgid "Corsican" -msgstr "" +msgstr "Corsican" msgid "Cree" -msgstr "" +msgstr "Cree" msgid "Czech" -msgstr "" +msgstr "Czech" msgid "Chuvash" -msgstr "" +msgstr "Chuvash" msgid "Welsh" -msgstr "" +msgstr "Welsh" -#, fuzzy msgid "Danish" -msgstr "Spanish" +msgstr "Danish" msgid "German" msgstr "German" @@ -1351,13 +1348,13 @@ msgid "German (Austria)" msgstr "German (Austria)" msgid "Dhivehi" -msgstr "" +msgstr "Dhivehi" msgid "Dzongkha" -msgstr "" +msgstr "Dzongkha" msgid "Ewe" -msgstr "" +msgstr "Ewe" msgid "Greek" msgstr "Greek" @@ -1375,59 +1372,58 @@ msgid "English (USA)" msgstr "English (USA)" msgid "Esperanto" -msgstr "" +msgstr "Esperanto" msgid "Spanish" msgstr "Spanish" msgid "Estonian" -msgstr "" +msgstr "Estonian" msgid "Basque" msgstr "Basque" -#, fuzzy msgid "Persian" -msgstr "Version" +msgstr "Persian" msgid "Fulah" -msgstr "" +msgstr "Fulah" msgid "Finnish" msgstr "Finnish" msgid "Fijian" -msgstr "" +msgstr "Fijian" msgid "Faroese" -msgstr "" +msgstr "Faroese" msgid "French" msgstr "French" msgid "Frisian" -msgstr "" +msgstr "Frisian" msgid "Irish" -msgstr "" +msgstr "Irish" msgid "Gaelic" -msgstr "" +msgstr "Gaelic" msgid "Galician" -msgstr "" +msgstr "Galician" msgid "Guarani" -msgstr "" +msgstr "Guarani" msgid "Gujarati" msgstr "Gujarati" msgid "Manx" -msgstr "" +msgstr "Manx" msgid "Hausa" -msgstr "" +msgstr "Hausa" msgid "Hebrew" msgstr "Hebrew" @@ -1436,13 +1432,13 @@ msgid "Hindi" msgstr "Hindi" msgid "Hiri Motu" -msgstr "" +msgstr "Hiri Motu" msgid "Croatian" -msgstr "" +msgstr "Croatian" msgid "Haitian" -msgstr "" +msgstr "Haitian" msgid "Hungarian" msgstr "Hungarian" @@ -1451,194 +1447,190 @@ msgid "Armenian" msgstr "Armenian" msgid "Herero" -msgstr "" +msgstr "Herero" msgid "Interlingua" -msgstr "" +msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesian" msgid "Occidental" -msgstr "" +msgstr "Occidental" msgid "Igbo" -msgstr "" +msgstr "Igbo" msgid "Nuosu" -msgstr "" +msgstr "Nuosu" msgid "Inupiaq" -msgstr "" +msgstr "Inupiaq" msgid "Ido" -msgstr "" +msgstr "Ido" msgid "Icelandic" -msgstr "" +msgstr "Icelandic" msgid "Italian" msgstr "Italian" msgid "Inuktitut" -msgstr "" +msgstr "Inuktitut" msgid "Japanese" msgstr "Japanese" -#, fuzzy msgid "Javanese" -msgstr "Japanese" +msgstr "Javanese" msgid "Georgian" -msgstr "" +msgstr "Georgian" msgid "Kongo" -msgstr "" +msgstr "Kongo" msgid "Gikuyu" -msgstr "" +msgstr "Gikuyu" msgid "Kwanyama" -msgstr "" +msgstr "Kwanyama" msgid "Kazakh" -msgstr "" +msgstr "Kazakh" msgid "Greenlandic" -msgstr "" +msgstr "Greenlandic" msgid "Kannada" -msgstr "" +msgstr "Kannada" msgid "Korean" msgstr "Korean" msgid "Kanuri" -msgstr "" +msgstr "Kanuri" msgid "Kashmiri" -msgstr "" +msgstr "Kashmiri" msgid "Kurdish" -msgstr "" +msgstr "Kurdish" msgid "Komi" -msgstr "" +msgstr "Komi" msgid "Cornish" -msgstr "" +msgstr "Cornish" msgid "Kyrgyz" -msgstr "" +msgstr "Kyrgyz" msgid "Latin" -msgstr "" +msgstr "Latin" msgid "Luxembourgish" -msgstr "" +msgstr "Luxembourgish" msgid "Luganda" -msgstr "" +msgstr "Luganda" msgid "Limburgish" -msgstr "" +msgstr "Limburgish" msgid "Lingala" -msgstr "" +msgstr "Lingala" -#, fuzzy msgid "Lao" -msgstr "Log" +msgstr "Lao" msgid "Lithuanian" -msgstr "" +msgstr "Lithuanian" msgid "Luba-Katanga" -msgstr "" +msgstr "Luba-Katanga" msgid "Latvian" -msgstr "" +msgstr "Latvian" msgid "Malagasy" -msgstr "" +msgstr "Malagasy" msgid "Marshallese" -msgstr "" +msgstr "Marshallese" msgid "Maori" -msgstr "" +msgstr "Maori" msgid "Macedonian" -msgstr "" +msgstr "Macedonian" msgid "Malayalam" -msgstr "" +msgstr "Malayalam" msgid "Mongolian" -msgstr "" +msgstr "Mongolian" -#, fuzzy msgid "Marathi" -msgstr "Gujarati" +msgstr "Marathi" msgid "Malay" -msgstr "" +msgstr "Malay" msgid "Maltese" -msgstr "" +msgstr "Maltese" msgid "Burmese" -msgstr "" +msgstr "Burmese" msgid "Nauru" -msgstr "" +msgstr "Nauru" msgid "Nepali" -msgstr "" +msgstr "Nepali" msgid "Ndonga" -msgstr "" +msgstr "Ndonga" msgid "Dutch" msgstr "Dutch" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "Norwegian Nynorsk" msgid "Navaho" -msgstr "" +msgstr "Navaho" -#, fuzzy msgid "Nyanja" -msgstr "Panjabi" +msgstr "Nyanja" msgid "Occitan" -msgstr "" +msgstr "Occitan" msgid "Ojibwe" -msgstr "" +msgstr "Ojibwe" msgid "Oromo" -msgstr "" +msgstr "Oromo" msgid "Odia" -msgstr "" +msgstr "Odia" msgid "Ossetian" -msgstr "" +msgstr "Ossetian" msgid "Panjabi" msgstr "Panjabi" msgid "Pali" -msgstr "" +msgstr "Pali" msgid "Polish" msgstr "Polish" msgid "Pashto" -msgstr "" +msgstr "Pashto" msgid "Portuguese" msgstr "Portuguese" @@ -1650,159 +1642,157 @@ msgid "Portuguese (Portugal)" msgstr "Portuguese (Portugal)" msgid "Quechua" -msgstr "" +msgstr "Quechua" msgid "Romansh" -msgstr "" +msgstr "Romansh" msgid "Rundi" -msgstr "" +msgstr "Rundi" -#, fuzzy msgid "Romanian" -msgstr "Albanian" +msgstr "Romanian" msgid "Russian" msgstr "Russian" msgid "Kinyarwanda" -msgstr "" +msgstr "Kinyarwanda" msgid "Sanskrit" -msgstr "" +msgstr "Sanskrit" -#, fuzzy msgid "Sardinian" -msgstr "Ukrainian" +msgstr "Sardinian" msgid "Sindhi" -msgstr "" +msgstr "Sindhi" msgid "Sango" -msgstr "" +msgstr "Sango" msgid "Sinhala" -msgstr "" +msgstr "Sinhala" msgid "Slovak" -msgstr "" +msgstr "Slovak" msgid "Slovenian" -msgstr "" +msgstr "Slovenian" msgid "Samoan" -msgstr "" +msgstr "Samoan" msgid "Shona" -msgstr "" +msgstr "Shona" msgid "Somali" -msgstr "" +msgstr "Somali" msgid "Albanian" msgstr "Albanian" msgid "Serbian" -msgstr "" +msgstr "Serbian" msgid "Swati" -msgstr "" +msgstr "Swati" msgid "Sundanese" -msgstr "" +msgstr "Sundanese" msgid "Swedish" msgstr "Swedish" msgid "Swahili" -msgstr "" +msgstr "Swahili" msgid "Tamil" -msgstr "" +msgstr "Tamil" msgid "Telugu" -msgstr "" +msgstr "Telugu" msgid "Tajik" -msgstr "" +msgstr "Tajik" msgid "Thai" -msgstr "" +msgstr "Thai" msgid "Tigrinya" -msgstr "" +msgstr "Tigrinya" msgid "Turkmen" -msgstr "" +msgstr "Turkmen" msgid "Tagalog" -msgstr "" +msgstr "Tagalog" msgid "Tswana" -msgstr "" +msgstr "Tswana" msgid "Tongan" -msgstr "" +msgstr "Tongan" msgid "Turkish" msgstr "Turkish" msgid "Tsonga" -msgstr "" +msgstr "Tsonga" msgid "Tatar" -msgstr "" +msgstr "Tatar" msgid "Twi" -msgstr "" +msgstr "Twi" msgid "Tahitian" -msgstr "" +msgstr "Tahitian" msgid "Uyghur" -msgstr "" +msgstr "Uyghur" msgid "Ukrainian" msgstr "Ukrainian" msgid "Urdu" -msgstr "" +msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Uzbek" msgid "Venda" -msgstr "" +msgstr "Venda" msgid "Vietnamese" msgstr "Vietnamese" msgid "Volapük" -msgstr "" +msgstr "Volapük" msgid "Walloon" -msgstr "" +msgstr "Walloon" msgid "Wolof" -msgstr "" +msgstr "Wolof" msgid "Xhosa" -msgstr "" +msgstr "Xhosa" msgid "Yiddish" -msgstr "" +msgstr "Yiddish" msgid "Yoruba" -msgstr "" +msgstr "Yoruba" msgid "Zhuang" -msgstr "" +msgstr "Zhuang" msgid "Chinese (Traditional)" msgstr "Chinese (Traditional)" msgid "Zulu" -msgstr "" +msgstr "Zulu" msgid "(no translation)" msgstr "(no translation)" diff --git a/po/es.po b/po/es.po index dacbb38b..22ca3129 100644 --- a/po/es.po +++ b/po/es.po @@ -13,7 +13,7 @@ msgstr "" "Project-Id-Version: Pure Data 0.53.0\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" "POT-Creation-Date: 2024-07-08 15:19+0200\n" -"PO-Revision-Date: 2024-05-07 19:07+0000\n" +"PO-Revision-Date: 2024-07-08 17:17+0200\n" "Last-Translator: Lucas Cordiviola \n" "Language-Team: Spanish \n" @@ -22,7 +22,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 5.5.4-rc\n" +"X-Generator: Poedit 3.4.4\n" msgid "linear" msgstr "Lineal" @@ -1266,43 +1266,43 @@ msgid "The language can only be set during startup." msgstr "El idioma sólo se puede establecer durante el inicio." msgid "Afar" -msgstr "" +msgstr "Afar" msgid "Abkhazian" -msgstr "" +msgstr "Abjasio" msgid "Avestan" -msgstr "" +msgstr "Avéstico" msgid "Afrikaans" -msgstr "Afrikaans" +msgstr "Afrikáans" msgid "Akan" -msgstr "" +msgstr "Acano" msgid "Amharic" -msgstr "" +msgstr "Amhárico" msgid "Aragonese" -msgstr "" +msgstr "Aragonés" msgid "Arabic" msgstr "Árabe" msgid "Assamese" -msgstr "" +msgstr "Asamés" msgid "Avaric" -msgstr "" +msgstr "Avárico" msgid "Aymara" -msgstr "" +msgstr "Aymará" msgid "Azerbaijani" -msgstr "Azerbaiyano" +msgstr "Azerí" msgid "Bashkir" -msgstr "" +msgstr "Baskir" msgid "Belarusian" msgstr "Bielorruso" @@ -1311,55 +1311,52 @@ msgid "Bulgarian" msgstr "Búlgaro" msgid "Bihari" -msgstr "" +msgstr "Bihari" msgid "Bislama" -msgstr "" +msgstr "Bislama" msgid "Bambara" -msgstr "" +msgstr "Bambara" msgid "Bengali" -msgstr "" +msgstr "Bengalí" msgid "Tibetan" -msgstr "" +msgstr "Tibetano" msgid "Breton" -msgstr "" +msgstr "Bretón" msgid "Bosnian" -msgstr "" +msgstr "Bosnio" -#, fuzzy msgid "Catalan" -msgstr "fatal" +msgstr "Catalán" -#, fuzzy msgid "Chechen" -msgstr "Probar" +msgstr "Checheno" msgid "Chamorro" -msgstr "" +msgstr "Chamorro" msgid "Corsican" -msgstr "" +msgstr "Corso" msgid "Cree" -msgstr "" +msgstr "Cree" msgid "Czech" -msgstr "" +msgstr "Checo" msgid "Chuvash" -msgstr "" +msgstr "Chuvasio" msgid "Welsh" -msgstr "" +msgstr "Galés" -#, fuzzy msgid "Danish" -msgstr "Español" +msgstr "Danés" msgid "German" msgstr "Alemán" @@ -1368,13 +1365,13 @@ msgid "German (Austria)" msgstr "Alemán (Austria)" msgid "Dhivehi" -msgstr "" +msgstr "Maldivo" msgid "Dzongkha" -msgstr "" +msgstr "Butanés" msgid "Ewe" -msgstr "" +msgstr "Ewé" msgid "Greek" msgstr "Griego" @@ -1392,59 +1389,58 @@ msgid "English (USA)" msgstr "Inglés (USA)" msgid "Esperanto" -msgstr "" +msgstr "Esperanto" msgid "Spanish" msgstr "Español" msgid "Estonian" -msgstr "" +msgstr "Estonio" msgid "Basque" msgstr "Vasco" -#, fuzzy msgid "Persian" -msgstr "Versión" +msgstr "Persa" msgid "Fulah" -msgstr "" +msgstr "Fula" msgid "Finnish" -msgstr "Finlandés" +msgstr "Finés" msgid "Fijian" -msgstr "" +msgstr "Fiyiano" msgid "Faroese" -msgstr "" +msgstr "Feroés" msgid "French" msgstr "Francés" msgid "Frisian" -msgstr "" +msgstr "Frisón" msgid "Irish" -msgstr "" +msgstr "Irlandés" msgid "Gaelic" -msgstr "" +msgstr "Gaélico" msgid "Galician" -msgstr "" +msgstr "Gallego" msgid "Guarani" -msgstr "" +msgstr "Guaraní" msgid "Gujarati" -msgstr "Gujarati" +msgstr "Guyaratí" msgid "Manx" -msgstr "" +msgstr "Manés" msgid "Hausa" -msgstr "" +msgstr "Hausa" msgid "Hebrew" msgstr "Hebreo" @@ -1453,13 +1449,13 @@ msgid "Hindi" msgstr "Hindi" msgid "Hiri Motu" -msgstr "" +msgstr "Hiri motu" msgid "Croatian" -msgstr "" +msgstr "Croata" msgid "Haitian" -msgstr "" +msgstr "Criollo haitiano" msgid "Hungarian" msgstr "Húngaro" @@ -1468,194 +1464,190 @@ msgid "Armenian" msgstr "Armenio" msgid "Herero" -msgstr "" +msgstr "Herero" msgid "Interlingua" -msgstr "" +msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesio" msgid "Occidental" -msgstr "" +msgstr "Occidental" msgid "Igbo" -msgstr "" +msgstr "Igbo" msgid "Nuosu" -msgstr "" +msgstr "Yi de Sichuán" msgid "Inupiaq" -msgstr "" +msgstr "Inupiaq" msgid "Ido" -msgstr "" +msgstr "Ido" msgid "Icelandic" -msgstr "" +msgstr "Islandés" msgid "Italian" msgstr "Italiano" msgid "Inuktitut" -msgstr "" +msgstr "Inuktitut" msgid "Japanese" msgstr "Japonés" -#, fuzzy msgid "Javanese" -msgstr "Japonés" +msgstr "Javanés" msgid "Georgian" -msgstr "" +msgstr "Georgiano" msgid "Kongo" -msgstr "" +msgstr "Kongo" msgid "Gikuyu" -msgstr "" +msgstr "Kikuyu" msgid "Kwanyama" -msgstr "" +msgstr "Kuanyama" msgid "Kazakh" -msgstr "" +msgstr "Kazajo" msgid "Greenlandic" -msgstr "" +msgstr "Groenlandés" msgid "Kannada" -msgstr "" +msgstr "Canarés" msgid "Korean" msgstr "Coreano" msgid "Kanuri" -msgstr "" +msgstr "Kanuri" msgid "Kashmiri" -msgstr "" +msgstr "Cachemiro" msgid "Kurdish" -msgstr "" +msgstr "Kurdo" msgid "Komi" -msgstr "" +msgstr "Komi" msgid "Cornish" -msgstr "" +msgstr "Córnico" msgid "Kyrgyz" -msgstr "" +msgstr "Kirguís" msgid "Latin" -msgstr "" +msgstr "Latín" msgid "Luxembourgish" -msgstr "" +msgstr "Luxemburgués" msgid "Luganda" -msgstr "" +msgstr "Luganda" msgid "Limburgish" -msgstr "" +msgstr "Limburgués" msgid "Lingala" -msgstr "" +msgstr "Lingala" -#, fuzzy msgid "Lao" -msgstr "Log" +msgstr "Lao" msgid "Lithuanian" -msgstr "" +msgstr "Lituano" msgid "Luba-Katanga" -msgstr "" +msgstr "Luba oriental" msgid "Latvian" -msgstr "" +msgstr "Letón" msgid "Malagasy" -msgstr "" +msgstr "Malgache" msgid "Marshallese" -msgstr "" +msgstr "Marshalés" msgid "Maori" -msgstr "" +msgstr "Maorí" msgid "Macedonian" -msgstr "" +msgstr "Macedonio" msgid "Malayalam" -msgstr "" +msgstr "Malabar" msgid "Mongolian" -msgstr "" +msgstr "Mongol" -#, fuzzy msgid "Marathi" -msgstr "Gujarati" +msgstr "Maratí" msgid "Malay" -msgstr "" +msgstr "Malayo" msgid "Maltese" -msgstr "" +msgstr "Maltés" msgid "Burmese" -msgstr "" +msgstr "Birmano" msgid "Nauru" -msgstr "" +msgstr "Nauruano" msgid "Nepali" -msgstr "" +msgstr "Nepalí" msgid "Ndonga" -msgstr "" +msgstr "Endonga" msgid "Dutch" -msgstr "Dutch" +msgstr "Holandés" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "Noruego «nynorsk»" msgid "Navaho" -msgstr "" +msgstr "Navajo" -#, fuzzy msgid "Nyanja" -msgstr "Panyabí" +msgstr "Chichewa" msgid "Occitan" -msgstr "" +msgstr "Occitano" msgid "Ojibwe" -msgstr "" +msgstr "Oyibua" msgid "Oromo" -msgstr "" +msgstr "Oromo" msgid "Odia" -msgstr "" +msgstr "Oriya" msgid "Ossetian" -msgstr "" +msgstr "Oseta" msgid "Panjabi" msgstr "Panyabí" msgid "Pali" -msgstr "" +msgstr "Pali" msgid "Polish" msgstr "Polaco" msgid "Pashto" -msgstr "" +msgstr "Pastún" msgid "Portuguese" msgstr "Portugués" @@ -1667,159 +1659,157 @@ msgid "Portuguese (Portugal)" msgstr "Portugués (Portugal)" msgid "Quechua" -msgstr "" +msgstr "Quechua" msgid "Romansh" -msgstr "" +msgstr "Romanche" msgid "Rundi" -msgstr "" +msgstr "Kirundi" -#, fuzzy msgid "Romanian" -msgstr "Albanés" +msgstr "Rumano" msgid "Russian" msgstr "Ruso" msgid "Kinyarwanda" -msgstr "" +msgstr "Kiñaruanda" msgid "Sanskrit" -msgstr "" +msgstr "Sánscrito" -#, fuzzy msgid "Sardinian" -msgstr "Ucraniano" +msgstr "Sardo" msgid "Sindhi" -msgstr "" +msgstr "Sindhi" msgid "Sango" -msgstr "" +msgstr "Sango" msgid "Sinhala" -msgstr "" +msgstr "Cingalés" msgid "Slovak" -msgstr "" +msgstr "Eslovaco" msgid "Slovenian" -msgstr "" +msgstr "Esloveno" msgid "Samoan" -msgstr "" +msgstr "Samoano" msgid "Shona" -msgstr "" +msgstr "Shona" msgid "Somali" -msgstr "" +msgstr "Somalí" msgid "Albanian" msgstr "Albanés" msgid "Serbian" -msgstr "" +msgstr "Serbio" msgid "Swati" -msgstr "" +msgstr "Suazi" msgid "Sundanese" -msgstr "" +msgstr "Sondanés" msgid "Swedish" msgstr "Sueco" msgid "Swahili" -msgstr "" +msgstr "Suajili" msgid "Tamil" -msgstr "" +msgstr "Tamil" msgid "Telugu" -msgstr "" +msgstr "Telugu" msgid "Tajik" -msgstr "" +msgstr "Tayiko" msgid "Thai" -msgstr "" +msgstr "Tailandés" msgid "Tigrinya" -msgstr "" +msgstr "Tigriña" msgid "Turkmen" -msgstr "" +msgstr "Turcomano" msgid "Tagalog" -msgstr "" +msgstr "Tagalo" msgid "Tswana" -msgstr "" +msgstr "Setsuana" msgid "Tongan" -msgstr "" +msgstr "Tongano" msgid "Turkish" msgstr "Turco" msgid "Tsonga" -msgstr "" +msgstr "Tsonga" msgid "Tatar" -msgstr "" +msgstr "Tártaro" msgid "Twi" -msgstr "" +msgstr "Chuí (twi)" msgid "Tahitian" -msgstr "" +msgstr "Tahitiano" msgid "Uyghur" -msgstr "" +msgstr "Uigur" msgid "Ukrainian" msgstr "Ucraniano" msgid "Urdu" -msgstr "" +msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Uzbeko" msgid "Venda" -msgstr "" +msgstr "Venda" msgid "Vietnamese" msgstr "Vietnamita" msgid "Volapük" -msgstr "" +msgstr "Volapük" msgid "Walloon" -msgstr "" +msgstr "Valón" msgid "Wolof" -msgstr "" +msgstr "Wólof" msgid "Xhosa" -msgstr "" +msgstr "Xhosa" msgid "Yiddish" -msgstr "" +msgstr "Yidis" msgid "Yoruba" -msgstr "" +msgstr "Yoruba" msgid "Zhuang" -msgstr "" +msgstr "Chuan (zhuang)" msgid "Chinese (Traditional)" msgstr "Chino (tradicional)" msgid "Zulu" -msgstr "" +msgstr "Zulú" msgid "(no translation)" msgstr "(sin traducciones)" diff --git a/po/fr.po b/po/fr.po index 5868a9fa..6d4758cc 100644 --- a/po/fr.po +++ b/po/fr.po @@ -11,7 +11,7 @@ msgstr "" "Project-Id-Version: Pure Data 0.53-0\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" "POT-Creation-Date: 2024-07-08 15:19+0200\n" -"PO-Revision-Date: 2024-05-07 19:07+0000\n" +"PO-Revision-Date: 2024-07-08 17:18+0200\n" "Last-Translator: baptiste \n" "Language-Team: French \n" @@ -20,7 +20,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 5.5.4-rc\n" +"X-Generator: Poedit 3.4.4\n" msgid "linear" msgstr "linéaire" @@ -1279,43 +1279,43 @@ msgid "The language can only be set during startup." msgstr "Le changement de langue prendra effet au prochain démarrage." msgid "Afar" -msgstr "" +msgstr "Afar" msgid "Abkhazian" -msgstr "" +msgstr "Abkhaze" msgid "Avestan" -msgstr "" +msgstr "Avestique" msgid "Afrikaans" msgstr "Afrikaans" msgid "Akan" -msgstr "" +msgstr "Akan" msgid "Amharic" -msgstr "" +msgstr "Amharique" msgid "Aragonese" -msgstr "" +msgstr "Aragonais" msgid "Arabic" msgstr "Arabe" msgid "Assamese" -msgstr "" +msgstr "Assamais" msgid "Avaric" -msgstr "" +msgstr "Avar" msgid "Aymara" -msgstr "" +msgstr "aymara" msgid "Azerbaijani" msgstr "Azéri" msgid "Bashkir" -msgstr "" +msgstr "Bachkir" msgid "Belarusian" msgstr "Biélorusse" @@ -1324,55 +1324,52 @@ msgid "Bulgarian" msgstr "Bulgare" msgid "Bihari" -msgstr "" +msgstr "Bihari" msgid "Bislama" -msgstr "" +msgstr "Bichelamar" msgid "Bambara" -msgstr "" +msgstr "Bambara" msgid "Bengali" -msgstr "" +msgstr "Bengali" msgid "Tibetan" -msgstr "" +msgstr "Tibétain" msgid "Breton" -msgstr "" +msgstr "Breton" msgid "Bosnian" -msgstr "" +msgstr "Bosniaque" -#, fuzzy msgid "Catalan" -msgstr "fatal" +msgstr "Catalan" -#, fuzzy msgid "Chechen" -msgstr "Vérifier" +msgstr "Tchétchène" msgid "Chamorro" -msgstr "" +msgstr "Chamorro" msgid "Corsican" -msgstr "" +msgstr "Corse" msgid "Cree" -msgstr "" +msgstr "Cri" msgid "Czech" -msgstr "" +msgstr "Tchèque" msgid "Chuvash" -msgstr "" +msgstr "Tchouvache" msgid "Welsh" -msgstr "" +msgstr "Gallois" -#, fuzzy msgid "Danish" -msgstr "Espagnol" +msgstr "Danois" msgid "German" msgstr "Allemand" @@ -1381,13 +1378,13 @@ msgid "German (Austria)" msgstr "Allemand (Autriche)" msgid "Dhivehi" -msgstr "" +msgstr "Maldivien" msgid "Dzongkha" -msgstr "" +msgstr "Dzongkha" msgid "Ewe" -msgstr "" +msgstr "Éwé" msgid "Greek" msgstr "Grec" @@ -1405,59 +1402,58 @@ msgid "English (USA)" msgstr "Anglais (USA)" msgid "Esperanto" -msgstr "" +msgstr "Espéranto" msgid "Spanish" msgstr "Espagnol" msgid "Estonian" -msgstr "" +msgstr "Estonien" msgid "Basque" msgstr "Basque" -#, fuzzy msgid "Persian" -msgstr "Version" +msgstr "Persan" msgid "Fulah" -msgstr "" +msgstr "Peul" msgid "Finnish" msgstr "Finnois" msgid "Fijian" -msgstr "" +msgstr "Fidjien" msgid "Faroese" -msgstr "" +msgstr "Féroïen" msgid "French" msgstr "Français" msgid "Frisian" -msgstr "" +msgstr "Frison occidental" msgid "Irish" -msgstr "" +msgstr "Irlandais" msgid "Gaelic" -msgstr "" +msgstr "Gaélique écossais" msgid "Galician" -msgstr "" +msgstr "Galicien" msgid "Guarani" -msgstr "" +msgstr "Guarani" msgid "Gujarati" -msgstr "Gujarati" +msgstr "Goudjerati" msgid "Manx" -msgstr "" +msgstr "Mannois" msgid "Hausa" -msgstr "" +msgstr "Haoussa" msgid "Hebrew" msgstr "Hébreu" @@ -1466,13 +1462,13 @@ msgid "Hindi" msgstr "Hindi" msgid "Hiri Motu" -msgstr "" +msgstr "Hiri motu" msgid "Croatian" -msgstr "" +msgstr "Croate" msgid "Haitian" -msgstr "" +msgstr "Créole haïtien" msgid "Hungarian" msgstr "Hongrois" @@ -1481,194 +1477,190 @@ msgid "Armenian" msgstr "Arménien" msgid "Herero" -msgstr "" +msgstr "Héréro" msgid "Interlingua" -msgstr "" +msgstr "Interlingua" msgid "Indonesian" msgstr "Indonésien" msgid "Occidental" -msgstr "" +msgstr "Interlingue" msgid "Igbo" -msgstr "" +msgstr "Igbo" msgid "Nuosu" -msgstr "" +msgstr "Yi du Sichuan" msgid "Inupiaq" -msgstr "" +msgstr "Inupiaq" msgid "Ido" -msgstr "" +msgstr "Ido" msgid "Icelandic" -msgstr "" +msgstr "Islandais" msgid "Italian" msgstr "Italien" msgid "Inuktitut" -msgstr "" +msgstr "Inuktitut" msgid "Japanese" msgstr "Japonais" -#, fuzzy msgid "Javanese" -msgstr "Japonais" +msgstr "Javanais" msgid "Georgian" -msgstr "" +msgstr "Géorgien" msgid "Kongo" -msgstr "" +msgstr "Kikongo" msgid "Gikuyu" -msgstr "" +msgstr "Kikuyu" msgid "Kwanyama" -msgstr "" +msgstr "Kuanyama" msgid "Kazakh" -msgstr "" +msgstr "Kazakh" msgid "Greenlandic" -msgstr "" +msgstr "Groenlandais" msgid "Kannada" -msgstr "" +msgstr "Kannada" msgid "Korean" msgstr "Coréen" msgid "Kanuri" -msgstr "" +msgstr "Kanouri" msgid "Kashmiri" -msgstr "" +msgstr "Cachemiri" msgid "Kurdish" -msgstr "" +msgstr "Kurde" msgid "Komi" -msgstr "" +msgstr "Komi" msgid "Cornish" -msgstr "" +msgstr "Cornique" msgid "Kyrgyz" -msgstr "" +msgstr "Kirghize" msgid "Latin" -msgstr "" +msgstr "Latin" msgid "Luxembourgish" -msgstr "" +msgstr "Luxembourgeois" msgid "Luganda" -msgstr "" +msgstr "Ganda" msgid "Limburgish" -msgstr "" +msgstr "Limbourgeois" msgid "Lingala" -msgstr "" +msgstr "Lingala" -#, fuzzy msgid "Lao" -msgstr "Journal" +msgstr "Lao" msgid "Lithuanian" -msgstr "" +msgstr "Lituanien" msgid "Luba-Katanga" -msgstr "" +msgstr "Luba-katanga" msgid "Latvian" -msgstr "" +msgstr "Letton" msgid "Malagasy" -msgstr "" +msgstr "Malgache" msgid "Marshallese" -msgstr "" +msgstr "Marshallais" msgid "Maori" -msgstr "" +msgstr "Maori" msgid "Macedonian" -msgstr "" +msgstr "Macédonien" msgid "Malayalam" -msgstr "" +msgstr "Malayalam" msgid "Mongolian" -msgstr "" +msgstr "Mongol" -#, fuzzy msgid "Marathi" -msgstr "Gujarati" +msgstr "Marathi" msgid "Malay" -msgstr "" +msgstr "Malais" msgid "Maltese" -msgstr "" +msgstr "Maltais" msgid "Burmese" -msgstr "" +msgstr "Birman" msgid "Nauru" -msgstr "" +msgstr "Nauruan" msgid "Nepali" -msgstr "" +msgstr "Népalais" msgid "Ndonga" -msgstr "" +msgstr "Ndonga" msgid "Dutch" msgstr "Néerlandais" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "Norvégien nynorsk" msgid "Navaho" -msgstr "" +msgstr "Navajo" -#, fuzzy msgid "Nyanja" -msgstr "Pendjabi" +msgstr "Chewa" msgid "Occitan" -msgstr "" +msgstr "Occitan" msgid "Ojibwe" -msgstr "" +msgstr "Ojibwa" msgid "Oromo" -msgstr "" +msgstr "Oromo" msgid "Odia" -msgstr "" +msgstr "Odia" msgid "Ossetian" -msgstr "" +msgstr "Ossète" msgid "Panjabi" msgstr "Pendjabi" msgid "Pali" -msgstr "" +msgstr "Pali" msgid "Polish" msgstr "Polonais" msgid "Pashto" -msgstr "" +msgstr "Pachto" msgid "Portuguese" msgstr "Portugais" @@ -1680,159 +1672,157 @@ msgid "Portuguese (Portugal)" msgstr "Portugais (Portugal)" msgid "Quechua" -msgstr "" +msgstr "Quechua" msgid "Romansh" -msgstr "" +msgstr "Romanche" msgid "Rundi" -msgstr "" +msgstr "Roundi" -#, fuzzy msgid "Romanian" -msgstr "Albanais" +msgstr "Roumain" msgid "Russian" msgstr "Russe" msgid "Kinyarwanda" -msgstr "" +msgstr "Kinyarwanda" msgid "Sanskrit" -msgstr "" +msgstr "Sanskrit" -#, fuzzy msgid "Sardinian" -msgstr "Ukrainien" +msgstr "Sarde" msgid "Sindhi" -msgstr "" +msgstr "Sindhi" msgid "Sango" -msgstr "" +msgstr "Sango" msgid "Sinhala" -msgstr "" +msgstr "Cingalais" msgid "Slovak" -msgstr "" +msgstr "Slovaque" msgid "Slovenian" -msgstr "" +msgstr "Slovène" msgid "Samoan" -msgstr "" +msgstr "Samoan" msgid "Shona" -msgstr "" +msgstr "Shona" msgid "Somali" -msgstr "" +msgstr "Somali" msgid "Albanian" msgstr "Albanais" msgid "Serbian" -msgstr "" +msgstr "Serbe" msgid "Swati" -msgstr "" +msgstr "Swati" msgid "Sundanese" -msgstr "" +msgstr "Soundanais" msgid "Swedish" msgstr "Suédois" msgid "Swahili" -msgstr "" +msgstr "Swahili" msgid "Tamil" -msgstr "" +msgstr "Tamoul" msgid "Telugu" -msgstr "" +msgstr "Télougou" msgid "Tajik" -msgstr "" +msgstr "Tadjik" msgid "Thai" -msgstr "" +msgstr "Thaï" msgid "Tigrinya" -msgstr "" +msgstr "Tigrigna" msgid "Turkmen" -msgstr "" +msgstr "Turkmène" msgid "Tagalog" -msgstr "" +msgstr "Tagalog" msgid "Tswana" -msgstr "" +msgstr "Tswana" msgid "Tongan" -msgstr "" +msgstr "Tongien" msgid "Turkish" msgstr "Turc" msgid "Tsonga" -msgstr "" +msgstr "Tsonga" msgid "Tatar" -msgstr "" +msgstr "Tatar" msgid "Twi" -msgstr "" +msgstr "Twi" msgid "Tahitian" -msgstr "" +msgstr "Tahitien" msgid "Uyghur" -msgstr "" +msgstr "Ouïghour" msgid "Ukrainian" msgstr "Ukrainien" msgid "Urdu" -msgstr "" +msgstr "Ourdou" msgid "Uzbek" -msgstr "" +msgstr "Ouzbek" msgid "Venda" -msgstr "" +msgstr "Venda" msgid "Vietnamese" msgstr "Vietnamien" msgid "Volapük" -msgstr "" +msgstr "Volapük" msgid "Walloon" -msgstr "" +msgstr "Wallon" msgid "Wolof" -msgstr "" +msgstr "Wolof" msgid "Xhosa" -msgstr "" +msgstr "Xhosa" msgid "Yiddish" -msgstr "" +msgstr "Yiddish" msgid "Yoruba" -msgstr "" +msgstr "Yoruba" msgid "Zhuang" -msgstr "" +msgstr "Zhuang" msgid "Chinese (Traditional)" msgstr "Chinois (traditionnel)" msgid "Zulu" -msgstr "" +msgstr "Zoulou" msgid "(no translation)" msgstr "(pas de traduction)" diff --git a/po/he.po b/po/he.po index 2b62b836..72c26c48 100644 --- a/po/he.po +++ b/po/he.po @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: Pure Data 0.53.1\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" "POT-Creation-Date: 2024-07-08 15:19+0200\n" -"PO-Revision-Date: 2023-07-01 07:53+0000\n" +"PO-Revision-Date: 2024-07-08 17:19+0200\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" @@ -16,7 +16,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 5.0-dev\n" +"X-Generator: Poedit 3.4.4\n" msgid "linear" msgstr "קווי" @@ -1248,100 +1248,97 @@ msgid "The language can only be set during startup." msgstr "" msgid "Afar" -msgstr "" +msgstr "עפרית" msgid "Abkhazian" -msgstr "" +msgstr "אבחזית" msgid "Avestan" -msgstr "" +msgstr "אבסטית" msgid "Afrikaans" msgstr "אפריקאנס" msgid "Akan" -msgstr "" +msgstr "אקאן" msgid "Amharic" -msgstr "" +msgstr "אמהרית" msgid "Aragonese" -msgstr "" +msgstr "אראגונית" msgid "Arabic" msgstr "ערבית" msgid "Assamese" -msgstr "" +msgstr "אסאמית" msgid "Avaric" -msgstr "" +msgstr "אווארית" msgid "Aymara" -msgstr "" +msgstr "איימארית" msgid "Azerbaijani" msgstr "אזרית" msgid "Bashkir" -msgstr "" +msgstr "בשקירית" msgid "Belarusian" -msgstr "בלרוסית" +msgstr "בלארוסית" msgid "Bulgarian" msgstr "בולגרית" msgid "Bihari" -msgstr "" +msgstr "ביהרית" msgid "Bislama" -msgstr "" +msgstr "ביסלמה" msgid "Bambara" -msgstr "" +msgstr "במברה" msgid "Bengali" -msgstr "" +msgstr "בנגלית" msgid "Tibetan" -msgstr "" +msgstr "טיבטית" msgid "Breton" -msgstr "" +msgstr "ברטונית" msgid "Bosnian" -msgstr "" +msgstr "בוסנית" -#, fuzzy msgid "Catalan" -msgstr "מכריע" +msgstr "קטלאנית" -#, fuzzy msgid "Chechen" -msgstr "בדיקה" +msgstr "צ׳צ׳נית" msgid "Chamorro" -msgstr "" +msgstr "צ׳אמורו" msgid "Corsican" -msgstr "" +msgstr "קורסיקאית" msgid "Cree" -msgstr "" +msgstr "קרי" msgid "Czech" -msgstr "" +msgstr "צ׳כית" msgid "Chuvash" -msgstr "" +msgstr "צ׳ובשית" msgid "Welsh" -msgstr "" +msgstr "ולשית" -#, fuzzy msgid "Danish" -msgstr "ספרדית" +msgstr "דנית" msgid "German" msgstr "גרמנית" @@ -1350,13 +1347,13 @@ msgid "German (Austria)" msgstr "גרמנית אוסטרית" msgid "Dhivehi" -msgstr "" +msgstr "דיבהי" msgid "Dzongkha" -msgstr "" +msgstr "דזונגקה" msgid "Ewe" -msgstr "" +msgstr "אווה" msgid "Greek" msgstr "יוונית" @@ -1374,74 +1371,73 @@ msgid "English (USA)" msgstr "אנגלית אמריקאית" msgid "Esperanto" -msgstr "" +msgstr "אספרנטו" msgid "Spanish" msgstr "ספרדית" msgid "Estonian" -msgstr "" +msgstr "אסטונית" msgid "Basque" msgstr "בסקית" -#, fuzzy msgid "Persian" -msgstr "גרסה" +msgstr "פרסית" msgid "Fulah" -msgstr "" +msgstr "פולאני" msgid "Finnish" msgstr "פינית" msgid "Fijian" -msgstr "" +msgstr "פיג׳ית" msgid "Faroese" -msgstr "" +msgstr "פארואזית" msgid "French" msgstr "צרפתית" msgid "Frisian" -msgstr "" +msgstr "פריזית" msgid "Irish" -msgstr "" +msgstr "אירית" msgid "Gaelic" -msgstr "" +msgstr "גאלית" msgid "Galician" -msgstr "" +msgstr "גליסית" msgid "Guarani" -msgstr "" +msgstr "גוארני" msgid "Gujarati" -msgstr "גוג׳ראטית" +msgstr "גוג׳ראטי" msgid "Manx" -msgstr "" +msgstr "מאנית" msgid "Hausa" -msgstr "" +msgstr "האוסה" msgid "Hebrew" msgstr "עברית" msgid "Hindi" -msgstr "הינדי" +msgstr "הינדית" msgid "Hiri Motu" -msgstr "" +msgstr "הירי מוטו" msgid "Croatian" -msgstr "" +msgstr "קרואטית" msgid "Haitian" -msgstr "" +msgstr "האיטית" msgid "Hungarian" msgstr "הונגרית" @@ -1450,194 +1446,190 @@ msgid "Armenian" msgstr "ארמנית" msgid "Herero" -msgstr "" +msgstr "הררו" msgid "Interlingua" -msgstr "" +msgstr "אינטרלינגואה" msgid "Indonesian" msgstr "אינדונזית" msgid "Occidental" -msgstr "" +msgstr "אוקסידנטלית" msgid "Igbo" -msgstr "" +msgstr "איגבו" msgid "Nuosu" -msgstr "" +msgstr "נואוסו" msgid "Inupiaq" -msgstr "" +msgstr "אינופיאק" msgid "Ido" -msgstr "" +msgstr "אידו" msgid "Icelandic" -msgstr "" +msgstr "איסלנדית" msgid "Italian" msgstr "איטלקית" msgid "Inuktitut" -msgstr "" +msgstr "אינוקטיטוט" msgid "Japanese" msgstr "יפנית" -#, fuzzy msgid "Javanese" -msgstr "יפנית" +msgstr "ג׳אווה" msgid "Georgian" -msgstr "" +msgstr "גאורגית" msgid "Kongo" -msgstr "" +msgstr "קונגו" msgid "Gikuyu" -msgstr "" +msgstr "קיקויו" msgid "Kwanyama" -msgstr "" +msgstr "קואניאמה" msgid "Kazakh" -msgstr "" +msgstr "קזחית" msgid "Greenlandic" -msgstr "" +msgstr "גרינלנדית" msgid "Kannada" -msgstr "" +msgstr "קאנדה" msgid "Korean" msgstr "קוריאנית" msgid "Kanuri" -msgstr "" +msgstr "קאנורי" msgid "Kashmiri" -msgstr "" +msgstr "קשמירית" msgid "Kurdish" -msgstr "" +msgstr "כורדית" msgid "Komi" -msgstr "" +msgstr "קומי" msgid "Cornish" -msgstr "" +msgstr "קורנית" msgid "Kyrgyz" -msgstr "" +msgstr "קירגיזית" msgid "Latin" -msgstr "" +msgstr "לטינית" msgid "Luxembourgish" -msgstr "" +msgstr "לוקסמבורגית" msgid "Luganda" -msgstr "" +msgstr "לוגנדה" msgid "Limburgish" -msgstr "" +msgstr "לימבורגית" msgid "Lingala" -msgstr "" +msgstr "לינגאלה" -#, fuzzy msgid "Lao" -msgstr "יומן" +msgstr "לאו" msgid "Lithuanian" -msgstr "" +msgstr "ליטאית" msgid "Luba-Katanga" -msgstr "" +msgstr "לובה קטנגה" msgid "Latvian" -msgstr "" +msgstr "לטבית" msgid "Malagasy" -msgstr "" +msgstr "מלגשית" msgid "Marshallese" -msgstr "" +msgstr "מרשלית" msgid "Maori" -msgstr "" +msgstr "מאורית" msgid "Macedonian" -msgstr "" +msgstr "מקדונית" msgid "Malayalam" -msgstr "" +msgstr "מלאיאלאם" msgid "Mongolian" -msgstr "" +msgstr "מונגולית" -#, fuzzy msgid "Marathi" -msgstr "גוג׳ראטית" +msgstr "מראטהית" msgid "Malay" -msgstr "" +msgstr "מלאית" msgid "Maltese" -msgstr "" +msgstr "מלטית" msgid "Burmese" -msgstr "" +msgstr "בורמזית" msgid "Nauru" -msgstr "" +msgstr "נאורית" msgid "Nepali" -msgstr "" +msgstr "נפאלית" msgid "Ndonga" -msgstr "" +msgstr "נדונגה" msgid "Dutch" msgstr "הולנדית" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "נורווגית חדשה (נינורשק)" msgid "Navaho" -msgstr "" +msgstr "נאוואחו" -#, fuzzy msgid "Nyanja" -msgstr "פנג׳אבי" +msgstr "צי׳אווה" msgid "Occitan" -msgstr "" +msgstr "אוקסיטנית" msgid "Ojibwe" -msgstr "" +msgstr "אוג׳יבווה" msgid "Oromo" -msgstr "" +msgstr "אורומו" msgid "Odia" -msgstr "" +msgstr "אורייה" msgid "Ossetian" -msgstr "" +msgstr "אוסטית" msgid "Panjabi" msgstr "פנג׳אבי" msgid "Pali" -msgstr "" +msgstr "פאלי" msgid "Polish" msgstr "פולנית" msgid "Pashto" -msgstr "" +msgstr "פשטו" msgid "Portuguese" msgstr "פורטוגלית" @@ -1646,162 +1638,160 @@ msgid "Portuguese (Brazil)" msgstr "פורטוגלית ברזילאית" msgid "Portuguese (Portugal)" -msgstr "פורטוגלית (פורטוגל)" +msgstr "פורטוגלית של פורטוגל" msgid "Quechua" -msgstr "" +msgstr "קצ׳ואה" msgid "Romansh" -msgstr "" +msgstr "רומאנש" msgid "Rundi" -msgstr "" +msgstr "קירונדי" -#, fuzzy msgid "Romanian" -msgstr "אלבנית" +msgstr "רומנית" msgid "Russian" msgstr "רוסית" msgid "Kinyarwanda" -msgstr "" +msgstr "קינירואנדה" msgid "Sanskrit" -msgstr "" +msgstr "סנסקריט" -#, fuzzy msgid "Sardinian" -msgstr "אוקראינית" +msgstr "סרדינית" msgid "Sindhi" -msgstr "" +msgstr "סינדהי" msgid "Sango" -msgstr "" +msgstr "סנגו" msgid "Sinhala" -msgstr "" +msgstr "סינהלית" msgid "Slovak" -msgstr "" +msgstr "סלובקית" msgid "Slovenian" -msgstr "" +msgstr "סלובנית" msgid "Samoan" -msgstr "" +msgstr "סמואית" msgid "Shona" -msgstr "" +msgstr "שונה" msgid "Somali" -msgstr "" +msgstr "סומלית" msgid "Albanian" msgstr "אלבנית" msgid "Serbian" -msgstr "" +msgstr "סרבית" msgid "Swati" -msgstr "" +msgstr "סיסוואטי" msgid "Sundanese" -msgstr "" +msgstr "סונדנית" msgid "Swedish" msgstr "שוודית" msgid "Swahili" -msgstr "" +msgstr "סווהילי" msgid "Tamil" -msgstr "" +msgstr "טמילית" msgid "Telugu" -msgstr "" +msgstr "טלוגו" msgid "Tajik" -msgstr "" +msgstr "טג׳יקית" msgid "Thai" -msgstr "" +msgstr "תאית" msgid "Tigrinya" -msgstr "" +msgstr "תגרית" msgid "Turkmen" -msgstr "" +msgstr "טורקמנית" msgid "Tagalog" -msgstr "" +msgstr "טאגאלוג" msgid "Tswana" -msgstr "" +msgstr "טסואנה" msgid "Tongan" -msgstr "" +msgstr "טונגאית" msgid "Turkish" msgstr "טורקית" msgid "Tsonga" -msgstr "" +msgstr "צונגה" msgid "Tatar" -msgstr "" +msgstr "טטרית" msgid "Twi" -msgstr "" +msgstr "טווי" msgid "Tahitian" -msgstr "" +msgstr "טהיטית" msgid "Uyghur" -msgstr "" +msgstr "אויגור" msgid "Ukrainian" msgstr "אוקראינית" msgid "Urdu" -msgstr "" +msgstr "אורדו" msgid "Uzbek" -msgstr "" +msgstr "אוזבקית" msgid "Venda" -msgstr "" +msgstr "ונדה" msgid "Vietnamese" msgstr "וייטנאמית" msgid "Volapük" -msgstr "" +msgstr "וולאפיק" msgid "Walloon" -msgstr "" +msgstr "ולונית" msgid "Wolof" -msgstr "" +msgstr "וולוף" msgid "Xhosa" -msgstr "" +msgstr "׳קוסה" msgid "Yiddish" -msgstr "" +msgstr "יידיש" msgid "Yoruba" -msgstr "" +msgstr "יורובה" msgid "Zhuang" -msgstr "" +msgstr "ג׳ואנג" msgid "Chinese (Traditional)" msgstr "סינית מסורתית" msgid "Zulu" -msgstr "" +msgstr "זולו" msgid "(no translation)" msgstr "(אין תרגום)" diff --git a/po/hu.po b/po/hu.po index 2a63f19c..15dc5442 100644 --- a/po/hu.po +++ b/po/hu.po @@ -1279,121 +1279,121 @@ msgid "The language can only be set during startup." msgstr "" msgid "Afar" -msgstr "" +msgstr "Afar" msgid "Abkhazian" -msgstr "" +msgstr "Abház" msgid "Avestan" -msgstr "" +msgstr "Avesztán" msgid "Afrikaans" -msgstr "" +msgstr "Afrikaans" msgid "Akan" -msgstr "" +msgstr "Akan" msgid "Amharic" -msgstr "" +msgstr "Amhara" msgid "Aragonese" -msgstr "" +msgstr "Aragóniai" msgid "Arabic" -msgstr "" +msgstr "Arab" msgid "Assamese" -msgstr "" +msgstr "Asszámi" msgid "Avaric" -msgstr "" +msgstr "Avar" msgid "Aymara" -msgstr "" +msgstr "Aymara" msgid "Azerbaijani" -msgstr "" +msgstr "Azeri" msgid "Bashkir" -msgstr "" +msgstr "Baskír" msgid "Belarusian" -msgstr "" +msgstr "Belorusz" msgid "Bulgarian" -msgstr "" +msgstr "Bolgár" msgid "Bihari" -msgstr "" +msgstr "Bihári" msgid "Bislama" -msgstr "" +msgstr "Biszlama" msgid "Bambara" -msgstr "" +msgstr "Bambara" msgid "Bengali" -msgstr "" +msgstr "Bengáli" msgid "Tibetan" -msgstr "" +msgstr "Tibeti" msgid "Breton" -msgstr "" +msgstr "Breton" msgid "Bosnian" -msgstr "" +msgstr "Bosnyák" msgid "Catalan" -msgstr "" +msgstr "Katalán" msgid "Chechen" -msgstr "" +msgstr "Csecsen" msgid "Chamorro" -msgstr "" +msgstr "Csamorro" msgid "Corsican" -msgstr "" +msgstr "Korzikai" msgid "Cree" -msgstr "" +msgstr "Krí" msgid "Czech" -msgstr "" +msgstr "Cseh" msgid "Chuvash" -msgstr "" +msgstr "Csuvas" msgid "Welsh" -msgstr "" +msgstr "Walesi" msgid "Danish" -msgstr "" +msgstr "Dán" msgid "German" -msgstr "" +msgstr "Német" msgid "German (Austria)" -msgstr "" +msgstr "Német (Ausztria)" msgid "Dhivehi" -msgstr "" +msgstr "Divehi" msgid "Dzongkha" -msgstr "" +msgstr "Dzsonga" msgid "Ewe" -msgstr "" +msgstr "Eve" msgid "Greek" -msgstr "" +msgstr "Görög" msgid "English" -msgstr "" +msgstr "Angol" msgid "English (Canada)" -msgstr "" +msgstr "Angol (Kanada)" msgid "English (UK)" msgstr "" @@ -1402,427 +1402,427 @@ msgid "English (USA)" msgstr "" msgid "Esperanto" -msgstr "" +msgstr "Eszperantó" msgid "Spanish" -msgstr "" +msgstr "Spanyol" msgid "Estonian" -msgstr "" +msgstr "Észt" msgid "Basque" -msgstr "" +msgstr "Baszk" msgid "Persian" -msgstr "" +msgstr "Perzsa" msgid "Fulah" -msgstr "" +msgstr "Ful" msgid "Finnish" -msgstr "" +msgstr "Finn" msgid "Fijian" -msgstr "" +msgstr "Fidzsi" msgid "Faroese" -msgstr "" +msgstr "Feröeri" msgid "French" -msgstr "" +msgstr "Francia" msgid "Frisian" -msgstr "" +msgstr "Fríz" msgid "Irish" -msgstr "" +msgstr "Ír" msgid "Gaelic" -msgstr "" +msgstr "Skót gael" msgid "Galician" -msgstr "" +msgstr "Galiciai" msgid "Guarani" -msgstr "" +msgstr "Guarani" msgid "Gujarati" -msgstr "" +msgstr "Gudzsaráti" msgid "Manx" -msgstr "" +msgstr "Manx" msgid "Hausa" -msgstr "" +msgstr "Hausza" msgid "Hebrew" -msgstr "" +msgstr "Héber" msgid "Hindi" -msgstr "" +msgstr "Hindi" msgid "Hiri Motu" -msgstr "" +msgstr "Hiri motu" msgid "Croatian" -msgstr "" +msgstr "Horvát" msgid "Haitian" -msgstr "" +msgstr "Haiti" msgid "Hungarian" -msgstr "" +msgstr "Magyar" msgid "Armenian" -msgstr "" +msgstr "Örmény" msgid "Herero" -msgstr "" +msgstr "Herero" msgid "Interlingua" -msgstr "" +msgstr "Interlingva" msgid "Indonesian" -msgstr "" +msgstr "Indonéz" msgid "Occidental" -msgstr "" +msgstr "Occidental" msgid "Igbo" -msgstr "" +msgstr "Igbó" msgid "Nuosu" -msgstr "" +msgstr "Nuoszu" msgid "Inupiaq" -msgstr "" +msgstr "Inupiak" msgid "Ido" -msgstr "" +msgstr "Ido" msgid "Icelandic" -msgstr "" +msgstr "Izlandi" msgid "Italian" -msgstr "" +msgstr "Olasz" msgid "Inuktitut" -msgstr "" +msgstr "Inuktitut" msgid "Japanese" -msgstr "" +msgstr "Japán" msgid "Javanese" -msgstr "" +msgstr "Jávai" msgid "Georgian" -msgstr "" +msgstr "Grúz" msgid "Kongo" -msgstr "" +msgstr "Kongo" msgid "Gikuyu" -msgstr "" +msgstr "Kikuju" msgid "Kwanyama" -msgstr "" +msgstr "Kvanyama" msgid "Kazakh" -msgstr "" +msgstr "Kazak" msgid "Greenlandic" -msgstr "" +msgstr "Grönlandi" msgid "Kannada" -msgstr "" +msgstr "Kannada" msgid "Korean" -msgstr "" +msgstr "Koreai" msgid "Kanuri" -msgstr "" +msgstr "Kanuri" msgid "Kashmiri" -msgstr "" +msgstr "Kasmíri" msgid "Kurdish" -msgstr "" +msgstr "Kurd" msgid "Komi" -msgstr "" +msgstr "Komi" msgid "Cornish" -msgstr "" +msgstr "Korni" msgid "Kyrgyz" -msgstr "" +msgstr "Kirgiz" msgid "Latin" -msgstr "" +msgstr "Latin" msgid "Luxembourgish" -msgstr "" +msgstr "Luxemburgi" msgid "Luganda" -msgstr "" +msgstr "Luganda" msgid "Limburgish" -msgstr "" +msgstr "Limburgi" msgid "Lingala" -msgstr "" +msgstr "Lingala" msgid "Lao" -msgstr "" +msgstr "Lao" msgid "Lithuanian" -msgstr "" +msgstr "Litván" msgid "Luba-Katanga" -msgstr "" +msgstr "Luba-katanga" msgid "Latvian" -msgstr "" +msgstr "Lett" msgid "Malagasy" -msgstr "" +msgstr "Malgas" msgid "Marshallese" -msgstr "" +msgstr "Marshall-szigeteki" msgid "Maori" -msgstr "" +msgstr "Maori" msgid "Macedonian" -msgstr "" +msgstr "Macedón" msgid "Malayalam" -msgstr "" +msgstr "Malajálam" msgid "Mongolian" -msgstr "" +msgstr "Mongol" msgid "Marathi" -msgstr "" +msgstr "Maráthi" msgid "Malay" -msgstr "" +msgstr "Maláj" msgid "Maltese" -msgstr "" +msgstr "Máltai" msgid "Burmese" -msgstr "" +msgstr "Burmai" msgid "Nauru" -msgstr "" +msgstr "Naurui" msgid "Nepali" -msgstr "" +msgstr "Nepáli" msgid "Ndonga" -msgstr "" +msgstr "Ndonga" msgid "Dutch" -msgstr "" +msgstr "Holland" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "Norvég nynorsk" msgid "Navaho" -msgstr "" +msgstr "Navahó" msgid "Nyanja" -msgstr "" +msgstr "Nyandzsa" msgid "Occitan" -msgstr "" +msgstr "Okcitán" msgid "Ojibwe" -msgstr "" +msgstr "Odzsibva" msgid "Oromo" -msgstr "" +msgstr "Oromó" msgid "Odia" -msgstr "" +msgstr "Odia" msgid "Ossetian" -msgstr "" +msgstr "Oszét" msgid "Panjabi" msgstr "" msgid "Pali" -msgstr "" +msgstr "Pali" msgid "Polish" -msgstr "" +msgstr "Lengyel" msgid "Pashto" -msgstr "" +msgstr "Pastu" msgid "Portuguese" -msgstr "" +msgstr "Portugál" msgid "Portuguese (Brazil)" -msgstr "" +msgstr "Portugál (Brazília)" msgid "Portuguese (Portugal)" -msgstr "" +msgstr "Portugál (Portugália)" msgid "Quechua" -msgstr "" +msgstr "Kecsua" msgid "Romansh" -msgstr "" +msgstr "Romans" msgid "Rundi" -msgstr "" +msgstr "Rundi" msgid "Romanian" -msgstr "" +msgstr "Román" msgid "Russian" -msgstr "" +msgstr "Orosz" msgid "Kinyarwanda" -msgstr "" +msgstr "Kinyarvanda" msgid "Sanskrit" -msgstr "" +msgstr "Szanszkrit" msgid "Sardinian" -msgstr "" +msgstr "Szardíniai" msgid "Sindhi" -msgstr "" +msgstr "Szindhi" msgid "Sango" -msgstr "" +msgstr "Szangó" msgid "Sinhala" -msgstr "" +msgstr "Szingaléz" msgid "Slovak" -msgstr "" +msgstr "Szlovák" msgid "Slovenian" -msgstr "" +msgstr "Szlovén" msgid "Samoan" -msgstr "" +msgstr "Szamoai" msgid "Shona" -msgstr "" +msgstr "Sona" msgid "Somali" -msgstr "" +msgstr "Szomáli" msgid "Albanian" -msgstr "" +msgstr "Albán" msgid "Serbian" -msgstr "" +msgstr "Szerb" msgid "Swati" -msgstr "" +msgstr "Szvázi" msgid "Sundanese" -msgstr "" +msgstr "Szundanéz" msgid "Swedish" -msgstr "" +msgstr "Svéd" msgid "Swahili" -msgstr "" +msgstr "Szuahéli" msgid "Tamil" -msgstr "" +msgstr "Tamil" msgid "Telugu" -msgstr "" +msgstr "Telugu" msgid "Tajik" -msgstr "" +msgstr "Tádzsik" msgid "Thai" -msgstr "" +msgstr "Thai" msgid "Tigrinya" -msgstr "" +msgstr "Tigrinya" msgid "Turkmen" -msgstr "" +msgstr "Türkmén" msgid "Tagalog" -msgstr "" +msgstr "Tagalog" msgid "Tswana" -msgstr "" +msgstr "Csvana" msgid "Tongan" -msgstr "" +msgstr "Tongai" msgid "Turkish" -msgstr "" +msgstr "Török" msgid "Tsonga" -msgstr "" +msgstr "Conga" msgid "Tatar" -msgstr "" +msgstr "Tatár" msgid "Twi" -msgstr "" +msgstr "Tvi" msgid "Tahitian" -msgstr "" +msgstr "Tahiti" msgid "Uyghur" -msgstr "" +msgstr "Ujgur" msgid "Ukrainian" -msgstr "" +msgstr "Ukrán" msgid "Urdu" -msgstr "" +msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Üzbég" msgid "Venda" -msgstr "" +msgstr "Venda" msgid "Vietnamese" -msgstr "" +msgstr "Vietnámi" msgid "Volapük" -msgstr "" +msgstr "Volapük" msgid "Walloon" -msgstr "" +msgstr "Vallon" msgid "Wolof" -msgstr "" +msgstr "Volof" msgid "Xhosa" -msgstr "" +msgstr "Xhosza" msgid "Yiddish" -msgstr "" +msgstr "Jiddis" msgid "Yoruba" -msgstr "" +msgstr "Joruba" msgid "Zhuang" -msgstr "" +msgstr "Csuang" msgid "Chinese (Traditional)" msgstr "" msgid "Zulu" -msgstr "" +msgstr "Zulu" msgid "(no translation)" msgstr "" diff --git a/po/id.po b/po/id.po index 34390b86..16ce0e1c 100644 --- a/po/id.po +++ b/po/id.po @@ -1237,121 +1237,121 @@ msgid "The language can only be set during startup." msgstr "" msgid "Afar" -msgstr "" +msgstr "Afar" msgid "Abkhazian" -msgstr "" +msgstr "Abkhazia" msgid "Avestan" -msgstr "" +msgstr "Avesta" msgid "Afrikaans" -msgstr "" +msgstr "Afrikaans" msgid "Akan" -msgstr "" +msgstr "Akan" msgid "Amharic" -msgstr "" +msgstr "Amharic" msgid "Aragonese" -msgstr "" +msgstr "Aragon" msgid "Arabic" -msgstr "" +msgstr "Arab" msgid "Assamese" -msgstr "" +msgstr "Assam" msgid "Avaric" -msgstr "" +msgstr "Avar" msgid "Aymara" -msgstr "" +msgstr "Aymara" msgid "Azerbaijani" -msgstr "" +msgstr "Azerbaijan" msgid "Bashkir" -msgstr "" +msgstr "Bashkir" msgid "Belarusian" -msgstr "" +msgstr "Belarusia" msgid "Bulgarian" -msgstr "" +msgstr "Bulgaria" msgid "Bihari" -msgstr "" +msgstr "Bihari" msgid "Bislama" -msgstr "" +msgstr "Bislama" msgid "Bambara" -msgstr "" +msgstr "Bambara" msgid "Bengali" -msgstr "" +msgstr "Bengali" msgid "Tibetan" -msgstr "" +msgstr "Tibet" msgid "Breton" -msgstr "" +msgstr "Breton" msgid "Bosnian" -msgstr "" +msgstr "Bosnia" msgid "Catalan" -msgstr "" +msgstr "Katala" msgid "Chechen" -msgstr "" +msgstr "Chechnya" msgid "Chamorro" -msgstr "" +msgstr "Chamorro" msgid "Corsican" -msgstr "" +msgstr "Korsika" msgid "Cree" -msgstr "" +msgstr "Cree" msgid "Czech" -msgstr "" +msgstr "Ceko" msgid "Chuvash" -msgstr "" +msgstr "Chuvash" msgid "Welsh" -msgstr "" +msgstr "Wales" msgid "Danish" -msgstr "" +msgstr "Denmark" msgid "German" -msgstr "" +msgstr "Jerman" msgid "German (Austria)" -msgstr "" +msgstr "Jerman (Austria)" msgid "Dhivehi" -msgstr "" +msgstr "Divehi" msgid "Dzongkha" -msgstr "" +msgstr "Dzongkha" msgid "Ewe" -msgstr "" +msgstr "Ewe" msgid "Greek" -msgstr "" +msgstr "Yunani" msgid "English" -msgstr "" +msgstr "Inggris" msgid "English (Canada)" -msgstr "" +msgstr "Inggris (Kanada)" msgid "English (UK)" msgstr "" @@ -1360,427 +1360,427 @@ msgid "English (USA)" msgstr "" msgid "Esperanto" -msgstr "" +msgstr "Esperanto" msgid "Spanish" -msgstr "" +msgstr "Spanyol" msgid "Estonian" -msgstr "" +msgstr "Estonia" msgid "Basque" -msgstr "" +msgstr "Basque" msgid "Persian" -msgstr "" +msgstr "Persia" msgid "Fulah" -msgstr "" +msgstr "Fulah" msgid "Finnish" -msgstr "" +msgstr "Finlandia" msgid "Fijian" -msgstr "" +msgstr "Fiji" msgid "Faroese" -msgstr "" +msgstr "Faroe" msgid "French" -msgstr "" +msgstr "Prancis" msgid "Frisian" -msgstr "" +msgstr "Frisia" msgid "Irish" -msgstr "" +msgstr "Irlandia" msgid "Gaelic" -msgstr "" +msgstr "Gaelik" msgid "Galician" -msgstr "" +msgstr "Galisia" msgid "Guarani" -msgstr "" +msgstr "Guarani" msgid "Gujarati" -msgstr "" +msgstr "Gujarat" msgid "Manx" -msgstr "" +msgstr "Manx" msgid "Hausa" -msgstr "" +msgstr "Hausa" msgid "Hebrew" -msgstr "" +msgstr "Ibrani" msgid "Hindi" -msgstr "" +msgstr "Hindi" msgid "Hiri Motu" -msgstr "" +msgstr "Hiri Motu" msgid "Croatian" -msgstr "" +msgstr "Kroasia" msgid "Haitian" -msgstr "" +msgstr "Haiti" msgid "Hungarian" -msgstr "" +msgstr "Hongaria" msgid "Armenian" -msgstr "" +msgstr "Armenia" msgid "Herero" -msgstr "" +msgstr "Herero" msgid "Interlingua" -msgstr "" +msgstr "Interlingua" msgid "Indonesian" -msgstr "" +msgstr "Indonesia" msgid "Occidental" -msgstr "" +msgstr "Occidental" msgid "Igbo" -msgstr "" +msgstr "Igbo" msgid "Nuosu" -msgstr "" +msgstr "Nuosu" msgid "Inupiaq" -msgstr "" +msgstr "Inupiaq" msgid "Ido" -msgstr "" +msgstr "Ido" msgid "Icelandic" -msgstr "" +msgstr "Islandia" msgid "Italian" -msgstr "" +msgstr "Italia" msgid "Inuktitut" -msgstr "" +msgstr "Inuktitut" msgid "Japanese" -msgstr "" +msgstr "Jepang" msgid "Javanese" -msgstr "" +msgstr "Jawa" msgid "Georgian" -msgstr "" +msgstr "Georgia" msgid "Kongo" -msgstr "" +msgstr "Kongo" msgid "Gikuyu" -msgstr "" +msgstr "Kikuyu" msgid "Kwanyama" -msgstr "" +msgstr "Kwanyama" msgid "Kazakh" -msgstr "" +msgstr "Kazakh" msgid "Greenlandic" -msgstr "" +msgstr "Kalaallisut" msgid "Kannada" -msgstr "" +msgstr "Kannada" msgid "Korean" -msgstr "" +msgstr "Korea" msgid "Kanuri" -msgstr "" +msgstr "Kanuri" msgid "Kashmiri" -msgstr "" +msgstr "Kashmiri" msgid "Kurdish" -msgstr "" +msgstr "Kurdi" msgid "Komi" -msgstr "" +msgstr "Komi" msgid "Cornish" -msgstr "" +msgstr "Kernowek" msgid "Kyrgyz" -msgstr "" +msgstr "Kirgiz" msgid "Latin" -msgstr "" +msgstr "Latin" msgid "Luxembourgish" -msgstr "" +msgstr "Luksemburg" msgid "Luganda" -msgstr "" +msgstr "Luganda" msgid "Limburgish" -msgstr "" +msgstr "Limburg" msgid "Lingala" -msgstr "" +msgstr "Lingala" msgid "Lao" -msgstr "" +msgstr "Lao" msgid "Lithuanian" -msgstr "" +msgstr "Lithuania" msgid "Luba-Katanga" -msgstr "" +msgstr "Luba-Katanga" msgid "Latvian" -msgstr "" +msgstr "Latvia" msgid "Malagasy" -msgstr "" +msgstr "Malagasi" msgid "Marshallese" -msgstr "" +msgstr "Marshall" msgid "Maori" -msgstr "" +msgstr "Maori" msgid "Macedonian" -msgstr "" +msgstr "Makedonia" msgid "Malayalam" -msgstr "" +msgstr "Malayalam" msgid "Mongolian" -msgstr "" +msgstr "Mongolia" msgid "Marathi" -msgstr "" +msgstr "Marathi" msgid "Malay" -msgstr "" +msgstr "Melayu" msgid "Maltese" -msgstr "" +msgstr "Maltese" msgid "Burmese" -msgstr "" +msgstr "Myanmar" msgid "Nauru" -msgstr "" +msgstr "Nauru" msgid "Nepali" -msgstr "" +msgstr "Nepal" msgid "Ndonga" -msgstr "" +msgstr "Ndonga" msgid "Dutch" -msgstr "" +msgstr "Belanda" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "Norwegia Nynorsk" msgid "Navaho" -msgstr "" +msgstr "Navaho" msgid "Nyanja" -msgstr "" +msgstr "Nyanja" msgid "Occitan" -msgstr "" +msgstr "Oksitan" msgid "Ojibwe" -msgstr "" +msgstr "Ojibwe" msgid "Oromo" -msgstr "" +msgstr "Oromo" msgid "Odia" -msgstr "" +msgstr "Odia" msgid "Ossetian" -msgstr "" +msgstr "Ossetian" msgid "Panjabi" msgstr "" msgid "Pali" -msgstr "" +msgstr "Pali" msgid "Polish" -msgstr "" +msgstr "Polandia" msgid "Pashto" -msgstr "" +msgstr "Pashto" msgid "Portuguese" -msgstr "" +msgstr "Portugis" msgid "Portuguese (Brazil)" -msgstr "" +msgstr "Portugis (Brasil)" msgid "Portuguese (Portugal)" -msgstr "" +msgstr "Portugis (Portugal)" msgid "Quechua" -msgstr "" +msgstr "Quechua" msgid "Romansh" -msgstr "" +msgstr "Romawi" msgid "Rundi" -msgstr "" +msgstr "Rundi" msgid "Romanian" -msgstr "" +msgstr "Rumania" msgid "Russian" -msgstr "" +msgstr "Rusia" msgid "Kinyarwanda" -msgstr "" +msgstr "Kinyarwanda" msgid "Sanskrit" -msgstr "" +msgstr "Sanskrit" msgid "Sardinian" -msgstr "" +msgstr "Sardinian" msgid "Sindhi" -msgstr "" +msgstr "Sindhi" msgid "Sango" -msgstr "" +msgstr "Sango" msgid "Sinhala" -msgstr "" +msgstr "Sinhala" msgid "Slovak" -msgstr "" +msgstr "Slowakia" msgid "Slovenian" -msgstr "" +msgstr "Slovenia" msgid "Samoan" -msgstr "" +msgstr "Samoa" msgid "Shona" -msgstr "" +msgstr "Shona" msgid "Somali" -msgstr "" +msgstr "Somali" msgid "Albanian" -msgstr "" +msgstr "Albania" msgid "Serbian" -msgstr "" +msgstr "Serbia" msgid "Swati" -msgstr "" +msgstr "Swati" msgid "Sundanese" -msgstr "" +msgstr "Sunda" msgid "Swedish" -msgstr "" +msgstr "Swedia" msgid "Swahili" -msgstr "" +msgstr "Swahili" msgid "Tamil" -msgstr "" +msgstr "Tamil" msgid "Telugu" -msgstr "" +msgstr "Telugu" msgid "Tajik" -msgstr "" +msgstr "Tajik" msgid "Thai" -msgstr "" +msgstr "Thai" msgid "Tigrinya" -msgstr "" +msgstr "Tigrinya" msgid "Turkmen" -msgstr "" +msgstr "Turkmen" msgid "Tagalog" -msgstr "" +msgstr "Tagalog" msgid "Tswana" -msgstr "" +msgstr "Tswana" msgid "Tongan" -msgstr "" +msgstr "Tonga" msgid "Turkish" -msgstr "" +msgstr "Turki" msgid "Tsonga" -msgstr "" +msgstr "Tsonga" msgid "Tatar" -msgstr "" +msgstr "Tatar" msgid "Twi" -msgstr "" +msgstr "Twi" msgid "Tahitian" -msgstr "" +msgstr "Tahiti" msgid "Uyghur" -msgstr "" +msgstr "Uighur" msgid "Ukrainian" -msgstr "" +msgstr "Ukraina" msgid "Urdu" -msgstr "" +msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Uzbek" msgid "Venda" -msgstr "" +msgstr "Venda" msgid "Vietnamese" -msgstr "" +msgstr "Vietnam" msgid "Volapük" -msgstr "" +msgstr "Volapük" msgid "Walloon" -msgstr "" +msgstr "Walloon" msgid "Wolof" -msgstr "" +msgstr "Wolof" msgid "Xhosa" -msgstr "" +msgstr "Xhosa" msgid "Yiddish" -msgstr "" +msgstr "Yiddi" msgid "Yoruba" -msgstr "" +msgstr "Yoruba" msgid "Zhuang" -msgstr "" +msgstr "Zhuang" msgid "Chinese (Traditional)" msgstr "" msgid "Zulu" -msgstr "" +msgstr "Zulu" msgid "(no translation)" msgstr "" diff --git a/po/it.po b/po/it.po index aef2bb5e..56b44d4c 100644 --- a/po/it.po +++ b/po/it.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: Pure Data 0.43\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" "POT-Creation-Date: 2024-07-08 15:19+0200\n" -"PO-Revision-Date: 2024-03-20 21:01+0000\n" +"PO-Revision-Date: 2024-07-08 17:19+0200\n" "Last-Translator: Alberto Zin \n" "Language-Team: Italian \n" @@ -19,7 +19,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 5.5-dev\n" +"X-Generator: Poedit 3.4.4\n" msgid "linear" msgstr "lineare" @@ -1267,43 +1267,43 @@ msgid "The language can only be set during startup." msgstr "" msgid "Afar" -msgstr "" +msgstr "Afar" msgid "Abkhazian" -msgstr "" +msgstr "Abkhaziano" msgid "Avestan" -msgstr "" +msgstr "Avestan" msgid "Afrikaans" msgstr "Afrikaans" msgid "Akan" -msgstr "" +msgstr "Akan" msgid "Amharic" -msgstr "" +msgstr "Amarico" msgid "Aragonese" -msgstr "" +msgstr "Aragonese" msgid "Arabic" msgstr "Arabo" msgid "Assamese" -msgstr "" +msgstr "Assamese" msgid "Avaric" -msgstr "" +msgstr "Avarico" msgid "Aymara" -msgstr "" +msgstr "Aymara" msgid "Azerbaijani" -msgstr "Azerbaijano" +msgstr "Azerbagiano" msgid "Bashkir" -msgstr "" +msgstr "Baschiro" msgid "Belarusian" msgstr "Bielorusso" @@ -1312,55 +1312,52 @@ msgid "Bulgarian" msgstr "Bulgaro" msgid "Bihari" -msgstr "" +msgstr "Bihari" msgid "Bislama" -msgstr "" +msgstr "Bislama" msgid "Bambara" -msgstr "" +msgstr "Bambara" msgid "Bengali" -msgstr "" +msgstr "Bengalese" msgid "Tibetan" -msgstr "" +msgstr "Tibetano" msgid "Breton" -msgstr "" +msgstr "Bretone" msgid "Bosnian" -msgstr "" +msgstr "Bosniaco" -#, fuzzy msgid "Catalan" -msgstr "fatale" +msgstr "Catalano" -#, fuzzy msgid "Chechen" -msgstr "Controlla" +msgstr "Ceceno" msgid "Chamorro" -msgstr "" +msgstr "Chamorro" msgid "Corsican" -msgstr "" +msgstr "Corso" msgid "Cree" -msgstr "" +msgstr "Cree" msgid "Czech" -msgstr "" +msgstr "Ceco" msgid "Chuvash" -msgstr "" +msgstr "Ciuvascio" msgid "Welsh" -msgstr "" +msgstr "Gallese" -#, fuzzy msgid "Danish" -msgstr "Spagnolo" +msgstr "Danese" msgid "German" msgstr "Tedesco" @@ -1369,13 +1366,13 @@ msgid "German (Austria)" msgstr "Tedesco (Austria)" msgid "Dhivehi" -msgstr "" +msgstr "Dhivehi" msgid "Dzongkha" -msgstr "" +msgstr "Dzongkha" msgid "Ewe" -msgstr "" +msgstr "Ewe" msgid "Greek" msgstr "Greco" @@ -1393,59 +1390,58 @@ msgid "English (USA)" msgstr "Inglese (USA)" msgid "Esperanto" -msgstr "" +msgstr "Esperanto" msgid "Spanish" msgstr "Spagnolo" msgid "Estonian" -msgstr "" +msgstr "Estone" msgid "Basque" msgstr "Basco" -#, fuzzy msgid "Persian" -msgstr "Versione" +msgstr "Persiano" msgid "Fulah" -msgstr "" +msgstr "Fulah" msgid "Finnish" -msgstr "Finnico" +msgstr "Finlandese" msgid "Fijian" -msgstr "" +msgstr "Figiano" msgid "Faroese" -msgstr "" +msgstr "Faroese" msgid "French" msgstr "Francese" msgid "Frisian" -msgstr "" +msgstr "Frisone" msgid "Irish" -msgstr "" +msgstr "Irlandese" msgid "Gaelic" -msgstr "" +msgstr "Gaelico" msgid "Galician" -msgstr "" +msgstr "Galiziano" msgid "Guarani" -msgstr "" +msgstr "Guaraní" msgid "Gujarati" msgstr "Gujarati" msgid "Manx" -msgstr "" +msgstr "Mannese" msgid "Hausa" -msgstr "" +msgstr "Hausa" msgid "Hebrew" msgstr "Ebraico" @@ -1454,13 +1450,13 @@ msgid "Hindi" msgstr "Hindi" msgid "Hiri Motu" -msgstr "" +msgstr "Hiri Motu" msgid "Croatian" -msgstr "" +msgstr "Croato" msgid "Haitian" -msgstr "" +msgstr "Haitiano" msgid "Hungarian" msgstr "Ungherese" @@ -1469,358 +1465,352 @@ msgid "Armenian" msgstr "Armeno" msgid "Herero" -msgstr "" +msgstr "Herero" msgid "Interlingua" -msgstr "" +msgstr "Interlingua" msgid "Indonesian" msgstr "Indonesiano" msgid "Occidental" -msgstr "" +msgstr "Occidentale" msgid "Igbo" -msgstr "" +msgstr "Igbo" msgid "Nuosu" -msgstr "" +msgstr "Nuosu" msgid "Inupiaq" -msgstr "" +msgstr "Inupiaq" msgid "Ido" -msgstr "" +msgstr "Ido" msgid "Icelandic" -msgstr "" +msgstr "Islandese" msgid "Italian" msgstr "Italiano" msgid "Inuktitut" -msgstr "" +msgstr "Inuktitut" msgid "Japanese" msgstr "Giapponese" -#, fuzzy msgid "Javanese" -msgstr "Giapponese" +msgstr "Giavanese" msgid "Georgian" -msgstr "" +msgstr "Georgiano" msgid "Kongo" -msgstr "" +msgstr "Kongo" msgid "Gikuyu" -msgstr "" +msgstr "Gikuyu" msgid "Kwanyama" -msgstr "" +msgstr "Kwanyama" msgid "Kazakh" -msgstr "" +msgstr "Kazako" msgid "Greenlandic" -msgstr "" +msgstr "Groenlandese" msgid "Kannada" -msgstr "" +msgstr "Kannada" msgid "Korean" msgstr "Coreano" msgid "Kanuri" -msgstr "" +msgstr "Kanuri" msgid "Kashmiri" -msgstr "" +msgstr "Kashmiri" msgid "Kurdish" -msgstr "" +msgstr "Curdo" msgid "Komi" -msgstr "" +msgstr "Komi" msgid "Cornish" -msgstr "" +msgstr "Cornico" msgid "Kyrgyz" -msgstr "" +msgstr "Kirghiso" msgid "Latin" -msgstr "" +msgstr "Latino" msgid "Luxembourgish" -msgstr "" +msgstr "Lussemburghese" msgid "Luganda" -msgstr "" +msgstr "Luganda" msgid "Limburgish" -msgstr "" +msgstr "Limburghese" msgid "Lingala" -msgstr "" +msgstr "Lingala" -#, fuzzy msgid "Lao" -msgstr "Log" +msgstr "Lao" msgid "Lithuanian" -msgstr "" +msgstr "Lituano" msgid "Luba-Katanga" -msgstr "" +msgstr "Luba-Katanga" msgid "Latvian" -msgstr "" +msgstr "Lettone" msgid "Malagasy" -msgstr "" +msgstr "Malgascio" msgid "Marshallese" -msgstr "" +msgstr "Marshallese" msgid "Maori" -msgstr "" +msgstr "Maori" msgid "Macedonian" -msgstr "" +msgstr "Macedone" msgid "Malayalam" -msgstr "" +msgstr "Malayalam" msgid "Mongolian" -msgstr "" +msgstr "Mongolo" -#, fuzzy msgid "Marathi" -msgstr "Gujarati" +msgstr "Marathi" msgid "Malay" -msgstr "" +msgstr "Malese" msgid "Maltese" -msgstr "" +msgstr "Maltese" msgid "Burmese" -msgstr "" +msgstr "Burmese" msgid "Nauru" -msgstr "" +msgstr "Nauru" msgid "Nepali" -msgstr "" +msgstr "Nepalese" msgid "Ndonga" -msgstr "" +msgstr "Ndonga" msgid "Dutch" msgstr "Olandese" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "Norvegese (Nynorsk)" msgid "Navaho" -msgstr "" +msgstr "Navaho" -#, fuzzy msgid "Nyanja" -msgstr "Panjabi" +msgstr "Nyanja" msgid "Occitan" -msgstr "" +msgstr "Occitano" msgid "Ojibwe" -msgstr "" +msgstr "Ojibwe" msgid "Oromo" -msgstr "" +msgstr "Oromo" msgid "Odia" -msgstr "" +msgstr "Odia" msgid "Ossetian" -msgstr "" +msgstr "Osseto" msgid "Panjabi" msgstr "Panjabi" msgid "Pali" -msgstr "" +msgstr "Pali" msgid "Polish" msgstr "Polacco" msgid "Pashto" -msgstr "" +msgstr "Pashto" msgid "Portuguese" msgstr "Portoghese" msgid "Portuguese (Brazil)" -msgstr "Portoghese (Brasile)" +msgstr "Portoghese (Brasiliano)" msgid "Portuguese (Portugal)" msgstr "Portoghese (Portogallo)" msgid "Quechua" -msgstr "" +msgstr "Quechua" msgid "Romansh" -msgstr "" +msgstr "Romancio" msgid "Rundi" -msgstr "" +msgstr "Rundi" -#, fuzzy msgid "Romanian" -msgstr "Albanese" +msgstr "Rumeno" msgid "Russian" msgstr "Russo" msgid "Kinyarwanda" -msgstr "" +msgstr "Kinyarwanda" msgid "Sanskrit" -msgstr "" +msgstr "Sanscrito" -#, fuzzy msgid "Sardinian" -msgstr "Ucraino" +msgstr "Sardo" msgid "Sindhi" -msgstr "" +msgstr "Sindhi" msgid "Sango" -msgstr "" +msgstr "Sango" msgid "Sinhala" -msgstr "" +msgstr "Singalese" msgid "Slovak" -msgstr "" +msgstr "Slovacco" msgid "Slovenian" -msgstr "" +msgstr "Sloveno" msgid "Samoan" -msgstr "" +msgstr "Samoano" msgid "Shona" -msgstr "" +msgstr "Shona" msgid "Somali" -msgstr "" +msgstr "Somalo" msgid "Albanian" msgstr "Albanese" msgid "Serbian" -msgstr "" +msgstr "Serbo" msgid "Swati" -msgstr "" +msgstr "Swati" msgid "Sundanese" -msgstr "" +msgstr "Sundanese" msgid "Swedish" msgstr "Svedese" msgid "Swahili" -msgstr "" +msgstr "Swahili" msgid "Tamil" -msgstr "" +msgstr "Tamil" msgid "Telugu" -msgstr "" +msgstr "Telugu" msgid "Tajik" -msgstr "" +msgstr "Tagico" msgid "Thai" -msgstr "" +msgstr "Thai" msgid "Tigrinya" -msgstr "" +msgstr "Tigrino" msgid "Turkmen" -msgstr "" +msgstr "Turcmeno" msgid "Tagalog" -msgstr "" +msgstr "Tagalog" msgid "Tswana" -msgstr "" +msgstr "Tswana" msgid "Tongan" -msgstr "" +msgstr "Tongano" msgid "Turkish" msgstr "Turco" msgid "Tsonga" -msgstr "" +msgstr "Tsonga" msgid "Tatar" -msgstr "" +msgstr "Tartaro" msgid "Twi" -msgstr "" +msgstr "Twi" msgid "Tahitian" -msgstr "" +msgstr "Tahitiano" msgid "Uyghur" -msgstr "" +msgstr "Uiguro" msgid "Ukrainian" msgstr "Ucraino" msgid "Urdu" -msgstr "" +msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Uzbeco" msgid "Venda" -msgstr "" +msgstr "Venda" msgid "Vietnamese" msgstr "Vietnamita" msgid "Volapük" -msgstr "" +msgstr "Volapük" msgid "Walloon" -msgstr "" +msgstr "Vallone" msgid "Wolof" -msgstr "" +msgstr "Wolof" msgid "Xhosa" -msgstr "" +msgstr "Xhosa" msgid "Yiddish" -msgstr "" +msgstr "Yiddish" msgid "Yoruba" -msgstr "" +msgstr "Yoruba" msgid "Zhuang" -msgstr "" +msgstr "Zhuang" msgid "Chinese (Traditional)" msgstr "Cinese (Tradizionale)" msgid "Zulu" -msgstr "" +msgstr "Zulu" msgid "(no translation)" msgstr "(nessuna traduzione)" diff --git a/po/ja.po b/po/ja.po index 53d3e0a2..9466e38b 100644 --- a/po/ja.po +++ b/po/ja.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Pure Data 0.53.0\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" "POT-Creation-Date: 2024-07-08 15:19+0200\n" -"PO-Revision-Date: 2023-02-13 12:36+0000\n" +"PO-Revision-Date: 2024-07-08 17:20+0200\n" "Last-Translator: umläute \n" "Language-Team: Japanese \n" @@ -17,7 +17,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 4.16-dev\n" +"X-Generator: Poedit 3.4.4\n" msgid "linear" msgstr "線形" @@ -857,7 +857,8 @@ msgid "Installation options:" msgstr "インストールオプション:" msgid "Try to verify the libraries' checksum before (re)installing them" -msgstr "ライブラリのチェックサムを確認してから(再)インストールしてみてください" +msgstr "" +"ライブラリのチェックサムを確認してから(再)インストールしてみてください" msgid "Try to remove libraries before (re)installing them" msgstr "ライブラリを削除してから(再)インストールしてみてください" @@ -1007,16 +1008,16 @@ msgstr "" msgid "e.g. '*-plugin' will match 'deken-plugin' (and more)." msgstr "" -"例) '*-plugin' と入力すると 'deken-plugin' にマッチします(その他にもマッチし" -"ます)。" +"例) '*-plugin' と入力すると 'deken-plugin' にマッチします(その他にもマッチ" +"します)。" msgid "You can restrict the search to only-libraries or only-objects." msgstr "ライブラリのみ または オブジェクトのみに 検索を制限できます。" msgid "To get a list of all available externals, try an empty search." msgstr "" -"利用可能なすべてのexternalsのリストを取得するには、空の検索を試してみてくださ" -"い。" +"利用可能なすべてのexternalsのリストを取得するには、空の検索を試してみてくだ" +"さい。" msgid "Right-clicking a search result will give you more options..." msgstr "検索結果を右クリックすると、さらに多くのオプションが表示されます..." @@ -1114,8 +1115,8 @@ msgstr "%1$s を %2$s にインストールしますか?" #, tcl-format msgid "Cancelling download of '%s': No installation directory given." msgstr "" -"'%s' のダウンロードをキャンセルしています: インストール先のディレクトリが指定" -"されていません。" +"'%s' のダウンロードをキャンセルしています: インストール先のディレクトリが指" +"定されていません。" msgid "Installing to non-existent directory failed" msgstr "存在しないディレクトリのためインストールに失敗しました" @@ -1279,123 +1280,121 @@ msgid "The language can only be set during startup." msgstr "" msgid "Afar" -msgstr "" +msgstr "アファル語" msgid "Abkhazian" -msgstr "" +msgstr "アブハズ語" msgid "Avestan" -msgstr "" +msgstr "アヴェスター語" msgid "Afrikaans" -msgstr "" +msgstr "アフリカーンス語" msgid "Akan" -msgstr "" +msgstr "アカン語" msgid "Amharic" -msgstr "" +msgstr "アムハラ語" msgid "Aragonese" -msgstr "" +msgstr "アラゴン語" msgid "Arabic" -msgstr "" +msgstr "アラビア語" msgid "Assamese" -msgstr "" +msgstr "アッサム語" msgid "Avaric" -msgstr "" +msgstr "アヴァル語" msgid "Aymara" -msgstr "" +msgstr "アイマラ語" msgid "Azerbaijani" -msgstr "" +msgstr "アゼルバイジャン語" msgid "Bashkir" -msgstr "" +msgstr "バシキール語" msgid "Belarusian" -msgstr "" +msgstr "ベラルーシ語" msgid "Bulgarian" -msgstr "" +msgstr "ブルガリア語" msgid "Bihari" -msgstr "" +msgstr "ビハール語" msgid "Bislama" -msgstr "" +msgstr "ビスラマ語" msgid "Bambara" -msgstr "" +msgstr "バンバラ語" msgid "Bengali" -msgstr "" +msgstr "ベンガル語" msgid "Tibetan" -msgstr "" +msgstr "チベット語" msgid "Breton" -msgstr "" +msgstr "ブルターニュ語" msgid "Bosnian" -msgstr "" +msgstr "ボスニア語" -#, fuzzy msgid "Catalan" -msgstr "致命的" +msgstr "カタルーニャ語" -#, fuzzy msgid "Chechen" -msgstr "チェック" +msgstr "チェチェン語" msgid "Chamorro" -msgstr "" +msgstr "チャモロ語" msgid "Corsican" -msgstr "" +msgstr "コルシカ語" msgid "Cree" -msgstr "" +msgstr "クリー語" msgid "Czech" -msgstr "" +msgstr "チェコ語" msgid "Chuvash" -msgstr "" +msgstr "チュヴァシ語" msgid "Welsh" -msgstr "" +msgstr "ウェールズ語" msgid "Danish" -msgstr "" +msgstr "デンマーク語" msgid "German" -msgstr "" +msgstr "ドイツ語" msgid "German (Austria)" -msgstr "" +msgstr "ドイツ語 (オーストリア)" msgid "Dhivehi" -msgstr "" +msgstr "ディベヒ語" msgid "Dzongkha" -msgstr "" +msgstr "ゾンカ語" msgid "Ewe" -msgstr "" +msgstr "エウェ語" msgid "Greek" -msgstr "" +msgstr "ギリシャ語" msgid "English" -msgstr "" +msgstr "英語" msgid "English (Canada)" -msgstr "" +msgstr "英語 (カナダ)" msgid "English (UK)" msgstr "" @@ -1404,429 +1403,427 @@ msgid "English (USA)" msgstr "" msgid "Esperanto" -msgstr "" +msgstr "エスペラント語" msgid "Spanish" -msgstr "" +msgstr "スペイン語" msgid "Estonian" -msgstr "" +msgstr "エストニア語" msgid "Basque" -msgstr "" +msgstr "バスク語" -#, fuzzy msgid "Persian" -msgstr "バージョン" +msgstr "ペルシア語" msgid "Fulah" -msgstr "" +msgstr "フラ語" msgid "Finnish" -msgstr "" +msgstr "フィンランド語" msgid "Fijian" -msgstr "" +msgstr "フィジー語" msgid "Faroese" -msgstr "" +msgstr "フェロー語" msgid "French" -msgstr "" +msgstr "フランス語" msgid "Frisian" -msgstr "" +msgstr "フリジア語" msgid "Irish" -msgstr "" +msgstr "アイルランド語" msgid "Gaelic" -msgstr "" +msgstr "ゲール語" msgid "Galician" -msgstr "" +msgstr "ガリシア語" msgid "Guarani" -msgstr "" +msgstr "グアラニー語" msgid "Gujarati" -msgstr "" +msgstr "グジャラート語" msgid "Manx" -msgstr "" +msgstr "マン島語" msgid "Hausa" -msgstr "" +msgstr "ハウサ語" msgid "Hebrew" -msgstr "" +msgstr "ヘブライ語" msgid "Hindi" -msgstr "" +msgstr "ヒンディー語" msgid "Hiri Motu" -msgstr "" +msgstr "ヒリモツ語" msgid "Croatian" -msgstr "" +msgstr "クロアチア語" msgid "Haitian" -msgstr "" +msgstr "ハイチ語" msgid "Hungarian" -msgstr "" +msgstr "ハンガリー語" msgid "Armenian" -msgstr "" +msgstr "アルメニア語" msgid "Herero" -msgstr "" +msgstr "ヘレロ語" msgid "Interlingua" -msgstr "" +msgstr "インターリングア" msgid "Indonesian" -msgstr "" +msgstr "インドネシア語" msgid "Occidental" -msgstr "" +msgstr "オクツィデンタル" msgid "Igbo" -msgstr "" +msgstr "イボ語" msgid "Nuosu" -msgstr "" +msgstr "四川彝語" msgid "Inupiaq" -msgstr "" +msgstr "イヌピアック語" msgid "Ido" -msgstr "" +msgstr "イド語" msgid "Icelandic" -msgstr "" +msgstr "アイスランド語" msgid "Italian" -msgstr "" +msgstr "イタリア語" msgid "Inuktitut" -msgstr "" +msgstr "イヌクティトゥット語" msgid "Japanese" -msgstr "" +msgstr "日本語" msgid "Javanese" -msgstr "" +msgstr "ジャワ語" msgid "Georgian" -msgstr "" +msgstr "グルジア語" msgid "Kongo" -msgstr "" +msgstr "コンゴ語" msgid "Gikuyu" -msgstr "" +msgstr "キクユ語" msgid "Kwanyama" -msgstr "" +msgstr "クワニャマ語" msgid "Kazakh" -msgstr "" +msgstr "カザフ語" msgid "Greenlandic" -msgstr "" +msgstr "グリーンランド語" msgid "Kannada" -msgstr "" +msgstr "カンナダ語" msgid "Korean" -msgstr "" +msgstr "朝鮮語" msgid "Kanuri" -msgstr "" +msgstr "カヌリ語" msgid "Kashmiri" -msgstr "" +msgstr "カシミール語" msgid "Kurdish" -msgstr "" +msgstr "クルド語" msgid "Komi" -msgstr "" +msgstr "コミ語" msgid "Cornish" -msgstr "" +msgstr "コーンウォール語" msgid "Kyrgyz" -msgstr "" +msgstr "キルギス語" msgid "Latin" -msgstr "" +msgstr "ラテン語" msgid "Luxembourgish" -msgstr "" +msgstr "ルクセンブルク語" msgid "Luganda" -msgstr "" +msgstr "ガンダ語" msgid "Limburgish" -msgstr "" +msgstr "リンブルフ語" msgid "Lingala" -msgstr "" +msgstr "リンガラ語" -#, fuzzy msgid "Lao" -msgstr "ログ" +msgstr "ラオ語" msgid "Lithuanian" -msgstr "" +msgstr "リトアニア語" msgid "Luba-Katanga" -msgstr "" +msgstr "ルバ・カタンガ語" msgid "Latvian" -msgstr "" +msgstr "ラトビア語" msgid "Malagasy" -msgstr "" +msgstr "マダガスカル語" msgid "Marshallese" -msgstr "" +msgstr "マーシャル語" msgid "Maori" -msgstr "" +msgstr "マオリ語" msgid "Macedonian" -msgstr "" +msgstr "マケドニア語" msgid "Malayalam" -msgstr "" +msgstr "マラヤーラム語" msgid "Mongolian" -msgstr "" +msgstr "モンゴル語" msgid "Marathi" -msgstr "" +msgstr "マラーティー語" msgid "Malay" -msgstr "" +msgstr "マレー語" msgid "Maltese" -msgstr "" +msgstr "マルタ語" msgid "Burmese" -msgstr "" +msgstr "ビルマ語" msgid "Nauru" -msgstr "" +msgstr "ナウル語" msgid "Nepali" -msgstr "" +msgstr "ネパール語" msgid "Ndonga" -msgstr "" +msgstr "ンドンガ語" msgid "Dutch" -msgstr "" +msgstr "オランダ語" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "ノルウェー語 (ニーノシュク)" msgid "Navaho" -msgstr "" +msgstr "ナバホ語" msgid "Nyanja" -msgstr "" +msgstr "ニャンジャ語" msgid "Occitan" -msgstr "" +msgstr "オック語" msgid "Ojibwe" -msgstr "" +msgstr "オジブエ語" msgid "Oromo" -msgstr "" +msgstr "オロモ語" msgid "Odia" -msgstr "" +msgstr "オリヤー語" msgid "Ossetian" -msgstr "" +msgstr "オセット語" msgid "Panjabi" msgstr "" msgid "Pali" -msgstr "" +msgstr "パーリ語" msgid "Polish" -msgstr "" +msgstr "ポーランド語" msgid "Pashto" -msgstr "" +msgstr "パシュトー語" msgid "Portuguese" -msgstr "" +msgstr "ポルトガル語" msgid "Portuguese (Brazil)" -msgstr "" +msgstr "ポルトガル語 (ブラジル)" msgid "Portuguese (Portugal)" -msgstr "" +msgstr "ポルトガル語 (ポルトガル)" msgid "Quechua" -msgstr "" +msgstr "ケチュア語" msgid "Romansh" -msgstr "" +msgstr "ロマンシュ語" msgid "Rundi" -msgstr "" +msgstr "ルンディ語" msgid "Romanian" -msgstr "" +msgstr "ルーマニア語" msgid "Russian" -msgstr "" +msgstr "ロシア語" msgid "Kinyarwanda" -msgstr "" +msgstr "ルワンダ語" msgid "Sanskrit" -msgstr "" +msgstr "サンスクリット" msgid "Sardinian" -msgstr "" +msgstr "サルデーニャ語" msgid "Sindhi" -msgstr "" +msgstr "シンド語" msgid "Sango" -msgstr "" +msgstr "サンゴ語" msgid "Sinhala" -msgstr "" +msgstr "シンハラ語" msgid "Slovak" -msgstr "" +msgstr "スロバキア語" msgid "Slovenian" -msgstr "" +msgstr "スロベニア語" msgid "Samoan" -msgstr "" +msgstr "サモア語" msgid "Shona" -msgstr "" +msgstr "ショナ語" msgid "Somali" -msgstr "" +msgstr "ソマリ語" msgid "Albanian" -msgstr "" +msgstr "アルバニア語" msgid "Serbian" -msgstr "" +msgstr "セルビア語" msgid "Swati" -msgstr "" +msgstr "スワジ語" msgid "Sundanese" -msgstr "" +msgstr "スンダ語" msgid "Swedish" -msgstr "" +msgstr "スウェーデン語" msgid "Swahili" -msgstr "" +msgstr "スワヒリ語" msgid "Tamil" -msgstr "" +msgstr "タミル語" msgid "Telugu" -msgstr "" +msgstr "テルグ語" msgid "Tajik" -msgstr "" +msgstr "タジク語" msgid "Thai" -msgstr "" +msgstr "タイ語" msgid "Tigrinya" -msgstr "" +msgstr "ティグリニャ語" msgid "Turkmen" -msgstr "" +msgstr "トルクメン語" msgid "Tagalog" -msgstr "" +msgstr "タガログ語" msgid "Tswana" -msgstr "" +msgstr "ツワナ語" msgid "Tongan" -msgstr "" +msgstr "トンガ語" msgid "Turkish" -msgstr "" +msgstr "トルコ語" msgid "Tsonga" -msgstr "" +msgstr "ツォンガ語" msgid "Tatar" -msgstr "" +msgstr "タタール語" msgid "Twi" -msgstr "" +msgstr "トウィ語" msgid "Tahitian" -msgstr "" +msgstr "タヒチ語" msgid "Uyghur" -msgstr "" +msgstr "ウイグル語" msgid "Ukrainian" -msgstr "" +msgstr "ウクライナ語" msgid "Urdu" -msgstr "" +msgstr "ウルドゥー語" msgid "Uzbek" -msgstr "" +msgstr "ウズベク語" msgid "Venda" -msgstr "" +msgstr "ヴェンダ語" msgid "Vietnamese" -msgstr "" +msgstr "ベトナム語" msgid "Volapük" -msgstr "" +msgstr "ヴォラピュク" msgid "Walloon" -msgstr "" +msgstr "ワロン語" msgid "Wolof" -msgstr "" +msgstr "ウォロフ語" msgid "Xhosa" -msgstr "" +msgstr "コサ語" msgid "Yiddish" -msgstr "" +msgstr "イディッシュ語" msgid "Yoruba" -msgstr "" +msgstr "ヨルバ語" msgid "Zhuang" -msgstr "" +msgstr "チワン語" msgid "Chinese (Traditional)" msgstr "" msgid "Zulu" -msgstr "" +msgstr "ズールー語" #, fuzzy msgid "(no translation)" diff --git a/po/nl.po b/po/nl.po index e4a016e2..7d4550d5 100644 --- a/po/nl.po +++ b/po/nl.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Pure Data 0.53.0\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" "POT-Creation-Date: 2024-07-08 15:19+0200\n" -"PO-Revision-Date: 2023-06-06 09:30+0000\n" +"PO-Revision-Date: 2024-07-08 17:21+0200\n" "Last-Translator: umläute \n" "Language-Team: Dutch \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.18-dev\n" +"X-Generator: Poedit 3.4.4\n" msgid "linear" msgstr "lineair" @@ -1266,123 +1266,121 @@ msgid "The language can only be set during startup." msgstr "" msgid "Afar" -msgstr "" +msgstr "Afar" msgid "Abkhazian" -msgstr "" +msgstr "Abchazisch" msgid "Avestan" -msgstr "" +msgstr "Avestaans" msgid "Afrikaans" -msgstr "" +msgstr "Afrikaans" msgid "Akan" -msgstr "" +msgstr "Akan" msgid "Amharic" -msgstr "" +msgstr "Amhaars" msgid "Aragonese" -msgstr "" +msgstr "Aragonesisch" msgid "Arabic" -msgstr "" +msgstr "Arabisch" msgid "Assamese" -msgstr "" +msgstr "Assamees" msgid "Avaric" -msgstr "" +msgstr "Amhaars" msgid "Aymara" -msgstr "" +msgstr "Aymara" msgid "Azerbaijani" -msgstr "" +msgstr "Azerbeijaans" msgid "Bashkir" -msgstr "" +msgstr "Bashkir" msgid "Belarusian" -msgstr "" +msgstr "Witrussisch" msgid "Bulgarian" -msgstr "" +msgstr "Bulgaars" msgid "Bihari" -msgstr "" +msgstr "Bihari" msgid "Bislama" -msgstr "" +msgstr "Bislama" msgid "Bambara" -msgstr "" +msgstr "Bambara" msgid "Bengali" -msgstr "" +msgstr "Bengaals" msgid "Tibetan" -msgstr "" +msgstr "Tibetaans" msgid "Breton" -msgstr "" +msgstr "Bretoens" msgid "Bosnian" -msgstr "" +msgstr "Bosnisch" -#, fuzzy msgid "Catalan" -msgstr "fataal" +msgstr "Catalaans" -#, fuzzy msgid "Chechen" -msgstr "Controleren" +msgstr "Tsjetsjeens" msgid "Chamorro" -msgstr "" +msgstr "Chamorro" msgid "Corsican" -msgstr "" +msgstr "Corsicaans" msgid "Cree" -msgstr "" +msgstr "Cree" msgid "Czech" -msgstr "" +msgstr "Tsjechisch" msgid "Chuvash" -msgstr "" +msgstr "Tsjoevasjisch" msgid "Welsh" -msgstr "" +msgstr "Welsh" msgid "Danish" -msgstr "" +msgstr "Deens" msgid "German" -msgstr "" +msgstr "Duits" msgid "German (Austria)" -msgstr "" +msgstr "Duits (Oostenrijks)" msgid "Dhivehi" -msgstr "" +msgstr "Divehi" msgid "Dzongkha" -msgstr "" +msgstr "Dzongkha" msgid "Ewe" -msgstr "" +msgstr "Ewe" msgid "Greek" -msgstr "" +msgstr "Grieks" msgid "English" -msgstr "" +msgstr "Engels" msgid "English (Canada)" -msgstr "" +msgstr "Engels (Canada)" msgid "English (UK)" msgstr "" @@ -1391,429 +1389,427 @@ msgid "English (USA)" msgstr "" msgid "Esperanto" -msgstr "" +msgstr "Esperanto" msgid "Spanish" -msgstr "" +msgstr "Spaans" msgid "Estonian" -msgstr "" +msgstr "Ests" msgid "Basque" -msgstr "" +msgstr "Baskisch" -#, fuzzy msgid "Persian" -msgstr "Versie" +msgstr "Perzisch" msgid "Fulah" -msgstr "" +msgstr "Fula" msgid "Finnish" -msgstr "" +msgstr "Fins" msgid "Fijian" -msgstr "" +msgstr "Fijisch" msgid "Faroese" -msgstr "" +msgstr "Faeröers" msgid "French" -msgstr "" +msgstr "Frans" msgid "Frisian" -msgstr "" +msgstr "Fries" msgid "Irish" -msgstr "" +msgstr "Iers" msgid "Gaelic" -msgstr "" +msgstr "Keltisch" msgid "Galician" -msgstr "" +msgstr "Galicisch" msgid "Guarani" -msgstr "" +msgstr "Guaraní" msgid "Gujarati" -msgstr "" +msgstr "Gujaratisch" msgid "Manx" -msgstr "" +msgstr "Manx" msgid "Hausa" -msgstr "" +msgstr "Hausa" msgid "Hebrew" -msgstr "" +msgstr "Hebreews" msgid "Hindi" -msgstr "" +msgstr "Hindi" msgid "Hiri Motu" -msgstr "" +msgstr "Hiri Motu" msgid "Croatian" -msgstr "" +msgstr "Kroatisch" msgid "Haitian" -msgstr "" +msgstr "Haïtiaans" msgid "Hungarian" -msgstr "" +msgstr "Hongaars" msgid "Armenian" -msgstr "" +msgstr "Armeens" msgid "Herero" -msgstr "" +msgstr "Herero" msgid "Interlingua" -msgstr "" +msgstr "Interlingua" msgid "Indonesian" -msgstr "" +msgstr "Indonesisch" msgid "Occidental" -msgstr "" +msgstr "Occitaans" msgid "Igbo" -msgstr "" +msgstr "Igbo" msgid "Nuosu" -msgstr "" +msgstr "Yi / Nuosu" msgid "Inupiaq" -msgstr "" +msgstr "Inupiak" msgid "Ido" -msgstr "" +msgstr "Ido" msgid "Icelandic" -msgstr "" +msgstr "IJslands" msgid "Italian" -msgstr "" +msgstr "Italiaans" msgid "Inuktitut" -msgstr "" +msgstr "Inuktitut" msgid "Japanese" -msgstr "" +msgstr "Japans" msgid "Javanese" -msgstr "" +msgstr "Javaans" msgid "Georgian" -msgstr "" +msgstr "Georgisch" msgid "Kongo" -msgstr "" +msgstr "Kongo" msgid "Gikuyu" -msgstr "" +msgstr "Gikuyu" msgid "Kwanyama" -msgstr "" +msgstr "Kwanyama" msgid "Kazakh" -msgstr "" +msgstr "Kazachs" msgid "Greenlandic" -msgstr "" +msgstr "Groenlands" msgid "Kannada" -msgstr "" +msgstr "Kannada" msgid "Korean" -msgstr "" +msgstr "Koreaans" msgid "Kanuri" -msgstr "" +msgstr "Kanuri" msgid "Kashmiri" -msgstr "" +msgstr "Kasjmiri" msgid "Kurdish" -msgstr "" +msgstr "Koerdisch" msgid "Komi" -msgstr "" +msgstr "Zurjeens" msgid "Cornish" -msgstr "" +msgstr "Cornisch" msgid "Kyrgyz" -msgstr "" +msgstr "Kirgizisch" msgid "Latin" -msgstr "" +msgstr "Latijn" msgid "Luxembourgish" -msgstr "" +msgstr "Luxemburgs" msgid "Luganda" -msgstr "" +msgstr "Luganda" msgid "Limburgish" -msgstr "" +msgstr "Limburgs" msgid "Lingala" -msgstr "" +msgstr "Lingala" -#, fuzzy msgid "Lao" -msgstr "Logboek" +msgstr "Lao" msgid "Lithuanian" -msgstr "" +msgstr "Litouws" msgid "Luba-Katanga" -msgstr "" +msgstr "Luba-Katanga" msgid "Latvian" -msgstr "" +msgstr "Lets" msgid "Malagasy" -msgstr "" +msgstr "Malagasi" msgid "Marshallese" -msgstr "" +msgstr "Marshallees" msgid "Maori" -msgstr "" +msgstr "Maori" msgid "Macedonian" -msgstr "" +msgstr "Macedonisch" msgid "Malayalam" -msgstr "" +msgstr "Malayalam" msgid "Mongolian" -msgstr "" +msgstr "Mongolees" msgid "Marathi" -msgstr "" +msgstr "Marathi" msgid "Malay" -msgstr "" +msgstr "Malay" msgid "Maltese" -msgstr "" +msgstr "Maltees" msgid "Burmese" -msgstr "" +msgstr "Birmaans" msgid "Nauru" -msgstr "" +msgstr "Nauruaans" msgid "Nepali" -msgstr "" +msgstr "Nepalees" msgid "Ndonga" -msgstr "" +msgstr "Ndonga" msgid "Dutch" -msgstr "" +msgstr "Nederlands" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "Noors (Nynorsk)" msgid "Navaho" -msgstr "" +msgstr "Navajo" msgid "Nyanja" -msgstr "" +msgstr "Nyanja" msgid "Occitan" -msgstr "" +msgstr "Occitaans" msgid "Ojibwe" -msgstr "" +msgstr "Ojibwe" msgid "Oromo" -msgstr "" +msgstr "Oromo" msgid "Odia" -msgstr "" +msgstr "Oḍiā" msgid "Ossetian" -msgstr "" +msgstr "Ossetisch" msgid "Panjabi" msgstr "" msgid "Pali" -msgstr "" +msgstr "Pali" msgid "Polish" -msgstr "" +msgstr "Pools" msgid "Pashto" -msgstr "" +msgstr "Pasjtoe" msgid "Portuguese" -msgstr "" +msgstr "Portugees" msgid "Portuguese (Brazil)" -msgstr "" +msgstr "Portugees (Brazilië)" msgid "Portuguese (Portugal)" -msgstr "" +msgstr "Portugees (Portugal)" msgid "Quechua" -msgstr "" +msgstr "Quechua" msgid "Romansh" -msgstr "" +msgstr "Reto-Romaans" msgid "Rundi" -msgstr "" +msgstr "Kirundi" msgid "Romanian" -msgstr "" +msgstr "Roemeens" msgid "Russian" -msgstr "" +msgstr "Russisch" msgid "Kinyarwanda" -msgstr "" +msgstr "Kinyarwanda" msgid "Sanskrit" -msgstr "" +msgstr "Sanskriet" msgid "Sardinian" -msgstr "" +msgstr "Sardijns" msgid "Sindhi" -msgstr "" +msgstr "Sindhi" msgid "Sango" -msgstr "" +msgstr "Sango" msgid "Sinhala" -msgstr "" +msgstr "Sinhala" msgid "Slovak" -msgstr "" +msgstr "Slovaaks" msgid "Slovenian" -msgstr "" +msgstr "Sloveens" msgid "Samoan" -msgstr "" +msgstr "Samoaans" msgid "Shona" -msgstr "" +msgstr "Shona" msgid "Somali" -msgstr "" +msgstr "Somali" msgid "Albanian" -msgstr "" +msgstr "Albanees" msgid "Serbian" -msgstr "" +msgstr "Servisch" msgid "Swati" -msgstr "" +msgstr "Swazi" msgid "Sundanese" -msgstr "" +msgstr "Sundanees" msgid "Swedish" -msgstr "" +msgstr "Zweeds" msgid "Swahili" -msgstr "" +msgstr "Swahili" msgid "Tamil" -msgstr "" +msgstr "Tamil" msgid "Telugu" -msgstr "" +msgstr "Telegu" msgid "Tajik" -msgstr "" +msgstr "Tadzjieks" msgid "Thai" -msgstr "" +msgstr "Thais" msgid "Tigrinya" -msgstr "" +msgstr "Tigrinya" msgid "Turkmen" -msgstr "" +msgstr "Turkmeens" msgid "Tagalog" -msgstr "" +msgstr "Tagalog" msgid "Tswana" -msgstr "" +msgstr "Tswana" msgid "Tongan" -msgstr "" +msgstr "Tongaans" msgid "Turkish" -msgstr "" +msgstr "Turks" msgid "Tsonga" -msgstr "" +msgstr "Tsonga" msgid "Tatar" -msgstr "" +msgstr "Tataars" msgid "Twi" -msgstr "" +msgstr "Twi" msgid "Tahitian" -msgstr "" +msgstr "Tahitiaans" msgid "Uyghur" -msgstr "" +msgstr "Oeigoers" msgid "Ukrainian" -msgstr "" +msgstr "Oekraïens" msgid "Urdu" -msgstr "" +msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Oezbeeks" msgid "Venda" -msgstr "" +msgstr "Venda" msgid "Vietnamese" -msgstr "" +msgstr "Vietnamees" msgid "Volapük" -msgstr "" +msgstr "Volapük" msgid "Walloon" -msgstr "" +msgstr "Waals" msgid "Wolof" -msgstr "" +msgstr "Wolof" msgid "Xhosa" -msgstr "" +msgstr "Xhosa" msgid "Yiddish" -msgstr "" +msgstr "Jiddisch" msgid "Yoruba" -msgstr "" +msgstr "Yoruba" msgid "Zhuang" -msgstr "" +msgstr "Zhuang" msgid "Chinese (Traditional)" msgstr "" msgid "Zulu" -msgstr "" +msgstr "Zulu" msgid "(no translation)" msgstr "(geen vertaling)" diff --git a/po/pl.po b/po/pl.po index 53f9983e..566c3519 100644 --- a/po/pl.po +++ b/po/pl.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: 2024-07-08 15:19+0200\n" -"PO-Revision-Date: 2022-10-20 12:48+0000\n" +"PO-Revision-Date: 2024-07-08 17:32+0200\n" "Last-Translator: | || | | \n" "Language-Team: Polish \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.2-dev\n" +"X-Generator: Poedit 3.4.4\n" msgid "linear" msgstr "liniowy" @@ -1238,121 +1238,123 @@ msgid "The language can only be set during startup." msgstr "" msgid "Afar" -msgstr "" +msgstr "Afar" msgid "Abkhazian" -msgstr "" +msgstr "Abchaski" msgid "Avestan" -msgstr "" +msgstr "Awestyjski" msgid "Afrikaans" -msgstr "" +msgstr "Afrykański" msgid "Akan" -msgstr "" +msgstr "Akan" msgid "Amharic" -msgstr "" +msgstr "Amharski" msgid "Aragonese" -msgstr "" +msgstr "Aragoński" msgid "Arabic" -msgstr "" +msgstr "Arabski" msgid "Assamese" -msgstr "" +msgstr "Asamski" msgid "Avaric" -msgstr "" +msgstr "Awarski" msgid "Aymara" -msgstr "" +msgstr "Ajmara" msgid "Azerbaijani" -msgstr "" +msgstr "Azerski" msgid "Bashkir" -msgstr "" +msgstr "Baszkirski" msgid "Belarusian" -msgstr "" +msgstr "Białoruski" msgid "Bulgarian" -msgstr "" +msgstr "Bułgarski" msgid "Bihari" -msgstr "" +msgstr "Bihari" msgid "Bislama" -msgstr "" +msgstr "Bislama" msgid "Bambara" msgstr "" +"B\n" +"ambara" msgid "Bengali" -msgstr "" +msgstr "Bengalski" msgid "Tibetan" -msgstr "" +msgstr "Tybetański" msgid "Breton" -msgstr "" +msgstr "Bretoński" msgid "Bosnian" -msgstr "" +msgstr "Bośniacki" msgid "Catalan" -msgstr "" +msgstr "Kataloński" msgid "Chechen" -msgstr "" +msgstr "Czeczeński" msgid "Chamorro" -msgstr "" +msgstr "Chamorro" msgid "Corsican" -msgstr "" +msgstr "Korsykański" msgid "Cree" -msgstr "" +msgstr "Cree" msgid "Czech" -msgstr "" +msgstr "Czeski" msgid "Chuvash" -msgstr "" +msgstr "Czuwaski" msgid "Welsh" -msgstr "" +msgstr "Walijski" msgid "Danish" -msgstr "" +msgstr "Duński" msgid "German" -msgstr "" +msgstr "Niemiecki" msgid "German (Austria)" -msgstr "" +msgstr "Niemiecki (Austria)" msgid "Dhivehi" -msgstr "" +msgstr "Malediwski" msgid "Dzongkha" -msgstr "" +msgstr "Dzongkha" msgid "Ewe" -msgstr "" +msgstr "Ewe" msgid "Greek" -msgstr "" +msgstr "Grecki" msgid "English" -msgstr "" +msgstr "Angielski" msgid "English (Canada)" -msgstr "" +msgstr "Angielski (Kanada)" msgid "English (UK)" msgstr "" @@ -1361,427 +1363,427 @@ msgid "English (USA)" msgstr "" msgid "Esperanto" -msgstr "" +msgstr "Esperanto" msgid "Spanish" -msgstr "" +msgstr "Hiszpański" msgid "Estonian" -msgstr "" +msgstr "Estoński" msgid "Basque" -msgstr "" +msgstr "Baskijski" msgid "Persian" -msgstr "" +msgstr "Perski" msgid "Fulah" -msgstr "" +msgstr "Fulah" msgid "Finnish" -msgstr "" +msgstr "Fiński" msgid "Fijian" -msgstr "" +msgstr "Fidżyjski" msgid "Faroese" -msgstr "" +msgstr "Faroese" msgid "French" -msgstr "" +msgstr "Francuski" msgid "Frisian" -msgstr "" +msgstr "Fryzyjski" msgid "Irish" -msgstr "" +msgstr "Irlandzki" msgid "Gaelic" -msgstr "" +msgstr "Gaelicki" msgid "Galician" -msgstr "" +msgstr "Galicyjski" msgid "Guarani" -msgstr "" +msgstr "Guarani" msgid "Gujarati" -msgstr "" +msgstr "Gujarati" msgid "Manx" -msgstr "" +msgstr "Manx" msgid "Hausa" -msgstr "" +msgstr "Hausa" msgid "Hebrew" -msgstr "" +msgstr "Hebrajski" msgid "Hindi" -msgstr "" +msgstr "Hindi" msgid "Hiri Motu" -msgstr "" +msgstr "Hiri motu" msgid "Croatian" -msgstr "" +msgstr "Chorwacki" msgid "Haitian" -msgstr "" +msgstr "Haitański" msgid "Hungarian" -msgstr "" +msgstr "Węgierski" msgid "Armenian" -msgstr "" +msgstr "Armeński" msgid "Herero" -msgstr "" +msgstr "Herero" msgid "Interlingua" -msgstr "" +msgstr "Interlingwa" msgid "Indonesian" -msgstr "" +msgstr "Indonezyjski" msgid "Occidental" -msgstr "" +msgstr "Occidental" msgid "Igbo" -msgstr "" +msgstr "Igbo" msgid "Nuosu" -msgstr "" +msgstr "Nuosu" msgid "Inupiaq" -msgstr "" +msgstr "Inupiak" msgid "Ido" -msgstr "" +msgstr "Ido" msgid "Icelandic" -msgstr "" +msgstr "Islandzki" msgid "Italian" -msgstr "" +msgstr "Włoski" msgid "Inuktitut" -msgstr "" +msgstr "Inuktitut" msgid "Japanese" -msgstr "" +msgstr "Japoński" msgid "Javanese" -msgstr "" +msgstr "Jawajski" msgid "Georgian" -msgstr "" +msgstr "Gruziński" msgid "Kongo" -msgstr "" +msgstr "Kikongo" msgid "Gikuyu" -msgstr "" +msgstr "Kikuju" msgid "Kwanyama" -msgstr "" +msgstr "Kwanyama" msgid "Kazakh" -msgstr "" +msgstr "Kazachski" msgid "Greenlandic" -msgstr "" +msgstr "Grenlandzki" msgid "Kannada" -msgstr "" +msgstr "Kannada" msgid "Korean" -msgstr "" +msgstr "Koreański" msgid "Kanuri" -msgstr "" +msgstr "Kanuri" msgid "Kashmiri" -msgstr "" +msgstr "Kaszmirski" msgid "Kurdish" -msgstr "" +msgstr "Kurdyjski" msgid "Komi" -msgstr "" +msgstr "Komi" msgid "Cornish" -msgstr "" +msgstr "Kornijski" msgid "Kyrgyz" -msgstr "" +msgstr "Kirgiski" msgid "Latin" -msgstr "" +msgstr "Łaciński" msgid "Luxembourgish" -msgstr "" +msgstr "Luksemburski" msgid "Luganda" -msgstr "" +msgstr "Luganda" msgid "Limburgish" -msgstr "" +msgstr "Limburski" msgid "Lingala" -msgstr "" +msgstr "Lingala" msgid "Lao" -msgstr "" +msgstr "Laotański" msgid "Lithuanian" -msgstr "" +msgstr "Litewski" msgid "Luba-Katanga" -msgstr "" +msgstr "Luba-Katanga" msgid "Latvian" -msgstr "" +msgstr "Łotewski" msgid "Malagasy" -msgstr "" +msgstr "Malgaski" msgid "Marshallese" -msgstr "" +msgstr "Marszalski" msgid "Maori" -msgstr "" +msgstr "Maoryski" msgid "Macedonian" -msgstr "" +msgstr "Macedoński" msgid "Malayalam" -msgstr "" +msgstr "Malajalam" msgid "Mongolian" -msgstr "" +msgstr "Mongolski" msgid "Marathi" -msgstr "" +msgstr "Marathi" msgid "Malay" -msgstr "" +msgstr "Malajski" msgid "Maltese" -msgstr "" +msgstr "Maltański" msgid "Burmese" -msgstr "" +msgstr "Birmański" msgid "Nauru" -msgstr "" +msgstr "Nauruański" msgid "Nepali" -msgstr "" +msgstr "Nepalski" msgid "Ndonga" -msgstr "" +msgstr "Ndonga" msgid "Dutch" -msgstr "" +msgstr "Niderlandzki" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "Norweski (Nynorsk)" msgid "Navaho" -msgstr "" +msgstr "Nawaho" msgid "Nyanja" -msgstr "" +msgstr "Nyanja" msgid "Occitan" -msgstr "" +msgstr "Oksytański" msgid "Ojibwe" -msgstr "" +msgstr "Odżibwe" msgid "Oromo" -msgstr "" +msgstr "Oromo" msgid "Odia" -msgstr "" +msgstr "Orija" msgid "Ossetian" -msgstr "" +msgstr "Osetyjski" msgid "Panjabi" msgstr "" msgid "Pali" -msgstr "" +msgstr "Pali" msgid "Polish" -msgstr "" +msgstr "Polski" msgid "Pashto" -msgstr "" +msgstr "Pashto" msgid "Portuguese" -msgstr "" +msgstr "Portugalski" msgid "Portuguese (Brazil)" -msgstr "" +msgstr "Portugalski (Brazylia)" msgid "Portuguese (Portugal)" -msgstr "" +msgstr "Portugalski (Portugalia)" msgid "Quechua" -msgstr "" +msgstr "Keczua" msgid "Romansh" -msgstr "" +msgstr "Retoromański" msgid "Rundi" -msgstr "" +msgstr "Rundi" msgid "Romanian" -msgstr "" +msgstr "Rumuński" msgid "Russian" -msgstr "" +msgstr "Rosyjski" msgid "Kinyarwanda" -msgstr "" +msgstr "Ruanda-rundi" msgid "Sanskrit" -msgstr "" +msgstr "Sanskryt" msgid "Sardinian" -msgstr "" +msgstr "Sardyński" msgid "Sindhi" -msgstr "" +msgstr "Sindhi" msgid "Sango" -msgstr "" +msgstr "Sango" msgid "Sinhala" -msgstr "" +msgstr "Syngaleski" msgid "Slovak" -msgstr "" +msgstr "Słowacki" msgid "Slovenian" -msgstr "" +msgstr "Słoweński" msgid "Samoan" -msgstr "" +msgstr "Samoański" msgid "Shona" -msgstr "" +msgstr "Shona" msgid "Somali" -msgstr "" +msgstr "Somalijski" msgid "Albanian" -msgstr "" +msgstr "Albański" msgid "Serbian" -msgstr "" +msgstr "Serbski" msgid "Swati" -msgstr "" +msgstr "Suazi" msgid "Sundanese" -msgstr "" +msgstr "Sundajski" msgid "Swedish" -msgstr "" +msgstr "Szwedzki" msgid "Swahili" -msgstr "" +msgstr "Suahili" msgid "Tamil" -msgstr "" +msgstr "Tamilski" msgid "Telugu" -msgstr "" +msgstr "Telugu" msgid "Tajik" -msgstr "" +msgstr "Tadżycki" msgid "Thai" -msgstr "" +msgstr "Tajski" msgid "Tigrinya" -msgstr "" +msgstr "Tigrinia" msgid "Turkmen" -msgstr "" +msgstr "Turkmeński" msgid "Tagalog" -msgstr "" +msgstr "Tagalog" msgid "Tswana" -msgstr "" +msgstr "Tswana" msgid "Tongan" -msgstr "" +msgstr "Tongan" msgid "Turkish" -msgstr "" +msgstr "Turecki" msgid "Tsonga" -msgstr "" +msgstr "Tsonga" msgid "Tatar" -msgstr "" +msgstr "Tatarski" msgid "Twi" -msgstr "" +msgstr "Twi" msgid "Tahitian" -msgstr "" +msgstr "Tahitański" msgid "Uyghur" -msgstr "" +msgstr "Ujgurski" msgid "Ukrainian" -msgstr "" +msgstr "Ukraiński" msgid "Urdu" -msgstr "" +msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Uzbecki" msgid "Venda" -msgstr "" +msgstr "Venda" msgid "Vietnamese" -msgstr "" +msgstr "Wietnamski" msgid "Volapük" -msgstr "" +msgstr "Volapük" msgid "Walloon" -msgstr "" +msgstr "Waloński" msgid "Wolof" -msgstr "" +msgstr "Wolof" msgid "Xhosa" -msgstr "" +msgstr "Xhosa" msgid "Yiddish" -msgstr "" +msgstr "Yiddish" msgid "Yoruba" -msgstr "" +msgstr "Joruba" msgid "Zhuang" -msgstr "" +msgstr "Zhuang" msgid "Chinese (Traditional)" msgstr "" msgid "Zulu" -msgstr "" +msgstr "Zulu" msgid "(no translation)" msgstr "" diff --git a/po/pt_br.po b/po/pt_br.po index 62629b1d..7ed7d400 100644 --- a/po/pt_br.po +++ b/po/pt_br.po @@ -8,16 +8,16 @@ msgstr "" "Project-Id-Version: Pure Data 0.53.0\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" "POT-Creation-Date: 2024-07-08 15:19+0200\n" -"PO-Revision-Date: 2024-05-06 18:51+0000\n" +"PO-Revision-Date: 2024-07-08 17:32+0200\n" "Last-Translator: porres \n" "Language-Team: Portuguese (Brazil) \n" -"Language: pt_br\n" +"Language: pt_BR\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.5.4-dev\n" +"X-Generator: Poedit 3.4.4\n" msgid "linear" msgstr "linear" @@ -1257,43 +1257,43 @@ msgid "The language can only be set during startup." msgstr "O idioma só pode ser setada durante a inicialização." msgid "Afar" -msgstr "" +msgstr "Afar" msgid "Abkhazian" -msgstr "" +msgstr "Abcázio" msgid "Avestan" -msgstr "" +msgstr "Avéstico" msgid "Afrikaans" msgstr "Africâner" msgid "Akan" -msgstr "" +msgstr "Acã" msgid "Amharic" -msgstr "" +msgstr "Amárico" msgid "Aragonese" -msgstr "" +msgstr "Aragonês" msgid "Arabic" msgstr "Árabe" msgid "Assamese" -msgstr "" +msgstr "Assamês" msgid "Avaric" -msgstr "" +msgstr "Avar" msgid "Aymara" -msgstr "" +msgstr "Aimará" msgid "Azerbaijani" -msgstr "Azerbaijano" +msgstr "Azeri" msgid "Bashkir" -msgstr "" +msgstr "Bashkir" msgid "Belarusian" msgstr "Bielorrusso" @@ -1302,55 +1302,52 @@ msgid "Bulgarian" msgstr "Búlgaro" msgid "Bihari" -msgstr "" +msgstr "Biari" msgid "Bislama" -msgstr "" +msgstr "Bislamá" msgid "Bambara" -msgstr "" +msgstr "Bambara" msgid "Bengali" -msgstr "" +msgstr "Bengali" msgid "Tibetan" -msgstr "" +msgstr "Tibetano" msgid "Breton" -msgstr "" +msgstr "Bretão" msgid "Bosnian" -msgstr "" +msgstr "Bósnio" -#, fuzzy msgid "Catalan" -msgstr "fatal" +msgstr "Catalão" -#, fuzzy msgid "Chechen" -msgstr "Checar" +msgstr "Checheno" msgid "Chamorro" -msgstr "" +msgstr "Chamorro" msgid "Corsican" -msgstr "" +msgstr "Corsa" msgid "Cree" -msgstr "" +msgstr "Cree" msgid "Czech" -msgstr "" +msgstr "Tcheco" msgid "Chuvash" -msgstr "" +msgstr "Tchuvache" msgid "Welsh" -msgstr "" +msgstr "Galês" -#, fuzzy msgid "Danish" -msgstr "Espanhol" +msgstr "Dinamarquês" msgid "German" msgstr "Alemão" @@ -1359,13 +1356,13 @@ msgid "German (Austria)" msgstr "Alemão (Áustria)" msgid "Dhivehi" -msgstr "" +msgstr "Maldivense" msgid "Dzongkha" -msgstr "" +msgstr "Butanês" msgid "Ewe" -msgstr "" +msgstr "Ewe" msgid "Greek" msgstr "Grego" @@ -1383,270 +1380,265 @@ msgid "English (USA)" msgstr "Inglês (EUA)" msgid "Esperanto" -msgstr "" +msgstr "Esperanto" msgid "Spanish" msgstr "Espanhol" msgid "Estonian" -msgstr "" +msgstr "Estoniano" msgid "Basque" msgstr "Basco" -#, fuzzy msgid "Persian" -msgstr "Versão" +msgstr "Persa" msgid "Fulah" -msgstr "" +msgstr "Fula" msgid "Finnish" -msgstr "Finlândia" +msgstr "Finlandês" msgid "Fijian" -msgstr "" +msgstr "Fijiano" msgid "Faroese" -msgstr "" +msgstr "Feroês" msgid "French" msgstr "Francês" msgid "Frisian" -msgstr "" +msgstr "Frísia" msgid "Irish" -msgstr "" +msgstr "Irlandês" msgid "Gaelic" -msgstr "" +msgstr "Gaélico (Escócia)" msgid "Galician" -msgstr "" +msgstr "Galego" msgid "Guarani" -msgstr "" +msgstr "Guarani" msgid "Gujarati" -msgstr "Gujardo" +msgstr "Guzerate" msgid "Manx" -msgstr "" +msgstr "Manx" msgid "Hausa" -msgstr "" +msgstr "Hauçá" msgid "Hebrew" msgstr "Hebraico" msgid "Hindi" -msgstr "Híndi" +msgstr "Hindi" msgid "Hiri Motu" -msgstr "" +msgstr "Hiri Motu" msgid "Croatian" -msgstr "" +msgstr "Croata" msgid "Haitian" -msgstr "" +msgstr "Haitiano" msgid "Hungarian" msgstr "Húngaro" msgid "Armenian" -msgstr "Arménio" +msgstr "Armênio" msgid "Herero" -msgstr "" +msgstr "Herero" msgid "Interlingua" -msgstr "" +msgstr "Interlíngua" msgid "Indonesian" msgstr "Indonésio" msgid "Occidental" -msgstr "" +msgstr "Ocidental" msgid "Igbo" -msgstr "" +msgstr "Igbo" msgid "Nuosu" -msgstr "" +msgstr "Nuosu" msgid "Inupiaq" -msgstr "" +msgstr "Inupiaq" msgid "Ido" -msgstr "" +msgstr "Ido" msgid "Icelandic" -msgstr "" +msgstr "Islandês" msgid "Italian" msgstr "Italiano" msgid "Inuktitut" -msgstr "" +msgstr "Inuctitut" msgid "Japanese" msgstr "Japonês" -#, fuzzy msgid "Javanese" -msgstr "Japonês" +msgstr "Javanês" msgid "Georgian" -msgstr "" +msgstr "Georgiano" msgid "Kongo" -msgstr "" +msgstr "Quicongo" msgid "Gikuyu" -msgstr "" +msgstr "Kikuyu" msgid "Kwanyama" -msgstr "" +msgstr "Cuanhama" msgid "Kazakh" -msgstr "" +msgstr "Cazaque" msgid "Greenlandic" -msgstr "" +msgstr "Groenlandês" msgid "Kannada" -msgstr "" +msgstr "Canarês" msgid "Korean" msgstr "Coreano" msgid "Kanuri" -msgstr "" +msgstr "Kanuri" msgid "Kashmiri" -msgstr "" +msgstr "Caxemira" msgid "Kurdish" -msgstr "" +msgstr "Curdo" msgid "Komi" -msgstr "" +msgstr "Komi" msgid "Cornish" -msgstr "" +msgstr "Córnico" msgid "Kyrgyz" -msgstr "" +msgstr "Quirguiz" msgid "Latin" -msgstr "" +msgstr "Latim" msgid "Luxembourgish" -msgstr "" +msgstr "Luxemburguês" msgid "Luganda" -msgstr "" +msgstr "Luganda" msgid "Limburgish" -msgstr "" +msgstr "Limburgo" msgid "Lingala" -msgstr "" +msgstr "Lingala" -#, fuzzy msgid "Lao" -msgstr "Log" +msgstr "Laosiano" msgid "Lithuanian" -msgstr "" +msgstr "Lituano" msgid "Luba-Katanga" -msgstr "" +msgstr "Kiluba" msgid "Latvian" -msgstr "" +msgstr "Letão" msgid "Malagasy" -msgstr "" +msgstr "Malgaxe" msgid "Marshallese" -msgstr "" +msgstr "Marshalesa" msgid "Maori" -msgstr "" +msgstr "Maori" msgid "Macedonian" -msgstr "" +msgstr "Macedônio" msgid "Malayalam" -msgstr "" +msgstr "Malaiala" msgid "Mongolian" -msgstr "" +msgstr "Mongol" -#, fuzzy msgid "Marathi" -msgstr "Gujardo" +msgstr "Marati" msgid "Malay" -msgstr "" +msgstr "Malaio" msgid "Maltese" -msgstr "" +msgstr "Maltês" msgid "Burmese" -msgstr "" +msgstr "Birmanês" msgid "Nauru" -msgstr "" +msgstr "Nauruano" msgid "Nepali" -msgstr "" +msgstr "Nepalês" msgid "Ndonga" -msgstr "" +msgstr "Xindonga" msgid "Dutch" msgstr "Holandês" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "Novo norueguês" msgid "Navaho" -msgstr "" +msgstr "Navajo" -#, fuzzy msgid "Nyanja" -msgstr "Panjábi" +msgstr "Nianja" msgid "Occitan" -msgstr "" +msgstr "Provençal" msgid "Ojibwe" -msgstr "" +msgstr "Ojíbua" msgid "Oromo" -msgstr "" +msgstr "Oromo" msgid "Odia" -msgstr "" +msgstr "Oriá" msgid "Ossetian" -msgstr "" +msgstr "Ossétia" msgid "Panjabi" msgstr "Panjábi" msgid "Pali" -msgstr "" +msgstr "Páli" msgid "Polish" msgstr "Polonês" msgid "Pashto" -msgstr "" +msgstr "Afegão" msgid "Portuguese" msgstr "Português" @@ -1658,159 +1650,157 @@ msgid "Portuguese (Portugal)" msgstr "Português (Portugal)" msgid "Quechua" -msgstr "" +msgstr "Quíchua" msgid "Romansh" -msgstr "" +msgstr "Romanche" msgid "Rundi" -msgstr "" +msgstr "Kirundi" -#, fuzzy msgid "Romanian" -msgstr "Albanês" +msgstr "Romeno" msgid "Russian" msgstr "Russo" msgid "Kinyarwanda" -msgstr "" +msgstr "Quiniaruanda" msgid "Sanskrit" -msgstr "" +msgstr "Sânscrito" -#, fuzzy msgid "Sardinian" -msgstr "Ucraniano" +msgstr "Sardo" msgid "Sindhi" -msgstr "" +msgstr "Sindi" msgid "Sango" -msgstr "" +msgstr "Sango" msgid "Sinhala" -msgstr "" +msgstr "Cingalês" msgid "Slovak" -msgstr "" +msgstr "Eslovaco" msgid "Slovenian" -msgstr "" +msgstr "Esloveno" msgid "Samoan" -msgstr "" +msgstr "Samoano" msgid "Shona" -msgstr "" +msgstr "Chona" msgid "Somali" -msgstr "" +msgstr "Somali" msgid "Albanian" msgstr "Albanês" msgid "Serbian" -msgstr "" +msgstr "Sérvio" msgid "Swati" -msgstr "" +msgstr "Suázi" msgid "Sundanese" -msgstr "" +msgstr "Sundanês" msgid "Swedish" msgstr "Sueco" msgid "Swahili" -msgstr "" +msgstr "Suaíle" msgid "Tamil" -msgstr "" +msgstr "Tâmil" msgid "Telugu" -msgstr "" +msgstr "Telugu" msgid "Tajik" -msgstr "" +msgstr "Tadjique" msgid "Thai" -msgstr "" +msgstr "Tailandês" msgid "Tigrinya" -msgstr "" +msgstr "Tigrínia" msgid "Turkmen" -msgstr "" +msgstr "Turcomeno" msgid "Tagalog" -msgstr "" +msgstr "Tagalo" msgid "Tswana" -msgstr "" +msgstr "Tswana" msgid "Tongan" -msgstr "" +msgstr "Tonganês" msgid "Turkish" msgstr "Turco" msgid "Tsonga" -msgstr "" +msgstr "Tsonga" msgid "Tatar" -msgstr "" +msgstr "Tártaro" msgid "Twi" -msgstr "" +msgstr "Axanti" msgid "Tahitian" -msgstr "" +msgstr "Taitiano" msgid "Uyghur" -msgstr "" +msgstr "Uigur" msgid "Ukrainian" msgstr "Ucraniano" msgid "Urdu" -msgstr "" +msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Uzbeque" msgid "Venda" -msgstr "" +msgstr "Venda" msgid "Vietnamese" msgstr "Vietnamita" msgid "Volapük" -msgstr "" +msgstr "Volapuque" msgid "Walloon" -msgstr "" +msgstr "Valão" msgid "Wolof" -msgstr "" +msgstr "Wolof" msgid "Xhosa" -msgstr "" +msgstr "Xhosa" msgid "Yiddish" -msgstr "" +msgstr "Iídiche" msgid "Yoruba" -msgstr "" +msgstr "Iorubá" msgid "Zhuang" -msgstr "" +msgstr "Zhuang" msgid "Chinese (Traditional)" msgstr "Chinês (Tradicional)" msgid "Zulu" -msgstr "" +msgstr "Zulu" msgid "(no translation)" msgstr "(sem tradução)" diff --git a/po/pt_pt.po b/po/pt_pt.po index f490998b..0fac7c68 100644 --- a/po/pt_pt.po +++ b/po/pt_pt.po @@ -8,18 +8,16 @@ msgstr "" "Project-Id-Version: Pure Data 0.43\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" "POT-Creation-Date: 2024-07-08 15:19+0200\n" -"PO-Revision-Date: 2023-12-19 16:08+0000\n" +"PO-Revision-Date: 2024-07-08 17:33+0200\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese (Portugal) \n" -"Language: pt_pt\n" +"Language: pt_PT\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.3\n" -"X-Poedit-Language: Portuguese\n" -"X-Poedit-Country: PORTUGAL\n" +"X-Generator: Poedit 3.4.4\n" msgid "linear" msgstr "linear" @@ -1257,43 +1255,43 @@ msgid "The language can only be set during startup." msgstr "" msgid "Afar" -msgstr "" +msgstr "Afar" msgid "Abkhazian" -msgstr "" +msgstr "Abcásio" msgid "Avestan" -msgstr "" +msgstr "Avestan" msgid "Afrikaans" -msgstr "Africâner" +msgstr "Africânder" msgid "Akan" -msgstr "" +msgstr "Acano" msgid "Amharic" -msgstr "" +msgstr "Amárico" msgid "Aragonese" -msgstr "" +msgstr "Aragonês" msgid "Arabic" msgstr "Árabe" msgid "Assamese" -msgstr "" +msgstr "Assamês" msgid "Avaric" -msgstr "" +msgstr "Avárico" msgid "Aymara" -msgstr "" +msgstr "Aimará" msgid "Azerbaijani" -msgstr "Azerbaijano" +msgstr "Azerbaijanês" msgid "Bashkir" -msgstr "" +msgstr "Bashkir" msgid "Belarusian" msgstr "Bielorrusso" @@ -1302,55 +1300,52 @@ msgid "Bulgarian" msgstr "Búlgaro" msgid "Bihari" -msgstr "" +msgstr "Bihari" msgid "Bislama" -msgstr "" +msgstr "Bislama" msgid "Bambara" -msgstr "" +msgstr "Bambara" msgid "Bengali" -msgstr "" +msgstr "Bengali" msgid "Tibetan" -msgstr "" +msgstr "Tibetano" msgid "Breton" -msgstr "" +msgstr "Bretão" msgid "Bosnian" -msgstr "" +msgstr "Bósnio" -#, fuzzy msgid "Catalan" -msgstr "fatal" +msgstr "Catalão" -#, fuzzy msgid "Chechen" -msgstr "Checar" +msgstr "Tchetcheno" msgid "Chamorro" -msgstr "" +msgstr "Chamorro" msgid "Corsican" -msgstr "" +msgstr "Córsico" msgid "Cree" -msgstr "" +msgstr "Cree" msgid "Czech" -msgstr "" +msgstr "Checo" msgid "Chuvash" -msgstr "" +msgstr "Chuvash" msgid "Welsh" -msgstr "" +msgstr "Galês" -#, fuzzy msgid "Danish" -msgstr "Espanhol" +msgstr "Dinamarquês" msgid "German" msgstr "Alemão" @@ -1359,13 +1354,13 @@ msgid "German (Austria)" msgstr "Alemão (Áustria)" msgid "Dhivehi" -msgstr "" +msgstr "Dhivehi" msgid "Dzongkha" -msgstr "" +msgstr "Dzonga" msgid "Ewe" -msgstr "" +msgstr "Ewe" msgid "Greek" msgstr "Grego" @@ -1383,74 +1378,73 @@ msgid "English (USA)" msgstr "Inglês (EUA)" msgid "Esperanto" -msgstr "" +msgstr "Esperanto" msgid "Spanish" msgstr "Espanhol" msgid "Estonian" -msgstr "" +msgstr "Estónio" msgid "Basque" msgstr "Basco" -#, fuzzy msgid "Persian" -msgstr "Versão" +msgstr "Persa" msgid "Fulah" -msgstr "" +msgstr "Fula" msgid "Finnish" -msgstr "Finlândia" +msgstr "Finlandês" msgid "Fijian" -msgstr "" +msgstr "Fijan" msgid "Faroese" -msgstr "" +msgstr "Faroês" msgid "French" msgstr "Francês" msgid "Frisian" -msgstr "" +msgstr "Frísio" msgid "Irish" -msgstr "" +msgstr "Irlandês" msgid "Gaelic" -msgstr "" +msgstr "Gaélico" msgid "Galician" -msgstr "" +msgstr "Galego" msgid "Guarani" -msgstr "" +msgstr "Guarani" msgid "Gujarati" -msgstr "Gujardo" +msgstr "Gujarati" msgid "Manx" -msgstr "" +msgstr "Manês (Ilha de Man)" msgid "Hausa" -msgstr "" +msgstr "Hausa" msgid "Hebrew" msgstr "Hebraico" msgid "Hindi" -msgstr "Híndi" +msgstr "Hindi" msgid "Hiri Motu" -msgstr "" +msgstr "Hiri Motu (jirimotu)" msgid "Croatian" -msgstr "" +msgstr "Croata" msgid "Haitian" -msgstr "" +msgstr "Haitiano" msgid "Hungarian" msgstr "Húngaro" @@ -1459,194 +1453,190 @@ msgid "Armenian" msgstr "Arménio" msgid "Herero" -msgstr "" +msgstr "Herero" msgid "Interlingua" -msgstr "" +msgstr "Interlíngua" msgid "Indonesian" msgstr "Indonésio" msgid "Occidental" -msgstr "" +msgstr "Provençal" msgid "Igbo" -msgstr "" +msgstr "Igbo" msgid "Nuosu" -msgstr "" +msgstr "Nuosu" msgid "Inupiaq" -msgstr "" +msgstr "Inupiaq" msgid "Ido" -msgstr "" +msgstr "Ido" msgid "Icelandic" -msgstr "" +msgstr "Islandês" msgid "Italian" msgstr "Italiano" msgid "Inuktitut" -msgstr "" +msgstr "Inuktitut" msgid "Japanese" msgstr "Japonês" -#, fuzzy msgid "Javanese" -msgstr "Japonês" +msgstr "Javanês" msgid "Georgian" -msgstr "" +msgstr "Georgiano" msgid "Kongo" -msgstr "" +msgstr "Kongo" msgid "Gikuyu" -msgstr "" +msgstr "Kikuyu" msgid "Kwanyama" -msgstr "" +msgstr "Kwanyama" msgid "Kazakh" -msgstr "" +msgstr "Cazaquistanês" msgid "Greenlandic" -msgstr "" +msgstr "Gronelandês" msgid "Kannada" -msgstr "" +msgstr "Kannada" msgid "Korean" msgstr "Coreano" msgid "Kanuri" -msgstr "" +msgstr "Kanuri" msgid "Kashmiri" -msgstr "" +msgstr "Cachemirês" msgid "Kurdish" -msgstr "" +msgstr "Curdo" msgid "Komi" -msgstr "" +msgstr "Komi" msgid "Cornish" -msgstr "" +msgstr "Cornualha" msgid "Kyrgyz" -msgstr "" +msgstr "Quirguiz" msgid "Latin" -msgstr "" +msgstr "Latim" msgid "Luxembourgish" -msgstr "" +msgstr "Luxemburguês" msgid "Luganda" -msgstr "" +msgstr "Luganda" msgid "Limburgish" -msgstr "" +msgstr "Limburguês" msgid "Lingala" -msgstr "" +msgstr "Lingala" -#, fuzzy msgid "Lao" -msgstr "Log" +msgstr "Laoês" msgid "Lithuanian" -msgstr "" +msgstr "Lituano" msgid "Luba-Katanga" -msgstr "" +msgstr "Luba-Katanga" msgid "Latvian" -msgstr "" +msgstr "Letão" msgid "Malagasy" -msgstr "" +msgstr "Malgaxe" msgid "Marshallese" -msgstr "" +msgstr "Marshalês" msgid "Maori" -msgstr "" +msgstr "Maori" msgid "Macedonian" -msgstr "" +msgstr "Macedónio" msgid "Malayalam" -msgstr "" +msgstr "Malaiala" msgid "Mongolian" -msgstr "" +msgstr "Mongol" -#, fuzzy msgid "Marathi" -msgstr "Gujardo" +msgstr "Marati" msgid "Malay" -msgstr "" +msgstr "Malaio" msgid "Maltese" -msgstr "" +msgstr "Maltês" msgid "Burmese" -msgstr "" +msgstr "Birmanês" msgid "Nauru" -msgstr "" +msgstr "Nauruano" msgid "Nepali" -msgstr "" +msgstr "Nepalês" msgid "Ndonga" -msgstr "" +msgstr "Ndonga" msgid "Dutch" msgstr "Holandês" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "Norueguês (Nynors)" msgid "Navaho" -msgstr "" +msgstr "Navajo" -#, fuzzy msgid "Nyanja" -msgstr "Panjábi" +msgstr "Nyanja" msgid "Occitan" -msgstr "" +msgstr "Occitano" msgid "Ojibwe" -msgstr "" +msgstr "Ojibwe" msgid "Oromo" -msgstr "" +msgstr "Oromo" msgid "Odia" -msgstr "" +msgstr "Odia" msgid "Ossetian" -msgstr "" +msgstr "Ossetiano" msgid "Panjabi" msgstr "Panjábi" msgid "Pali" -msgstr "" +msgstr "Pali" msgid "Polish" -msgstr "Polonês" +msgstr "Polaco" msgid "Pashto" -msgstr "" +msgstr "Pashto" msgid "Portuguese" msgstr "Português" @@ -1658,159 +1648,157 @@ msgid "Portuguese (Portugal)" msgstr "Português (Portugal)" msgid "Quechua" -msgstr "" +msgstr "Quechua" msgid "Romansh" -msgstr "" +msgstr "Romanche" msgid "Rundi" -msgstr "" +msgstr "Rundi" -#, fuzzy msgid "Romanian" -msgstr "Albanês" +msgstr "Romeno" msgid "Russian" msgstr "Russo" msgid "Kinyarwanda" -msgstr "" +msgstr "Quiniarvanda" msgid "Sanskrit" -msgstr "" +msgstr "Sânscrito" -#, fuzzy msgid "Sardinian" -msgstr "Ucraniano" +msgstr "Sarda" msgid "Sindhi" -msgstr "" +msgstr "Sindi" msgid "Sango" -msgstr "" +msgstr "Sango" msgid "Sinhala" -msgstr "" +msgstr "Cingalês" msgid "Slovak" -msgstr "" +msgstr "Eslovaco" msgid "Slovenian" -msgstr "" +msgstr "Esloveno" msgid "Samoan" -msgstr "" +msgstr "Samoano" msgid "Shona" -msgstr "" +msgstr "Shona" msgid "Somali" -msgstr "" +msgstr "Somali" msgid "Albanian" msgstr "Albanês" msgid "Serbian" -msgstr "" +msgstr "Sérvio" msgid "Swati" -msgstr "" +msgstr "Swati" msgid "Sundanese" -msgstr "" +msgstr "Sundanês" msgid "Swedish" msgstr "Sueco" msgid "Swahili" -msgstr "" +msgstr "Suaíli" msgid "Tamil" -msgstr "" +msgstr "Tamil" msgid "Telugu" -msgstr "" +msgstr "Telugu" msgid "Tajik" -msgstr "" +msgstr "Tadjique" msgid "Thai" -msgstr "" +msgstr "Tailandês" msgid "Tigrinya" -msgstr "" +msgstr "Tigrínia" msgid "Turkmen" -msgstr "" +msgstr "Turcomeno" msgid "Tagalog" -msgstr "" +msgstr "Filipino" msgid "Tswana" -msgstr "" +msgstr "Tsuana" msgid "Tongan" -msgstr "" +msgstr "Tongan" msgid "Turkish" msgstr "Turco" msgid "Tsonga" -msgstr "" +msgstr "Tsonga" msgid "Tatar" -msgstr "" +msgstr "Tártaro" msgid "Twi" -msgstr "" +msgstr "Twi" msgid "Tahitian" -msgstr "" +msgstr "Taitiano" msgid "Uyghur" -msgstr "" +msgstr "Uyghur" msgid "Ukrainian" msgstr "Ucraniano" msgid "Urdu" -msgstr "" +msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Usbeque" msgid "Venda" -msgstr "" +msgstr "Venda" msgid "Vietnamese" msgstr "Vietnamita" msgid "Volapük" -msgstr "" +msgstr "Volapük" msgid "Walloon" -msgstr "" +msgstr "Valão" msgid "Wolof" -msgstr "" +msgstr "Wolof" msgid "Xhosa" -msgstr "" +msgstr "Xhosa" msgid "Yiddish" -msgstr "" +msgstr "Íidiche" msgid "Yoruba" -msgstr "" +msgstr "Ioruba" msgid "Zhuang" -msgstr "" +msgstr "Zhuang" msgid "Chinese (Traditional)" msgstr "Chinês (Tradicional)" msgid "Zulu" -msgstr "" +msgstr "Zulu" msgid "(no translation)" msgstr "(sem tradução)" diff --git a/po/ru.po b/po/ru.po index ccb294a1..1cb3c1e5 100644 --- a/po/ru.po +++ b/po/ru.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: 2024-07-08 15:19+0200\n" -"PO-Revision-Date: 2023-02-19 20:36+0000\n" +"PO-Revision-Date: 2024-07-08 17:33+0200\n" "Last-Translator: Alex Nadzharov \n" "Language-Team: Russian \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Poedit 3.4.4\n" msgid "linear" msgstr "линейный" @@ -1284,123 +1284,121 @@ msgid "The language can only be set during startup." msgstr "" msgid "Afar" -msgstr "" +msgstr "Афарский" msgid "Abkhazian" -msgstr "" +msgstr "Абхазский" msgid "Avestan" -msgstr "" +msgstr "Авестийский" msgid "Afrikaans" -msgstr "" +msgstr "Африкаанс" msgid "Akan" -msgstr "" +msgstr "Акан" msgid "Amharic" -msgstr "" +msgstr "Амхарский" msgid "Aragonese" -msgstr "" +msgstr "Арагонский" msgid "Arabic" -msgstr "" +msgstr "Арабский" msgid "Assamese" -msgstr "" +msgstr "Ассамский" msgid "Avaric" -msgstr "" +msgstr "Аварский" msgid "Aymara" -msgstr "" +msgstr "аймара" msgid "Azerbaijani" -msgstr "" +msgstr "Азербайджанский" msgid "Bashkir" -msgstr "" +msgstr "Башкирский" msgid "Belarusian" -msgstr "" +msgstr "Белорусский" msgid "Bulgarian" -msgstr "" +msgstr "Болгарский" msgid "Bihari" -msgstr "" +msgstr "Бихари" msgid "Bislama" -msgstr "" +msgstr "Бислама" msgid "Bambara" -msgstr "" +msgstr "Бамбара" msgid "Bengali" -msgstr "" +msgstr "Бенгальский" msgid "Tibetan" -msgstr "" +msgstr "Тибетский" msgid "Breton" -msgstr "" +msgstr "Бретонский" msgid "Bosnian" -msgstr "" +msgstr "Боснийский" -#, fuzzy msgid "Catalan" -msgstr "критические" +msgstr "Каталанский" -#, fuzzy msgid "Chechen" -msgstr "Проверить" +msgstr "Чеченский" msgid "Chamorro" -msgstr "" +msgstr "Чаморро" msgid "Corsican" -msgstr "" +msgstr "Корсиканский" msgid "Cree" -msgstr "" +msgstr "Кри" msgid "Czech" -msgstr "" +msgstr "Чешский" msgid "Chuvash" -msgstr "" +msgstr "Чувашский" msgid "Welsh" -msgstr "" +msgstr "Валлийский" msgid "Danish" -msgstr "" +msgstr "Датский" msgid "German" -msgstr "" +msgstr "Немецкий" msgid "German (Austria)" -msgstr "" +msgstr "Немецкий (Австрия)" msgid "Dhivehi" -msgstr "" +msgstr "Мальдивский" msgid "Dzongkha" -msgstr "" +msgstr "Дзонг-кэ" msgid "Ewe" -msgstr "" +msgstr "Эве" msgid "Greek" -msgstr "" +msgstr "Греческий" msgid "English" -msgstr "" +msgstr "Английский" msgid "English (Canada)" -msgstr "" +msgstr "Английский (Канада)" msgid "English (UK)" msgstr "" @@ -1409,429 +1407,427 @@ msgid "English (USA)" msgstr "" msgid "Esperanto" -msgstr "" +msgstr "Эсперанто" msgid "Spanish" -msgstr "" +msgstr "Испанский" msgid "Estonian" -msgstr "" +msgstr "Эстонский" msgid "Basque" -msgstr "" +msgstr "Баскский" -#, fuzzy msgid "Persian" -msgstr "Версия" +msgstr "Фарси" msgid "Fulah" -msgstr "" +msgstr "Фула" msgid "Finnish" -msgstr "" +msgstr "Финский" msgid "Fijian" -msgstr "" +msgstr "Фиджийский" msgid "Faroese" -msgstr "" +msgstr "Фарерский" msgid "French" -msgstr "" +msgstr "Французский" msgid "Frisian" -msgstr "" +msgstr "Фризский" msgid "Irish" -msgstr "" +msgstr "Ирландский" msgid "Gaelic" -msgstr "" +msgstr "Шотландский" msgid "Galician" -msgstr "" +msgstr "Галисийский" msgid "Guarani" -msgstr "" +msgstr "Гуарани" msgid "Gujarati" -msgstr "" +msgstr "Гуджарати" msgid "Manx" -msgstr "" +msgstr "Мэнский" msgid "Hausa" -msgstr "" +msgstr "Хауса" msgid "Hebrew" -msgstr "" +msgstr "Иврит" msgid "Hindi" -msgstr "" +msgstr "Хинди" msgid "Hiri Motu" -msgstr "" +msgstr "Хири-моту" msgid "Croatian" -msgstr "" +msgstr "Хорватский" msgid "Haitian" -msgstr "" +msgstr "Гаитянский" msgid "Hungarian" -msgstr "" +msgstr "Венгерский" msgid "Armenian" -msgstr "" +msgstr "Армянский" msgid "Herero" -msgstr "" +msgstr "Гереро" msgid "Interlingua" -msgstr "" +msgstr "Интерлингва" msgid "Indonesian" -msgstr "" +msgstr "Индонезийский" msgid "Occidental" -msgstr "" +msgstr "Окциденталь" msgid "Igbo" -msgstr "" +msgstr "Игбо" msgid "Nuosu" -msgstr "" +msgstr "Носу" msgid "Inupiaq" -msgstr "" +msgstr "Инупиак" msgid "Ido" -msgstr "" +msgstr "Идо" msgid "Icelandic" -msgstr "" +msgstr "Исландский" msgid "Italian" -msgstr "" +msgstr "Итальянский" msgid "Inuktitut" -msgstr "" +msgstr "Инуктитут" msgid "Japanese" -msgstr "" +msgstr "Японский" msgid "Javanese" -msgstr "" +msgstr "Яванский" msgid "Georgian" -msgstr "" +msgstr "Грузинский" msgid "Kongo" -msgstr "" +msgstr "Киконго" msgid "Gikuyu" -msgstr "" +msgstr "Кикуйю" msgid "Kwanyama" -msgstr "" +msgstr "Кваньяма" msgid "Kazakh" -msgstr "" +msgstr "Казахский" msgid "Greenlandic" -msgstr "" +msgstr "Гренландский" msgid "Kannada" -msgstr "" +msgstr "Каннада" msgid "Korean" -msgstr "" +msgstr "Корейский" msgid "Kanuri" -msgstr "" +msgstr "Канури" msgid "Kashmiri" -msgstr "" +msgstr "Кашмирский" msgid "Kurdish" -msgstr "" +msgstr "Курдский" msgid "Komi" -msgstr "" +msgstr "Коми" msgid "Cornish" -msgstr "" +msgstr "Корнский" msgid "Kyrgyz" -msgstr "" +msgstr "Кыргызский" msgid "Latin" -msgstr "" +msgstr "Латинский" msgid "Luxembourgish" -msgstr "" +msgstr "Люксембургский" msgid "Luganda" -msgstr "" +msgstr "Луганда" msgid "Limburgish" -msgstr "" +msgstr "Лимбургский" msgid "Lingala" -msgstr "" +msgstr "Лингала" -#, fuzzy msgid "Lao" -msgstr "Журнал" +msgstr "Лаосский" msgid "Lithuanian" -msgstr "" +msgstr "Литовский" msgid "Luba-Katanga" -msgstr "" +msgstr "Луба-катанга" msgid "Latvian" -msgstr "" +msgstr "Латышский" msgid "Malagasy" -msgstr "" +msgstr "Малагасийский" msgid "Marshallese" -msgstr "" +msgstr "Маршалльский" msgid "Maori" -msgstr "" +msgstr "Маори" msgid "Macedonian" -msgstr "" +msgstr "Македонский (современный)" msgid "Malayalam" -msgstr "" +msgstr "Малаялам" msgid "Mongolian" -msgstr "" +msgstr "Монгольский" msgid "Marathi" -msgstr "" +msgstr "Маратхи" msgid "Malay" -msgstr "" +msgstr "Малайский" msgid "Maltese" -msgstr "" +msgstr "Мальтийский" msgid "Burmese" -msgstr "" +msgstr "Бирманский" msgid "Nauru" -msgstr "" +msgstr "Науруанский" msgid "Nepali" -msgstr "" +msgstr "Непальский" msgid "Ndonga" -msgstr "" +msgstr "Ндонга" msgid "Dutch" -msgstr "" +msgstr "Нидерландский" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "Норвежский (нюношк)" msgid "Navaho" -msgstr "" +msgstr "Навахо" msgid "Nyanja" -msgstr "" +msgstr "Ньянджа" msgid "Occitan" -msgstr "" +msgstr "Окситанский" msgid "Ojibwe" -msgstr "" +msgstr "Оджибве" msgid "Oromo" -msgstr "" +msgstr "Оромо" msgid "Odia" -msgstr "" +msgstr "Ория" msgid "Ossetian" -msgstr "" +msgstr "Осетинский" msgid "Panjabi" msgstr "" msgid "Pali" -msgstr "" +msgstr "Пали" msgid "Polish" -msgstr "" +msgstr "Польский" msgid "Pashto" -msgstr "" +msgstr "Пушту" msgid "Portuguese" -msgstr "" +msgstr "Португальский" msgid "Portuguese (Brazil)" -msgstr "" +msgstr "Португальский (Бразилия)" msgid "Portuguese (Portugal)" -msgstr "" +msgstr "Португальский (Португалия)" msgid "Quechua" -msgstr "" +msgstr "Кечуа" msgid "Romansh" -msgstr "" +msgstr "Романшский" msgid "Rundi" -msgstr "" +msgstr "Рунди" msgid "Romanian" -msgstr "" +msgstr "Румынский" msgid "Russian" -msgstr "" +msgstr "Русский" msgid "Kinyarwanda" -msgstr "" +msgstr "Руанда" msgid "Sanskrit" -msgstr "" +msgstr "Санскрит" msgid "Sardinian" -msgstr "" +msgstr "Сардинский" msgid "Sindhi" -msgstr "" +msgstr "Синдхи" msgid "Sango" -msgstr "" +msgstr "Санго" msgid "Sinhala" -msgstr "" +msgstr "Сингальский" msgid "Slovak" -msgstr "" +msgstr "Словацкий" msgid "Slovenian" -msgstr "" +msgstr "Словенский" msgid "Samoan" -msgstr "" +msgstr "Самоанский" msgid "Shona" -msgstr "" +msgstr "Шона" msgid "Somali" -msgstr "" +msgstr "Сомалийский" msgid "Albanian" -msgstr "" +msgstr "Албанский" msgid "Serbian" -msgstr "" +msgstr "Сербский" msgid "Swati" -msgstr "" +msgstr "Свати" msgid "Sundanese" -msgstr "" +msgstr "Сунданский" msgid "Swedish" -msgstr "" +msgstr "Шведский" msgid "Swahili" -msgstr "" +msgstr "Суахили" msgid "Tamil" -msgstr "" +msgstr "Тамильский" msgid "Telugu" -msgstr "" +msgstr "Телугу" msgid "Tajik" -msgstr "" +msgstr "Таджикский" msgid "Thai" -msgstr "" +msgstr "Тайский" msgid "Tigrinya" -msgstr "" +msgstr "Тигринья" msgid "Turkmen" -msgstr "" +msgstr "Туркменский" msgid "Tagalog" -msgstr "" +msgstr "Тагальский" msgid "Tswana" -msgstr "" +msgstr "Тсвана" msgid "Tongan" -msgstr "" +msgstr "Тонганский" msgid "Turkish" -msgstr "" +msgstr "Турецкий" msgid "Tsonga" -msgstr "" +msgstr "Тсонга" msgid "Tatar" -msgstr "" +msgstr "Татарский" msgid "Twi" -msgstr "" +msgstr "Чви" msgid "Tahitian" -msgstr "" +msgstr "Таитянский" msgid "Uyghur" -msgstr "" +msgstr "Уйгурский" msgid "Ukrainian" -msgstr "" +msgstr "Украинский" msgid "Urdu" -msgstr "" +msgstr "Урду" msgid "Uzbek" -msgstr "" +msgstr "Узбекский" msgid "Venda" -msgstr "" +msgstr "Венда" msgid "Vietnamese" -msgstr "" +msgstr "Вьетнамский" msgid "Volapük" -msgstr "" +msgstr "Волапюк" msgid "Walloon" -msgstr "" +msgstr "Валлонский" msgid "Wolof" -msgstr "" +msgstr "Волоф" msgid "Xhosa" -msgstr "" +msgstr "Коса" msgid "Yiddish" -msgstr "" +msgstr "Идиш" msgid "Yoruba" -msgstr "" +msgstr "Йоруба" msgid "Zhuang" -msgstr "" +msgstr "Чжуанский" msgid "Chinese (Traditional)" msgstr "" msgid "Zulu" -msgstr "" +msgstr "Зулусский" #, fuzzy msgid "(no translation)" diff --git a/po/sq.po b/po/sq.po index 5960c79b..b439cc35 100644 --- a/po/sq.po +++ b/po/sq.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: Pure Data 0.43\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" "POT-Creation-Date: 2024-07-08 15:19+0200\n" -"PO-Revision-Date: 2005-03-07 11:12+0200\n" +"PO-Revision-Date: 2024-07-08 17:37+0200\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian \n" @@ -15,6 +15,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.4.4\n" msgid "linear" msgstr "" @@ -1291,121 +1292,121 @@ msgid "The language can only be set during startup." msgstr "" msgid "Afar" -msgstr "" +msgstr "Afarisht" msgid "Abkhazian" -msgstr "" +msgstr "Abkazisht" msgid "Avestan" -msgstr "" +msgstr "Avestisht" msgid "Afrikaans" -msgstr "" +msgstr "Afrikaans" msgid "Akan" -msgstr "" +msgstr "Akanisht" msgid "Amharic" -msgstr "" +msgstr "Amharike" msgid "Aragonese" -msgstr "" +msgstr "Aragonisht" msgid "Arabic" -msgstr "" +msgstr "Arabisht" msgid "Assamese" -msgstr "" +msgstr "Asameze" msgid "Avaric" -msgstr "" +msgstr "Avarisht" msgid "Aymara" -msgstr "" +msgstr "Ajmarisht" msgid "Azerbaijani" -msgstr "" +msgstr "Azerbajxhanisht" msgid "Bashkir" -msgstr "" +msgstr "Bashkirisht" msgid "Belarusian" -msgstr "" +msgstr "Bjellorusisht" msgid "Bulgarian" -msgstr "" +msgstr "Bullgarisht" msgid "Bihari" -msgstr "" +msgstr "Bihari" msgid "Bislama" -msgstr "" +msgstr "Bislamisht" msgid "Bambara" -msgstr "" +msgstr "Bambarisht" msgid "Bengali" -msgstr "" +msgstr "Bengalisht" msgid "Tibetan" -msgstr "" +msgstr "Tibetisht" msgid "Breton" -msgstr "" +msgstr "Bretonisht" msgid "Bosnian" -msgstr "" +msgstr "Boshnjake" msgid "Catalan" -msgstr "" +msgstr "Katalanisht" msgid "Chechen" -msgstr "" +msgstr "Çeçenisht" msgid "Chamorro" -msgstr "" +msgstr "Çamoroisht" msgid "Corsican" -msgstr "" +msgstr "Korsikanisht" msgid "Cree" -msgstr "" +msgstr "Kri" msgid "Czech" -msgstr "" +msgstr "Çekisht" msgid "Chuvash" -msgstr "" +msgstr "Çuvashisht" msgid "Welsh" -msgstr "" +msgstr "Uellsisht" msgid "Danish" -msgstr "" +msgstr "Danisht" msgid "German" -msgstr "" +msgstr "Gjermanisht" msgid "German (Austria)" -msgstr "" +msgstr "Gjermanisht (Austri)" msgid "Dhivehi" -msgstr "" +msgstr "Divehi" msgid "Dzongkha" -msgstr "" +msgstr "Xonga" msgid "Ewe" -msgstr "" +msgstr "Eveisht" msgid "Greek" -msgstr "" +msgstr "Greqisht" msgid "English" -msgstr "" +msgstr "Anglisht" msgid "English (Canada)" -msgstr "" +msgstr "Anglisht (Kanada)" msgid "English (UK)" msgstr "" @@ -1414,427 +1415,427 @@ msgid "English (USA)" msgstr "" msgid "Esperanto" -msgstr "" +msgstr "Esperanto" msgid "Spanish" -msgstr "" +msgstr "Spanjisht" msgid "Estonian" -msgstr "" +msgstr "Estonisht" msgid "Basque" -msgstr "" +msgstr "Baskisht" msgid "Persian" -msgstr "" +msgstr "Persisht" msgid "Fulah" -msgstr "" +msgstr "Fula" msgid "Finnish" -msgstr "" +msgstr "Finlandisht" msgid "Fijian" -msgstr "" +msgstr "Fixhianisht" msgid "Faroese" -msgstr "" +msgstr "Faroisht" msgid "French" -msgstr "" +msgstr "Frëngjisht" msgid "Frisian" -msgstr "" +msgstr "Frizisht" msgid "Irish" -msgstr "" +msgstr "Irlandisht" msgid "Gaelic" -msgstr "" +msgstr "Galisht" msgid "Galician" -msgstr "" +msgstr "Galicisht" msgid "Guarani" -msgstr "" +msgstr "Guaranisht" msgid "Gujarati" -msgstr "" +msgstr "Gujaratase" msgid "Manx" -msgstr "" +msgstr "Manksisht" msgid "Hausa" -msgstr "" +msgstr "Hausisht" msgid "Hebrew" -msgstr "" +msgstr "Hebraisht" msgid "Hindi" -msgstr "" +msgstr "Indisht" msgid "Hiri Motu" -msgstr "" +msgstr "Hiri Motu" msgid "Croatian" -msgstr "" +msgstr "Kroatisht" msgid "Haitian" -msgstr "" +msgstr "Haitisht" msgid "Hungarian" -msgstr "" +msgstr "Hungarisht" msgid "Armenian" -msgstr "" +msgstr "Armenisht" msgid "Herero" -msgstr "" +msgstr "Hereroisht" msgid "Interlingua" -msgstr "" +msgstr "Interlingua" msgid "Indonesian" -msgstr "" +msgstr "Indonezisht" msgid "Occidental" -msgstr "" +msgstr "Occidental" msgid "Igbo" -msgstr "" +msgstr "Igboisht" msgid "Nuosu" -msgstr "" +msgstr "Nuosu" msgid "Inupiaq" -msgstr "" +msgstr "Inupikisht" msgid "Ido" -msgstr "" +msgstr "Idoisht" msgid "Icelandic" -msgstr "" +msgstr "Islandisht" msgid "Italian" -msgstr "" +msgstr "Italisht" msgid "Inuktitut" -msgstr "" +msgstr "Inuktitut" msgid "Japanese" -msgstr "" +msgstr "Japonisht" msgid "Javanese" -msgstr "" +msgstr "Xhavanisht" msgid "Georgian" -msgstr "" +msgstr "Gjeorgjisht" msgid "Kongo" -msgstr "" +msgstr "Kongoisht" msgid "Gikuyu" -msgstr "" +msgstr "Gikuyu" msgid "Kwanyama" -msgstr "" +msgstr "Kwanyama" msgid "Kazakh" -msgstr "" +msgstr "Kazake" msgid "Greenlandic" -msgstr "" +msgstr "Groenlandisht" msgid "Kannada" -msgstr "" +msgstr "Kanadisht" msgid "Korean" -msgstr "" +msgstr "Koreanisht" msgid "Kanuri" -msgstr "" +msgstr "Kanurisht" msgid "Kashmiri" -msgstr "" +msgstr "Kashmire" msgid "Kurdish" -msgstr "" +msgstr "Kurdisht" msgid "Komi" -msgstr "" +msgstr "Komisht" msgid "Cornish" -msgstr "" +msgstr "Kornuellse" msgid "Kyrgyz" -msgstr "" +msgstr "Kirgizisht" msgid "Latin" -msgstr "" +msgstr "Latinisht" msgid "Luxembourgish" -msgstr "" +msgstr "Luksemburgisht" msgid "Luganda" -msgstr "" +msgstr "Luganda" msgid "Limburgish" -msgstr "" +msgstr "Limburgisht" msgid "Lingala" -msgstr "" +msgstr "Lingalisht" msgid "Lao" -msgstr "" +msgstr "Laosisht" msgid "Lithuanian" -msgstr "" +msgstr "Lituanisht" msgid "Luba-Katanga" -msgstr "" +msgstr "Luba-katangaisht" msgid "Latvian" -msgstr "" +msgstr "Letonisht" msgid "Malagasy" -msgstr "" +msgstr "Malagashe" msgid "Marshallese" -msgstr "" +msgstr "Marshallisht" msgid "Maori" -msgstr "" +msgstr "Maorisht" msgid "Macedonian" -msgstr "" +msgstr "Maqedonisht" msgid "Malayalam" -msgstr "" +msgstr "Malajalame" msgid "Mongolian" -msgstr "" +msgstr "Mongolisht" msgid "Marathi" -msgstr "" +msgstr "Marati" msgid "Malay" -msgstr "" +msgstr "Malaje" msgid "Maltese" -msgstr "" +msgstr "Maltisht" msgid "Burmese" -msgstr "" +msgstr "Burmeze" msgid "Nauru" -msgstr "" +msgstr "Nauru" msgid "Nepali" -msgstr "" +msgstr "Nepaleze" msgid "Ndonga" -msgstr "" +msgstr "Ndongaisht" msgid "Dutch" -msgstr "" +msgstr "Holandisht" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "Norvegjisht Nynorsk" msgid "Navaho" -msgstr "" +msgstr "Navaho" msgid "Nyanja" -msgstr "" +msgstr "Nianjisht" msgid "Occitan" -msgstr "" +msgstr "Oçitanisht" msgid "Ojibwe" -msgstr "" +msgstr "Ojibwe" msgid "Oromo" -msgstr "" +msgstr "Oromoisht" msgid "Odia" -msgstr "" +msgstr "Odisht" msgid "Ossetian" -msgstr "" +msgstr "Osetisht" msgid "Panjabi" msgstr "" msgid "Pali" -msgstr "" +msgstr "Palizisht" msgid "Polish" -msgstr "" +msgstr "Polonisht" msgid "Pashto" -msgstr "" +msgstr "Pashtoisht" msgid "Portuguese" -msgstr "" +msgstr "Portugalisht" msgid "Portuguese (Brazil)" -msgstr "" +msgstr "Portugalisht (Brazil)" msgid "Portuguese (Portugal)" -msgstr "" +msgstr "Portugalisht (Portugali)" msgid "Quechua" -msgstr "" +msgstr "Keçuaisht" msgid "Romansh" -msgstr "" +msgstr "Retoromanisht" msgid "Rundi" -msgstr "" +msgstr "Rundisht" msgid "Romanian" -msgstr "" +msgstr "Rumanisht" msgid "Russian" -msgstr "" +msgstr "Rusisht" msgid "Kinyarwanda" -msgstr "" +msgstr "Kiniaruandisht" msgid "Sanskrit" -msgstr "" +msgstr "Sanskritisht" msgid "Sardinian" -msgstr "" +msgstr "Sardinisht" msgid "Sindhi" -msgstr "" +msgstr "Sindisht" msgid "Sango" -msgstr "" +msgstr "Sangoisht" msgid "Sinhala" -msgstr "" +msgstr "Sinhalisht" msgid "Slovak" -msgstr "" +msgstr "Sllovakisht" msgid "Slovenian" -msgstr "" +msgstr "Sllovenisht" msgid "Samoan" -msgstr "" +msgstr "Samoanisht" msgid "Shona" -msgstr "" +msgstr "Shonisht" msgid "Somali" -msgstr "" +msgstr "Somalisht" msgid "Albanian" -msgstr "" +msgstr "Shqip" msgid "Serbian" -msgstr "" +msgstr "Serbisht" msgid "Swati" -msgstr "" +msgstr "Suatisht" msgid "Sundanese" -msgstr "" +msgstr "Sundanisht" msgid "Swedish" -msgstr "" +msgstr "Suedisht" msgid "Swahili" -msgstr "" +msgstr "Suahili" msgid "Tamil" -msgstr "" +msgstr "Tamilisht" msgid "Telugu" -msgstr "" +msgstr "Teluguisht" msgid "Tajik" -msgstr "" +msgstr "Taxhikisht" msgid "Thai" -msgstr "" +msgstr "Tailandisht" msgid "Tigrinya" -msgstr "" +msgstr "Tigrinjaisht" msgid "Turkmen" -msgstr "" +msgstr "Turkmenisht" msgid "Tagalog" -msgstr "" +msgstr "Tagaloge" msgid "Tswana" -msgstr "" +msgstr "cuanaisht" msgid "Tongan" -msgstr "" +msgstr "Tonganisht" msgid "Turkish" -msgstr "" +msgstr "Turqisht" msgid "Tsonga" -msgstr "" +msgstr "Congaisht" msgid "Tatar" -msgstr "" +msgstr "Tatarisht" msgid "Twi" -msgstr "" +msgstr "Tuisht" msgid "Tahitian" -msgstr "" +msgstr "Tahitisht" msgid "Uyghur" -msgstr "" +msgstr "Ujgurisht" msgid "Ukrainian" -msgstr "" +msgstr "Ukrainisht" msgid "Urdu" -msgstr "" +msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Uzbeke" msgid "Venda" -msgstr "" +msgstr "Vendaisht" msgid "Vietnamese" -msgstr "" +msgstr "Vietnamisht" msgid "Volapük" -msgstr "" +msgstr "Volapykisht" msgid "Walloon" -msgstr "" +msgstr "Valonisht" msgid "Wolof" -msgstr "" +msgstr "Uolofisht" msgid "Xhosa" -msgstr "" +msgstr "Xhosaisht" msgid "Yiddish" -msgstr "" +msgstr "Jidisht" msgid "Yoruba" -msgstr "" +msgstr "Jorubaisht" msgid "Zhuang" -msgstr "" +msgstr "Zhuang" msgid "Chinese (Traditional)" msgstr "" msgid "Zulu" -msgstr "" +msgstr "Zuluisht" msgid "(no translation)" msgstr "" diff --git a/po/sv.po b/po/sv.po index 4e40e857..1d602200 100644 --- a/po/sv.po +++ b/po/sv.po @@ -1282,121 +1282,121 @@ msgid "The language can only be set during startup." msgstr "" msgid "Afar" -msgstr "" +msgstr "Afar" msgid "Abkhazian" -msgstr "" +msgstr "Abchaziska" msgid "Avestan" -msgstr "" +msgstr "Avestiska" msgid "Afrikaans" -msgstr "" +msgstr "Afrikaans" msgid "Akan" -msgstr "" +msgstr "Akan" msgid "Amharic" -msgstr "" +msgstr "Amhariska" msgid "Aragonese" -msgstr "" +msgstr "Aragonska" msgid "Arabic" -msgstr "" +msgstr "Arabiska" msgid "Assamese" -msgstr "" +msgstr "Assamesiska" msgid "Avaric" -msgstr "" +msgstr "Avariska" msgid "Aymara" -msgstr "" +msgstr "Aymara" msgid "Azerbaijani" -msgstr "" +msgstr "Azerbajdzjanska" msgid "Bashkir" -msgstr "" +msgstr "Basjkiriska" msgid "Belarusian" -msgstr "" +msgstr "Vitryska" msgid "Bulgarian" -msgstr "" +msgstr "Bulgariska" msgid "Bihari" -msgstr "" +msgstr "Bihariska" msgid "Bislama" -msgstr "" +msgstr "Bislama" msgid "Bambara" -msgstr "" +msgstr "Bambara" msgid "Bengali" -msgstr "" +msgstr "Bengaliska" msgid "Tibetan" -msgstr "" +msgstr "Tibetanska" msgid "Breton" -msgstr "" +msgstr "Bretonska" msgid "Bosnian" -msgstr "" +msgstr "Bosniska" msgid "Catalan" -msgstr "" +msgstr "Katalanska" msgid "Chechen" -msgstr "" +msgstr "Tjetjenska" msgid "Chamorro" -msgstr "" +msgstr "Chamorro" msgid "Corsican" -msgstr "" +msgstr "Korsikanska" msgid "Cree" -msgstr "" +msgstr "Cree" msgid "Czech" -msgstr "" +msgstr "Tjeckiska" msgid "Chuvash" -msgstr "" +msgstr "Tjuvasjiska" msgid "Welsh" -msgstr "" +msgstr "Walesiska" msgid "Danish" -msgstr "" +msgstr "Danska" msgid "German" -msgstr "" +msgstr "Tyska" msgid "German (Austria)" -msgstr "" +msgstr "Tyska (Österrike)" msgid "Dhivehi" -msgstr "" +msgstr "Dhivehiska" msgid "Dzongkha" -msgstr "" +msgstr "Bhutanesiska (Dzongkha)" msgid "Ewe" -msgstr "" +msgstr "Ewe" msgid "Greek" -msgstr "" +msgstr "Grekiska" msgid "English" -msgstr "" +msgstr "Engelska" msgid "English (Canada)" -msgstr "" +msgstr "Engelska (Kanada)" msgid "English (UK)" msgstr "" @@ -1405,427 +1405,427 @@ msgid "English (USA)" msgstr "" msgid "Esperanto" -msgstr "" +msgstr "Esperanto" msgid "Spanish" -msgstr "" +msgstr "Spanska" msgid "Estonian" -msgstr "" +msgstr "Estniska" msgid "Basque" -msgstr "" +msgstr "Baskiska" msgid "Persian" -msgstr "" +msgstr "Persiska" msgid "Fulah" -msgstr "" +msgstr "Fula" msgid "Finnish" -msgstr "" +msgstr "Finska" msgid "Fijian" -msgstr "" +msgstr "Fijianska" msgid "Faroese" -msgstr "" +msgstr "Färöiska" msgid "French" -msgstr "" +msgstr "Franska" msgid "Frisian" -msgstr "" +msgstr "Frisiska" msgid "Irish" -msgstr "" +msgstr "Irländska" msgid "Gaelic" -msgstr "" +msgstr "Gaeliska" msgid "Galician" -msgstr "" +msgstr "Galiciska" msgid "Guarani" -msgstr "" +msgstr "Guaraní" msgid "Gujarati" -msgstr "" +msgstr "Gujarati" msgid "Manx" -msgstr "" +msgstr "Manx" msgid "Hausa" -msgstr "" +msgstr "Haussa" msgid "Hebrew" -msgstr "" +msgstr "Hebreiska" msgid "Hindi" -msgstr "" +msgstr "Hindi" msgid "Hiri Motu" -msgstr "" +msgstr "Hiri motu" msgid "Croatian" -msgstr "" +msgstr "Kroatiska" msgid "Haitian" -msgstr "" +msgstr "Haitiska" msgid "Hungarian" -msgstr "" +msgstr "Ungerska" msgid "Armenian" -msgstr "" +msgstr "Armeniska" msgid "Herero" -msgstr "" +msgstr "Herero" msgid "Interlingua" -msgstr "" +msgstr "Interlingua" msgid "Indonesian" -msgstr "" +msgstr "Indonesiska" msgid "Occidental" -msgstr "" +msgstr "Occidental" msgid "Igbo" -msgstr "" +msgstr "Igbo" msgid "Nuosu" -msgstr "" +msgstr "Nosu" msgid "Inupiaq" -msgstr "" +msgstr "Inupiak" msgid "Ido" -msgstr "" +msgstr "Ido" msgid "Icelandic" -msgstr "" +msgstr "Isländska" msgid "Italian" -msgstr "" +msgstr "Italienska" msgid "Inuktitut" -msgstr "" +msgstr "Inuktitut" msgid "Japanese" -msgstr "" +msgstr "Japanska" msgid "Javanese" -msgstr "" +msgstr "Javanesiska" msgid "Georgian" -msgstr "" +msgstr "Georgiska" msgid "Kongo" -msgstr "" +msgstr "Kikongo" msgid "Gikuyu" -msgstr "" +msgstr "Kikuyu" msgid "Kwanyama" -msgstr "" +msgstr "Kwanyama" msgid "Kazakh" -msgstr "" +msgstr "Kazakiska" msgid "Greenlandic" -msgstr "" +msgstr "Grönländska" msgid "Kannada" -msgstr "" +msgstr "Kannada" msgid "Korean" -msgstr "" +msgstr "Koreanska" msgid "Kanuri" -msgstr "" +msgstr "Kanuri" msgid "Kashmiri" -msgstr "" +msgstr "Kashmiriska" msgid "Kurdish" -msgstr "" +msgstr "Kurdiska" msgid "Komi" -msgstr "" +msgstr "Komi" msgid "Cornish" -msgstr "" +msgstr "Korniska" msgid "Kyrgyz" -msgstr "" +msgstr "Kirgiziska" msgid "Latin" -msgstr "" +msgstr "Latin" msgid "Luxembourgish" -msgstr "" +msgstr "Luxemburgiska" msgid "Luganda" -msgstr "" +msgstr "Luganda" msgid "Limburgish" -msgstr "" +msgstr "Limburgiska" msgid "Lingala" -msgstr "" +msgstr "Lingala" msgid "Lao" -msgstr "" +msgstr "Laotiska" msgid "Lithuanian" -msgstr "" +msgstr "Litauiska" msgid "Luba-Katanga" -msgstr "" +msgstr "Luba-Katanga" msgid "Latvian" -msgstr "" +msgstr "Lettiska" msgid "Malagasy" -msgstr "" +msgstr "Malagassiska" msgid "Marshallese" -msgstr "" +msgstr "Marshallesiska" msgid "Maori" -msgstr "" +msgstr "Maori" msgid "Macedonian" -msgstr "" +msgstr "Makedonska" msgid "Malayalam" -msgstr "" +msgstr "Malayalam" msgid "Mongolian" -msgstr "" +msgstr "Mongoliska" msgid "Marathi" -msgstr "" +msgstr "Marathi" msgid "Malay" -msgstr "" +msgstr "Malajiska" msgid "Maltese" -msgstr "" +msgstr "Maltesiska" msgid "Burmese" -msgstr "" +msgstr "Burmesiska" msgid "Nauru" -msgstr "" +msgstr "Nauriska" msgid "Nepali" -msgstr "" +msgstr "Nepalesiska" msgid "Ndonga" -msgstr "" +msgstr "Ndonga" msgid "Dutch" -msgstr "" +msgstr "Nederländska" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "Nynorska" msgid "Navaho" -msgstr "" +msgstr "Navajo" msgid "Nyanja" -msgstr "" +msgstr "Nyanja" msgid "Occitan" -msgstr "" +msgstr "Occitanska" msgid "Ojibwe" -msgstr "" +msgstr "Ojibwe" msgid "Oromo" -msgstr "" +msgstr "Oromo" msgid "Odia" -msgstr "" +msgstr "Oriya" msgid "Ossetian" -msgstr "" +msgstr "Ossetiska" msgid "Panjabi" msgstr "" msgid "Pali" -msgstr "" +msgstr "Pali" msgid "Polish" -msgstr "" +msgstr "Polska" msgid "Pashto" -msgstr "" +msgstr "Pashto" msgid "Portuguese" -msgstr "" +msgstr "Portugisiska" msgid "Portuguese (Brazil)" -msgstr "" +msgstr "Portugisiska (Brasilien)" msgid "Portuguese (Portugal)" -msgstr "" +msgstr "Portugisiska (Portugal)" msgid "Quechua" -msgstr "" +msgstr "Quechua" msgid "Romansh" -msgstr "" +msgstr "Rätoromanska" msgid "Rundi" -msgstr "" +msgstr "Rundi" msgid "Romanian" -msgstr "" +msgstr "Rumänska" msgid "Russian" -msgstr "" +msgstr "Ryska" msgid "Kinyarwanda" -msgstr "" +msgstr "Kinjarwanda" msgid "Sanskrit" -msgstr "" +msgstr "Sanskrit" msgid "Sardinian" -msgstr "" +msgstr "Sardiska" msgid "Sindhi" -msgstr "" +msgstr "Sindhi" msgid "Sango" -msgstr "" +msgstr "Sango" msgid "Sinhala" -msgstr "" +msgstr "Singalesiska" msgid "Slovak" -msgstr "" +msgstr "Slovakiska" msgid "Slovenian" -msgstr "" +msgstr "Slovenska" msgid "Samoan" -msgstr "" +msgstr "Samoanska" msgid "Shona" -msgstr "" +msgstr "Shona" msgid "Somali" -msgstr "" +msgstr "Somaliska" msgid "Albanian" -msgstr "" +msgstr "Albanska" msgid "Serbian" -msgstr "" +msgstr "Serbiska" msgid "Swati" -msgstr "" +msgstr "Swati" msgid "Sundanese" -msgstr "" +msgstr "Sundanesiska" msgid "Swedish" -msgstr "" +msgstr "Svenska" msgid "Swahili" -msgstr "" +msgstr "Swahili" msgid "Tamil" -msgstr "" +msgstr "Tamilska" msgid "Telugu" -msgstr "" +msgstr "Telugu" msgid "Tajik" -msgstr "" +msgstr "Tadzjikiska" msgid "Thai" -msgstr "" +msgstr "Thailändska" msgid "Tigrinya" -msgstr "" +msgstr "Tigrinja" msgid "Turkmen" -msgstr "" +msgstr "Turkmeniska" msgid "Tagalog" -msgstr "" +msgstr "Tagalog" msgid "Tswana" -msgstr "" +msgstr "Tswana" msgid "Tongan" -msgstr "" +msgstr "Tonganska" msgid "Turkish" -msgstr "" +msgstr "Turkiska" msgid "Tsonga" -msgstr "" +msgstr "Tsonga" msgid "Tatar" -msgstr "" +msgstr "Tatariska" msgid "Twi" -msgstr "" +msgstr "Twi" msgid "Tahitian" -msgstr "" +msgstr "Tahitiska" msgid "Uyghur" -msgstr "" +msgstr "Uiguriska" msgid "Ukrainian" -msgstr "" +msgstr "Ukrainska" msgid "Urdu" -msgstr "" +msgstr "Urdu" msgid "Uzbek" -msgstr "" +msgstr "Uzbekiska" msgid "Venda" -msgstr "" +msgstr "Venda" msgid "Vietnamese" -msgstr "" +msgstr "Vietnamesiska" msgid "Volapük" -msgstr "" +msgstr "Volapük" msgid "Walloon" -msgstr "" +msgstr "Vallonska" msgid "Wolof" -msgstr "" +msgstr "Wolof" msgid "Xhosa" -msgstr "" +msgstr "Xhosa" msgid "Yiddish" -msgstr "" +msgstr "Jiddisch" msgid "Yoruba" -msgstr "" +msgstr "Yoruba" msgid "Zhuang" -msgstr "" +msgstr "Zhuang" msgid "Chinese (Traditional)" msgstr "" msgid "Zulu" -msgstr "" +msgstr "Zulu" msgid "(no translation)" msgstr "" diff --git a/po/uk.po b/po/uk.po index 12704331..0af2d0e0 100644 --- a/po/uk.po +++ b/po/uk.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Pure Data 0.53.0\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" "POT-Creation-Date: 2024-07-08 15:19+0200\n" -"PO-Revision-Date: 2023-02-13 12:36+0000\n" +"PO-Revision-Date: 2024-07-08 17:41+0200\n" "Last-Translator: umläute \n" "Language-Team: Ukrainian \n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.16-dev\n" +"X-Generator: Poedit 3.4.4\n" msgid "linear" msgstr "лінійний" @@ -1297,123 +1297,121 @@ msgid "The language can only be set during startup." msgstr "" msgid "Afar" -msgstr "" +msgstr "Афарська" msgid "Abkhazian" -msgstr "" +msgstr "Абхазька" msgid "Avestan" -msgstr "" +msgstr "Авестійська" msgid "Afrikaans" -msgstr "" +msgstr "Африкаанс" msgid "Akan" -msgstr "" +msgstr "Акан" msgid "Amharic" -msgstr "" +msgstr "Амхарська" msgid "Aragonese" -msgstr "" +msgstr "Арагонська" msgid "Arabic" -msgstr "" +msgstr "Арабська" msgid "Assamese" -msgstr "" +msgstr "Асамська" msgid "Avaric" -msgstr "" +msgstr "Аварська" msgid "Aymara" -msgstr "" +msgstr "Аймарська" msgid "Azerbaijani" -msgstr "" +msgstr "Азербайджанська" msgid "Bashkir" -msgstr "" +msgstr "Башкирська" msgid "Belarusian" -msgstr "" +msgstr "Білоруська" msgid "Bulgarian" -msgstr "" +msgstr "Болгарська" msgid "Bihari" -msgstr "" +msgstr "Біхарська" msgid "Bislama" -msgstr "" +msgstr "Біслама" msgid "Bambara" -msgstr "" +msgstr "Бамбара" msgid "Bengali" -msgstr "" +msgstr "Бенгальська" msgid "Tibetan" -msgstr "" +msgstr "Тибетська" msgid "Breton" -msgstr "" +msgstr "Бретонська" msgid "Bosnian" -msgstr "" +msgstr "Боснійська" -#, fuzzy msgid "Catalan" -msgstr "критичні" +msgstr "Каталонська" -#, fuzzy msgid "Chechen" -msgstr "Перевірити" +msgstr "Чеченська" msgid "Chamorro" -msgstr "" +msgstr "Чаморро" msgid "Corsican" -msgstr "" +msgstr "Корсиканська" msgid "Cree" -msgstr "" +msgstr "Крі" msgid "Czech" -msgstr "" +msgstr "Чеська" msgid "Chuvash" -msgstr "" +msgstr "Чуваська" msgid "Welsh" -msgstr "" +msgstr "Валлійська" msgid "Danish" -msgstr "" +msgstr "Данська" msgid "German" -msgstr "" +msgstr "Німецька" msgid "German (Austria)" -msgstr "" +msgstr "Німецька (Австрія)" msgid "Dhivehi" -msgstr "" +msgstr "Мальдівська" msgid "Dzongkha" -msgstr "" +msgstr "Дзонгкха" msgid "Ewe" -msgstr "" +msgstr "Еве" msgid "Greek" -msgstr "" +msgstr "Грецька" msgid "English" -msgstr "" +msgstr "Англійська" msgid "English (Canada)" -msgstr "" +msgstr "Англійська (Канада)" msgid "English (UK)" msgstr "" @@ -1422,429 +1420,427 @@ msgid "English (USA)" msgstr "" msgid "Esperanto" -msgstr "" +msgstr "Есперанто" msgid "Spanish" -msgstr "" +msgstr "Іспанська" msgid "Estonian" -msgstr "" +msgstr "Естонська" msgid "Basque" -msgstr "" +msgstr "Баскська" -#, fuzzy msgid "Persian" -msgstr "Версія" +msgstr "Перська" msgid "Fulah" -msgstr "" +msgstr "Фула" msgid "Finnish" -msgstr "" +msgstr "Фінська" msgid "Fijian" -msgstr "" +msgstr "Фіджійська" msgid "Faroese" -msgstr "" +msgstr "Фарерська" msgid "French" -msgstr "" +msgstr "Французька" msgid "Frisian" -msgstr "" +msgstr "Фризька" msgid "Irish" -msgstr "" +msgstr "Ірландська" msgid "Gaelic" -msgstr "" +msgstr "Гельська" msgid "Galician" -msgstr "" +msgstr "Галісійська" msgid "Guarani" -msgstr "" +msgstr "Ґуарані" msgid "Gujarati" -msgstr "" +msgstr "Гуджараті" msgid "Manx" -msgstr "" +msgstr "Менська" msgid "Hausa" -msgstr "" +msgstr "Гауса" msgid "Hebrew" -msgstr "" +msgstr "Іврит" msgid "Hindi" -msgstr "" +msgstr "Гінді" msgid "Hiri Motu" -msgstr "" +msgstr "Гірімоту" msgid "Croatian" -msgstr "" +msgstr "Хорватська" msgid "Haitian" -msgstr "" +msgstr "Гаїтянська" msgid "Hungarian" -msgstr "" +msgstr "Угорська" msgid "Armenian" -msgstr "" +msgstr "Вірменська" msgid "Herero" -msgstr "" +msgstr "Гереро" msgid "Interlingua" -msgstr "" +msgstr "Інтерлінгва" msgid "Indonesian" -msgstr "" +msgstr "Індонезійська" msgid "Occidental" -msgstr "" +msgstr "Окциденталь" msgid "Igbo" -msgstr "" +msgstr "Ігбо" msgid "Nuosu" -msgstr "" +msgstr "Нуосу" msgid "Inupiaq" -msgstr "" +msgstr "Інуп'Як" msgid "Ido" -msgstr "" +msgstr "Ідо" msgid "Icelandic" -msgstr "" +msgstr "Ісландська" msgid "Italian" -msgstr "" +msgstr "Італійська" msgid "Inuktitut" -msgstr "" +msgstr "Інуктітут" msgid "Japanese" -msgstr "" +msgstr "Японська" msgid "Javanese" -msgstr "" +msgstr "Яванська" msgid "Georgian" -msgstr "" +msgstr "Грузинська" msgid "Kongo" -msgstr "" +msgstr "Конґо" msgid "Gikuyu" -msgstr "" +msgstr "Ґікую" msgid "Kwanyama" -msgstr "" +msgstr "Кваняма" msgid "Kazakh" -msgstr "" +msgstr "Казахська" msgid "Greenlandic" -msgstr "" +msgstr "Ґренландська" msgid "Kannada" -msgstr "" +msgstr "Каннада" msgid "Korean" -msgstr "" +msgstr "Корейська" msgid "Kanuri" -msgstr "" +msgstr "Канурі" msgid "Kashmiri" -msgstr "" +msgstr "Кашмірська" msgid "Kurdish" -msgstr "" +msgstr "Курдська" msgid "Komi" -msgstr "" +msgstr "Комі" msgid "Cornish" -msgstr "" +msgstr "Корнська" msgid "Kyrgyz" -msgstr "" +msgstr "Киргизька" msgid "Latin" -msgstr "" +msgstr "Латинська" msgid "Luxembourgish" -msgstr "" +msgstr "Люксембурзька" msgid "Luganda" -msgstr "" +msgstr "Луґанда" msgid "Limburgish" -msgstr "" +msgstr "Лімбурзька" msgid "Lingala" -msgstr "" +msgstr "Лінґала" -#, fuzzy msgid "Lao" -msgstr "Журнал" +msgstr "Лаоська" msgid "Lithuanian" -msgstr "" +msgstr "Литовська" msgid "Luba-Katanga" -msgstr "" +msgstr "Луба-Катанґа" msgid "Latvian" -msgstr "" +msgstr "Латиська" msgid "Malagasy" -msgstr "" +msgstr "Малагасійська" msgid "Marshallese" -msgstr "" +msgstr "Маршальська" msgid "Maori" -msgstr "" +msgstr "Маорійська" msgid "Macedonian" -msgstr "" +msgstr "Македонська" msgid "Malayalam" -msgstr "" +msgstr "Малаялам" msgid "Mongolian" -msgstr "" +msgstr "Монгольська" msgid "Marathi" -msgstr "" +msgstr "Маратхі" msgid "Malay" -msgstr "" +msgstr "Малайська" msgid "Maltese" -msgstr "" +msgstr "Мальтійська" msgid "Burmese" -msgstr "" +msgstr "Бірманська" msgid "Nauru" -msgstr "" +msgstr "Науру" msgid "Nepali" -msgstr "" +msgstr "Непальська" msgid "Ndonga" -msgstr "" +msgstr "Ндонга" msgid "Dutch" -msgstr "" +msgstr "Нідерландська" msgid "Norwegian Nynorsk" -msgstr "" +msgstr "Норвезька (Нюношк)" msgid "Navaho" -msgstr "" +msgstr "Навахо" msgid "Nyanja" -msgstr "" +msgstr "Ньянджа" msgid "Occitan" -msgstr "" +msgstr "Окситанська" msgid "Ojibwe" -msgstr "" +msgstr "Оджибве" msgid "Oromo" -msgstr "" +msgstr "Оромо" msgid "Odia" -msgstr "" +msgstr "Одія" msgid "Ossetian" -msgstr "" +msgstr "Осетинська" msgid "Panjabi" msgstr "" msgid "Pali" -msgstr "" +msgstr "Палі" msgid "Polish" -msgstr "" +msgstr "Польська" msgid "Pashto" -msgstr "" +msgstr "Пушту" msgid "Portuguese" -msgstr "" +msgstr "Португальська" msgid "Portuguese (Brazil)" -msgstr "" +msgstr "Португальська (Бразилія)" msgid "Portuguese (Portugal)" -msgstr "" +msgstr "Португальська (Португалія)" msgid "Quechua" -msgstr "" +msgstr "Кечуа" msgid "Romansh" -msgstr "" +msgstr "Ретороманська" msgid "Rundi" -msgstr "" +msgstr "Рунді" msgid "Romanian" -msgstr "" +msgstr "Румунська" msgid "Russian" -msgstr "" +msgstr "Російська" msgid "Kinyarwanda" -msgstr "" +msgstr "Руандійська" msgid "Sanskrit" -msgstr "" +msgstr "Санскрит" msgid "Sardinian" -msgstr "" +msgstr "Сардинська" msgid "Sindhi" -msgstr "" +msgstr "Синдхі" msgid "Sango" -msgstr "" +msgstr "Санґо" msgid "Sinhala" -msgstr "" +msgstr "Сингальська" msgid "Slovak" -msgstr "" +msgstr "Словацька" msgid "Slovenian" -msgstr "" +msgstr "Словенська" msgid "Samoan" -msgstr "" +msgstr "Самоанська" msgid "Shona" -msgstr "" +msgstr "Шона" msgid "Somali" -msgstr "" +msgstr "Сомалійська" msgid "Albanian" -msgstr "" +msgstr "Албанська" msgid "Serbian" -msgstr "" +msgstr "Сербська" msgid "Swati" -msgstr "" +msgstr "Сваті" msgid "Sundanese" -msgstr "" +msgstr "Сунданська" msgid "Swedish" -msgstr "" +msgstr "Шведська" msgid "Swahili" -msgstr "" +msgstr "Суахілі" msgid "Tamil" -msgstr "" +msgstr "Тамільська" msgid "Telugu" -msgstr "" +msgstr "Телугу" msgid "Tajik" -msgstr "" +msgstr "Таджицька" msgid "Thai" -msgstr "" +msgstr "Тайська" msgid "Tigrinya" -msgstr "" +msgstr "Тигринья" msgid "Turkmen" -msgstr "" +msgstr "Туркменська" msgid "Tagalog" -msgstr "" +msgstr "Тагальська" msgid "Tswana" -msgstr "" +msgstr "Тсвана" msgid "Tongan" -msgstr "" +msgstr "Тонґанська" msgid "Turkish" -msgstr "" +msgstr "Турецька" msgid "Tsonga" -msgstr "" +msgstr "Тсонга" msgid "Tatar" -msgstr "" +msgstr "Татарська" msgid "Twi" -msgstr "" +msgstr "Тві" msgid "Tahitian" -msgstr "" +msgstr "Таїтянська" msgid "Uyghur" -msgstr "" +msgstr "Уйгурська" msgid "Ukrainian" -msgstr "" +msgstr "Українська" msgid "Urdu" -msgstr "" +msgstr "Урду" msgid "Uzbek" -msgstr "" +msgstr "Узбецька" msgid "Venda" -msgstr "" +msgstr "Венда" msgid "Vietnamese" -msgstr "" +msgstr "В'Єтнамська" msgid "Volapük" -msgstr "" +msgstr "Волапюк" msgid "Walloon" -msgstr "" +msgstr "Валлонська" msgid "Wolof" -msgstr "" +msgstr "Волоф" msgid "Xhosa" -msgstr "" +msgstr "Коса" msgid "Yiddish" -msgstr "" +msgstr "Ідиш" msgid "Yoruba" -msgstr "" +msgstr "Йоруба" msgid "Zhuang" -msgstr "" +msgstr "Чуанг" msgid "Chinese (Traditional)" msgstr "" msgid "Zulu" -msgstr "" +msgstr "Зулуська" #, fuzzy msgid "(no translation)" From 479a6fcfa023aec4061d36b796e291fc1574284e Mon Sep 17 00:00:00 2001 From: phlostically Date: Sun, 7 Jul 2024 19:58:56 +0000 Subject: [PATCH 37/89] Translated using Weblate (Esperanto) Currently translated at 64.8% (321 of 495 strings) Translation: pure-data/Interface Translate-URL: https://hosted.weblate.org/projects/pure-data/pure-data/eo/ --- po/eo.po | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/po/eo.po b/po/eo.po index 382d0c05..227c7376 100644 --- a/po/eo.po +++ b/po/eo.po @@ -335,7 +335,7 @@ msgid "Font Size" msgstr "Tipara grando" msgid "Stretch" -msgstr "" +msgstr "Streĉo" msgid "X and Y" msgstr "X kaj Y" @@ -565,7 +565,7 @@ msgid "Edit existing path [%s]" msgstr "" msgid "Patch windows" -msgstr "" +msgstr "Fliki fenestrojn" msgid "Zoom New Windows" msgstr "Zomi novajn fenestrojn" @@ -601,7 +601,7 @@ msgid "MIDI preferences" msgstr "Preferoj pri MIDI" msgid "deken preferences" -msgstr "" +msgstr "Preferoj pri deken" msgid "misc preferences" msgstr "" @@ -640,7 +640,7 @@ msgid "float size" msgstr "glitkoma grando" msgid "Numeric precision of Pd-core" -msgstr "" +msgstr "Nombra precizo de Pd-core" msgid "Startup options" msgstr "" @@ -674,7 +674,7 @@ msgstr "" #, tcl-format msgid "detected font: %s" -msgstr "" +msgstr "trovis tiparon: %s" #, tcl-format msgid "WARNING: font family '%1$s' not found, using default (%2$s)" @@ -713,7 +713,7 @@ msgid "Failed to find plugins in %s ...skipping!" msgstr "" msgid "Pd startup failure" -msgstr "" +msgstr "Malsukcesis lanĉi Pd" msgid "Failed to start Pd-core" msgstr "Malsukcesis lanĉi Pd-core" @@ -763,22 +763,22 @@ msgstr "" #, tcl-format msgid "1. Unzip %s." -msgstr "" +msgstr "1. Maldensigu %s." msgid "You might need to change the file-extension from .dek to .zip" msgstr "" #, tcl-format msgid "2. Copy the contents into %s." -msgstr "" +msgstr "2. Kopiu la enhavon en la dosierujon %s." #, tcl-format msgid "3. Remove %s. (optional)" -msgstr "" +msgstr "3. Forviŝu %s. (nedeviga)" #, tcl-format msgid "Removing '%s'" -msgstr "" +msgstr "Forigante «%s»" #, tcl-format msgid "Uninstalling %1$s from %2$s failed!" @@ -817,7 +817,7 @@ msgid "Unable to download from '%s'!" msgstr "" msgid "Download failed" -msgstr "" +msgstr "Elŝutado malsukcesis" #, tcl-format msgid "Unable to remove stray file '%s'" @@ -834,7 +834,7 @@ msgid "Check" msgstr "Kontroli" msgid "Installation options:" -msgstr "" +msgstr "Opcioj pri instalado:" msgid "Try to verify the libraries' checksum before (re)installing them" msgstr "" @@ -856,13 +856,13 @@ msgstr "" #, tcl-format msgid "Default platform: %s" -msgstr "" +msgstr "Implicita platformo: %s" msgid "User-defined platform:" msgstr "" msgid "Hide foreign architectures" -msgstr "" +msgstr "Kaŝi fremdajn arĥitekturojn" msgid "" "Only show the newest version of a library\n" @@ -1068,10 +1068,10 @@ msgid "No matching externals found." msgstr "" msgid "Try using the full name e.g. 'freeverb~'." -msgstr "" +msgstr "Provu uzi la plenan nomon, ekz. «freeverb~»." msgid "Or use wildcards like 'freeverb*'." -msgstr "" +msgstr "Aŭ uzu ĵokerojn kiel «freeverb*»." msgid "Please select a (writable) installation directory!" msgstr "" From e45983ed5ed981423d716979f62c621ca642b28f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Thu, 11 Jul 2024 20:59:15 +0200 Subject: [PATCH 38/89] use window title as fallback for windowname Closes: https://github.com/pure-data/pure-data/issues/2384 --- tcl/wheredoesthisgo.tcl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tcl/wheredoesthisgo.tcl b/tcl/wheredoesthisgo.tcl index 2b36fe31..473ccdb3 100644 --- a/tcl/wheredoesthisgo.tcl +++ b/tcl/wheredoesthisgo.tcl @@ -141,9 +141,11 @@ proc lookup_windowname {mytoplevel} { set window [array get ::windowname $mytoplevel] if { $window ne ""} { return [lindex $window 1] - } else { - return ERROR } + if { [winfo exists $mytoplevel] } { + return [wm title [winfo toplevel $mytoplevel]] + } + return ERROR } proc tkcanvas_name {mytoplevel} { From 95993c298d5c8c8278a6b11650ac35f1f4c6560c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Thu, 11 Jul 2024 13:26:01 +0200 Subject: [PATCH 39/89] Re-title file-selection dialog for "Print..." Closes: https://github.com/pure-data/pure-data/issues/2382 --- tcl/pd_menucommands.tcl | 1 + 1 file changed, 1 insertion(+) diff --git a/tcl/pd_menucommands.tcl b/tcl/pd_menucommands.tcl index 954986f9..bdd99f7a 100644 --- a/tcl/pd_menucommands.tcl +++ b/tcl/pd_menucommands.tcl @@ -37,6 +37,7 @@ proc ::pd_menucommands::menu_open {} { proc ::pd_menucommands::menu_print {mytoplevel} { set initialfile "[file rootname [lookup_windowname $mytoplevel]].ps" set filename [tk_getSaveFile -initialfile $initialfile \ + -title [_ "Print..." ] \ -defaultextension .ps \ -filetypes { {{Postscript} {.ps}} }] if {$filename ne ""} { From 31aa886f737ee3a9bdaae84e4f7708b617030c77 Mon Sep 17 00:00:00 2001 From: porres Date: Mon, 15 Jul 2024 14:11:13 -0300 Subject: [PATCH 40/89] minor cosmetic changes in audio examples don't be alarmed by the number of edited files, just minor cosmetic changes here, like standardizing the object names to be used inside quotes as the rest of the documentation examples. also converted qlist.txt and qlist2.txt from CRLF to LF to fix compilation error and squashed many attempts for that also squashed here: add mention that [tabplay~] can't play files with a different sample rate --- doc/3.audio.examples/A00.intro.pd | 20 +- doc/3.audio.examples/A01.sinewave.pd | 56 ++- doc/3.audio.examples/A02.amplitude.pd | 44 +- doc/3.audio.examples/A03.line.pd | 69 +-- doc/3.audio.examples/A04.line2.pd | 78 ++- doc/3.audio.examples/A05.output.subpatch.pd | 15 +- doc/3.audio.examples/A06.frequency.pd | 4 +- doc/3.audio.examples/A07.fusion.pd | 28 +- doc/3.audio.examples/A08.beating.pd | 6 +- doc/3.audio.examples/A09.frequency.mod.pd | 22 +- doc/3.audio.examples/B01.wavetables.pd | 16 +- doc/3.audio.examples/B02.two-wavetables.pd | 16 +- doc/3.audio.examples/B03.tabread4.pd | 30 +- .../B04.tabread4.interpolation.pd | 41 +- doc/3.audio.examples/B05.tabread.FM.pd | 51 +- doc/3.audio.examples/B06.table.switching.pd | 39 +- doc/3.audio.examples/B07.sampler.pd | 64 +-- doc/3.audio.examples/B08.sampler.loop.pd | 82 +-- .../B09.sampler.loop.smooth.pd | 28 +- doc/3.audio.examples/B10.sampler.scratch.pd | 61 +-- doc/3.audio.examples/B11.sampler.nodoppler.pd | 54 +- doc/3.audio.examples/B12.sampler.transpose.pd | 18 +- .../B14.sampler.rockafella.pd | 35 +- doc/3.audio.examples/B16.long-varispeed.pd | 177 ++++--- doc/3.audio.examples/C01.nyquist.pd | 24 +- doc/3.audio.examples/C02.sawtooth-foldover.pd | 24 +- doc/3.audio.examples/C03.zipper.noise.pd | 18 +- doc/3.audio.examples/C04.control.to.signal.pd | 36 +- doc/3.audio.examples/C05.sampler.oneshot.pd | 68 +-- doc/3.audio.examples/C07.envelope.follower.pd | 82 +-- doc/3.audio.examples/C08.analog.sequencer.pd | 32 +- doc/3.audio.examples/C09.sample.hold.pd | 26 +- doc/3.audio.examples/D01.envelope.gen.pd | 30 +- doc/3.audio.examples/D02.adsr.pd | 70 +-- doc/3.audio.examples/D03.envelope.dB.pd | 56 ++- doc/3.audio.examples/D04.envelope.quartic.pd | 38 +- doc/3.audio.examples/D05.envelope.pitch.pd | 78 +-- .../D06.envelope.portamento.pd | 30 +- doc/3.audio.examples/D07.additive.pd | 67 +-- doc/3.audio.examples/D08.table.spectrum.pd | 48 +- doc/3.audio.examples/D09.shepard.tone.pd | 34 +- doc/3.audio.examples/D10.sampler.notes.pd | 197 ++++---- doc/3.audio.examples/D11.sampler.poly.pd | 195 ++++--- doc/3.audio.examples/D12.sampler.bis.pd | 93 ++-- doc/3.audio.examples/D13.additive.qlist.pd | 92 ++-- doc/3.audio.examples/D14.vibrato.pd | 123 +++-- doc/3.audio.examples/E01.spectrum.pd | 268 +++++----- doc/3.audio.examples/E02.ring.modulation.pd | 171 +++---- doc/3.audio.examples/E03.octave.divider.pd | 105 ++-- doc/3.audio.examples/E04.difference.tone.pd | 54 +- doc/3.audio.examples/E05.chebychev.pd | 42 +- doc/3.audio.examples/E06.exponential.pd | 113 ++--- doc/3.audio.examples/E07.evenodd.pd | 68 +-- doc/3.audio.examples/E08.phase.mod.pd | 39 +- doc/3.audio.examples/E09.FM.spectrum.pd | 91 ++-- doc/3.audio.examples/E10.complex.FM.pd | 107 ++-- doc/3.audio.examples/F01.pulse.pd | 131 ++--- doc/3.audio.examples/F02.just.say.pd | 141 +++--- doc/3.audio.examples/F03.pulse.spectrum.pd | 59 +-- doc/3.audio.examples/F04.waveshaping.pulse.pd | 154 +++--- doc/3.audio.examples/F05.ring.modulation.pd | 157 +++--- doc/3.audio.examples/F06.packets.pd | 40 +- doc/3.audio.examples/F07.packet.spectrum.pd | 110 ++-- doc/3.audio.examples/F08.two.cosines.pd | 68 ++- doc/3.audio.examples/F09.declickit.pd | 2 +- doc/3.audio.examples/F10.sweepable.FM.pd | 112 ++--- doc/3.audio.examples/F11.anharmonic.FM.pd | 114 ++--- doc/3.audio.examples/F12.paf.pd | 140 +++--- doc/3.audio.examples/F13.paf.control.pd | 72 ++- doc/3.audio.examples/F14.wave.packet.pd | 203 ++++---- doc/3.audio.examples/G01.delay.pd | 54 +- doc/3.audio.examples/G02.delay.loop.pd | 67 +-- doc/3.audio.examples/G03.delay.variable.pd | 54 +- doc/3.audio.examples/G04.control.blocksize.pd | 2 +- doc/3.audio.examples/G05.execution.order.pd | 8 +- doc/3.audio.examples/G06.octave.doubler.pd | 52 +- doc/3.audio.examples/G07.shaker.pd | 12 +- doc/3.audio.examples/G09.pitchshift.pd | 74 ++- doc/3.audio.examples/H01.low-pass.pd | 68 ++- doc/3.audio.examples/H02.high-pass.pd | 75 ++- doc/3.audio.examples/H03.band-pass.pd | 60 +-- doc/3.audio.examples/H04.filter.sweep.pd | 81 ++- doc/3.audio.examples/H05.filter.floyd.pd | 139 ++--- doc/3.audio.examples/H06.envelope.follower.pd | 134 +++-- doc/3.audio.examples/H07.measure.spectrum.pd | 160 +++--- doc/3.audio.examples/H08.heterodyning.pd | 136 +++-- doc/3.audio.examples/H09.ssb.modulation.pd | 115 ++--- doc/3.audio.examples/H10.measurement.pd | 90 ++-- doc/3.audio.examples/H11.shelving.pd | 84 ++-- doc/3.audio.examples/H12.peaking.pd | 100 ++-- doc/3.audio.examples/H13.butterworth.pd | 82 ++- doc/3.audio.examples/H14.all.pass.pd | 92 ++-- doc/3.audio.examples/H15.phaser.pd | 64 +-- doc/3.audio.examples/H16.adsr.filter.qlist.pd | 178 +++---- doc/3.audio.examples/I01.Fourier.analysis.pd | 77 ++- doc/3.audio.examples/I02.Hann.window.pd | 146 +++--- doc/3.audio.examples/I03.resynthesis.pd | 70 +-- doc/3.audio.examples/I04.noisegate.pd | 270 +++++----- doc/3.audio.examples/I05.compressor.pd | 315 ++++++------ doc/3.audio.examples/I06.timbre.stamp.pd | 85 ++-- doc/3.audio.examples/I07.phase.vocoder.pd | 12 +- doc/3.audio.examples/I08.pvoc.reverb.pd | 74 +-- doc/3.audio.examples/I09.sheep.from.goats.pd | 74 +-- doc/3.audio.examples/I10.phase.bash.pd | 475 +++++++++--------- doc/3.audio.examples/J01.even.odd.pd | 24 +- doc/3.audio.examples/J02.trapezoids.pd | 2 +- doc/3.audio.examples/J03.pulse.width.mod.pd | 30 +- doc/3.audio.examples/J04.corners.pd | 4 +- doc/3.audio.examples/J05.triangle.pd | 8 +- doc/3.audio.examples/J06.enveloping.pd | 16 +- doc/3.audio.examples/J07.oversampling.pd | 30 +- doc/3.audio.examples/J08.classicsynth.pd | 64 +-- doc/3.audio.examples/J09.bandlimited.pd | 8 +- doc/3.audio.examples/buttercoef3.pd | 18 +- doc/3.audio.examples/filter-graph1.pd | 42 +- doc/3.audio.examples/filter-graph2.pd | 24 +- doc/3.audio.examples/osc-voice.pd | 112 ++--- doc/3.audio.examples/qlist.txt | 112 ++--- doc/3.audio.examples/qlist2.txt | 10 +- doc/3.audio.examples/sampvoice.pd | 10 +- doc/3.audio.examples/sampvoice2.pd | 173 ++++--- doc/3.audio.examples/shepvoice.pd | 60 ++- doc/5.reference/qlist.txt | 2 +- doc/5.reference/tabplay~-help.pd | 80 +-- doc/5.reference/tabread4~-help.pd | 58 +-- 125 files changed, 4738 insertions(+), 4804 deletions(-) diff --git a/doc/3.audio.examples/A00.intro.pd b/doc/3.audio.examples/A00.intro.pd index 0e5c74c8..23748847 100644 --- a/doc/3.audio.examples/A00.intro.pd +++ b/doc/3.audio.examples/A00.intro.pd @@ -1,13 +1,9 @@ -#N canvas 614 23 547 335 12; -#X text 87 6 INTRODUCTION TO THE PD AUDIO EXAMPLE PATCHES; -#X msg 124 192 browse http://msp.ucsd.edu/techniques.htm; -#X obj 124 226 pdcontrol; -#X text 277 268 updated for Pd version 0.52; -#X text 34 45 This is the second of three tutorial series on Pd. This -one shows the time and frequency domain audio processing features. -(The first one showed how to use Pd to do "control" computations \, -and the third is about data structures.), f 67; -#X text 33 114 These patches are accompanied by an ONLINE BOOK \, which -develops the underlying theory at . -Click on the message below to open it., f 67; +#N canvas 614 38 541 452 12; +#X text 90 27 INTRODUCTION TO THE PD AUDIO EXAMPLE PATCHES; +#X msg 146 218 browse http://msp.ucsd.edu/techniques.htm; +#X obj 146 252 pdcontrol; +#X text 37 66 This is the second of three tutorial series on Pd. This one shows the time and frequency domain audio processing features. (The first one showed how to use Pd to do "control" computations \, and the third is about data structures.), f 67; +#X text 36 135 These patches are accompanied by an ONLINE BOOK \, which develops the underlying theory at . Click on the message below to open it., f 67; +#X text 60 308 Note \, however \, that the examples here on this version of Pd are a bit more up to date with the more recent features. The link above carries a download for the exact example files that were used on the book., f 65; +#X text 290 410 updated for Pd version 0.55; #X connect 1 0 2 0; diff --git a/doc/3.audio.examples/A01.sinewave.pd b/doc/3.audio.examples/A01.sinewave.pd index 6bdb8606..ebcf62d2 100644 --- a/doc/3.audio.examples/A01.sinewave.pd +++ b/doc/3.audio.examples/A01.sinewave.pd @@ -1,27 +1,33 @@ -#N canvas 619 34 526 667 12; -#X obj 113 129 osc~ 440; -#X obj 113 188 dac~; -#X obj 113 158 *~ 0.05; -#X text 152 13 MAKING A SINE WAVE; -#X text 42 226 Audio computation can be turned on and off by sending messages to the global "pd" object as follows:, f 56; -#X msg 108 277 \; pd dsp 1; -#X msg 212 277 \; pd dsp 0; -#X text 123 314 ON; -#X text 232 314 OFF; -#X text 39 353 You should see the Pd window change to reflect whether audio is on or off. You can also turn audio on and off using the "audio" menu \, but the buttons are provided as a shortcut.; -#X text 40 405 When DSP is on \, you should hear a tone whose pitch is A 440 and whose amplitude is 0.05. If instead you are greeted with silence \, you might want to read the HTML documentation on setting up audio.; -#X text 40 471 In general when you start a work session with Pd \, you will want to choose "test audio and MIDI" from the help window \, which opens a more comprehensive test patch than this one., f 60; -#X text 28 44 Audio computation in Pd is done using "tilde objects" such as the three below. They use continuous audio streams to intercommunicate \, as well as communicating with other ("control") Pd objects using messages.; -#X text 296 285 <= click these; -#X text 155 188 <=== send to the audio output device; -#X text 183 157 <= reduce amplitude to 0.05; -#X text 183 128 <= 440 Hz. sine wave at full blast; -#X obj 309 545 ../5.reference/set-dsp-tgl; -#X text 310 524 DSP on/off; -#X msg 309 582 \; pd dsp \$1; -#X text 291 635 updated for Pd version 0.54; -#X text 345 549 <-- open abstraction; -#X text 24 541 These examples also use a helper abstraction from the documentation help files of Pd. Check it to the right and see how the toggle shows the DSP state., f 35; +#N canvas 619 38 527 791 12; +#X obj 129 128 osc~ 440; +#X obj 129 187 dac~; +#X obj 129 157 *~ 0.05; +#X text 168 12 MAKING A SINE WAVE; +#X msg 163 324 \; pd dsp 1; +#X msg 163 365 \; pd dsp 0; +#X text 229 331 ON; +#X text 233 372 OFF; +#X text 55 442 You should see the Pd window change to reflect whether audio is on or off. You can also turn audio on and off using the "audio" menu \, but the buttons are provided as a shortcut.; +#X text 56 560 In general when you start a work session with Pd \, you will want to choose "test audio and MIDI" from the help window \, which opens a more comprehensive test patch than this one., f 60; +#X text 44 43 Audio computation in Pd is done using "tilde objects" such as the three below. They use continuous audio streams to intercommunicate \, as well as communicating with other ("control") Pd objects using messages.; +#X obj 327 651 ../5.reference/set-dsp-tgl; +#X text 328 630 DSP on/off; +#X msg 327 688 \; pd dsp \$1; +#X text 309 753 updated for Pd version 0.54; +#X text 363 655 <-- open abstraction; +#X text 80 336 click these -->, f 9; +#X obj 298 378 send pd; +#X text 71 246 Audio computation can be turned on and off by sending messages to the global "pd" object either via a message box or a [send] object as follows:, f 55; +#X msg 298 319 dsp 1; +#X msg 311 348 dsp 0; +#X text 361 336 <-- or these; +#X text 56 494 When DSP is on \, you should hear a tone whose pitch is middle A (440 Hz) and whose amplitude is 0.05. If instead you are greeted with silence \, you might want to read the HTML documentation on setting up audio.; +#X text 199 127 <-- 440 Hz. sine wave at full blast; +#X text 199 156 <-- reduce amplitude to 0.05; +#X text 171 187 <-- send to the audio output device (left channel only), f 28; +#X text 56 642 These examples also use a helper abstraction with a toggle switch control from the documentation help files of Pd. Check it to the right and see how the toggle shows the DSP state., f 35; #X connect 0 0 2 0; #X connect 2 0 1 0; -#X connect 17 0 19 0; +#X connect 11 0 13 0; +#X connect 19 0 17 0; +#X connect 20 0 17 0; diff --git a/doc/3.audio.examples/A02.amplitude.pd b/doc/3.audio.examples/A02.amplitude.pd index 250f81ba..646eefee 100644 --- a/doc/3.audio.examples/A02.amplitude.pd +++ b/doc/3.audio.examples/A02.amplitude.pd @@ -1,28 +1,28 @@ -#N canvas 476 23 543 603 12; -#X obj 83 111 osc~ 440; -#X obj 71 330 dac~; -#X text 75 36 CONTROLLING AMPLITUDE; -#X obj 83 248 *~ 0; -#X floatatom 108 211 8 0 0 0 - - - 0; -#X obj 108 178 dbtorms; -#X floatatom 108 146 8 0 80 0 - - - 0; -#X text 86 502 Pd assumes you have a two channel audio system unless you tell it otherwise., f 55; -#X text 293 551 updated for Pd version 0.33; -#X text 148 112 <= 440 Hz. sine wave at full blast; -#X text 172 145 <= set amplitude here in dB; -#X text 172 177 <= this converts dB to linear units; -#X text 172 210 <= this shows the linear gain; -#X text 110 331 <= and out. We're sending to both channels now.; -#X text 125 247 <= multiply the sine wave by the gain \, reducing its amplitude. You can also use the [*~] object to multiply two signals. The "0" argument here instructs it that we'll just send it messages (not audio) to set the multiplier., f 48; -#X text 86 375 Amplitudes of audio signals can have any reasonable range \, but when you output a signal via the [dac~] object \, the samples should range between -1 and +1. Values out of that range will be "clipped.", f 55; -#X text 86 439 Here we calculate a gain for the multiplier [*~] using a [dbtorms] object (acronym for "dB to RMS"). 100 dB is normalized to one \, and zero dB artificially outputs a true 0 amplitude., f 55; -#X obj 325 17 ../5.reference/set-dsp-tgl; -#X text 356 20 DSP on/off; -#X msg 325 54 \; pd dsp \$1; +#N canvas 614 76 546 671 12; +#X obj 83 141 osc~ 440; +#X obj 71 360 dac~; +#X text 75 56 CONTROLLING AMPLITUDE; +#X obj 83 278 *~ 0; +#X floatatom 108 241 8 0 0 0 - - - 0; +#X obj 108 208 dbtorms; +#X floatatom 108 176 8 0 80 0 - - - 0; +#X text 302 615 updated for Pd version 0.33; +#X obj 325 37 ../5.reference/set-dsp-tgl; +#X text 356 40 DSP on/off; +#X msg 325 74 \; pd dsp \$1; +#X text 150 140 <-- 440 Hz sine wave at full blast; +#X text 174 175 <-- set amplitude here in dB; +#X text 174 207 <-- this converts dB to linear units; +#X text 174 240 <-- this shows the linear gain; +#X text 125 277 <-- multiply the sine wave by the gain \, reducing its amplitude. You can also use the [*~] object to multiply two signals. The "0" argument here instructs it that we'll just send it messages (not audio) to set the multiplier., f 48; +#X text 110 361 <-- and out (we're sending to both channels now).; +#X text 46 405 Amplitudes of audio signals can have any reasonable range \, but when you output a signal via the [dac~] object \, the samples should range between -1 and +1. Values out of that range will be "clipped"., f 67; +#X text 46 556 Pd assumes you have a two channel audio system unless you tell it otherwise. The [dac~] object \, by default \, connects to these two channels., f 67; +#X text 46 463 Here we calculate a gain for the multiplier [*~] using a [dbtorms] object (acronym for "dB to RMS"). 100 dB is normalized to one \, and zero dB artificially outputs a true 0 amplitude. Hence \, decibels in Pd are basically dBFS with an offset of 100! The dBFS is usually considered in digital systems and 0 dB corresponds to one \, whereas a true zero amplitude value consists of minus infinity dB., f 67; #X connect 0 0 3 0; #X connect 3 0 1 0; #X connect 3 0 1 1; #X connect 4 0 3 1; #X connect 5 0 4 0; #X connect 6 0 5 0; -#X connect 17 0 19 0; +#X connect 8 0 10 0; diff --git a/doc/3.audio.examples/A03.line.pd b/doc/3.audio.examples/A03.line.pd index 453166e5..d837116d 100644 --- a/doc/3.audio.examples/A03.line.pd +++ b/doc/3.audio.examples/A03.line.pd @@ -1,7 +1,7 @@ -#N canvas 292 32 863 615 12; +#N canvas 376 68 862 639 12; #X obj 84 132 osc~ 440; #X obj 84 405 dac~; -#X obj 84 313 *~; +#X obj 84 363 *~; #X obj 132 326 line~; #X msg 109 166 0.1 2000; #X msg 144 251 0 2000; @@ -10,39 +10,40 @@ #X msg 132 210 0.1; #X msg 156 295 0; #X text 273 187 ON; -#X text 282 280 OFF; +#X text 302 276 OFF; #X text 33 23 CONTROLLING AMPLITUDE USING LINE~; -#X text 152 131 <= sine wave; -#X text 176 165 <= slow; -#X text 173 189 <= fast; -#X text 162 210 <= instantly; -#X text 197 251 <= slow; -#X text 189 273 <= fast; -#X text 186 295 <= instantly; -#X text 179 326 <= ramp generator; -#X text 123 405 <= out; -#X text 104 231 -------------------------------; -#X text 32 62 In this patch \, the multiplier is configured to multiply two signals. The amplitude is now a signal computed by the [line~] object., f 62; -#X text 25 443 The left inlet of [line~] is a target value. It reaches that target in the time specified (in milliseconds) to its right inlet., f 67; -#X text 25 479 (In this example \, message boxes with two numbers each are connected to [line~]'s left inlet. Except in some special cases \, Pd objects with more than one inlet will automatically distribute lists of numbers across their inlets. In this case \, "0 50" becomes \, "50 at right and 0 at left."), f 67; -#X text 25 556 The [line~] object (and its control brother \, [line]) treat their right inlet specially. The inlets don't retain values the way other inlets do but revert to zero whenever a target is received., f 67; +#X text 25 445 The left inlet of [line~] is a target value. It reaches that target in the time specified (in milliseconds) to its right inlet., f 67; +#X text 25 481 (In this example \, message boxes with two numbers each are connected to [line~]'s left inlet. Except in some special cases \, Pd objects with more than one inlet will automatically distribute lists of numbers across their inlets. In this case \, "0 50" becomes \, "50 at right and 0 at left."), f 67; +#X text 25 558 The [line~] object (and its control brother \, [line]) treat their right inlet specially. The inlets don't retain values the way other inlets do but revert to zero whenever a target is received., f 67; #X obj 362 127 ../5.reference/set-dsp-tgl; #X text 393 130 DSP on/off; #X msg 362 164 \; pd dsp \$1; -#X text 612 562 updated for Pd version 0.54; +#X text 615 569 updated for Pd version 0.54; #X obj 649 244 hsl 162 19 0 1 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; #X obj 646 303 pow 4; #X obj 560 381 osc~ 440; #X msg 646 365 \$1 10; #X obj 646 397 line~; -#X obj 560 436 *~; -#X obj 560 490 dac~; +#X obj 628 456 *~; +#X obj 628 510 dac~; #X floatatom 646 272 10 0 0 0 - - - 0; #X floatatom 646 335 11 0 0 0 - - - 0; -#X text 151 351 <= multiply the sine wave by the ramp. There's no longer a "0" argument \, which tells Pd to expect a signal here., f 39; -#X text 528 31 Below use a slider that generates values from 0 to 1 \, which passes through a quartic function (by going through [pow 4]). This non linear function is better suited for the way we perceive amplitudes. The value is then combined in a message by assuming the value of the '\$1' variable into a list followed by 10 \, which means that changes to the slider are smoothened by a 10 ms audio ramp! This principal is used in an [output~] abstraction presented later., f 43; -#X text 724 273 <= linear; -#X text 730 335 <= quartic; +#X text 150 132 <-- sine wave; +#X text 176 165 <-- slow; +#X text 173 189 <-- fast; +#X text 162 210 <-- instantly; +#X text 197 251 <-- slow; +#X text 189 273 <-- fast; +#X text 186 295 <-- instantly; +#X text 104 231 ---------------------------------------; +#X text 179 326 <-- ramp generator; +#X text 157 352 multiply the sine wave by the ramp. There's no longer a "0" argument \, which tells Pd to expect a signal here., f 44; +#X text 113 361 <----; +#X text 123 405 <-- out; +#X text 32 57 In this patch \, the multiplier is configured to multiply two signals. The amplitude is now a signal computed by the [line~] object \, which provides a smoothened ramp., f 62; +#X text 528 31 Below use a slider that generates values from 0 to 1 \, which passes through a quartic function (by going through [pow 4]). This non linear function is better suited for the way we perceive amplitudes. The value is then combined in a message by assuming the value of the '\$1' variable into a list followed by 10 \, which means that changes to the slider are smoothened by a 10 ms audio ramp! This mechanism is used in an [output~] abstraction presented later., f 43; +#X text 724 273 <-- linear; +#X text 730 335 <-- quartic; #X connect 0 0 2 0; #X connect 2 0 1 0; #X connect 2 0 1 1; @@ -53,13 +54,13 @@ #X connect 7 0 3 0; #X connect 8 0 3 0; #X connect 9 0 3 0; -#X connect 27 0 29 0; -#X connect 31 0 38 0; -#X connect 32 0 39 0; -#X connect 33 0 36 0; -#X connect 34 0 35 0; -#X connect 35 0 36 1; -#X connect 36 0 37 0; -#X connect 36 0 37 1; -#X connect 38 0 32 0; -#X connect 39 0 34 0; +#X connect 16 0 18 0; +#X connect 20 0 27 0; +#X connect 21 0 28 0; +#X connect 22 0 25 0; +#X connect 23 0 24 0; +#X connect 24 0 25 1; +#X connect 25 0 26 0; +#X connect 25 0 26 1; +#X connect 27 0 21 0; +#X connect 28 0 23 0; diff --git a/doc/3.audio.examples/A04.line2.pd b/doc/3.audio.examples/A04.line2.pd index 7b1fc835..672e5ee1 100644 --- a/doc/3.audio.examples/A04.line2.pd +++ b/doc/3.audio.examples/A04.line2.pd @@ -1,54 +1,52 @@ -#N canvas 353 24 833 682 12; -#X obj 131 81 osc~ 440; -#X obj 131 328 dac~; -#X obj 131 246 *~; -#X obj 149 193 line~; +#N canvas 353 38 833 719 12; +#X obj 110 77 osc~ 440; +#X obj 110 327 dac~; +#X obj 110 245 *~; +#X obj 128 192 line~; #X text 140 7 LINES GRAPHED; -#X obj 213 93 r graphit; -#X obj 214 192 r graphit; -#X obj 214 252 r graphit; -#X obj 149 162 r to-line; +#X obj 202 92 r graphit; +#X obj 128 161 r to-line; #N canvas 0 22 450 278 (subpatch) 0; #X array product 44100 float 0; #X coords 0 1.02 44100 -1.02 200 130 1; -#X restore 566 374 graph; +#X restore 573 376 graph; #N canvas 0 22 450 278 (subpatch) 0; #X array oscillator 44100 float 0; #X coords 0 1.02 44100 -1.02 200 130 1 0 0; -#X restore 566 44 graph; +#X restore 573 46 graph; #N canvas 0 22 450 278 (subpatch) 0; #X array line-output 44100 float 0; #X coords 0 1.02 44100 -1.02 200 130 1; -#X restore 566 209 graph; -#X obj 131 293 *~ 0.1; -#X obj 214 222 tabwrite~ line-output; -#X obj 214 282 tabwrite~ product; -#X text 64 379 ramp up; -#X text 229 379 ramp down; -#X text 400 379 to 1/2; -#X text 590 516 ------ 1 second ------; -#X text 601 623 updated for Pd version 0.33; -#X text 24 566 On most machines \, you will hear an interruption in the sound one second after you click on the first or third box. This is because the graphical updates are likely to eat more CPU time than your audio buffer has pre-buffered for. You can avoid this if you keep your graphs in sub-windows and open them only when you need them. In some future version of Pd this behavior will be improved. Until then \, you'll have to avoid having arrays getting re-drawn during music performances., f 78; -#X text 174 329 <= out; -#X obj 213 123 tabwrite~ oscillator; +#X restore 573 211 graph; +#X obj 110 292 *~ 0.1; +#X obj 214 230 tabwrite~ line-output; +#X obj 202 290 tabwrite~ product; +#X text 74 379 ramp up; +#X text 227 379 ramp down; +#X text 398 379 to 1/2; +#X text 597 518 ------ 1 second ------; +#X text 581 622 updated for Pd version 0.33; +#X obj 222 137 tabwrite~ oscillator; #X text 31 33 Here again is a [line~] controlling the amplitude of an [osc~] \, but with the outputs graphed:, f 63; -#X text 26 473 Click the message boxes above to try it. Note that in the first two boxes \, the [line~] objects get two messages. The first one \, with no time value \, causes the [line~] to jump immediately to the value. The third box takes [line~]'s previous value as a point of departure. What you see will depend on which box you last clicked and how long you waited between the two., f 68; -#X obj 392 268 ../5.reference/set-dsp-tgl; -#X text 423 271 DSP on/off; -#X msg 392 305 \; pd dsp \$1; -#X msg 32 403 \; to-line 0 \, 1 500 \; graphit bang; -#X msg 204 403 \; to-line 1 \, 0 500 \; graphit bang; -#X msg 369 403 \; to-line 0.5 1000 \; graphit bang; +#X text 33 478 Click the message boxes above to try it. Note that in the first two boxes \, the [line~] objects get two messages. The first one \, with no time value \, causes the [line~] to jump immediately to the value. The third box takes [line~]'s previous value as a point of departure. What you see will depend on which box you last clicked and how long you waited between the two., f 68; +#X obj 413 269 ../5.reference/set-dsp-tgl; +#X text 444 272 DSP on/off; +#X msg 413 306 \; pd dsp \$1; +#X msg 42 403 \; to-line 0 \, 1 500 \; graphit bang; +#X msg 202 403 \; to-line 1 \, 0 500 \; graphit bang; +#X msg 367 403 \; to-line 0.5 1000 \; graphit bang; +#X text 153 328 <-- out; +#X text 31 571 On very old machines you may hear an interruption in the sound one second after you click on the first or third box. This is because the graphical updates are likely to eat more CPU time than your audio buffer has pre-buffered for. You can avoid this if you keep your graphs in sub-windows and open them only when you need them. In some future version of Pd this behavior will be improved. Until then \, you'll have to avoid having arrays getting re-drawn during music performances., f 68; #X connect 0 0 2 0; -#X connect 0 0 22 0; +#X connect 0 0 18 0; +#X connect 2 0 10 0; #X connect 2 0 12 0; -#X connect 2 0 14 0; #X connect 3 0 2 1; -#X connect 3 0 13 0; -#X connect 5 0 22 0; -#X connect 6 0 13 0; -#X connect 7 0 14 0; -#X connect 8 0 3 0; -#X connect 12 0 1 0; -#X connect 12 0 1 1; -#X connect 25 0 27 0; +#X connect 3 0 11 0; +#X connect 5 0 18 0; +#X connect 5 0 11 0; +#X connect 5 0 12 0; +#X connect 6 0 3 0; +#X connect 10 0 1 0; +#X connect 10 0 1 1; +#X connect 21 0 23 0; diff --git a/doc/3.audio.examples/A05.output.subpatch.pd b/doc/3.audio.examples/A05.output.subpatch.pd index 2f8a83aa..6d8c121d 100644 --- a/doc/3.audio.examples/A05.output.subpatch.pd +++ b/doc/3.audio.examples/A05.output.subpatch.pd @@ -1,23 +1,22 @@ #N canvas 452 47 568 532 12; #X declare -stdpath ./; #X text 231 24 CONTROLLING OUTPUT AMPLITUDE; -#X obj 84 28 osc~ 440; -#X obj 102 59 osc~ 550; +#X obj 66 54 osc~ 440; +#X obj 84 85 osc~ 550; #X obj 102 117 osc~ 660; -#X obj 84 89 +~; +#X obj 66 115 +~; #X obj 84 143 +~; -#X text 247 203 and select "open" to see inside.; #X obj 84 179 output~; -#X text 171 116 <= Here we make an A major triad as a test signal.; #X obj 60 482 declare -stdpath ./; #X text 27 423 The [output~] abstraction is in the 'extra' folder (aka 'standard path') \, so we use [declare -stdpath ./] to make sure Pd finds it., f 73; -#X text 227 223 Also select 'help' for more information; -#X text 200 183 <-- this is a subwindow - right click on it; #X text 27 267 In this and subsequent patches \, we'll use the [output~] abstraction to control overall amplitude. Use the slider to control horizontally from 0 (silence) to 1 (full blast). Note \, however \, that a quartic function is applied. In this example \, you can't actually push the output amplitude all the way up without clipping. You'll know you're clipping if \, instead of an A major chord \, you hear a single \, distorted tone two octaves down. The clipping happens at Pd's last stage of audio output. Audio signals internal to Pd have essentially no level limit., f 73; #X text 327 482 updated for Pd version 0.54; #X text 27 388 The output control automatically starts DSP whenever you touch the sider. You can use the "mute" toggle to turn mute on or off., f 73; +#X text 180 86 <-- Here we make an A major triad as a test signal., f 28; +#X text 200 183 <--; +#X text 230 184 this is an abstraction - right click on it and select "open" to see inside. Also select 'help' for more information, f 39; #X connect 1 0 4 0; #X connect 2 0 4 1; #X connect 3 0 5 1; #X connect 4 0 5 0; -#X connect 5 0 7 0; +#X connect 5 0 6 0; diff --git a/doc/3.audio.examples/A06.frequency.pd b/doc/3.audio.examples/A06.frequency.pd index 65f04498..233046bd 100644 --- a/doc/3.audio.examples/A06.frequency.pd +++ b/doc/3.audio.examples/A06.frequency.pd @@ -1,8 +1,8 @@ -#N canvas 441 23 712 706 12; +#N canvas 441 38 712 706 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array osc-output 4410 float 0; -#X coords 0 1.02 4410 -1.02 200 130 1; +#X coords 0 1.02 4409 -1.02 200 130 1; #X restore 449 248 graph; #X obj 165 316 tabwrite~ osc-output; #X floatatom 326 117 5 0 0 0 - - - 0; diff --git a/doc/3.audio.examples/A07.fusion.pd b/doc/3.audio.examples/A07.fusion.pd index 1e2e99e3..124286a7 100644 --- a/doc/3.audio.examples/A07.fusion.pd +++ b/doc/3.audio.examples/A07.fusion.pd @@ -1,4 +1,4 @@ -#N canvas 468 23 681 680 12; +#N canvas 468 38 676 735 12; #X declare -stdpath ./; #X floatatom 133 98 5 0 0 0 - - - 0; #X obj 133 124 mtof; @@ -18,14 +18,13 @@ #X obj 133 246 +~; #X obj 133 270 +~; #N canvas 0 0 450 300 (subpatch) 0; -#X array tab.01.07 882 float 0; -#X coords 0 1.02 881 -1.02 200 130 1; +#X array fusion 882 float 0; +#X coords 0 1.02 881 -1.02 200 130 1 0 0; #X restore 417 261 graph; #X text 320 165 frequencies of harmonics; #X text 320 189 four oscillators; #X text 324 214 adjust amplitudes; #X text 168 269 add the three overtones together; -#X obj 138 360 tabwrite~ tab.01.07; #X text 439 399 ---- 0.02 seconds ----; #X obj 133 215 *~ 0.1; #X obj 261 215 *~ 0.5; @@ -37,9 +36,10 @@ #X text 169 72 <-- reset to middle C; #X obj 133 44 loadbang; #X text 176 99 <-- choose a different pitch; -#X text 431 650 updated for Pd version 0.4; -#X text 70 467 A simple way to build non-sinusoidal \, periodic musical tones is to sum a series of harmonically tuned sinusoids. Here the four oscillators have frequencies in a 1:2:3:4 ratio (the three [*] objects compute the second \, third \, and fourth one). The amplitudes are adjusted by the [*~ 0.1] \, etc. \, objects. Note that \, since the frequency (from [mtof]) is a message \, a [*] box suffices to operate on it \, but the oscillator's output \, being an audio signal \, needs [*~] instead. The control marked "overtones ON/OFF" is a toggle switch. Click to turn it on and off. Of the overtones are "off" you hear only a sinusoid from the first oscillator. If on \, you hear all four., f 76; -#X text 70 603 To hear the output \, choose a pitch (at top) \, optionally click the "overtones" control \, and mouse up the output volume. Click the "bang" button to graph it., f 77; +#X text 70 487 A simple way to build non-sinusoidal \, periodic musical tones is to sum a series of harmonically tuned sinusoids. Here the four oscillators have frequencies in a 1:2:3:4 ratio (the three [*] objects compute the second \, third \, and fourth one). The amplitudes are adjusted by the [*~ 0.1] \, etc. \, objects. Note that \, since the frequency (from [mtof]) is a message \, a [*] box suffices to operate on it \, but the oscillator's output \, being an audio signal \, needs [*~] instead. The control marked "overtones ON/OFF" is a toggle switch. Click to turn it on and off. Of the overtones are "off" you hear only a sinusoid from the first oscillator. If on \, you hear all four., f 74; +#X text 70 623 To hear the output \, choose a pitch (at top) \, optionally click the "overtones" control \, and mouse up the output volume. Click the "bang" button to graph it., f 74; +#X text 408 678 updated for Pd version 0.40-0; +#X obj 138 360 tabwrite~ fusion; #X connect 0 0 1 0; #X connect 1 0 4 0; #X connect 1 0 5 0; @@ -48,19 +48,19 @@ #X connect 3 0 0 0; #X connect 4 0 12 0; #X connect 5 0 6 0; -#X connect 6 0 24 0; +#X connect 6 0 23 0; #X connect 7 0 11 0; #X connect 8 0 7 0; -#X connect 9 0 25 0; +#X connect 9 0 24 0; #X connect 10 0 9 0; #X connect 11 0 15 1; #X connect 12 0 2 0; -#X connect 12 0 22 0; +#X connect 12 0 36 0; #X connect 13 0 12 1; #X connect 14 0 13 1; #X connect 15 0 16 0; #X connect 16 0 13 0; -#X connect 24 0 15 0; -#X connect 25 0 16 1; -#X connect 28 0 22 0; -#X connect 32 0 3 0; +#X connect 23 0 15 0; +#X connect 24 0 16 1; +#X connect 27 0 36 0; +#X connect 31 0 3 0; diff --git a/doc/3.audio.examples/A08.beating.pd b/doc/3.audio.examples/A08.beating.pd index f15f8fa0..aa651415 100644 --- a/doc/3.audio.examples/A08.beating.pd +++ b/doc/3.audio.examples/A08.beating.pd @@ -1,4 +1,4 @@ -#N canvas 473 26 538 623 12; +#N canvas 473 38 538 623 12; #X declare -stdpath ./; #X obj 61 227 output~; #X obj 61 191 +~; @@ -14,10 +14,10 @@ #X obj 61 160 +~; #X text 118 14 Beating between closely tuned sinusoids; #X text 43 305 In each of the three pairs of oscillators above \, the two frequencies are within 1/3 Hz or closer (for example \, the leftmost ones are close to 330 Hz but separated by 1/5 Hz.) The result is a gradual change in amplitude as the phases of the two slip against each other. This is called beating. More complex beating patterns may be made by using three or more oscillators. Also their amplitudes need not be equal (as they are here).; -#X text 41 432 They are all summed using "+~" boxes. They could have been summed in any order ("+~" is commutative for practical purposes) but here they are added in pairs to emphasize the relationships between them.; #X text 40 499 In contrast to the previous example \, the oscillators are not tuned to the overtone series (ratios 1:2:3:4...) and so the frequencies 330 \, 440 \, and 587 are heard separately.; #X obj 57 569 declare -stdpath ./; -#X text 298 578 updated for Pd version 0.40.; +#X text 41 432 They are all summed using [+~] objects. They could have been summed in any order ([+~] is commutative for practical purposes) but here they are added in pairs to emphasize the relationships between them.; +#X text 298 578 updated for Pd version 0.40-0; #X connect 1 0 0 0; #X connect 2 0 11 0; #X connect 3 0 11 1; diff --git a/doc/3.audio.examples/A09.frequency.mod.pd b/doc/3.audio.examples/A09.frequency.mod.pd index d4e81855..56511b3f 100644 --- a/doc/3.audio.examples/A09.frequency.mod.pd +++ b/doc/3.audio.examples/A09.frequency.mod.pd @@ -1,4 +1,4 @@ -#N canvas 495 23 652 664 12; +#N canvas 495 38 652 674 12; #X declare -stdpath ./; #X obj 218 172 *~; #X floatatom 218 87 5 0 0 0 - - - 0; @@ -16,29 +16,27 @@ #X text 204 46 modulation; #X text 64 13 FREQUENCY MODULATION ("FM") USING TWO OSCILLATORS; #X obj 148 248 osc~; -#X text 61 229 "carrier"; -#X text 56 164 add modulator; -#X text 55 182 to carrier; +#X text 56 230 "carrier"; #X text 275 154 index; #X text 277 135 modulation; #X obj 218 112 osc~; -#X text 405 229 --- 0.01 seconds ----; +#X text 426 233 --- 0.01 seconds ----; #X text 61 489 To get the FM sound \, set all three of carrier frequency \, modulation frequency \, and modulation index in the hundreds. Note that you get a timbral change as you sweep modulation index \, because this changes the amplitudes of the components of the output sound but not their frequencies., f 71; #X obj 148 319 output~; -#X text 386 619 updated for Pd version 0.37; +#X text 390 630 updated for Pd version 0.37; #X text 61 393 This patch shows the classical FM synthesis technique developed by John Chowning. It's nothing but an oscillator with vibrato controlled by another "modulation" oscillator. First \, to understand the patch \, set carrier frequency to 400 or so \, modulation frequency between 5 and 10 \, and try modulation index values between 0 and 400 \, say. You'll hear a sine wave with vibrato., f 71; #X text 61 568 The component frequencies are equal to the carrier frequency \, plus or minus multiples of the modulator frequency. A more complete discussion of FM occurs in part 5 of this series., f 71; -#X text 43 247 oscillator =>; -#X text 53 201 frequency =>; #X obj 461 26 declare -stdpath ./; #X obj 196 252 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X text 220 251 <-- click to graph; +#X text 47 170 add modulator to carrier frequency -->, f 13; +#X text 38 248 oscillator -->; #X connect 0 0 3 1; -#X connect 1 0 18 0; +#X connect 1 0 16 0; #X connect 2 0 3 0; #X connect 3 0 12 0; #X connect 6 0 0 1; #X connect 12 0 5 0; -#X connect 12 0 21 0; -#X connect 18 0 0 0; -#X connect 28 0 5 0; +#X connect 12 0 19 0; +#X connect 16 0 0 0; +#X connect 24 0 5 0; diff --git a/doc/3.audio.examples/B01.wavetables.pd b/doc/3.audio.examples/B01.wavetables.pd index 8e96c00f..f3a36aec 100644 --- a/doc/3.audio.examples/B01.wavetables.pd +++ b/doc/3.audio.examples/B01.wavetables.pd @@ -1,4 +1,4 @@ -#N canvas 443 44 725 592 12; +#N canvas 443 44 725 621 12; #X declare -stdpath ./; #X floatatom 127 60 6 0 0 0 - - - 0; #N canvas 0 0 450 300 (subpatch) 0; @@ -6,24 +6,24 @@ #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.612 0.612 0.612 0.612 0.612 0.627692 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.470769 -0.470769 -0.470769 -0.470769 -0.470769 -0.470769 -0.470769 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.627692 0.627692 0.627692 0.643385 0.643385 0.643385 0.659077 0 -0.502154 -0.502154 -0.502154 -0.486462 -0.486462 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.580615 0.596308 0.596308 0.596308 0.596308 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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.02 258 -1.02 258 130 1; #X restore 279 92 graph; -#X text 459 533 updated for Pd version 0.34; +#X text 459 553 updated for Pd version 0.34; #X text 78 18 WAVETABLE OSCILLATORS; #X text 25 123 wavetable; #X obj 127 87 mtof; #X floatatom 127 114 7 0 0 0 - - - 0; #X obj 127 140 tabosc4~ table10; -#X text 83 319 Note that I selected "save contents" in the properties dialog for table10 (right click on the table to see.) If this isn't set \, the waveform won't be remembered as part of the patch but will be reinitialized to zero when the patch is reopened., f 73; -#X msg 58 524 \; table10 cosinesum 256 0.2 -0.2 0.2 -0.2 0.2 -0.2 0.2; +#X msg 58 544 \; table10 cosinesum 256 0.2 -0.2 0.2 -0.2 0.2 -0.2 0.2; #X msg 559 144 \; table10 const 0; #X text 564 121 CLEAR TABLE; -#X text 83 389 For efficiency's sake tabosc4~ requires that the table have a power of two plus three points (64+3=67 \, 128+3=131 \, 256+3=259 \, etc.) If you want wraparound to work smoothly \, you should make the last three points copies of the first three. This is done because tabread4~ does 4-point interpolation., f 73; #X obj 127 174 output~; #X obj 509 33 declare -stdpath ./; -#X text 83 463 If you want a specific sinusoidal composition \, you can send table10 a message \, as below (see 15.arrays in the control examples):, f 73; +#X text 83 484 If you want a specific sinusoidal composition \, you can send table10 a message \, as below (see 15.arrays in the control examples):, f 73; #X text 54 59 pitch -->; #X text 19 140 oscillator -->; -#X text 83 263 Here \, in place of the [osc~] cosine wave oscillator \, we introduce the [tabosc4~] oscillator which produces an arbitrary waveform. You can draw in the waveform with the mouse., f 73; +#X text 83 263 Here \, in place of the [osc~] cosine wave oscillator \, we introduce the [tabosc4~] oscillator which uses arbitrary waveforms from arrays. You can draw a waveform in the array with the mouse., f 73; +#X text 83 399 For efficiency's sake [tabosc4~] requires that the table has a power of two plus three points (64+3=67 \, 128+3=131 \, 256+3=259 \, etc.) If you want wraparound to work smoothly \, you should make the last three points copies of the first three. This is done because [tabread4~] does 4-point interpolation., f 73; +#X text 83 319 Note that I selected "save contents" in the properties dialog for table10 (right click on the table to see.) If this isn't set \, the waveform won't be remembered as part of the patch but will be reinitialized to zero when the patch is reopened. If it this is set and you modified the waveform \, the current waveform gets stored with the file when you save the patch., f 73; #X connect 0 0 5 0; #X connect 5 0 6 0; #X connect 6 0 7 0; -#X connect 7 0 13 0; +#X connect 7 0 11 0; diff --git a/doc/3.audio.examples/B02.two-wavetables.pd b/doc/3.audio.examples/B02.two-wavetables.pd index 5e5e598d..0a433365 100644 --- a/doc/3.audio.examples/B02.two-wavetables.pd +++ b/doc/3.audio.examples/B02.two-wavetables.pd @@ -6,7 +6,6 @@ #X coords 0 1.02 258 -1.02 258 130 1; #X restore 323 194 graph; #X text 395 455 updated for Pd version 0.34; -#X text 19 44 WAVETABLE OSCILLATORS; #X text 47 147 wavetable; #N canvas 0 22 450 278 (subpatch) 0; #X array pitch11 259 float 1; @@ -16,12 +15,13 @@ #X obj 145 128 tabosc4~ pitch11; #X obj 145 164 tabosc4~ waveform11; #X obj 145 96 sig~ 0.5; -#X text 41 164 oscillator =>; -#X text 69 95 pitch =>; #X obj 145 215 output~; #X obj 144 291 declare -stdpath ./; -#X text 63 349 Here's a [tabosc4~] controlling the frequency of another one. If you get properties on the two arrays \, you'll see that the top graph has a vertical scale from 0 to 1000, f 69; -#X text 63 397 We're looping through that at a frequency of 0.5 Hz. and the output is used as the frequency input of the second [tabosc4~]. I've detected Klingons \, Captain Kirk..., f 69; -#X connect 5 0 6 0; -#X connect 6 0 10 0; -#X connect 7 0 5 0; +#X text 67 24 TWO WAVETABLE OSCILLATORS; +#X text 69 95 pitch -->; +#X text 41 164 oscillator -->; +#X text 63 349 Here's a [tabosc4~] controlling the frequency of another one. If you get properties on the two arrays \, you'll see that the top graph has a vertical scale from 0 to 1000 \, to represent a range in Hz., f 69; +#X text 63 397 We're looping through that at a frequency of 0.5 Hz and the output is used as the frequency input of the second [tabosc4~]. I've detected Klingons \, Captain Kirk..., f 69; +#X connect 4 0 5 0; +#X connect 5 0 7 0; +#X connect 6 0 4 0; diff --git a/doc/3.audio.examples/B03.tabread4.pd b/doc/3.audio.examples/B03.tabread4.pd index 3e5f00d7..a828601e 100644 --- a/doc/3.audio.examples/B03.tabread4.pd +++ b/doc/3.audio.examples/B03.tabread4.pd @@ -1,4 +1,4 @@ -#N canvas 376 88 741 622 12; +#N canvas 376 88 740 645 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array waveform12 131 float 1; @@ -13,8 +13,8 @@ #X floatatom 250 67 6 0 1000 0 - - - 0; #X obj 250 115 line~; #X obj 156 142 *~; -#X text 51 92 phase; -#X text 51 128 range; +#X text 49 92 phase; +#X text 49 128 range; #X text 250 46 squeeze; #X text 133 51 frequency; #N canvas 0 0 450 300 (subpatch) 0; @@ -22,25 +22,25 @@ #X coords 0 1 440 -1 300 140 1; #X restore 399 193 graph; #X obj 197 267 tabwrite~ wave-out12; -#X text 85 502 You would use tabread4~ (as opposed to tabosc4~) if you need direct control of the phase \, for instance if you to advance nonlinearly through the table. In the case shown here \, the "squeeze" factor makes the phase grow to a value at least \, and possibly much greater than \, 129 (to which tabread4~ then limits it). So the resulting waveform is compressed in time., f 87; #X obj 250 139 +~ 128; -#X text 497 583 updated for Pd version 0.37; -#X text 50 143 adjustment =>; -#X text 50 107 generation =>; +#X text 484 599 updated for Pd version 0.37; #X obj 157 307 output~; -#X obj 366 350 declare -stdpath ./; +#X obj 522 357 declare -stdpath ./; #X obj 197 231 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X text 220 230 <-- click to graph; #X obj 250 91 pack f 50; -#X text 84 392 The [tabread4~] module is available for situations requiring more control than [tabosc4~] offers. The relationship between the two is the same as between [cos~] and [osc~] \, although the units are different between [cos~] and [tabread4~]. The [cos~] objects assumes input is normalized from 0 to 1 (and will wrap around as needed) \, while [tabread4~] takes values from 1 to n-2 where n is the number of points in the table-- for a 259-point table such as we have here \, it's 1 to 129 (so the "good" segment is 128 samples long.), f 87; +#X text 48 107 generation -->; +#X text 48 143 adjustment -->; +#X text 71 408 The [tabread4~] module is available for situations requiring more control than [tabosc4~] offers. The relationship between the two is the same as between [cos~] and [osc~] \, although the units are different between [cos~] and [tabread4~]. The [cos~] objects assumes input is normalized from 0 to 1 (and will wrap around as needed) \, while [tabread4~] takes values from 1 to n-2 where n is the number of points in the table-- for a 131-point table such as we have here with "waveform12" \, it's 1 to 129 (so the "good" segment is 128 samples long.), f 87; +#X text 71 518 You would use [tabread4~] (as opposed to [tabosc4~]) if you need direct control of the phase \, for instance to advance nonlinearly through the table. In the case shown here \, the "squeeze" factor makes the phase grow to a value at least \, and possibly much greater than \, 129 (to which [tabread4~] then limits it). So the resulting waveform is compressed in time., f 87; #X connect 2 0 8 0; #X connect 3 0 14 0; -#X connect 3 0 20 0; +#X connect 3 0 17 0; #X connect 4 0 3 0; #X connect 5 0 2 0; -#X connect 6 0 24 0; -#X connect 7 0 16 0; +#X connect 6 0 21 0; +#X connect 7 0 15 0; #X connect 8 0 4 0; -#X connect 16 0 8 1; -#X connect 22 0 14 0; -#X connect 24 0 7 0; +#X connect 15 0 8 1; +#X connect 19 0 14 0; +#X connect 21 0 7 0; diff --git a/doc/3.audio.examples/B04.tabread4.interpolation.pd b/doc/3.audio.examples/B04.tabread4.interpolation.pd index 65c2b07f..d5e41938 100644 --- a/doc/3.audio.examples/B04.tabread4.interpolation.pd +++ b/doc/3.audio.examples/B04.tabread4.interpolation.pd @@ -1,4 +1,4 @@ -#N canvas 330 47 738 541 12; +#N canvas 456 108 738 541 12; #N canvas 0 22 450 278 (subpatch) 0; #X array waveform13 11 float 1; #A 0 1 1 1 1 1 1 1 -1 -1 -1 -1; @@ -6,17 +6,12 @@ #X restore 404 24 graph; #X text 502 500 updated for Pd version 0.34; #X obj 162 159 +~ 1; -#X text 60 82 phase; -#X text 60 131 range; +#X text 52 82 phase; +#X text 52 131 range; #N canvas 0 22 450 278 (subpatch) 0; #X array wave-out13 441 float 0; #X coords 0 1.02 440 -1.02 300 140 1; #X restore 405 217 graph; -#N canvas 601 297 474 197 other-stuff 0; -#X obj 73 42 loadbang; -#X msg 73 74 \; waveform13 0 1 1 1 1 1 1 1 -1 -1 -1 -1 \; waveform13 xlabel -1.2 0 1 2 3 4 5 6 7 8 9 10; -#X connect 0 0 1 0; -#X restore 561 421 pd other-stuff; #X obj 162 249 tabwrite~ wave-out13; #X obj 162 186 tabread4~ waveform13; #X obj 162 133 *~ 8; @@ -24,21 +19,25 @@ #X text 63 35 4-POINT INTERPOLATION IN DETAIL; #X obj 214 318 sig~ 220; #X obj 214 348 tabosc4~ waveform13; -#X text 63 295 (this would be; -#X text 64 315 equivalent to the; -#X text 46 398 This patch demonstrates 4-point interpolation in tabread4~. The 11-point table \, waveform13 \, contains a transition from from 1 to -1 \, which is "smoothed" as seen in wave-out13. There's no such transition at the wrap around point--the interpolation always happens between 4 consecutive samples of the table \, disregarding wraparound., f 65; -#X text 138 335 above) =>; -#X text 59 146 adjustment =>; -#X text 59 97 generation =>; #X text 204 217 <-- click to graph; #X obj 179 218 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X obj 41 198 ../5.reference/set-dsp-tgl; #X text 72 201 DSP on/off; #X msg 41 235 \; pd dsp \$1; -#X connect 2 0 8 0; -#X connect 8 0 7 0; -#X connect 9 0 2 0; -#X connect 10 0 9 0; -#X connect 12 0 13 0; -#X connect 21 0 7 0; -#X connect 22 0 24 0; +#X text 51 97 generation -->; +#X text 51 146 adjustment -->; +#X text 86 297 this would be equivalent to the above -->, f 25; +#X text 46 398 This patch demonstrates 4-point interpolation in [tabread4~]. The 11-point table \, "waveform13" \, contains a transition from from 1 to -1 \, which is "smoothed" as seen in wave-out13. There's no such transition at the wrap around point--the interpolation always happens between 4 consecutive samples of the table \, disregarding wraparound., f 65; +#N canvas 801 456 474 197 init_waveform 0; +#X obj 73 42 loadbang; +#X msg 73 99 \; waveform13 0 1 1 1 1 1 1 1 -1 -1 -1 -1 \; waveform13 xlabel -1.2 0 1 2 3 4 5 6 7 8 9 10; +#X text 195 52 initialize waveform; +#X connect 0 0 1 0; +#X restore 564 429 pd init_waveform; +#X connect 2 0 7 0; +#X connect 7 0 6 0; +#X connect 8 0 2 0; +#X connect 9 0 8 0; +#X connect 11 0 12 0; +#X connect 14 0 6 0; +#X connect 15 0 17 0; diff --git a/doc/3.audio.examples/B05.tabread.FM.pd b/doc/3.audio.examples/B05.tabread.FM.pd index 7e74eaa9..5771bfb6 100644 --- a/doc/3.audio.examples/B05.tabread.FM.pd +++ b/doc/3.audio.examples/B05.tabread.FM.pd @@ -1,32 +1,29 @@ -#N canvas 394 94 613 365 12; +#N canvas 478 98 693 435 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array pitchmod14 131 float 1; #A 0 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.831692 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.863077 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 -0.800308 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308; #X coords 0 1.02 130 -1.02 258 130 1; -#X restore 284 160 graph; -#X floatatom 69 62 4 0 0 0 - - - 0; -#X text 110 74 frequency; -#X floatatom 118 187 4 0 0 0 - - - 0; -#X text 112 55 modulation; -#X obj 69 138 *~; -#X text 165 131 modulation; -#X text 163 150 depth; -#X floatatom 118 138 4 0 0 0 - - - 0; -#X obj 69 186 +~; -#X text 157 193 frequency; -#X obj 69 218 osc~; -#X obj 69 103 tabosc4~ pitchmod14; -#X text 161 175 carrier; -#X text 60 19 FREQUENCY MODULATION BY WAVETABLE; -#X text 339 319 updated for Pd version 0.37; -#X obj 69 260 output~; -#X obj 400 17 declare -stdpath ./; -#X text 281 61 This [tabosc4~] controls the pitch of a sinusoidal oscillator (posc~]). Try changing the waveform as well as the three familiar parameters., f 37; -#X connect 1 0 12 0; -#X connect 3 0 9 1; -#X connect 5 0 9 0; -#X connect 8 0 5 1; -#X connect 9 0 11 0; -#X connect 11 0 16 0; -#X connect 12 0 5 0; +#X restore 360 187 graph; +#X floatatom 145 89 4 0 0 0 - - - 0; +#X floatatom 101 159 4 0 0 0 - - - 0; +#X obj 145 202 *~; +#X floatatom 163 170 4 0 0 0 - - - 0; +#X obj 127 233 +~; +#X obj 127 265 osc~; +#X obj 145 130 tabosc4~ pitchmod14; +#X text 65 31 FREQUENCY MODULATION BY WAVETABLE; +#X text 399 361 updated for Pd version 0.37; +#X obj 127 307 output~; +#X obj 445 31 declare -stdpath ./; +#X text 357 88 This [tabosc4~] controls the pitch of a sinusoidal oscillator ([osc~]). Try changing the waveform as well as the three familiar parameters., f 37; +#X text 199 163 modulation depth, f 10; +#X text 38 162 carrier frequency, f 9; +#X text 183 82 modulation frequency, f 10; +#X connect 1 0 7 0; +#X connect 2 0 5 0; +#X connect 3 0 5 1; +#X connect 4 0 3 1; +#X connect 5 0 6 0; +#X connect 6 0 10 0; +#X connect 7 0 3 0; diff --git a/doc/3.audio.examples/B06.table.switching.pd b/doc/3.audio.examples/B06.table.switching.pd index 309862d4..1a46c38c 100644 --- a/doc/3.audio.examples/B06.table.switching.pd +++ b/doc/3.audio.examples/B06.table.switching.pd @@ -1,32 +1,33 @@ -#N canvas 381 52 801 562 12; +#N canvas 381 52 805 575 12; #X declare -stdpath ./; #N canvas 0 22 450 278 (subpatch) 0; #X array waveshape15a 131 float 1; #A 0 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.831692 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.863077 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 -0.800308 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308; #X coords 0 1.02 130 -1.02 258 130 1; -#X restore 497 81 graph; -#X text 44 8 SWITCHING BETWEEN TABLES; +#X restore 509 89 graph; +#X text 82 14 SWITCHING BETWEEN TABLES; #N canvas 0 22 450 278 (subpatch) 0; #X array waveshape15b 131 float 1; #A 0 -0.659077 -0.643385 -0.643385 -0.627692 -0.612 -0.612 -0.596308 -0.596308 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.596308 -0.596308 -0.596308 -0.596308 -0.596308 -0.596308 -0.596308 -0.596308 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.564923 -0.549231 -0.549231 -0.533538 -0.517846 -0.517846 -0.517846 -0.517846 -0.517846 -0.517846 -0.517846 -0.517846 -0.533538 -0.549231 -0.580615 -0.580615 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.863077 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 -0.800308 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308; #X coords 0 1.02 130 -1.02 258 130 1; -#X restore 497 236 graph; -#X obj 156 272 tabosc4~ waveshape15a; -#X obj 156 164 sig~ 110; -#X msg 181 193 set waveshape15a; -#X msg 189 219 set waveshape15b; -#X text 24 45 During a performance you're unlikely to want to draw or recalculate wavetables on the fly \, because you don't want to give Pd computationally intensive atomic tasks that could make Pd miss a DAC deadline. Instead \, use "set" messages to switch tabosc~ or tabread4~ between pre-prepared tables. Indeed \, you will eventually want to save screen space by throwing all your wavetables in a subpatch somewhere.; -#X obj 156 310 output~; -#X obj 289 336 declare -stdpath ./; -#X obj 79 458 array define -k waveshape15c 131; +#X restore 509 244 graph; +#X obj 146 272 tabosc4~ waveshape15a; +#X obj 146 164 sig~ 110; +#X msg 171 193 set waveshape15a; +#X msg 179 219 set waveshape15b; +#X obj 146 310 output~; +#X obj 300 336 declare -stdpath ./; +#X obj 79 466 array define -k waveshape15c 131; #A 0 0 -0.553343 -0.486675 -0.426674 -0.333339 -0.300005 -0.233338 -0.173337 -0.113336 -0.0600014 -0.0133339 0.0333335 0.0866678 0.133335 0.173336 0.213337 0.24667 0.280004 0.313338 0.333339 0.353339 0.346672 0.300005 -0.240004 -0.306672 -0.306672 -0.306672 -0.306672 -0.313339 -0.326673 -0.333339 -0.35334 -0.360006 -0.37334 -0.453341 -0.460008 -0.460008 -0.460008 -0.453341 -0.426674 -0.400007 -0.340006 -0.253338 -0.18667 -3.57628e-07 0.0533339 0.180003 0.200003 0.280004 0.320005 0.360006 0.392006 0.424007 0.456007 0.488008 0.520008 0.540009 0.563343 0.586676 0.606677 0.62001 0.62001 0.420007 -0.506676 -0.586677 -0.673345 -0.720013 -0.74668 -0.780014 -0.900016 -0.900016 -0.886682 -0.860015 -0.840015 -0.820014 -0.78668 -0.76668 -0.74668 -0.693345 -0.662234 -0.631122 -0.600011 -0.573343 -0.543343 -0.513342 -0.480008 -0.446675 -0.418341 -0.390007 -0.361673 -0.333339 -0.293339 -0.253338 -0.220004 -0.18667 -0.153336 -0.120002 -0.0866685 -0.0533346 -0.0200007 0.00999981 0.0400003 0.0666674 0.0933346 0.123335 0.153336 0.20667 0.233337 0.260004 0.291116 0.322227 0.353339 0.400006 0.440007 0.480008 0.500008 0.533342 0.566676 0.60001 0.626677 0.653344 0.683345 0.740012 0.780013 0.82668 0.853347 0.846681 0.833347 0.773346 0.706678 0.646677; -#X msg 194 244 set waveshape15c; -#X text 563 490 updated for Pd version 0.52; -#X obj 79 497 table; -#X text 48 381 There's also an [array] object so that you can have arrays with parameterizable names and sizes. You can also save the state of the array in this case \, and read it in from a file or calculate it at startup.; -#X text 123 498 <-- see also this older and less powerful object (you can't save contents in this one)., f 46; -#X connect 3 0 8 0; +#X msg 184 244 set waveshape15c; +#X text 560 499 updated for Pd version 0.52; +#X obj 79 505 table; +#X text 48 385 There's also an [array] object so that you can have arrays with parameterizable names and sizes. You can also save the state of the array in this case \, and read it in from a file or calculate it at startup.; +#X text 123 506 <-- see also this older and less powerful object (you can't save contents in this one)., f 46; +#X text 24 45 During a performance you're unlikely to want to draw or recalculate wavetables on the fly \, because you don't want to give Pd computationally intensive atomic tasks that could make Pd miss a DAC deadline. Instead \, use "set" messages to switch [tabosc~] or [tabread4~] between pre-prepared tables. Indeed \, you will eventually want to save screen space by throwing all your wavetables in a subpatch somewhere.; +#X text 316 467 <-- click to open; +#X connect 3 0 7 0; #X connect 4 0 3 0; #X connect 5 0 3 0; #X connect 6 0 3 0; -#X connect 11 0 3 0; +#X connect 10 0 3 0; diff --git a/doc/3.audio.examples/B07.sampler.pd b/doc/3.audio.examples/B07.sampler.pd index ad1e6cb6..154b1258 100644 --- a/doc/3.audio.examples/B07.sampler.pd +++ b/doc/3.audio.examples/B07.sampler.pd @@ -1,43 +1,47 @@ -#N canvas 418 47 764 618 12; +#N canvas 418 47 764 678 12; #X declare -stdpath ./; -#X obj 59 220 hip~ 5; +#X obj 59 305 hip~ 5; #N canvas 0 0 450 300 (subpatch) 0; -#X array sample-table 44104 float 2; -#X coords 0 1.02 44104 -1.02 200 130 1; +#X array sample-table 44103 float 2; +#X coords 0 1.02 44103 -1.02 200 130 1; #X restore 503 28 graph; -#X obj 59 187 tabread4~ sample-table; -#X obj 59 155 line~; +#X obj 59 267 tabread4~ sample-table; +#X obj 59 235 line~; #X obj 59 106 * 441; #X floatatom 59 48 5 0 100 0 - - - 0; #X text 90 14 SCRATCH MACHINE; #X text 106 106 convert to SAMPLES (441 samples in 0.01 sec); -#X obj 204 265 loadbang; -#X text 230 179 read from the table; -#X text 229 194 (the input is the index in samples); -#X text 51 469 For more on reading and writing soundfiles to tables \, setting their lengths \, etc \, see "arrays" in the "control examples" series., f 96; -#X text 51 430 Fanatics take note: if you want really high-fidelity sampling \, use a high-quality resampling program to up-sample your soundfile to 88200 to drastically reduce interpolation error., f 96; -#X text 509 181 (one second plus three extra; -#X text 511 200 for 4-point interpolation); -#X text 477 266 message to read a soundfile into the table (automatically sent when you load this patch by the "loadbang" object.), f 30; -#X text 101 155 convert smoothly to audio signal; +#X obj 204 335 loadbang; +#X text 45 550 For more on reading and writing soundfiles to tables \, setting their lengths \, etc \, see "arrays" in the "control examples" series., f 96; +#X text 45 511 Fanatics take note: if you want really high-fidelity sampling \, use a high-quality resampling program to up-sample your soundfile to 88200 to drastically reduce interpolation error., f 96; +#X text 101 235 convert smoothly to audio signal; #X text 107 66 (range is 0-100.) YOU ONLY HEAR OUTPUT; #X text 108 82 WHEN THIS IS 0-100 AND ACTIVELY CHANGING.; -#X text 532 567 updated for Pd version 0.33; -#X text 502 159 --- 44103 samples ---; -#X msg 204 289 read ../sound/voice.wav sample-table; -#X obj 204 314 soundfiler; -#X obj 59 268 output~; -#X obj 597 237 declare -stdpath ./; -#X obj 59 130 pack f 100; +#X text 532 647 updated for Pd version 0.33; +#X msg 204 359 read ../sound/voice.wav sample-table; +#X obj 204 384 soundfiler; +#X obj 59 348 output~; +#X obj 581 248 declare -stdpath ./; +#X obj 59 133 pack f 100; #X text 100 48 <-- read point in 100ths of a second, f 39; -#X text 51 353 This patch introduces the [tabread4~] object \, which reads audio samples out of a floating-point array \, often called a "sample table." The input is the index of the sample to read \, counting from zero. The output is calculated using 4-point cubic interpolation \, which is adequate for most purposes. Because of the interpolation scheme \, [tabread4~]'s input cannot be less than one or greater than the table length minus two., f 96; -#X text 51 505 Note the highpass filter ([hip~ 5]) that is present to filter a DC component (0 hz frequency). A This is not actually needed as the [output~] abstraction already includes [hip~] objects to filter DC \, but it's present in the examples for didactic reasons., f 96; -#X text 111 220 high pass filter to cut DC; -#X connect 0 0 23 0; +#X text 111 305 high pass filter to cut DC; +#X listbox 59 164 10 0 0 0 - - - 0; +#X text 230 259 read from the table (the input is the index in samples), f 30; +#X text 477 340 message to read a soundfile into the table (automatically sent when you load this patch by the [loadbang] object.), f 30; +#X text 45 434 This patch implements a simples scratch machine with [tabread4~] \, which reads audio samples out of a floating-point array \, often called a "sample table." The input is the index of the sample to read \, counting from zero. The output is calculated using 4-point cubic interpolation \, which is adequate for most purposes. Because of the interpolation scheme \, [tabread4~]'s input cannot be less than one or greater than the table length minus two., f 96; +#X text 45 586 Note the highpass filter ([hip~ 5]) that is present to filter a DC component (0 hz frequency). This is not actually needed as the [output~] abstraction already includes [hip~] objects to filter DC \, but it's present in the examples for didactic reasons., f 96; +#X text 508 182 (one second plus three extra; +#X text 510 201 for 4-point interpolation); +#X text 527 160 --- 44103 samples ---; +#X msg 78 198 1 \, 44101 1000; +#X text 182 197 read the whole table (from 1 to n-2); +#X connect 0 0 17 0; #X connect 2 0 0 0; #X connect 3 0 2 0; -#X connect 4 0 25 0; +#X connect 4 0 19 0; #X connect 5 0 4 0; -#X connect 8 0 21 0; -#X connect 21 0 22 0; -#X connect 25 0 3 0; +#X connect 8 0 15 0; +#X connect 15 0 16 0; +#X connect 19 0 22 0; +#X connect 22 0 3 0; +#X connect 30 0 3 0; diff --git a/doc/3.audio.examples/B08.sampler.loop.pd b/doc/3.audio.examples/B08.sampler.loop.pd index 535efc0e..c0b5b189 100644 --- a/doc/3.audio.examples/B08.sampler.loop.pd +++ b/doc/3.audio.examples/B08.sampler.loop.pd @@ -3,54 +3,54 @@ #N canvas 0 0 450 300 (subpatch) 0; #X array tabread4-out 44100 float 2; #X coords 0 1.02 44100 -1.02 200 130 1; -#X restore 466 70 graph; +#X restore 466 68 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array table17 44103 float 2; #X coords 0 1.02 44103 -1.02 200 130 1; -#X restore 683 67 graph; -#X obj 612 380 loadbang; -#X obj 98 306 tabwrite~ tabread4-out; -#X obj 65 335 hip~ 5; -#X floatatom 65 81 5 0 0 0 - - - 0; -#X text 191 242 read from the table; +#X restore 683 68 graph; +#X obj 625 390 loadbang; +#X obj 88 306 tabwrite~ tabread4-out; +#X obj 55 335 hip~ 5; +#X floatatom 55 81 5 0 0 0 - - - 0; +#X text 181 242 read from the table; #X text 80 38 LOOPING SAMPLER; -#X floatatom 90 134 5 0 0 0 - - - 0; -#X obj 90 160 * 441; -#X obj 65 187 *~ 0; -#X obj 65 214 +~ 1; -#X obj 609 254 adc~ 1; -#X text 702 385 v-- re-read the original sample; -#X text 188 491 In this patch you will frequently hear discontinuities at the looping point. If you're working in a studio \, you can sometimes find "good" loop points for samples. Another approach \, better for live situations \, is shown in the next patch., f 55; -#X obj 612 433 soundfiler; +#X floatatom 80 134 5 0 0 0 - - - 0; +#X obj 80 160 * 441; +#X obj 55 187 *~ 0; +#X obj 55 214 +~ 1; +#X obj 616 264 adc~ 1; +#X text 715 395 v-- re-read the original sample; +#X text 199 491 In this patch you will frequently hear discontinuities at the looping point. If you're working in a studio \, you can sometimes find "good" loop points for samples. Another approach \, better for live situations \, is shown in the next patch., f 55; +#X obj 625 443 soundfiler; #X text 699 206 ---- 44103 samples ----; -#X text 477 206 ---- 1 second ------; -#X obj 65 375 output~; +#X obj 55 375 output~; #X text 717 527 updated for Pd version 0.37; -#X obj 65 243 tabread4~ table17; -#X obj 609 321 tabwrite~ table17; -#X msg 612 408 read ../sound/voice.wav table17; -#X text 189 352 This is a looping sampler in which you specify the number of loops per second (the frequency) and the size of the chunk to loop. If the frequency is less than about 20 \, you will hear repetition and the chunk size will sound like transposition. For frequencies above 50 or so \, you hear a tone whose timbre is controlled by the chunk size (best kept below 10 or so.) Remember you can use the "shift" key on number boxes to make fine adjustments., f 55; +#X obj 55 243 tabread4~ table17; +#X obj 616 331 tabwrite~ table17; +#X msg 625 418 read ../sound/voice.wav table17; +#X text 200 352 This is a looping sampler in which you specify the number of loops per second (the frequency) and the size of the chunk to loop. If the frequency is less than about 20 \, you will hear repetition and the chunk size will sound like transposition. For frequencies above 50 or so \, you hear a tone whose timbre is controlled by the chunk size (best kept below 10 or so.) Remember you can use the "shift" key on number boxes to make fine adjustments., f 55; #X obj 760 15 declare -stdpath ./; -#X text 123 271 <-- click to display output; -#X obj 622 288 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X text 648 288 <-- click here to record your own sample; -#X text 114 81 <-- frequency (Hz.); -#X text 135 135 <-- chunk size (100ths of a second); -#X text 111 186 <-- readjust phase for range 0 - (chunk size); -#X text 110 214 <-- add one to avoid beginning of table; -#X obj 65 107 phasor~; -#X obj 98 272 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X connect 2 0 22 0; -#X connect 4 0 18 0; -#X connect 5 0 32 0; +#X text 113 271 <-- click to display output; +#X obj 629 298 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X text 655 298 <-- click here to record your own sample; +#X text 104 81 <-- frequency (Hz.); +#X text 125 135 <-- chunk size (100ths of a second); +#X text 101 186 <-- readjust phase for range 0 - (chunk size); +#X text 100 214 <-- add one to avoid beginning of table; +#X obj 55 107 phasor~; +#X obj 88 272 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X text 482 206 ------ 1 second ------; +#X connect 2 0 21 0; +#X connect 4 0 17 0; +#X connect 5 0 31 0; #X connect 8 0 9 0; #X connect 9 0 10 1; #X connect 10 0 11 0; -#X connect 11 0 20 0; -#X connect 12 0 21 0; -#X connect 20 0 4 0; -#X connect 20 0 3 0; -#X connect 22 0 15 0; -#X connect 26 0 21 0; -#X connect 32 0 10 0; -#X connect 33 0 3 0; +#X connect 11 0 19 0; +#X connect 12 0 20 0; +#X connect 19 0 4 0; +#X connect 19 0 3 0; +#X connect 21 0 15 0; +#X connect 25 0 20 0; +#X connect 31 0 10 0; +#X connect 32 0 3 0; diff --git a/doc/3.audio.examples/B09.sampler.loop.smooth.pd b/doc/3.audio.examples/B09.sampler.loop.smooth.pd index e7db3e0d..3a40c4e7 100644 --- a/doc/3.audio.examples/B09.sampler.loop.smooth.pd +++ b/doc/3.audio.examples/B09.sampler.loop.smooth.pd @@ -1,8 +1,8 @@ #N canvas 401 67 842 605 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; -#X array cos-output 44100 float 2; -#X coords 0 1.02 44100 -1.02 200 130 1; +#X array cos-output 44100 float 0; +#X coords 0 1.02 44099 -1.02 200 130 1; #X restore 510 201 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array table18 44103 float 2; @@ -21,15 +21,13 @@ #X obj 82 222 *~; #X obj 509 527 soundfiler; #X text 522 158 -- 44103 samples ---; -#X text 533 334 ----- 1 second ------; +#X text 539 334 ----- 1 second ------; #X obj 82 77 phasor~; #X obj 82 164 *~ 0.5; #X obj 82 283 output~; #X obj 147 138 *~; -#X text 26 360 Here we apply an amplitude envelope to protect against discontinuities at the loop point. The envelope is just a cosine wave from -90 degrees to +90 degrees \, (-pi/2 to pi/2 radians) \, i.e. \, the part that is zero or positive in sign. The "cos~" object's input is in cycles (units of 2pi radians) so -1/4 to +1/4 addresses the desired part of the waveform.; #X obj 204 247 tabwrite~ cos-output; -#X text 26 468 To see the envelope \, put the phasor on 2 Hz or so \, click the "graph" button \, and look at "cos-output." This is multiplied by the tabread4~ output so that it doesn't click when the phase wraps around., f 59; -#X text 26 535 It is possible to get much more control over the shape of the envelope \, but this will be taken up later., f 59; +#X text 26 533 It is possible to get much more control over the shape of the envelope \, but this will be taken up later., f 61; #X obj 147 189 tabread4~ table18; #X obj 512 429 tabwrite~ table18; #X msg 509 502 read ../sound/voice.wav table18; @@ -42,22 +40,24 @@ #X text 213 86 <-- chunk size (100ths of a second); #X obj 204 220 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X obj 527 402 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X connect 2 0 26 0; +#X text 26 360 Here we apply an amplitude envelope to protect against discontinuities at the loop point. The envelope is just a cosine wave from -90 degrees to +90 degrees \, (-pi/2 to pi/2 radians) \, i.e. \, the part that is zero or positive in sign. The [cos~] object's input is in cycles (units of 2pi radians) so -1/4 to +1/4 addresses the desired part of the waveform., f 61; +#X text 26 460 To see the envelope \, put the [phasor~] on 2 Hz or so \, click the "graph" button \, and look at "cos-output." This is multiplied by the [tabread4~] output so that it doesn't click when the phase wraps around., f 61; +#X connect 2 0 24 0; #X connect 3 0 18 0; #X connect 4 0 16 0; #X connect 5 0 6 0; #X connect 6 0 19 1; -#X connect 7 0 24 0; -#X connect 8 0 25 0; +#X connect 7 0 22 0; +#X connect 8 0 23 0; #X connect 10 0 17 0; #X connect 11 0 12 0; -#X connect 11 0 21 0; +#X connect 11 0 20 0; #X connect 12 0 3 0; #X connect 16 0 10 0; #X connect 16 0 19 0; #X connect 17 0 11 0; #X connect 19 0 7 0; -#X connect 24 0 12 1; -#X connect 26 0 13 0; -#X connect 34 0 21 0; -#X connect 35 0 25 0; +#X connect 22 0 12 1; +#X connect 24 0 13 0; +#X connect 32 0 20 0; +#X connect 33 0 23 0; diff --git a/doc/3.audio.examples/B10.sampler.scratch.pd b/doc/3.audio.examples/B10.sampler.scratch.pd index 1b0195fe..825c317e 100644 --- a/doc/3.audio.examples/B10.sampler.scratch.pd +++ b/doc/3.audio.examples/B10.sampler.scratch.pd @@ -1,4 +1,4 @@ -#N canvas 386 32 831 688 12; +#N canvas 386 38 831 688 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array table19 44103 float 2; @@ -12,8 +12,8 @@ #X obj 355 355 adc~ 1; #X obj 355 381 hip~ 5; #N canvas 0 0 450 300 (subpatch) 0; -#X array graph19 44100 float 2; -#X coords 0 44100 44100 0 200 130 1 0 0; +#X array graph19 44100 float 0; +#X coords 0 44100 44099 0 200 130 1 0 0; #X restore 522 209 graph; #X obj 87 341 *~; #X obj 200 258 line~; @@ -21,15 +21,13 @@ #X floatatom 200 182 4 0 0 0 - - - 0; #X obj 147 290 +~; #X text 71 495 In this patch we can loop in any "window" of the input sample. The "read point" (0-100) gives the starting point of the window and "chunk" is its size (both in 100ths of a second.) Try \, for example \, frequency 4 \, sharpness 10 \, chunk size 25 \, and vary the read point from -25 to 100 \, listening to the result.; -#X text 540 346 ----- 1 second ------; #X obj 534 393 loadbang; -#X text 570 417 v-- re-read the original sample; -#X obj 544 462 soundfiler; +#X text 570 423 v-- re-read the original sample; +#X obj 544 468 soundfiler; #X text 527 164 ---- 44103 samples ---; #X obj 355 441 tabwrite~ table19; -#X msg 544 438 read ../sound/voice.wav table19; +#X msg 544 444 read ../sound/voice.wav table19; #X text 603 632 updated for Pd version 0.37; -#X msg 534 488 \; graph19 ylabel 48000 0 44100; #X obj 86 173 -~ 0.5; #X obj 147 91 phasor~; #X obj 86 201 *~ 0.5; @@ -39,9 +37,6 @@ #X text 74 595 You should hear some doppler shift as you change the read point. To see why \, click on "graph table index" and quickly start changing the read point--- you should see entertaining pictures in "table-index". The next patch shows how to prevent this if you wish to.; #X obj 148 351 tabread4~ table19; #X obj 194 322 tabwrite~ graph19; -#X text 234 183 <= read point (100ths of a second); -#X text 208 121 <= chunk size (100ths of a second); -#X text 192 65 <= frequency (Hz.); #X obj 623 578 declare -stdpath ./; #X text 396 409 <-- record; #X obj 200 232 pack f 100; @@ -49,29 +44,35 @@ #X obj 194 293 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X text 217 293 <-- graph table index; #X obj 87 375 hip~ 5; -#X connect 1 0 25 0; +#X text 192 66 <-- frequency (Hz.); +#X text 208 121 <-- chunk size (100ths of a second); +#X text 234 183 <--; +#X text 259 183 read point (100ths of a second), f 19; +#X text 550 349 ----- 1 second -----; +#X msg 534 502 \; graph19 ylabel 46000 0 44100; +#X connect 1 0 23 0; #X connect 2 0 3 0; #X connect 3 0 4 1; #X connect 4 0 5 0; #X connect 5 0 13 0; #X connect 6 0 7 0; -#X connect 7 0 20 0; -#X connect 9 0 42 0; +#X connect 7 0 19 0; +#X connect 9 0 37 0; #X connect 10 0 13 1; -#X connect 11 0 38 0; +#X connect 11 0 33 0; #X connect 12 0 11 0; -#X connect 13 0 31 0; -#X connect 13 0 32 0; -#X connect 16 0 23 0; -#X connect 16 0 21 0; -#X connect 21 0 18 0; -#X connect 24 0 26 0; -#X connect 25 0 4 0; -#X connect 25 0 24 0; -#X connect 26 0 27 0; -#X connect 27 0 9 0; -#X connect 31 0 9 1; -#X connect 38 0 10 0; -#X connect 39 0 20 0; -#X connect 40 0 32 0; -#X connect 42 0 28 0; +#X connect 13 0 29 0; +#X connect 13 0 30 0; +#X connect 15 0 43 0; +#X connect 15 0 20 0; +#X connect 20 0 17 0; +#X connect 22 0 24 0; +#X connect 23 0 4 0; +#X connect 23 0 22 0; +#X connect 24 0 25 0; +#X connect 25 0 9 0; +#X connect 29 0 9 1; +#X connect 33 0 10 0; +#X connect 34 0 19 0; +#X connect 35 0 30 0; +#X connect 37 0 26 0; diff --git a/doc/3.audio.examples/B11.sampler.nodoppler.pd b/doc/3.audio.examples/B11.sampler.nodoppler.pd index b3b3e904..9247af91 100644 --- a/doc/3.audio.examples/B11.sampler.nodoppler.pd +++ b/doc/3.audio.examples/B11.sampler.nodoppler.pd @@ -4,7 +4,7 @@ #X array table20 44103 float 2; #X coords 0 1.02 44103 -1.02 200 130 1; #X restore 581 37 graph; -#X obj 474 355 loadbang; +#X obj 447 372 loadbang; #X obj 165 475 hip~ 5; #X floatatom 112 65 5 0 0 0 - - - 0; #X floatatom 180 128 4 0 0 0 - - - 0; @@ -13,11 +13,11 @@ #X obj 112 89 phasor~ 0; #X obj 420 228 adc~ 1; #X obj 420 252 hip~ 5; -#X text 525 382 v-- re-read the original sample; +#X text 498 399 v-- re-read the original sample; #N canvas 0 0 450 300 (subpatch) 0; -#X array graph20 44100 float 2; -#X coords 0 44100 44100 0 200 130 1; -#X restore 583 206 graph; +#X array graph20 44100 float 0; +#X coords 0 44100 44099 0 200 130 1; +#X restore 583 226 graph; #X obj 165 441 *~; #X obj 200 283 line~; #X obj 242 194 * 441; @@ -27,11 +27,9 @@ #X obj 200 307 samphold~; #X obj 129 245 samphold~; #X obj 112 271 *~; -#X text 593 342 ----- 1 second ------; #X text 581 171 ---- 44103 samples ---; -#X obj 486 426 soundfiler; +#X obj 459 443 soundfiler; #X text 44 18 SLIDING STABLE LOOPS WITHOUT DOPPLER SHIFT; -#X msg 474 457 \; graph20 ylabel 48000 0 44100; #X obj 165 528 output~; #X obj 49 257 -~ 0.5; #X obj 49 281 *~ 0.5; @@ -39,20 +37,22 @@ #X obj 225 373 tabwrite~ graph20; #X obj 183 409 tabread4~ table20; #X obj 420 307 tabwrite~ table20; -#X msg 486 402 read ../sound/voice.wav table20; -#X text 310 520 This example differs from the previous one in having samphold~ objects which allow the chunk size and especially the read point to change only at points where the phase wraps around. This removes signal discontinuities (when the chunk size changes) and doppler shift when the read point is changing., f 67; +#X msg 459 419 read ../sound/voice.wav table20; +#X text 310 525 This example differs from the previous one in having samphold~ objects which allow the chunk size and especially the read point to change only at points where the phase wraps around. This removes signal discontinuities (when the chunk size changes) and doppler shift when the read point is changing., f 67; #X text 640 606 updated for Pd version 0.37; -#X text 275 169 <= read point in 100ths of a second; -#X text 217 127 <= chunk size (100ths of a second); -#X text 155 64 <= frequency (Hz.); #X obj 397 58 declare -stdpath ./; #X text 250 343 <-- graph table index; #X text 459 279 <-- record; #X obj 435 280 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X obj 225 343 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X connect 1 0 25 0; -#X connect 1 0 33 0; -#X connect 2 0 26 0; +#X text 155 64 <-- frequency (Hz.); +#X text 216 128 <-- chunk size (100ths of a second); +#X text 275 169 <-- read point in 100ths of a second; +#X text 601 362 ------ 1 second ------; +#X msg 447 474 \; graph20 ylabel 46000 0 44100; +#X connect 1 0 43 0; +#X connect 1 0 31 0; +#X connect 2 0 24 0; #X connect 3 0 7 0; #X connect 4 0 5 0; #X connect 5 0 19 0; @@ -60,23 +60,23 @@ #X connect 7 0 18 1; #X connect 7 0 19 1; #X connect 7 0 20 0; -#X connect 7 0 27 0; +#X connect 7 0 25 0; #X connect 8 0 9 0; -#X connect 9 0 32 0; +#X connect 9 0 30 0; #X connect 12 0 2 0; #X connect 13 0 18 0; #X connect 14 0 16 0; #X connect 15 0 14 0; #X connect 16 0 13 0; -#X connect 17 0 30 0; -#X connect 17 0 31 0; +#X connect 17 0 28 0; +#X connect 17 0 29 0; #X connect 18 0 17 1; #X connect 19 0 20 1; #X connect 20 0 6 0; -#X connect 27 0 28 0; -#X connect 28 0 29 0; -#X connect 29 0 12 0; -#X connect 31 0 12 1; -#X connect 33 0 23 0; -#X connect 42 0 32 0; -#X connect 43 0 30 0; +#X connect 25 0 26 0; +#X connect 26 0 27 0; +#X connect 27 0 12 0; +#X connect 29 0 12 1; +#X connect 31 0 22 0; +#X connect 37 0 30 0; +#X connect 38 0 28 0; diff --git a/doc/3.audio.examples/B12.sampler.transpose.pd b/doc/3.audio.examples/B12.sampler.transpose.pd index e94aea95..9ce60fd6 100644 --- a/doc/3.audio.examples/B12.sampler.transpose.pd +++ b/doc/3.audio.examples/B12.sampler.transpose.pd @@ -1,4 +1,4 @@ -#N canvas 375 23 836 666 12; +#N canvas 375 38 836 666 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array table21 44103 float 2; @@ -13,7 +13,7 @@ #X obj 81 515 *~; #X obj 143 427 line~; #X obj 143 377 * 441; -#X floatatom 143 352 0 0 0 0 - - - 0; +#X floatatom 143 352 5 0 0 0 - - - 0; #X obj 143 402 pack 0 100; #X obj 81 456 +~; #X obj 143 452 samphold~; @@ -49,18 +49,18 @@ #X text 615 604 updated for Pd version 0.37; #X text 592 430 --- 44103 samples ---; #X obj 29 87 expr pow(2 \, $f1/120); -#X text 218 87 speed change; +#X text 190 86 speed change; #X text 376 189 You might also want to have a way to retrigger the loop to sync it with some other process. By the time we had all this built the patch would be fairly involved. For now \, we'll move on to the next topic...; #X obj 29 190 phasor~; #X obj 364 488 tabwrite~ table21; #X msg 366 560 read ../sound/voice.wav table21; -#X text 101 261 <= chunk size (100ths of a second); -#X text 180 352 <= read point in 100ths of a second; -#X text 71 62 <= transposition (10ths of a halftone); #X text 403 460 <= record; #X obj 635 17 declare -stdpath ./; #X obj 379 461 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X obj 81 543 hip~ 5; +#X text 71 62 <-- transposition (10ths of a halftone); +#X text 95 261 <-- chunk size (100ths of a second); +#X text 184 352 <-- read point in 100ths of a second; #X connect 1 0 50 0; #X connect 2 0 3 0; #X connect 2 0 25 0; @@ -68,7 +68,7 @@ #X connect 4 0 12 0; #X connect 5 0 6 0; #X connect 6 0 49 0; -#X connect 7 0 57 0; +#X connect 7 0 54 0; #X connect 8 0 13 0; #X connect 9 0 11 0; #X connect 10 0 9 0; @@ -96,5 +96,5 @@ #X connect 45 0 30 0; #X connect 48 0 19 0; #X connect 50 0 35 0; -#X connect 56 0 49 0; -#X connect 57 0 40 0; +#X connect 53 0 49 0; +#X connect 54 0 40 0; diff --git a/doc/3.audio.examples/B14.sampler.rockafella.pd b/doc/3.audio.examples/B14.sampler.rockafella.pd index d7f78152..db89a24d 100644 --- a/doc/3.audio.examples/B14.sampler.rockafella.pd +++ b/doc/3.audio.examples/B14.sampler.rockafella.pd @@ -1,4 +1,4 @@ -#N canvas 417 36 884 660 12; +#N canvas 417 38 884 660 12; #X declare -stdpath ./; #X floatatom 63 143 4 0 100 0 - - - 0; #X obj 187 485 *~; @@ -6,12 +6,12 @@ #X obj 61 355 +~; #X obj 61 300 samphold~; #X obj 61 327 *~; -#X obj 550 236 s~ phase; +#X obj 550 240 s~ phase; #X obj 205 330 r~ phase; -#X obj 63 189 s chunk-size; +#X obj 63 196 s chunk-size; #X floatatom 550 27 6 0 0 0 - - - 0; -#X text 157 181 chunk size; -#X text 157 195 in seconds; +#X text 157 187 chunk size; +#X text 157 201 in seconds; #X obj 562 74 r chunk-size; #X obj 562 99 t b f; #X obj 205 378 -~ 0.5; @@ -22,11 +22,11 @@ #X obj 550 180 phasor~; #X obj 395 235 s~ read-pt; #X obj 95 355 r~ read-pt; -#X obj 621 215 +~ 0.5; -#X obj 621 241 wrap~; -#X obj 621 266 s~ phase2; +#X obj 621 219 +~ 0.5; +#X obj 621 245 wrap~; +#X obj 621 270 s~ phase2; #X obj 187 514 +~; -#X obj 63 166 * 0.001; +#X obj 63 169 * 0.001; #X obj 353 184 phasor~; #X obj 61 386 *~ 44100; #X obj 61 441 tabread4~ table23; @@ -63,16 +63,12 @@ #X text 457 99 (msec); #X obj 395 211 *~; #X obj 353 160 /; -#X text 101 143 <= chunk size (msec); -#X text 416 84 <= loop length; -#X text 197 88 precession => (percent), f 13; -#X text 604 28 <= transposition \, halftones/10, f 17; #N canvas 457 259 614 280 table 0; #N canvas 0 0 450 300 (subpatch) 0; #X array table23 44103 float 2; #X coords 0 1.02 44103 -1.02 200 130 1; #X restore 363 64 graph; -#X text 365 198 --- 44103 samples ---; +#X text 386 198 --- 44103 samples ---; #X obj 48 148 loadbang; #X obj 52 37 adc~ 1; #X obj 52 62 hip~ 5; @@ -88,9 +84,14 @@ #X connect 8 0 5 0; #X connect 10 0 7 0; #X restore 748 236 pd table; -#X text 523 347 Here \, rather than ask you to push the read pointer back and forth in the sample \, we use a phasor~. This makes it possible to avoid the samphold~ on the read pointer (r~ read-pt) \, since \, knowing the precession \, we can correct for it in computing the frequency of the original phasor~ above at right., f 46; #X obj 403 599 declare -stdpath ./; #X obj 187 543 hip~ 5; +#X text 416 84 <-- loop length; +#X text 187 88 precession --> (percent), f 14; +#X text 101 143 <-- chunk size (msec); +#X text 523 347 Here \, rather than ask you to push the read pointer back and forth in the sample \, we use a [phasor~]. This makes it possible to avoid the samphold~ on the read pointer ([r~ read-pt]) \, since \, knowing the precession \, we can correct for it in computing the frequency of the original [phasor~] above at right., f 46; +#X text 603 28 <--, f 3; +#X text 630 28 transposition \, halftones/10, f 14; #X connect 0 0 26 0; #X connect 1 0 25 0; #X connect 2 0 36 0; @@ -112,7 +113,7 @@ #X connect 21 0 3 1; #X connect 22 0 23 0; #X connect 23 0 24 0; -#X connect 25 0 70 0; +#X connect 25 0 65 0; #X connect 26 0 8 0; #X connect 27 0 61 0; #X connect 28 0 31 0; @@ -152,4 +153,4 @@ #X connect 59 0 56 0; #X connect 61 0 20 0; #X connect 62 0 27 0; -#X connect 70 0 17 0; +#X connect 65 0 17 0; diff --git a/doc/3.audio.examples/B16.long-varispeed.pd b/doc/3.audio.examples/B16.long-varispeed.pd index e3aff30d..2f24c9d1 100644 --- a/doc/3.audio.examples/B16.long-varispeed.pd +++ b/doc/3.audio.examples/B16.long-varispeed.pd @@ -1,94 +1,91 @@ -#N canvas 346 23 927 723 12; +#N canvas 346 38 960 867 12; #X declare -stdpath ./; -#X obj 505 561 metro 100; -#X obj 238 488 phasor~; -#X obj 505 591 snapshot~; -#X obj 37 653 output~; -#X obj 38 477 phasor~; -#X floatatom 38 345 5 -100 1000 0 - - - 0; -#X obj 37 534 tabread4~ \$0-tab; -#X msg 368 345 0.5; -#X msg 404 345 0.01; -#X obj 505 474 loadbang; -#X msg 505 500 1; -#X obj 418 681 +; -#X obj 238 746 tabread4~ \$0-tab; -#X obj 476 681 f; -#X obj 386 658 t f f; -#X obj 238 782 output~; -#X floatatom 487 715 8 0 0 0 - - - 0; -#X obj 418 716 t f b; -#X obj 450 745 f; -#X obj 418 745 -; -#X floatatom 568 650 8 0 0 0 - - - 0; -#X obj 400 772 -; -#X obj 505 536 tgl 15 0 empty empty empty 17 7 0 10 #fcfcfc #000000 #000000 0 1; -#X obj 238 514 -~ 0.5; -#X obj 400 861 + 0.5; -#X obj 37 506 *~ 1e+06; -#X floatatom 400 802 8 0 0 0 - - - 0; -#X obj 618 570 samplerate~; -#X obj 586 569 /; -#X obj 586 544 t f b; -#X obj 568 624 +; -#X obj 400 833 / 10000; -#X obj 238 539 *~ 10000; -#X obj 586 595 * 10000; -#X obj 571 171 samplerate~; -#X obj 571 195 / 2; -#X obj 560 246 tabwrite~ \$0-tab; -#X obj 571 219 osc~; -#X obj 560 126 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 559 284 table \$0-tab 1e+06; -#X obj 38 449 / 1e+06; -#X text 86 344 playback speed \, samples/sec; -#X text 104 476 naive way: just; -#X text 104 491 run a phasor; -#X text 103 507 into tabread4~; -#X text 549 714 new onset is phase plus old onset; -#X obj 404 373 * 1e+06; -#X text 631 652 extrapolated phase of next sample; -#X text 482 746 new onset minus old onset; -#X text 470 780 back up phasor output by amount the onset advanced; -#X text 468 793 (approximately zero but not exactly because of; -#X text 470 807 truncation error!); -#X obj 404 399 t b f; -#X text 463 373 convert to samples; -#X text 448 400 set both last-onset and previous-onset; -#X text 448 423 ... and also reset phasor.; -#X text 461 834 convert phase back to range 0-1; -#X obj 238 451 / 10000; -#X text 45 425 cycles/sec; -#X text 45 413 convert to; -#X text 296 451 cycles/sec; -#X text 240 427 convert to; -#X text 572 489 in order to change onset to reflect it; -#X text 572 473 Each 100 msec \, poll phase of phasor~; -#X text 44 55 Here is how to use the tabread~ "onset" input to allow clean varispeed playback from a long table. At left \, a phasor~ is naively rescaled to the size of the table. At right \, the phasor~ gets only a 10000-point range about a moving "onset". Ten times per second \, we poll the phasor~ phase \, sum its value into the onset \, and back up the phase of the phasor~ correspondingly., f 64; -#X text 44 149 The tricky bits are \, first \, that we need to poll the phasor~ phase one sample into the future (so we add the per-sample increment into the snapshot~ result). Second \, we can't just reset the phasor~ to a fixed point - instead \, we measure how much the onset has actually increased (which has truncation error from summing in the phase snapshot) \, and subtract that increase from the phase \, giving a value that differs from zero by the truncation error but reflects the true phase we should reset to for continuity., f 64; -#X text 44 280 The metronome rate is arbitrary but should be fast enough that the phasor~ never has time to wrap., f 64; -#X text 67 717 BAD; -#X text 273 844 GOOD; -#X text 81 22 VARIABLE SPEED PLAYBACK FROM LONG TABLES; -#X msg 386 431 0; -#X text 447 344 <= reset phase. 0.5 causes trouble for the "bad" way.; -#X text 634 535 extrapolate snapshot of phase by one sample to sync with next block, f 34; -#X obj 737 17 declare -stdpath ./; -#X msg 669 164 \; pd dsp 1 \, fast-forward 22680; -#X text 539 57 *** The table is now 1 million points and takes about 23 seconds to fill \, we also use the 'fast-forward' message to fill it., f 47; -#X text 665 883 updated for Pd version 0.52; -#X text 110 576 convert phase to range +/- 5000 ->, f 18; +#X obj 505 529 metro 100; +#X obj 238 456 phasor~; +#X obj 505 559 snapshot~; +#X obj 37 621 output~; +#X obj 38 445 phasor~; +#X floatatom 38 313 5 -100 1000 0 - - - 0; +#X obj 37 502 tabread4~ \$0-tab; +#X msg 368 313 0.5; +#X msg 404 313 0.01; +#X obj 505 442 loadbang; +#X msg 505 468 1; +#X obj 418 649 +; +#X obj 238 714 tabread4~ \$0-tab; +#X obj 476 649 f; +#X obj 386 626 t f f; +#X obj 238 750 output~; +#X floatatom 487 683 8 0 0 0 - - - 0; +#X obj 418 684 t f b; +#X obj 450 713 f; +#X obj 418 713 -; +#X floatatom 568 618 8 0 0 0 - - - 0; +#X obj 400 740 -; +#X obj 505 504 tgl 18 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1; +#X obj 238 482 -~ 0.5; +#X obj 400 829 + 0.5; +#X obj 37 474 *~ 1e+06; +#X floatatom 400 770 8 0 0 0 - - - 0; +#X obj 618 538 samplerate~; +#X obj 586 537 /; +#X obj 586 512 t f b; +#X obj 568 592 +; +#X obj 400 801 / 10000; +#X obj 238 507 *~ 10000; +#X obj 586 563 * 10000; +#X obj 571 169 samplerate~; +#X obj 571 193 / 2; +#X obj 560 244 tabwrite~ \$0-tab; +#X obj 571 217 osc~; +#X obj 560 124 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 713 238 table \$0-tab 1e+06; +#X obj 38 417 / 1e+06; +#X text 549 682 new onset is phase plus old onset; +#X obj 404 341 * 1e+06; +#X text 631 620 extrapolated phase of next sample; +#X text 482 714 new onset minus old onset; +#X text 470 748 back up phasor output by amount the onset advanced; +#X text 468 761 (approximately zero but not exactly because of; +#X text 470 775 truncation error!); +#X obj 404 367 t b f; +#X text 463 341 convert to samples; +#X text 448 368 set both last-onset and previous-onset; +#X text 448 391 ... and also reset phasor.; +#X text 465 801 convert phase back to range 0-1, f 17; +#X obj 238 419 / 10000; +#X text 45 393 cycles/sec; +#X text 45 381 convert to; +#X text 296 419 cycles/sec; +#X text 240 395 convert to; +#X text 67 685 BAD; +#X text 273 812 GOOD; +#X text 92 13 VARIABLE SPEED PLAYBACK FROM LONG TABLES; +#X msg 386 399 0; +#X text 634 503 extrapolate snapshot of phase by one sample to sync with next block, f 34; +#X obj 737 15 declare -stdpath ./; +#X msg 669 162 \; pd dsp 1 \, fast-forward 22680; +#X text 539 55 *** The table is now 1 million points and takes about 23 seconds to fill \, we also use the 'fast-forward' message to fill it., f 47; +#X text 711 809 updated for Pd version 0.52; +#X text 24 43 Here is how to use the [tabread~]'s "onset" input to allow clean varispeed playback from a long table. At left \, a [phasor~] is naively rescaled to the size of the table. At right \, the [phasor~] gets only a 10000-point range about a moving "onset". Ten times per second \, we poll the [phasor~]'s phase \, sum its value into the onset \, and back up the phase of the [phasor~] correspondingly., f 69; +#X text 24 133 The tricky bits are \, first \, that we need to poll the [phasor~]'s phase one sample into the future (so we add the per-sample increment into the [snapshot~] result). Second \, we can't just reset the [phasor~] to a fixed point - instead \, we measure how much the onset has actually increased (which has truncation error from summing in the phase snapshot) \, and subtract that increase from the phase \, giving a value that differs from zero by the truncation error but reflects the true phase we should reset to for continuity., f 69; +#X text 24 252 The metronome rate is arbitrary but should be fast enough that the [phasor~] never has time to wrap., f 69; +#X text 447 312 <-- reset phase. 0.5 causes trouble for the "bad" way.; +#X text 86 312 <-- playback speed \, samples/sec; +#X text 578 449 Each 100 msec \, poll phase of [phasor~] in order to change onset to reflect it, f 38; +#X text 104 444 naive way: just run a phasor into [tabread4~], f 16; +#X text 105 544 convert phase to range +/- 5000 -->, f 18; #X connect 0 0 2 0; #X connect 1 0 23 0; #X connect 2 0 30 0; #X connect 4 0 25 0; #X connect 5 0 40 0; -#X connect 5 0 57 0; +#X connect 5 0 53 0; #X connect 6 0 3 0; #X connect 7 0 4 1; -#X connect 7 0 46 0; +#X connect 7 0 42 0; #X connect 8 0 4 1; -#X connect 8 0 46 0; +#X connect 8 0 42 0; #X connect 9 0 10 0; #X connect 10 0 22 0; #X connect 11 0 13 0; @@ -125,12 +122,12 @@ #X connect 37 0 36 0; #X connect 38 0 34 0; #X connect 38 0 36 0; -#X connect 38 0 74 0; +#X connect 38 0 64 0; #X connect 40 0 4 0; -#X connect 46 0 52 0; -#X connect 52 0 70 0; -#X connect 52 1 18 1; -#X connect 52 1 11 1; -#X connect 57 0 1 0; -#X connect 57 0 29 0; -#X connect 70 0 14 0; +#X connect 42 0 48 0; +#X connect 48 0 61 0; +#X connect 48 1 18 1; +#X connect 48 1 11 1; +#X connect 53 0 1 0; +#X connect 53 0 29 0; +#X connect 61 0 14 0; diff --git a/doc/3.audio.examples/C01.nyquist.pd b/doc/3.audio.examples/C01.nyquist.pd index 42f8331f..3a04361e 100644 --- a/doc/3.audio.examples/C01.nyquist.pd +++ b/doc/3.audio.examples/C01.nyquist.pd @@ -3,22 +3,22 @@ #N canvas 0 0 450 300 (subpatch) 0; #X array table24 259 float 0; #X coords 0 1.02 258 -1.02 258 130 1 0 0; -#X restore 192 399 graph; -#X obj 60 311 line~; -#X msg 60 260 500 \, 1423 4000; -#X floatatom 68 285 5 0 0 0 - - - 0; -#X text 50 553 Synthesis techniques vary in their tendency to make foldover. For higher pitched sounds you'll want to try out relatively foldover-resistant ones.; -#X obj 60 378 output~; +#X restore 213 398 graph; +#X obj 60 317 line~; +#X msg 60 258 500 \, 1423 4000; +#X floatatom 71 285 5 0 0 0 - - - 0; +#X text 50 553 Synthesis techniques vary in their tendency to make foldover. For higher pitched sounds you'll want to try out relatively foldover-resistant ones., f 61; +#X obj 60 390 output~; #X obj 325 248 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #N canvas 739 154 597 347 make-tab 0; #X obj 40 29 inlet; #X obj 126 29 inlet; -#X obj 210 29 inlet; -#X obj 282 30 inlet; +#X obj 230 29 inlet; +#X obj 321 30 inlet; #X msg 126 151 \; table24 sinesum 256 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 \, normalize 0.4; #X msg 41 228 \; table24 sinesum 256 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 \, normalize 0.2; -#X msg 210 106 \; table24 const 0 \, 0 1 1 1 1 1; -#X msg 282 59 \; table24 const 0; +#X msg 230 106 \; table24 const 0 \, 0 1 1 1 1 1; +#X msg 321 63 \; table24 const 0; #X obj 140 114 loadbang; #X connect 0 0 5 0; #X connect 1 0 4 0; @@ -30,7 +30,7 @@ #X text 372 271 complex; #X text 394 303 rectangle; #X text 421 330 clear; -#X obj 60 338 tabosc4~ table24; +#X obj 60 350 tabosc4~ table24; #X text 101 17 THE NYQUIST THEOREM AND FOLDOVER; #X text 47 52 WARNING: PLAY THIS QUIETLY TO AVOID UNPLEASANTNESS AND POSSIBLE EAR DAMAGE., f 39; #X text 46 99 Foldover occurs when you synthesize frequencies greater than the Nyquist frequency (half the sample rate). In this example \, the fundamental only reaches 1423 \, but the tables contain high partials. As the partials sweep upward you hear them reflect off the Nyquist frequency. Also \, partials can come into contact with each other causing beating. The value of 1423 was chosen to make the beating effect especially strong if you're running at a sample rate of 44100 (the usual one.); @@ -39,7 +39,7 @@ #X obj 349 272 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 374 302 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 399 330 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 221 285 waveforms -->; +#X text 226 288 waveforms -->; #X connect 1 0 12 0; #X connect 2 0 1 0; #X connect 3 0 1 0; diff --git a/doc/3.audio.examples/C02.sawtooth-foldover.pd b/doc/3.audio.examples/C02.sawtooth-foldover.pd index d39977f0..1d9c113a 100644 --- a/doc/3.audio.examples/C02.sawtooth-foldover.pd +++ b/doc/3.audio.examples/C02.sawtooth-foldover.pd @@ -1,19 +1,17 @@ -#N canvas 516 98 518 561 12; +#N canvas 516 98 520 604 12; #X declare -stdpath ./; -#X obj 136 385 output~; -#X text 273 523 updated for Pd version 0.37; +#X obj 136 395 output~; +#X text 273 533 updated for Pd version 0.37; #X text 77 17 FOLDOVER IN SAWTOOTH WAVES; -#X obj 136 348 clip~ 0 1; +#X obj 136 358 clip~ 0 1; #X obj 136 168 mtof; #X floatatom 136 146 5 0 0 0 - - - 0; -#X obj 136 294 *~ 20; -#X obj 136 320 -~ 19; +#X obj 136 304 *~ 20; +#X obj 136 330 -~ 19; #X obj 136 192 phasor~; -#X obj 146 224 output~; -#X text 65 467 We'll explain more about making pulses later on... this example is mostly intended as ear training., f 50; +#X obj 150 228 output~; +#X text 65 477 We'll explain more about making pulses later on... this example is mostly intended as ear training., f 50; #X text 37 44 In more ordinary kinds of waveforms \, foldover comes across as a "cheap synth" sound. You can hear the foldover clearly in the pulse train here \, and less clearly (but still audibly) in the straight sawtooth \, especially at high pitches., f 63; -#X text 259 404 <= pulse train amplitude; -#X text 267 244 <= sawtooth amplitude; #N canvas 698 337 212 167 set 0; #X obj 45 74 loadbang; #X msg 45 99 61; @@ -22,8 +20,10 @@ #X connect 0 0 1 0; #X connect 1 0 2 0; #X restore 136 120 pd set; -#X text 179 145 <= pitch; #X obj 341 151 declare -stdpath ./; +#X text 271 248 <-- sawtooth amplitude; +#X text 259 414 <-- pulse train amplitude; +#X text 179 145 <-- pitch; #X connect 3 0 0 0; #X connect 4 0 8 0; #X connect 5 0 4 0; @@ -31,4 +31,4 @@ #X connect 7 0 3 0; #X connect 8 0 6 0; #X connect 8 0 9 0; -#X connect 14 0 5 0; +#X connect 12 0 5 0; diff --git a/doc/3.audio.examples/C03.zipper.noise.pd b/doc/3.audio.examples/C03.zipper.noise.pd index 24297edb..b2766b91 100644 --- a/doc/3.audio.examples/C03.zipper.noise.pd +++ b/doc/3.audio.examples/C03.zipper.noise.pd @@ -8,14 +8,14 @@ #X obj 299 339 *~; #X obj 183 279 line; #X obj 317 279 line~; -#N canvas 870 186 268 250 metro 0; +#N canvas 870 186 268 250 metro 1; #X obj 86 35 loadbang; #X msg 86 65 1; #X obj 86 96 metro 500; -#X obj 86 125 tgl 15 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000 0 1; +#X obj 86 125 tgl 15 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X obj 86 190 outlet; -#X obj 150 192 outlet; -#X obj 86 154 select 0 1; +#X obj 144 192 outlet; +#X obj 86 154 select 0 1, f 17; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 2 0 3 0; @@ -26,21 +26,21 @@ #X msg 183 236 1 300; #X msg 317 238 0 300; #X obj 232 292 osc~ 880; -#X text 29 42 Here is a related issue: if we use a (control) line object to change an amplitude \, it sends ramping control messages \, once every 20 msec by default. At left we use this to control the amplitude of a sinusoid. In effect we're multiplying the sinusoid by a staircase signal (50 increments per second.) Using the signal version \, line~ \, fixes the problem. Line~ outputs a ramp that is incremented every sample.; #X obj 309 12 declare -stdpath ./; #X obj 183 205 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 317 206 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 25 44 Here is a related issue: if we use a (control) [line] object to change an amplitude \, it sends ramping control messages \, once every 20 msec by default. At left we use this to control the amplitude of a sinusoid. In effect we're multiplying the sinusoid by a staircase signal (50 increments per second.) Using the signal version \, [line~] \, fixes the problem \, since [line~] outputs a ramp that is incremented every sample., f 61; #X connect 3 0 0 0; #X connect 5 0 4 0; #X connect 6 0 3 1; #X connect 7 0 5 1; -#X connect 8 0 14 0; -#X connect 8 1 15 0; +#X connect 8 0 13 0; +#X connect 8 1 14 0; #X connect 9 0 6 0; #X connect 9 0 7 0; #X connect 10 0 6 0; #X connect 10 0 7 0; #X connect 11 0 3 0; #X connect 11 0 5 0; -#X connect 14 0 9 0; -#X connect 15 0 10 0; +#X connect 13 0 9 0; +#X connect 14 0 10 0; diff --git a/doc/3.audio.examples/C04.control.to.signal.pd b/doc/3.audio.examples/C04.control.to.signal.pd index 9cad16d3..97ed6d27 100644 --- a/doc/3.audio.examples/C04.control.to.signal.pd +++ b/doc/3.audio.examples/C04.control.to.signal.pd @@ -1,8 +1,8 @@ -#N canvas 544 30 544 580 12; +#N canvas 544 38 544 580 12; #X declare -stdpath ./; #X text 47 16 CONVERTING CONTROL TO SIGNALS; -#X obj 244 379 output~; -#X obj 362 379 output~; +#X obj 214 387 output~; +#X obj 332 387 output~; #N canvas 799 288 303 263 metro 0; #X obj 88 38 loadbang; #X msg 88 65 1; @@ -17,22 +17,22 @@ #X connect 3 0 4 0; #X connect 3 1 5 0; #X connect 6 0 2 0; -#X restore 244 258 pd metro; -#X obj 244 334 line~; -#X obj 362 334 vline~; -#X text 46 129 Here we try out line~ and vline~ as triangle wave generators. The subpatch is still sending alternating bangs as in the last patch \, but now at an audible frequency \, every 2 msec.; -#X text 47 195 The effect of line~ rounding breakpoints to the nearest block (on the order of a millisecond) is that each 4-millisecond-long cycle has a different shape. Using vline~ resolves the problem.; -#X text 66 472 Sometimes you will want to use vline~ in place of sig~ for the same reason.; -#X text 46 49 For controlling amplitudes \, line~ \, with its block-aligned breakpoints \, is accurate enough for most purposes. But certain usages \, such as this patch \, demand more accuracy. The vline~ object \, somewhat more expensive than line~ \, can handle breakpoints to sub-sample accuracy., f 60; -#X msg 244 297 1 2.1; -#X msg 362 297 0 2.1; +#X restore 214 266 pd metro; +#X obj 214 342 line~; +#X obj 332 342 vline~; +#X msg 214 305 1 2.1; +#X msg 332 305 0 2.1; #X obj 379 19 declare -stdpath ./; #X text 307 523 Updated for Pd version 0.37; -#X connect 3 0 10 0; -#X connect 3 1 11 0; +#X text 46 49 For controlling amplitudes \, [line~] \, with its block-aligned breakpoints \, is accurate enough for most purposes. But certain usages \, such as this patch \, demand more accuracy. The [vline~] object \, somewhat more expensive than [line~] \, can handle breakpoints to sub-sample accuracy., f 60; +#X text 46 129 Here we try out [line~] and [vline~] as triangle wave generators. The subpatch is still sending alternating bangs as in the last patch \, but now at an audible frequency \, every 2 msec.; +#X text 47 195 The effect of [line~] rounding breakpoints to the nearest block (on the order of a millisecond) is that each 4-ms-long cycle has a different shape. Using [vline~] resolves the problem.; +#X text 62 486 Sometimes you will want to use [vline~] in place of [sig~] for the same reason., f 52; +#X connect 3 0 6 0; +#X connect 3 1 7 0; #X connect 4 0 1 0; #X connect 5 0 2 0; -#X connect 10 0 4 0; -#X connect 10 0 5 0; -#X connect 11 0 4 0; -#X connect 11 0 5 0; +#X connect 6 0 4 0; +#X connect 6 0 5 0; +#X connect 7 0 4 0; +#X connect 7 0 5 0; diff --git a/doc/3.audio.examples/C05.sampler.oneshot.pd b/doc/3.audio.examples/C05.sampler.oneshot.pd index 14ab3892..6c3e09b6 100644 --- a/doc/3.audio.examples/C05.sampler.oneshot.pd +++ b/doc/3.audio.examples/C05.sampler.oneshot.pd @@ -1,41 +1,37 @@ -#N canvas 338 23 919 681 12; +#N canvas 338 38 914 661 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array tab28 176403 float 2; #X coords 0 1.02 176403 -1.02 200 130 1; -#X restore 594 296 graph; -#X obj 542 479 loadbang; +#X restore 599 287 graph; +#X obj 547 470 loadbang; #X obj 405 210 hip~ 5; #X obj 583 98 adc~ 1; #X obj 583 128 hip~ 5; -#X text 642 485 v-- re-read the original sample; +#X text 647 476 v-- re-read the original sample; #X text 78 31 ONE-SHOT SAMPLER USING LINE~ AS PHASE; #X obj 405 176 *~; #X obj 445 149 r cutoff; #X obj 405 59 r phase; #X obj 149 143 delay 5; #X msg 49 179 \; cutoff 0 5; -#X text 58 393 To start a note \, first we have to mute the output in case there's already something playing---otherwise we'll get a click. The "cutoff" line~ then takes 5 msec to get to zero. After that amount of delay \, we reset the phase to sample number 1 and set it in motion. We want the line~ output to increase by 1 each sample of output \, so we ask for it to do 4.41e+08 samples in 1e+07 milliseconds.; -#X text 58 509 The cutoff mechanism is still safe if we happen to ask for two notes in under 5 msec. The second request would reset the delay \, so that there's no way the delay can possibly fire without the cutoff line~ at zero.; #X obj 662 178 line~; #X obj 583 173 *~; -#X text 605 437 ------ 4 seconds ------; +#X text 618 428 ------ 4 seconds ------; #X obj 722 98 del 3990; #X msg 722 126 0 10; -#X text 59 579 We avoid clicking at the end of the table by getting the table's own contents to go smoothly to zero. To do this we added a level control to the recording patch that cuts off just before the recording reaches the end of the table.; -#X obj 542 538 soundfiler; -#X text 58 352 Here's how to make a sampler with a line~ object \, instead of a phasor~ \, to generate the read location signal., f 59; +#X text 58 568 We avoid clicking at the end of the table by getting the table's own contents to go smoothly to zero. To do this we added a level control to the recording patch that cuts off just before the recording reaches the end of the table., f 59; +#X obj 547 529 soundfiler; #X obj 445 176 vline~; #X obj 405 250 output~; #X obj 405 89 vline~; #X obj 651 218 tabwrite~ tab28; -#X msg 542 509 read ../sound/bell.aiff tab28; +#X msg 547 500 read ../sound/bell.aiff tab28; #X obj 405 119 tabread4~ tab28; #X msg 149 178 \; phase 1 \, 4.41e+08 1e+07 \; cutoff 1; #X msg 662 116 0 \, 1 5; -#X text 661 617 updated for Pd version 0.37; -#X text 646 541 My apologies to Jonathan Harvey whose bell this is., f 26; -#X text 761 127 <= stop recording, f 9; +#X text 670 595 updated for Pd version 0.37; +#X text 651 532 My apologies to Jonathan Harvey whose bell this is., f 26; #X text 132 236 set the upper line~ to start at the first sample and go forever (until the next trigger), f 31; #X text 54 140 cut the sound off, f 9; #X text 208 135 Wait for the cutoff to finish, f 16; @@ -44,25 +40,29 @@ #X text 675 57 <-- record; #X obj 49 88 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 651 58 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X connect 1 0 26 0; -#X connect 2 0 23 0; +#X text 761 126 <-- stop recording, f 9; +#X text 58 352 Here's how to make a sampler with a [line~] object \, instead of a [phasor~] \, to generate the read location signal.; +#X text 58 393 To start a note \, first we have to mute the output in case there's already something playing---otherwise we'll get a click. The "cutoff" [line~] then takes 5 msec to get to zero. After that amount of delay \, we reset the phase to sample number 1 and set it in motion. We want the [line~] output to increase by 1 each sample of output \, so we ask for it to do 4.41e+08 samples in 1e+07 milliseconds., f 59; +#X text 58 501 The cutoff mechanism is still safe if we happen to ask for two notes in under 5 msec. The second request would reset the delay \, so that there's no way the delay can possibly fire without the cutoff [line~] at zero., f 59; +#X connect 1 0 23 0; +#X connect 2 0 20 0; #X connect 3 0 4 0; -#X connect 4 0 15 0; +#X connect 4 0 13 0; #X connect 7 0 2 0; -#X connect 8 0 22 0; -#X connect 9 0 24 0; -#X connect 10 0 28 0; -#X connect 14 0 15 1; -#X connect 15 0 25 0; -#X connect 17 0 18 0; -#X connect 18 0 14 0; -#X connect 22 0 7 1; -#X connect 24 0 27 0; -#X connect 26 0 20 0; -#X connect 27 0 7 0; -#X connect 29 0 14 0; -#X connect 39 0 11 0; -#X connect 39 0 10 0; -#X connect 40 0 17 0; -#X connect 40 0 29 0; -#X connect 40 0 25 0; +#X connect 8 0 19 0; +#X connect 9 0 21 0; +#X connect 10 0 25 0; +#X connect 12 0 13 1; +#X connect 13 0 22 0; +#X connect 15 0 16 0; +#X connect 16 0 12 0; +#X connect 19 0 7 1; +#X connect 21 0 24 0; +#X connect 23 0 18 0; +#X connect 24 0 7 0; +#X connect 26 0 12 0; +#X connect 35 0 11 0; +#X connect 35 0 10 0; +#X connect 36 0 15 0; +#X connect 36 0 26 0; +#X connect 36 0 22 0; diff --git a/doc/3.audio.examples/C07.envelope.follower.pd b/doc/3.audio.examples/C07.envelope.follower.pd index 9f665dda..e890b930 100644 --- a/doc/3.audio.examples/C07.envelope.follower.pd +++ b/doc/3.audio.examples/C07.envelope.follower.pd @@ -1,7 +1,6 @@ -#N canvas 236 23 1039 698 12; +#N canvas 236 38 1039 698 12; #X text 86 41 ENVELOPE FOLLOWERS; -#X text 68 224 The env~ object reports the RMS signal level over the last 256 samples (by default) or any other power of 2 that's at least twice the block size. The analysis is done in an overlapped fashion so that results appear every N/2 points if N is the analysis window size. So the larger the window \, the stabler the result and the less frequently it appears. Computation time doesn't depend heavily on N., f 54; -#X text 67 349 Envelope followers are frequently used to detect attacks and periods of silence. (There are fancier attack detectors out there \, though.) Here is a simple threshold-based attack and rest detector., f 54; +#X text 48 332 Envelope followers are frequently used to detect attacks and periods of silence. (There are fancier attack detectors out there \, though.) Here is a simple threshold-based attack and rest detector., f 59; #X obj 587 58 dbtorms; #X obj 511 45 osc~ 440; #X obj 511 101 env~; @@ -35,7 +34,6 @@ #X text 699 228 route the RMS value according to state; #X text 672 127 ATTACK DETECTION; #X text 579 350 REST DETECTION; -#X text 67 420 Both detectors are state machines with two states \, on and off. If on \, a test is run to determine whether to turn off \, and vice versa. The tests are run at each output of the rms~ object., f 54; #X text 95 569 updated for Pd version 0.37; #X obj 511 78 *~; #X text 385 111 note 3.01 dB difference between peak and RMS amplitudes., f 16; @@ -51,43 +49,45 @@ #X obj 156 109 ../5.reference/set-dsp-tgl; #X text 187 112 DSP on/off; #X msg 156 146 \; pd dsp \$1; -#X connect 3 0 38 1; -#X connect 4 0 38 0; -#X connect 5 0 6 0; -#X connect 5 0 8 0; -#X connect 6 0 19 0; -#X connect 7 0 3 0; -#X connect 8 0 9 0; -#X connect 8 1 47 1; -#X connect 9 0 18 0; -#X connect 10 0 11 0; -#X connect 10 1 12 0; +#X text 49 221 The [env~] object reports the RMS signal level over the last 512 samples (by default) or any other power of 2 that's at least twice the block size. The analysis is done in an overlapped fashion so that results appear every N/2 points if N is the analysis window size. So the larger the window \, the stabler the result and the less frequently it appears. Computation time doesn't depend heavily on N., f 59; +#X text 48 408 Both detectors are state machines with two states \, "on" and "off". If on \, a test is run to determine whether to turn off \, and vice versa. The tests are run at each output of the [env~] object., f 56; +#X connect 2 0 36 1; +#X connect 3 0 36 0; +#X connect 4 0 5 0; +#X connect 4 0 7 0; +#X connect 5 0 18 0; +#X connect 6 0 2 0; +#X connect 7 0 8 0; +#X connect 7 1 45 1; +#X connect 8 0 17 0; +#X connect 9 0 10 0; +#X connect 9 1 11 0; +#X connect 10 0 12 0; #X connect 11 0 13 0; #X connect 12 0 14 0; +#X connect 12 0 16 0; #X connect 13 0 15 0; -#X connect 13 0 17 0; -#X connect 14 0 16 0; -#X connect 15 0 9 0; -#X connect 16 0 9 0; -#X connect 18 0 47 0; -#X connect 19 0 20 0; -#X connect 19 1 26 0; -#X connect 20 0 25 0; -#X connect 21 0 22 0; -#X connect 21 1 29 0; -#X connect 22 0 27 1; -#X connect 23 0 20 0; -#X connect 24 0 20 0; -#X connect 25 0 48 0; -#X connect 26 0 28 0; -#X connect 26 0 48 1; -#X connect 27 0 32 0; -#X connect 28 0 27 0; -#X connect 29 0 24 0; -#X connect 30 0 23 0; -#X connect 30 0 31 0; -#X connect 32 0 30 0; -#X connect 38 0 5 0; -#X connect 47 0 10 0; -#X connect 48 0 21 0; -#X connect 49 0 51 0; +#X connect 14 0 8 0; +#X connect 15 0 8 0; +#X connect 17 0 45 0; +#X connect 18 0 19 0; +#X connect 18 1 25 0; +#X connect 19 0 24 0; +#X connect 20 0 21 0; +#X connect 20 1 28 0; +#X connect 21 0 26 1; +#X connect 22 0 19 0; +#X connect 23 0 19 0; +#X connect 24 0 46 0; +#X connect 25 0 27 0; +#X connect 25 0 46 1; +#X connect 26 0 31 0; +#X connect 27 0 26 0; +#X connect 28 0 23 0; +#X connect 29 0 22 0; +#X connect 29 0 30 0; +#X connect 31 0 29 0; +#X connect 36 0 4 0; +#X connect 45 0 9 0; +#X connect 46 0 20 0; +#X connect 47 0 49 0; diff --git a/doc/3.audio.examples/C08.analog.sequencer.pd b/doc/3.audio.examples/C08.analog.sequencer.pd index 821808d8..3d5066ad 100644 --- a/doc/3.audio.examples/C08.analog.sequencer.pd +++ b/doc/3.audio.examples/C08.analog.sequencer.pd @@ -1,12 +1,12 @@ -#N canvas 498 39 812 654 12; +#N canvas 498 39 807 659 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array 29-sequence 9 float 3; -#A 0 110 550 385 495 165 385 495 275 615; +#A 0 55 550 385 495 165 385 495 275 615; #X coords 0 650 9 0 200 100 1 0 0; #X restore 533 77 graph; -#X obj 95 493 *~; -#X obj 95 521 hip~ 5; +#X obj 95 496 *~; +#X obj 95 524 hip~ 5; #N canvas 0 0 450 300 (subpatch) 0; #X array 29-envelope 103 float 1; #A 0 -0.0199988 1.0673e-06 0.0500008 0.13 0.16 0.28 0.5 0.6 0.7 0.8 1.01111 1 0.988889 0.977778 0.966667 0.955556 0.944444 0.933333 0.922222 0.911111 0.9 0.888889 0.797778 0.737777 0.677777 0.647777 0.617777 0.557777 0.487777 0.467777 0.447776 0.417776 0.397776 0.387776 0.377776 0.367776 0.347776 0.327776 0.317776 0.297776 0.277776 0.267776 0.257776 0.257776 0.277776 0.297776 0.327776 0.357776 0.377776 0.397776 0.407776 0.427776 0.437776 0.387776 0.367776 0.347776 0.337776 0.287776 0.277776 0.277776 0.277776 0.267776 0.267776 0.267776 0.297776 0.317776 0.347776 0.367776 0.367776 0.357776 0.347776 0.337776 0.307776 0.287776 0.257776 0.227776 0.197776 0.167776 0.167776 0.167776 0.167776 0.167776 0.157776 0.157776 0.157776 0.157776 0.147776 0.147776 0.147776 0.137776 0.137776 0.111111 0.1 0.0888889 0.0777778 0.0666667 0.0555556 0.0444444 0.0333333 0.0222222 0.0111111 0 -0.0111111; @@ -14,7 +14,7 @@ #X restore 533 197 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array 29-sample 259 float 1; -#A 0 0.989177 1 0.989177 0.95694 0.903989 0.83147 0.740952 0.634394 0.514103 0.382684 0.242981 0.0980184 -0.0490663 -0.195089 -0.336888 -0.471395 -0.595698 -0.707105 -0.803206 -0.88192 -0.941543 -0.980785 -0.998795 -0.995185 -0.970032 -0.923881 -0.85773 -0.773013 -0.671561 -0.555573 -0.427558 -0.290288 -0.146734 -3.98038e-06 0.146726 0.290281 0.427551 0.555566 0.671556 0.773007 0.857726 0.923878 0.97003 0.995184 0.998796 0.980786 0.941546 0.881924 0.803211 0.707111 0.595704 0.471402 0.336896 0.195097 0.0490743 -0.0980105 -0.242974 -0.382677 -0.514097 -0.634388 -0.740946 -0.831465 -0.903986 -0.956938 -0.989175 -1 -0.989178 -0.956943 -0.903993 -0.831474 -0.740957 -0.6344 -0.51411 -0.382692 -0.242989 -0.0980263 0.0490584 0.195081 0.336881 0.471388 0.595691 0.7071 0.803202 0.881916 0.941541 0.980783 0.998795 0.995186 0.970034 0.923884 0.857734 0.773018 0.671567 0.55558 0.427566 0.290296 0.146742 1.19412e-05 -0.146719 -0.290273 -0.427544 -0.55556 -0.67155 -0.773002 -0.857722 -0.923875 -0.970028 -0.995183 -0.998796 -0.980788 -0.941549 -0.881928 -0.803216 -0.707117 -0.595711 -0.471409 -0.336903 -0.195104 -0.0490822 0.0980025 0.242966 0.38267 0.51409 0.634382 0.740941 0.831461 0.903983 0.956936 0.989174 1 0.989179 0.956945 0.903996 0.831479 0.740962 0.634406 0.514117 0.382699 0.242997 0.0980342 -0.0490504 -0.195073 -0.336873 -0.471381 -0.595685 -0.707094 -0.803197 -0.881913 -0.941538 -0.980782 -0.998795 -0.995187 -0.970036 -0.923887 -0.857738 -0.773023 -0.671573 -0.555586 -0.427573 -0.290303 -0.14675 -1.99019e-05 0.146711 0.290265 0.427537 0.555553 0.671544 0.772997 0.857718 0.923872 0.970026 0.995183 0.998797 0.980789 0.941551 0.881931 0.803221 0.707122 0.595717 0.471416 0.336911 0.195112 0.0490902 -0.0979946 -0.242958 -0.382662 -0.514083 -0.634375 -0.740936 -0.831457 -0.903979 -0.956933 -0.989173 -1 -0.98918 -0.956947 -0.904 -0.831483 -0.740968 -0.634412 -0.514124 -0.382706 -0.243004 -0.0980421 0.0490425 0.195065 0.336866 0.471374 0.595679 0.707088 0.803192 0.881909 0.941535 0.98078 0.998794 0.995187 0.970038 0.92389 0.857742 0.773028 0.671579 0.555593 0.42758 0.290311 0.146758 2.78627e-05 -0.146703 -0.290258 -0.42753 -0.555547 -0.671538 -0.772992 -0.857714 -0.923868 -0.970024 -0.995182 -0.998797 -0.980791 -0.941554 -0.881935 -0.803225 -0.707128 -0.595723 -0.471423 -0.336918 -0.19512 -0.0490981 0.0979867 0.24295 0.382655 0.514076 0.634369 0.74093 0.831452 0.903976 0.956931 0.989172 1 0.989181; +#A 0 1 0.989177 0.95694 0.903989 0.83147 0.740951 0.634393 0.514103 0.382683 0.24298 0.0980171 -0.0490677 -0.19509 -0.33689 -0.471397 -0.595699 -0.707107 -0.803208 -0.881921 -0.941544 -0.980785 -0.998795 -0.995185 -0.970031 -0.92388 -0.857729 -0.77301 -0.671559 -0.55557 -0.427555 -0.290285 -0.14673 -1.83697e-16 0.14673 0.290285 0.427555 0.55557 0.671559 0.77301 0.857729 0.92388 0.970031 0.995185 0.998795 0.980785 0.941544 0.881921 0.803208 0.707107 0.595699 0.471397 0.33689 0.19509 0.0490677 -0.0980171 -0.24298 -0.382683 -0.514103 -0.634393 -0.740951 -0.83147 -0.903989 -0.95694 -0.989177 -1 -0.989177 -0.95694 -0.903989 -0.83147 -0.740951 -0.634393 -0.514103 -0.382683 -0.24298 -0.0980171 0.0490677 0.19509 0.33689 0.471397 0.595699 0.707107 0.803208 0.881921 0.941544 0.980785 0.998795 0.995185 0.970031 0.92388 0.857729 0.77301 0.671559 0.55557 0.427555 0.290285 0.14673 5.51091e-16 -0.14673 -0.290285 -0.427555 -0.55557 -0.671559 -0.77301 -0.857729 -0.92388 -0.970031 -0.995185 -0.998795 -0.980785 -0.941544 -0.881921 -0.803208 -0.707107 -0.595699 -0.471397 -0.33689 -0.19509 -0.0490677 0.0980171 0.24298 0.382683 0.514103 0.634393 0.740951 0.83147 0.903989 0.95694 0.989177 1 0.989177 0.95694 0.903989 0.83147 0.740951 0.634393 0.514103 0.382683 0.24298 0.0980171 -0.0490677 -0.19509 -0.33689 -0.471397 -0.595699 -0.707107 -0.803208 -0.881921 -0.941544 -0.980785 -0.998795 -0.995185 -0.970031 -0.92388 -0.857729 -0.77301 -0.671559 -0.55557 -0.427555 -0.290285 -0.14673 -2.69484e-15 0.14673 0.290285 0.427555 0.55557 0.671559 0.77301 0.857729 0.92388 0.970031 0.995185 0.998795 0.980785 0.941544 0.881921 0.803208 0.707107 0.595699 0.471397 0.33689 0.19509 0.0490677 -0.0980171 -0.24298 -0.382683 -0.514103 -0.634393 -0.740951 -0.83147 -0.903989 -0.95694 -0.989177 -1 -0.989177 -0.95694 -0.903989 -0.83147 -0.740951 -0.634393 -0.514103 -0.382683 -0.24298 -0.0980171 0.0490677 0.19509 0.33689 0.471397 0.595699 0.707107 0.803208 0.881921 0.941544 0.980785 0.998795 0.995185 0.970031 0.92388 0.857729 0.77301 0.671559 0.55557 0.427555 0.290285 0.14673 -4.90478e-16 -0.14673 -0.290285 -0.427555 -0.55557 -0.671559 -0.77301 -0.857729 -0.92388 -0.970031 -0.995185 -0.998795 -0.980785 -0.941544 -0.881921 -0.803208 -0.707107 -0.595699 -0.471397 -0.33689 -0.19509 -0.0490677 0.0980171 0.24298 0.382683 0.514103 0.634393 0.740951 0.83147 0.903989 0.95694 0.989177 1 0.989177 0.95694; #X coords 0 1 258 -1 200 100 1; #X restore 533 316 graph; #X text 542 566 updated for Pd version 0.37; @@ -24,16 +24,16 @@ #X obj 131 336 +~ 1; #X obj 72 289 phasor~; #X obj 72 320 -~ 0.5; -#X obj 72 411 cos~; +#X obj 72 414 cos~; #X obj 113 387 *~; -#X obj 95 561 output~; -#X obj 113 463 tabread4~ 29-sample; +#X obj 95 564 output~; +#X obj 113 466 tabread4~ 29-sample; #X obj 131 360 tabread4~ 29-envelope; -#X obj 113 411 *~ 128; -#X obj 113 435 +~ 129; -#X obj 72 435 +~ 1; +#X obj 113 414 *~ 128; +#X obj 113 438 +~ 129; +#X obj 72 438 +~ 1; #X obj 131 226 *~ 9; -#N canvas 736 149 533 565 make-tables 0; +#N canvas 875 258 533 565 make-tables 0; #X obj 162 106 t b b; #X obj 205 163 f; #X obj 243 163 + 1; @@ -71,13 +71,13 @@ #X text 172 226 main loop: sawtooth of amplitude 9; #X text 221 258 read frequency sequence; #X text 187 288 9x original frequency sawtooth; -#X text 149 387 multiply envelope by audio-frequency sawtooth; -#X text 169 420 adjust amplitude and center for wavetable; -#X text 128 493 multiply by raised-cosine smoothing function; +#X text 144 387 multiply envelope by audio-frequency sawtooth; +#X text 170 425 adjust amplitude and center for wavetable; +#X text 128 496 multiply by raised-cosine smoothing function; #X text 549 451 how to make the tables:; #X obj 624 19 declare -stdpath ./; #X text 187 312 adjust for reading envelope sample; -#X text 49 41 Some control operations can be carried out entirely by tilde objects passing audio signals around. Here is an imitation of an analog sequencer and envelope generator. A [phasor~] loops through the "sequence" table at 0.6 Hz \, generating 9 frequencies. Simultaneously \, by multiplying by 9 and wrapping \, we create a sawtooth at 9*0.6=5.4 Hz \, which reads a second table for an envelope shape. This becomes the grain size for a sampler based on the 18.sampler.looped example earlier., f 57; +#X text 49 41 Some control operations can be carried out entirely by tilde objects passing audio signals around. Here is an imitation of an analog sequencer and envelope generator. A [phasor~] loops through the "sequence" table at 0.6 Hz \, generating 9 frequencies. Simultaneously \, by multiplying by 9 and wrapping \, we create a sawtooth at 9 * 0.6 = 5.4 Hz \, which reads a second table for an envelope shape. This becomes the grain size for a sampler based on the B08.sampler.loop example earlier., f 57; #X connect 1 0 2 0; #X connect 2 0 14 0; #X connect 6 0 10 0; diff --git a/doc/3.audio.examples/C09.sample.hold.pd b/doc/3.audio.examples/C09.sample.hold.pd index ac3638a0..35ba6f70 100644 --- a/doc/3.audio.examples/C09.sample.hold.pd +++ b/doc/3.audio.examples/C09.sample.hold.pd @@ -21,7 +21,6 @@ #X msg 103 173 2 11; #X msg 179 173 3.7 8.8; #X msg 244 173 3.4 8.9; -#X text 35 57 Another analog favorite \, the sample and hold unit freezes an audio signal on command. In the Pd version \, the second input of samphold~ triggers it \, and the first input becomes the output's new value whenever the trigger decreases from one sample to the next. This is ideal for updating values when a phasor wraps around.; #X text 574 494 updated for Pd version 0.37; #X obj 144 471 output~; #X text 356 280 <= reset phase; @@ -30,6 +29,7 @@ #X obj 236 344 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X text 262 343 <-- graph output; #X obj 144 410 mtof~; +#X text 35 57 Another analog favorite \, the sample and hold unit freezes an audio signal on command. In the Pd version \, the second input of [samphold~] triggers it and the first input becomes the output's new value whenever the trigger decreases from one sample to the next. This is ideal for updating values when a [phasor~] wraps around.; #X connect 2 0 4 1; #X connect 3 0 4 0; #X connect 4 0 8 0; @@ -37,17 +37,17 @@ #X connect 5 0 3 0; #X connect 6 0 2 0; #X connect 8 0 9 0; -#X connect 9 0 26 0; -#X connect 10 0 20 0; +#X connect 9 0 25 0; +#X connect 10 0 19 0; #X connect 11 0 2 1; #X connect 11 0 3 1; -#X connect 12 0 23 0; -#X connect 13 0 23 0; -#X connect 14 0 23 0; -#X connect 15 0 23 0; -#X connect 16 0 23 0; -#X connect 17 0 23 0; -#X connect 23 0 5 0; -#X connect 23 1 6 0; -#X connect 24 0 7 0; -#X connect 26 0 10 0; +#X connect 12 0 22 0; +#X connect 13 0 22 0; +#X connect 14 0 22 0; +#X connect 15 0 22 0; +#X connect 16 0 22 0; +#X connect 17 0 22 0; +#X connect 22 0 5 0; +#X connect 22 1 6 0; +#X connect 23 0 7 0; +#X connect 25 0 10 0; diff --git a/doc/3.audio.examples/D01.envelope.gen.pd b/doc/3.audio.examples/D01.envelope.gen.pd index 7682fdcd..257c907b 100644 --- a/doc/3.audio.examples/D01.envelope.gen.pd +++ b/doc/3.audio.examples/D01.envelope.gen.pd @@ -1,4 +1,4 @@ -#N canvas 430 23 561 667 12; +#N canvas 430 38 561 667 12; #X declare -stdpath ./; #X text 182 278 attack; #X text 256 279 release; @@ -11,31 +11,31 @@ #X msg 188 379 1 2500; #X obj 86 433 -~ 0.5; #X msg 123 355 10 200; -#X obj 188 355 del 200; -#X text 49 46 This patch uses an envelope generator to control a sound. When you hit "attack" two things happen. First \, the line~ object rises to 10 in 200 milliseconds. Then after a "delay" of the same 200 msec \, the second message sends the line~ back down to 1 over another 2500 msec. The "release" just ramps us down to zero at the end.; #X obj 171 586 output~; #X text 319 603 updated for Pd version 0.37; #X obj 171 498 +~ 0.5; #X obj 171 552 hip~ 5; #X msg 198 330 stop; -#X text 48 143 You can hit the "attack" and/or "release" while something is still going on from a previous attack or release \, and the envelope generator does the "right thing". In particular \, the release button sends a "stop" to the "del" object \, in case it is still scheduled to go off from a previous attack.; -#X text 50 227 The synthesis method is a form of waveshaping \, which is the subject of a later chapter.; +#X text 50 226 The synthesis method is a form of waveshaping \, which is the subject of a later chapter.; #X obj 393 14 declare -stdpath ./; #X obj 188 298 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 259 299 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 188 355 delay 200; +#X text 48 143 You can hit the "attack" and/or "release" while something is still going on from a previous attack or release \, and the envelope generator does the "right thing". In particular \, the release button sends a "stop" to the [del] object \, in case it is still scheduled to go off from a previous attack.; +#X text 49 46 This patch uses an envelope generator to control a sound. When you hit "attack" two things happen. First \, the [line~] object rises to 10 in 200 milliseconds. Then after a delay of the same 200 msec via the [del] object \, the second message sends the [line~] back down to 1 over another 2500 msec. The "release" just ramps us down to zero at the end.; #X connect 2 0 6 1; #X connect 3 0 2 0; #X connect 5 0 9 0; -#X connect 6 0 15 0; -#X connect 7 0 16 0; +#X connect 6 0 13 0; +#X connect 7 0 14 0; #X connect 8 0 2 0; #X connect 9 0 6 0; #X connect 10 0 2 0; -#X connect 11 0 8 0; -#X connect 15 0 7 0; -#X connect 16 0 13 0; -#X connect 17 0 11 0; -#X connect 21 0 11 0; -#X connect 21 0 10 0; -#X connect 22 0 3 0; -#X connect 22 0 17 0; +#X connect 13 0 7 0; +#X connect 14 0 11 0; +#X connect 15 0 20 0; +#X connect 18 0 10 0; +#X connect 18 0 20 0; +#X connect 19 0 3 0; +#X connect 19 0 15 0; +#X connect 20 0 8 0; diff --git a/doc/3.audio.examples/D02.adsr.pd b/doc/3.audio.examples/D02.adsr.pd index 5ea0225f..3623d891 100644 --- a/doc/3.audio.examples/D02.adsr.pd +++ b/doc/3.audio.examples/D02.adsr.pd @@ -1,38 +1,40 @@ -#N canvas 479 23 526 688 12; +#N canvas 616 48 533 748 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array adsr-output 44100 float 0; -#X coords 0 1.02 44100 -1.02 200 130 1; -#X restore 225 380 graph; -#X text 237 516 ------ 1 second ------; -#X obj 58 128 r trigger; -#X obj 75 219 tabwrite~ adsr-output; -#X obj 89 191 r graphit; -#X obj 261 132 del 500; -#X msg 250 198 \; pd dsp 1 \; trigger 1 \; graphit bang; -#X msg 249 268 \; pd dsp 1 \; trigger 0 \; graphit bang; -#X msg 261 157 \; trigger 0; -#X text 428 500 -1; -#X text 430 375 1; -#X text 48 41 This patch introduces a simple "adsr" abstraction we'll use frequently. You can click on the "adsr" object to see what's inside.; -#X text 53 557 The active ingredient of the ADSR envelope generator is a single line~ which gets passed messages to make the attack and release behavior. You can retrigger the ADSR envelope generator all you wish without having to wait for attacks or releases to finish; -#X text 113 11 ENVELOPE GENERATOR ABSTRACTION; -#X obj 58 154 adsr 1 100 200 50 300; -#X text 293 647 updated for Pd version 0.37; -#X obj 75 251 osc~ 440; -#X obj 57 276 *~; -#X obj 57 311 output~; -#X text 349 217 <= attack only; -#X text 352 292 <= release only; -#X obj 387 10 declare -stdpath ./; -#X obj 250 99 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 273 98 <-- attack and delayed release; -#X connect 2 0 14 0; +#X coords 0 1.02 44100 -0.02 200 130 1 0 0; +#X restore 258 429 graph; +#X text 278 565 ------ 1 second ------; +#X obj 63 199 r trigger; +#X obj 90 334 tabwrite~ adsr-output; +#X obj 104 306 r graphit; +#X msg 283 243 \; pd dsp 1 \; trigger 1 \; graphit bang; +#X msg 283 324 \; pd dsp 1 \; trigger 0 \; graphit bang; +#X msg 297 194 \; trigger 0; +#X text 463 424 1; +#X text 151 19 ENVELOPE GENERATOR ABSTRACTION; +#X text 296 696 updated for Pd version 0.37; +#X obj 45 147 osc~ 440; +#X obj 45 393 *~; +#X obj 45 428 output~; +#X obj 45 526 declare -stdpath ./; +#X obj 283 125 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 306 124 <-- attack and delayed release, f 15; +#X text 55 57 This patch introduces a simple [adsr] abstraction we'll use frequently. You can click on the [adsr] object to see what's inside.; +#X text 56 606 The active ingredient of the ADSR envelope generator is a single [line~] which gets passed messages to make the attack and release behavior. You can retrigger the ADSR envelope generator all you wish without having to wait for attacks or releases to finish; +#X text 386 348 <-- release only; +#X text 382 262 <-- attack only; +#X obj 63 228 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 297 169 del 750; +#X obj 63 261 adsr 1 100 200 50 250; +#X text 461 549 0; +#X connect 2 0 21 0; #X connect 4 0 3 0; -#X connect 5 0 8 0; -#X connect 14 0 3 0; -#X connect 14 0 17 0; -#X connect 16 0 17 1; -#X connect 17 0 18 0; -#X connect 22 0 6 0; -#X connect 22 0 5 0; +#X connect 11 0 12 0; +#X connect 12 0 13 0; +#X connect 15 0 5 0; +#X connect 15 0 22 0; +#X connect 21 0 23 0; +#X connect 22 0 7 0; +#X connect 23 0 3 0; +#X connect 23 0 12 1; diff --git a/doc/3.audio.examples/D03.envelope.dB.pd b/doc/3.audio.examples/D03.envelope.dB.pd index a73b4ecf..597a6cf7 100644 --- a/doc/3.audio.examples/D03.envelope.dB.pd +++ b/doc/3.audio.examples/D03.envelope.dB.pd @@ -1,13 +1,13 @@ -#N canvas 542 38 559 760 12; +#N canvas 542 38 581 742 12; #X declare -stdpath ./; -#X obj 72 115 r trigger; -#X text 110 14 USING ADSR'S OUTPUT AS dB; -#X obj 72 166 tabread4~ dbtorms; +#X obj 114 121 r trigger; +#X text 124 16 USING ADSR'S OUTPUT AS dB; +#X obj 114 208 tabread4~ dbtorms; #N canvas 0 0 450 300 (subpatch) 0; #X array dbtorms 123 float 1; #A 0 0 0 1.25893e-05 1.41254e-05 1.58489e-05 1.77828e-05 1.99526e-05 2.23872e-05 2.51189e-05 2.81838e-05 3.16228e-05 3.54813e-05 3.98107e-05 4.46684e-05 5.01187e-05 5.62341e-05 6.30957e-05 7.07946e-05 7.94328e-05 8.91251e-05 0.0001 0.000112202 0.000125893 0.000141254 0.000158489 0.000177828 0.000199526 0.000223872 0.000251189 0.000281838 0.000316228 0.000354813 0.000398107 0.000446684 0.000501187 0.000562341 0.000630957 0.000707946 0.000794328 0.000891251 0.001 0.00112202 0.00125893 0.00141254 0.00158489 0.00177828 0.00199526 0.00223872 0.00251189 0.00281838 0.00316228 0.00354813 0.00398107 0.00446684 0.00501187 0.00562341 0.00630957 0.00707946 0.00794328 0.00891251 0.01 0.0112202 0.0125893 0.0141254 0.0158489 0.0177828 0.0199526 0.0223872 0.0251189 0.0281838 0.0316228 0.0354813 0.0398107 0.0446684 0.0501187 0.0562341 0.0630957 0.0707946 0.0794328 0.0891251 0.1 0.112202 0.125893 0.141254 0.158489 0.177828 0.199526 0.223872 0.251189 0.281838 0.316228 0.354813 0.398107 0.446684 0.501187 0.562341 0.630957 0.707946 0.794328 0.891251 1 1.12202 1.25893 1.41254 1.58489 1.77828 1.99526 2.23872 2.51189 2.81838 3.16228 3.54813 3.98107 4.46684 5.01187 5.62341 6.30957 7.07946 7.94328 8.91251 10 11.2202 12.5893; #X coords 0 10 123 0 200 100 1; -#X restore 275 185 graph; +#X restore 284 240 graph; #N canvas 461 387 594 359 make-table 0; #X obj 101 232 moses 2; #X msg 62 32 bang; @@ -48,27 +48,29 @@ #X connect 15 0 14 0; #X connect 17 0 6 1; #X connect 17 1 9 0; -#X restore 318 386 pd make-table; -#X text 301 346 here's the patch I used to make the table:, f 24; -#X obj 90 192 osc~ 440; -#X text 477 278 0; -#X text 478 179 10; -#X text 286 291 ------ 123 samples ------; -#X msg 71 382 \; pd dsp 1 \; trigger 0; -#X obj 72 217 *~; -#X msg 70 327 \; pd dsp 1 \; trigger 1; -#X obj 72 141 adsr 100 100 200 70 300; -#X text 68 444 The table is indexed from 1 to 120 so that 1 gives a true zero out and 120 gives 10 (a 20 dB boost.) The extra 20 dB are for headroom.; -#X text 66 613 Notice how the attack sounds different when you retrigger than when you start from zero. This is because if you go from the steady state you only rise 30 dB instead of 100 \, so it sounds slower... a slur effect. If you don't want this \, you might try increasing the amplitude of retriggered notes in comparison to isolated ones.; -#X obj 72 251 output~; -#X text 317 714 updated for Pd version 0.37; -#X text 147 341 <= attack; -#X text 146 396 <= release; -#X obj 387 13 declare -stdpath ./; -#X text 62 45 For more natural sounding amplitude control \, you can use the ADSR's output as log amplitude. Technically \, this is more efficient if done using a lookup table.; -#X text 64 494 There's also a "real" [dbtorms~] object that you can just use instead if CPU cost is not a concern and the next example will use that instead \, but for didatical reasons it's shown how to implement a lookup table instead in cases where you might be really concerned (as running Pd in a microcontroller) since [dbtorms~] it's almost certainly much more compute-intensive than ptabread4~] \, since it has to call a library "exp" function.); -#X connect 0 0 13 0; -#X connect 2 0 11 0; -#X connect 6 0 11 1; +#X restore 385 396 pd make-table; +#X text 82 395 here's the patch I used to make the table:; +#X obj 37 164 osc~ 440; +#X text 486 333 0; +#X text 487 234 10; +#X text 295 346 ------ 123 samples ------; +#X msg 411 134 \; pd dsp 1 \; trigger 0; +#X obj 96 238 *~; +#X msg 317 134 \; pd dsp 1 \; trigger 1; +#X obj 114 179 adsr 100 100 200 70 300; +#X text 82 437 The table is indexed from 1 to 120 so that 1 gives a true zero out and 120 gives 10 (a 20 dB boost.) The extra 20 dB are for headroom.; +#X text 80 606 Notice how the attack sounds different when you retrigger than when you start from zero. This is because if you go from the steady state you only rise 30 dB instead of 100 \, so it sounds slower... a slur effect. If you don't want this \, you might try increasing the amplitude of retriggered notes in comparison to isolated ones.; +#X obj 96 266 output~; +#X text 331 707 updated for Pd version 0.37; +#X obj 96 344 declare -stdpath ./; +#X text 76 47 For more natural sounding amplitude control \, you can use the ADSR's output as log amplitude. Technically \, this is more efficient if done using a lookup table.; +#X text 78 487 There's also a "real" [dbtorms~] object that you can just use instead if CPU cost is not a concern and the next example will use that instead \, but for didatical reasons it's shown how to implement a lookup table instead in cases where you might be really concerned (as running Pd in a microcontroller) since [dbtorms~] it's almost certainly much more compute-intensive than ptabread4~] \, since it has to call a library "exp" function.); +#X obj 114 147 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 324 110 attack:; +#X text 414 110 release:; +#X connect 0 0 21 0; +#X connect 2 0 11 1; +#X connect 6 0 11 0; #X connect 11 0 16 0; #X connect 13 0 2 0; +#X connect 21 0 13 0; diff --git a/doc/3.audio.examples/D04.envelope.quartic.pd b/doc/3.audio.examples/D04.envelope.quartic.pd index 62dbb463..ef7afd43 100644 --- a/doc/3.audio.examples/D04.envelope.quartic.pd +++ b/doc/3.audio.examples/D04.envelope.quartic.pd @@ -1,11 +1,11 @@ -#N canvas 520 54 688 657 12; +#N canvas 520 54 686 677 12; #X declare -stdpath ./; #X obj 55 377 osc~; #X obj 55 407 *~; #X obj 107 381 line~; #X obj 55 352 line~; #X obj 197 487 osc~; -#X obj 250 515 *~; +#X obj 250 535 *~; #X obj 268 398 line~; #X obj 197 398 line~; #X obj 197 345 sqrt; @@ -22,31 +22,31 @@ #X obj 107 357 r amp; #X obj 197 295 r freq; #X obj 268 295 r amp; -#X msg 375 304 \; amp 0 5000 \;; -#X msg 375 259 \; amp 1 5000 \;; -#X msg 511 304 \; amp 0 1000 \;; -#X msg 511 259 \; amp 1 1000 \;; -#X msg 376 364 \; freq 1760 5000 \;; -#X msg 377 411 \; freq 55 5000 \;; -#X msg 512 364 \; freq 1760 1000 \;; -#X msg 515 411 \; freq 55 1000 \;; #X text 79 26 QUARTIC AND LINEAR ENVELOPES COMPARED; -#X obj 381 460 loadbang; -#X msg 381 488 \; amp 1 \; freq 1760; +#X obj 467 483 loadbang; +#X msg 467 511 \; amp 1 \; freq 1760; #X text 56 297 LINEAR; #X text 202 268 QUARTIC; #X obj 55 446 output~; -#X obj 250 558 output~; -#X text 75 141 In the quartic example \, for both the amplitude and the frequency \, we have to take the fourth root of the target value (which we get by taking square root twice.) Then we raise the line~ output to the fourth power by squaring twice (the *~ objects \, whose left and right inlets are the same.) The cost is mostly that of the four additional *~ objects., f 68; -#X text 418 577 updated for Pd version 0.37; +#X obj 250 578 output~; +#X text 452 603 updated for Pd version 0.37; #X text 75 61 This patch has two sine wave oscillators \, one with linear envelopes \, the other with quartic ones which sound more uniform. The message boxes sweep the amplitude and frequency up and down. You can compare the two to see that quartic-shaped changes sound more uniform than linear ones., f 68; -#X obj 510 22 declare -stdpath ./; +#X obj 55 574 declare -stdpath ./; +#X text 75 141 In the quartic example \, for both the amplitude and the frequency \, we have to take the fourth root of the target value (which we get by taking square root twice.) Then we raise the [line~] output to the fourth power by squaring twice (the [*~] objects \, whose left and right inlets are the same.) The cost is mostly that of the four additional [*~] objects., f 68; +#X msg 511 304 \; amp 0 1000 \;; +#X msg 375 304 \; amp 0 5000 \;; +#X msg 375 259 \; amp 1 5000 \;; +#X msg 511 259 \; amp 0.5 1000 \;; +#X msg 376 364 \; freq 1760 5000; +#X msg 511 364 \; freq 880 1000; +#X msg 511 407 \; freq 220 1000; +#X msg 377 407 \; freq 110 5000; #X connect 0 0 1 0; -#X connect 1 0 35 0; +#X connect 1 0 27 0; #X connect 2 0 1 1; #X connect 3 0 0 0; #X connect 4 0 5 0; -#X connect 5 0 36 0; +#X connect 5 0 28 0; #X connect 6 0 14 0; #X connect 6 0 14 1; #X connect 7 0 12 0; @@ -69,4 +69,4 @@ #X connect 19 0 2 0; #X connect 20 0 16 0; #X connect 21 0 17 0; -#X connect 31 0 32 0; +#X connect 23 0 24 0; diff --git a/doc/3.audio.examples/D05.envelope.pitch.pd b/doc/3.audio.examples/D05.envelope.pitch.pd index f7cd4acc..9254c4f9 100644 --- a/doc/3.audio.examples/D05.envelope.pitch.pd +++ b/doc/3.audio.examples/D05.envelope.pitch.pd @@ -1,30 +1,22 @@ -#N canvas 529 38 616 720 12; +#N canvas 529 38 616 742 12; #X declare -stdpath ./; -#X obj 68 164 r trigger; -#X obj 68 286 *~; -#X text 43 20 PITCH ENVELOPES; -#X obj 260 164 r trigger2; -#X obj 260 276 tabread4~ mtof; -#X obj 260 303 osc~; -#X msg 38 429 \; pd dsp 1 \; trigger 1 \; trigger2 1; -#X msg 211 429 \; pd dsp 1 \; trigger 1 \; trigger2 -1; -#X msg 404 429 \; pd dsp 1 \; trigger 0 \; trigger2 0; -#X obj 260 245 +~ 69; -#X text 297 449 restarting; -#X text 297 462 pitch env; -#X text 62 612 This is an extreme use of pitch enveloping. In a real situation you might want an envelope controlling vibrato depth or the like instead of straight pitch., f 69; -#X obj 68 208 adsr 100 50 200 90 1000; -#X obj 260 208 adsr 20 200 100 100 1000; -#X text 394 665 updated for Pd version 0.37; -#X obj 68 327 output~; -#X obj 403 20 declare -stdpath ./; -#X text 117 455 <-- attack; -#X text 297 435 <-- attack; -#X text 485 453 <-- release; -#X text 34 63 For pitch envelopes \, unlike amplitude envelopes \, discontinuities are allowed and sometimes you would rather the envelope generator actually jump to zero when it's triggered. The [adsr] abstraction does this for you if you send a negative trigger instead of a positive one:, f 65; -#X text 448 208 <-- click to open and check the inner workings of the abstraction., f 17; -#X obj 68 242 dbtorms~; -#X text 62 513 We have added a new table ("mtof") for converting audio signals from pitch to frequency. Like in the previous example \, there's also a real [mtof~] object you can use instead and that we'll use in the next examples. The table lookup is \, again \, for CPU efficiency concerns and its range is 1-127 \, so you want to add a base pitch in before you start reading from it., f 69; +#X obj 68 397 *~; +#X text 90 19 PITCH ENVELOPES; +#X obj 260 387 tabread4~ mtof; +#X obj 260 414 osc~; +#X obj 260 356 +~ 69; +#X text 62 515 This is an extreme use of pitch enveloping. In a real situation you might want an envelope controlling vibrato depth or the like instead of straight pitch., f 69; +#X obj 68 319 adsr 100 50 200 90 1000; +#X obj 260 319 adsr 20 200 100 100 1000; +#X text 392 694 updated for Pd version 0.37; +#X obj 68 438 output~; +#X obj 263 466 declare -stdpath ./; +#X text 130 176 <-- attack; +#X text 507 176 <-- release; +#X text 66 50 For pitch envelopes \, unlike amplitude envelopes \, discontinuities are allowed and sometimes you would rather the envelope generator actually jump to zero when it's triggered. The [adsr] abstraction does this for you if you send a negative trigger instead of a positive one:, f 65; +#X text 444 319 <-- click to open and check the inner workings of the abstraction., f 17; +#X obj 68 353 dbtorms~; +#X text 62 576 We have added a new table ("mtof") for converting audio signals from pitch to frequency. Like in the previous example \, there's also a real [mtof~] object you can use instead and that we'll use in the next examples. The table lookup is \, again \, for CPU efficiency concerns and its range is 1-127 \, so you want to add a base pitch in before you start reading from it., f 69; #N canvas 453 231 801 286 mtof-table 0; #X msg 67 39 bang; #X obj 67 68 t b b; @@ -68,13 +60,27 @@ #X connect 15 0 5 1; #X connect 15 1 6 0; #X connect 17 0 20 0; -#X restore 330 307 pd mtof-table; -#X connect 0 0 13 0; -#X connect 1 0 16 0; -#X connect 3 0 14 0; -#X connect 4 0 5 0; -#X connect 5 0 1 1; -#X connect 9 0 4 0; -#X connect 13 0 23 0; -#X connect 14 0 9 0; -#X connect 23 0 1 0; +#X restore 402 409 pd mtof-table; +#X obj 68 286 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 260 286 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 68 233 r trigger; +#X obj 260 233 r trigger2; +#X floatatom 68 259 3 0 0 0 - - - 0; +#X floatatom 260 259 3 0 0 0 - - - 0; +#X msg 51 159 \; trigger 1 \; trigger2 1; +#X msg 224 159 \; trigger 1 \; trigger2 -1; +#X msg 427 159 \; trigger 0 \; trigger2 0; +#X text 321 162 <-- attack restarting pitch env, f 10; +#X connect 0 0 9 0; +#X connect 2 0 3 0; +#X connect 3 0 0 1; +#X connect 4 0 2 0; +#X connect 6 0 15 0; +#X connect 7 0 4 0; +#X connect 15 0 0 0; +#X connect 18 0 6 0; +#X connect 19 0 7 0; +#X connect 20 0 22 0; +#X connect 21 0 23 0; +#X connect 22 0 18 0; +#X connect 23 0 19 0; diff --git a/doc/3.audio.examples/D06.envelope.portamento.pd b/doc/3.audio.examples/D06.envelope.portamento.pd index 8e5f1eb4..4b7a64d7 100644 --- a/doc/3.audio.examples/D06.envelope.portamento.pd +++ b/doc/3.audio.examples/D06.envelope.portamento.pd @@ -1,9 +1,9 @@ -#N canvas 481 68 579 354 12; +#N canvas 481 68 579 381 12; #X declare -stdpath ./; -#X obj 50 213 osc~; +#X obj 50 232 osc~; #X text 45 18 PORTAMENTO; -#X obj 50 161 line~; -#X obj 50 113 r pitch; +#X obj 50 173 line~; +#X obj 50 111 r pitch; #X msg 178 175 36, f 2; #X msg 207 175 48, f 2; #X msg 234 175 60, f 2; @@ -18,16 +18,16 @@ #X floatatom 319 214 6 0 0 0 - - - 0; #X text 334 302 updated for Pd version 0.35; #X obj 291 149 loadbang; -#X text 429 175 <= set pitch; -#X obj 50 257 output~; +#X obj 50 274 output~; #X obj 407 97 declare -stdpath ./; -#X obj 50 137 pack f 100; -#X text 156 112 <-- change speed; -#X obj 50 187 mtof~; +#X obj 50 142 pack f 100; +#X text 155 110 <-- change speed; +#X obj 50 203 mtof~; #X text 44 49 Portamento can be done using just [line~] \, but you still might want to sweep in pitch \, not frequency:; -#X connect 0 0 19 0; -#X connect 2 0 23 0; -#X connect 3 0 21 0; +#X text 429 175 <-- set pitch; +#X connect 0 0 18 0; +#X connect 2 0 22 0; +#X connect 3 0 20 0; #X connect 4 0 15 0; #X connect 5 0 15 0; #X connect 6 0 15 0; @@ -37,8 +37,8 @@ #X connect 10 0 15 0; #X connect 12 0 15 0; #X connect 13 0 15 0; -#X connect 14 0 21 1; +#X connect 14 0 20 1; #X connect 15 0 11 0; #X connect 17 0 7 0; -#X connect 21 0 2 0; -#X connect 23 0 0 0; +#X connect 20 0 2 0; +#X connect 22 0 0 0; diff --git a/doc/3.audio.examples/D07.additive.pd b/doc/3.audio.examples/D07.additive.pd index f559a314..3a61355e 100644 --- a/doc/3.audio.examples/D07.additive.pd +++ b/doc/3.audio.examples/D07.additive.pd @@ -1,35 +1,36 @@ -#N canvas 500 48 593 563 12; +#N canvas 500 48 610 549 12; #X declare -stdpath ./; -#X floatatom 272 369 5 0 0 0 - dur - 0; -#X floatatom 217 369 5 0 0 0 - pitch - 0; -#X text 41 12 ADDITIVE SYNTHESIS; -#X text 174 370 pitch; -#X obj 163 481 output~; -#X text 15 41 This patch demonstrates using an abstraction \, "partial" \, to make a simple additive synthesis instrument originally from Jean-Claude Risset., f 78; -#X obj 84 280 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 402 207 declare -stdpath ./; -#X text 351 508 updated for Pd version 0.52; -#X msg 84 312 all bang; -#X obj 163 436 clone 11 partial; -#X msg 217 404 all \$1; -#X msg 272 404 all \$1; -#X obj 360 324 text define -k partials; +#X floatatom 297 351 5 0 0 0 - dur - 0; +#X floatatom 242 351 5 0 0 0 - pitch - 0; +#X text 53 12 ADDITIVE SYNTHESIS; +#X text 199 352 pitch; +#X obj 188 463 output~; +#X obj 109 262 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 21 480 declare -stdpath ./; +#X text 377 475 updated for Pd version 0.52; +#X msg 109 294 all bang; +#X obj 188 418 clone 11 partial; +#X msg 242 386 all \$1; +#X msg 297 386 all \$1; +#X obj 413 286 text define -k partials; #A set 0 1 1 0.56 0 \; 1 0.67 0.9 0.56 1 \; 2 1 0.65 0.92 0 \; 3 1.8 0.55 0.92 1.7 \; 4 2.67 0.32 1.19 0 \; 5 1.67 0.35 1.7 0 \; 6 1.46 0.25 2 0 \; 7 1.33 0.2 2.74 0 \; 8 1.33 0.15 3 0 \; 9 1 0.1 3.76 0 \; 10 1.33 0.075 4.07 0; -#X obj 163 322 text sequence partials; -#X msg 163 288 line 0 \, bang; -#X text 19 280 play -->; -#X obj 272 224 loadbang; -#X msg 272 260 \; pitch 72 \; dur 40; -#X text 317 362 duration (tenths of seconds), f 17; -#X text 15 81 We use [clone] to create 11 copies of the abstraction and send list messages from a [text] object whose arguments are: instance number \, amplitude \, relative duration \, relative frequency and detuning frequency - click [text define] to see this. The usage of [text] is merely cosmetical as you can more easily read the lines than if it were a single or many messages. The messages are "dumped" with [text sequence]. You set absolute duration and pitch using the number box controls below. Click the bang to make sound., f 78; -#X connect 0 0 12 0; -#X connect 1 0 11 0; -#X connect 6 0 9 0; -#X connect 9 0 10 0; -#X connect 10 0 4 0; -#X connect 11 0 10 1; -#X connect 12 0 10 2; -#X connect 14 0 10 0; -#X connect 15 0 14 0; -#X connect 17 0 15 0; -#X connect 17 0 18 0; +#X obj 188 304 text sequence partials; +#X msg 188 270 line 0 \, bang; +#X text 44 262 play -->; +#X obj 297 206 loadbang; +#X msg 297 242 \; pitch 72 \; dur 40; +#X text 342 344 duration (tenths of seconds), f 17; +#X text 27 41 This patch demonstrates using an abstraction \, [partial] \, to make a simple additive synthesis instrument originally from Jean-Claude Risset., f 78; +#X text 27 81 We use [clone] to create 11 copies of the abstraction and send list messages from a [text] object whose arguments are: instance number \, amplitude \, relative duration \, relative frequency and detuning frequency - click [text define] to see this. The usage of [text] is merely cosmetical as it's less polluted than using many messages in a message box. All the messages in [text define] are "dumped" with [text sequence]. You set absolute duration and pitch using the number box controls below. Click the bang to make sound., f 78; +#X text 437 262 click to open:; +#X connect 0 0 11 0; +#X connect 1 0 10 0; +#X connect 5 0 8 0; +#X connect 8 0 9 0; +#X connect 9 0 4 0; +#X connect 10 0 9 1; +#X connect 11 0 9 2; +#X connect 13 0 9 0; +#X connect 14 0 13 0; +#X connect 16 0 14 0; +#X connect 16 0 17 0; diff --git a/doc/3.audio.examples/D08.table.spectrum.pd b/doc/3.audio.examples/D08.table.spectrum.pd index dcde3249..6baad465 100644 --- a/doc/3.audio.examples/D08.table.spectrum.pd +++ b/doc/3.audio.examples/D08.table.spectrum.pd @@ -1,35 +1,35 @@ -#N canvas 462 91 740 504 12; +#N canvas 462 91 741 542 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array spectrum-tab 127 float 1; #A 0 48.5713 48.5713 48.5713 48.2142 48.2142 48.2142 48.2142 48.2142 48.2142 48.2142 48.2142 48.2142 48.2142 48.5713 48.5713 48.9284 48.9284 48.9284 48.9284 48.9284 48.9284 48.9284 48.5713 48.5713 48.5713 48.2142 48.2142 47.4999 47.1427 46.4285 46.4285 46.0713 46.0713 46.0713 45.7142 44.9999 44.6428 43.5713 43.2142 42.8571 42.4999 41.7856 38.2143 36.7857 34.6429 31.7857 30.3572 29.6429 28.5715 27.8572 26.7858 25.3572 25.7144 23.9287 23.9287 23.5715 23.5715 23.5715 23.5715 23.2144 23.2144 23.2144 22.8573 22.8573 23.5715 23.9287 23.5715 26.0715 26.0715 48.5713 48.5713 48.5713 48.2142 47.4999 46.7856 46.7856 17.143 16.4287 16.0716 16.4287 14.643 13.5716 13.5716 40.7142 40.7142 40.7142 14.643 13.2145 12.8573 12.5002 12.5002 24.2858 29.6429 30.7143 16.4287 10.7145 11.7859 10.7145 24.2858 23.5715 17.143 13.9288 9.64309 6.78597 5.71455 5.71455 4.28599 3.92885 3.92885 3.92885 1.42887 1.42887 1.42887 1.07174 1.07174 1.07174 0.714596 0.714596 0.714596 0.714596 0.714596 1.07174 1.07174 1.07174 1.07174 0.714286 0.357143; #X coords 0 50 126 0 300 140 1; #X restore 374 152 graph; -#X obj 32 166 s pitch; -#X floatatom 32 138 4 0 0 0 - - - 0; -#X text 50 23 DRAWABLE SPECTRA; -#X floatatom 30 196 4 0 0 0 - - - 0; -#X obj 30 224 s whammybar; -#N canvas 455 101 482 150 table-setup 0; +#X obj 110 155 s pitch; +#X floatatom 110 127 4 0 0 0 - - - 0; +#X text 130 17 DRAWABLE SPECTRA; +#X floatatom 110 196 4 0 0 0 - - - 0; +#X obj 110 243 s whammybar; +#N canvas 411 321 482 150 table-setup 0; #X obj 41 37 loadbang; -#X msg 41 71 \; spectrum-tab xlabel -5 0 12 24 36 48 60 72 84 96 108 120; +#X msg 41 71 \; spectrum-tab xlabel -2.5 0 12 24 36 48 60 72 84 96 108 120; #X connect 0 0 1 0; -#X restore 33 258 pd table-setup; -#X msg 512 75 \; spectrum-tab const 0; -#X text 33 47 In this array \, you can draw a spectral envelope that will be synthesized by an oscillator bank. Each oscillator in the bank computes its own frequency and uses it to look up amplitude from the array., f 52; -#X text 578 54 CLEAR; -#X obj 67 408 output~; -#X obj 518 14 declare -stdpath ./; -#X obj 401 406 loadbang; -#X obj 401 431 metro 30; -#X obj 401 457 s poll-table; -#X text 225 419 And here we send bangs to "poll-table" needed by the abstraction., f 23; -#X text 54 293 The [clone] object carries the bank of oscillators \, which is 30 copies of the [spectrum-partial] abstraction - click to open and see it:, f 39; -#X obj 67 371 clone -s 1 spectrum-partial 30; -#X text 514 431 Updated for Pd version 0.52; -#X text 66 137 <-- pitch; -#X text 68 196 <-- left or right shift (normally 0); -#X text 145 258 <-- make the number labels; +#X restore 486 402 pd table-setup; +#X msg 471 342 \; spectrum-tab const 0; +#X text 33 47 In this array \, you can draw a spectral envelope that will be synthesized by an oscillator bank. Each oscillator in the bank computes its own frequency and uses it to look up amplitude from the array., f 65; +#X text 622 350 CLEAR; +#X obj 67 437 output~; +#X obj 534 66 declare -stdpath ./; +#X obj 377 424 loadbang; +#X obj 377 449 metro 30; +#X obj 377 475 s poll-table; +#X text 205 437 And here we send bangs to "poll-table" needed by the abstraction., f 23; +#X text 54 290 The [clone] object carries the bank of oscillators \, which is 30 copies of the [spectrum-partial] abstraction - click to open and see it:, f 39; +#X obj 67 390 clone -s 1 spectrum-partial 30; +#X text 514 464 Updated for Pd version 0.52; +#X text 144 126 <-- pitch; +#X text 148 196 <-- left or right shift (normally 0), f 19; +#X text 598 402 <-- make the number labels, f 14; #X connect 2 0 1 0; #X connect 4 0 5 0; #X connect 12 0 13 0; diff --git a/doc/3.audio.examples/D09.shepard.tone.pd b/doc/3.audio.examples/D09.shepard.tone.pd index 91f05da9..5c2469be 100644 --- a/doc/3.audio.examples/D09.shepard.tone.pd +++ b/doc/3.audio.examples/D09.shepard.tone.pd @@ -1,8 +1,8 @@ -#N canvas 489 23 577 667 12; +#N canvas 489 38 577 661 12; #X declare -stdpath ./; -#X floatatom 110 532 0 0 0 0 - - - 0; +#X floatatom 47 575 0 0 0 0 - - - 0; #X floatatom 110 458 0 0 0 0 - - - 0; -#X text 297 216 START; +#X text 339 217 START; #X floatatom 127 315 0 0 0 0 - - - 0; #X obj 127 292 r incr; #X obj 109 267 metro 50; @@ -10,29 +10,29 @@ #X obj 109 409 s phase; #X obj 109 362 +; #X obj 110 481 s dropoff+; -#X obj 110 634 s interval+; -#X floatatom 110 611 0 0 0 0 - - - 0; -#X obj 110 555 s pitch+; +#X obj 125 597 s interval+; +#X floatatom 125 574 4 0 0 0 - - - 0; +#X obj 47 598 s pitch+; #X obj 110 435 r dropoff; -#X obj 110 509 r pitch; -#X obj 110 588 r interval; +#X obj 47 552 r pitch; +#X obj 125 551 r interval; #X obj 109 217 r metro; #X obj 166 357 f; -#X floatatom 330 447 5 0 0 0 - - - 0; -#X obj 330 424 r rev; -#X obj 378 425 r revtime; -#X floatatom 378 448 5 0 0 0 - - - 0; +#X floatatom 346 439 5 0 0 0 - - - 0; +#X obj 346 416 r rev; +#X obj 394 417 r revtime; +#X floatatom 394 440 5 0 0 0 - - - 0; #X obj 166 380 mod 10000; #X obj 109 339 f; -#X obj 308 486 rev2~, f 13; -#X obj 308 528 output~; +#X obj 324 478 rev2~, f 13; +#X obj 250 521 output~; #X obj 109 242 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X text 46 23 SHEPARD TONE; #X obj 371 24 declare -stdpath ./; -#X obj 308 394 clone 20 shepvoice; +#X obj 324 386 clone 20 shepvoice; #X text 26 53 This patch has a bank of 20 sinusoids (the [shepvoice] abstraction with 20 copies in [clone]) \, arranged so that their frequencies sweep upward or downward in parallel \, and their amplitudes fade in and out so that each one is quiet when it wraps around from one end to the other. The overall "phase" computed here is added to each voice's relative phase (its creation argument). The "incr" parameter controls how fast the phase changes \, "dropoff" the slope at which the amplitudes fall off at the ends \, "pitch" the center pitch of the cluster \, "interval" the number of (tenths of halftones) between successive voices \, and "rev" and "revtime" the reverberator at bottom., f 71; -#X msg 281 233 \; dropoff 10 \; pitch 60 \; interval 120 \; metro 1 \; rev 84 \; revtime 87 \; incr -2; -#X text 317 614 updated for Pd version 0.52; +#X msg 322 238 \; dropoff 10 \; pitch 60 \; interval 120 \; metro 1 \; rev 84 \; revtime 87 \; incr -2; +#X text 348 607 updated for Pd version 0.52; #X connect 0 0 12 0; #X connect 1 0 9 0; #X connect 3 0 23 1; diff --git a/doc/3.audio.examples/D10.sampler.notes.pd b/doc/3.audio.examples/D10.sampler.notes.pd index c7213f6d..04cb5c06 100644 --- a/doc/3.audio.examples/D10.sampler.notes.pd +++ b/doc/3.audio.examples/D10.sampler.notes.pd @@ -1,9 +1,8 @@ #N canvas 402 38 816 789 12; #X declare -stdpath ./; #X obj 243 64 delay 5; -#X text 419 290 end of note; -#X obj 372 55 r note; -#N canvas 282 191 671 441 recorder 0; +#X text 419 288 end of note; +#N canvas 282 191 730 441 recorder 0; #X obj 218 34 inlet; #X obj 128 258 adc~ 1; #X obj 128 286 hip~ 5; @@ -19,15 +18,15 @@ #X msg 256 224 bang; #X obj 382 226 loadbang; #X obj 378 128 openpanel; -#X msg 378 100 bang; #X text 422 265 v-- re-read original samples; #X obj 218 63 route record stop reload browse; #X obj 382 347 soundfiler; -#X msg 382 289 read ../sound/bell.aiff sample1 \, read ../sound/voice2.wav sample2, f 33; #X msg 378 155 read \$1 sample1; #X obj 378 182 soundfiler; -#X text 416 100 <= browse for samples; -#X connect 0 0 17 0; +#X msg 382 289 read -resize ../sound/bell.aiff sample1 \, read -resize ../sound/voice2.wav sample2, f 40; +#X text 402 98 <-- browse for samples; +#X obj 378 98 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X connect 0 0 16 0; #X connect 1 0 2 0; #X connect 2 0 4 0; #X connect 3 0 4 1; @@ -39,18 +38,18 @@ #X connect 10 0 8 0; #X connect 11 0 6 0; #X connect 12 0 6 0; -#X connect 13 0 19 0; -#X connect 14 0 20 0; -#X connect 15 0 14 0; -#X connect 17 0 9 0; -#X connect 17 0 12 0; -#X connect 17 0 5 0; -#X connect 17 1 7 0; -#X connect 17 1 11 0; -#X connect 17 2 19 0; -#X connect 17 3 15 0; -#X connect 19 0 18 0; -#X connect 20 0 21 0; +#X connect 13 0 20 0; +#X connect 14 0 18 0; +#X connect 16 0 9 0; +#X connect 16 0 12 0; +#X connect 16 0 5 0; +#X connect 16 1 7 0; +#X connect 16 1 11 0; +#X connect 16 2 20 0; +#X connect 16 3 22 0; +#X connect 18 0 19 0; +#X connect 20 0 17 0; +#X connect 22 0 14 0; #X restore 631 179 pd recorder; #X msg 624 55 record 1; #X msg 638 99 stop; @@ -73,17 +72,17 @@ #X obj 57 550 *~; #X obj 75 492 *~; #X obj 75 521 *~; -#X text 127 32 messages to the phase generating line~; -#X text 190 95 setting the sample number.; #X text 230 123 compute the name; -#X text 124 150 and send a "set" message to the tabread4~.; -#X text 135 251 line~ for de-clicking; -#X text 167 309 The envelope generator. Rather than sending our message straight to the line~ we unpack it in order to fool with the amplitude field., f 45; -#X text 146 378 convert amplitude to linear units.; -#X text 141 407 take the fourth root. This because we want to raise the line~'s output to the 4th power afterwards. This is an inexpensive way to give the rise and decay a more natural sounding evolution than just a straight line., f 52; -#X text 112 505 square the output twice to get the fourth power.; +#X text 110 499 square the output twice to get the fourth power., f 24; #X obj 75 348 unpack f f; #X obj 75 377 dbtorms; +#X text 120 254 [line~] for de-clicking; +#X text 127 32 messages to the phase generating [line~]; +#X text 167 309 The envelope generator. Rather than sending our message straight to the [line~] we unpack it in order to fool with the amplitude field., f 45; +#X text 141 407 take the fourth root. This because we want to raise the [line~]'s output to the 4th power afterwards. This is an inexpensive way to give the rise and decay a more natural sounding evolution than just a straight line., f 51; +#X text 190 95 setting the sample number; +#X text 124 150 and send a "set" message to [tabread4~]; +#X text 146 378 convert amplitude to linear units; #X connect 0 0 10 0; #X connect 1 0 2 1; #X connect 2 0 15 0; @@ -94,7 +93,7 @@ #X connect 8 0 9 0; #X connect 9 0 10 0; #X connect 10 0 2 0; -#X connect 11 0 27 0; +#X connect 11 0 20 0; #X connect 12 0 13 0; #X connect 13 0 14 0; #X connect 14 0 16 0; @@ -103,10 +102,10 @@ #X connect 16 0 17 0; #X connect 16 0 17 1; #X connect 17 0 15 1; -#X connect 27 0 28 0; -#X connect 27 1 14 1; -#X connect 28 0 12 0; -#X restore 434 651 pd playback; +#X connect 20 0 21 0; +#X connect 20 1 14 1; +#X connect 21 0 12 0; +#X restore 454 648 pd playback; #X msg 631 77 record 2; #X text 50 272 ARGUMENTS FOR NOTES:; #X text 81 294 pitch in halftones, f 21; @@ -128,7 +127,6 @@ #X obj 227 244 * 4.41e+08; #X obj 263 278 +; #X obj 243 91 t b b b; -#X text 461 353 This starts the note \, sending to "receives" in the playback subpatch. The new receive "envelope" is an amplitude control in parallel with the cutoff control. The "sample-number" switches the tabread4~ between tables., f 43; #X obj 373 217 + 1; #X msg 42 485 60 100 10000 1 0 0 0; #X obj 57 747 s note; @@ -145,10 +143,9 @@ #X msg 74 598 60 100 100 1 0 0 0; #X msg 78 621 60 100 100 1 0 0 1000; #X msg 69 576 60 100 10000 1 0 1000 0; -#X msg 309 359 \; envelope 0 \, \$1 \$2 \; phase \$3 \, \$4 1e+07 \; sample-number \$5 \; cutoff 1 5 \;; #X msg 644 121 reload; #X msg 649 143 browse; -#X text 418 311 combine amplitude \, rise time \, start phase \, end phase \, and sample number in one message, f 43; +#X text 418 309 combine amplitude \, rise time \, start phase \, end phase \, and sample number in one message, f 43; #X text 191 485 straight playback; #X text 189 507 change amplitude; #X text 204 529 change sample number; @@ -156,84 +153,90 @@ #X text 237 574 change rise time; #X text 212 597 change duration; #X text 233 619 ... and decay time; -#X text 289 693 microtones OK too.; #X text 90 643 If you omit values they stay unchanged; -#X obj 434 688 output~; -#X text 567 714 updated for Pd version 0.37; -#X text 688 55 <= record; +#X obj 454 685 output~; #X obj 372 82 unpack f f f f f f f; -#X obj 309 322 pack f f f f f; -#X text 25 157 transposition works by altering the phase target (\$4 below right.) The mtof and / 261 calculate speed change considering 60 as unity., f 26; +#X obj 309 320 pack f f f f f; #X text 39 70 as before we mute and wait, f 13; #X text 31 442 These demonstrate the effect of varying the parameters one by one., f 34; #X obj 478 162 del; -#X text 409 470 This patch takes the same principle as the earlier "one-shot sampler" \, but allows you to parameterize sample playback. Since we must wait 5 msec before starting the playback \, we store all the parameters in "f" objects \, and recall them to construct the new note. Transposition is done by altering the amount to play back in the (artificial) ten thousand seconds (1e+07). The playback segment can be altered to start in the middle of the sample instead of the beginning \, and you can change the duration and rise and decay times., f 50; #X msg 62 552 60 100 10000 1 3000 0 0; #X msg 56 530 60 100 10000 2 0 0 0; #X msg 139 69 \; cutoff 0 5; #N canvas 305 163 336 422 samples 0; #N canvas 0 0 450 300 (subpatch) 0; -#X array sample1 176403 float 0; -#X coords 0 1.02 176403 -1.02 200 130 1; +#X array sample1 155944 float 2; +#X coords 0 1.02 155944 -1.02 200 130 1; #X restore 71 36 graph; -#X text 86 351 ------ 4 seconds ------; #N canvas 0 0 450 300 (subpatch) 0; -#X array sample2 176403 float 0; -#X coords 0 1.02 176403 -1.02 200 130 1; +#X array sample2 39075 float 2; +#X coords 0 1.02 39075 -1.02 200 130 1; #X restore 70 203 graph; -#X restore 635 223 pd samples; +#X restore 636 223 pd samples; #X obj 603 16 declare -stdpath ./; #X obj 243 27 bang; -#X connect 0 0 27 0; -#X connect 2 0 61 0; -#X connect 4 0 3 0; -#X connect 5 0 3 0; -#X connect 6 0 58 0; -#X connect 7 0 3 0; -#X connect 17 0 32 0; -#X connect 18 0 62 1; -#X connect 19 0 41 0; -#X connect 20 0 62 4; -#X connect 21 0 62 0; +#X text 409 467 This patch takes the same principle as the earlier "one-shot sampler" \, but allows you to parameterize sample playback. Since we must wait 5 msec before starting the playback \, we store all the parameters in [f] objects \, and recall them to construct the new note. Transposition is done by altering the amount to play back in the (artificial) ten thousand seconds (1e+07). The playback segment can be altered to start in the middle of the sample instead of the beginning \, and you can change the duration and rise and decay times., f 50; +#X text 688 55 <-- record; +#X msg 309 376 \; envelope 0 \, \$1 \$2 \; phase \$3 \, \$4 1e+07 \; sample-number \$5 \; cutoff 1 5; +#X text 25 157 transposition works by altering the phase target (\$4 below right.) The [mtof] and [/ 261.62] calculate speed change considering 60 as unity., f 26; +#X text 462 369 This starts the note \, sending to [r] objects in the playback subpatch. The new [r envelope] is an amplitude control in parallel with the cutoff control. The "sample-number" switches the [tabread4~] between tables., f 40; +#X listbox 309 349 27 0 0 0 - - - 0; +#X obj 372 25 r note; +#X listbox 372 54 23 0 0 0 - - - 0; +#X text 289 693 microtones OK too; +#X text 587 711 updated for Pd version 0.52; +#X connect 0 0 26 0; +#X connect 3 0 2 0; +#X connect 4 0 2 0; +#X connect 5 0 54 0; +#X connect 6 0 2 0; +#X connect 16 0 30 0; +#X connect 17 0 56 1; +#X connect 18 0 39 0; +#X connect 19 0 56 4; +#X connect 20 0 56 0; +#X connect 21 0 22 0; #X connect 22 0 23 0; #X connect 23 0 24 0; #X connect 24 0 25 0; -#X connect 25 0 26 0; -#X connect 26 0 62 3; -#X connect 27 0 21 0; -#X connect 27 1 22 0; -#X connect 27 2 18 0; -#X connect 27 2 19 0; -#X connect 27 2 20 0; -#X connect 27 2 66 0; -#X connect 29 0 26 1; -#X connect 29 0 62 2; -#X connect 30 0 31 0; -#X connect 33 0 31 0; -#X connect 34 0 31 0; -#X connect 35 0 31 0; -#X connect 36 0 31 0; -#X connect 37 0 31 0; -#X connect 38 0 31 0; -#X connect 39 0 31 0; -#X connect 40 0 31 0; +#X connect 25 0 56 3; +#X connect 26 0 20 0; +#X connect 26 1 21 0; +#X connect 26 2 17 0; +#X connect 26 2 18 0; +#X connect 26 2 19 0; +#X connect 26 2 59 0; +#X connect 27 0 25 1; +#X connect 27 0 56 2; +#X connect 28 0 29 0; +#X connect 31 0 29 0; +#X connect 32 0 29 0; +#X connect 33 0 29 0; +#X connect 34 0 29 0; +#X connect 35 0 29 0; +#X connect 36 0 29 0; +#X connect 37 0 29 0; +#X connect 38 0 29 0; +#X connect 39 0 27 0; +#X connect 40 0 29 0; #X connect 41 0 29 0; -#X connect 42 0 31 0; -#X connect 43 0 31 0; -#X connect 44 0 31 0; -#X connect 46 0 3 0; -#X connect 47 0 3 0; -#X connect 61 0 22 1; -#X connect 61 0 73 0; -#X connect 61 1 21 1; -#X connect 61 2 66 1; -#X connect 61 3 20 1; -#X connect 61 4 19 1; -#X connect 61 5 18 1; -#X connect 61 6 17 1; -#X connect 62 0 45 0; -#X connect 66 0 17 0; -#X connect 68 0 31 0; -#X connect 69 0 31 0; -#X connect 73 0 0 0; -#X connect 73 0 70 0; +#X connect 42 0 29 0; +#X connect 43 0 2 0; +#X connect 44 0 2 0; +#X connect 55 0 21 1; +#X connect 55 0 65 0; +#X connect 55 1 20 1; +#X connect 55 2 59 1; +#X connect 55 3 19 1; +#X connect 55 4 18 1; +#X connect 55 5 17 1; +#X connect 55 6 16 1; +#X connect 56 0 71 0; +#X connect 59 0 16 0; +#X connect 60 0 29 0; +#X connect 61 0 29 0; +#X connect 65 0 0 0; +#X connect 65 0 62 0; +#X connect 71 0 68 0; +#X connect 72 0 73 0; +#X connect 73 0 55 0; diff --git a/doc/3.audio.examples/D11.sampler.poly.pd b/doc/3.audio.examples/D11.sampler.poly.pd index fe6a6969..c9fd5981 100644 --- a/doc/3.audio.examples/D11.sampler.poly.pd +++ b/doc/3.audio.examples/D11.sampler.poly.pd @@ -1,45 +1,40 @@ -#N canvas 231 23 1061 650 12; +#N canvas 345 66 982 652 12; #X declare -stdpath ./; -#N canvas 305 163 433 432 samples 0; +#N canvas 966 150 406 431 samples 0; #N canvas 0 0 450 300 (subpatch) 0; -#X array sample3 176403 float 0; -#X coords 0 1.02 176403 -1.02 200 130 1; -#X restore 139 45 graph; -#X text 154 360 ------ 4 seconds ------; +#X array sample3 155944 float 2; +#X coords 0 1.02 155944 -1.02 200 130 1; +#X restore 100 58 graph; #N canvas 0 0 450 300 (subpatch) 0; -#X array sample4 176403 float 0; -#X coords 0 1.02 176403 -1.02 200 130 1; -#X restore 138 212 graph; -#X restore 852 61 pd samples; -#X text 65 81 ARGUMENTS FOR NOTES:; -#X text 85 110 pitch in halftones, f 21; -#X text 85 130 amplitude (dB), f 21; -#X text 85 169 sample number, f 21; -#X text 85 149 duration (msec), f 21; -#X text 85 189 start location (msec); -#X text 85 208 rise time (msec), f 21; -#X text 85 228 decay time (msec), f 21; -#X text 44 23 POLYPHONIC SAMPLER; -#X obj 631 17 r note; -#X obj 604 76 t b f; -#X obj 544 109 f; -#X obj 580 109 + 1; -#X obj 552 146 mod 1e+06; -#X obj 544 175 makenote 64; -#X obj 544 203 poly 8 1; -#X obj 544 230 stripnote; -#X text 851 106 record \, etc.; -#X text 340 203 allocate sampler voice; -#X text 366 228 drop note off again; -#X obj 684 455 qlist; -#X obj 558 436 r comment; -#X text 738 382 sailors to untie him..., f 39; -#X text 738 341 Lashed to the mast of his boat \, Ulysses; -#X text 738 362 hears beautiful singing. He begs his, f 39; -#X obj 617 341 output~; -#X text 263 175 supply delayed note-off message; -#X text 301 111 increment mod 1e+06 to make tag (acts like a MIDI pitch to identify the note to "poly"), f 31; -#N canvas 282 191 671 441 recorder 0; +#X array sample4 39075 float 2; +#X coords 0 1.02 39075 -1.02 200 130 1; +#X restore 99 225 graph; +#X restore 782 51 pd samples; +#X text 35 81 ARGUMENTS FOR NOTES:; +#X text 55 110 pitch in halftones, f 21; +#X text 55 130 amplitude (dB), f 21; +#X text 55 169 sample number, f 21; +#X text 55 149 duration (msec), f 21; +#X text 55 189 start location (msec); +#X text 55 208 rise time (msec), f 21; +#X text 55 228 decay time (msec), f 21; +#X text 52 29 POLYPHONIC SAMPLER; +#X obj 561 17 r note; +#X obj 534 76 t b f; +#X obj 474 109 f; +#X obj 510 109 + 1; +#X obj 482 146 mod 1e+06; +#X obj 474 175 makenote 64; +#X obj 474 203 poly 8 1; +#X obj 474 230 stripnote; +#X text 781 94 record \, etc.; +#X text 294 200 allocate sampler voice; +#X text 315 225 drop note off again; +#X obj 691 452 qlist; +#X obj 568 418 r comment; +#X obj 547 331 output~; +#X text 231 175 supply delayed note-off message; +#N canvas 530 314 704 442 recorder 0; #X obj 218 34 inlet; #X obj 128 258 adc~ 1; #X obj 128 286 hip~ 5; @@ -55,15 +50,15 @@ #X msg 256 224 bang; #X obj 382 226 loadbang; #X obj 378 128 openpanel; -#X msg 378 100 bang; #X text 422 265 v-- re-read original samples; #X obj 218 63 route record stop reload browse; #X obj 382 347 soundfiler; -#X msg 382 289 read ../sound/bell.aiff sample3 \, read ../sound/voice2.wav sample4, f 33; #X msg 378 155 read \$1 sample3; #X obj 378 182 soundfiler; -#X text 416 100 <= browse for samples; -#X connect 0 0 17 0; +#X msg 382 288 read -resize ../sound/bell.aiff sample3 \, read -resize ../sound/voice2.wav sample4, f 40; +#X obj 378 99 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 406 99 <-- browse for samples; +#X connect 0 0 16 0; #X connect 1 0 2 0; #X connect 2 0 4 0; #X connect 3 0 4 1; @@ -75,45 +70,47 @@ #X connect 10 0 8 0; #X connect 11 0 6 0; #X connect 12 0 6 0; -#X connect 13 0 19 0; -#X connect 14 0 20 0; -#X connect 15 0 14 0; -#X connect 17 0 9 0; -#X connect 17 0 12 0; -#X connect 17 0 5 0; -#X connect 17 1 7 0; -#X connect 17 1 11 0; -#X connect 17 2 19 0; -#X connect 17 3 15 0; -#X connect 19 0 18 0; -#X connect 20 0 21 0; -#X restore 872 257 pd recorder; -#X msg 865 133 record 1; -#X msg 879 177 stop; -#X msg 872 155 record 2; -#X msg 885 199 reload; -#X msg 890 221 browse; -#X obj 856 302 declare -stdpath ./; -#X obj 617 262 pack f f f f f f f f; -#X obj 631 44 unpack f f f f f f f; -#X text 48 271 Here we take the previous patch and make it polyphonic \, with 8 voices. The single voice which we had before has been made into an abstraction \, "sampvoice.pd" \, which we instantiate in 8 copies with the [clone] object. Earlier we used sends and receives to pass messages to "cutoff" \, etc \, but here if we did that the copies of sampvoice would be sending messages to each other \, so we combine the control and the audio computation in the sampvoice abstraction without using send and receive. Click on [clone] one to see how.; -#X obj 617 296 clone -s 1 sampvoice 8; -#X text 48 408 The [poly] object essentially repeats pitch and velocity pairs to its output \, but also sending a voice number from its left outlet. To use it \, we unpack the 7 parameters \, calculate the voice number \, repack the message as 8 parameters with voice number first \, and [clone] routes to internal instances of the abstraction.; -#X text 48 503 There's some bother because [poly] expects to track note on and note off messages separately as they would come from a MIDI keyboard. So we assign each note a unique fake "pitch" \, use makenote to generate the note-off messages \, and run [poly] on the resulting stream. We then discard both pitch and velocity (using the velocity only to strip note-offs) and rebuild the original message adding the voice number we just scored.; -#X text 832 612 updated for Pd version 0.52; -#X msg 684 425 read qlist-sampler.txt \, rewind \, tempo 1 \, bang; -#X obj 558 460 print comment; -#X msg 565 556 line 0 \, auto; -#X text 687 552 rewind and start automatically, f 16; -#X obj 881 567 text define -k seq; +#X connect 13 0 20 0; +#X connect 14 0 18 0; +#X connect 16 0 9 0; +#X connect 16 0 12 0; +#X connect 16 0 5 0; +#X connect 16 1 7 0; +#X connect 16 1 11 0; +#X connect 16 2 20 0; +#X connect 16 3 21 0; +#X connect 18 0 19 0; +#X connect 20 0 17 0; +#X connect 21 0 14 0; +#X restore 802 247 pd recorder; +#X msg 794 120 record 1; +#X msg 809 166 stop; +#X msg 802 143 record 2; +#X msg 815 189 reload; +#X msg 820 212 browse; +#X obj 786 292 declare -stdpath ./; +#X obj 547 262 pack f f f f f f f f; +#X obj 561 47 unpack f f f f f f f; +#X obj 547 296 clone -s 1 sampvoice 8; +#X text 18 410 The [poly] object essentially repeats pitch and velocity pairs to its output \, but also sending a voice number from its left outlet. To use it \, we unpack the 7 parameters \, calculate the voice number \, repack the message as 8 parameters with voice number first \, and [clone] routes to internal instances of the abstraction., f 61; +#X text 762 602 updated for Pd version 0.52; +#X msg 691 413 read qlist-sampler.txt \, rewind \, tempo 1 \, bang, f 23; +#X obj 568 447 print comment; +#X msg 495 546 line 0 \, auto; +#X text 617 542 rewind and start automatically, f 16; +#X obj 811 557 text define -k seq; #A set note 60 90 50 4 50 30 30 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 100 note 59 90 100 \; comment measure 1 \; 100 note 60 90 150 4 0 \; note 36 90 200 4 50 \; 200 note 48 90 250 4 0 \; note 40 90 200 4 50 \; note 43 90 200 4 50 \; 200 note 48 90 250 4 0 \; note 31 90 200 4 50 \; 200 note 55 90 100 \; note 41 90 200 \; note 43 90 200 \; 100 note 53 90 100 \; 100 note 52 90 100 \; note 36 90 200 \; 100 note 55 90 100 \; 100 note 60 90 100 \; note 40 90 200 \; note 43 90 200 \; 100 note 59 90 100 \; 100 note 60 90 100 \; note 25 90 200 \; 100 note 64 90 100 \; 100 note 62 90 100 \; note 39 90 200 \; note 43 90 200 \; 100 note 61 90 100 \; comment measure 2 \; 100 note 62 90 150 4 0 \; note 26 90 200 \; 200 note 50 90 250 4 50 \; note 41 90 200 \; note 42 90 200 \; 200 note 50 90 250 \; note 29 90 200 \; 200 note 50 90 100 \; note 30 90 200 \; note 44 90 200 \; note 48 90 200 \; 100 note 48 90 100 \; 100 note 47 90 100 \; note 31 90 200 \; note 43 90 200 \; note 47 90 200 \; 100 note 50 90 100 \; 100 note 55 90 100 \; note 34 90 200 \; note 42 90 200 \; note 46 90 200 \; 100 note 54 90 100 \; 100 note 55 90 200 \; note 35 90 200 \; note 42 90 200 \; note 45 90 200 \; 200 note 57 90 100 \; note 41 90 200 \; note 47 90 200 \; 100 note 59 90 100 \; comment measure 3 \; 100 note 60 90 100 \; note 24 90 200 \; note 40 90 200 \; note 48 90 200 4 0 \; 100 note 59 90 100 4 50 \; 100 note 57 90 100 \; 100 note 55 90 100 \; 100 note 57 90 100 \; note 28 90 200 \; note 38 90 200 \; note 46 90 200 \; 100 note 55 90 100 \; 100 note 53 90 100 \; 100 note 52 90 100 \; 100 note 53 90 100 \; note 29 90 100 \; note 36 90 100 \; note 45 90 100 \; 100 note 52 90 100 \; 100 note 50 90 100 \; note 29 90 300 \; note 36 90 300 \; note 45 90 300 \; 100 note 48 90 100 \; 100 note 50 90 100 \; 100 note 48 90 100 \; 100 note 47 90 100 \; note 29 90 300 \; note 38 90 300 \; note 44 90 300 4 0 \; 100 note 45 90 100 4 50 \; comment measure 4 \; 100 note 43 90 100 \; note 31 90 200 \; note 38 90 200 \; 100 note 48 90 100 \; 100 note 47 90 100 \; note 31 90 300 \; note 40 90 300 \; note 43 90 300 4 0 \; 100 note 50 90 100 4 50 \; 100 note 48 90 100 \; 100 note 52 90 100 \; 100 note 50 90 100 \; note 31 90 300 4 0 \; note 41 90 300 \; note 43 90 300 \; 100 note 53 90 100 4 50 \; 100 note 52 90 200 \; note 31 90 300 4 50 \; 200 note 48 90 200 \; note 19 90 200 4 50 \; note 29 90 200 4 50 \; note 36 90 200 4 50 \; 200 note 48 90 100 4 50 0 4000 \; note 12 90 300 \; note 28 90 300 \; note 36 90 300 \;; -#X obj 565 600 text sequence seq -g; -#X text 658 556 <--; -#X text 546 500 You can use [qlist] or the more modern [text sequence] object \, which can save its contents with the patch., f 64; -#X text 893 541 click to open:; -#X connect 10 0 37 0; +#X obj 495 590 text sequence seq -g; +#X text 588 546 <--; +#X text 493 492 You can use [qlist] or the more modern [text sequence] object \, which can save its contents with the patch.; +#X text 823 531 click to open:; +#X text 688 333 Lashed to the mast of his boat \, Ulysses hears beautiful singing. He begs his sailors to untie him..., f 39; +#X text 245 110 increment with [mod 1e+06] to make a note tag (acts like a MIDI pitch to identify the note to [poly]), f 29; +#X text 18 276 Here we take the previous patch and make it polyphonic \, with 8 voices. The single voice which we had before has been made into an abstraction \, [sampvoice] \, which we instantiate in 8 copies with the [clone] object. Earlier we used sends and receives to pass messages to "cutoff" \, etc \, but here if we did that the copies of [sampvoice] would be sending messages to each other \, so we combine the control and the audio computation in the [sampvoice] abstraction without using send and receive. Click on [clone] one to see how., f 61; +#X text 18 502 There's some bother because [poly] expects to track note on and note off messages separately as they would come from a MIDI keyboard. So we assign each note a unique fake "pitch" \, use [makenote] to generate the note-off messages \, and run [poly] on the resulting stream. We then discard both pitch and velocity for the note offs with [stripnoe] (using the velocity only to strip note-offs) and rebuild the original message adding the voice number we just scored., f 61; +#X connect 10 0 33 0; #X connect 11 0 12 0; -#X connect 11 1 36 1; +#X connect 11 1 32 1; #X connect 12 0 13 0; #X connect 12 0 15 0; #X connect 13 0 14 0; @@ -122,22 +119,22 @@ #X connect 15 1 16 1; #X connect 16 0 17 0; #X connect 16 2 17 1; -#X connect 17 0 36 0; -#X connect 22 0 44 0; -#X connect 30 0 29 0; -#X connect 31 0 29 0; -#X connect 32 0 29 0; -#X connect 33 0 29 0; -#X connect 34 0 29 0; -#X connect 36 0 39 0; -#X connect 37 0 11 0; -#X connect 37 1 36 2; -#X connect 37 2 15 2; -#X connect 37 2 36 3; -#X connect 37 3 36 4; -#X connect 37 4 36 5; -#X connect 37 5 36 6; -#X connect 37 6 36 7; -#X connect 39 0 26 0; -#X connect 43 0 21 0; -#X connect 45 0 48 0; +#X connect 17 0 32 0; +#X connect 22 0 38 0; +#X connect 26 0 25 0; +#X connect 27 0 25 0; +#X connect 28 0 25 0; +#X connect 29 0 25 0; +#X connect 30 0 25 0; +#X connect 32 0 34 0; +#X connect 33 0 11 0; +#X connect 33 1 32 2; +#X connect 33 2 15 2; +#X connect 33 2 32 3; +#X connect 33 3 32 4; +#X connect 33 4 32 5; +#X connect 33 5 32 6; +#X connect 33 6 32 7; +#X connect 34 0 23 0; +#X connect 37 0 21 0; +#X connect 39 0 42 0; diff --git a/doc/3.audio.examples/D12.sampler.bis.pd b/doc/3.audio.examples/D12.sampler.bis.pd index 6474970c..568cc03a 100644 --- a/doc/3.audio.examples/D12.sampler.bis.pd +++ b/doc/3.audio.examples/D12.sampler.bis.pd @@ -1,37 +1,36 @@ -#N canvas 153 58 1094 665 12; +#N canvas 206 66 1094 665 12; #X declare -stdpath ./; #N canvas 642 163 417 426 samples 0; #N canvas 0 0 450 300 (subpatch) 0; -#X array sample5 176403 float 0; -#X coords 0 1.02 176403 -1.02 200 130 1; +#X array sample5 155944 float 2; +#X coords 0 1.02 155944 -1.02 200 130 1; #X restore 116 45 graph; -#X text 125 352 ------ 4 seconds ------; #N canvas 0 0 450 300 (subpatch) 0; -#X array sample6 176403 float 0; -#X coords 0 1.02 176403 -1.02 200 130 1; +#X array sample6 39075 float 2; +#X coords 0 1.02 39075 -1.02 200 130 1; #X restore 116 210 graph; #X restore 481 531 pd samples; -#X text 745 463 sample number; +#X text 780 462 sample number; #X obj 542 118 poly 8 1; -#X obj 611 351 output~; +#X obj 611 341 output~; #X obj 542 143 swap; #X obj 542 190 route 0; #X obj 542 167 pack; -#X text 896 416 amplitude; -#X text 895 440 pitch; -#X text 814 349 ARGUMENTS FOR:; -#X text 747 391 pitch; -#X text 747 415 amplitude; -#X text 747 439 duration; +#X text 931 415 amplitude; +#X text 930 439 pitch; +#X text 849 348 ARGUMENTS FOR:; +#X text 782 390 pitch; +#X text 782 414 amplitude; +#X text 782 438 duration; #X text 41 9 POLY SAMPLER \, VERSION 2 FOR SEPARATE NOTE-ON/OFF MESSAGES; #X obj 597 56 r onoff; -#X text 895 373 ON/OFF TRANSITIONS:; -#X text 748 372 ENTIRE NOTES:; -#X text 895 395 tag; -#X text 745 490 sample onset; -#X text 745 516 rise time; -#X text 746 540 decay time; -#X text 892 465 (same other 4); +#X text 930 372 ON/OFF TRANSITIONS:; +#X text 783 371 ENTIRE NOTES:; +#X text 930 394 tag; +#X text 780 489 sample onset; +#X text 780 515 rise time; +#X text 781 539 decay time; +#X text 927 464 (same other 4); #X obj 773 154 f; #X obj 809 154 + 1; #X obj 783 180 mod 1e+06; @@ -40,10 +39,10 @@ #X obj 868 291 s onoff; #X obj 822 236 pipe; #X obj 822 259 pack; -#X msg 313 513 \; onoff 1 0; -#X msg 314 555 \; onoff 2 0; +#X msg 293 513 \; onoff 1 0; +#X msg 294 555 \; onoff 2 0; #X text 29 146 Messages to "onoff" require a tag \, which is a number shared between the note-on and note-off message so that we can track down the voice to turn it off. If you're using MIDI input \, you can just re-use the pitch as a tag., f 67; -#X text 91 593 single messages to do both as before:; +#X text 86 608 single messages to do both as before:, f 18; #X obj 597 81 unpack f f f f f f f; #X obj 611 250 pack f f f f f f f; #X obj 854 86 unpack f f f f f f f; @@ -63,20 +62,20 @@ #X msg 280 329 bang; #X obj 406 331 loadbang; #X obj 402 233 openpanel; -#X msg 402 205 bang; #X text 446 370 v-- re-read original samples; #X obj 242 168 route record stop reload browse; #X obj 406 452 soundfiler; -#X msg 406 394 read ../sound/bell.aiff sample5 \, read ../sound/voice2.wav sample6, f 33; #X msg 402 260 read \$1 sample5; #X obj 402 287 soundfiler; -#X text 440 205 <= browse for samples; #X text 228 21 record \, etc.; #X msg 242 48 record 1; #X msg 256 92 stop; #X msg 249 70 record 2; #X msg 262 114 reload; #X msg 267 136 browse; +#X msg 406 394 read -resize ../sound/bell.aiff sample5 \, read -resize ../sound/voice2.wav sample6, f 40; +#X obj 402 201 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 429 201 <-- browse for samples; #X connect 0 0 1 0; #X connect 1 0 3 0; #X connect 2 0 3 1; @@ -88,37 +87,37 @@ #X connect 9 0 7 0; #X connect 10 0 5 0; #X connect 11 0 5 0; -#X connect 12 0 18 0; -#X connect 13 0 19 0; -#X connect 14 0 13 0; -#X connect 16 0 8 0; -#X connect 16 0 11 0; -#X connect 16 0 4 0; -#X connect 16 1 6 0; -#X connect 16 1 10 0; -#X connect 16 2 18 0; -#X connect 16 3 14 0; -#X connect 18 0 17 0; -#X connect 19 0 20 0; -#X connect 23 0 16 0; -#X connect 24 0 16 0; +#X connect 12 0 25 0; +#X connect 13 0 17 0; +#X connect 15 0 8 0; +#X connect 15 0 11 0; +#X connect 15 0 4 0; +#X connect 15 1 6 0; +#X connect 15 1 10 0; +#X connect 15 2 25 0; +#X connect 15 3 26 0; +#X connect 17 0 18 0; +#X connect 20 0 15 0; +#X connect 21 0 15 0; +#X connect 22 0 15 0; +#X connect 23 0 15 0; +#X connect 24 0 15 0; #X connect 25 0 16 0; -#X connect 26 0 16 0; -#X connect 27 0 16 0; +#X connect 26 0 13 0; #X restore 481 555 pd recorder; -#X obj 481 595 declare -stdpath ./; +#X obj 586 422 declare -stdpath ./; #X obj 611 296 clone -s 1 sampvoice2 8; #X msg 542 217 \$1 0; #X msg 588 218 \$2; #X text 822 606 updated for Pd version 0.52; #X msg 93 513 \; onoff 1 90 60 5 0 0 100; #X msg 94 555 \; onoff 2 90 48 5 0 0 100; -#X msg 94 612 \; note 51 90 1000 5 0 0 100; -#X text 92 493 separate messages for note on and off:; +#X msg 224 608 \; note 51 90 1000 5 0 0 100; +#X text 100 488 separate messages for note on and off:; #X text 30 39 Here is a variation on the polyphonic sampler \, which can take separate messages to start and stop notes (so that you can attach it to a MIDI keyboard \, for example.) "Note" messages act as before \, but in an intermediate step they are split onto note-on and note-off messages \, sent to "onoff". You can alternatively send messages straight to "onoff" if you don't know the duration in advance., f 67; #X text 29 215 Messages to "onoff" whose amplitude is zero are note-off messages (the other parameters of note-off messages are ignored). The [sampvoice2] abstraction is a modification of [sampvoice] which looks at the amplitude field to decide whether to begin or end a note., f 67; #X text 29 295 To convert "note" messages to pairs of "onoff" messages \, first a counter generates a tag. The [pipe] object delays a copy of the tag \, which the following [pack] object converts into a note-off message (a pair of numbers \, the tag and a zero.), f 67; -#X text 29 361 Under [r onoff] \, the [poly] object allocates a voice number \, putting it out paired with velocity. After swapping the two and packing them into a single message \, the amplitude is checked against zero by the [route 0] object. If zero \, the "\$1 0" message outputs a list with "voice number" and "0". Otherwise \, the "\$2" retrieves the voice number from [poly] which gets packed in with the note data and routed to the appropriate sampvoice2 [clone]., f 67; +#X text 29 361 Under [r onoff] \, the [poly] object allocates a voice number \, putting it out paired with velocity. After swapping the two and packing them into a single message \, the amplitude is checked against zero by the [route 0] object. If zero \, the "\$1 0" message outputs a list with "voice number" and "0". Otherwise \, the "\$2" retrieves the voice number from [poly] which gets packed in with the note data and routed to the appropriate [sampvoice2] copy inside [clone]., f 67; #X connect 2 0 4 0; #X connect 2 2 4 1; #X connect 4 0 6 0; diff --git a/doc/3.audio.examples/D13.additive.qlist.pd b/doc/3.audio.examples/D13.additive.qlist.pd index d041b3d6..db1ea1d7 100644 --- a/doc/3.audio.examples/D13.additive.qlist.pd +++ b/doc/3.audio.examples/D13.additive.qlist.pd @@ -1,53 +1,53 @@ -#N canvas 490 29 705 606 12; +#N canvas 421 53 665 605 12; #X declare -stdpath ./; -#X obj 456 354 qlist; -#X msg 540 302 read qlist.txt; -#X obj 540 257 loadbang; -#X text 313 140 start; -#X text 550 281 reread file; -#X msg 456 212 rewind; -#X msg 524 212 next; -#X msg 305 164 tempo 1 \, bang; -#X text 82 20 USING QLIST TO SEQUENCE AN OSCILLATOR BANK; -#X text 468 191 single step; -#X obj 225 323 r #; -#X obj 83 227 output~; -#X obj 523 21 declare -stdpath ./; -#X obj 83 178 clone -s 1 osc-voice 8; -#X text 57 61 Here is an eight voice additive synthesis patch controlled by a [qlist]. Open a text editor on the file \, "qlist.txt" \, to see how the oscillators' amplitudes and frequencies are specified. The abstraction \, "osc-voice" is loaded 8 times inside [clone] and shows an effective way to make patches react to qlists but also to mousing., f 81; -#X text 428 572 updated for Pd version 0.52; -#X text 450 506 click to open:; -#X obj 438 532 text define -k additive; -#A set # This is a qlist for patch number 68 \, which demonstrates an oscillator bank. \; # comments start with a "#" which must be followed by a space. The comment is terminated by a semicolon like this: \; # first an arpeggio. You can group them in lines as you please. The 100s at the beginnings of lines are delay times. \; pit1 89 \; amp1 80 \; 100 pit2 72 \; amp2 80 \; 100 pit3 57 \; amp3 90 \; 100 pit4 84 \; amp4 78 \; 100 pit5 74 \; amp5 74 \; 100 pit6 73 \; amp6 74 \; 100 pit7 100 \; amp7 78 \; 100 pit8 37 \; amp8 95 \; # after a 600-msec rest \, gliss four of the oscillators to new frequencies. \; 600 pit1 70 1000 \; 300 pit8 40 1000 \; 300 pit4 89 1000 \; 300 pit7 95 1000 \; # a second later \, turn them off with decay time 1500 \; 1000 amp1 0 1500 \; amp2 0 1500 \; amp3 0 1500 \; amp4 0 1500 \; amp5 0 1500 \; amp6 0 1500 \; amp7 0 1500 \; amp8 0 1500 \; # and re-attack them.. \; 1000 amp1 85 5 \; amp2 85 5 \; amp3 85 5 \; amp4 90 5 \; amp5 85 5 \; amp6 85 5 \; amp7 90 5 \; amp8 85 5 \; # this time \, try varying decay times. \; 10 amp1 0 2000 \; amp2 0 2000 \; amp3 0 2000 \; amp4 0 500 \; amp5 0 1000 \; amp6 0 1000 \; amp7 0 500 \; amp8 0 4000 \;; -#X obj 127 560 text sequence additive -g; -#X obj 225 350 print comments; -#X msg 103 391 1; -#X msg 137 475 step; -#X msg 127 447 line 0; -#X text 179 446 <-- rewind; -#X text 175 476 <-- step through; -#X text 99 325 this is where comments go to:, f 15; -#X msg 411 164 tempo 5 \, bang; -#X msg 160 531 stop; -#X text 201 531 <-- stop; -#X msg 137 391 5; -#X msg 103 417 tempo \$1 permsec; -#X msg 153 503 line 0 \, auto; -#X text 250 500 <-- rewind and play; -#X text 278 517 automatically, f 15; -#X text 402 407 You can also use the more modern [text sequence] object instead which is more powerful. It can also save contents of the sequence with the patch., f 32; +#X obj 422 354 qlist; +#X msg 506 302 read qlist.txt; +#X obj 506 257 loadbang; +#X text 279 140 start; +#X text 516 281 reread file; +#X msg 422 212 rewind; +#X msg 490 212 next; +#X msg 271 164 tempo 1 \, bang; +#X text 48 20 USING QLIST TO SEQUENCE AN OSCILLATOR BANK; +#X text 434 191 single step; +#X obj 203 316 r #; +#X obj 49 227 output~; +#X obj 489 21 declare -stdpath ./; +#X obj 49 178 clone -s 1 osc-voice 8; +#X text 415 565 updated for Pd version 0.52; +#X text 436 490 click to open:; +#X obj 421 516 text define -k additive; +#A set # This is the contents of a [text] object for the D13.additive.qlist patch \, which demonstrates an oscillator bank. \; # comments start with a "#" which must be followed by a space. The comment is terminated by a semicolon \; # first an arpeggio. You can group them in lines as you please. The 100s at the beginnings of lines are delay times. \; pit1 89 \; amp1 80 \; 100 pit2 72 \; amp2 80 \; 100 pit3 57 \; amp3 90 \; 100 pit4 84 \; amp4 78 \; 100 pit5 74 \; amp5 74 \; 100 pit6 73 \; amp6 74 \; 100 pit7 100 \; amp7 78 \; 100 pit8 37 \; amp8 95 \; # after a 600-msec rest \, gliss four of the oscillators to new frequencies. \; 600 pit1 70 1000 \; 300 pit8 40 1000 \; 300 pit4 89 1000 \; 300 pit7 95 1000 \; # a second later \, turn them off with decay time 1500 \; 1000 amp1 0 1500 \; amp2 0 1500 \; amp3 0 1500 \; amp4 0 1500 \; amp5 0 1500 \; amp6 0 1500 \; amp7 0 1500 \; amp8 0 1500 \; # and re-attack them.. \; 1000 amp1 85 5 \; amp2 85 5 \; amp3 85 5 \; amp4 90 5 \; amp5 85 5 \; amp6 85 5 \; amp7 90 5 \; amp8 85 5 \; # this time \, try varying decay times. \; 10 amp1 0 2000 \; amp2 0 2000 \; amp3 0 2000 \; amp4 0 500 \; amp5 0 1000 \; amp6 0 1000 \; amp7 0 500 \; amp8 0 4000 \;; +#X obj 93 560 text sequence additive -g; +#X obj 203 343 print comments; +#X msg 69 391 1; +#X msg 103 475 step; +#X msg 93 447 line 0; +#X text 145 446 <-- rewind; +#X text 141 476 <-- step through; +#X text 87 318 this is where comments go to:, f 15; +#X msg 377 164 tempo 5 \, bang; +#X msg 126 531 stop; +#X text 167 531 <-- stop; +#X msg 103 391 5; +#X msg 69 417 tempo \$1 permsec; +#X msg 119 503 line 0 \, auto; +#X text 216 500 <-- rewind and play; +#X text 244 517 automatically, f 15; +#X text 356 405 You can also use the more modern [text sequence] object instead which is more powerful. It can also save contents of the sequence with the patch., f 39; +#X text 23 61 Here is an eight voice additive synthesis patch controlled by a [qlist]. Open a text editor on the file \, "qlist.txt" \, to see how the oscillators' amplitudes and frequencies are specified. The abstraction \, [osc-voice] is loaded 8 times inside [clone] and shows an effective way to make patches react to [qlist] objects but also to mousing., f 81; #X connect 1 0 0 0; #X connect 2 0 1 0; #X connect 5 0 0 0; #X connect 6 0 0 0; #X connect 7 0 0 0; -#X connect 10 0 19 0; +#X connect 10 0 18 0; #X connect 13 0 11 0; -#X connect 20 0 30 0; -#X connect 21 0 18 0; -#X connect 22 0 18 0; -#X connect 26 0 0 0; -#X connect 27 0 18 0; -#X connect 29 0 30 0; -#X connect 30 0 18 0; -#X connect 31 0 18 0; +#X connect 19 0 29 0; +#X connect 20 0 17 0; +#X connect 21 0 17 0; +#X connect 25 0 0 0; +#X connect 26 0 17 0; +#X connect 28 0 29 0; +#X connect 29 0 17 0; +#X connect 30 0 17 0; diff --git a/doc/3.audio.examples/D14.vibrato.pd b/doc/3.audio.examples/D14.vibrato.pd index 192ed388..58b22380 100644 --- a/doc/3.audio.examples/D14.vibrato.pd +++ b/doc/3.audio.examples/D14.vibrato.pd @@ -1,59 +1,58 @@ -#N canvas 480 23 709 710 12; +#N canvas 423 68 717 685 12; #X declare -stdpath ./; -#X obj 55 265 r trigger; -#X obj 55 483 *~; -#X obj 55 511 *~; -#X floatatom 93 313 4 0 100 0 - - - 0; -#X msg 478 516 \; trigger 0; -#X obj 55 288 unpack; -#X floatatom 55 313 4 0 100 0 - - - 0; -#X obj 55 564 +~ 0.3; -#X obj 55 590 cos~; -#X obj 55 538 osc~; -#X obj 93 337 mtof; -#X obj 93 359 sqrt; -#X obj 93 381 sqrt; -#X msg 478 439 \; trigger 1 60; -#X msg 478 476 \; trigger 1 72; -#X text 566 541 is optional; +#X obj 55 235 r trigger; #X obj 55 453 *~; -#X obj 225 419 +~ 1; +#X obj 55 481 *~; +#X floatatom 93 283 4 0 100 0 - - - 0; +#X msg 478 486 \; trigger 0; +#X obj 55 258 unpack; +#X floatatom 55 283 4 0 100 0 - - - 0; +#X obj 55 534 +~ 0.3; +#X obj 55 560 cos~; +#X obj 55 508 osc~; +#X obj 93 307 mtof; +#X obj 93 329 sqrt; +#X obj 93 351 sqrt; +#X msg 478 409 \; trigger 1 60; +#X msg 478 446 \; trigger 1 72; +#X obj 55 423 *~; +#X obj 225 389 +~ 1; #N canvas 0 0 450 300 (subpatch) 0; #X array array62 131 float 1; #A 0 0.970031 1 0.970031 0.881921 0.740952 0.555571 0.336891 0.0980184 -0.146729 -0.382682 -0.595698 -0.773009 -0.88 -0.9 -0.92 -0.92 -0.85773 -0.707109 -0.514106 -0.290288 -0.0490716 0.195086 0.427551 0.63439 0.803205 0.86 0.88 0.88 0.88 0.84 0.82 0.471402 0.242986 6.63397e-06 -0.242974 -0.471391 -0.671554 -0.831465 -0.941541 -0.995184 -0.989178 -0.923883 -0.803213 -0.68 -0.42 -0.24 0.1 0.4 0.6 0.7071 0.857723 0.956937 0.998795 0.980787 0.903994 0.773018 0.595708 0.382694 0.146742 -0.0980052 -0.336878 -0.55556 -0.7 -0.8 -0.88 -0.88 -0.88 -0.84 -0.82 -0.555582 -0.336903 -0.0980316 0.146716 0.38267 0.595687 0.773001 0.903983 0.980782 0.998796 0.956945 0.857737 0.707119 0.514117 0.290301 0.0490849 -0.195073 -0.427539 -0.63438 -0.803197 -0.923873 -0.989174 -0.995187 -0.94155 -0.83148 -0.671573 -0.471414 -0.242999 -1.99019e-05 0.242961 0.471379 0.671544 0.831458 0.88 0.9 0.9 0.88 0.803221 0.63441 0.08 -0.14 -0.28 -0.48 -0.64 -0.72 -0.857717 -0.956933 -0.998794 -0.98079 -0.904 -0.773026 -0.595719 -0.382706 -0.146755 0.097992 0.336866 0.555549 0.740934 0.881909 0.970025 1 0.970038; #X coords 0 1 130 -1 200 100 1; -#X restore 236 532 graph; -#X obj 225 358 tabosc4~ array62; -#X floatatom 225 306 5 0 0 0 - - - 0; -#X obj 225 333 / 6; -#X obj 225 395 *~; -#X floatatom 379 335 4 0 0 0 - - - 0; -#X text 242 462 since we'll multiply \,; -#X text 241 477 vibrato output should; -#X text 241 494 be centered at 1 \, not 0; -#X text 261 399 multiply by vib depth; -#X obj 379 363 / 6923; -#X text 89 454 apply vibrato; -#X text 93 482 fourth; -#X text 96 498 power; -#X text 117 560 waveform; -#X text 118 540 simple; -#X text 431 365 4/(exp(log(2)/1200)-1); -#X text 435 346 conversion factor is; -#X text 372 297 vibrato depth; -#X text 371 314 in cents; -#X text 216 268 vibrato speed; -#X text 215 285 in Hertz; -#X obj 55 406 adsr 0 100 200 100 300; -#X obj 55 622 output~; +#X restore 238 496 graph; +#X obj 225 328 tabosc4~ array62; +#X floatatom 225 276 5 0 0 0 - - - 0; +#X obj 225 303 / 6; +#X obj 225 365 *~; +#X floatatom 379 305 4 0 0 0 - - - 0; +#X text 244 426 since we'll multiply \,; +#X text 243 441 vibrato output should; +#X text 243 458 be centered at 1 \, not 0; +#X text 261 369 multiply by vib depth; +#X obj 379 333 / 6923; +#X text 89 424 apply vibrato; +#X text 93 452 fourth; +#X text 96 468 power; +#X text 117 530 waveform; +#X text 118 510 simple; +#X text 431 335 4/(exp(log(2)/1200)-1); +#X text 435 316 conversion factor is; +#X text 372 267 vibrato depth; +#X text 371 284 in cents; +#X text 216 238 vibrato speed; +#X text 215 255 in Hertz; +#X obj 55 376 adsr 0 100 200 100 300; +#X obj 55 592 output~; #X text 75 14 USING ADSRS FOR PORTAMENTO AND ADDING VIBRATO TOO; -#X text 83 54 Portamento can be treated as a special case of an ADSR envelope \, with 100 percent sustain. Vibrato is properly computed in units of pitch \, but it's also possible to do the job without having to convert from pitch to frequency units at the audio rate. To do this we just raise the "pitch" to the fourth power \, so that it acts pseudo-exponentially. Rather than add vibrato to the ADSR output \, we multiply a signal which controls relative frequency. The relative frequency change is one plus an oscillator., f 64; -#X text 479 662 updated for Pd version 0.39; -#X text 83 181 The table below holds 6 cycles of vibrato with small variations to get a not-exactly-repeating vibrato. We thus have to divide vibrato frequency by six. You can just use a sine or triangle wave if you prefer., f 64; -#X text 576 444 <= middle C; -#X text 576 482 <= octave up; -#X text 560 523 <= release; -#X obj 515 21 declare -stdpath ./; +#X text 25 56 Portamento can be treated as a special case of an ADSR envelope \, with 100 percent sustain. Vibrato is properly computed in units of pitch \, but it's also possible to do the job without having to convert from pitch to frequency units at the audio rate. To do this we just raise the "pitch" to the fourth power \, so that it acts pseudo-exponentially. Rather than add vibrato to the ADSR output \, we multiply a signal which controls relative frequency. The relative frequency change is one plus an oscillator., f 94; +#X text 479 632 updated for Pd version 0.39; +#X text 25 152 The table below holds 6 cycles of vibrato with small variations to get a not-exactly-repeating vibrato. We thus have to divide vibrato frequency by six. You can just use a sine or triangle wave if you prefer., f 94; +#X obj 238 622 declare -stdpath ./; +#X text 576 414 <-- middle C; +#X text 576 452 <-- octave up; +#X text 550 493 <-- release is optional, f 11; #X connect 0 0 5 0; #X connect 1 0 2 0; #X connect 1 0 2 1; @@ -61,20 +60,20 @@ #X connect 3 0 10 0; #X connect 5 0 6 0; #X connect 5 1 3 0; -#X connect 6 0 40 0; +#X connect 6 0 39 0; #X connect 7 0 8 0; -#X connect 8 0 41 0; +#X connect 8 0 40 0; #X connect 9 0 7 0; #X connect 10 0 11 0; #X connect 11 0 12 0; -#X connect 12 0 40 1; -#X connect 16 0 1 0; -#X connect 16 0 1 1; -#X connect 17 0 16 1; -#X connect 19 0 22 0; -#X connect 20 0 21 0; -#X connect 21 0 19 0; -#X connect 22 0 17 0; -#X connect 23 0 28 0; -#X connect 28 0 22 1; -#X connect 40 0 16 0; +#X connect 12 0 39 1; +#X connect 15 0 1 0; +#X connect 15 0 1 1; +#X connect 16 0 15 1; +#X connect 18 0 21 0; +#X connect 19 0 20 0; +#X connect 20 0 18 0; +#X connect 21 0 16 0; +#X connect 22 0 27 0; +#X connect 27 0 21 1; +#X connect 39 0 15 0; diff --git a/doc/3.audio.examples/E01.spectrum.pd b/doc/3.audio.examples/E01.spectrum.pd index e4b0c674..d64db91f 100644 --- a/doc/3.audio.examples/E01.spectrum.pd +++ b/doc/3.audio.examples/E01.spectrum.pd @@ -1,42 +1,41 @@ -#N canvas 408 23 764 723 12; +#N canvas 372 54 733 807 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array E01-signal 882 float 0; -#X coords 0 5 882 -5 200 130 1; -#X restore 460 67 graph; -#X obj 134 325 hip~ 5; +#X coords 0 6 882 -6 247 147 1 0 0; +#X restore 417 49 graph; +#X obj 119 338 hip~ 5; #N canvas 0 0 450 300 (subpatch) 0; -#X array E01-spectrum 128 float 0; -#X coords 0 4300 127 -40 257 130 1; -#X restore 416 256 graph; -#N canvas 436 82 525 608 fft 0; -#X obj 45 77 inlet~; -#X obj 111 229 inlet; -#X obj 45 107 rfft~; -#X obj 45 140 *~; -#X obj 76 140 *~; -#X obj 45 170 sqrt~; -#X obj 111 263 tabwrite~ E01-spectrum; -#X obj 332 109 block~ 4096 1; -#X obj 45 196 biquad~ 0 0 0 0 1; -#X text 109 108 Fourier series; -#X text 114 161 magnitude; -#X text 112 146 calculate; -#X text 38 9 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later.; -#X text 109 77 signal to analyze; -#X text 181 188 delay two samples; -#X text 180 204 for better graphing; -#X obj 106 433 samplerate~; -#X obj 106 410 bng 18 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; -#X floatatom 106 480 5 0 0 0 - - - 0; -#X obj 106 456 / 256; -#X obj 106 386 loadbang; -#X floatatom 106 549 5 0 0 0 - - - 0; -#X obj 114 502 s fundamental; -#X obj 106 525 ftom; -#X text 31 314 At load time \, calculate a good choice of fundamental frequency for showing spectra: the 16th bin in a 4096-point spectrum \, so SR*16/4096 or SR/256., f 62; -#X text 161 231 "bang" into this inlet to graph it; -#X text 148 549 <= just out of curiosity \, here's the pitch; +#X array E01-spectrum 90 float 0; +#X coords 0 4300 89 -40 255 130 1 0 0; +#X restore 412 290 graph; +#N canvas 310 109 540 689 fft 0; +#X obj 163 92 inlet~; +#X obj 298 92 inlet; +#X obj 163 122 rfft~; +#X obj 163 155 *~; +#X obj 195 155 *~; +#X obj 163 185 sqrt~; +#X obj 298 301 tabwrite~ E01-spectrum; +#X obj 163 222 biquad~ 0 0 0 0 1; +#X text 53 122 Fourier series; +#X text 36 10 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later., f 66; +#X text 31 93 signal to analyze; +#X obj 176 481 samplerate~; +#X obj 176 455 bng 18 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X floatatom 176 533 5 0 0 0 - - - 0; +#X obj 176 506 / 256; +#X obj 176 431 loadbang; +#X floatatom 176 615 9 0 0 0 - - - 0; +#X obj 184 561 s fundamental; +#X obj 176 588 ftom; +#X text 66 357 At load time \, calculate a good choice of fundamental frequency for showing spectra: the 16th bin in a 4096-point spectrum \, so SR*16/4096 or SR/256., f 62; +#X text 355 87 "bang" into this inlet to graph it, f 18; +#X text 253 616 <-- just out of curiosity \, here's the pitch, f 17; +#X obj 354 214 block~ 4096; +#X text 79 214 delay two samples for better graphing, f 10; +#X text 86 162 calculate magnitude, f 9; +#X text 351 174 FFT Window size of 4096, f 12; #X connect 0 0 2 0; #X connect 1 0 6 0; #X connect 2 0 3 0; @@ -45,108 +44,105 @@ #X connect 2 1 4 1; #X connect 3 0 5 0; #X connect 4 0 5 0; -#X connect 5 0 8 0; -#X connect 8 0 6 0; -#X connect 16 0 19 0; -#X connect 17 0 16 0; -#X connect 18 0 22 0; -#X connect 18 0 23 0; -#X connect 19 0 18 0; -#X connect 20 0 17 0; -#X connect 23 0 21 0; -#X restore 146 290 pd fft; -#X text 480 199 ---- 0.02 seconds ----; -#X obj 206 255 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 134 359 output~; -#X obj 206 290 tabwrite~ E01-signal; -#X text 542 690 updated for Pd version 0.37; -#X text 447 389 1; -#X text 481 389 2; -#X text 513 389 3; -#X text 545 389 4; -#X text 578 389 5; -#X text 608 389 6; -#X text 639 389 7; -#X text 415 389 0; -#X text 462 408 -- partial number --; -#X text 662 123 0; -#X obj 134 56 r fundamental; -#X obj 48 118 osc~; -#X obj 48 168 *~; -#X obj 91 118 osc~; -#X obj 91 168 *~; -#X obj 134 118 osc~; -#X obj 134 168 *~; -#X obj 134 95 * 2; -#X obj 177 118 osc~; -#X obj 177 168 *~; -#X obj 220 118 osc~; -#X obj 220 168 *~; -#X obj 263 118 osc~; -#X obj 263 168 *~; -#X obj 48 95 * 0; -#X obj 91 95 * 1; -#X obj 177 95 * 3; -#X obj 220 95 * 4; -#X obj 263 95 * 5; -#X text 324 159 for each; -#X text 326 175 partial; -#X text 391 105 WAVEFORM; -#X text 509 217 SPECTRUM; -#X text 46 445 The next series of patches demonstrates various kinds of modulation: AM \, waveshaping \, and FM. We will need a tool for graphing spectra which is introduced here. In this patch the signal to be analyzed is a simple sum of up to six partials of a fundamental frequency (which is 172 Hz \, close to F below middle C \, if your sample rate happens to be 44100 Hz. The fundamental is chosen to agree with the analysis patch ("pd FFT") and is computed within it)., f 97; -#X text 46 526 The partials are numbered 0 through 5 \, where 0 means DC \, or zero frequency \, 1 is the fundamental \, and so on. The toggle switches allow you to turn them on and off separately. You have to press the "click to graph" button to update the two graphs., f 97; -#X text 676 374 0; -#X text 674 253 1; -#X text 675 312 0.5; -#X text 46 577 The upper graph is just the (time domain) waveform \, about four periods long. The lower graph is the magnitude spectrum. Its peaks are the magnitudes of the partials. Note that a DC signal of amplitude one is considered a partial of magnitude 1 \, but the other partials \, which have peak amplitudes of 1 (and RMS 0.707) \, have peak magnitudes of only 0.5 in the spectrum., f 97; -#X obj 134 229 *~ 1; -#X text 662 63 5; -#X text 663 183 -5; -#X text 174 228 sum; -#X text 57 11 GRAPHING SPECTRA OF AUDIO SIGNALS; -#X text 305 143 <= On/Off; -#X obj 584 20 declare -stdpath ./; -#X text 229 254 <-- click to graph; -#X text 46 644 Here we're introducing a new feature: multiple signals connected to a signal inlet (as in the [*~ 1]) are added. This is the most convenient way to sum the six partials., f 96; -#X obj 66 143 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 109 143 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 152 143 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 195 143 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 238 143 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 281 143 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X connect 5 0 7 0; +#X connect 7 0 6 0; +#X connect 11 0 14 0; +#X connect 12 0 11 0; +#X connect 13 0 17 0; +#X connect 13 0 18 0; +#X connect 14 0 13 0; +#X connect 15 0 12 0; +#X connect 18 0 16 0; +#X restore 131 303 pd fft; +#X text 472 207 ---- 0.02 seconds ----; +#X obj 191 268 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 119 372 output~; +#X obj 191 303 tabwrite~ E01-signal; +#X text 506 763 updated for Pd version 0.37; +#X text 458 423 1; +#X text 504 423 2; +#X text 549 423 3; +#X text 595 423 4; +#X text 641 423 5; +#X text 413 423 0; +#X text 673 114 0; +#X obj 119 65 r fundamental; +#X obj 33 131 osc~; +#X obj 33 185 *~; +#X obj 76 131 osc~; +#X obj 76 185 *~; +#X obj 119 131 osc~; +#X obj 119 185 *~; +#X obj 162 131 osc~; +#X obj 162 185 *~; +#X obj 205 131 osc~; +#X obj 205 185 *~; +#X obj 248 131 osc~; +#X obj 248 185 *~; +#X text 547 17 WAVEFORM; +#X text 672 408 0; +#X text 670 287 1; +#X text 671 346 0.5; +#X text 25 643 The upper graph is just the (time domain) waveform \, about four periods long. The lower graph is the magnitude spectrum. Its peaks are the magnitudes of the partials. Note that a DC signal of amplitude one is considered a partial of magnitude 1 \, but the other partials \, which have peak amplitudes of 1 (and RMS 0.707) \, have peak magnitudes of only 0.5 in the spectrum., f 95; +#X obj 119 242 *~ 1; +#X text 85 242 sum; +#X text 50 22 GRAPHING SPECTRA OF AUDIO SIGNALS; +#X obj 112 450 declare -stdpath ./; +#X text 214 267 <-- click to graph; +#X text 25 708 Here we're introducing a new feature: multiple signals connected to a signal inlet (as in the [*~ 1]) are added. This is the most convenient way to sum the six partials., f 95; +#X obj 51 160 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 94 160 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 137 160 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 180 160 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 223 160 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 266 160 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X text 672 46 6; +#X text 668 185 -6; +#X text 25 498 The next series of patches demonstrates various kinds of modulation: AM \, waveshaping \, and FM. We will need a tool for graphing spectra which is introduced here. In this patch the signal to be analyzed is a simple sum of up to six partials of a fundamental frequency (which is 172 Hz \, close to F below middle C \, if your sample rate happens to be 44100 Hz. The fundamental is chosen to agree with the analysis patch ([pd FFT]) and is computed within it., f 95; +#X obj 33 104 * 0; +#X obj 76 104 * 1; +#X obj 119 104 * 2; +#X obj 162 104 * 3; +#X obj 205 104 * 4; +#X obj 248 104 * 5; +#X text 25 577 The partials are the multipliers in the [*] objects and go from 0 through 5 \, where 0 means DC (or 0 Hz frequency) \, 1 is the fundamental \, and so on. The toggle switches allow you to turn them on and off separately. You have to press the "click to graph" button to update the two graphs., f 95; +#X text 290 160 <--; +#X text 316 160 On/Off for each partial, f 8; +#X text 538 262 SPECTRAL ANALYSIS; +#X text 449 452 ------ partial number ------; #X connect 1 0 6 0; #X connect 5 0 3 1; #X connect 5 0 7 0; -#X connect 19 0 33 0; -#X connect 19 0 34 0; -#X connect 19 0 26 0; -#X connect 19 0 35 0; -#X connect 19 0 36 0; -#X connect 19 0 37 0; -#X connect 20 0 21 0; -#X connect 21 0 48 0; -#X connect 22 0 23 0; -#X connect 23 0 48 0; -#X connect 24 0 25 0; -#X connect 25 0 48 0; -#X connect 26 0 24 0; +#X connect 16 0 49 0; +#X connect 16 0 50 0; +#X connect 16 0 51 0; +#X connect 16 0 52 0; +#X connect 16 0 53 0; +#X connect 16 0 54 0; +#X connect 17 0 18 0; +#X connect 18 0 34 0; +#X connect 19 0 20 0; +#X connect 20 0 34 0; +#X connect 21 0 22 0; +#X connect 22 0 34 0; +#X connect 23 0 24 0; +#X connect 24 0 34 0; +#X connect 25 0 26 0; +#X connect 26 0 34 0; #X connect 27 0 28 0; -#X connect 28 0 48 0; -#X connect 29 0 30 0; -#X connect 30 0 48 0; -#X connect 31 0 32 0; -#X connect 32 0 48 0; -#X connect 33 0 20 0; -#X connect 34 0 22 0; -#X connect 35 0 27 0; -#X connect 36 0 29 0; -#X connect 37 0 31 0; -#X connect 48 0 3 0; -#X connect 48 0 1 0; -#X connect 48 0 7 0; -#X connect 57 0 21 1; -#X connect 58 0 23 1; -#X connect 59 0 25 1; -#X connect 60 0 28 1; -#X connect 61 0 30 1; -#X connect 62 0 32 1; +#X connect 28 0 34 0; +#X connect 34 0 3 0; +#X connect 34 0 1 0; +#X connect 34 0 7 0; +#X connect 40 0 18 1; +#X connect 41 0 20 1; +#X connect 42 0 22 1; +#X connect 43 0 24 1; +#X connect 44 0 26 1; +#X connect 45 0 28 1; +#X connect 49 0 17 0; +#X connect 50 0 19 0; +#X connect 51 0 21 0; +#X connect 52 0 23 0; +#X connect 53 0 25 0; +#X connect 54 0 27 0; diff --git a/doc/3.audio.examples/E02.ring.modulation.pd b/doc/3.audio.examples/E02.ring.modulation.pd index 30314216..870a283f 100644 --- a/doc/3.audio.examples/E02.ring.modulation.pd +++ b/doc/3.audio.examples/E02.ring.modulation.pd @@ -1,28 +1,26 @@ -#N canvas 456 23 742 699 12; +#N canvas 425 38 742 699 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array E02-signal 882 float 0; -#X coords 0 5 882 -5 200 130 1; -#X restore 482 84 graph; +#X coords 0 6 882 -6 257 131 1 0 0; +#X restore 424 84 graph; #X obj 115 370 hip~ 5; #N canvas 0 0 450 300 (subpatch) 0; #X array E02-spectrum 128 float 0; #X coords 0 4300 127 -40 257 130 1; -#X restore 403 280 graph; -#X text 500 215 ---- 0.02 seconds ----; -#X obj 189 348 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X restore 404 291 graph; +#X obj 189 349 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 115 411 output~; -#X text 474 670 updated for Pd version 0.37; -#X text 434 413 1; -#X text 468 413 2; -#X text 500 413 3; -#X text 532 413 4; -#X text 565 413 5; -#X text 595 413 6; -#X text 626 413 7; -#X text 402 413 0; -#X text 457 432 -- partial number --; -#X text 684 138 0; +#X text 482 668 updated for Pd version 0.37; +#X text 435 424 1; +#X text 469 424 2; +#X text 501 424 3; +#X text 533 424 4; +#X text 566 424 5; +#X text 596 424 6; +#X text 627 424 7; +#X text 403 424 0; +#X text 686 141 0; #X obj 116 54 r fundamental; #X obj 29 112 osc~; #X obj 29 162 *~; @@ -42,13 +40,11 @@ #X obj 159 89 * 3; #X obj 202 89 * 4; #X obj 245 89 * 5; -#X text 572 55 WAVEFORM; -#X text 514 257 SPECTRUM; -#X text 663 396 0; -#X text 661 275 1; -#X text 662 334 0.5; -#X text 684 78 5; -#X text 685 198 -5; +#X text 582 54 WAVEFORM; +#X text 552 268 SPECTRUM; +#X text 664 407 0; +#X text 662 286 1; +#X text 663 345 0.5; #X obj 116 239 *~; #X text 307 120 partials; #X obj 234 270 osc~; @@ -58,18 +54,16 @@ #X text 306 177 modulation; #X text 302 192 frequency in; #X text 42 14 RING MODULATION: multiplying a complex tone by a sinusoid; -#X obj 189 303 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 189 301 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X obj 189 325 metro 500; -#X text 63 489 Now we ring modulate the signal by multiplying it by another sinusoid. The modulation frequency is controlled in steps of f/16 where "f" is the fundamental frequency \, giving roughly 11 Hz. per step. Note that if the modulation frequency is set to zero we can't predict the overall amplitude because it depends on what phase the modulation oscillator happened to have at that moment., f 89; #X text 63 568 If you choose a multiple of the fundamental as a modulation frequency (16 \, 32 \, 48 \, 64 \, ... "steps") the result is again periodic at the original frequency. If you select a half-integer times the fundamental (8 \, 24 \, 40 \, ... steps) the pitch drops by an octave and you get only odd partials. For most other settings you'll get an inharmonic complex of tones. These are sometimes heard as separate pitches and other times they seem to fuse into a single timbre with indeterminate pitch., f 89; -#N canvas 436 82 601 665 fft 0; +#N canvas 436 82 601 665 fft 1; #X obj 86 90 inlet~; #X obj 162 243 inlet; #X obj 96 121 rfft~; #X obj 96 154 *~; -#X obj 127 154 *~; +#X obj 128 154 *~; #X obj 96 184 sqrt~; -#X obj 399 138 block~ 4096 1; #X obj 96 210 biquad~ 0 0 0 0 1; #X text 160 122 Fourier series; #X text 165 175 magnitude; @@ -79,48 +73,50 @@ #X text 235 202 delay two samples; #X text 234 218 for better graphing; #X obj 91 466 samplerate~; -#X obj 91 443 bng 18 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; +#X obj 91 443 bng 18 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X floatatom 91 523 5 0 0 0 - - - 0; #X obj 91 499 / 256; #X obj 91 419 loadbang; -#X floatatom 91 592 5 0 0 0 - - - 0; +#X floatatom 91 592 9 0 0 0 - - - 0; #X obj 99 545 s fundamental; #X obj 91 568 ftom; #X text 70 353 At load time \, calculate a good choice of fundamental frequency for showing spectra: the 16th bin in a 4096-point spectrum \, so SR*16/4096 or SR/256., f 62; #X text 212 245 "bang" into this inlet to graph it; -#X floatatom 230 531 5 0 0 0 - - - 0; +#X floatatom 230 531 8 0 0 0 - - - 0; #X obj 230 507 / 4096; #X text 226 476 One bin is SR/4096:; #X obj 230 553 s freq-step; #X obj 162 277 tabwrite~ E02-spectrum; #X obj 87 310 tabwrite~ E02-signal; -#X text 147 591 <= just out of curiosity \, here's the fundamental pitch; +#X obj 399 138 block~ 4096; +#X text 163 592 <-- just out of curiosity \, here's the fundamental pitch; +#X text 398 113 Window size; #X connect 0 0 2 0; -#X connect 0 0 30 0; +#X connect 0 0 29 0; +#X connect 1 0 28 0; #X connect 1 0 29 0; -#X connect 1 0 30 0; #X connect 2 0 3 0; #X connect 2 0 3 1; #X connect 2 1 4 0; #X connect 2 1 4 1; #X connect 3 0 5 0; #X connect 4 0 5 0; -#X connect 5 0 7 0; -#X connect 7 0 29 0; -#X connect 15 0 18 0; -#X connect 15 0 26 0; -#X connect 16 0 15 0; -#X connect 17 0 21 0; -#X connect 17 0 22 0; -#X connect 18 0 17 0; -#X connect 19 0 16 0; -#X connect 22 0 20 0; -#X connect 25 0 28 0; -#X connect 26 0 25 0; +#X connect 5 0 6 0; +#X connect 6 0 28 0; +#X connect 14 0 17 0; +#X connect 14 0 25 0; +#X connect 15 0 14 0; +#X connect 16 0 20 0; +#X connect 16 0 21 0; +#X connect 17 0 16 0; +#X connect 18 0 15 0; +#X connect 21 0 19 0; +#X connect 24 0 27 0; +#X connect 25 0 24 0; #X restore 128 337 pd fft; #X obj 569 17 declare -stdpath ./; -#X text 212 302 <-- graph repeatedly; -#X text 212 347 <-- graph once; +#X text 212 300 <-- graph repeatedly; +#X text 212 348 <-- graph once; #X text 268 209 <-- "steps" of f/16; #X text 289 136 <-- On/Off; #X obj 47 137 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; @@ -129,43 +125,48 @@ #X obj 177 137 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X obj 220 137 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X obj 263 137 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X connect 1 0 5 0; -#X connect 4 0 56 1; -#X connect 17 0 31 0; -#X connect 17 0 32 0; -#X connect 17 0 24 0; -#X connect 17 0 33 0; -#X connect 17 0 34 0; -#X connect 17 0 35 0; +#X text 686 78 6; +#X text 687 203 -6; +#X text 435 455 ------ partial number --------; +#X text 452 221 ------ 0.02 seconds ------; +#X text 63 489 Now we ring modulate the signal by multiplying it by another sinusoid. The modulation frequency is controlled in steps of f/16 where "f" is the fundamental frequency \, giving roughly 11 Hz per step. Note that if the modulation frequency is set to zero we can't predict the overall amplitude because it depends on what phase the modulation oscillator happened to have at that moment., f 89; +#X connect 1 0 4 0; +#X connect 3 0 51 1; +#X connect 15 0 29 0; +#X connect 15 0 30 0; +#X connect 15 0 22 0; +#X connect 15 0 31 0; +#X connect 15 0 32 0; +#X connect 15 0 33 0; +#X connect 16 0 17 0; +#X connect 17 0 39 0; #X connect 18 0 19 0; -#X connect 19 0 43 0; +#X connect 19 0 39 0; #X connect 20 0 21 0; -#X connect 21 0 43 0; -#X connect 22 0 23 0; -#X connect 23 0 43 0; -#X connect 24 0 22 0; +#X connect 21 0 39 0; +#X connect 22 0 20 0; +#X connect 23 0 24 0; +#X connect 24 0 39 0; #X connect 25 0 26 0; -#X connect 26 0 43 0; +#X connect 26 0 39 0; #X connect 27 0 28 0; -#X connect 28 0 43 0; -#X connect 29 0 30 0; -#X connect 30 0 43 0; -#X connect 31 0 18 0; -#X connect 32 0 20 0; -#X connect 33 0 25 0; -#X connect 34 0 27 0; -#X connect 35 0 29 0; -#X connect 43 0 1 0; -#X connect 43 0 56 0; -#X connect 45 0 43 1; -#X connect 46 0 47 0; -#X connect 47 0 45 0; -#X connect 48 0 47 1; -#X connect 52 0 53 0; -#X connect 53 0 4 0; -#X connect 62 0 19 1; -#X connect 63 0 21 1; -#X connect 64 0 23 1; -#X connect 65 0 26 1; -#X connect 66 0 28 1; -#X connect 67 0 30 1; +#X connect 28 0 39 0; +#X connect 29 0 16 0; +#X connect 30 0 18 0; +#X connect 31 0 23 0; +#X connect 32 0 25 0; +#X connect 33 0 27 0; +#X connect 39 0 1 0; +#X connect 39 0 51 0; +#X connect 41 0 39 1; +#X connect 42 0 43 0; +#X connect 43 0 41 0; +#X connect 44 0 43 1; +#X connect 48 0 49 0; +#X connect 49 0 3 0; +#X connect 57 0 17 1; +#X connect 58 0 19 1; +#X connect 59 0 21 1; +#X connect 60 0 24 1; +#X connect 61 0 26 1; +#X connect 62 0 28 1; diff --git a/doc/3.audio.examples/E03.octave.divider.pd b/doc/3.audio.examples/E03.octave.divider.pd index ef6b3390..1bc92c9c 100644 --- a/doc/3.audio.examples/E03.octave.divider.pd +++ b/doc/3.audio.examples/E03.octave.divider.pd @@ -1,22 +1,22 @@ -#N canvas 333 23 731 710 12; +#N canvas 421 52 731 710 12; #X declare -stdpath ./; #X obj 367 224 loadbang; -#X obj 43 365 hip~ 5; +#X obj 53 365 hip~ 5; #X obj 516 119 adc~ 1; #X obj 367 279 soundfiler; -#X obj 43 426 output~; +#X obj 53 426 output~; #X obj 516 176 tabwrite~ E03-table; #X msg 367 251 read ../sound/voice.wav E03-table; -#X obj 157 231 osc~; -#X obj 89 232 *~; +#X obj 157 233 osc~; +#X obj 100 227 *~; #X obj 157 180 mtof; #X obj 157 208 *; #X msg 206 176 0.5; -#X floatatom 206 205 3 0 0 0 - - - 0; +#X floatatom 206 205 5 0 0 0 - - - 0; #X msg 244 176 15; -#X obj 90 255 *~ 2; +#X obj 100 255 *~ 2; #X obj 206 151 loadbang; -#N canvas 414 195 543 299 looper 0; +#N canvas 264 212 543 299 looper 0; #N canvas 0 0 450 300 (subpatch) 0; #X array E03-table 44103 float 2; #X coords 0 1.02 44103 -1.02 200 130 1; @@ -27,51 +27,52 @@ #X obj 66 88 *~ 44100; #X obj 66 144 tabread4~ E03-table; #X obj 66 170 outlet~; -#X text 112 235 one-second sample reader loop. You can replace this with an adc~ if you want to go live., f 46; +#X text 112 235 one-second sample reader loop. You can replace this with an [adc~] if you want to go live., f 46; #X connect 2 0 5 0; #X connect 3 0 4 0; #X connect 4 0 2 0; #X connect 5 0 6 0; #X restore 111 69 pd looper; -#X text 451 230 re-read original sample; #X obj 527 148 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#N canvas 300 203 576 337 delay 0; -#X obj 43 250 outlet~; -#X obj 42 38 inlet~; -#X obj 43 119 loadbang; -#X obj 42 66 delwrite~ E03-del 40; -#X obj 43 223 delread~ E03-del; -#X obj 43 180 expr 1000*1024/$f1; -#X obj 43 145 samplerate~; -#X text 194 59 write to delay line which has enough memory to hold 40 msec, f 30; -#X text 153 145 get sample rate at load time; -#X text 186 174 divide 1024 by sample rate to give time in seconds \; multiply by 1000 to convert to milliseconds.; -#X text 196 225 read from the delay line at the calculated delay; -#X text 272 274 1024-sample delay; -#X connect 1 0 3 0; -#X connect 2 0 6 0; -#X connect 4 0 0 0; +#N canvas 300 203 546 363 delay 0; +#X obj 85 301 outlet~; +#X obj 101 29 inlet~; +#X obj 101 57 delwrite~ E03-del 40; +#X obj 85 254 delread~ E03-del; +#X obj 85 181 expr 1000*1024/$f1; +#X obj 85 136 samplerate~; +#X text 253 50 write to delay line which has enough memory to hold 40 msec, f 30; +#X text 177 135 get sample rate at load time; +#X text 213 248 read from the delay line at the calculated delay (1024-sample delay), f 36; +#X floatatom 85 215 8 0 0 0 - - - 0; +#X obj 85 110 loadbang; +#X text 230 170 divide 1024 by sample rate to give time in seconds \, multiply by 1000 to convert to milliseconds., f 34; +#X connect 1 0 2 0; +#X connect 3 0 0 0; +#X connect 4 0 9 0; #X connect 5 0 4 0; -#X connect 6 0 5 0; -#X restore 43 134 pd delay; -#X text 161 272 on/off for original; -#X text 185 334 This patch demonstrates using ring modulation to alias a sound down one octave. The ring modulation itself ("osc~" and multiplier) is easy. (We step it up by a factor of 2 to balance the original better.), f 70; -#X text 187 538 About fiddle~ \, suffice it to say that the third outlet contains (pitch \, amplitude) pairs. We unpack the pitch and strip out any zeros (when fiddle~ fails to find a pitch it outputs zero but we'd rather stick with the most recent good one). This is converted from MIDI to Hertz \, and multiplied by 1/2 to control the modulation oscillator. (You can also try large-ish integers which leave the pitch intact but introduce funny formants.), f 70; -#X text 277 176 <= choose an effect; +#X connect 9 0 3 0; +#X connect 10 0 5 0; +#X restore 53 154 pd delay; +#X text 173 273 on/off for original; #X obj 502 25 declare -stdpath ./; -#X text 496 655 updated for Pd version 0.51; +#X text 490 655 updated for Pd version 0.51; #X obj 111 127 moses 1; #X obj 111 99 sigmund~ -npts 2048; #X text 255 99 track pitch; #X text 173 125 reject low numbers indicating no pitch found; -#X text 186 386 Harder is getting the fundamental frequency of the original sound. We do this with the complicated "sigmund~" object \, which puts out a stream of analysis data for an incoming signal. The "-npts 2048" argument specifies the analysis window size. The analysis is most closely aligned with what the sound was doing at the middle of the window \, i.e. \, 1024 samples ago. The "pd delay" window delays the signal itself 1024 samples so it will be as tightly synchronized with the analysis data as possible. (If you're doing this on a real-time input \, you might drop the delay and settle for less perfect synchronization.), f 70; #X text 89 16 OCTAVE DIVIDING BY RING MODULATION; -#X text 551 148 <- record a sample; -#X obj 108 288 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 90 317 *~; -#X obj 61 288 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 43 317 *~; -#X text 133 288 <- and processed sounds; +#X obj 118 288 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 100 317 *~; +#X obj 71 288 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 53 317 *~; +#X text 277 176 <-- choose an effect; +#X text 143 288 <-- and processed sounds; +#X text 551 148 <-- record a sample; +#X text 440 229 re-read original sample:; +#X text 192 334 This patch demonstrates using ring modulation to alias a sound down one octave. The ring modulation itself ([osc~] and multiplier) is easy. (We step it up by a factor of 2 to balance the original better.), f 70; +#X text 192 386 Harder is getting the fundamental frequency of the original sound. We do this with the complicated [sigmund~] object \, which puts out a stream of analysis data for an incoming signal. The "-npts 2048" argument specifies the analysis window size. The analysis is most closely aligned with what the sound was doing at the middle of the window \, i.e. \, 1024 samples ago. The [pd delay] window delays the signal itself 1024 samples so it will be as tightly synchronized with the analysis data as possible. (If you're doing this on a real-time input \, you might drop the delay and settle for less perfect synchronization.), f 70; +#X text 193 538 About [sigmund~] \, suffice it to say that the left outlet \, by default \, outputs pitch of the analyzed sound. When it fails to find a pitch \, [sigmund~] outputs -1500 \, so we use [moses] to filter these values. The pitch is converted from MIDI to Hertz \, and multiplied by 1/2 to control the modulation oscillator. (You can also try large-ish integers which leave the pitch intact but introduce funny formants.), f 70; #X connect 0 0 6 0; #X connect 1 0 4 0; #X connect 2 0 5 0; @@ -83,16 +84,16 @@ #X connect 11 0 12 0; #X connect 12 0 10 1; #X connect 13 0 12 0; -#X connect 14 0 34 0; +#X connect 14 0 28 0; #X connect 15 0 11 0; -#X connect 16 0 19 0; -#X connect 16 0 27 0; -#X connect 18 0 5 0; -#X connect 19 0 8 0; -#X connect 19 0 36 0; -#X connect 26 1 9 0; -#X connect 27 0 26 0; -#X connect 33 0 34 1; -#X connect 34 0 1 0; -#X connect 35 0 36 1; -#X connect 36 0 1 0; +#X connect 16 0 18 0; +#X connect 16 0 23 0; +#X connect 17 0 5 0; +#X connect 18 0 8 0; +#X connect 18 0 30 0; +#X connect 22 1 9 0; +#X connect 23 0 22 0; +#X connect 27 0 28 1; +#X connect 28 0 1 0; +#X connect 29 0 30 1; +#X connect 30 0 1 0; diff --git a/doc/3.audio.examples/E04.difference.tone.pd b/doc/3.audio.examples/E04.difference.tone.pd index b2c58b2d..4f0d607d 100644 --- a/doc/3.audio.examples/E04.difference.tone.pd +++ b/doc/3.audio.examples/E04.difference.tone.pd @@ -1,35 +1,35 @@ -#N canvas 487 47 616 593 12; +#N canvas 487 47 654 545 12; #X declare -stdpath ./; -#X obj 65 205 +~; -#X obj 65 315 output~; -#X text 39 24 NONLINEAR DISTORTION AND DIFFERENCE TONES; -#X obj 181 236 / 100; -#X floatatom 181 213 5 0 500 0 - - - 0; -#X obj 65 268 clip~ -1 1; -#X floatatom 83 138 5 0 0 0 - - - 0; -#X obj 65 242 *~; -#X obj 83 92 loadbang; -#X msg 181 189 50; -#X obj 181 165 loadbang; -#X text 395 532 updated for Pd version 0.37; -#X text 244 196 amplitude of sum; -#X obj 65 66 osc~ 300; -#X msg 83 115 225; -#X text 191 279 This patch demonstrates how nonlinear distortion (also known as "waveshaping") can create difference tones from a pair of sinusoids. The sinusoids are initially tuned to 225 and 300 Hz \, a musical fourth \, and have amplitude of 50 percent (0.5) so that the sum is always less than 1 in absolute value. At these settings the "clip~" object passes its input through unchanged., f 55; -#X text 192 389 If the amplitude rises above 50 percent \, the clip~ object starts altering the signal nonlinearly \, and the result is no longer as if the two sinusoids had been processed separately. Instead \, they "intermodulate" \, finding a common subharmonic if one exists. At 300 and 225 Hz \, the subharmonic is at 75 \, two octaves below the upper tone and a twelfth below the lower one. Change the frequency of the second tone and you will hear a variety of effects., f 55; -#X obj 83 168 osc~; -#X text 126 137 <= frequency of second tone; -#X text 229 213 <= before clipping; -#X obj 439 31 declare -stdpath ./; +#X obj 59 170 +~; +#X obj 59 350 output~; +#X text 232 51 NONLINEAR DISTORTION AND DIFFERENCE TONES; +#X obj 145 213 / 100; +#X floatatom 145 188 5 0 500 0 - - - 0; +#X obj 59 303 clip~ -1 1; +#X floatatom 77 103 5 0 0 0 - - - 0; +#X obj 59 277 *~; +#X obj 77 57 loadbang; +#X msg 145 163 50; +#X obj 145 139 loadbang; +#X text 389 497 updated for Pd version 0.37; +#X obj 59 31 osc~ 300; +#X msg 77 80 225; +#X obj 77 133 osc~; +#X obj 401 134 declare -stdpath ./; +#X text 120 102 <-- frequency of second tone; +#X text 193 188 <--; +#X text 222 188 amplitude of sum before clipping, f 16; +#X text 197 240 This patch demonstrates how nonlinear distortion (also known as "waveshaping") can create difference tones from a pair of sinusoids. The sinusoids are initially tuned to 225 and 300 Hz \, a musical fourth \, and have amplitude of 50 percent (0.5) so that the sum is always less than 1 in absolute value. At these settings the [clip~] object passes its input through unchanged., f 55; +#X text 198 350 If the amplitude rises above 50 percent \, the [clip~] object starts altering the signal nonlinearly \, and the result is no longer as if the two sinusoids had been processed separately. Instead \, they "intermodulate" \, finding a common subharmonic if one exists. At 300 and 225 Hz \, the subharmonic is at 75 \, two octaves below the upper tone and a twelfth below the lower one. Change the frequency of the second tone and you will hear a variety of effects., f 55; #X connect 0 0 7 0; #X connect 3 0 7 1; #X connect 4 0 3 0; #X connect 5 0 1 0; -#X connect 6 0 17 0; +#X connect 6 0 14 0; #X connect 7 0 5 0; -#X connect 8 0 14 0; +#X connect 8 0 13 0; #X connect 9 0 4 0; #X connect 10 0 9 0; -#X connect 13 0 0 0; -#X connect 14 0 6 0; -#X connect 17 0 0 1; +#X connect 12 0 0 0; +#X connect 13 0 6 0; +#X connect 14 0 0 1; diff --git a/doc/3.audio.examples/E05.chebychev.pd b/doc/3.audio.examples/E05.chebychev.pd index 2c6dbc5d..79a5d89f 100644 --- a/doc/3.audio.examples/E05.chebychev.pd +++ b/doc/3.audio.examples/E05.chebychev.pd @@ -1,22 +1,22 @@ -#N canvas 426 112 657 596 12; +#N canvas 426 112 662 580 12; #X declare -stdpath ./; -#X obj 34 318 output~; -#X obj 52 99 / 100; +#X obj 34 337 output~; +#X obj 52 101 / 100; #X floatatom 52 77 5 0 100 0 - - - 0; -#X obj 34 171 *~; -#X text 456 557 updated for Pd version 0.37; +#X obj 34 182 *~; +#X text 425 531 updated for Pd version 0.37; #X obj 34 50 osc~ 220; -#X obj 52 122 pack 0 50; -#X obj 52 146 line~; +#X obj 52 127 pack 0 50; +#X obj 52 154 line~; #X text 119 91 hundredths; -#X obj 34 198 *~ 128; -#X obj 34 251 tabread4~ E05-tab; +#X obj 34 212 *~ 128; +#X obj 34 270 tabread4~ E05-tab; #N canvas 0 0 450 300 (subpatch) 0; #X array E05-tab 259 float 1; #A 0 -1.20148 -1 -0.810724 -0.63326 -0.467216 -0.31221 -0.167866 -0.0338144 0.0903053 0.204849 0.310166 0.406597 0.494477 0.574137 0.645895 0.71007 0.766969 0.816895 0.860145 0.897008 0.927771 0.952708 0.972093 0.98619 0.995261 0.999557 0.999329 0.994816 0.986257 0.97388 0.957912 0.938572 0.916074 0.890625 0.86243 0.831684 0.798582 0.76331 0.726049 0.686977 0.646266 0.60408 0.560583 0.515931 0.470276 0.423765 0.37654 0.328738 0.280493 0.231934 0.183183 0.13436 0.0855808 0.0369554 -0.01141 -0.0594134 -0.106956 -0.153946 -0.200292 -0.245909 -0.290715 -0.334633 -0.377589 -0.419512 -0.460337 -0.5 -0.538443 -0.57561 -0.611449 -0.645912 -0.678953 -0.710532 -0.740609 -0.76915 -0.796122 -0.821497 -0.845248 -0.867354 -0.887794 -0.906551 -0.923612 -0.938965 -0.952601 -0.964516 -0.974704 -0.983167 -0.989906 -0.994925 -0.99823 -0.999832 -0.999741 -0.997972 -0.994539 -0.98946 -0.982757 -0.97445 -0.964564 -0.953125 -0.94016 -0.925699 -0.909772 -0.892414 -0.873658 -0.85354 -0.832098 -0.809372 -0.785401 -0.760228 -0.733895 -0.706446 -0.677928 -0.648387 -0.61787 -0.586426 -0.554105 -0.520957 -0.487033 -0.452386 -0.417069 -0.381135 -0.344638 -0.307632 -0.270174 -0.232319 -0.194122 -0.15564 -0.11693 -0.0780487 -0.039053 0 0.039053 0.0780487 0.11693 0.15564 0.194122 0.232319 0.270174 0.307632 0.344638 0.381135 0.417069 0.452386 0.487033 0.520957 0.554105 0.586426 0.61787 0.648387 0.677928 0.706446 0.733895 0.760228 0.785401 0.809372 0.832098 0.85354 0.873658 0.892414 0.909772 0.925699 0.94016 0.953125 0.964564 0.97445 0.982757 0.98946 0.994539 0.997972 0.999741 0.999832 0.99823 0.994925 0.989906 0.983167 0.974704 0.964516 0.952601 0.938965 0.923612 0.906551 0.887794 0.867354 0.845248 0.821497 0.796122 0.76915 0.740609 0.710532 0.678953 0.645912 0.611449 0.57561 0.538443 0.5 0.460337 0.419512 0.377589 0.334633 0.290715 0.245909 0.200292 0.153946 0.106956 0.0594134 0.01141 -0.0369554 -0.0855808 -0.13436 -0.183183 -0.231934 -0.280493 -0.328738 -0.37654 -0.423765 -0.470276 -0.515931 -0.560583 -0.60408 -0.646266 -0.686977 -0.726049 -0.76331 -0.798582 -0.831684 -0.86243 -0.890625 -0.916074 -0.938572 -0.957912 -0.97388 -0.986257 -0.994816 -0.999329 -0.999557 -0.995261 -0.98619 -0.972093 -0.952708 -0.927771 -0.897008 -0.860145 -0.816895 -0.766969 -0.71007 -0.645895 -0.574137 -0.494477 -0.406597 -0.310166 -0.204849 -0.0903053 0.0338144 0.167866 0.31221 0.467216 0.63326 0.810724 1 1.20148; #X coords 0 1 258 -1 200 140 1; #X restore 230 82 graph; -#N canvas 352 23 835 723 make-table 0; +#N canvas 352 38 835 723 make-table 0; #X obj 157 304 t b b; #X obj 229 329 f; #X obj 267 329 + 1; @@ -167,13 +167,12 @@ #X text 531 127 4; #X text 560 128 5; #X text 589 127 6; -#X obj 34 224 +~ 129; -#X obj 34 281 hip~ 5; -#X text 168 284 This patch demonstrates using Chebychev polynomials (of the first kind) to generate pure harmonics using waveshaping. The pure harmonic only comes out when the index is one (top of the scale). Smaller indices will give various mixes of harmonics. The table initially holds the fifth Chebychev polynomial \, so you can get the fifth harmonic., f 62; -#X text 168 375 There is an audible "rolling" sound as the index changes for the higher degree polynomials \, because the amplitudes of the lower partials can rise and fall several times apiece as the index rises from zero to one., f 62; -#X text 168 438 Indices greater than one will try to read values outside the table (which would be clipped appropriately). Anyway \, the polynomials increase rapidly in value outside the interval from -1 to 1 that we are using here., f 62; -#X text 168 501 When you get tired of Chebychev polynomials you can draw your own functions by hand and/or try other formulas., f 62; -#X text 99 77 <= index in; +#X obj 34 239 +~ 129; +#X obj 34 300 hip~ 5; +#X text 188 260 This patch demonstrates using Chebychev polynomials (of the first kind) to generate pure harmonics using waveshaping. The pure harmonic only comes out when the index is one (top of the scale). Smaller indices will give various mixes of harmonics. The table initially holds the fifth Chebychev polynomial \, so you can get the fifth harmonic., f 62; +#X text 188 351 There is an audible "rolling" sound as the index changes for the higher degree polynomials \, because the amplitudes of the lower partials can rise and fall several times apiece as the index rises from zero to one., f 62; +#X text 188 414 Indices greater than one will try to read values outside the table (which would be clipped appropriately). Anyway \, the polynomials increase rapidly in value outside the interval from -1 to 1 that we are using here., f 62; +#X text 188 477 When you get tired of Chebychev polynomials you can draw your own functions by hand and/or try other formulas., f 62; #X text 42 5 WAVESHAPING WITH CHEBYCHEV POLYNOMIALS; #X text 458 86 subpatch to calculate Chebychev polynomials, f 21; #X obj 478 25 declare -stdpath ./; @@ -181,6 +180,7 @@ #X obj 528 146 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 557 146 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 586 146 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 99 77 <-- index in; #X connect 1 0 6 0; #X connect 2 0 1 0; #X connect 3 0 9 0; @@ -192,7 +192,7 @@ #X connect 13 0 12 0; #X connect 19 0 10 0; #X connect 20 0 0 0; -#X connect 29 0 12 1; -#X connect 30 0 12 2; -#X connect 31 0 12 3; -#X connect 32 0 12 4; +#X connect 28 0 12 1; +#X connect 29 0 12 2; +#X connect 30 0 12 3; +#X connect 31 0 12 4; diff --git a/doc/3.audio.examples/E06.exponential.pd b/doc/3.audio.examples/E06.exponential.pd index de2bd52e..099dfb73 100644 --- a/doc/3.audio.examples/E06.exponential.pd +++ b/doc/3.audio.examples/E06.exponential.pd @@ -1,4 +1,4 @@ -#N canvas 468 23 872 723 12; +#N canvas 352 48 872 723 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array E06-signal 882 float 0; @@ -9,67 +9,68 @@ #X array E06-spectrum 128 float 0; #X coords 0 4300 127 -40 257 130 1; #X restore 521 434 graph; -#N canvas 455 72 538 658 fft 0; -#X obj 47 77 inlet~; -#X obj 236 228 inlet; -#X obj 57 108 rfft~; -#X obj 57 141 *~; -#X obj 89 143 *~; -#X obj 57 171 sqrt~; -#X obj 360 125 block~ 4096 1; -#X obj 57 197 biquad~ 0 0 0 0 1; -#X text 121 109 Fourier series; -#X text 126 162 magnitude; -#X text 124 147 calculate; -#X text 35 8 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later.; -#X text 111 77 signal to analyze; -#X text 221 180 delay two samples; -#X text 219 198 for better graphing; -#X obj 66 473 samplerate~; -#X obj 66 450 bng 18 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; -#X floatatom 66 540 5 0 0 0 - - - 0; -#X obj 66 516 / 256; -#X obj 66 426 loadbang; -#X floatatom 66 609 5 0 0 0 - - - 0; -#X obj 74 562 s fundamental; -#X obj 66 585 ftom; -#X text 64 367 At load time \, calculate a good choice of fundamental frequency for showing spectra: the 16th bin in a 4096-point spectrum \, so SR*16/4096 or SR/256.; -#X floatatom 241 548 5 0 0 0 - - - 0; -#X obj 241 524 / 4096; -#X text 237 500 One bin is SR/4096:; -#X obj 241 570 s freq-step; -#X obj 236 311 tabwrite~ E06-spectrum; -#X obj 47 311 tabwrite~ E06-signal; -#X obj 248 273 metro 500; -#X obj 248 250 inlet; -#X text 301 248 toggle to graph repeatedly; -#X text 290 228 bang to graph once; -#X text 111 608 <= fundamental pitch; +#N canvas 455 72 538 658 fft 1; +#X obj 62 86 inlet~; +#X obj 251 237 inlet; +#X obj 72 117 rfft~; +#X obj 72 150 *~; +#X obj 104 152 *~; +#X obj 72 180 sqrt~; +#X obj 72 206 biquad~ 0 0 0 0 1; +#X text 136 118 Fourier series; +#X text 141 171 magnitude; +#X text 139 156 calculate; +#X text 50 17 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later.; +#X text 126 86 signal to analyze; +#X text 236 189 delay two samples; +#X text 234 207 for better graphing; +#X obj 81 482 samplerate~; +#X obj 81 459 bng 18 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; +#X floatatom 81 549 5 0 0 0 - - - 0; +#X obj 81 525 / 256; +#X obj 81 435 loadbang; +#X floatatom 81 625 8 0 0 0 - - - 0; +#X obj 89 576 s fundamental; +#X obj 81 601 ftom; +#X text 79 376 At load time \, calculate a good choice of fundamental frequency for showing spectra: the 16th bin in a 4096-point spectrum \, so SR*16/4096 or SR/256.; +#X floatatom 256 557 5 0 0 0 - - - 0; +#X obj 256 533 / 4096; +#X text 252 509 One bin is SR/4096:; +#X obj 256 579 s freq-step; +#X obj 251 320 tabwrite~ E06-spectrum; +#X obj 62 320 tabwrite~ E06-signal; +#X obj 263 282 metro 500; +#X obj 263 259 inlet; +#X text 316 257 toggle to graph repeatedly; +#X text 305 237 bang to graph once; +#X text 143 624 <-- fundamental pitch; +#X obj 375 134 block~ 4096; +#X text 373 101 window size; #X connect 0 0 2 0; -#X connect 0 0 29 0; +#X connect 0 0 28 0; +#X connect 1 0 27 0; #X connect 1 0 28 0; -#X connect 1 0 29 0; #X connect 2 0 3 0; #X connect 2 0 3 1; #X connect 2 1 4 0; #X connect 2 1 4 1; #X connect 3 0 5 0; #X connect 4 0 5 0; -#X connect 5 0 7 0; -#X connect 7 0 28 0; -#X connect 15 0 18 0; -#X connect 15 0 25 0; -#X connect 16 0 15 0; -#X connect 17 0 21 0; -#X connect 17 0 22 0; -#X connect 18 0 17 0; -#X connect 19 0 16 0; -#X connect 22 0 20 0; -#X connect 24 0 27 0; -#X connect 25 0 24 0; -#X connect 30 0 28 0; +#X connect 5 0 6 0; +#X connect 6 0 27 0; +#X connect 14 0 17 0; +#X connect 14 0 24 0; +#X connect 15 0 14 0; +#X connect 16 0 20 0; +#X connect 16 0 21 0; +#X connect 17 0 16 0; +#X connect 18 0 15 0; +#X connect 21 0 19 0; +#X connect 23 0 26 0; +#X connect 24 0 23 0; +#X connect 29 0 27 0; +#X connect 29 0 28 0; #X connect 30 0 29 0; -#X connect 31 0 30 0; #X restore 189 286 pd fft; #X text 562 375 ---- 0.02 seconds ----; #X obj 208 258 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; @@ -134,7 +135,7 @@ #X floatatom 194 87 5 0 200 0 - - - 0; #X obj 194 135 pack 0 50; #X obj 194 159 line~; -#X text 259 103 tenths; +#X text 266 103 tenths; #X obj 194 112 / 10; #X obj 124 147 *~; #X obj 124 226 tabread4~ E06-tab; @@ -143,13 +144,13 @@ #X text 534 175 0; #X text 701 177 10; #X text 25 641 When the index of modulation exceeds 5 we scan past the right hand border of the table (the thousandth point \, corresponding to exp(-10). This isn't a problem because the values are all close to zero there., f 61; -#X text 25 549 Table lookup is prepared as follows. First add one to the sinusoid and adjust its amplitude according to index \; it ranges from 0 to 2*index. Then adjust for the table's input scale (100 points per unit \, so multiply by 100) and add one to skip the interpolation point at the beginning of the table., f 61; #X text 25 401 Here we use an exponential function as a waveshaping transfer function. The theory is shown in detail in the accompanying book \, but in short \, we adjust the sinusoid so that \, as the index increases \, we scan starting from the left of the transfer function (previously the reading location grew from the center). The table contains exp(-x) with x varying from 0 to 10 When the index is zero \, the output is the constant 1 and the spectrum holds only DC. As the index grows \, the output is a sequence of steadily narrower pulses \, whose spectrum gets progressively fatter., f 61; -#X text 237 87 <= index in; #X text 48 10 WAVESHAPING USING AN EXPONENTIAL FUNCTION; #X obj 686 21 declare -stdpath ./; #X text 264 286 <-- repeatedly; #X text 230 258 <-- graph once; +#X text 237 87 <-- index in; +#X text 25 549 Table lookup is prepared as follows. First add one to the sinusoid and adjust its amplitude according to index so it ranges from 0 to 2*index. Then adjust for the table's input scale (100 points per unit \, so multiply by 100) and add one to skip the interpolation point at the beginning of the table., f 61; #X connect 1 0 6 0; #X connect 5 0 3 1; #X connect 18 0 19 0; diff --git a/doc/3.audio.examples/E07.evenodd.pd b/doc/3.audio.examples/E07.evenodd.pd index 6f4d07d9..9cb24722 100644 --- a/doc/3.audio.examples/E07.evenodd.pd +++ b/doc/3.audio.examples/E07.evenodd.pd @@ -1,4 +1,4 @@ -#N canvas 367 23 894 710 12; +#N canvas 349 38 894 710 12; #X declare -stdpath ./; #X obj 288 216 f; #X obj 322 192 + 1; @@ -11,59 +11,59 @@ #X obj 288 288 mtof; #X msg 85 208 1; #X obj 155 410 *~; -#X obj 155 470 cos~; -#X obj 155 495 hip~ 5; -#X obj 155 447 +~ 0.1; +#X obj 155 492 cos~; +#X obj 155 527 hip~ 5; +#X obj 155 461 +~ 0.1; #X floatatom 117 249 0 0 0 0 - - - 0; #X floatatom 216 250 0 0 200 0 - - - 0; #X floatatom 150 249 0 0 999 0 - - - 0; #X floatatom 183 249 0 0 999 0 - - - 0; -#X msg 276 397 0; +#X msg 276 399 0; #X msg 276 375 0.1; -#X msg 276 419 0.25; +#X msg 276 424 0.25; #X text 126 209 ADSR controls; -#X text 160 230 A; -#X text 193 230 D; -#X text 226 230 S; +#X text 154 230 A; +#X text 187 230 D; +#X text 220 230 S; #X floatatom 340 164 0 1 11 0 - - - 0; #X obj 84 308 *~ 0.01; #X obj 288 96 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 155 529 output~; +#X obj 155 561 output~; #X text 634 653 updated for Pd version 0.37; #X obj 84 275 adsr 70 10 90 50 500, f 24; #X obj 288 265 +; #X floatatom 323 265 5 -48 120 0 - - - 0; -#N canvas 274 153 531 210 make-table 0; -#X obj 92 81 loadbang; +#N canvas 763 374 531 210 make-table 0; +#X obj 111 86 loadbang; #X text 70 21 This patch loads a sequence of pitches into E07. The values are floating-point \, so we could use microtones (60.5 \, for example) if we wish.; -#X msg 92 109 \; E07 0 54 55 57 63 61 67 71 57 70 61 63 \; E07 yticks 36 12 1 \; E07 ylabel 12 36 48 60 72 84 96; +#X msg 111 114 \; E07 0 54 55 57 63 61 67 71 57 70 61 63 \; E07 yticks 36 12 1 \; E07 ylabel 11.4 36 48 60 72 84 96; #X connect 0 0 2 0; #X restore 574 267 pd make-table; #X obj 49 180 sel 0; #X msg 49 208 0; -#X text 104 230 level; -#X obj 288 128 metro 130; +#X text 106 230 level; #X obj 288 317 osc~; #X text 275 355 symmetry; -#X text 309 395 even; -#X text 316 418 odd; +#X text 309 397 even; +#X text 316 423 odd; #X text 311 374 mixed; #X obj 288 241 tabread E07; -#X text 393 324 This patch uses a stepping sequencer to control a waveshaping instrument. A metronome (metro 130) drives a counter (f \, +1 \, and mod 11) which counts repeatedly through 11 values which are read from the stored table (tabread E07). The values may be read in sequence \, by twos or threes \, etc. \, according to the "increment" parameter., f 61; -#X text 393 419 The metronome also triggers an ADSR envelope \, whose parameters may also be changed using the "level" \, "A" \, "D" \, and "S" controls., f 61; -#X text 67 29 SEQUENCED WAVESHAPING SYNTHESIZER; -#X text 394 472 The synthesis (osc~ \, *~ \, +~ 0.1 \, cos~) is a very simple application of the waveshaping technique. The oscillator (whose amplitude depends on the ADSR generator) is used as an index into the "cos~" wavetable. An additional offset ("symmetry") controls how the oscillator's waveform is centered on the wavetable. If the offset is zero \, the oscillator reads into the (even) cosine function (producing only even harmonics). If the offset is 0.25 \, we read 1/4 wave into the cosine function: the result is an odd function and we get odd harmonics. Between the two we get mixtures of even and odd., f 61; -#X text 364 265 <= transpose; -#X text 371 165 <= increment; -#X text 392 98 <= msec; -#X obj 657 22 declare -stdpath ./; -#X text 209 93 ON/OFF -->; +#X text 393 419 The metronome also triggers an ADSR envelope \, whose parameters may also be changed using the "level" \, "A" \, "D" \, and "S" controls., f 62; +#X text 89 29 SEQUENCED WAVESHAPING SYNTHESIZER; +#X obj 145 647 declare -stdpath ./; +#X text 209 95 ON/OFF -->; +#X text 390 98 <-- msec; +#X text 370 165 <-- increment; +#X text 364 265 <-- transpose; +#X text 393 472 The synthesis ([osc~] \, [*~] \, [+~ 0.1] and [cos~]) is a very simple application of the waveshaping technique. The [osc~] oscillator (whose amplitude depends on the ADSR generator) is used as an index into the [cos~] wavetable. An additional offset ("symmetry") controls how the oscillator's waveform is centered on the wavetable. If the offset is zero \, the oscillator reads into the (even) cosine function (producing only even harmonics). If the offset is 0.25 \, we read 1/4 wave into the cosine function: the result is an odd function and we get odd harmonics. Between the two we get mixtures of even and odd., f 62; +#X obj 288 128 metro 150; +#X text 393 324 This patch uses a stepping sequencer to control a waveshaping instrument. A metronome ([metro 150]) drives a counter ([f] \, [+ 1] \, and [mod 11]) which counts repeatedly through the 11 values which are read from the stored table ([tabread E07]). The values may be read in sequence \, by twos or threes \, etc. \, according to the "increment" parameter., f 62; #X connect 0 0 1 0; -#X connect 0 0 40 0; +#X connect 0 0 39 0; #X connect 1 0 2 0; #X connect 2 0 0 1; -#X connect 4 0 34 1; -#X connect 5 0 35 0; +#X connect 4 0 48 1; +#X connect 5 0 34 0; #X connect 6 0 27 0; #X connect 7 0 10 0; #X connect 8 0 9 0; @@ -79,13 +79,13 @@ #X connect 22 0 1 1; #X connect 23 0 7 0; #X connect 24 0 31 0; -#X connect 24 0 34 0; +#X connect 24 0 48 0; #X connect 27 0 23 0; #X connect 28 0 5 0; #X connect 29 0 28 1; #X connect 31 0 32 0; #X connect 32 0 27 0; -#X connect 34 0 0 0; -#X connect 34 0 6 0; -#X connect 35 0 7 1; -#X connect 40 0 28 0; +#X connect 34 0 7 1; +#X connect 39 0 28 0; +#X connect 48 0 0 0; +#X connect 48 0 6 0; diff --git a/doc/3.audio.examples/E08.phase.mod.pd b/doc/3.audio.examples/E08.phase.mod.pd index 9d45a0e5..a0131d27 100644 --- a/doc/3.audio.examples/E08.phase.mod.pd +++ b/doc/3.audio.examples/E08.phase.mod.pd @@ -4,7 +4,7 @@ #X floatatom 231 107 4 0 0 0 - - - 0; #X obj 319 144 line~; #X floatatom 135 121 4 0 0 0 - - - 0; -#X obj 135 245 cos~; +#X obj 135 247 cos~; #X obj 135 191 +~; #X obj 231 132 osc~ 0; #X obj 319 118 pack 0 50; @@ -16,13 +16,10 @@ #X text 131 96 frequency; #X text 216 83 frequency; #X text 217 66 modulation; -#X text 64 132 carrier; -#X text 33 177 phase; -#X text 46 230 output; +#X text 61 132 carrier; +#X text 42 230 output; #X text 68 30 PHASE MODULATION; -#X text 66 395 Most implementations of "FM" actually use phase \, not frequency \, modulation \, because it extends in a more natural way to "multi-operator FM" with three or more oscillators.; -#X text 66 451 To do phase modulation \, we split the "carrier oscillator" into its phase calculation (phasor~) and its waveform lookup (cos~). These together would be equivalent to an osc~ object \, but the "+~" between them adds the modulating oscillator's output to the phase.; -#X text 530 476 We also have to use a line~ to smooth changes in the modulation index \, which wasn't necessary in the previous patch., f 45; +#X text 56 397 Most implementations of "FM" actually use phase \, not frequency \, modulation \, because it extends in a more natural way to "multi-operator FM" with three or more oscillators., f 60; #X obj 135 148 phasor~; #X obj 167 574 cos~; #X obj 167 546 phasor~; @@ -39,10 +36,6 @@ #X obj 135 322 output~; #X text 636 559 updated for Pd version 0.37; #X text 531 392 The "modulation" index \, which in true FM is in units of Hertz \, is dimensionless for phase modulation. "Good" values tend to be between 0 and 1... in this patch the index is in hundredths., f 45; -#X text 66 147 phase =>; -#X text 32 192 modulation =>; -#X text 45 246 waveform =>; -#X text 264 225 <= graph them; #X obj 691 55 declare -stdpath ./; #X obj 240 225 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #N canvas 0 0 450 300 (subpatch) 0; @@ -55,20 +48,26 @@ #X text 416 197 1; #X text 661 199 1; #X text 652 331 -1; +#X text 63 147 phase -->; +#X text 40 246 waveform -->; +#X text 264 225 <-- graph them; +#X text 56 453 To do phase modulation \, we split the "carrier oscillator" into its phase calculation ([phasor~]) and its waveform lookup ([cos~]). These together would be equivalent to an [osc~] object \, but the [+~] between them adds the modulating oscillator's output to the phase.; +#X text 530 476 We also have to use a [line~] object to smooth changes in the modulation index \, which wasn't necessary in the previous patch., f 46; +#X text 51 189 phase ---> modulation, f 10; #X connect 0 0 5 1; #X connect 1 0 6 0; #X connect 2 0 0 1; -#X connect 3 0 23 0; -#X connect 4 0 32 0; -#X connect 4 0 33 0; +#X connect 3 0 20 0; +#X connect 4 0 29 0; +#X connect 4 0 30 0; #X connect 5 0 4 0; -#X connect 5 0 43 0; +#X connect 5 0 36 0; #X connect 6 0 0 0; #X connect 7 0 2 0; #X connect 8 0 9 0; #X connect 9 0 7 0; -#X connect 23 0 5 0; -#X connect 25 0 24 0; -#X connect 41 0 31 0; -#X connect 41 0 32 0; -#X connect 43 0 31 0; +#X connect 20 0 5 0; +#X connect 22 0 21 0; +#X connect 34 0 28 0; +#X connect 34 0 29 0; +#X connect 36 0 28 0; diff --git a/doc/3.audio.examples/E09.FM.spectrum.pd b/doc/3.audio.examples/E09.FM.spectrum.pd index a06d1a46..5c73ad96 100644 --- a/doc/3.audio.examples/E09.FM.spectrum.pd +++ b/doc/3.audio.examples/E09.FM.spectrum.pd @@ -1,4 +1,4 @@ -#N canvas 387 124 697 536 12; +#N canvas 427 113 697 549 12; #X declare -stdpath ./; #X obj 146 209 *~; #X obj 189 209 line~; @@ -9,15 +9,14 @@ #X obj 189 162 / 100; #X obj 71 160 phasor~; #X obj 71 321 output~; -#X text 442 509 updated for Pd version 0.37; +#X text 457 514 updated for Pd version 0.37; #N canvas 665 146 599 711 fft 0; #X obj 97 106 inlet~; #X obj 286 257 inlet; #X obj 113 137 rfft~; #X obj 113 170 *~; -#X obj 144 170 *~; +#X obj 145 170 *~; #X obj 113 200 sqrt~; -#X obj 401 149 block~ 4096 1; #X obj 113 226 biquad~ 0 0 0 0 1; #X text 171 138 Fourier series; #X text 182 191 magnitude; @@ -27,7 +26,7 @@ #X text 271 209 delay two samples; #X text 269 227 for better graphing; #X obj 133 532 samplerate~; -#X obj 133 509 bng 18 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; +#X obj 133 509 bng 18 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X floatatom 133 581 5 0 0 0 - - - 0; #X obj 133 555 / 256; #X obj 133 485 loadbang; @@ -44,31 +43,33 @@ #X text 138 671 set carrier multiplier after fundamental; #X obj 113 250 /~ 4096; #X msg 287 367 \; pd dsp 1; +#X obj 401 149 block~ 4096; +#X text 393 122 Window size; #X connect 0 0 2 0; -#X connect 0 0 26 0; +#X connect 0 0 25 0; +#X connect 1 0 25 0; #X connect 1 0 26 0; -#X connect 1 0 27 0; -#X connect 1 0 32 0; +#X connect 1 0 31 0; #X connect 2 0 3 0; #X connect 2 0 3 1; #X connect 2 1 4 0; #X connect 2 1 4 1; #X connect 3 0 5 0; #X connect 4 0 5 0; -#X connect 5 0 7 0; -#X connect 7 0 31 0; -#X connect 15 0 18 0; -#X connect 16 0 15 0; -#X connect 17 0 28 0; -#X connect 18 0 17 0; -#X connect 19 0 16 0; -#X connect 22 0 26 0; -#X connect 22 0 27 0; -#X connect 23 0 22 0; -#X connect 23 0 32 0; -#X connect 28 0 29 0; -#X connect 28 1 20 0; -#X connect 31 0 27 0; +#X connect 5 0 6 0; +#X connect 6 0 30 0; +#X connect 14 0 17 0; +#X connect 15 0 14 0; +#X connect 16 0 27 0; +#X connect 17 0 16 0; +#X connect 18 0 15 0; +#X connect 21 0 25 0; +#X connect 21 0 26 0; +#X connect 22 0 21 0; +#X connect 22 0 31 0; +#X connect 27 0 28 0; +#X connect 27 1 19 0; +#X connect 30 0 26 0; #X restore 115 264 pd fft; #X obj 134 240 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 175 264 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; @@ -79,38 +80,38 @@ #N canvas 0 0 450 300 (subpatch) 0; #X array E09-spectrum 259 float 0; #X coords 0 0.51 258 -0.008 259 130 1; -#X restore 354 196 graph; -#X text 420 145 ---- 0.02 seconds ----; -#X text 384 327 2; -#X text 415 327 4; -#X text 353 327 0; -#X text 392 342 -- partial number --; +#X restore 361 208 graph; +#X text 429 145 ---- 0.02 seconds ----; +#X text 391 339 2; +#X text 422 339 4; +#X text 360 339 0; #X text 332 88 WAVEFORM; -#X text 448 178 SPECTRUM; -#X text 614 312 0; -#X text 615 194 0.5; +#X text 511 183 SPECTRUM; +#X text 621 324 0; +#X text 622 206 0.5; #X obj 146 138 osc~; #X obj 146 107 r fundamental; #X text 224 138 index (x100); -#X text 447 327 6; -#X text 480 327 8; -#X text 508 327 10; -#X text 540 327 12; -#X text 572 327 14; +#X text 454 339 6; +#X text 487 339 8; +#X text 515 339 10; +#X text 547 339 12; +#X text 579 339 14; #X text 45 17 SPECTRUM OF TWO-OPERATOR PHASE MODULATION; #X floatatom 71 79 3 0 15 0 - - - 0; #X obj 71 136 *; #X obj 71 54 r cm; #X text 105 78 carrier harmonic #; -#X text 113 396 This patch measures the spectrum of two-operator phase modulation. The carrier frequency is initially six times the modulation frequency \, but you can change it with the "carrier harmonic #" control. Changing the index changes the relative strengths of the harmonics. Past a certain index (which depends on the carrier frequency) the lower sidebands begin to reflect about the left edge of the spectrum \, causing complicated interference effects., f 71; +#X text 119 407 This patch measures the spectrum of two-operator phase modulation. The carrier frequency is initially six times the modulation frequency \, but you can change it with the "carrier harmonic #" control. Changing the index changes the relative strengths of the harmonics. Past a certain index (which depends on the carrier frequency) the lower sidebands begin to reflect about the left edge of the spectrum \, causing complicated interference effects., f 71; #X obj 529 17 declare -stdpath ./; #X text 196 263 <-- repeatedly; #X text 156 240 <-- graph once; #X obj 71 293 hip~ 5; +#X text 393 364 ------ partial number ------; #X connect 0 0 3 1; #X connect 1 0 0 1; #X connect 2 0 10 0; -#X connect 2 0 41 0; +#X connect 2 0 40 0; #X connect 3 0 2 0; #X connect 4 0 1 0; #X connect 5 0 6 0; @@ -118,10 +119,10 @@ #X connect 7 0 3 0; #X connect 11 0 10 1; #X connect 12 0 10 2; -#X connect 24 0 0 0; -#X connect 25 0 24 0; -#X connect 25 0 34 1; -#X connect 33 0 34 0; -#X connect 34 0 7 0; -#X connect 35 0 33 0; -#X connect 41 0 8 0; +#X connect 23 0 0 0; +#X connect 24 0 23 0; +#X connect 24 0 33 1; +#X connect 32 0 33 0; +#X connect 33 0 7 0; +#X connect 34 0 32 0; +#X connect 40 0 8 0; diff --git a/doc/3.audio.examples/E10.complex.FM.pd b/doc/3.audio.examples/E10.complex.FM.pd index cb6c3b3a..1831902b 100644 --- a/doc/3.audio.examples/E10.complex.FM.pd +++ b/doc/3.audio.examples/E10.complex.FM.pd @@ -5,7 +5,7 @@ #X obj 129 407 cos~; #X obj 129 377 +~; #X obj 165 288 pack 0 50; -#X floatatom 165 239 0 0 300 0 - - - 0; +#X floatatom 165 239 5 0 300 0 - - - 0; #X obj 165 264 / 100; #X obj 71 208 phasor~; #X obj 129 493 output~; @@ -15,13 +15,12 @@ #X obj 273 232 inlet; #X obj 98 115 rfft~; #X obj 98 148 *~; -#X obj 129 148 *~; +#X obj 130 148 *~; #X obj 98 178 sqrt~; -#X obj 397 129 block~ 4096 1; #X obj 98 204 biquad~ 0 0 0 0 1; #X text 162 116 Fourier series; -#X text 167 169 magnitude; -#X text 165 154 calculate; +#X text 166 170 magnitude; +#X text 166 154 calculate; #X text 62 16 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later.; #X text 148 81 signal to analyze; #X text 258 184 delay two samples; @@ -42,28 +41,30 @@ #X obj 273 315 tabwrite~ E10-spectrum; #X text 162 585 set carrier multiplier and modulation multipliers after fundamental, f 38; #X msg 106 565 \; cm 8 \; m1 2 \; m2 3; +#X obj 397 130 block~ 4096; +#X text 395 103 Window size; #X connect 0 0 2 0; -#X connect 0 0 27 0; +#X connect 0 0 26 0; +#X connect 1 0 26 0; #X connect 1 0 27 0; -#X connect 1 0 28 0; #X connect 2 0 3 0; #X connect 2 0 3 1; #X connect 2 1 4 0; #X connect 2 1 4 1; #X connect 3 0 5 0; #X connect 4 0 5 0; -#X connect 5 0 7 0; -#X connect 7 0 28 0; -#X connect 15 0 18 0; -#X connect 16 0 15 0; -#X connect 17 0 26 0; -#X connect 18 0 17 0; -#X connect 19 0 16 0; -#X connect 22 0 27 0; -#X connect 22 0 28 0; -#X connect 23 0 22 0; -#X connect 26 0 30 0; -#X connect 26 1 20 0; +#X connect 5 0 6 0; +#X connect 6 0 27 0; +#X connect 14 0 17 0; +#X connect 15 0 14 0; +#X connect 16 0 25 0; +#X connect 17 0 16 0; +#X connect 18 0 15 0; +#X connect 21 0 26 0; +#X connect 21 0 27 0; +#X connect 22 0 21 0; +#X connect 25 0 29 0; +#X connect 25 1 19 0; #X restore 196 452 pd fft; #X obj 215 394 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 235 423 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; @@ -74,12 +75,11 @@ #X text 486 247 2; #X text 517 247 4; #X text 456 247 0; -#X text 506 271 -- partial number --; #X text 588 90 SPECTRUM; #X text 716 232 0; #X text 717 114 0.5; #X obj 147 207 osc~; -#X obj 268 147 r fundamental; +#X obj 274 147 r fundamental; #X text 549 247 6; #X text 582 247 8; #X text 610 247 10; @@ -94,27 +94,28 @@ #X floatatom 147 93 4 0 15 0 - - - 0; #X text 151 115 mod 1; #X obj 147 66 r m1; -#X text 194 241 index1; -#X obj 250 337 *~; -#X obj 268 313 line~; -#X obj 268 290 pack 0 50; -#X floatatom 268 241 0 0 300 0 - - - 0; -#X obj 268 266 / 100; -#X obj 250 209 osc~; -#X obj 250 184 *; -#X floatatom 250 93 4 0 15 0 - - - 0; -#X text 254 115 mod 2; -#X text 302 241 index2; -#X obj 250 66 r m2; +#X text 204 240 index1; +#X obj 256 337 *~; +#X obj 274 313 line~; +#X obj 274 290 pack 0 50; +#X floatatom 274 241 5 0 300 0 - - - 0; +#X obj 274 266 / 100; +#X obj 256 209 osc~; +#X obj 256 184 *; +#X floatatom 256 93 4 0 15 0 - - - 0; +#X text 260 115 mod 2; +#X text 313 241 index2; +#X obj 256 66 r m2; #X text 380 346 Now we introduce a second modulator oscillator. The carrier is on the 8th harmonic and the two modulators are at 2 and 3 times the fundamental. When either index of modulation is zero \, changing the other index gives the familiar 2-operator FM result. But if index2 is nonzero (try around 10 \, for example) then sliding index1 upward from 0 introduces sidebands around each of the sidebands., f 63; #X obj 623 21 declare -stdpath ./; #X text 256 422 <-- repeatedly; #X text 237 394 <-- graph once; #X obj 129 452 hip~ 5; +#X text 472 275 -------- partial number --------; #X connect 0 0 3 1; #X connect 1 0 0 1; #X connect 2 0 10 0; -#X connect 2 0 53 0; +#X connect 2 0 52 0; #X connect 3 0 2 0; #X connect 4 0 1 0; #X connect 5 0 6 0; @@ -122,23 +123,23 @@ #X connect 7 0 3 0; #X connect 11 0 10 1; #X connect 12 0 10 2; -#X connect 21 0 0 0; -#X connect 22 0 29 1; -#X connect 22 0 33 1; -#X connect 22 0 44 1; -#X connect 28 0 29 0; -#X connect 29 0 7 0; -#X connect 30 0 28 0; -#X connect 33 0 21 0; -#X connect 34 0 33 0; -#X connect 36 0 34 0; -#X connect 38 0 3 1; -#X connect 39 0 38 1; -#X connect 40 0 39 0; -#X connect 41 0 42 0; -#X connect 42 0 40 0; -#X connect 43 0 38 0; +#X connect 20 0 0 0; +#X connect 21 0 28 1; +#X connect 21 0 32 1; +#X connect 21 0 43 1; +#X connect 27 0 28 0; +#X connect 28 0 7 0; +#X connect 29 0 27 0; +#X connect 32 0 20 0; +#X connect 33 0 32 0; +#X connect 35 0 33 0; +#X connect 37 0 3 1; +#X connect 38 0 37 1; +#X connect 39 0 38 0; +#X connect 40 0 41 0; +#X connect 41 0 39 0; +#X connect 42 0 37 0; +#X connect 43 0 42 0; #X connect 44 0 43 0; -#X connect 45 0 44 0; -#X connect 48 0 45 0; -#X connect 53 0 8 0; +#X connect 47 0 44 0; +#X connect 52 0 8 0; diff --git a/doc/3.audio.examples/F01.pulse.pd b/doc/3.audio.examples/F01.pulse.pd index 168d07e2..55950f0a 100644 --- a/doc/3.audio.examples/F01.pulse.pd +++ b/doc/3.audio.examples/F01.pulse.pd @@ -1,78 +1,81 @@ -#N canvas 402 49 895 661 12; +#N canvas 367 49 897 731 12; #X declare -stdpath ./; -#X obj 264 151 line~; +#X obj 264 158 line~; #X floatatom 170 105 4 0 0 0 - - - 0; -#X obj 246 344 cos~; +#X obj 246 364 cos~; #N canvas 0 0 450 300 (subpatch) 0; #X array pulse-output 882 float 0; #X coords 0 1.02 882 -1.02 200 130 1; -#X restore 600 357 graph; -#X obj 170 132 phasor~ 0; -#X obj 264 127 pack 0 50; -#X floatatom 264 78 4 0 100 0 - - - 0; -#X text 167 84 frequency; +#X restore 604 444 graph; +#X obj 264 134 pack 0 50; +#X floatatom 264 85 4 0 90 0 - - - 0; +#X text 97 104 frequency; #X obj 170 156 -~ 0.5; #X obj 246 219 *~; -#X obj 264 102 / 10; -#X obj 246 288 clip~ -0.5 0.5; -#X obj 246 445 hip~ 5; +#X obj 264 109 / 10; +#X obj 246 308 clip~ -0.5 0.5; +#X obj 246 505 hip~ 5; #N canvas 0 0 450 300 (subpatch) 0; #X array phase-output 882 float 0; -#X coords 0 1.02 882 -1.02 200 60 1; -#X restore 600 82 graph; +#X coords 0 5 881 -5 200 175 1 0 0; +#X restore 604 57 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array clip-output 882 float 0; #X coords 0 1.02 882 -1.02 200 130 1; -#X restore 600 203 graph; +#X restore 604 290 graph; #X text 43 156 phase -1/2 to 1/2; #X text 78 131 phase 0 to 1; -#X text 92 24 PULSE GENERATOR; -#X obj 390 277 tabwrite~ phase-output; -#X obj 366 440 tabwrite~ pulse-output; -#X text 55 446 high pass filter to cut DC; -#X text 311 103 fix range; -#X text 318 152 smooth it; -#X text 306 177 add 1; -#X text 110 221 increase amplitude; -#X text 29 285 clip back to range -1/2 to 1/2; -#X text 87 330 cosine wave lookup (-1/2 and 1/2 give -1), f 22; -#X obj 264 178 +~ 1; -#X obj 387 352 tabwrite~ clip-output; -#X text 623 499 ---- 0.02 seconds ----; -#X obj 365 209 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 246 486 output~; -#X obj 246 367 +~ 1; -#X obj 246 390 *~ 0.5; -#X text 625 582 updated for Pd version 0.37; -#X text 19 367 add one (range now from 0 to 2); -#X text 82 389 ...and now from 0 to 1; -#X text 49 569 This patch computes a pulse train \, with an "index" control that essentially squeezes the pulses. If "bandwidth" is zero you get a pure cosine wave \, and for larger values of the bandwidth \, the cosine wave is squeezed to fill smaller portions of the waveform., f 75; -#X text 261 59 index; -#X text 807 77 0.5; -#X text 807 131 -0.5; -#X text 802 202 1; -#X text 804 321 -1; -#X text 804 361 1; -#X text 803 481 -1; -#X obj 670 17 declare -stdpath ./; -#X text 389 208 <-- click to graph; -#X connect 0 0 27 0; -#X connect 1 0 4 0; -#X connect 2 0 32 0; -#X connect 4 0 8 0; -#X connect 5 0 0 0; -#X connect 6 0 10 0; -#X connect 8 0 9 0; -#X connect 9 0 11 0; -#X connect 9 0 18 0; -#X connect 10 0 5 0; -#X connect 11 0 2 0; -#X connect 11 0 28 0; -#X connect 12 0 31 0; -#X connect 27 0 9 1; -#X connect 30 0 18 0; -#X connect 30 0 28 0; -#X connect 30 0 19 0; -#X connect 32 0 33 0; -#X connect 33 0 19 0; -#X connect 33 0 12 0; +#X text 364 36 PULSE GENERATOR; +#X obj 390 317 tabwrite~ phase-output; +#X obj 366 500 tabwrite~ pulse-output; +#X text 55 506 high pass filter to cut DC; +#X text 309 159 smooth it; +#X text 108 301 clip back to range -1/2 to 1/2, f 18; +#X text 87 350 cosine wave lookup (-1/2 and 1/2 give -1), f 22; +#X obj 387 392 tabwrite~ clip-output; +#X text 627 586 ---- 0.02 seconds ----; +#X obj 365 239 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 246 546 output~; +#X obj 246 407 +~ 1; +#X obj 246 450 *~ 0.5; +#X text 667 665 updated for Pd version 0.37; +#X text 121 400 add one (range now from 0 to 2), f 16; +#X text 147 441 ...and now from 0 to 1, f 12; +#X text 65 631 This patch computes a pulse train \, with an "index" control that essentially squeezes the pulses. If "bandwidth" is zero you get a pure cosine wave \, and for larger values of the bandwidth \, the cosine wave is squeezed to fill smaller portions of the waveform., f 75; +#X text 299 83 index; +#X text 806 283 1; +#X text 808 408 -1; +#X text 808 448 1; +#X text 807 568 -1; +#X obj 61 566 declare -stdpath ./; +#X text 389 238 <-- click to graph; +#X obj 170 132 phasor~; +#X obj 170 48 loadbang; +#X text 809 49 5; +#X text 810 219 -5; +#X text 98 224 increase amplitude up to -5 and 5 range, f 20; +#X text 302 110 fix range (1 to 10); +#X msg 170 78 220; +#X obj 264 189 +~ 1; +#X connect 0 0 47 0; +#X connect 1 0 40 0; +#X connect 2 0 27 0; +#X connect 4 0 0 0; +#X connect 5 0 9 0; +#X connect 7 0 8 0; +#X connect 8 0 10 0; +#X connect 8 0 17 0; +#X connect 9 0 4 0; +#X connect 10 0 2 0; +#X connect 10 0 23 0; +#X connect 11 0 26 0; +#X connect 25 0 17 0; +#X connect 25 0 23 0; +#X connect 25 0 18 0; +#X connect 27 0 28 0; +#X connect 28 0 11 0; +#X connect 28 0 18 0; +#X connect 40 0 7 0; +#X connect 41 0 46 0; +#X connect 46 0 1 0; +#X connect 47 0 8 1; diff --git a/doc/3.audio.examples/F02.just.say.pd b/doc/3.audio.examples/F02.just.say.pd index c9b8a8bb..274c6606 100644 --- a/doc/3.audio.examples/F02.just.say.pd +++ b/doc/3.audio.examples/F02.just.say.pd @@ -1,93 +1,94 @@ -#N canvas 530 63 741 497 12; +#N canvas 455 76 709 572 12; #X declare -stdpath ./; -#X obj 116 338 cos~; +#X obj 127 338 cos~; #N canvas 0 22 450 278 (subpatch) 0; #X array env-output 44100 float 0; #X coords 0 1.02 44100 -1.02 200 130 1; -#X restore 461 81 graph; -#X obj 59 235 -~ 0.5; -#X obj 116 283 *~; -#X obj 116 310 clip~ -0.5 0.5; -#X obj 116 365 hip~ 5; -#X obj 134 82 *~; -#X floatatom 213 187 4 0 0 0 - - - 0; -#X floatatom 213 213 4 0 0 0 - - - 0; -#X obj 134 44 phasor~ -4; -#X obj 134 240 +~ 0.5; -#X obj 170 143 tabwrite~ env-output; -#X text 460 216 --------- 1 second ---------; -#X floatatom 213 239 4 0 0 0 - - - 0; -#X obj 134 184 lop~ 130; +#X restore 415 117 graph; +#X obj 70 232 -~ 0.5; +#X obj 127 280 *~; +#X obj 127 307 clip~ -0.5 0.5; +#X obj 127 440 hip~ 5; +#X obj 145 79 *~; +#X floatatom 224 184 4 1 1000 0 - - - 0; +#X floatatom 224 210 4 0 0 0 - - - 0; +#X obj 145 41 phasor~ -4; +#X obj 145 237 +~ 0.5; +#X obj 181 140 tabwrite~ env-output; +#X text 414 252 --------- 1 second ---------; +#X floatatom 224 236 4 0 0 0 - - - 0; +#X obj 145 181 lop~ 130; #N canvas 704 266 342 431 freq 0; -#X obj 180 176 t f f; -#X obj 181 202 *; -#X obj 87 328 line 0 30; +#X obj 198 156 t f f; +#X obj 199 182 *; +#X obj 90 320 line 0 30; #X obj 90 132 t b b; #X obj 90 107 metro 100; -#X obj 87 295 pack; -#X obj 87 384 outlet; -#X floatatom 90 82 0 0 0 0 - - - 0; -#X floatatom 72 251 0 0 0 0 - - - 0; -#X floatatom 112 256 0 0 0 0 - - - 0; -#X obj 87 356 pack 0 30; -#X obj 73 210 + 150; -#X obj 90 31 loadbang; -#X msg 90 58 1; -#X obj 74 183 random 300; -#X obj 181 226 + 100; -#X obj 179 152 random 35; +#X obj 90 376 outlet; +#X floatatom 90 247 5 0 0 0 - - - 0; +#X floatatom 199 247 5 0 0 0 - - - 0; +#X obj 90 348 pack 0 30; +#X obj 90 210 + 150; +#X obj 90 34 loadbang; +#X obj 90 183 random 300; +#X obj 199 206 + 100; +#X obj 197 132 random 35; +#X obj 90 72 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 90 287 pack float float; #X connect 0 0 1 0; #X connect 0 1 1 1; -#X connect 1 0 15 0; -#X connect 2 0 10 0; -#X connect 3 0 14 0; -#X connect 3 1 16 0; +#X connect 1 0 12 0; +#X connect 2 0 8 0; +#X connect 3 0 11 0; +#X connect 3 1 13 0; #X connect 4 0 3 0; -#X connect 5 0 2 0; -#X connect 7 0 4 0; +#X connect 6 0 15 0; +#X connect 7 0 15 1; #X connect 8 0 5 0; -#X connect 9 0 5 1; -#X connect 10 0 6 0; -#X connect 11 0 8 0; -#X connect 12 0 13 0; -#X connect 13 0 7 0; -#X connect 14 0 11 0; -#X connect 15 0 4 1; -#X connect 15 0 9 0; -#X connect 16 0 0 0; -#X restore 59 155 pd freq; -#X obj 59 183 line~; -#X obj 59 208 phasor~; -#X text 225 36 negative frequency; -#X text 226 52 makes falling sawtooth; -#X text 163 81 square it to make a curve; -#X text 253 197 you can; -#X text 251 215 adjust these; -#X text 253 235 values; -#X text 269 286 We interrupt this series of patches to bring you an important message from Nancy Reagan. If \, anywhere \, at any time \, someone offers you an illicit drug \, just say one word in reply..., f 61; -#X text 269 354 Now that I'm sure you've heard this important message \, we can return to the essentially frivolous occupation of making turn-of-the-millennium western art music., f 61; -#X obj 134 211 *~ 6; -#X text 443 439 updated for Pd version 0.34; -#X obj 116 407 output~; -#X obj 488 18 declare -stdpath ./; -#X obj 170 112 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 194 112 <-- click to graph; -#X connect 0 0 5 0; +#X connect 9 0 6 0; +#X connect 10 0 14 0; +#X connect 11 0 9 0; +#X connect 12 0 4 1; +#X connect 12 0 7 0; +#X connect 13 0 0 0; +#X connect 14 0 4 0; +#X connect 15 0 2 0; +#X restore 70 152 pd freq; +#X obj 70 180 line~; +#X obj 70 205 phasor~; +#X text 174 78 square it to make a curve; +#X text 264 194 you can; +#X text 262 212 adjust these; +#X text 264 232 values; +#X text 345 309 We interrupt this series of patches to bring you an important message from Nancy Reagan. If \, anywhere \, at any time \, someone offers you an illicit drug \, just say one word in reply..., f 40; +#X text 345 407 Now that I'm sure you've heard this important message \, we can return to the essentially frivolous occupation of making turn-of-the-millennium western art music., f 40; +#X obj 145 208 *~ 6; +#X text 419 510 updated for Pd version 0.34; +#X obj 127 482 output~; +#X obj 483 49 declare -stdpath ./; +#X obj 181 109 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 205 109 <-- click to graph; +#X text 230 33 negative frequency generates downwards ramps, f 25; +#X obj 127 369 +~ 1; +#X obj 127 401 *~ 0.5; +#X connect 0 0 31 0; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 4 0 0 0; -#X connect 5 0 28 0; -#X connect 6 0 11 0; +#X connect 5 0 26 0; #X connect 6 0 14 0; +#X connect 6 0 11 0; #X connect 7 0 14 1; -#X connect 8 0 26 1; +#X connect 8 0 24 1; #X connect 9 0 6 0; #X connect 9 0 6 1; #X connect 10 0 3 1; #X connect 13 0 10 1; -#X connect 14 0 26 0; +#X connect 14 0 24 0; #X connect 15 0 16 0; #X connect 16 0 17 0; #X connect 17 0 2 0; -#X connect 26 0 10 0; -#X connect 30 0 11 0; +#X connect 24 0 10 0; +#X connect 28 0 11 0; +#X connect 31 0 32 0; +#X connect 32 0 5 0; diff --git a/doc/3.audio.examples/F03.pulse.spectrum.pd b/doc/3.audio.examples/F03.pulse.spectrum.pd index 4c561fed..bd7d6598 100644 --- a/doc/3.audio.examples/F03.pulse.spectrum.pd +++ b/doc/3.audio.examples/F03.pulse.spectrum.pd @@ -1,4 +1,4 @@ -#N canvas 602 31 641 655 12; +#N canvas 602 38 641 655 12; #X declare -stdpath ./; #X obj 193 184 line~; #X obj 71 255 cos~; @@ -17,14 +17,13 @@ #X text 82 469 Here is a measured amplitude spectrum for the pulse train. Notice that \, other than a smallish spillover \, the energy sits in one "lobe" whose changing width justifies our calling the squeeze factor the "bandwidth.", f 68; #X text 82 530 The spectrum is in units of amplitude. The sidelobes \, although they look small \, are actually only about 34 dB down. You can design more complicated pulse trains \, little Blackman window functions \, which control the sidelobes much better., f 68; #X obj 71 375 output~; -#N canvas 424 208 569 608 fft 0; +#N canvas 715 281 537 493 fft 0; #X obj 43 105 inlet~; -#X obj 243 263 inlet; +#X obj 142 264 inlet; #X obj 63 136 rfft~; #X obj 63 169 *~; #X obj 95 169 *~; #X obj 63 199 sqrt~; -#X obj 366 153 block~ 4096 1; #X obj 63 225 biquad~ 0 0 0 0 1; #X text 127 137 Fourier series; #X text 132 190 magnitude; @@ -33,39 +32,41 @@ #X text 105 104 signal to analyze; #X text 194 216 delay two samples; #X text 192 234 for better graphing; -#X obj 298 501 samplerate~; -#X obj 298 524 / 256; -#X obj 272 328 metro 500; -#X obj 272 292 inlet; -#X text 325 290 toggle to graph repeatedly; -#X text 297 263 bang to graph once; +#X obj 383 280 samplerate~; +#X obj 383 303 / 256; +#X obj 178 328 metro 500; +#X obj 178 292 inlet; +#X text 231 290 toggle to graph repeatedly, f 15; +#X text 185 264 bang to graph once; #X obj 63 249 /~ 4096; -#X obj 43 392 tabwrite~ F03-signal; -#X obj 272 366 tabwrite~ F03-spectrum; -#X obj 298 476 bang~; -#X msg 243 389 \; pd dsp 1; -#X obj 298 549 s freq; +#X obj 43 422 tabwrite~ F03-signal; +#X obj 143 396 tabwrite~ F03-spectrum; +#X obj 383 357 s freq; +#X obj 366 153 block~ 4096; +#X text 368 126 Window size; +#X floatatom 383 329 10 0 0 0 - - - 0; +#X obj 383 255 loadbang; +#X obj 142 360 b; #X connect 0 0 2 0; -#X connect 0 0 22 0; -#X connect 1 0 22 0; -#X connect 1 0 23 0; -#X connect 1 0 25 0; +#X connect 0 0 21 0; +#X connect 1 0 28 0; #X connect 2 0 3 0; #X connect 2 0 3 1; #X connect 2 1 4 0; #X connect 2 1 4 1; #X connect 3 0 5 0; #X connect 4 0 5 0; -#X connect 5 0 7 0; -#X connect 7 0 21 0; -#X connect 15 0 16 0; -#X connect 16 0 26 0; -#X connect 17 0 22 0; -#X connect 17 0 23 0; -#X connect 18 0 17 0; -#X connect 18 0 25 0; -#X connect 21 0 23 0; -#X connect 24 0 15 0; +#X connect 5 0 6 0; +#X connect 6 0 20 0; +#X connect 14 0 15 0; +#X connect 15 0 26 0; +#X connect 16 0 28 0; +#X connect 17 0 16 0; +#X connect 20 0 22 0; +#X connect 26 0 23 0; +#X connect 27 0 14 0; +#X connect 28 0 22 0; +#X connect 28 0 21 0; #X restore 134 332 pd fft; #X obj 153 301 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 193 332 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; diff --git a/doc/3.audio.examples/F04.waveshaping.pulse.pd b/doc/3.audio.examples/F04.waveshaping.pulse.pd index 7ce03c29..f5686cae 100644 --- a/doc/3.audio.examples/F04.waveshaping.pulse.pd +++ b/doc/3.audio.examples/F04.waveshaping.pulse.pd @@ -1,8 +1,8 @@ -#N canvas 477 81 788 630 12; +#N canvas 429 79 782 576 12; #X declare -stdpath ./; #X obj 266 179 line~; #X obj 266 155 pack 0 50; -#X floatatom 220 54 4 0 0 0 - - - 0; +#X floatatom 220 54 4 0 100 0 - - - 0; #X obj 142 116 *~; #X obj 220 80 / 10; #X obj 220 104 moses 0; @@ -19,86 +19,86 @@ #N canvas 0 0 450 300 (subpatch) 0; #X array F04-signal 882 float 0; #X coords 0 1.02 882 -1.02 200 130 1; -#X restore 536 360 graph; +#X restore 536 320 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array F04-spectrum 259 float 0; #X coords 0 1.01 258 -0.008 256 200 1; -#X restore 479 77 graph; -#X text 555 497 ---- 0.02 seconds ----; -#X text 506 276 2; -#X text 537 276 4; -#X text 476 276 0; -#X text 546 301 -- partial number --; -#X text 569 276 6; -#X text 602 276 8; -#X text 630 276 10; -#X text 662 276 12; -#X text 694 276 14; -#X obj 88 294 output~; -#N canvas 490 195 571 609 fft 0; -#X obj 51 95 inlet~; -#X obj 256 264 inlet; -#X obj 71 129 rfft~; -#X obj 71 162 *~; -#X obj 102 162 *~; -#X obj 71 192 sqrt~; -#X obj 364 143 block~ 4096 1; -#X obj 71 218 biquad~ 0 0 0 0 1; -#X text 135 130 Fourier series; -#X text 143 179 magnitude; -#X text 141 164 calculate; +#X restore 479 37 graph; +#X text 555 457 ---- 0.02 seconds ----; +#X text 506 236 2; +#X text 537 236 4; +#X text 476 236 0; +#X text 569 236 6; +#X text 602 236 8; +#X text 630 236 10; +#X text 662 236 12; +#X text 694 236 14; +#X obj 88 293 output~; +#N canvas 745 198 546 520 fft 0; #X text 60 23 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later.; -#X text 115 95 signal to analyze; -#X text 208 211 delay two samples; -#X text 206 229 for better graphing; -#X obj 296 488 samplerate~; -#X obj 283 317 metro 500; -#X obj 283 286 inlet; -#X text 333 286 toggle to graph repeatedly; -#X text 310 264 bang to graph once; -#X obj 71 242 /~ 4096; -#X obj 296 463 bang~; -#X obj 296 511 / 512; -#X obj 51 349 tabwrite~ F04-signal; -#X obj 283 345 tabwrite~ F04-spectrum; -#X obj 296 537 s freq/2; -#X msg 256 375 \; pd dsp 1; -#X connect 0 0 2 0; -#X connect 0 0 23 0; -#X connect 1 0 23 0; -#X connect 1 0 24 0; -#X connect 1 0 26 0; -#X connect 2 0 3 0; -#X connect 2 0 3 1; -#X connect 2 1 4 0; -#X connect 2 1 4 1; -#X connect 3 0 5 0; -#X connect 4 0 5 0; -#X connect 5 0 7 0; -#X connect 7 0 20 0; -#X connect 15 0 22 0; -#X connect 16 0 23 0; -#X connect 16 0 24 0; -#X connect 17 0 16 0; -#X connect 17 0 26 0; -#X connect 20 0 24 0; -#X connect 21 0 15 0; -#X connect 22 0 25 0; +#X obj 389 294 samplerate~; +#X obj 389 317 / 512; +#X obj 389 373 s freq/2; +#X obj 364 143 block~ 4096; +#X text 360 115 Window size; +#X floatatom 389 345 9 0 0 0 - - - 0; +#X obj 43 105 inlet~; +#X obj 142 264 inlet; +#X obj 63 136 rfft~; +#X obj 63 169 *~; +#X obj 95 169 *~; +#X obj 63 199 sqrt~; +#X obj 63 225 biquad~ 0 0 0 0 1; +#X text 127 137 Fourier series; +#X text 132 190 magnitude; +#X text 130 175 calculate; +#X text 105 104 signal to analyze; +#X text 194 216 delay two samples; +#X text 192 234 for better graphing; +#X obj 178 328 metro 500; +#X obj 178 292 inlet; +#X text 231 290 toggle to graph repeatedly, f 15; +#X text 185 264 bang to graph once; +#X obj 63 249 /~ 4096; +#X obj 142 360 b; +#X obj 143 396 tabwrite~ F04-spectrum; +#X obj 43 422 tabwrite~ F04-signal; +#X obj 389 269 loadbang; +#X connect 1 0 2 0; +#X connect 2 0 6 0; +#X connect 6 0 3 0; +#X connect 7 0 9 0; +#X connect 7 0 27 0; +#X connect 8 0 25 0; +#X connect 9 0 10 0; +#X connect 9 0 10 1; +#X connect 9 1 11 0; +#X connect 9 1 11 1; +#X connect 10 0 12 0; +#X connect 11 0 12 0; +#X connect 12 0 13 0; +#X connect 13 0 24 0; +#X connect 20 0 25 0; +#X connect 21 0 20 0; +#X connect 24 0 26 0; +#X connect 25 0 26 0; +#X connect 25 0 27 0; +#X connect 28 0 1 0; #X restore 145 257 pd fft; #X obj 164 232 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 205 257 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X obj 142 89 osc~; -#X text 556 541 updated for Pd version 0.37; -#X text 44 546 NOTE: The PAF algorithm is protected by patents belonging to IRCAM. Noncommercial use seems to be fine with them but contact them first if you want to sell something using this.; -#X text 45 504 This is the form of pulse train used in the original Phase Aligned Formant (PAF) algorithm.; -#X text 44 373 Here we use waveshaping to make another form of pulse train. This one has a neat spectrum: the partials drop off exponentially (with the "bandwidth" controlling the rate of dropoff.) In later patches we'll use a wavetable to do the waveshaping but for simplicity \, it's done algebraically here. The oscillator runs at half the fundamental frequency. The symmetry of the waveshaping doubles the frequency of the output.; -#X text 741 261 0; -#X text 738 74 1; +#X text 20 386 Here we use waveshaping to make another form of pulse train. This one has a neat spectrum: the partials drop off exponentially (with the "bandwidth" controlling the rate of dropoff.) In later patches we'll use a wavetable to do the waveshaping but for simplicity \, it's done algebraically here. The oscillator runs at half the fundamental frequency. The symmetry of the waveshaping doubles the frequency of the output., f 66; +#X text 741 221 0; +#X text 738 34 1; #X obj 142 64 r freq/2; -#X obj 593 22 declare -stdpath ./; +#X obj 230 317 declare -stdpath ./; #X text 186 232 <-- graph once; #X text 226 256 <-- repeatedly; #X obj 88 257 hip~ 5; +#X text 503 264 ------ partial number ------; +#X text 20 495 This is the form of pulse train used in the original Phase Aligned Formant (PAF) algorithm \, which was protected by patents belonging to IRCAM from 1993 to 2011, f 66; +#X text 544 507 updated for Pd version 0.55; #X connect 0 0 3 1; #X connect 1 0 0 0; #X connect 2 0 4 0; @@ -111,11 +111,11 @@ #X connect 8 0 11 1; #X connect 9 0 10 0; #X connect 9 0 11 0; -#X connect 10 0 29 0; -#X connect 10 0 43 0; +#X connect 10 0 39 0; +#X connect 10 0 28 0; #X connect 11 0 10 1; -#X connect 30 0 29 1; -#X connect 31 0 29 2; -#X connect 32 0 3 0; -#X connect 39 0 32 0; -#X connect 43 0 28 0; +#X connect 29 0 28 1; +#X connect 30 0 28 2; +#X connect 31 0 3 0; +#X connect 35 0 31 0; +#X connect 39 0 27 0; diff --git a/doc/3.audio.examples/F05.ring.modulation.pd b/doc/3.audio.examples/F05.ring.modulation.pd index b11ae05e..7133a6b0 100644 --- a/doc/3.audio.examples/F05.ring.modulation.pd +++ b/doc/3.audio.examples/F05.ring.modulation.pd @@ -7,14 +7,13 @@ #N canvas 0 0 450 300 (subpatch) 0; #X array F05-spectrum 256 float 0; #X coords 0 0.51 255 -0.008 256 130 1; -#X restore 449 77 graph; +#X restore 457 50 graph; #X text 523 433 ---- 0.02 seconds ----; #X text 542 501 updated for Pd version 0.37; -#X text 445 210 0; -#X text 484 229 -- partial number --; -#X text 711 197 0; -#X text 708 74 0.5; -#X floatatom 89 57 4 0 100 0 - - - 0; +#X text 453 183 0; +#X text 719 170 0; +#X text 716 47 0.5; +#X floatatom 89 57 5 0 100 0 - - - 0; #N canvas 667 118 574 518 pulse-train 0; #X obj 229 289 line~; #X obj 99 368 cos~; @@ -53,93 +52,95 @@ #X connect 18 0 17 0; #X restore 89 82 pd pulse-train; #X obj 89 225 *~; -#X text 171 140 multiple of fundamental; +#X text 189 140 multiple of fundamental; #X obj 89 292 output~; -#N canvas 122 211 563 534 fft 0; -#X obj 19 61 inlet~; -#X obj 208 212 inlet; -#X obj 29 92 rfft~; -#X obj 29 125 *~; -#X obj 60 125 *~; -#X obj 29 155 sqrt~; -#X obj 332 109 block~ 4096 1; -#X obj 29 181 biquad~ 0 0 0 0 1; -#X text 93 93 Fourier series; -#X text 98 146 magnitude; -#X text 96 131 calculate; -#X text 21 3 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later.; -#X text 83 61 signal to analyze; -#X text 193 164 delay two samples; -#X text 191 182 for better graphing; -#X obj 264 434 samplerate~; -#X obj 245 262 metro 500; -#X obj 245 233 inlet; -#X text 298 231 toggle to graph repeatedly; -#X text 262 212 bang to graph once; -#X obj 29 205 /~ 4096; -#X obj 264 409 bang~; -#X obj 264 483 s freq; -#X obj 264 457 / 256; -#X obj 19 295 tabwrite~ F05-signal; -#X obj 245 294 tabwrite~ F05-spectrum; -#X msg 224 321 \; pd dsp 1; -#X connect 0 0 2 0; -#X connect 0 0 24 0; -#X connect 1 0 24 0; -#X connect 1 0 25 0; -#X connect 1 0 26 0; -#X connect 2 0 3 0; -#X connect 2 0 3 1; -#X connect 2 1 4 0; -#X connect 2 1 4 1; -#X connect 3 0 5 0; -#X connect 4 0 5 0; -#X connect 5 0 7 0; -#X connect 7 0 20 0; -#X connect 15 0 23 0; -#X connect 16 0 24 0; -#X connect 16 0 25 0; -#X connect 17 0 16 0; -#X connect 17 0 26 0; -#X connect 20 0 25 0; -#X connect 21 0 15 0; -#X connect 23 0 22 0; -#X restore 147 254 pd fft; #X obj 166 228 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 207 254 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 477 210 2; -#X text 509 210 4; -#X text 541 210 6; -#X text 573 210 8; -#X text 606 210 10; -#X text 638 210 12; -#X text 669 210 14; +#X text 485 183 2; +#X text 517 183 4; +#X text 549 183 6; +#X text 581 183 8; +#X text 614 183 10; +#X text 646 183 12; +#X text 677 183 14; #X text 712 295 1; #X text 712 419 -1; #X text 156 196 modulating oscillator; #X text 64 16 RING MODULATED PULSE TRAINS; #X text 69 371 Now we take a pulse train and ring modulate it \, which effectively aliases the spectrum so that it is centered at any desired partial number. The "bandwidth" control still affects the shape of the peak \, independently of where it is centered. This generates a formant centered at the given partial., f 55; -#X floatatom 107 127 0 0 100 0 - - - 0; +#X floatatom 107 127 6 0 100 0 - - - 0; #X obj 107 193 osc~; #X obj 107 165 *; #X obj 141 165 r freq; #X text 69 467 This patch is limited to making formants centered on harmonics. The center frequency thus can't be moved smoothly up and down at will (try shift-clicking on modulation frequency to make fractions). Next we'll look at two techniques for sliding a formant frequency without losing harmonicity., f 55; #X text 201 97 generator from before; -#X obj 593 25 declare -stdpath ./; +#X obj 234 312 declare -stdpath ./; #X text 188 228 <-- graph once; #X text 228 253 <-- repeatedly; -#X text 124 57 <-- bandwidth; +#X text 140 57 <-- bandwidth; #X text 202 81 <-- pulse train; -#X text 143 126 <-- modulation frequency as; +#X text 161 126 <-- modulation frequency as; #X obj 89 258 hip~ 5; +#N canvas 715 281 537 493 fft 0; +#X obj 43 105 inlet~; +#X obj 142 264 inlet; +#X obj 63 136 rfft~; +#X obj 63 169 *~; +#X obj 95 169 *~; +#X obj 63 199 sqrt~; +#X obj 63 225 biquad~ 0 0 0 0 1; +#X text 127 137 Fourier series; +#X text 132 190 magnitude; +#X text 130 175 calculate; +#X text 60 26 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later.; +#X text 105 104 signal to analyze; +#X text 194 216 delay two samples; +#X text 192 234 for better graphing; +#X obj 383 280 samplerate~; +#X obj 383 303 / 256; +#X obj 178 328 metro 500; +#X obj 178 292 inlet; +#X text 231 290 toggle to graph repeatedly, f 15; +#X text 185 264 bang to graph once; +#X obj 63 249 /~ 4096; +#X obj 383 357 s freq; +#X obj 366 153 block~ 4096; +#X text 368 126 Window size; +#X floatatom 383 329 10 0 0 0 - - - 0; +#X obj 383 255 loadbang; +#X obj 142 360 b; +#X obj 143 396 tabwrite~ F05-spectrum; +#X obj 43 422 tabwrite~ F05-signal; +#X connect 0 0 2 0; +#X connect 0 0 28 0; +#X connect 1 0 26 0; +#X connect 2 0 3 0; +#X connect 2 0 3 1; +#X connect 2 1 4 0; +#X connect 2 1 4 1; +#X connect 3 0 5 0; +#X connect 4 0 5 0; +#X connect 5 0 6 0; +#X connect 6 0 20 0; +#X connect 14 0 15 0; +#X connect 15 0 24 0; +#X connect 16 0 26 0; +#X connect 17 0 16 0; +#X connect 20 0 27 0; +#X connect 24 0 21 0; +#X connect 25 0 14 0; +#X connect 26 0 27 0; +#X connect 26 0 28 0; +#X restore 147 254 pd fft; +#X text 481 211 ------ partial number ------; +#X connect 7 0 8 0; #X connect 8 0 9 0; -#X connect 9 0 10 0; -#X connect 10 0 13 0; -#X connect 10 0 40 0; -#X connect 14 0 13 1; -#X connect 15 0 13 2; -#X connect 28 0 30 0; -#X connect 29 0 10 1; -#X connect 30 0 29 0; -#X connect 31 0 30 1; -#X connect 40 0 12 0; +#X connect 9 0 38 0; +#X connect 9 0 39 0; +#X connect 12 0 39 1; +#X connect 13 0 39 2; +#X connect 26 0 28 0; +#X connect 27 0 9 1; +#X connect 28 0 27 0; +#X connect 29 0 28 1; +#X connect 38 0 11 0; diff --git a/doc/3.audio.examples/F06.packets.pd b/doc/3.audio.examples/F06.packets.pd index 5ce627ef..b59fabb7 100644 --- a/doc/3.audio.examples/F06.packets.pd +++ b/doc/3.audio.examples/F06.packets.pd @@ -1,25 +1,25 @@ #N canvas 399 42 818 674 12; #X declare -stdpath ./; -#X obj 374 384 line~; +#X obj 373 374 line~; #X obj 106 433 cos~; #N canvas 0 0 450 300 (subpatch) 0; #X array pulse-output 882 float 0; #X coords 0 1 882 -1 200 130 1; -#X restore 563 425 graph; -#X obj 374 361 pack 0 50; -#X floatatom 374 315 0 0 0 0 - - - 0; +#X restore 563 415 graph; +#X obj 373 351 pack 0 50; +#X floatatom 373 305 6 0 0 0 - - - 0; #X obj 166 332 -~ 0.5; #X obj 106 381 *~; -#X obj 374 338 / 10; +#X obj 373 328 / 10; #X obj 106 406 clip~ -0.5 0.5; -#X text 372 296 bandwidth; -#X obj 374 407 +~ 1; +#X text 371 286 bandwidth; +#X obj 373 397 +~ 1; #X obj 106 456 +~ 1; #X obj 247 462 cos~; #X obj 106 518 *~; #X floatatom 265 303 4 0 0 0 - - - 0; #X obj 265 327 / 10; -#X text 563 558 --- 0.02 seconds ---; +#X text 592 552 --- 0.02 seconds ---; #X obj 247 436 *~; #N canvas 462 254 698 213 graph 0; #X obj 68 57 inlet~; @@ -43,11 +43,11 @@ #N canvas 0 0 450 300 (subpatch) 0; #X array carrier 882 float 0; #X coords 0 1 881 -1 200 140 1; -#X restore 563 247 graph; +#X restore 563 237 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array window 882 float 0; #X coords 0 1 881 -1 200 140 1; -#X restore 564 74 graph; +#X restore 564 64 graph; #X floatatom 166 281 4 0 0 0 - - - 0; #X obj 166 307 phasor~ 100; #X text 51 16 WINDOWED PACKETS; @@ -58,22 +58,22 @@ #X obj 265 529 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X text 571 623 updated for Pd version 0.37; #X obj 106 479 *~ 0.5; -#X text 767 200 -1; -#X text 769 70 1; -#X text 767 373 -1; -#X text 771 243 1; -#X text 768 544 -1; -#X text 771 419 1; -#X text 38 135 In the patch below \, the "clip~" followed by "cos~" and "+~ 1" is the enveloping ("windowing") function \, which appears in the top graph. The carrier \, on the other hand \, is a broken sinusoid made by amplifying the phasor~ (the "*~" controlled by "center freq.") and taking the cos~ of the result. The "breaks" in the sinusoid only occur when the enveloping signal is zero., f 68; +#X text 767 190 -1; +#X text 769 60 1; +#X text 767 363 -1; +#X text 771 233 1; +#X text 768 534 -1; +#X text 771 409 1; #X text 54 441 raised; #X text 54 456 cosine; #X text 150 242 fundamental frequency, f 11; #X text 307 476 desired center frequency but its phase is reset each fundamental period., f 24; #X text 253 253 center freq. (in tenths of fundamental), f 13; -#X obj 618 15 declare -stdpath ./; +#X obj 260 617 declare -stdpath ./; #X text 287 527 <-- graph; #X text 286 463 <-- this cosine goes at the; #X obj 106 556 hip~ 5; +#X text 38 135 In the patch below \, the [clip~] followed by [cos~] and [+~ 1] is the enveloping ("windowing") function \, which appears in the top graph. The carrier \, on the other hand \, is a broken sinusoid made by amplifying the [phasor~] (the [*~] controlled by "center freq.") and taking the [cos~] of the result. The "breaks" in the sinusoid only occur when the enveloping signal is zero., f 68; #X connect 0 0 10 0; #X connect 1 0 11 0; #X connect 3 0 0 0; @@ -88,7 +88,7 @@ #X connect 12 0 13 1; #X connect 12 0 18 2; #X connect 13 0 18 0; -#X connect 13 0 48 0; +#X connect 13 0 47 0; #X connect 14 0 15 0; #X connect 15 0 20 0; #X connect 17 0 12 0; @@ -99,4 +99,4 @@ #X connect 30 0 18 3; #X connect 32 0 13 0; #X connect 32 0 18 1; -#X connect 48 0 29 0; +#X connect 47 0 29 0; diff --git a/doc/3.audio.examples/F07.packet.spectrum.pd b/doc/3.audio.examples/F07.packet.spectrum.pd index 43a9b9de..0a1ce1af 100644 --- a/doc/3.audio.examples/F07.packet.spectrum.pd +++ b/doc/3.audio.examples/F07.packet.spectrum.pd @@ -1,45 +1,40 @@ -#N canvas 429 51 731 641 12; +#N canvas 532 66 639 719 12; #X declare -stdpath ./; -#X obj 353 355 line~; -#X obj 89 448 cos~; -#X obj 353 331 pack 0 50; -#X floatatom 353 259 0 0 0 0 - - - 0; -#X obj 89 360 -~ 0.5; -#X obj 89 399 *~; -#X obj 353 283 / 10; -#X obj 89 424 clip~ -0.5 0.5; -#X text 353 237 bandwidth; -#X obj 353 379 +~ 1; -#X obj 90 471 +~ 1; -#X obj 239 444 cos~; -#X obj 90 500 *~; -#X floatatom 257 273 4 0 0 0 - - - 0; -#X obj 257 297 / 10; -#X obj 239 418 *~; -#X text 255 228 center; -#X text 255 247 freq.; -#X obj 353 307 max 0; -#X obj 257 369 line~; -#X obj 257 345 pack 0 50; -#X obj 257 321 max 0; -#X floatatom 89 312 4 0 0 0 - - - 0; -#X obj 89 336 phasor~ 100; -#X text 85 287 freq.; -#X text 85 268 fundamental; +#X obj 153 376 line~; +#X obj 59 489 cos~; +#X obj 153 352 pack 0 50; +#X floatatom 153 280 4 0 0 0 - - - 0; +#X obj 59 381 -~ 0.5; +#X obj 59 440 *~; +#X obj 153 304 / 10; +#X obj 59 465 clip~ -0.5 0.5; +#X text 189 281 bandwidth; +#X obj 153 400 +~ 1; +#X obj 60 512 +~ 1; +#X obj 218 485 cos~; +#X obj 60 551 *~; +#X floatatom 236 324 5 0 0 0 - - - 0; +#X obj 236 348 / 10; +#X obj 218 459 *~; +#X obj 153 328 max 0; +#X obj 236 420 line~; +#X obj 236 396 pack 0 50; +#X obj 236 372 max 0; +#X floatatom 59 333 5 0 0 0 - - - 0; +#X obj 59 357 phasor~ 100; #N canvas 0 22 450 278 (subpatch) 0; #X array spectrum 128 float 0; #X coords 0 500 128 0 256 130 1; -#X restore 428 396 graph; -#X msg 153 502 bang; -#N canvas 590 187 368 296 fft 0; +#X restore 324 458 graph; +#N canvas 590 187 344 253 fft 0; #X obj 46 48 inlet~; #X obj 137 179 tabwrite~ spectrum; -#X obj 137 143 inlet; +#X obj 137 46 inlet; #X obj 46 78 rfft~; #X obj 46 111 *~; -#X obj 77 111 *~; -#X obj 77 142 sqrt~; -#X obj 165 82 block~ 1024 1; +#X obj 78 111 *~; +#X obj 78 142 sqrt~; +#X obj 163 114 block~ 1024; #X connect 0 0 3 0; #X connect 2 0 1 0; #X connect 3 0 4 0; @@ -49,17 +44,20 @@ #X connect 4 0 6 0; #X connect 5 0 6 0; #X connect 6 0 1 0; -#X restore 114 528 pd fft; -#X text 427 532 0; -#X text 675 532 5512; -#X text 69 26 WINDOWED PACKET SPECTRUM; -#X text 94 75 Here's the spectrum you get. Note that even if you put the center frequency right on a partial \, there is significant energy in neighboring partials (try fundamental 440 \, "center freq" 30 \, bandwidth 0.), f 76; -#X text 94 129 The center frequency is in units of ten per partial \, or in other words a value of "30" means "centered on the third partial"., f 76; -#X text 482 574 updated for Pd version 0.34; -#X text 94 169 This technique only works if you're doing Hanning-window shaped PWM--you can't combine this naturally with FM or with the waveshaping technique we'll see later., f 76; -#X text 194 502 <= graph; -#X obj 90 569 output~; -#X obj 537 27 declare -stdpath ./; +#X restore 84 589 pd fft; +#X text 323 594 0; +#X text 571 594 5512; +#X text 122 23 WINDOWED PACKET SPECTRUM; +#X text 57 69 Here's the spectrum you get. Note that even if you put the center frequency right on a partial \, there is significant energy in neighboring partials (try fundamental 440 \, "center freq" 30 \, bandwidth 0.), f 63; +#X text 56 136 The center frequency is in units of ten per partial \, or in other words a value of "30" means "centered on the third partial"., f 63; +#X text 373 654 updated for Pd version 0.34; +#X text 55 192 This technique only works if you're doing Hanning-window shaped PWM--you can't combine this naturally with FM or with the waveshaping technique we'll see later., f 63; +#X obj 60 630 output~; +#X obj 420 381 declare -stdpath ./; +#X obj 123 562 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 145 560 <-- graph; +#X text 279 323 center freq.; +#X text 35 296 fundamental frequency, f 11; #X connect 0 0 9 0; #X connect 1 0 10 0; #X connect 2 0 0 0; @@ -67,20 +65,20 @@ #X connect 4 0 5 0; #X connect 4 0 15 0; #X connect 5 0 7 0; -#X connect 6 0 18 0; +#X connect 6 0 16 0; #X connect 7 0 1 0; #X connect 9 0 5 1; #X connect 10 0 12 0; #X connect 11 0 12 1; -#X connect 12 0 28 0; -#X connect 12 0 37 0; +#X connect 12 0 23 0; +#X connect 12 0 31 0; #X connect 13 0 14 0; -#X connect 14 0 21 0; +#X connect 14 0 19 0; #X connect 15 0 11 0; -#X connect 18 0 2 0; -#X connect 19 0 15 1; -#X connect 20 0 19 0; -#X connect 21 0 20 0; -#X connect 22 0 23 0; -#X connect 23 0 4 0; -#X connect 27 0 28 1; +#X connect 16 0 2 0; +#X connect 17 0 15 1; +#X connect 18 0 17 0; +#X connect 19 0 18 0; +#X connect 20 0 21 0; +#X connect 21 0 4 0; +#X connect 33 0 23 1; diff --git a/doc/3.audio.examples/F08.two.cosines.pd b/doc/3.audio.examples/F08.two.cosines.pd index 638263d3..75a63b1d 100644 --- a/doc/3.audio.examples/F08.two.cosines.pd +++ b/doc/3.audio.examples/F08.two.cosines.pd @@ -3,7 +3,7 @@ #X obj 114 329 cos~; #X floatatom 161 118 4 0 100 0 - - - 0; #X obj 161 142 / 10; -#X text 477 507 --- 0.02 seconds ---; +#X text 486 507 --- 0.02 seconds ---; #X obj 114 299 *~; #X obj 161 214 line~; #X obj 161 166 max 0; @@ -11,9 +11,7 @@ #X array F08-carrier 882 float 0; #X coords 0 2 881 -2 200 140 1; #X restore 455 356 graph; -#X floatatom 64 221 4 0 0 0 - - - 0; -#X text 43 173 fundamental; -#X text 43 192 frequency; +#X floatatom 64 221 5 0 0 0 - - - 0; #X obj 156 329 cos~; #X obj 197 242 wrap~; #X obj 161 269 -~; @@ -22,46 +20,46 @@ #X obj 179 424 *~; #X obj 161 464 +~; #X obj 161 190 pack 0 50; -#X text 211 329 synthesize the two partials; +#X text 210 329 synthesize the two partials; #X text 461 589 updated for Pd version 0.37; -#X obj 161 559 output~; +#X obj 161 567 output~; #X text 282 125 The other \, spiffier way is to make a sum of cosines to interpolate between adjacent harmonics. Suppose for example we want a center frequency of 5.3 (in units of the fundamental.) We just take partial 5 with amplitude 0.7 and partial 6 with amplitude 0.3:, f 52; -#X obj 246 511 tabwrite~ F08-carrier; -#X obj 246 486 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 246 519 tabwrite~ F08-carrier; +#X obj 246 488 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 64 245 phasor~ 100; -#X text 100 71 center frequency (in; -#X text 99 91 tenths of fundamental); #X text 38 24 MOVABLE CENTER FREQUENCY BY ADDING TWO COSINES; #X text 249 241 the fractional part "q"; -#X text 210 268 subtract to get the integer part "k"; -#X text 206 301 multiply phase by k and k+1; +#X text 210 269 subtract to get the integer part "k"; +#X text 210 299 multiply phase by k and k+1; #X text 204 375 c2 - c1; #X text 217 422 q * (c2 - c1); #X text 196 459 q * c2 + (1-q) * c1; #X obj 524 27 declare -stdpath ./; -#X text 269 485 <-- graph; -#X obj 161 510 hip~ 5; -#X connect 0 0 15 1; -#X connect 0 0 17 0; +#X text 269 487 <-- graph; +#X obj 161 518 hip~ 5; +#X text 48 181 fundamental frequency, f 11; +#X text 83 76 center frequency (in tenths of fundamental), f 22; +#X connect 0 0 13 1; +#X connect 0 0 15 0; #X connect 1 0 2 0; #X connect 2 0 6 0; #X connect 4 0 0 0; -#X connect 4 0 14 0; -#X connect 5 0 13 0; -#X connect 5 0 12 0; -#X connect 6 0 18 0; -#X connect 8 0 25 0; -#X connect 11 0 15 0; -#X connect 12 0 13 1; -#X connect 12 0 16 1; -#X connect 13 0 4 1; -#X connect 14 0 11 0; -#X connect 15 0 16 0; -#X connect 16 0 17 1; -#X connect 17 0 23 0; -#X connect 17 0 37 0; -#X connect 18 0 5 0; -#X connect 24 0 23 0; -#X connect 25 0 4 0; -#X connect 25 0 14 1; -#X connect 37 0 21 0; +#X connect 4 0 12 0; +#X connect 5 0 11 0; +#X connect 5 0 10 0; +#X connect 6 0 16 0; +#X connect 8 0 23 0; +#X connect 9 0 13 0; +#X connect 10 0 11 1; +#X connect 10 0 14 1; +#X connect 11 0 4 1; +#X connect 12 0 9 0; +#X connect 13 0 14 0; +#X connect 14 0 15 1; +#X connect 15 0 21 0; +#X connect 15 0 33 0; +#X connect 16 0 5 0; +#X connect 22 0 21 0; +#X connect 23 0 4 0; +#X connect 23 0 12 1; +#X connect 33 0 19 0; diff --git a/doc/3.audio.examples/F09.declickit.pd b/doc/3.audio.examples/F09.declickit.pd index cc11022a..6e43dc3d 100644 --- a/doc/3.audio.examples/F09.declickit.pd +++ b/doc/3.audio.examples/F09.declickit.pd @@ -1,4 +1,4 @@ -#N canvas 413 23 623 690 12; +#N canvas 560 38 623 690 12; #X declare -stdpath ./; #X obj 73 487 cos~; #X obj 73 427 *~; diff --git a/doc/3.audio.examples/F10.sweepable.FM.pd b/doc/3.audio.examples/F10.sweepable.FM.pd index c09ab780..fb955c3f 100644 --- a/doc/3.audio.examples/F10.sweepable.FM.pd +++ b/doc/3.audio.examples/F10.sweepable.FM.pd @@ -1,4 +1,4 @@ -#N canvas 271 50 816 600 12; +#N canvas 358 63 816 600 12; #X declare -stdpath ./; #X obj 151 313 cos~; #X obj 151 233 *~; @@ -9,7 +9,7 @@ #X obj 194 346 -~; #X obj 217 372 *~; #X obj 198 181 samphold~; -#X text 469 66 APPLYING TWO-COSINE CARRIER TO FM; +#X text 479 66 APPLYING TWO-COSINE CARRIER TO FM; #X floatatom 198 49 4 0 200 0 - - - 0; #X obj 198 72 / 10; #X obj 198 124 line~; @@ -30,60 +30,60 @@ #X text 38 274 both phases-->; #X text 24 259 add modulator to; #X obj 199 507 output~; -#N canvas 605 126 534 605 fft 0; -#X obj 95 134 inlet~; -#X obj 209 404 inlet; -#X obj 95 266 rfft~; -#X obj 95 299 *~; -#X obj 127 299 *~; -#X obj 127 330 sqrt~; -#X obj 337 244 block~ 4096 1; -#X obj 127 356 biquad~ 0 0 0 0 1; -#X text 159 267 Fourier series; -#X text 173 318 magnitude; -#X text 173 303 calculate; -#X text 52 23 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later.; -#X text 88 99 signal to analyze, f 9; -#X text 256 351 delay two samples; -#X text 254 369 for better graphing; -#X obj 202 129 samplerate~; -#X obj 236 463 metro 500; -#X obj 236 440 inlet; -#X text 284 438 toggle to graph repeatedly; -#X text 253 405 bang to graph once; -#X obj 127 380 /~ 4096; -#X obj 202 104 bang~; -#X msg 210 534 \; pd dsp 1; -#X obj 236 501 tabwrite~ F10-spectrum; -#X obj 202 152 / 4096; -#X obj 113 184 osc~; -#X obj 113 212 +~ 1; -#X obj 95 237 *~; -#X text 157 197 hanning window; -#X obj 164 142 0.5; -#X connect 0 0 27 0; -#X connect 1 0 22 0; -#X connect 1 0 23 0; +#N canvas 605 126 529 576 fft 0; +#X obj 83 140 inlet~; +#X obj 197 410 inlet; +#X obj 83 272 rfft~; +#X obj 83 305 *~; +#X obj 115 305 *~; +#X obj 115 336 sqrt~; +#X obj 115 362 biquad~ 0 0 0 0 1; +#X text 135 272 Fourier series; +#X text 161 324 magnitude; +#X text 161 309 calculate; +#X text 62 23 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later.; +#X text 76 105 signal to analyze, f 9; +#X text 244 357 delay two samples; +#X text 242 375 for better graphing; +#X obj 171 135 samplerate~; +#X obj 214 469 metro 500; +#X obj 214 446 inlet; +#X text 262 444 toggle to graph repeatedly; +#X text 241 411 bang to graph once; +#X obj 115 386 /~ 4096; +#X obj 197 506 tabwrite~ F10-spectrum; +#X obj 171 158 / 4096; +#X obj 171 190 osc~; +#X obj 171 218 +~ 1; +#X obj 83 203 *~; +#X text 215 203 hanning window; +#X obj 373 271 block~ 4096; +#X text 375 246 window size; +#X obj 264 102 loadbang; +#X obj 171 242 *~ 0.5; +#X msg 264 148 0.5; +#X connect 0 0 24 0; +#X connect 1 0 20 0; #X connect 2 0 3 0; #X connect 2 0 3 1; #X connect 2 1 4 0; #X connect 2 1 4 1; #X connect 3 0 5 0; #X connect 4 0 5 0; -#X connect 5 0 7 0; -#X connect 7 0 20 0; -#X connect 15 0 24 0; -#X connect 16 0 23 0; -#X connect 17 0 16 0; -#X connect 17 0 22 0; -#X connect 20 0 23 0; -#X connect 21 0 15 0; -#X connect 21 0 29 0; -#X connect 24 0 25 0; -#X connect 25 0 26 0; -#X connect 26 0 27 1; -#X connect 27 0 2 0; -#X connect 29 0 25 1; +#X connect 5 0 6 0; +#X connect 6 0 19 0; +#X connect 14 0 21 0; +#X connect 15 0 20 0; +#X connect 16 0 15 0; +#X connect 19 0 20 0; +#X connect 21 0 22 0; +#X connect 22 0 23 0; +#X connect 23 0 29 0; +#X connect 24 0 2 0; +#X connect 28 0 14 0; +#X connect 28 0 30 0; +#X connect 29 0 24 1; +#X connect 30 0 22 1; #X restore 240 432 pd fft; #X obj 259 380 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 279 405 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; @@ -91,18 +91,18 @@ #N canvas 0 0 450 300 (subpatch) 0; #X array F10-spectrum 259 float 0; #X coords 0 0.51 258 -0.008 256 130 1; -#X restore 485 293 graph; -#X text 477 424 0; +#X restore 484 309 graph; +#X text 476 440 0; #X obj 199 400 +~; #X text 471 99 We can apply the two-cosine method to FM synthesis to get FM spectra which slide up and down: we just treat the cosines like carrier signals in an FM instrument. This doesn't work as well as you'd wish \, because the phases of the partials of the two FM instruments don't line up \, so that \, for indices of modulation above about 20% \, you get beating effects as the center frequency goes up and down., f 43; -#X text 539 434 -- frequency --; -#X text 717 425 2700; +#X text 716 441 2700; #X text 97 34 center freq. (in tenths of fundamental), f 13; #X text 39 93 fundamental (= mod freq), f 12; #X obj 622 25 declare -stdpath ./; #X text 281 380 <-- graph once; #X text 300 404 <-- repeatedly; #X obj 199 466 hip~ 5; +#X text 534 449 ---- frequency ----; #X connect 0 0 6 1; #X connect 0 0 36 0; #X connect 1 0 24 0; @@ -135,5 +135,5 @@ #X connect 31 0 30 1; #X connect 32 0 30 2; #X connect 36 0 30 0; -#X connect 36 0 45 0; -#X connect 45 0 29 0; +#X connect 36 0 44 0; +#X connect 44 0 29 0; diff --git a/doc/3.audio.examples/F11.anharmonic.FM.pd b/doc/3.audio.examples/F11.anharmonic.FM.pd index 1283d4eb..58305f90 100644 --- a/doc/3.audio.examples/F11.anharmonic.FM.pd +++ b/doc/3.audio.examples/F11.anharmonic.FM.pd @@ -1,4 +1,4 @@ -#N canvas 406 70 698 565 12; +#N canvas 434 57 698 565 12; #X declare -stdpath ./; #X obj 186 394 cos~; #X floatatom 176 182 4 0 200 0 - - - 0; @@ -36,66 +36,66 @@ #X text 62 336 oscillator; #X text 60 24 HOW NOT TO APPLY TWO-COSINE CARRIER TO FM; #X text 170 130 center freq. (in tenths of fundamental), f 13; -#N canvas 605 126 534 605 fft 0; -#X obj 95 134 inlet~; -#X obj 209 404 inlet; -#X obj 95 266 rfft~; -#X obj 95 299 *~; -#X obj 127 299 *~; -#X obj 127 330 sqrt~; -#X obj 337 244 block~ 4096 1; -#X obj 127 356 biquad~ 0 0 0 0 1; -#X text 159 267 Fourier series; -#X text 173 318 magnitude; -#X text 173 303 calculate; -#X text 52 23 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later.; -#X text 88 99 signal to analyze, f 9; -#X text 256 351 delay two samples; -#X text 254 369 for better graphing; -#X obj 202 129 samplerate~; -#X obj 236 463 metro 500; -#X obj 236 440 inlet; -#X text 284 438 toggle to graph repeatedly; -#X text 253 405 bang to graph once; -#X obj 127 380 /~ 4096; -#X obj 202 104 bang~; -#X msg 210 534 \; pd dsp 1; -#X obj 202 152 / 4096; -#X obj 113 184 osc~; -#X obj 113 212 +~ 1; -#X obj 95 237 *~; -#X text 157 197 hanning window; -#X obj 164 142 0.5; -#X obj 236 501 tabwrite~ F11-spectrum; -#X connect 0 0 26 0; -#X connect 1 0 22 0; -#X connect 1 0 29 0; +#X obj 522 22 declare -stdpath ./; +#X text 281 388 <-- graph once; +#X text 300 414 <-- repeatedly; +#X obj 186 444 hip~ 5; +#N canvas 605 126 529 576 fft 0; +#X obj 83 140 inlet~; +#X obj 197 410 inlet; +#X obj 83 272 rfft~; +#X obj 83 305 *~; +#X obj 115 305 *~; +#X obj 115 336 sqrt~; +#X obj 115 362 biquad~ 0 0 0 0 1; +#X text 135 272 Fourier series; +#X text 161 324 magnitude; +#X text 161 309 calculate; +#X text 62 23 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later.; +#X text 76 105 signal to analyze, f 9; +#X text 244 357 delay two samples; +#X text 242 375 for better graphing; +#X obj 171 135 samplerate~; +#X obj 214 469 metro 500; +#X obj 214 446 inlet; +#X text 262 444 toggle to graph repeatedly; +#X text 241 411 bang to graph once; +#X obj 115 386 /~ 4096; +#X obj 171 158 / 4096; +#X obj 171 190 osc~; +#X obj 171 218 +~ 1; +#X obj 83 203 *~; +#X text 215 203 hanning window; +#X obj 373 271 block~ 4096; +#X text 375 246 window size; +#X obj 264 102 loadbang; +#X obj 171 242 *~ 0.5; +#X msg 264 148 0.5; +#X obj 197 506 tabwrite~ F11-spectrum; +#X connect 0 0 23 0; +#X connect 1 0 30 0; #X connect 2 0 3 0; #X connect 2 0 3 1; #X connect 2 1 4 0; #X connect 2 1 4 1; #X connect 3 0 5 0; #X connect 4 0 5 0; -#X connect 5 0 7 0; -#X connect 7 0 20 0; -#X connect 15 0 23 0; -#X connect 16 0 29 0; -#X connect 17 0 16 0; -#X connect 17 0 22 0; -#X connect 20 0 29 0; -#X connect 21 0 15 0; -#X connect 21 0 28 0; -#X connect 23 0 24 0; -#X connect 24 0 25 0; -#X connect 25 0 26 1; -#X connect 26 0 2 0; -#X connect 28 0 24 1; +#X connect 5 0 6 0; +#X connect 6 0 19 0; +#X connect 14 0 20 0; +#X connect 15 0 30 0; +#X connect 16 0 15 0; +#X connect 19 0 30 0; +#X connect 20 0 21 0; +#X connect 21 0 22 0; +#X connect 22 0 28 0; +#X connect 23 0 2 0; +#X connect 27 0 14 0; +#X connect 27 0 29 0; +#X connect 28 0 23 1; +#X connect 29 0 21 1; #X restore 240 441 pd fft; -#X obj 522 22 declare -stdpath ./; -#X text 281 388 <-- graph once; -#X text 300 414 <-- repeatedly; -#X obj 186 444 hip~ 5; -#X connect 0 0 33 0; +#X connect 0 0 36 0; #X connect 0 0 37 0; #X connect 1 0 2 0; #X connect 2 0 25 0; @@ -107,11 +107,11 @@ #X connect 11 0 12 0; #X connect 12 0 9 0; #X connect 13 0 0 0; -#X connect 17 0 33 1; -#X connect 18 0 33 2; +#X connect 17 0 37 1; +#X connect 18 0 37 2; #X connect 24 0 27 0; #X connect 25 0 24 0; #X connect 25 1 24 1; #X connect 26 0 10 0; #X connect 27 0 13 0; -#X connect 37 0 16 0; +#X connect 36 0 16 0; diff --git a/doc/3.audio.examples/F12.paf.pd b/doc/3.audio.examples/F12.paf.pd index 99e0980b..04eebe7f 100644 --- a/doc/3.audio.examples/F12.paf.pd +++ b/doc/3.audio.examples/F12.paf.pd @@ -1,4 +1,4 @@ -#N canvas 493 23 690 723 12; +#N canvas 493 38 679 793 12; #X declare -stdpath ./; #X obj 45 484 cos~; #X obj 45 431 *~; @@ -54,92 +54,92 @@ #X connect 8 0 7 0; #X connect 9 0 5 1; #X connect 10 0 8 0; -#X restore 490 481 pd make-table; +#X restore 251 730 pd make-table; #X obj 201 432 cos~; #X obj 201 409 -~ 0.25; #X obj 201 478 +~ 100; #X obj 201 501 tabread4~ bell-curve; #X obj 105 637 *~; #X text 233 526 waveshaper; -#X text 448 749 updated for Pd version 0.37; #X text 421 688 0; #X text 612 687 200; #N canvas 0 0 450 300 (subpatch) 0; #X array F12-spectrum 259 float 0; #X coords 0 0.51 258 -0.008 256 130 1; -#X restore 393 300 graph; -#X text 390 432 0; -#X text 447 436 -- frequency --; -#X text 616 433 2700; +#X restore 393 350 graph; +#X text 390 482 0; +#X text 455 486 -- frequency --; +#X text 616 483 2700; #X obj 105 718 output~; #X obj 182 621 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 202 646 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 34 42 Instead of using the two cosines as FM carrier oscillators \, we can use them as ring modulators for a natural or synthetic tone. Here we use waveshaping - to wit \, a sinusoid looking up a Gaussian bell curve. This has the nice properties that the partials are always positive cosines in phase \, and the spectrum spreads out smoothly as the index changes., f 85; +#X text 28 42 Instead of using the two cosines as FM carrier oscillators \, we can use them as ring modulators for a natural or synthetic tone. Here we use waveshaping - to wit \, a sinusoid looking up a Gaussian bell curve. This has the nice properties that the partials are always positive cosines in phase \, and the spectrum spreads out smoothly as the index changes., f 87; #X text 63 12 PAF: TWO-COSINE RING MODULATOR FOR WAVESHAPER; #X obj 201 383 *~ 0.5; -#X text 34 120 For phase coherency \, the waveshaper and the cosine pair are driven from the same phasor~ object. Since the waveshaping is done using a symmetric curve \, its output is at double the frequency of the input. So for each cycle of the phasor we compute a half-cycle of the sine function (by multiplying by 0.5 and subtracting 0.25 before the cosine lookup). We center the cosine output for lookup in a 200-point table containing a bell curve., f 85; #X text 181 271 center frequency (tenths of fundamental), f 23; -#X text 46 622 ring mod step =>, f 10; -#X text 203 620 <= graph once; -#X text 223 647 <= repeatedly; -#N canvas 828 136 534 605 fft 0; -#X obj 95 134 inlet~; -#X obj 209 404 inlet; -#X obj 95 266 rfft~; -#X obj 95 299 *~; -#X obj 127 299 *~; -#X obj 127 330 sqrt~; -#X obj 337 244 block~ 4096 1; -#X obj 127 356 biquad~ 0 0 0 0 1; -#X text 159 267 Fourier series; -#X text 173 318 magnitude; -#X text 173 303 calculate; -#X text 52 23 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later.; -#X text 88 99 signal to analyze, f 9; -#X text 256 351 delay two samples; -#X text 254 369 for better graphing; -#X obj 202 129 samplerate~; -#X obj 236 463 metro 500; -#X obj 236 440 inlet; -#X text 284 438 toggle to graph repeatedly; -#X text 253 405 bang to graph once; -#X obj 127 380 /~ 4096; -#X obj 202 104 bang~; -#X msg 210 534 \; pd dsp 1; -#X obj 202 152 / 4096; -#X obj 113 184 osc~; -#X obj 113 212 +~ 1; -#X obj 95 237 *~; -#X text 157 197 hanning window; -#X obj 164 142 0.5; -#X obj 236 501 tabwrite~ F12-spectrum; -#X connect 0 0 26 0; -#X connect 1 0 22 0; -#X connect 1 0 29 0; +#X obj 506 275 declare -stdpath ./; +#X obj 105 681 hip~ 5; +#X text 28 120 For phase coherency \, the waveshaper and the cosine pair are driven from the same [phasor~] object. Since the waveshaping is done using a symmetric curve \, its output is at double the frequency of the input. So for each cycle of the phasor we compute a half-cycle of the sine function (by multiplying by 0.5 and subtracting 0.25 before the cosine lookup). We center the cosine output for lookup in a 200-point table containing a bell curve., f 87; +#X text 43 622 ring mod step -->, f 8; +#X text 203 620 <-- graph once; +#X text 223 647 <-- repeatedly; +#N canvas 605 126 529 576 fft 0; +#X obj 83 140 inlet~; +#X obj 197 410 inlet; +#X obj 83 272 rfft~; +#X obj 83 305 *~; +#X obj 115 305 *~; +#X obj 115 336 sqrt~; +#X obj 115 362 biquad~ 0 0 0 0 1; +#X text 135 272 Fourier series; +#X text 161 324 magnitude; +#X text 161 309 calculate; +#X text 62 23 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later.; +#X text 76 105 signal to analyze, f 9; +#X text 244 357 delay two samples; +#X text 242 375 for better graphing; +#X obj 171 135 samplerate~; +#X obj 214 469 metro 500; +#X obj 214 446 inlet; +#X text 262 444 toggle to graph repeatedly; +#X text 241 411 bang to graph once; +#X obj 115 386 /~ 4096; +#X obj 171 158 / 4096; +#X obj 171 190 osc~; +#X obj 171 218 +~ 1; +#X obj 83 203 *~; +#X text 215 203 hanning window; +#X obj 373 271 block~ 4096; +#X text 375 246 window size; +#X obj 264 102 loadbang; +#X obj 171 242 *~ 0.5; +#X msg 264 148 0.5; +#X obj 197 506 tabwrite~ F12-spectrum; +#X connect 0 0 23 0; +#X connect 1 0 30 0; #X connect 2 0 3 0; #X connect 2 0 3 1; #X connect 2 1 4 0; #X connect 2 1 4 1; #X connect 3 0 5 0; #X connect 4 0 5 0; -#X connect 5 0 7 0; -#X connect 7 0 20 0; -#X connect 15 0 23 0; -#X connect 16 0 29 0; -#X connect 17 0 16 0; -#X connect 17 0 22 0; -#X connect 20 0 29 0; -#X connect 21 0 15 0; -#X connect 21 0 28 0; -#X connect 23 0 24 0; -#X connect 24 0 25 0; -#X connect 25 0 26 1; -#X connect 26 0 2 0; -#X connect 28 0 24 1; +#X connect 5 0 6 0; +#X connect 6 0 19 0; +#X connect 14 0 20 0; +#X connect 15 0 30 0; +#X connect 16 0 15 0; +#X connect 19 0 30 0; +#X connect 20 0 21 0; +#X connect 21 0 22 0; +#X connect 22 0 28 0; +#X connect 23 0 2 0; +#X connect 27 0 14 0; +#X connect 27 0 29 0; +#X connect 28 0 23 1; +#X connect 29 0 21 1; #X restore 163 672 pd fft; -#X obj 506 261 declare -stdpath ./; -#X text 34 214 Then with *~ we do the ring modulation and we're done. This is the PAF (phase-aligned formant) synthesis algorithm (patented 1993 by IRCAM)., f 85; -#X obj 105 681 hip~ 5; +#X text 28 214 Then with [*~] we do the ring modulation and we're done. This is the PAF (phase-aligned formant) synthesis algorithm (patented 1993 by IRCAM \, the patent ran out in 2011)., f 87; +#X text 440 743 updated for Pd version 0.55; #X connect 0 0 6 1; #X connect 0 0 8 0; #X connect 1 0 5 0; @@ -161,7 +161,7 @@ #X connect 14 0 9 1; #X connect 14 0 5 1; #X connect 14 0 1 0; -#X connect 14 0 43 0; +#X connect 14 0 42 0; #X connect 15 0 14 0; #X connect 19 0 22 0; #X connect 20 0 21 1; @@ -171,9 +171,9 @@ #X connect 26 0 25 0; #X connect 27 0 28 0; #X connect 28 0 29 1; -#X connect 29 0 49 0; -#X connect 29 0 52 0; -#X connect 39 0 49 1; -#X connect 40 0 49 2; -#X connect 43 0 26 0; -#X connect 52 0 38 0; +#X connect 29 0 45 0; +#X connect 29 0 50 0; +#X connect 38 0 50 1; +#X connect 39 0 50 2; +#X connect 42 0 26 0; +#X connect 45 0 37 0; diff --git a/doc/3.audio.examples/F13.paf.control.pd b/doc/3.audio.examples/F13.paf.control.pd index 7cf7a944..30b92d97 100644 --- a/doc/3.audio.examples/F13.paf.control.pd +++ b/doc/3.audio.examples/F13.paf.control.pd @@ -1,4 +1,4 @@ -#N canvas 484 23 625 723 12; +#N canvas 484 38 626 746 12; #X declare -stdpath ./; #X obj 116 507 cos~; #X obj 116 448 *~; @@ -11,12 +11,10 @@ #X obj 150 585 +~; #X obj 193 426 samphold~; #X floatatom 193 223 4 0 127 0 - - - 0; -#X text 235 215 center; #X obj 193 293 line~; #X obj 193 270 pack 0 50; #X obj 116 369 phasor~; #X floatatom 116 265 4 0 127 0 - - - 0; -#X text 77 226 fundamental; #X floatatom 354 287 4 0 127 0 - - - 0; #X obj 354 358 line~; #X obj 336 494 *~; @@ -52,7 +50,7 @@ #X connect 8 0 4 1; #X connect 9 0 7 0; #X connect 11 0 0 0; -#X restore 445 629 pd make-table; +#X restore 446 614 pd make-table; #X obj 291 463 cos~; #X obj 291 438 -~ 0.25; #X obj 336 520 +~ 100; @@ -63,25 +61,25 @@ #X obj 116 289 mtof; #X obj 211 321 expr 1/$f1; #X obj 193 246 mtof; -#X text 236 230 freq.; #X obj 193 345 *~; #X text 352 262 bandwidth; #X obj 354 309 mtof; #X obj 354 394 *~; #X obj 354 418 *~ 25; -#X text 23 41 The more "natural" units for describing a formant might be center frequency and bandwidth \, so that you can change the fundamental without having the formant shift up and down in parallel. Here all three frequencies are expressed in MIDI units. The bandwidth and center frequency have to be divided by the fundamental (the expr 1/$f1 takes its reciprocal and two *~ objects finish the division.), f 81; #X text 394 393 divide by fundamental; #X text 412 417 range for table; #X text 391 518 offset to middle of table; #X text 199 365 C.F. relative; #X text 200 381 to fundamental; -#X text 75 241 (MIDI units); #X text 217 616 ring mod; #X obj 181 655 output~; -#X text 392 687 updated for Pd version 0.37; -#X text 23 119 Here we take a somewhat lax approach to sampholding the center frequency control. The frequency itself changes instantly \, but the center/fundamental frequency ratio waits for the next period. This gives a slight "chirp" if the fundamental is abruptly raised a couple of octaves. There's no easy way using Pd's built-in primitives to avoid this. Note however that there's a "paf~" extern available which solves this problem better and \, moreover \, runs much faster., f 81; +#X text 393 672 updated for Pd version 0.37; #X obj 291 413 *~ 0.5; #X obj 457 239 declare -stdpath ./; +#X text 23 41 The more "natural" units for describing a formant might be center frequency and bandwidth \, so that you can change the fundamental without having the formant shift up and down in parallel. Here all three frequencies are expressed in MIDI units. The bandwidth and center frequency have to be divided by the fundamental (the expr 1/$f1 takes its reciprocal and two [*~] objects finish the division.), f 81; +#X text 23 119 Here we take a somewhat lax approach to sampholding the center frequency control. The frequency itself changes instantly \, but the center/fundamental frequency ratio waits for the next period. This gives a slight "chirp" if the fundamental is abruptly raised a couple of octaves. There's no easy way using Pd's built-in primitives to avoid this. Note however that there's a [paf~] extern available which solves this problem better and \, moreover \, runs much faster., f 81; +#X text 227 223 center freq.; +#X text 78 227 fundamental (MIDI units), f 12; #X connect 0 0 6 1; #X connect 0 0 8 0; #X connect 1 0 5 0; @@ -93,33 +91,33 @@ #X connect 5 0 2 0; #X connect 6 0 7 0; #X connect 7 0 8 1; -#X connect 8 0 26 0; +#X connect 8 0 24 0; #X connect 9 0 4 0; #X connect 9 0 3 0; -#X connect 10 0 31 0; -#X connect 12 0 33 0; -#X connect 13 0 12 0; -#X connect 14 0 9 1; -#X connect 14 0 1 0; -#X connect 14 0 5 1; -#X connect 14 0 49 0; -#X connect 15 0 29 0; -#X connect 17 0 35 0; -#X connect 18 0 36 0; -#X connect 19 0 24 0; -#X connect 20 0 18 0; -#X connect 22 0 19 0; -#X connect 23 0 22 0; -#X connect 24 0 25 0; -#X connect 25 0 26 1; -#X connect 26 0 46 0; -#X connect 29 0 30 0; -#X connect 29 0 14 0; -#X connect 30 0 33 1; -#X connect 30 0 36 1; -#X connect 31 0 13 0; -#X connect 33 0 9 0; -#X connect 35 0 20 0; -#X connect 36 0 37 0; -#X connect 37 0 19 1; -#X connect 49 0 23 0; +#X connect 10 0 29 0; +#X connect 11 0 30 0; +#X connect 12 0 11 0; +#X connect 13 0 9 1; +#X connect 13 0 1 0; +#X connect 13 0 5 1; +#X connect 13 0 43 0; +#X connect 14 0 27 0; +#X connect 15 0 32 0; +#X connect 16 0 33 0; +#X connect 17 0 22 0; +#X connect 18 0 16 0; +#X connect 20 0 17 0; +#X connect 21 0 20 0; +#X connect 22 0 23 0; +#X connect 23 0 24 1; +#X connect 24 0 41 0; +#X connect 27 0 28 0; +#X connect 27 0 13 0; +#X connect 28 0 30 1; +#X connect 28 0 33 1; +#X connect 29 0 12 0; +#X connect 30 0 9 0; +#X connect 32 0 18 0; +#X connect 33 0 34 0; +#X connect 34 0 17 1; +#X connect 43 0 21 0; diff --git a/doc/3.audio.examples/F14.wave.packet.pd b/doc/3.audio.examples/F14.wave.packet.pd index 241f64bd..11d82a9b 100644 --- a/doc/3.audio.examples/F14.wave.packet.pd +++ b/doc/3.audio.examples/F14.wave.packet.pd @@ -1,104 +1,103 @@ -#N canvas 453 23 640 700 12; +#N canvas 453 38 640 725 12; #X declare -stdpath ./; -#X floatatom 301 186 4 0 127 0 - - - 0; -#X text 244 182 center; -#X obj 301 262 line~; -#X obj 301 239 pack 0 50; -#X floatatom 164 207 4 0 127 0 - - - 0; -#X text 71 201 fundamental; -#X floatatom 400 206 4 0 127 0 - - - 0; -#X obj 400 277 line~; -#X obj 106 482 *~; -#X obj 400 254 pack 0 50; -#X obj 106 531 cos~; -#X obj 164 267 mtof; -#X obj 319 298 expr 1/$f1; -#X obj 301 213 mtof; -#X text 243 197 freq.; -#X obj 301 329 *~; -#X text 441 208 bandwidth; -#X obj 400 228 mtof; -#X obj 400 341 *~; -#X text 433 340 divide by fundamental; -#X text 64 217 (MIDI units); -#X obj 109 619 output~; -#X text 58 14 WAVE PACKETS AS ALTERNATIVE TO PAF; -#X obj 41 305 phasor~; -#X obj 460 408 +~ 0.5; -#X obj 460 433 wrap~; -#X obj 106 554 +~ 1; -#X obj 42 438 -~ 0.5; -#X obj 109 588 +~; -#X obj 42 502 *~; -#X obj 42 525 cos~; -#X obj 179 456 samphold~; -#X obj 100 451 samphold~; -#X obj 42 552 *~; -#X obj 106 506 clip~ -0.5 0.5; -#X obj 307 537 *~; -#X obj 307 586 cos~; -#X obj 307 609 +~ 1; -#X obj 252 481 -~ 0.5; -#X obj 252 537 *~; -#X obj 252 565 cos~; -#X obj 400 507 samphold~; -#X obj 301 506 samphold~; -#X obj 252 594 *~; -#X obj 307 561 clip~ -0.5 0.5; -#X obj 400 365 max~ 1; -#X obj 164 242 - 12; -#X text 397 648 updated for Pd version 0.40.; -#X text 47 125 The patch is almost exactly like B13 (the overlapping sample) except that \, instead of using tabread~ we just use cos~ \, and that we control pulse width (for bandwidth) as well as wavetable transposition (for center frequency)., f 71; -#X text 47 47 The stretched wavetable method is an alternative to the PAF generator \, slightly more expensive in processing time but with two advantages: first \, it is not patent encumbered (PAF patent runs out in 2011) and second \, it can be generalized to use samples instead of sinusoids to make complex spectral shapes., f 71; -#X text 512 398 second phase signal out of phase from first one, f 13; -#X obj 463 11 declare -stdpath ./; -#X connect 0 0 13 0; -#X connect 2 0 15 0; -#X connect 3 0 2 0; -#X connect 4 0 46 0; -#X connect 6 0 17 0; -#X connect 7 0 18 0; -#X connect 8 0 34 0; -#X connect 9 0 7 0; -#X connect 10 0 26 0; -#X connect 11 0 12 0; -#X connect 11 0 23 0; -#X connect 12 0 15 1; -#X connect 12 0 18 1; -#X connect 13 0 3 0; -#X connect 15 0 32 0; -#X connect 15 0 42 0; -#X connect 17 0 9 0; -#X connect 18 0 45 0; -#X connect 23 0 24 0; -#X connect 23 0 27 0; -#X connect 23 0 32 1; -#X connect 23 0 31 1; -#X connect 24 0 25 0; -#X connect 25 0 38 0; -#X connect 25 0 42 1; -#X connect 25 0 41 1; -#X connect 26 0 33 1; -#X connect 27 0 8 0; -#X connect 27 0 29 0; -#X connect 28 0 21 0; -#X connect 29 0 30 0; -#X connect 30 0 33 0; -#X connect 31 0 8 1; -#X connect 32 0 29 1; -#X connect 33 0 28 0; -#X connect 34 0 10 0; -#X connect 35 0 44 0; +#X floatatom 301 210 4 0 127 0 - - - 0; +#X obj 301 286 line~; +#X obj 301 263 pack 0 50; +#X floatatom 164 227 4 0 127 0 - - - 0; +#X text 71 221 fundamental; +#X floatatom 400 226 4 0 127 0 - - - 0; +#X obj 400 300 line~; +#X obj 106 502 *~; +#X obj 400 274 pack 0 50; +#X obj 106 551 cos~; +#X obj 164 287 mtof; +#X obj 319 318 expr 1/$f1; +#X obj 301 237 mtof; +#X obj 301 349 *~; +#X text 396 202 bandwidth; +#X obj 400 248 mtof; +#X obj 400 361 *~; +#X text 433 360 divide by fundamental; +#X text 64 237 (MIDI units); +#X obj 109 639 output~; +#X text 78 14 WAVE PACKETS AS ALTERNATIVE TO PAF; +#X obj 41 325 phasor~; +#X obj 460 428 +~ 0.5; +#X obj 460 453 wrap~; +#X obj 106 574 +~ 1; +#X obj 42 458 -~ 0.5; +#X obj 109 608 +~; +#X obj 42 522 *~; +#X obj 42 545 cos~; +#X obj 179 476 samphold~; +#X obj 100 471 samphold~; +#X obj 42 572 *~; +#X obj 106 526 clip~ -0.5 0.5; +#X obj 307 557 *~; +#X obj 307 606 cos~; +#X obj 307 629 +~ 1; +#X obj 252 501 -~ 0.5; +#X obj 252 557 *~; +#X obj 252 585 cos~; +#X obj 400 527 samphold~; +#X obj 301 526 samphold~; +#X obj 252 614 *~; +#X obj 307 581 clip~ -0.5 0.5; +#X obj 400 385 max~ 1; +#X obj 164 262 - 12; +#X text 512 418 second phase signal out of phase from first one, f 13; +#X obj 459 578 declare -stdpath ./; +#X text 67 47 The stretched wavetable method is an alternative to the PAF generator \, slightly more expensive in processing time but with the advantage it can be generalized to use samples instead of sinusoids to make complex spectral shapes., f 71; +#X text 397 668 updated for Pd version 0.55; +#X text 67 115 The patch is almost exactly like B13 (the overlapping sample) except that \, instead of using [tabread~] we just use [cos~] \, and that we control pulse width (for bandwidth) as well as wavetable transposition (for center frequency)., f 71; +#X text 257 195 center freq., f 6; +#X connect 0 0 12 0; +#X connect 1 0 13 0; +#X connect 2 0 1 0; +#X connect 3 0 44 0; +#X connect 5 0 15 0; +#X connect 6 0 16 0; +#X connect 7 0 32 0; +#X connect 8 0 6 0; +#X connect 9 0 24 0; +#X connect 10 0 11 0; +#X connect 10 0 21 0; +#X connect 11 0 13 1; +#X connect 11 0 16 1; +#X connect 12 0 2 0; +#X connect 13 0 30 0; +#X connect 13 0 40 0; +#X connect 15 0 8 0; +#X connect 16 0 43 0; +#X connect 21 0 22 0; +#X connect 21 0 25 0; +#X connect 21 0 30 1; +#X connect 21 0 29 1; +#X connect 22 0 23 0; +#X connect 23 0 36 0; +#X connect 23 0 40 1; +#X connect 23 0 39 1; +#X connect 24 0 31 1; +#X connect 25 0 7 0; +#X connect 25 0 27 0; +#X connect 26 0 19 0; +#X connect 27 0 28 0; +#X connect 28 0 31 0; +#X connect 29 0 7 1; +#X connect 30 0 27 1; +#X connect 31 0 26 0; +#X connect 32 0 9 0; +#X connect 33 0 42 0; +#X connect 34 0 35 0; +#X connect 35 0 41 1; +#X connect 36 0 33 0; #X connect 36 0 37 0; -#X connect 37 0 43 1; -#X connect 38 0 35 0; -#X connect 38 0 39 0; -#X connect 39 0 40 0; -#X connect 40 0 43 0; -#X connect 41 0 35 1; -#X connect 42 0 39 1; -#X connect 43 0 28 1; -#X connect 44 0 36 0; -#X connect 45 0 31 0; -#X connect 45 0 41 0; -#X connect 46 0 11 0; +#X connect 37 0 38 0; +#X connect 38 0 41 0; +#X connect 39 0 33 1; +#X connect 40 0 37 1; +#X connect 41 0 26 1; +#X connect 42 0 34 0; +#X connect 43 0 29 0; +#X connect 43 0 39 0; +#X connect 44 0 10 0; diff --git a/doc/3.audio.examples/G01.delay.pd b/doc/3.audio.examples/G01.delay.pd index a4e5ff62..3a243ffd 100644 --- a/doc/3.audio.examples/G01.delay.pd +++ b/doc/3.audio.examples/G01.delay.pd @@ -1,6 +1,6 @@ -#N canvas 492 93 691 458 12; +#N canvas 538 93 688 503 12; #X declare -stdpath ./; -#X text 66 30 DELAYS; +#X text 97 22 DELAYS; #N canvas 293 125 428 350 sample 0; #N canvas 0 0 450 300 (subpatch) 0; #X array G01-tab 62079 float 2; @@ -11,29 +11,33 @@ #X msg 68 251 read -resize ../sound/voice.wav G01-tab; #X connect 1 0 3 0; #X connect 3 0 2 0; -#X restore 216 385 pd sample; -#X floatatom 63 233 6 0 999 0 - - - 0; -#X text 71 277 read from delay line; -#X obj 63 306 delread~ delay1; -#X obj 44 121 tabplay~ G01-tab; -#X obj 44 95 metro 1000; -#X obj 44 69 loadbang; -#X text 75 172 write to delay line; -#X obj 45 369 output~; -#X obj 45 336 +~; -#X obj 59 191 delwrite~ delay1 1000; -#X text 426 369 updated for Pd version 0.37-1; -#X text 61 147 test signal to delay; +#X restore 281 424 pd sample; +#X floatatom 63 284 6 0 999 0 - - - 0; +#X text 71 328 read from delay line; +#X obj 63 357 delread~ delay1; +#X obj 44 172 tabplay~ G01-tab; +#X obj 44 105 metro 1000; +#X text 75 223 write to delay line; +#X obj 45 420 output~; +#X obj 45 387 +~; +#X obj 59 242 delwrite~ delay1 1000; +#X text 439 405 updated for Pd version 0.37-1; +#X text 61 198 test signal to delay; #X obj 440 62 declare -stdpath ./; -#X text 269 106 You can delay a signal using the [delwrite~] and [delread~] objects. In this example \, a sample loops continuously and is added to a delayed copy of itself., f 55; -#X text 269 161 The [delwrite~] object creates the delay line. You give it a name and a size in milliseconds. Each [delwrite~] should have a different name., f 55; -#X text 269 212 The arguments of [delread~] are the name of a delwrite (of which there should be exactly one) and an optional delay time in milliseconds between 0 and the length of the delay line. The [delread~] object delays the signal at integer number of samples and does no interpolation., f 55; -#X text 269 291 Each [delwrite~] may have as many [delread~] objects as you wish \, which can then function as multiple delay taps., f 55; -#X text 116 232 <-- delay time (msec), f 11; +#X text 269 126 You can delay a signal using the [delwrite~] and [delread~] objects. In this example \, a sample loops continuously and is added to a delayed copy of itself., f 55; +#X text 269 181 The [delwrite~] object creates the delay line. You give it a name and a size in milliseconds. Each [delwrite~] should have a different name., f 55; +#X text 269 232 The arguments of [delread~] are the name of a delwrite (of which there should be exactly one) and an optional delay time in milliseconds between 0 and the length of the delay line. The [delread~] object delays the signal at integer number of samples and does no interpolation., f 55; +#X text 269 311 Each [delwrite~] may have as many [delread~] objects as you wish \, which can then function as multiple delay taps., f 55; +#X text 116 283 <-- delay time (msec), f 11; +#X obj 44 73 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 44 134 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 69 73 <-- play repeatedly; +#X text 71 135 <-- play; #X connect 2 0 4 0; -#X connect 4 0 10 1; +#X connect 4 0 9 1; +#X connect 5 0 9 0; #X connect 5 0 10 0; -#X connect 5 0 11 0; -#X connect 6 0 5 0; -#X connect 7 0 6 0; -#X connect 10 0 9 0; +#X connect 6 0 20 0; +#X connect 9 0 8 0; +#X connect 19 0 6 0; +#X connect 20 0 5 0; diff --git a/doc/3.audio.examples/G02.delay.loop.pd b/doc/3.audio.examples/G02.delay.loop.pd index dfe60ea9..7147a4e4 100644 --- a/doc/3.audio.examples/G02.delay.loop.pd +++ b/doc/3.audio.examples/G02.delay.loop.pd @@ -1,40 +1,43 @@ -#N canvas 515 34 543 585 12; +#N canvas 515 38 550 623 12; #X declare -stdpath ./; -#X floatatom 104 210 7 -30 130 0 - - - 0; -#X floatatom 122 338 7 0 0 0 - - - 0; -#X text 299 461 write to delay line; -#X text 271 365 read from delay line; -#X text 135 423 add the original and the delayed signal; -#X obj 104 246 mtof; -#X msg 178 246 1; -#X obj 104 299 *~; -#X obj 104 422 +~; -#X obj 122 393 *~ 0.7; +#X floatatom 134 230 7 -30 130 0 - - - 0; +#X floatatom 152 356 7 0 0 0 - - - 0; +#X text 329 481 write to delay line; +#X text 301 385 read from delay line; +#X text 165 443 add the original and the delayed signal; +#X obj 134 266 mtof; +#X msg 208 266 1; +#X obj 134 319 *~; +#X obj 134 442 +~; +#X obj 152 413 *~ 0.7; #X text 55 24 DELAYS WITH FEEDBACK; -#X obj 178 299 *~; -#X obj 178 270 adsr 1 100 1000 0 1000; -#X obj 104 501 output~; -#X text 43 138 We've added an amplitude control here so that the test oscillator only speaks while you're dragging the pitch up and down. Be sure to try shift-dragging on the pitch control., f 65; -#X text 261 529 updated for Pd version 0.37-1; -#X obj 104 270 phasor~; -#X obj 122 365 delread~ G02-del 160; -#X obj 132 462 delwrite~ G02-del 2000; +#X obj 208 319 *~; +#X obj 134 521 output~; +#X obj 134 290 phasor~; +#X obj 162 482 delwrite~ G02-del 2000; #X obj 351 25 declare -stdpath ./; -#X text 43 69 You can feed the result of a [delread~] module back into its own [delwrite~] \, as long as you're careful about stability. For delays below 30 msec \, you can frequently hear the resonant pitch. For longer delay times you get the famous old delay loop effect., f 65; -#X text 159 209 <-- pitch; -#X text 179 338 <-- set delay time; -#X text 177 395 feedback gain (less than 1 for stability); +#X text 33 69 You can feed the result of a [delread~] module back into its own [delwrite~] \, as long as you're careful about stability. For delays below 30 msec \, you can frequently hear the resonant pitch. For longer delay times you get the famous old delay loop effect., f 66; +#X text 209 356 <-- set delay time; +#X text 207 415 feedback gain (less than 1 for stability); +#X obj 208 290 adsr 1 100 1000 0 0; +#X obj 152 385 delread~ G02-del 150; +#X obj 134 201 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 33 138 We've added an amplitude control here so that the test oscillator only speaks while you're dragging the pitch up and down or when hitting 'bang'. Be sure to try shift-dragging on the pitch control., f 66; +#X text 189 229 <-- set pitch; +#X text 295 557 updated for Pd version 0.37-1; +#X text 356 284 ADSR only uses attack and decay stages, f 22; #X connect 0 0 5 0; #X connect 0 0 6 0; -#X connect 1 0 17 0; -#X connect 5 0 16 0; -#X connect 6 0 12 0; +#X connect 1 0 20 0; +#X connect 5 0 13 0; +#X connect 6 0 19 0; #X connect 7 0 8 0; -#X connect 8 0 13 0; -#X connect 8 0 18 0; +#X connect 8 0 12 0; +#X connect 8 0 14 0; #X connect 9 0 8 1; #X connect 11 0 7 1; -#X connect 12 0 11 0; -#X connect 12 0 11 1; -#X connect 16 0 7 0; -#X connect 17 0 9 0; +#X connect 13 0 7 0; +#X connect 19 0 11 0; +#X connect 19 0 11 1; +#X connect 20 0 9 0; +#X connect 21 0 0 0; diff --git a/doc/3.audio.examples/G03.delay.variable.pd b/doc/3.audio.examples/G03.delay.variable.pd index 23923786..27bf3e4d 100644 --- a/doc/3.audio.examples/G03.delay.variable.pd +++ b/doc/3.audio.examples/G03.delay.variable.pd @@ -1,8 +1,8 @@ -#N canvas 574 23 600 666 12; +#N canvas 561 38 600 666 12; #X declare -stdpath ./; #X obj 99 319 hip~ 10; -#X floatatom 326 295 5 0 0 0 - - - 0; -#X obj 326 345 line~; +#X floatatom 325 288 5 0 0 0 - - - 0; +#X obj 325 338 line~; #X floatatom 254 236 5 0 0 0 - - - 0; #X floatatom 254 435 5 0 0 0 - - - 0; #X obj 254 508 line~; @@ -19,17 +19,15 @@ #X obj 99 384 +~; #X obj 236 536 *~; #X obj 254 339 *~; -#X obj 254 262 / 100; #X obj 99 418 hip~ 5; #X obj 254 310 +~ 1; -#X obj 254 286 osc~ 0; #X obj 254 366 +~ 1.46; #X text 53 23 VARIABLE DELAYS; #X obj 99 536 output~; #X obj 236 584 delwrite~ G03-del 1000; #X obj 236 560 clip~ -1 1; #X obj 405 21 declare -stdpath ./; -#X obj 326 321 pack f 100; +#X obj 325 314 pack f 100; #X obj 155 241 pack f 100; #X obj 99 237 osc~; #X obj 254 397 delread4~ G03-del; @@ -39,36 +37,38 @@ #X text 148 152 <-- pitch; #X text 196 190 <-- timbre; #X text 296 235 <-- cycle frequency (hundredths); -#X text 367 295 <-- cycle depth (msec); +#X text 366 288 <-- cycle depth (msec); #X text 299 435 <-- feedback (hundredths); +#X obj 254 286 osc~; +#X obj 254 262 * 0.01; #X connect 0 0 14 0; -#X connect 1 0 29 0; +#X connect 1 0 27 0; #X connect 2 0 18 1; -#X connect 3 0 19 0; +#X connect 3 0 40 0; #X connect 4 0 6 0; #X connect 5 0 17 1; -#X connect 6 0 35 0; +#X connect 6 0 33 0; #X connect 7 0 15 0; #X connect 8 0 9 1; #X connect 9 0 10 0; #X connect 10 0 0 0; #X connect 11 0 12 0; #X connect 12 0 13 0; -#X connect 13 0 31 0; +#X connect 13 0 29 0; #X connect 14 0 16 0; -#X connect 15 0 30 0; -#X connect 16 0 20 0; -#X connect 17 0 27 0; -#X connect 18 0 23 0; -#X connect 19 0 22 0; -#X connect 20 0 17 0; -#X connect 20 0 25 0; -#X connect 21 0 18 0; -#X connect 22 0 21 0; -#X connect 23 0 32 0; -#X connect 27 0 26 0; -#X connect 29 0 2 0; -#X connect 30 0 8 0; -#X connect 31 0 9 0; -#X connect 32 0 16 1; -#X connect 35 0 5 0; +#X connect 15 0 28 0; +#X connect 16 0 19 0; +#X connect 17 0 25 0; +#X connect 18 0 21 0; +#X connect 19 0 17 0; +#X connect 19 0 23 0; +#X connect 20 0 18 0; +#X connect 21 0 30 0; +#X connect 25 0 24 0; +#X connect 27 0 2 0; +#X connect 28 0 8 0; +#X connect 29 0 9 0; +#X connect 30 0 16 1; +#X connect 33 0 5 0; +#X connect 39 0 20 0; +#X connect 40 0 39 0; diff --git a/doc/3.audio.examples/G04.control.blocksize.pd b/doc/3.audio.examples/G04.control.blocksize.pd index 2bd9062a..2e9f6e9f 100644 --- a/doc/3.audio.examples/G04.control.blocksize.pd +++ b/doc/3.audio.examples/G04.control.blocksize.pd @@ -42,7 +42,7 @@ #X text 34 396 rectangular, f 12; #X text 34 382 this makes a; #X msg 128 380 1 \, 0 0 1; -#X obj 48 280 declare -stdpath ./; +#X obj 378 222 declare -stdpath ./; #X obj 230 252 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; #X text 247 460 <-- here is the delay feedback loop; #X obj 230 309 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; diff --git a/doc/3.audio.examples/G05.execution.order.pd b/doc/3.audio.examples/G05.execution.order.pd index 3b34effe..b7d0f0f8 100644 --- a/doc/3.audio.examples/G05.execution.order.pd +++ b/doc/3.audio.examples/G05.execution.order.pd @@ -1,4 +1,4 @@ -#N canvas 469 23 503 684 12; +#N canvas 469 38 503 684 12; #X declare -stdpath ./; #X floatatom 325 330 4 0 100 0 - - - 0; #X obj 307 475 +~; @@ -21,7 +21,7 @@ #X text 53 49 dummy inlet; #X text 165 49 delay time; #X text 307 119 This subpatch reads the delay writing before the reading., f 29; -#X text 60 248 The summy inlet is just needed to connect to the previous subpatch to force the correct order., f 33; +#X text 79 247 The dummy inlet is just needed to connect to the previous subpatch to force the correct order., f 33; #X connect 2 0 3 0; #X connect 3 0 1 0; #X restore 113 495 pd delay-reader; @@ -29,11 +29,11 @@ #X obj 325 357 / 44.1; #X obj 95 559 output~; #N canvas 521 164 217 214 pulse 0; -#X obj 52 148 outlet~; +#X obj 51 148 outlet~; #X obj 51 44 phasor~ 50; #X obj 51 70 *~ 100; #X obj 51 95 clip~ 0.75 1.25; -#X obj 52 121 cos~; +#X obj 51 121 cos~; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 3 0 4 0; diff --git a/doc/3.audio.examples/G06.octave.doubler.pd b/doc/3.audio.examples/G06.octave.doubler.pd index bb588285..b748a911 100644 --- a/doc/3.audio.examples/G06.octave.doubler.pd +++ b/doc/3.audio.examples/G06.octave.doubler.pd @@ -1,7 +1,7 @@ -#N canvas 366 23 709 658 12; +#N canvas 441 38 709 658 12; #X declare -stdpath ./; #X obj 53 527 output~; -#X obj 96 120 moses 1; +#X obj 95 120 moses 1; #X obj 141 152 mtof; #X text 172 396 on/off for original; #X text 160 23 OCTAVE DOUBLING VIA VARIABLE COMB FILTER; @@ -10,7 +10,6 @@ #X obj 141 200 t f b; #X obj 114 62 delwrite~ G06-del 100; #X obj 96 270 delread~ G06-del, f 8; -#X obj 114 356 vd~ G06-del; #X obj 96 382 +~; #X obj 176 258 +; #X obj 141 175 expr 500/$f1; @@ -21,10 +20,10 @@ #X obj 194 230 expr 2048000/$f1; #X obj 490 64 declare -stdpath ./; #X obj 53 17 adc~ 1; -#X obj 96 96 sigmund~ -npts 2048; +#X obj 95 96 sigmund~ -npts 2048; #X text 469 617 updated for Pd version 0.53; -#X text 241 96 track pitch; -#X text 158 120 reject low numbers indicating no pitch found; +#X text 240 96 track pitch; +#X text 157 120 reject low numbers indicating no pitch found; #X text 187 450 We already saw how to use ring modulation to alias a pitched sound down one octave. Here we do the reverse: filter out all odd harmonics using a variable-delay comb filter tuned one octave above the incoming sound. We use two taps into the delay line. The fixed one (delread~) adjusts for the delayed output of sigmund~. The variable one (vd~) adds to this an additional delay equal to 1/2 the measured period of the incoming sound. These two are added. Odd harmonics are 180 degrees out of phase at the two taps and cancel. Even harmonics get through - so the sound goes up an octave \, without denaturing the timbre as a speed-up would., f 67; #X obj 114 412 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X obj 96 439 *~; @@ -32,26 +31,27 @@ #X obj 53 439 *~; #X text 322 223 estimate [sigmund~] delay as one window (in msec), f 25; #X text 140 412 <-- and processed sounds; +#X obj 114 356 delread4~ G06-del; #X connect 1 1 2 0; -#X connect 2 0 13 0; +#X connect 2 0 12 0; #X connect 5 0 0 0; -#X connect 6 0 18 0; -#X connect 7 0 12 0; +#X connect 6 0 17 0; +#X connect 7 0 11 0; #X connect 7 1 6 0; -#X connect 9 0 11 0; -#X connect 10 0 11 1; -#X connect 11 0 27 0; -#X connect 12 0 15 0; -#X connect 13 0 7 0; -#X connect 14 0 10 0; -#X connect 15 0 14 0; -#X connect 18 0 12 1; -#X connect 18 0 9 0; -#X connect 20 0 8 0; -#X connect 20 0 21 0; -#X connect 20 0 29 0; -#X connect 21 0 1 0; -#X connect 26 0 27 1; -#X connect 27 0 5 1; -#X connect 28 0 29 1; -#X connect 29 0 5 0; +#X connect 9 0 10 0; +#X connect 10 0 26 0; +#X connect 11 0 14 0; +#X connect 12 0 7 0; +#X connect 13 0 31 0; +#X connect 14 0 13 0; +#X connect 17 0 11 1; +#X connect 17 0 9 0; +#X connect 19 0 8 0; +#X connect 19 0 20 0; +#X connect 19 0 28 0; +#X connect 20 0 1 0; +#X connect 25 0 26 1; +#X connect 26 0 5 1; +#X connect 27 0 28 1; +#X connect 28 0 5 0; +#X connect 31 0 10 1; diff --git a/doc/3.audio.examples/G07.shaker.pd b/doc/3.audio.examples/G07.shaker.pd index 68463b92..25ca2a3a 100644 --- a/doc/3.audio.examples/G07.shaker.pd +++ b/doc/3.audio.examples/G07.shaker.pd @@ -1,4 +1,4 @@ -#N canvas 452 99 793 540 12; +#N canvas 356 76 793 540 12; #X declare -stdpath ./; #X obj 54 415 output~; #X obj 54 375 +~; @@ -32,10 +32,10 @@ #X text 229 26 on/off; #X text 413 28 time constant (msec); #X text 555 492 updated for Pd version 0.37-1; -#X text 422 224 This is a time-varying comb filter \, combining four delayed copies of the input signal. The amplitude of each delayed copy varies randomly between -0.7 and +1.3. Each time the metronome goes off \, one of the four delay's gains is changed in sequence. The change occurs over the next four ticks of the metronome (so \, if the metronome ticks every 50 msec \, each message to a line~ has a second argument of 200.), f 45; #X text 422 377 Any collection of four gains for the four delayed copies of the signal (including the original) defines some sort of irregular comb filter. The peaks and valleys of the comb filter shift constantly as the gains change to new \, random values., f 45; #X obj 546 84 declare -stdpath ./; #X obj 281 209 pack f f 200, f 13; +#X text 422 224 This is a time-varying comb filter \, combining four delayed copies of the input signal. The amplitude of each delayed copy varies randomly between -0.7 and +1.3. Each time the metronome goes off \, one of the four delay's gains is changed in sequence. The change occurs over the next four ticks of the metronome (so \, if the metronome ticks every 50 msec \, each message to a [line~] has a second argument of 200.), f 45; #X connect 1 0 0 0; #X connect 3 0 4 1; #X connect 4 0 1 1; @@ -50,7 +50,7 @@ #X connect 14 0 12 0; #X connect 14 0 16 0; #X connect 15 0 25 0; -#X connect 16 0 35 0; +#X connect 16 0 34 0; #X connect 16 1 15 0; #X connect 17 0 27 0; #X connect 18 0 24 0; @@ -64,8 +64,8 @@ #X connect 21 0 10 0; #X connect 22 0 6 0; #X connect 23 0 4 0; -#X connect 24 0 35 2; -#X connect 25 0 35 1; +#X connect 24 0 34 2; +#X connect 25 0 34 1; #X connect 26 0 21 0; #X connect 27 0 14 0; -#X connect 35 0 19 0; +#X connect 34 0 19 0; diff --git a/doc/3.audio.examples/G09.pitchshift.pd b/doc/3.audio.examples/G09.pitchshift.pd index 1a47e626..ff94cb47 100644 --- a/doc/3.audio.examples/G09.pitchshift.pd +++ b/doc/3.audio.examples/G09.pitchshift.pd @@ -1,4 +1,4 @@ -#N canvas 291 25 769 686 12; +#N canvas 407 47 769 686 12; #X declare -stdpath ./; #X floatatom 101 72 6 0 0 0 - - - 0; #X obj 101 443 *~; @@ -12,7 +12,7 @@ #X obj 101 244 /; #X obj 149 181 * 0.001; #X obj 287 433 line~; -#X floatatom 287 357 0 0 0 0 - - - 0; +#X floatatom 287 357 8 0 0 0 - - - 0; #X obj 287 331 r delay; #X obj 101 480 +~; #X obj 45 495 cos~; @@ -38,45 +38,39 @@ #X text 54 148 speed; #X text 47 162 change; #X text 29 261 tape head; -#N canvas 514 161 608 645 test-input 0; +#N canvas 627 195 565 379 test-input 0; #N canvas 0 0 450 300 (subpatch) 0; -#X array array1 155944 float 0; -#X coords 0 1 155943 -1 200 150 1; -#X restore 94 136 graph; -#X obj 163 503 tabread4~ array1; -#X obj 135 315 r totsamps; -#X obj 163 398 /; -#X obj 163 450 *~ 0; -#X obj 163 424 phasor~ 0; -#X obj 163 477 +~ 1; -#X msg 135 371 44100; -#X obj 135 345 t b f, f 7; -#X obj 206 454 r totsamps; -#X text 177 523 sample loop for; -#X text 177 540 test signal; -#X obj 105 25 loadbang; -#X obj 163 575 outlet~; -#X obj 337 164 r readfile; -#X obj 337 194 symbol; -#X msg 336 223 read -resize \$1 array1; -#X obj 336 251 soundfiler; -#X obj 336 279 s totsamps; -#X msg 105 59 \; readfile ../sound/bell.aiff; -#X connect 1 0 13 0; -#X connect 2 0 8 0; -#X connect 3 0 5 0; -#X connect 4 0 6 0; -#X connect 5 0 4 0; -#X connect 6 0 1 0; -#X connect 7 0 3 0; -#X connect 8 0 7 0; -#X connect 8 1 3 1; -#X connect 9 0 4 1; -#X connect 12 0 19 0; -#X connect 14 0 15 0; -#X connect 15 0 16 0; -#X connect 16 0 17 0; -#X connect 17 0 18 0; +#X array array1 155944 float 2; +#X coords 0 1 155944 -1 200 150 1; +#X restore 302 170 graph; +#X obj 91 240 tabread4~ array1; +#X obj 63 52 r totsamps; +#X obj 91 135 /; +#X obj 91 187 *~ 0; +#X obj 91 214 +~ 1; +#X msg 63 108 44100; +#X obj 63 82 t b f, f 7; +#X obj 134 191 r totsamps; +#X obj 91 312 outlet~; +#X obj 193 111 soundfiler; +#X obj 193 139 s totsamps; +#X obj 91 161 phasor~; +#X msg 193 83 read -resize ../sound/bell.aiff array1; +#X obj 193 54 loadbang; +#X text 103 269 sample loop for test signal, f 16; +#X connect 1 0 9 0; +#X connect 2 0 7 0; +#X connect 3 0 12 0; +#X connect 4 0 5 0; +#X connect 5 0 1 0; +#X connect 6 0 3 0; +#X connect 7 0 6 0; +#X connect 7 1 3 1; +#X connect 8 0 4 1; +#X connect 10 0 11 0; +#X connect 12 0 4 0; +#X connect 13 0 10 0; +#X connect 14 0 13 0; #X restore 392 179 pd test-input; #X obj 165 594 output~; #X obj 101 301 phasor~; diff --git a/doc/3.audio.examples/H01.low-pass.pd b/doc/3.audio.examples/H01.low-pass.pd index d14cd718..ae20c83f 100644 --- a/doc/3.audio.examples/H01.low-pass.pd +++ b/doc/3.audio.examples/H01.low-pass.pd @@ -1,45 +1,43 @@ -#N canvas 506 23 611 675 12; +#N canvas 506 38 613 631 12; #X declare -stdpath ./; -#X obj 108 425 mtof; -#X floatatom 108 402 5 0 0 0 - \$0-pit - 0; -#X obj 84 598 output~; -#X obj 83 475 lop~; -#X obj 83 372 noise~; -#X floatatom 108 450 5 0 0 0 - - - 0; -#X text 363 596 updated for Pd version 0.39; -#X text 119 474 low-pass filter; -#X obj 157 562 tabwrite~ H01-graph; -#X obj 157 530 metro 250; -#X obj 157 505 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 182 504 graphing on/off; -#X text 407 545 --- 0.02 sec ---; -#X text 43 44 This and the following patches show how to use filters in Pd \, starting with the simplest one: the one-pole low-pass filter. Here we test it with an input of white noise. The lop~ object does the filtering. Its left inlet takes an audio signal to be filtered \, and its right inlet takes messages to set its cutoff frequency in Hertz.; -#X text 41 143 The lop~ object is normalized to pass DC (the lowest frequency) with a gain of one. Higher frequencies are progressively more and more attenuated. The lower the cutoff frequency \, the lower the total power of the filtered noise. If you graph the output you'll see that the waveform gets smoother (and smaller overall) as the cutoff frequency is lowered.; -#X text 43 257 At the cutoff frequency the gain is about -3 dB \, and above that the gain drops a further 6 dB per octave. (Sometimes one uses the word "rolloff" instead of "cutoff" to emphasize the gradual way the gain drops off with frequency.); -#X text 137 371 white noise \, test signal; -#X text 98 19 ONE-POLE LOW-PASS FILTER; -#N canvas 774 414 305 205 loadbang 0; -#X obj 87 21 loadbang; -#X obj 87 47 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 87 77 f \$0; -#X msg 87 101 \; \$1-pit 60; -#X text 47 157 This subpatch loads initial values in number boxes., f 30; -#X connect 0 0 1 0; -#X connect 1 0 2 0; -#X connect 2 0 3 0; -#X restore 234 615 pd loadbang; -#X text 160 401 <= cutoff (pitch units); -#X text 163 448 <= cutoff (Hertz); +#X obj 96 367 mtof; +#X floatatom 96 344 5 0 0 0 - \$0-pit - 0; +#X obj 72 540 output~; +#X obj 71 417 lop~; +#X obj 71 314 noise~; +#X floatatom 96 392 7 0 0 0 - - - 0; +#X text 107 416 low-pass filter; +#X obj 145 504 tabwrite~ H01-graph; +#X obj 145 472 metro 250; +#X obj 145 447 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X text 170 446 graphing on/off; +#X text 399 518 --- 0.02 sec ---; +#X text 33 133 The lop~ object is normalized to pass DC (the lowest frequency) with a gain of one. Higher frequencies are progressively more and more attenuated. The lower the cutoff frequency \, the lower the total power of the filtered noise. If you graph the output you'll see that the waveform gets smoother (and smaller overall) as the cutoff frequency is lowered., f 75; +#X text 40 212 At the cutoff frequency the gain is about -3 dB \, and above that the gain drops a further 6 dB per octave. (Sometimes one uses the word "rolloff" instead of "cutoff" to emphasize the gradual way the gain drops off with frequency.), f 74; +#X text 125 313 white noise \, test signal; +#X text 80 22 ONE-POLE LOW-PASS FILTER; #N canvas 0 0 450 300 (subpatch) 0; #X array H01-graph 882 float 0; #X coords 0 1 881 -1 200 140 1 0 0; -#X restore 375 402 graph; -#X obj 446 12 declare -stdpath ./; +#X restore 357 372 graph; +#X text 140 343 <-- cutoff (pitch units); +#X text 155 391 <-- cutoff (Hertz); +#N canvas 774 414 291 271 init 0; +#X obj 107 103 loadbang; +#X obj 107 168 s \$0-pit; +#X msg 107 135 60; +#X obj 79 218 declare -stdpath ./; +#X text 42 27 This subpatch initializes the patch and loads a value in the pitch number box., f 30; +#X connect 0 0 2 0; +#X connect 2 0 1 0; +#X restore 227 558 pd init; +#X text 33 54 This and the following patches show how to use filters in Pd \, starting with the simplest one: the one-pole low-pass filter. Here we test it with an input of white noise. The [lop~] object does the filtering. Its left inlet takes an audio signal to be filtered \, and its right inlet takes messages or signals to set its cutoff frequency in Hertz., f 75; +#X text 369 564 updated for Pd version 0.55; #X connect 0 0 5 0; #X connect 1 0 0 0; #X connect 3 0 2 0; -#X connect 3 0 8 0; +#X connect 3 0 7 0; #X connect 4 0 3 0; #X connect 5 0 3 1; +#X connect 8 0 7 0; #X connect 9 0 8 0; -#X connect 10 0 9 0; diff --git a/doc/3.audio.examples/H02.high-pass.pd b/doc/3.audio.examples/H02.high-pass.pd index 61470f7c..7e94837d 100644 --- a/doc/3.audio.examples/H02.high-pass.pd +++ b/doc/3.audio.examples/H02.high-pass.pd @@ -1,42 +1,41 @@ -#N canvas 486 26 596 595 12; +#N canvas 486 38 568 698 12; #X declare -stdpath ./; -#X obj 72 512 output~; -#X text 352 533 updated for Pd version 0.39; -#X obj 151 454 metro 250; -#X obj 151 427 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 174 426 graphing on/off; +#X obj 41 579 output~; +#X obj 102 490 metro 250; +#X obj 102 463 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X text 125 462 graphing on/off; #N canvas 0 0 450 300 (subpatch) 0; #X array H02-graph 882 float 0; #X coords 0 1 881 -1 200 140 1 0 0; -#X restore 371 311 graph; -#X text 415 456 --- 0.02 sec ---; -#X text 36 41 Many synthesis algorithms and transformations can have outputs with a zero-frequency component (commonly called DC for "direct current"). These are inaudible and sometimes cause distortion in audio output devices \, or when converting to fixed-point soundfile formats. It is often desirable to filter an audio signal to remove its DC component., f 65; -#X text 36 137 The simplest way to do this is to use a one-pole low-pass filter \, tuned to a low frequency such as 3 Hertz \, and to subtract its output from the original. This difference is called a one-pole \, one-zero high-pass filter \, and it is used so often that Pd provides one in the "hip~" object., f 65; -#X obj 71 263 +~ 1; -#X obj 71 400 hip~ 5; -#X text 134 400 high-pass filter; -#X floatatom 110 364 5 0 0 0 - - - 0; -#X msg 110 289 0; -#X text 155 238 sinusoidal test signal; -#X text 117 263 add "DC"; -#X text 148 289 zero for no filtering; -#X msg 120 312 3; -#X text 155 313 3 (or so) to remove DC; -#X text 160 337 higher frequencies affect; -#X text 202 351 the audible part of; -#X text 202 367 the signal as well.; -#X obj 71 238 osc~ 220; -#X msg 128 337 220; -#X text 102 9 ONE-POLE \, ONE-ZERO HIGH-PASS FILTER; -#X obj 133 480 tabwrite~ H02-graph; -#X obj 425 8 declare -stdpath ./; -#X connect 2 0 25 0; -#X connect 3 0 2 0; -#X connect 9 0 10 0; -#X connect 10 0 0 0; -#X connect 10 0 25 0; -#X connect 12 0 10 1; -#X connect 13 0 12 0; -#X connect 17 0 12 0; -#X connect 22 0 9 0; -#X connect 23 0 12 0; +#X restore 328 306 graph; +#X text 372 452 --- 0.02 sec ---; +#X text 53 48 Many synthesis algorithms and transformations can have outputs with a zero-frequency component (commonly called DC for "direct current"). These are inaudible and sometimes cause distortion in audio output devices \, or when converting to fixed-point soundfile formats. It is often desirable to filter an audio signal to remove its DC component., f 65; +#X obj 40 269 +~ 1; +#X text 95 417 high-pass filter; +#X floatatom 79 380 5 0 0 0 - - - 0; +#X msg 79 305 0; +#X text 107 242 sinusoidal test signal; +#X text 86 269 add "DC"; +#X text 117 305 zero for no filtering; +#X msg 89 328 3; +#X text 124 329 3 (or so) to remove DC; +#X obj 40 244 osc~ 220; +#X msg 97 353 220; +#X text 102 12 ONE-POLE \, ONE-ZERO HIGH-PASS FILTER; +#X obj 102 529 tabwrite~ H02-graph; +#X obj 40 656 declare -stdpath ./; +#X text 53 144 The simplest way to do this is to use a one-pole low-pass filter \, tuned to a low frequency such as 3 Hertz \, and to subtract its output from the original. This difference is called a one-pole \, one-zero high-pass filter \, and it is used so often that Pd provides one in the [hip~] object., f 65; +#X text 324 650 updated for Pd version 0.54; +#X text 161 578 The [output~] abstraction includes [hip~] objects for this reason., f 34; +#X text 129 353 higher frequencies affect the audible part of the signal as well., f 23; +#X obj 40 416 hip~ 3; +#X connect 1 0 19 0; +#X connect 2 0 1 0; +#X connect 7 0 25 0; +#X connect 9 0 25 1; +#X connect 10 0 9 0; +#X connect 14 0 9 0; +#X connect 16 0 7 0; +#X connect 17 0 9 0; +#X connect 25 0 0 0; +#X connect 25 0 19 0; diff --git a/doc/3.audio.examples/H03.band-pass.pd b/doc/3.audio.examples/H03.band-pass.pd index d095bc91..cdaa9e41 100644 --- a/doc/3.audio.examples/H03.band-pass.pd +++ b/doc/3.audio.examples/H03.band-pass.pd @@ -1,41 +1,41 @@ #N canvas 472 56 599 579 12; #X declare -stdpath ./; -#X obj 76 303 mtof; -#X floatatom 76 280 5 0 150 0 - \$0-pit - 0; -#X obj 67 500 output~; -#X obj 67 250 noise~; -#X floatatom 76 328 5 0 0 0 - - - 0; -#X text 341 503 updated for Pd version 0.39; -#X obj 156 439 metro 250; -#X text 178 412 graphing on/off; -#X text 391 446 --- 0.02 sec ---; -#X text 133 249 white noise \, test signal; -#X obj 67 386 bp~; -#X text 108 388 band-pass filter; -#X obj 156 464 tabwrite~ H03-graph; -#X floatatom 85 358 5 0 1000 0 - \$0-q - 0; -#N canvas 550 179 352 240 loadbang 0; +#X obj 76 301 mtof; +#X floatatom 76 278 5 0 150 0 - \$0-pit - 0; +#X obj 67 498 output~; +#X obj 67 248 noise~; +#X floatatom 76 326 5 0 0 0 - - - 0; +#X text 355 501 updated for Pd version 0.39; +#X obj 156 437 metro 250; +#X text 178 410 graphing on/off; +#X text 391 444 --- 0.02 sec ---; +#X text 120 247 white noise \, test signal; +#X obj 67 384 bp~; +#X text 105 384 band-pass filter; +#X obj 156 462 tabwrite~ H03-graph; +#X floatatom 85 356 5 0 1000 0 - \$0-q - 0; +#X text 93 25 RESONANT (BAND-PASS) FILTER; +#X text 59 141 The two controls specify \, first \, the center frequency \, and second \, the sharpness of the filter \, commonly called "q". If you increase q to 10 or 20 \, you will see a drop in total signal power \, and moreover \, you'll see and hear the resonant frequency more clearly in the result., f 69; +#N canvas 0 0 450 300 (subpatch) 0; +#X array H03-graph 882 float 0; +#X coords 0 1 881 -1 200 140 1; +#X restore 354 301 graph; +#X obj 156 411 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X text 120 277 <-- cutoff (pitch units); +#X text 121 326 <-- cutoff (Hertz); +#X text 131 356 <-- Q (selectivity); +#X text 59 52 A simple resonant band-pass filter is provided in the [bp~] object. Resonant filters can be tuned to a specific "center frequency" and then will pass that frequency while attenuating other frequencies (the further from the center frequency \, the more attenuation). This patch uses a white noise source to demonstrate [bp~]., f 69; +#N canvas 550 179 349 293 init 0; #X obj 126 20 loadbang; #X obj 126 44 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 126 73 f \$0; #X msg 126 97 \; \$1-pit 72 \; \$1-q 1; -#X text 77 170 This subpatch loads initial values in number boxes., f 27; +#X obj 111 235 declare -stdpath ./; +#X text 77 170 This subpatch initializes the patch and loads values in number boxes., f 27; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 2 0 3 0; -#X restore 199 512 pd loadbang; -#X text 154 8 RESONANT (BAND-PASS) FILTER; -#X text 50 143 The two controls specify \, first \, the center frequency \, and second \, the sharpness of the filter \, commonly called "q". If you increase q to 10 or 20 \, you will see a drop in total signal power \, and moreover \, you'll see and hear the resonant frequency more clearly in the result.; -#X text 52 44 A simple resonant band-pass filter is provided in the bp~ object. Resonant filters can be tuned to a specific "center frequency" and then will pass that frequency while attenuating other frequencies (the further from the center frequency \, the more attenuation). This patch uses a white noise source to demonstrate bp~.; -#X text 121 328 <= cutoff (Hertz); -#X text 120 279 <= cutoff (pitch units); -#N canvas 0 0 450 300 (subpatch) 0; -#X array H03-graph 882 float 0; -#X coords 0 1 881 -1 200 140 1; -#X restore 354 303 graph; -#X text 131 358 <= Q (selectivity); -#X obj 434 13 declare -stdpath ./; -#X obj 156 413 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X restore 210 516 pd init; #X connect 0 0 4 0; #X connect 1 0 0 0; #X connect 3 0 10 0; @@ -44,4 +44,4 @@ #X connect 10 0 2 0; #X connect 10 0 12 0; #X connect 13 0 10 2; -#X connect 23 0 6 0; +#X connect 17 0 6 0; diff --git a/doc/3.audio.examples/H04.filter.sweep.pd b/doc/3.audio.examples/H04.filter.sweep.pd index 8cc75be7..b465855d 100644 --- a/doc/3.audio.examples/H04.filter.sweep.pd +++ b/doc/3.audio.examples/H04.filter.sweep.pd @@ -1,52 +1,51 @@ -#N canvas 553 38 514 633 12; +#N canvas 553 38 513 624 12; #X declare -stdpath ./; -#X floatatom 126 203 5 0 150 0 - \$0-pitch - 0; -#X text 102 27 SWEEPING FILTERS; -#X obj 126 250 phasor~; -#X obj 138 408 +~; -#X floatatom 156 383 5 0 100 0 - \$0-offset - 0; -#X floatatom 139 279 5 0 0 0 - \$0-speed - 0; -#X floatatom 157 330 5 0 100 0 - \$0-depth - 0; -#X floatatom 151 463 5 0 1000 0 - \$0-q - 0; -#X obj 126 488 vcf~; -#X text 197 239 sawtooth; -#X text 198 255 oscillator; -#X text 216 302 LFO for sweep; -#X text 174 407 add base to sweep; -#X text 183 437 convert to Hz.; -#X obj 126 529 output~; -#X obj 126 226 mtof; -#X obj 139 301 phasor~; -#X obj 139 355 *~; -#X text 269 595 updated for Pd version 0.39; -#N canvas 706 247 304 285 startup 0; +#X floatatom 111 203 5 0 150 0 - \$0-pitch - 0; +#X text 87 27 SWEEPING FILTERS; +#X obj 111 250 phasor~; +#X obj 123 408 +~; +#X floatatom 141 383 5 0 100 0 - \$0-offset - 0; +#X floatatom 124 279 5 0 0 0 - \$0-speed - 0; +#X floatatom 142 330 5 0 100 0 - \$0-depth - 0; +#X floatatom 136 463 5 0 1000 0 - \$0-q - 0; +#X obj 111 488 vcf~; +#X text 201 302 LFO for sweep; +#X text 159 407 add base to sweep; +#X text 168 437 convert to Hz.; +#X obj 111 529 output~; +#X obj 111 226 mtof; +#X obj 124 301 phasor~; +#X obj 124 355 *~; +#X text 288 562 updated for Pd version 0.39; +#X text 52 140 Note the different effects of negative and positive sweep speeds., f 53; +#X obj 123 437 mtof~; +#X text 52 59 If you want actively changing center frequencies \, use [vcf~] instead of [bp~]. The [vcf~] module takes an audio signal to set center frequency (Q is still set by messages though) \, which makes it computationally somewhat more expensive than [bp~]., f 53; +#N canvas 706 247 304 346 init 0; #X obj 85 23 loadbang; #X obj 85 47 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 85 76 f \$0; #X msg 85 100 \; \$1-pitch 48 \; \$1-speed -2 \; \$1-depth 27 \; \$1-offset 56 \; \$1-q 2; -#X text 66 209 This subpatch loads initial values in number boxes., f 27; +#X obj 86 277 declare -stdpath ./; +#X text 66 209 This subpatch initializes the patch and loads values in number boxes., f 27; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 2 0 3 0; -#X restore 303 532 pd startup; -#X text 67 140 Note the different effects of negative and positive sweep speeds., f 53; -#X text 172 203 <= pitch; -#X text 181 278 <= sweep speed; -#X text 199 331 <= sweep depth; -#X text 199 383 <= base center frequency; -#X text 203 462 <= Q (selectivity); -#X obj 307 22 declare -stdpath ./; -#X obj 138 437 mtof~; -#X text 67 59 If you want actively changing center frequencies \, use [vcf~] instead of [bp~]. The [vcf~] module takes an audio signal to set center frequency (Q is still set by messages though) \, which makes it computationally somewhat more expensive than [bp~]., f 53; -#X connect 0 0 15 0; +#X restore 260 514 pd init; +#X text 179 461 <-- Q (selectivity); +#X text 184 383 <-- base center frequency; +#X text 184 331 <-- sweep depth; +#X text 166 278 <-- sweep speed; +#X text 157 203 <-- pitch; +#X text 171 251 [phasor~] as a sawtooth like oscillator; +#X connect 0 0 13 0; #X connect 2 0 8 0; -#X connect 3 0 27 0; +#X connect 3 0 18 0; #X connect 4 0 3 1; -#X connect 5 0 16 0; -#X connect 6 0 17 1; +#X connect 5 0 14 0; +#X connect 6 0 15 1; #X connect 7 0 8 2; -#X connect 8 0 14 0; -#X connect 15 0 2 0; -#X connect 16 0 17 0; -#X connect 17 0 3 0; -#X connect 27 0 8 1; +#X connect 8 0 12 0; +#X connect 13 0 2 0; +#X connect 14 0 15 0; +#X connect 15 0 3 0; +#X connect 18 0 8 1; diff --git a/doc/3.audio.examples/H05.filter.floyd.pd b/doc/3.audio.examples/H05.filter.floyd.pd index b56c11a0..41619d55 100644 --- a/doc/3.audio.examples/H05.filter.floyd.pd +++ b/doc/3.audio.examples/H05.filter.floyd.pd @@ -1,78 +1,81 @@ -#N canvas 488 38 587 719 12; +#N canvas 600 38 590 730 12; #X declare -stdpath ./; -#X obj 167 451 line~; -#X obj 167 427 pack 0 100; -#X floatatom 167 379 3 0 150 0 - \$0-cf - 0; -#X floatatom 179 505 3 0 999 0 - \$0-q - 0; -#X obj 122 557 vcf~; -#X text 51 28 ANOTHER SWEEPING FILTER EXAMPLE; -#X obj 149 318 clip~ 0 0.5; -#X obj 149 340 *~ 2; -#X obj 121 385 -~; -#X text 29 298 trick to; -#X text 30 315 make symmetric; -#X text 28 332 triangle wave; -#X obj 139 186 f; -#X obj 172 184 + 1; -#X obj 139 261 mtof; -#X obj 172 208 mod 8; +#X obj 167 461 line~; +#X obj 167 433 pack 0 100; +#X floatatom 167 384 4 61 110 0 - \$0-cf - 0; +#X floatatom 179 514 5 3 100 0 - \$0-q - 0; +#X obj 122 567 vcf~; +#X text 66 17 ANOTHER SWEEPING FILTER EXAMPLE; +#X obj 150 328 clip~ 0 0.5; +#X obj 150 350 *~ 2; +#X obj 122 395 -~; +#X obj 140 204 f; +#X obj 179 194 + 1; +#X obj 140 271 mtof; +#X obj 179 218 mod 8; #N canvas 0 22 450 300 (subpatch) 0; -#X array \$0-array1 8 float 2; -#X coords 0 96 8 36 200 100 1; -#X restore 346 175 graph; -#X obj 139 157 metro 85; -#X text 206 185 sequencer for; -#X text 228 203 8 note loop; -#X obj 154 640 output~; -#X obj 139 130 tgl 19 0 empty \$0-metro empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#N canvas 876 177 379 259 startup 0; +#X array \$0-sequence 8 float 2; +#X coords 0 72 8 48 183 122 1 0 0; +#X restore 345 184 graph; +#X obj 154 653 output~; +#X obj 140 140 tgl 19 0 empty \$0-metro empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X text 220 407 at least 61; +#X obj 140 295 phasor~; +#X text 365 681 updated for Pd version 0.39; +#X obj 154 606 vcf~; +#X obj 167 408 max 61; +#X text 212 471 smooth & convert to Hz.; +#X obj 167 484 mtof~; +#N canvas 876 177 379 325 init 0; #X obj 51 23 loadbang; #X obj 51 47 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 51 74 f \$0; -#X msg 51 98 \; \$1-cf 61 \; \$1-q 10 \; \$1-metro 1 \; \$1-array1 0 45 48 50 48 55 53 55 57; -#X text 82 194 This subpatch loads initial values in number boxes., f 27; +#X obj 84 270 declare -stdpath ./; +#X text 69 193 This subpatch initializes the patch and loads initial values in number boxes and the array., f 31; +#X msg 51 98 \; \$1-cf 61 \; \$1-q 10 \; \$1-metro 1 \; \$1-sequence 0 55 58 60 58 65 63 65 67; #X connect 0 0 1 0; #X connect 1 0 2 0; -#X connect 2 0 3 0; -#X restore 401 335 pd startup; -#X text 220 401 at least 61; -#X obj 139 285 phasor~; -#X text 357 665 updated for Pd version 0.39; -#X obj 139 237 tabread \$0-array1; -#X obj 154 596 vcf~; -#X obj 167 402 max 61; -#X text 218 449 smooth & convert to Hz.; -#X obj 179 529 max 3; -#X text 227 530 at least 3; -#X text 67 59 Here's an approximate reconstruction of an old riff by Pink Floyd. Because we're filtering a waveform with odd partials \, it's easier to pick out the partials in the filtered sound than if we had had both even and odd ones., f 66; -#X text 200 588 rejection of the stop bands without having; -#X text 201 570 Put two vcf objects in series for better; -#X text 199 606 to make the passband excessively narrow.; -#X text 213 505 <= Q (selectivity); -#X text 200 376 <= center frequency; -#X obj 408 22 declare -stdpath ./; -#X obj 167 477 mtof~; -#X connect 0 0 39 0; +#X connect 2 0 5 0; +#X restore 475 338 pd init; +#X text 219 513 <-- Q (selectivity); +#X text 202 384 <-- center frequency; +#X text 38 324 trick to make a symmetric triangle wave, f 13; +#X text 225 199 sequencer for 8 note loop, f 13; +#X obj 122 435 *~ 4; +#X obj 122 459 -~ 1; +#X text 28 440 make it go from -1 to 1, f 12; +#X obj 179 537 max 3; +#X text 196 572 Put two [vcf~] objects in series for better rejection of the stop bands without having to make the passband excessively narrow., f 43; +#X text 224 538 at least 3; +#X obj 140 167 metro 85; +#X obj 140 245 tabread \$0-sequence; +#X text 532 294 48; +#X text 531 175 72; +#X text 67 49 Here's an approximate reconstruction of an old riff by Pink Floyd. Because we're filtering a triangular waveform with odd partials \, it's easier to pick out the partials in the filtered sound than if we had had both even and odd ones., f 66; +#X text 459 159 Picthes; +#X connect 0 0 22 0; #X connect 1 0 0 0; -#X connect 2 0 28 0; -#X connect 3 0 30 0; -#X connect 4 0 27 0; +#X connect 2 0 20 0; +#X connect 3 0 31 0; +#X connect 4 0 19 0; #X connect 6 0 7 0; #X connect 7 0 8 0; -#X connect 8 0 4 0; -#X connect 12 0 13 0; -#X connect 12 0 26 0; -#X connect 13 0 15 0; -#X connect 14 0 24 0; -#X connect 15 0 12 1; -#X connect 17 0 12 0; -#X connect 21 0 17 0; -#X connect 24 0 6 0; -#X connect 24 0 8 1; -#X connect 26 0 14 0; -#X connect 27 0 20 0; -#X connect 28 0 1 0; -#X connect 30 0 4 2; -#X connect 30 0 27 2; -#X connect 39 0 4 1; -#X connect 39 0 27 1; +#X connect 8 0 28 0; +#X connect 9 0 10 0; +#X connect 9 0 35 0; +#X connect 10 0 12 0; +#X connect 11 0 17 0; +#X connect 12 0 9 1; +#X connect 15 0 34 0; +#X connect 17 0 6 0; +#X connect 17 0 8 1; +#X connect 19 0 14 0; +#X connect 20 0 1 0; +#X connect 22 0 4 1; +#X connect 22 0 19 1; +#X connect 28 0 29 0; +#X connect 29 0 4 0; +#X connect 31 0 19 2; +#X connect 31 0 4 2; +#X connect 34 0 9 0; +#X connect 35 0 11 0; diff --git a/doc/3.audio.examples/H06.envelope.follower.pd b/doc/3.audio.examples/H06.envelope.follower.pd index 4289d6df..2a1b54cd 100644 --- a/doc/3.audio.examples/H06.envelope.follower.pd +++ b/doc/3.audio.examples/H06.envelope.follower.pd @@ -1,74 +1,72 @@ -#N canvas 569 23 555 685 12; -#X floatatom 68 557 6 0 0 0 - - - 0; -#X floatatom 322 310 5 0 999 0 - \$0-osc2 - 12; +#N canvas 569 38 549 725 12; +#X floatatom 68 577 8 0 0 0 - - - 0; +#X floatatom 322 300 5 0 999 0 - \$0-osc2 - 12; #X obj 322 334 osc~; #X text 39 14 ENVELOPE FOLLOWER; -#X text 32 41 An envelope follower measures the mean square power of an signal as it changes over time. (You can convert mean square power to RMS amplitude or to decibels if you wish.) The term "mean square" means simply that the signal should be squared \, and then averaged. The averaging is done using a low-pass filter such as lop~., f 70; -#X obj 248 491 lop~; -#X floatatom 273 462 4 0 100 0 - \$0-lop - 0; -#X obj 247 366 +~; -#X obj 247 335 osc~ 500; -#X obj 248 428 *~; -#X obj 248 554 snapshot~; -#X floatatom 248 611 7 0 999 0 - - - 0; -#X obj 248 584 sqrt; -#X obj 68 584 dbtorms; -#X floatatom 68 611 5 0 999 0 - - - 0; -#N canvas 536 459 382 265 startup 0; -#X obj 44 18 loadbang; -#X obj 44 42 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 44 71 f \$0; -#X text 57 199 This subpatch loads initial; -#X text 60 217 values in number boxes.; -#X obj 245 136 metro 250; -#X obj 245 111 r \$0-metro; -#X obj 245 160 s \$0-tick; -#X msg 44 95 \; \$1-osc2 400 \; \$1-lop 10 \; \$1-metro 1; -#X connect 0 0 1 0; -#X connect 1 0 2 0; -#X connect 2 0 8 0; -#X connect 5 0 7 0; -#X connect 6 0 5 0; -#X restore 78 361 pd startup; -#X text 301 429 square the signal; -#X text 336 523 take snapshot; -#X text 294 583 convert to RMS; -#X text 308 652 updated for Pd version 0.39; -#X text 293 491 low-pass filter; -#X text 309 610 output; -#X obj 259 526 r \$0-tick; -#X text 336 539 every 1/4 second; -#X obj 68 411 r \$0-tick; -#X obj 68 532 f; -#X obj 86 490 env~; -#X text 33 216 The env~ object at right \, which is a built-in envelope follower using a higher-quality low-pass filter than lop~ \, is shown for comparison. Its output is artificially slowed down to match the homemade one at left., f 70; +#X obj 248 511 lop~; +#X floatatom 273 482 4 0 100 0 - \$0-lop - 0; +#X obj 247 386 +~; +#X obj 247 355 osc~ 500; +#X obj 248 448 *~; +#X obj 248 574 snapshot~; +#X floatatom 248 635 9 0 999 0 - - - 0; +#X obj 248 604 sqrt; +#X obj 68 604 dbtorms; +#X text 301 449 square the signal; +#X text 285 603 convert to RMS; +#X text 311 684 updated for Pd version 0.39; +#X text 293 511 low-pass filter; +#X text 317 634 output; +#X obj 259 546 r \$0-tick; +#X obj 68 441 r \$0-tick; +#X obj 68 552 f; +#X obj 86 510 env~; #X obj 322 388 *~; #X obj 340 363 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X text 32 122 Here we're adding two oscillators so the result should be an RMS of one if the second oscillator is on \, 0.707 otherwise. Note two effects: first \, the more responsive the envelope follower \, the less accurate the result (but the faster it responds). Second \, if the two oscillators are tuned close to each other their beating affects the numbers coming out., f 70; -#X text 365 363 <= on/off; -#X text 129 512 built-in envelope follower for comparison, f 12; -#X text 308 462 <= responsiveness; -#X text 83 308 frequency of second oscillator =>; -#X obj 402 276 ../5.reference/set-dsp-tgl; -#X text 433 279 DSP on/off; -#X msg 402 313 \; pd dsp \$1; -#X connect 0 0 13 0; +#X obj 68 342 ../5.reference/set-dsp-tgl; +#X text 99 345 DSP on/off; +#X msg 68 379 \; pd dsp \$1; +#X text 32 41 An envelope follower measures the mean square power of an signal as it changes over time. (You can convert mean square power to RMS amplitude or to decibels if you wish.) The term "mean square" means simply that the signal should be squared \, and then averaged. The averaging is done using a low-pass filter such as [lop~]., f 70; +#X text 33 216 The [env~] object at right \, which is a built-in envelope follower using a higher-quality low-pass filter than [lop~] \, is shown for comparison. Its output is artificially slowed down to match the homemade one at left., f 70; +#X text 308 482 <-- responsiveness; +#N canvas 536 459 382 265 init 0; +#X obj 85 14 loadbang; +#X obj 85 38 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 85 67 f \$0; +#X obj 229 91 metro 250; +#X obj 229 66 r \$0-metro; +#X obj 229 115 s \$0-tick; +#X msg 85 91 \; \$1-osc2 400 \; \$1-lop 10 \; \$1-metro 1; +#X text 86 181 This subpatch initializes the patch \, starts the metronome and loads initial values in number boxes., f 31; +#X connect 0 0 1 0; +#X connect 1 0 2 0; +#X connect 2 0 6 0; +#X connect 3 0 5 0; +#X connect 4 0 3 0; +#X restore 444 611 pd init; +#X text 78 300 frequency of second oscillator -->; +#X text 365 363 <-- on/off; +#X floatatom 68 635 9 0 999 0 - - - 0; +#X text 331 542 take snapshot every 1/4 second, f 16; +#X text 122 509 <-- built-in envelope follower for comparison, f 12; +#X connect 0 0 12 0; #X connect 1 0 2 0; -#X connect 2 0 28 0; -#X connect 5 0 10 0; -#X connect 6 0 5 1; -#X connect 7 0 9 0; -#X connect 7 0 9 1; -#X connect 7 0 26 0; -#X connect 8 0 7 0; -#X connect 9 0 5 0; -#X connect 10 0 12 0; -#X connect 12 0 11 0; -#X connect 13 0 14 0; -#X connect 22 0 10 0; -#X connect 24 0 25 0; -#X connect 25 0 0 0; -#X connect 26 0 25 1; -#X connect 28 0 7 1; -#X connect 29 0 28 1; -#X connect 35 0 37 0; +#X connect 2 0 22 0; +#X connect 4 0 9 0; +#X connect 5 0 4 1; +#X connect 6 0 8 0; +#X connect 6 0 8 1; +#X connect 6 0 21 0; +#X connect 7 0 6 0; +#X connect 8 0 4 0; +#X connect 9 0 11 0; +#X connect 11 0 10 0; +#X connect 12 0 34 0; +#X connect 18 0 9 0; +#X connect 19 0 20 0; +#X connect 20 0 0 0; +#X connect 21 0 20 1; +#X connect 22 0 6 1; +#X connect 23 0 22 1; +#X connect 25 0 27 0; diff --git a/doc/3.audio.examples/H07.measure.spectrum.pd b/doc/3.audio.examples/H07.measure.spectrum.pd index 0aa17e3a..7fbf8409 100644 --- a/doc/3.audio.examples/H07.measure.spectrum.pd +++ b/doc/3.audio.examples/H07.measure.spectrum.pd @@ -1,75 +1,91 @@ -#N canvas 412 23 626 723 12; +#N canvas 453 38 655 862 12; #X declare -stdpath ./; -#X floatatom 59 691 5 0 0 0 - - - 0; -#X obj 147 576 bp~; -#X obj 124 537 bp~; -#X obj 156 448 mtof; -#X floatatom 156 475 7 0 0 0 - - - 0; -#X floatatom 165 501 4 0 999 0 - \$0-q - 0; -#X floatatom 156 426 7 0 150 0 - \$0-pitch - 0; -#X obj 59 616 env~ 4096; -#X obj 125 349 *~ 0; -#X obj 124 374 +~ 1; -#X obj 59 640 + 0.5; -#X obj 59 666 int; -#X text 52 51 In this example we use two cascaded band-pass filters to troll for partials in Jonathan Harvey's famous bell sample., f 70; -#X text 52 212 You can hear partials around 48 \, 51.3 \, 55 (faint!) \, 57 (fainter!) \, 60 \, two beating partials around 65 \, 67 \, 69 \, 70.9 \, 71.75 \, 72.6 \, 74 \, 74.65 \, 75.6 \, 77 \, 81.2 \, 84.6 \, 86.5 \, and probably many more. There's also one down at 36 \, but it's easier to see it on the meter than hear it., f 70; -#X text 191 450 (shift-drag to fine tune); -#X obj 147 623 output~; -#X text 378 679 updated for Pd version 0.39; -#X text 52 89 Note that filters can give unexpected level changes. The bp~ object is designed to have roughly unit gain at the pass band \, so the higher you set "Q" the more amplitude is lost. You can correct for this by pushing the output amplitude \, but be sure to remember to reset the output amplitude before you reduce Q again. I set the Q to 100 and the output amplitude to 110 or 120 (with the room gain way down.) Then holding the shift key \, slowly drag the center pitch upward listening for modes., f 70; -#N canvas 316 23 512 371 startup 0; -#X obj 189 216 r readfile; -#X obj 189 269 soundfiler; -#X obj 123 17 loadbang; -#X obj 123 43 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 123 74 f \$0; -#X obj 95 284 /; -#X msg 60 254 44100; -#X obj 60 229 t b f, f 8; -#X obj 60 205 r \$0-totsamps; -#X obj 95 307 s \$0-loopf; -#X msg 123 101 \; readfile symbol \$1-array \; \$1-totsamps 143718 \; \$1-pitch 69 \; \$1-q 0; -#X msg 189 242 read -resize ../sound/bell.aiff \$1; -#X connect 0 0 11 0; -#X connect 2 0 3 0; -#X connect 3 0 4 0; -#X connect 4 0 10 0; -#X connect 5 0 9 0; -#X connect 6 0 5 0; -#X connect 7 0 6 0; -#X connect 7 1 5 1; -#X connect 8 0 7 0; -#X connect 11 0 1 0; -#X restore 312 580 pd startup; +#X obj 145 571 bp~; +#X obj 122 532 bp~; +#X obj 154 443 mtof; +#X floatatom 154 470 7 0 0 0 - - - 0; +#X floatatom 163 496 4 0 999 0 - \$0-q - 0; +#X floatatom 154 421 7 0 150 0 - \$0-pitch - 0; +#X obj 61 614 env~ 4096; +#X obj 122 334 *~ 0; +#X obj 122 359 +~ 1; +#X text 35 51 In this example we use two cascaded band-pass filters to troll for partials in Jonathan Harvey's famous bell sample., f 82; +#X text 35 198 You can hear partials around 48 \, 51.3 \, 55 (faint!) \, 57 (fainter!) \, 60 \, two beating partials around 65 \, 67 \, 69 \, 70.9 \, 71.75 \, 72.6 \, 74 \, 74.65 \, 75.6 \, 77 \, 81.2 \, 84.6 \, 86.5 \, and probably many more. There's also one down at 36 \, but it's easier to see it on the meter than hear it., f 82; +#X text 189 445 (shift-drag to fine tune); +#X obj 145 711 output~; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-array 155944 float 2; -#X coords 0 1 155944 -1 200 150 1; -#X restore 383 346 graph; -#X obj 125 301 r \$0-loopf; -#X obj 125 325 phasor~; -#X obj 124 398 tabread4~ \$0-array; -#X obj 169 349 r \$0-totsamps; -#X text 55 19 MEASURING SPECTRA USING BAND-PASS FILTERS; -#X text 213 425 <= center pitch; -#X text 212 476 <= center frequency; -#X text 200 501 <= Q (filter selectivity); -#X obj 452 20 declare -stdpath ./; -#X connect 1 0 7 0; -#X connect 1 0 15 0; -#X connect 2 0 1 0; -#X connect 3 0 4 0; -#X connect 4 0 2 1; -#X connect 4 0 1 1; -#X connect 5 0 2 2; -#X connect 5 0 1 2; -#X connect 6 0 3 0; -#X connect 7 0 10 0; -#X connect 8 0 9 0; -#X connect 9 0 22 0; -#X connect 10 0 11 0; -#X connect 11 0 0 0; -#X connect 20 0 21 0; -#X connect 21 0 8 0; -#X connect 22 0 2 0; -#X connect 23 0 8 1; +#X coords 0 1 155944 -1 274 101 1; +#X restore 315 283 graph; +#X obj 122 286 r \$0-loopf; +#X obj 122 310 phasor~; +#X obj 122 383 tabread4~ \$0-array; +#X obj 166 334 r \$0-totsamps; +#X text 38 19 MEASURING SPECTRA USING BAND-PASS FILTERS; +#N canvas 717 163 409 449 init 0; +#X obj 81 239 soundfiler; +#X obj 81 33 loadbang; +#X obj 81 59 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 101 90 f \$0; +#X obj 116 367 /; +#X msg 81 337 44100; +#X obj 81 308 t b f, f 8; +#X obj 116 396 s \$0-loopf; +#X msg 81 208 read -resize ../sound/bell.aiff \$1; +#X obj 197 330 declare -stdpath ./; +#X obj 103 275 s \$0-totsamps; +#X obj 81 178 symbol \$0-array; +#X msg 101 117 \; \$1-pitch 69 \; \$1-q 0; +#X text 221 78 This subpatch initializes the patch \, loads the sample and values into number boxes, f 17; +#X connect 0 0 10 0; +#X connect 0 0 6 0; +#X connect 1 0 2 0; +#X connect 2 0 3 0; +#X connect 2 0 11 0; +#X connect 3 0 12 0; +#X connect 4 0 7 0; +#X connect 5 0 4 0; +#X connect 6 0 5 0; +#X connect 6 1 4 1; +#X connect 8 0 0 0; +#X connect 11 0 8 0; +#X restore 535 401 pd init; +#X text 198 496 <-- Q (filter selectivity); +#X text 210 471 <-- center frequency; +#X text 210 420 <-- center pitch; +#X floatatom 193 533 5 0 20 0 - - - 0; +#X text 234 532 <-- add up to 20 dB; +#X text 35 89 Note that filters can give unexpected level changes. The [bp~] object is designed to have roughly unit gain at the pass band \, so the higher you set "Q" the more amplitude is lost. You can correct for this by pushing the output amplitude \, but be sure to remember to reset the output amplitude before you reduce Q again. I set the Q to 100 and add an amplitude gain of 10 or 20 (with the [output~] volume way down!) Then holding the shift key \, slowly drag the center pitch upward listening for modes., f 82; +#X obj 193 631 dbtorms~; +#X obj 193 556 pack f 20; +#X obj 193 580 line~; +#X obj 193 605 +~ 100; +#X obj 145 670 *~; +#X text 411 795 updated for Pd version 0.55; +#X obj 62 679 vu 21 160 empty empty -1 -10 0 12 #404040 #000000 1 0; +#X obj 61 645 - 100; +#X text 130 799 <-- the [vu] object is used to display values in dBFS, f 27; +#X text 263 627 convert to amplitude values (up to 10), f 21; +#X connect 0 0 6 0; +#X connect 0 0 30 0; +#X connect 1 0 0 0; +#X connect 2 0 3 0; +#X connect 3 0 1 1; +#X connect 3 0 0 1; +#X connect 4 0 1 2; +#X connect 4 0 0 2; +#X connect 5 0 2 0; +#X connect 6 0 33 0; +#X connect 7 0 8 0; +#X connect 8 0 16 0; +#X connect 14 0 15 0; +#X connect 15 0 7 0; +#X connect 16 0 1 0; +#X connect 17 0 7 1; +#X connect 23 0 27 0; +#X connect 26 0 30 1; +#X connect 27 0 28 0; +#X connect 28 0 29 0; +#X connect 29 0 26 0; +#X connect 30 0 12 0; +#X connect 33 0 32 0; diff --git a/doc/3.audio.examples/H08.heterodyning.pd b/doc/3.audio.examples/H08.heterodyning.pd index 6ee156a1..ab7e0cef 100644 --- a/doc/3.audio.examples/H08.heterodyning.pd +++ b/doc/3.audio.examples/H08.heterodyning.pd @@ -1,79 +1,75 @@ -#N canvas 619 23 517 723 12; -#X text 281 681 updated for Pd version 0.39; +#N canvas 558 38 528 732 12; +#X text 300 685 updated for Pd version 0.39; #X text 94 15 MORE ON MEASURING SPECTRA: HETERODYNING; -#X obj 112 263 phasor~ 100; -#X obj 165 317 phasor~; -#X floatatom 165 294 5 0 999 0 - \$0-freq - 0; -#X obj 165 355 cos~; -#X obj 208 371 cos~; -#X obj 208 346 +~ 0.25; -#X obj 112 570 snapshot~; -#N canvas 536 459 382 265 startup 0; -#X obj 22 14 loadbang; -#X obj 22 38 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 22 67 f \$0; -#X text 35 195 This subpatch loads initial; -#X text 37 211 values in number boxes.; -#X obj 223 132 metro 250; -#X obj 223 107 r \$0-metro; -#X obj 223 156 s \$0-tick; -#X msg 22 91 \; \$1-freq 100 \; \$1-lop 2 \; \$1-metro 1; +#X obj 105 251 phasor~ 100; +#X obj 158 321 phasor~; +#X floatatom 158 283 5 0 999 0 - \$0-freq - 0; +#X obj 158 359 cos~; +#X obj 201 375 cos~; +#X obj 201 350 +~ 0.25; +#X obj 106 574 snapshot~; +#X obj 106 419 *~; +#X obj 150 419 *~; +#X obj 106 477 lop~; +#X obj 150 477 lop~; +#X floatatom 175 446 3 0 100 0 - \$0-lop - 0; +#X obj 285 574 snapshot~; +#X floatatom 106 605 5 0 0 0 - - - 0; +#X floatatom 285 605 5 0 0 0 - - - 0; +#X obj 253 494 r \$0-tick; +#X obj 253 518 t b b; +#X obj 106 640 expr sqrt($f1*$f1+$f2*$f2); +#X floatatom 106 667 5 0 0 0 - - - 0; +#X text 38 50 Another method for picking out the strengths of partials in a sound is heterodyning. We guess the frequency of a partial (as in the previous patch) but this time we multiply by a complex exponential to frequency-shift the partial down to zero (DC)., f 62; +#X text 38 114 Then a low-pass filter (applied separately on the real and imaginary parts) removes all but the DC component thus obtained. The result is two audio signals (which we take snapshots of) holding the real and imaginary parts of the complex amplitude of the partial we want. Compared to the previous method \, this had the advantage of reporting the phase of the partial as well as its frequency., f 62; +#X text 67 598 real; +#X text 67 612 part; +#X text 248 612 part; +#X text 213 599 imaginary; +#X text 96 691 magnitude; +#X obj 347 240 ../5.reference/set-dsp-tgl; +#X text 378 243 DSP on/off; +#X msg 347 277 \; pd dsp \$1; +#X text 201 282 <-- test frequency, f 9; +#X text 261 348 modulate test frequency to DC, f 15; +#X text 204 446 <-- responsiveness; +#N canvas 536 459 361 258 init 0; +#X obj 68 22 loadbang; +#X obj 68 46 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 68 75 f \$0; +#X obj 213 95 metro 250; +#X obj 213 70 r \$0-metro; +#X obj 213 119 s \$0-tick; +#X msg 68 99 \; \$1-freq 100 \; \$1-lop 2 \; \$1-metro 1; +#X text 47 183 This subpatch initializes the patch and loads values in number boxes., f 35; #X connect 0 0 1 0; #X connect 1 0 2 0; -#X connect 2 0 8 0; -#X connect 5 0 7 0; -#X connect 6 0 5 0; -#X restore 353 625 pd startup; -#X obj 113 415 *~; -#X obj 157 415 *~; -#X obj 113 473 lop~; -#X obj 157 473 lop~; -#X floatatom 182 442 3 0 100 0 - \$0-lop - 0; -#X obj 291 570 snapshot~; -#X floatatom 112 598 5 0 0 0 - - - 0; -#X floatatom 291 598 5 0 0 0 - - - 0; -#X obj 259 500 r \$0-tick; -#X obj 259 524 t b b; -#X obj 112 636 expr sqrt($f1*$f1+$f2*$f2); -#X floatatom 112 662 5 0 0 0 - - - 0; -#X text 37 259 signal to; -#X text 51 273 analyze; -#X text 36 47 Another method for picking out the strengths of partials in a sound is heterodyning. We guess the frequency of a partial (as in the previous patch) but this time we multiply by a complex exponential to frequency-shift the partial down to zero (DC).; -#X text 32 129 Then a low-pass filter (applied separately on the real and imaginary parts) removes all but the DC component thus obtained. The result is two audio signals (which we take snapshots of) holding the real and imaginary parts of the complex amplitude of the partial we want. Compared to the previous method \, this had the advantage of reporting the phase of the partial as well as its frequency.; -#X text 272 335 modulate; -#X text 269 371 to DC; -#X text 268 353 test frequency; -#X text 197 473 low-pass filter; -#X text 73 595 real; -#X text 73 609 part; -#X text 254 605 part; -#X text 219 592 imaginary; -#X text 163 663 magnitude; -#X text 208 294 <= test frequency; -#X text 211 442 <= responsiveness; -#X obj 368 257 ../5.reference/set-dsp-tgl; -#X text 399 260 DSP on/off; -#X msg 368 294 \; pd dsp \$1; +#X connect 2 0 6 0; +#X connect 3 0 5 0; +#X connect 4 0 3 0; +#X restore 423 349 pd init; +#X text 40 470 low-pass filters, f 8; +#X text 33 245 signal to analyze, f 9; +#X connect 2 0 9 0; #X connect 2 0 10 0; -#X connect 2 0 11 0; #X connect 3 0 5 0; #X connect 3 0 7 0; #X connect 4 0 3 0; -#X connect 5 0 10 1; -#X connect 6 0 11 1; +#X connect 5 0 9 1; +#X connect 6 0 10 1; #X connect 7 0 6 0; -#X connect 8 0 16 0; +#X connect 8 0 15 0; +#X connect 9 0 11 0; #X connect 10 0 12 0; -#X connect 11 0 13 0; -#X connect 12 0 8 0; -#X connect 13 0 15 0; -#X connect 14 0 13 1; -#X connect 14 0 12 1; -#X connect 15 0 17 0; -#X connect 16 0 20 0; -#X connect 17 0 20 1; -#X connect 18 0 19 0; -#X connect 19 0 8 0; -#X connect 19 1 15 0; -#X connect 20 0 21 0; -#X connect 37 0 39 0; +#X connect 11 0 8 0; +#X connect 12 0 14 0; +#X connect 13 0 12 1; +#X connect 13 0 11 1; +#X connect 14 0 16 0; +#X connect 15 0 19 0; +#X connect 16 0 19 1; +#X connect 17 0 18 0; +#X connect 18 0 8 0; +#X connect 18 1 14 0; +#X connect 19 0 20 0; +#X connect 28 0 30 0; diff --git a/doc/3.audio.examples/H09.ssb.modulation.pd b/doc/3.audio.examples/H09.ssb.modulation.pd index 098006a2..6152569b 100644 --- a/doc/3.audio.examples/H09.ssb.modulation.pd +++ b/doc/3.audio.examples/H09.ssb.modulation.pd @@ -1,31 +1,27 @@ #N canvas 504 51 545 610 12; #X declare -stdpath ./; -#X obj 247 401 cos~; -#X obj 290 383 +~ -0.25; -#X obj 290 406 cos~; -#X obj 172 457 *~; -#X obj 225 457 *~; -#X obj 172 483 -~; -#X floatatom 247 330 5 0 0 0 - - - 0; -#X text 57 285 sample loop for; -#X text 85 299 test signal; -#X text 54 367 pair of allpass; -#X text 54 383 filters to make; -#X text 54 399 90 degree phase; -#X text 47 414 shifted versions; -#X text 359 366 cosine and sine waves; -#X text 14 19 SINGLE SIDEBAND MODULATION; -#X text 206 19 (AKA FREQUENCY SHIFTING); -#N canvas 555 154 457 369 bell-loop 0; +#X obj 226 408 cos~; +#X obj 269 390 +~ -0.25; +#X obj 269 413 cos~; +#X obj 151 464 *~; +#X obj 204 464 *~; +#X obj 151 490 -~; +#X floatatom 226 337 5 0 0 0 - - - 0; +#X text 33 374 pair of allpass; +#X text 33 390 filters to make; +#X text 33 406 90 degree phase; +#X text 26 421 shifted versions; +#X text 338 373 cosine and sine waves; +#N canvas 555 154 582 391 bell-loop 0; #X obj 51 150 /; #X obj 51 262 +~ 1; #X msg 23 117 44100; #X obj 23 91 t b f, f 7; #X obj 51 312 outlet~; #N canvas 0 0 450 300 (subpatch) 0; -#X array \$0-array 155944 float 0; -#X coords 0 1 155943 -1 200 150 1; -#X restore 216 87 graph; +#X array \$0-array 155944 float 2; +#X coords 0 1 155944 -1 279 142 1; +#X restore 251 105 graph; #X obj 23 67 r \$0-totsamps; #X obj 69 207 r \$0-totsamps; #X obj 51 238 *~; @@ -41,54 +37,45 @@ #X connect 8 0 1 0; #X connect 9 0 8 0; #X connect 10 0 4 0; -#X restore 172 292 pd bell-loop; -#N canvas 711 110 350 449 startup 0; -#X obj 60 327 r readfile; -#X obj 60 380 soundfiler; +#X restore 151 299 pd bell-loop; +#X obj 151 531 output~; +#X text 310 563 updated for Pd version 0.39; +#X obj 226 362 phasor~; +#X text 337 388 to form the real and; +#X text 337 404 imaginary part of a; +#X text 337 421 complex sinusoid; +#X text 41 50 The signal sideband modulator gives you only one sideband for each frequency in the input signal (whereas ring modulation gave both a positive and negative sideband). You can set the shift frequency positive to shift all frequencies upward \, or negative to shift them downwards., f 64; +#X text 41 130 The technique is to filter the input into two versions \, 90 degrees out of phase \, which can be interpreted as the real and imaginary part of a complex signal with positive frequencies only. You can then form the (complex) product of this with a (complex) sinusoid to modulate upward or downward in frequency., f 64; +#X obj 151 399 hilbert~; +#X text 235 465 <-- complex multiplier (calculates real part), f 22; +#N canvas 711 110 382 287 init 0; +#X obj 55 140 soundfiler; #X obj 55 15 loadbang; #X obj 55 41 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 55 72 f \$0; -#X obj 95 238 /; -#X msg 67 212 44100; -#X obj 67 187 t b f, f 7; -#X obj 67 163 r \$0-totsamps; -#X obj 95 266 s \$0-loopf; -#X msg 60 353 read -resize ../sound/bell.aiff \$1; -#X msg 55 104 \; readfile symbol \$1-array \; \$1-totsamps 143718; -#X connect 0 0 10 0; -#X connect 2 0 3 0; -#X connect 3 0 4 0; -#X connect 4 0 11 0; -#X connect 5 0 9 0; -#X connect 6 0 5 0; -#X connect 7 0 6 0; -#X connect 7 1 5 1; -#X connect 8 0 7 0; -#X connect 10 0 1 0; -#X restore 327 524 pd startup; -#X obj 172 524 output~; -#X text 320 559 updated for Pd version 0.39; -#X obj 247 355 phasor~; -#X text 271 475 (calculates real part); -#X text 358 381 to form the real and; -#X text 358 397 imaginary part of a; -#X text 358 414 complex sinusoid; -#X text 49 52 The signal sideband modulator gives you only one sideband for each frequency in the input signal (whereas ring modulation gave both a positive and negative sideband). You can set the shift frequency positive to shift all frequencies upward \, or negative to shift them downwards., f 60; -#X text 48 132 The technique is to filter the input into two versions \, 90 degrees out of phase \, which can be interpreted as the real and imaginary part of a complex signal with positive frequencies only. You can then form the (complex) product of this with a (complex) sinusoid to modulate upward or downward in frequency.; -#X obj 172 392 hilbert~; -#X text 272 457 <= complex multiplier; -#X text 291 330 <= shift frequency; -#X text 49 228 The "hilbert~" object is an abstraction in pd/extra.; -#X obj 396 19 declare -stdpath ./; +#X msg 55 113 read -resize ../sound/bell.aiff \$1; +#X obj 193 77 declare -stdpath ./; +#X obj 55 76 symbol \$0-array; +#X obj 55 172 s \$0-totsamps; +#X text 78 223 initialize and load file into array.; +#X connect 0 0 6 0; +#X connect 1 0 2 0; +#X connect 2 0 5 0; +#X connect 3 0 0 0; +#X connect 5 0 3 0; +#X restore 416 282 pd init; +#X text 270 337 <-- shift frequency; +#X text 68 19 SINGLE SIDEBAND MODULATION (AKA FREQUENCY SHIFTING); +#X text 41 213 The [hilbert~] object is an abstraction in the 'extra' library. It takes a signal and creates two copies that are 90 degrees out of phase., f 64; +#X text 64 282 sample loop for test signal, f 15; #X connect 0 0 3 1; #X connect 1 0 2 0; #X connect 2 0 4 1; #X connect 3 0 5 0; #X connect 4 0 5 1; -#X connect 5 0 18 0; -#X connect 6 0 20 0; -#X connect 16 0 27 0; -#X connect 20 0 1 0; -#X connect 20 0 0 0; -#X connect 27 0 3 0; -#X connect 27 1 4 0; +#X connect 5 0 13 0; +#X connect 6 0 15 0; +#X connect 12 0 21 0; +#X connect 15 0 1 0; +#X connect 15 0 0 0; +#X connect 21 0 3 0; +#X connect 21 1 4 0; diff --git a/doc/3.audio.examples/H10.measurement.pd b/doc/3.audio.examples/H10.measurement.pd index 54543923..1862a077 100644 --- a/doc/3.audio.examples/H10.measurement.pd +++ b/doc/3.audio.examples/H10.measurement.pd @@ -1,26 +1,29 @@ -#N canvas 283 177 890 441 12; -#X obj 108 367 filter-graph2 tab1 tab2; +#N canvas 432 96 776 485 12; #N canvas 0 50 450 300 (subpatch) 0; -#X array tab1 100 float 0; +#X array \$0-amp 100 float 0; #X coords 0 2 99 0 200 140 1 0 0; -#X restore 572 28 graph; +#X restore 498 27 graph; #N canvas 0 50 450 300 (subpatch) 0; -#X array tab2 100 float 2; -#X coords 0 6.283 99 0 200 140 1 0 0; -#X restore 577 229 graph; -#X text 559 85 1; -#X text 571 371 0; -#X text 553 294 pi; -#X text 546 224 2pi; -#X obj 81 249 bng 17 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X floatatom 81 310 5 0 0 0 - - - 0; -#X text 559 21 2; -#X text 54 20 MEASURING FILTER FREQUENCY AND PHASE RESPONSE; -#X text 581 404 updated for Pd version 0.39; -#X text 629 174 frequency; -#X text 569 170 0; -#X text 752 173 44100; -#N canvas 876 177 298 247 startup 0; +#X array \$0-phase 100 float 2; +#X coords 0 6.283 100 0 200 140 1 0 0; +#X restore 503 228 graph; +#X text 480 84 1; +#X text 479 293 pi; +#X text 472 223 2pi; +#X obj 52 308 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X floatatom 52 372 4 0 0 0 - - - 0; +#X text 480 20 2; +#X text 77 27 MEASURING FILTER FREQUENCY AND PHASE RESPONSE; +#X text 515 434 updated for Pd version 0.39; +#X floatatom 274 318 5 0 10000 0 - \$0-freq - 0; +#X floatatom 283 361 4 0 999 0 - \$0-q - 0; +#X obj 52 337 filter-graph1 100 44100; +#X obj 265 391 bp~; +#X text 83 374 index; +#X text 76 308 <-- compute; +#X text 316 317 <-- center frequency, f 10; +#X text 318 360 <-- "Q"; +#N canvas 704 433 298 247 init 0; #X obj 47 27 loadbang; #X obj 47 51 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 47 80 f \$0; @@ -30,30 +33,23 @@ #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 2 0 5 0; -#X restore 305 358 pd startup; -#X floatatom 275 276 5 0 10000 0 - \$0-freq - 0; -#X floatatom 284 299 4 0 999 0 - \$0-q - 0; -#X text 36 59 You can use the "filter-graph1" and "filter-graph2" abstractions as shown to test filters. Connect them as shown with a filter between them. Try varying the parameters and/or substituting other filters., f 64; -#X text 513 156 gain=0; -#X text 512 356 phase=0; -#X obj 81 275 filter-graph1 100 44100; -#X obj 266 329 bp~; -#X text 37 311 index; -#X text 36 127 "filter-graph1" takes as arguments the number of points to graph and the frequency range. "filter-graph2" takes as arguments the name of a table to hold the (frequency dependent) gain \, and another \, if specified \, for the phase., f 64; -#X text 36 193 You can edit this patch to replace "bp" with any other filter you're curious about., f 64; -#X text 319 298 <= "Q"; -#X text 317 275 <= center frequency; -#X text 103 248 <= compute; -#X obj 404 312 ../5.reference/set-dsp-tgl; -#X text 435 315 DSP on/off; -#X msg 404 349 \; pd dsp \$1; -#X connect 7 0 21 0; -#X connect 8 0 0 0; -#X connect 16 0 22 1; -#X connect 17 0 22 2; -#X connect 21 0 8 0; -#X connect 21 1 0 1; -#X connect 21 1 22 0; -#X connect 21 2 0 2; -#X connect 22 0 0 3; -#X connect 29 0 31 0; +#X restore 333 420 pd init; +#X text 55 71 You can use the [filter-graph1] and [filter-graph2] abstractions as shown to test filters. Connect them as shown with a filter between them. Try varying the parameters and/or substituting other filters., f 51; +#X text 55 139 [filter-graph1] takes as arguments the number of points to graph and the frequency range \, while [filter-graph2] takes as arguments the name of a table to hold the (frequency dependent) gain \, and another \, if specified \, for the phase., f 51; +#X text 55 225 You can edit this patch to replace [bp~] with any other filter you're curious about., f 51; +#X text 483 355 0; +#X text 495 169 0 Hz; +#X text 678 169 44100 Hz; +#X text 481 156 0; +#X obj 65 429 filter-graph2 \$0-amp \$0-phase; +#X text 495 374 0 Hz; +#X text 678 374 44100 Hz; +#X connect 5 0 12 0; +#X connect 6 0 26 0; +#X connect 10 0 13 1; +#X connect 11 0 13 2; +#X connect 12 0 6 0; +#X connect 12 1 13 0; +#X connect 12 1 26 1; +#X connect 12 2 26 2; +#X connect 13 0 26 3; diff --git a/doc/3.audio.examples/H11.shelving.pd b/doc/3.audio.examples/H11.shelving.pd index 75c313c0..621d3efa 100644 --- a/doc/3.audio.examples/H11.shelving.pd +++ b/doc/3.audio.examples/H11.shelving.pd @@ -1,12 +1,32 @@ -#N canvas 360 101 795 464 12; +#N canvas 360 101 781 462 12; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-tab1 100 float 0; #X coords 0 5 99 0 200 300 1 0 0; -#X restore 538 44 graph; -#X obj 59 246 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X floatatom 59 318 4 0 0 0 - - - 0; -#X text 593 350 frequency; -#N canvas 876 177 293 245 startup 0; +#X restore 528 37 graph; +#X obj 59 266 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X floatatom 59 338 4 0 0 0 - - - 0; +#X text 583 343 frequency; +#X floatatom 321 300 3 -99 99 0 - \$0-pole - 0; +#X text 466 325 gain=0; +#X text 198 21 SHELVING FILTER; +#X obj 90 407 filter-graph2 \$0-tab1; +#X obj 59 295 filter-graph1 100 22050; +#X text 703 339 22050; +#X obj 234 376 rpole~; +#X obj 320 324 / 100; +#X floatatom 273 301 4 -100 100 0 - \$0-zero - 0; +#X obj 273 324 / 100; +#X obj 234 349 rzero~; +#X text 515 30 5; +#X text 523 336 0; +#X text 511 267 1; +#X text 106 109 If the pole is at p and the zero is at q \, the gain at DC is (1-q)/(1-p) and the gain at Nyquist is (1+q)/(1+p). If the pole location is close to plus or minus one \, this can give large gains unless q is in the same vicinity. (try \, for example \, p=90% \, q=70%)., f 50; +#X text 106 206 The crossover region varies from DC to Nyquist as p and q decrease from 100% to -100%., f 50; +#X text 318 278 pole; +#X text 272 278 zero; +#X text 356 278 (in hundredths); +#X text 546 405 updated for Pd version 0.46; +#N canvas 876 177 293 245 init 0; #X obj 58 24 loadbang; #X obj 58 51 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 58 80 f \$0; @@ -16,41 +36,17 @@ #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 2 0 5 0; -#X restore 404 241 pd startup; -#X floatatom 321 280 3 -99 99 0 - \$0-pole - 0; -#X text 476 332 gain=0; -#X text 126 34 SHELVING FILTER; -#X obj 90 387 filter-graph2 \$0-tab1; -#X obj 59 275 filter-graph1 100 22050; -#X text 713 346 22050; -#X obj 234 356 rpole~; -#X obj 320 304 / 100; -#X floatatom 273 281 4 -100 100 0 - \$0-zero - 0; -#X obj 273 304 / 100; -#X obj 234 329 rzero~; -#X text 525 37 5; -#X text 533 343 0; -#X text 521 274 1; -#X text 34 58 This patch demonstrates using the raw filters \, rpole~ and rzero~ (raw \, real-valued one-pole and one-zero filters) \, to make a shelving filter.; -#X text 32 109 If the pole is at p and the zero is at q \, the gain at DC is (1-q)/(1-p) and the gain at Nyquist is (1+q)/(1+p). If the pole location is close to plus or minus one \, this can give large gains unless q is in the same vicinity. (try \, for example \, p=90% \, q=70%).; -#X text 29 191 The crossover region varies from DC to Nyquist as p and q decrease from 100% to -100%.; -#X text 318 256 pole; -#X text 272 258 zero; -#X text 352 279 (in hundredths); -#X text 531 427 updated for Pd version 0.46; -#X obj 341 350 ../5.reference/set-dsp-tgl; -#X text 372 353 DSP on/off; -#X msg 341 387 \; pd dsp \$1; -#X connect 1 0 9 0; -#X connect 2 0 8 0; -#X connect 5 0 12 0; -#X connect 9 0 2 0; -#X connect 9 1 8 1; -#X connect 9 1 15 0; -#X connect 9 2 8 2; -#X connect 11 0 8 3; -#X connect 12 0 11 1; -#X connect 13 0 14 0; -#X connect 14 0 15 1; -#X connect 15 0 11 0; -#X connect 26 0 28 0; +#X restore 328 393 pd init; +#X text 106 58 This patch demonstrates using the raw filters \, [rpole~] and [rzero~] (raw \, real-valued one-pole and one-zero filters) \, to make a shelving filter., f 50; +#X connect 1 0 8 0; +#X connect 2 0 7 0; +#X connect 4 0 11 0; +#X connect 8 0 2 0; +#X connect 8 1 7 1; +#X connect 8 1 14 0; +#X connect 8 2 7 2; +#X connect 10 0 7 3; +#X connect 11 0 10 1; +#X connect 12 0 13 0; +#X connect 13 0 14 1; +#X connect 14 0 10 0; diff --git a/doc/3.audio.examples/H12.peaking.pd b/doc/3.audio.examples/H12.peaking.pd index 5facfad9..32a24040 100644 --- a/doc/3.audio.examples/H12.peaking.pd +++ b/doc/3.audio.examples/H12.peaking.pd @@ -1,21 +1,10 @@ -#N canvas 291 37 867 606 12; +#N canvas 339 38 869 594 12; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-tab1 100 float 0; #X coords 0 5 99 0 200 300 1 0 0; #X restore 613 90 graph; #X floatatom 67 414 3 0 0 0 - - - 0; #X text 668 396 frequency; -#N canvas 876 177 279 294 startup 0; -#X obj 45 37 loadbang; -#X obj 45 61 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 45 90 f \$0; -#X text 35 199 This subpatch loads initial; -#X text 37 216 values in number boxes.; -#X msg 45 114 \; \$1-pole 60 \; \$1-zero 20; -#X connect 0 0 1 0; -#X connect 1 0 2 0; -#X connect 2 0 5 0; -#X restore 481 541 pd startup; #X floatatom 279 335 3 0 99 0 - \$0-pole - 0; #X text 551 378 gain=0; #X obj 98 537 filter-graph2 \$0-tab1; @@ -27,8 +16,8 @@ #X text 591 79 5; #X text 608 389 0; #X text 596 320 1; -#X text 601 523 updated for Pd version 0.39; -#X text 43 10 PEAKING FILTER; +#X text 624 520 updated for Pd version 0.39; +#X text 45 9 PEAKING FILTER; #X floatatom 386 303 3 0 180 0 - \$0-pole - 0; #X text 385 281 angle; #X text 420 301 (degrees); @@ -46,44 +35,51 @@ #X obj 279 453 *; #X obj 326 469 *; #X obj 365 469 *; -#X text 31 45 To get a peaking filter \, start with a shelving filter but rotate the pole and zero to the point on the unit circle you want to amplify or attenuate. The rpole~ and rzero~ filters are replaced with their complex-valued siblings \, cpole~ and czero~. These filters take a (real \, imaginary) pair to filter and another (real-imaginary) pair to specify the pole or zero. As for rpole~ and rzero~ \, the coefficients may change at audio rate., f 74; -#X text 30 142 The outputs of cpole~ and czero~ are also in the form of a (real-imaginary) pair. Both outlets of cpole~ are connected to czero~ in this example \, but then since we want a real-valued filter \, we only take the real part of the (complex) output of czero~., f 74; -#X text 30 214 Here the pole and zero radii (p and q) control the center-frequency gain by the formula (1-q)/(1-p). The closer to 1 the radii \, the narrower the band affected. The non-peak gain \, (1+q)/(1+p) \, is close to 1 as long as p and q are at least 50% or so., f 74; +#X text 28 214 Here the pole and zero radii (p and q) control the center-frequency gain by the formula (1-q)/(1-p). The closer to 1 the radii \, the narrower the band affected. The non-peak gain \, (1+q)/(1+p) \, is close to 1 as long as p and q are at least 50% or so., f 75; #X obj 67 344 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 474 440 ../5.reference/set-dsp-tgl; -#X text 505 443 DSP on/off; -#X msg 474 477 \; pd dsp \$1; -#X connect 1 0 6 0; -#X connect 4 0 9 0; -#X connect 7 0 1 0; -#X connect 7 1 6 1; -#X connect 7 1 27 0; -#X connect 7 2 6 2; -#X connect 9 0 24 0; -#X connect 9 0 31 0; -#X connect 10 0 11 0; -#X connect 11 0 32 0; -#X connect 11 0 33 0; -#X connect 17 0 22 0; -#X connect 20 0 26 0; -#X connect 21 0 25 0; -#X connect 22 0 23 0; -#X connect 23 0 21 0; -#X connect 23 0 20 0; -#X connect 24 0 27 2; -#X connect 25 0 24 0; +#N canvas 876 177 279 294 init 0; +#X obj 45 37 loadbang; +#X obj 45 61 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 45 90 f \$0; +#X text 35 199 This subpatch loads initial; +#X text 37 216 values in number boxes.; +#X msg 45 114 \; \$1-pole 60 \; \$1-zero 20; +#X connect 0 0 1 0; +#X connect 1 0 2 0; +#X connect 2 0 5 0; +#X restore 352 523 pd init; +#X text 28 39 To get a peaking filter \, start with a shelving filter but rotate the pole and zero to the point on the unit circle you want to amplify or attenuate. The [rpole~] and [rzero~] filters are replaced with their complex-valued siblings \, [cpole~] and [czero~]. These filters take a (real \, imaginary) pair to filter and another (real-imaginary) pair to specify the pole or zero. As for [rpole~] and [rzero~] \, the coefficients may change at audio rate., f 75; +#X text 28 148 The outputs of [cpole~] and [czero~] are also in the form of a (real and imaginary) pair. Both outlets of [cpole~] are connected to [czero~] in this example \, but then since we want a real-valued filter \, we only take the real part of the (complex) output of [czero~]., f 75; +#X connect 1 0 5 0; +#X connect 3 0 8 0; +#X connect 6 0 1 0; +#X connect 6 1 5 1; +#X connect 6 1 26 0; +#X connect 6 2 5 2; +#X connect 8 0 23 0; +#X connect 8 0 30 0; +#X connect 9 0 10 0; +#X connect 10 0 31 0; +#X connect 10 0 32 0; +#X connect 16 0 21 0; +#X connect 19 0 25 0; +#X connect 20 0 24 0; +#X connect 21 0 22 0; +#X connect 22 0 20 0; +#X connect 22 0 19 0; +#X connect 23 0 26 2; +#X connect 24 0 23 0; +#X connect 24 0 31 0; +#X connect 24 1 23 1; +#X connect 24 1 31 1; +#X connect 25 0 30 0; #X connect 25 0 32 0; -#X connect 25 1 24 1; #X connect 25 1 32 1; -#X connect 26 0 31 0; -#X connect 26 0 33 0; -#X connect 26 1 33 1; -#X connect 26 1 31 1; -#X connect 27 0 28 0; -#X connect 27 1 28 1; -#X connect 28 0 6 3; -#X connect 31 0 27 3; -#X connect 32 0 28 2; -#X connect 33 0 28 3; -#X connect 37 0 7 0; -#X connect 38 0 40 0; +#X connect 25 1 30 1; +#X connect 26 0 27 0; +#X connect 26 1 27 1; +#X connect 27 0 5 3; +#X connect 30 0 26 3; +#X connect 31 0 27 2; +#X connect 32 0 27 3; +#X connect 34 0 6 0; diff --git a/doc/3.audio.examples/H13.butterworth.pd b/doc/3.audio.examples/H13.butterworth.pd index 4217031d..345421b0 100644 --- a/doc/3.audio.examples/H13.butterworth.pd +++ b/doc/3.audio.examples/H13.butterworth.pd @@ -1,52 +1,48 @@ -#N canvas 260 23 796 509 12; +#N canvas 429 82 771 501 12; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-tab1 100 float 0; #X coords 0 5 99 0 200 300 1 0 0; -#X restore 549 81 graph; -#X floatatom 65 361 3 0 0 0 - - - 0; -#X text 604 387 frequency; -#N canvas 876 177 279 249 startup 0; -#X obj 52 22 loadbang; -#X obj 52 46 bng 15 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; -#X obj 52 65 f \$0; +#X restore 509 72 graph; +#X floatatom 70 356 5 0 0 0 - - - 0; +#X text 564 378 frequency; +#X text 447 360 gain=0; +#X obj 97 453 filter-graph2 \$0-tab1; +#X text 487 61 5; +#X text 504 371 0; +#X text 492 302 1; +#X text 516 437 updated for Pd version 0.39; +#X text 59 22 BUTTERWORTH FILTER; +#X obj 241 409 butterworth3~; +#X floatatom 263 351 4 0 100 0 - \$0-lf - 0; +#X floatatom 310 350 4 85 150 0 - \$0-hf - 0; +#X obj 263 377 mtof; +#X obj 310 377 mtof; +#X text 684 374 5000; +#X obj 70 323 filter-graph1 100 5000; +#X text 255 329 poles; +#X text 307 329 zeros; +#X obj 70 294 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#N canvas 876 177 279 249 init 0; +#X obj 77 23 loadbang; +#X obj 77 49 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 77 78 f \$0; #X text 38 174 This subpatch loads initial; #X text 38 193 values in number boxes.; -#X msg 52 89 \; \$1-lf 80 \; \$1-hf 150 \;; +#X msg 77 102 \; \$1-lf 80 \; \$1-hf 150; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 2 0 5 0; -#X restore 391 317 pd startup; -#X text 487 369 gain=0; -#X obj 92 458 filter-graph2 \$0-tab1; -#X text 527 70 5; -#X text 544 380 0; -#X text 532 311 1; -#X text 526 463 updated for Pd version 0.39; -#X text 69 27 BUTTERWORTH FILTER; -#X obj 236 414 butterworth3~; -#X floatatom 258 356 3 0 100 0 - \$0-lf - 0; -#X floatatom 305 355 3 85 150 0 - \$0-hf - 0; -#X obj 258 382 mtof; -#X obj 305 382 mtof; -#X text 724 383 5000; -#X obj 65 328 filter-graph1 100 5000; -#X text 246 334 poles; -#X text 302 334 zeros; -#X text 52 66 The butterworth filter can be configured for low-pass \, high-pass \, and shelving \, depending on the placement of the poles and zeros. For low-pass \, the poles are placed to set the cutoff frequency and the zeros are at -1 (the Nyquist). Leaving the poles fixed and moving the zeros then gives shelving filters. In this example \, the actual filtering is relegated to an abstraction (butterworth3~) which takes frequencies corresponding to the pole and zero placement., f 60; -#X text 52 193 The butterworth3~ abstraction computes filter coefficients using control messages \, and so it is not suitable for continuously time-varying Butterworth filters. For that \, it is often appropriate to use time-saving approximations \, but precisely which approximations to use will depend on the way the filter is to be used.; -#X obj 65 301 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 371 398 ../5.reference/set-dsp-tgl; -#X text 402 401 DSP on/off; -#X msg 371 435 \; pd dsp \$1; -#X connect 1 0 5 0; -#X connect 11 0 5 3; +#X restore 340 452 pd init; +#X text 28 57 The butterworth filter can be configured for low-pass \, high-pass \, and shelving \, depending on the placement of the poles and zeros. For low-pass \, the poles are placed to set the cutoff frequency and the zeros are at -1 (the Nyquist). Leaving the poles fixed and moving the zeros then gives shelving filters. In this example \, the actual filtering is relegated to an abstraction ([butterworth3~]) which takes frequencies corresponding to the pole and zero placement., f 60; +#X text 28 184 The [butterworth3~] abstraction computes filter coefficients using control messages \, and so it is not suitable for continuously time-varying Butterworth filters. For that \, it is often appropriate to use time-saving approximations \, but precisely which approximations to use will depend on the way the filter is to be used.; +#X connect 1 0 4 0; +#X connect 10 0 4 3; +#X connect 11 0 13 0; #X connect 12 0 14 0; -#X connect 13 0 15 0; -#X connect 14 0 11 1; -#X connect 15 0 11 2; -#X connect 17 0 1 0; -#X connect 17 1 5 1; -#X connect 17 1 11 0; -#X connect 17 2 5 2; -#X connect 22 0 17 0; -#X connect 23 0 25 0; +#X connect 13 0 10 1; +#X connect 14 0 10 2; +#X connect 16 0 1 0; +#X connect 16 1 4 1; +#X connect 16 1 10 0; +#X connect 16 2 4 2; +#X connect 19 0 16 0; diff --git a/doc/3.audio.examples/H14.all.pass.pd b/doc/3.audio.examples/H14.all.pass.pd index 7b8d3fd2..1fe3f988 100644 --- a/doc/3.audio.examples/H14.all.pass.pd +++ b/doc/3.audio.examples/H14.all.pass.pd @@ -1,24 +1,15 @@ -#N canvas 296 142 819 418 12; -#X obj 103 291 filter-graph2 tab1 tab2; -#N canvas 0 50 450 300 (subpatch) 0; -#X array tab1 100 float 0; -#X coords 0 2 99 0 200 140 1 0 0; -#X restore 552 27 graph; -#N canvas 0 50 450 300 (subpatch) 0; -#X array tab2 100 float 2; -#X coords 0 6.283 99 0 200 140 1 0 0; -#X restore 557 228 graph; -#X text 539 84 1; -#X text 551 370 0; -#X text 533 293 pi; -#X text 526 223 2pi; -#X floatatom 76 224 5 0 0 0 - - - 0; -#X text 539 20 2; -#X text 65 367 updated for Pd version 0.39; -#X text 609 173 frequency; -#X text 549 169 0; -#X text 732 172 44100; -#N canvas 876 177 288 255 startup 0; +#N canvas 296 142 779 445 12; +#X floatatom 63 242 5 0 0 0 - - - 0; +#X text 118 382 updated for Pd version 0.39; +#X obj 63 210 filter-graph1 100 44100; +#X text 50 21 ALL-PASS FILTERS; +#X floatatom 371 261 3 -99 99 0 - \$0-pole - 0; +#X obj 276 281 rpole~; +#X obj 371 284 / 100; +#X obj 276 256 rzero_rev~; +#X text 366 237 pole (%); +#X obj 63 184 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#N canvas 876 177 288 255 init 0; #X obj 71 28 loadbang; #X obj 71 57 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 71 91 f \$0; @@ -28,30 +19,35 @@ #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 2 0 5 0; -#X restore 334 158 pd startup; -#X text 493 155 gain=0; -#X text 492 355 phase=0; -#X obj 76 192 filter-graph1 100 44100; -#X text 48 17 ALL-PASS FILTERS; -#X floatatom 356 243 3 -99 99 0 - \$0-pole - 0; -#X obj 261 263 rpole~; -#X obj 356 266 / 100; -#X obj 261 238 rzero_rev~; -#X text 351 219 pole (%); -#X text 35 49 The all-pass filter has a phase response that depends on its coefficient \, and a flat frequency response. The coefficient (p) gives the location of the pole. There is a zero at 1/p \, unless p=0. If p=0 the filter is effectively a one-sample delay. Negative values of $p$ are allowed \, as long as p is between -1 and 1; -#X obj 76 166 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 336 310 ../5.reference/set-dsp-tgl; -#X text 367 313 DSP on/off; -#X msg 336 347 \; pd dsp \$1; -#X connect 7 0 0 0; -#X connect 16 0 7 0; -#X connect 16 1 0 1; -#X connect 16 1 21 0; -#X connect 16 2 0 2; -#X connect 18 0 20 0; -#X connect 19 0 0 3; -#X connect 20 0 21 1; -#X connect 20 0 19 1; -#X connect 21 0 19 0; -#X connect 24 0 16 0; -#X connect 25 0 27 0; +#X restore 326 326 pd init; +#X text 40 55 The all-pass filter has a phase response that depends on its coefficient \, and a flat frequency response. The coefficient (p) gives the location of the pole. There is a zero at 1/p \, unless p=0. If p=0 the filter is effectively a one-sample delay. Negative values of p are allowed (as long as p is between -1 and 1)., f 48; +#N canvas 0 50 450 300 (subpatch) 0; +#X array \$0-amp 100 float 0; +#X coords 0 2 99 0 200 140 1 0 0; +#X restore 489 38 graph; +#N canvas 0 50 450 300 (subpatch) 0; +#X array \$0-phase 100 float 2; +#X coords 0 6.283 100 0 200 140 1 0 0; +#X restore 494 239 graph; +#X text 471 95 1; +#X text 470 304 pi; +#X text 463 234 2pi; +#X text 471 31 2; +#X text 474 366 0; +#X text 486 180 0 Hz; +#X text 669 180 44100 Hz; +#X text 472 167 0; +#X text 486 385 0 Hz; +#X text 669 385 44100 Hz; +#X obj 76 309 filter-graph2 \$0-amp \$0-phase; +#X connect 0 0 24 0; +#X connect 2 0 0 0; +#X connect 2 1 7 0; +#X connect 2 1 24 1; +#X connect 2 2 24 2; +#X connect 4 0 6 0; +#X connect 5 0 24 3; +#X connect 6 0 7 1; +#X connect 6 0 5 1; +#X connect 7 0 5 0; +#X connect 9 0 2 0; diff --git a/doc/3.audio.examples/H15.phaser.pd b/doc/3.audio.examples/H15.phaser.pd index 6d7bf664..099dbf5f 100644 --- a/doc/3.audio.examples/H15.phaser.pd +++ b/doc/3.audio.examples/H15.phaser.pd @@ -1,31 +1,31 @@ -#N canvas 567 32 602 647 12; +#N canvas 567 38 602 647 12; #X declare -stdpath ./; #X text 37 20 PHASER; #N canvas 411 147 659 385 chord 0; -#X obj 82 97 -~ 0.5; -#X obj 82 146 clip~ -0.5 0.5; -#X obj 82 169 cos~; -#X obj 216 260 hip~ 5; -#X obj 216 323 outlet~; -#X obj 82 122 *~ 3; +#X obj 82 99 -~ 0.5; +#X obj 82 153 clip~ -0.5 0.5; +#X obj 82 184 cos~; +#X obj 216 267 hip~ 5; +#X obj 216 330 outlet~; +#X obj 82 126 *~ 3; #X obj 82 74 phasor~ 220; -#X obj 216 97 -~ 0.5; -#X obj 216 146 clip~ -0.5 0.5; -#X obj 216 169 cos~; -#X obj 216 122 *~ 3; -#X obj 351 100 -~ 0.5; -#X obj 351 149 clip~ -0.5 0.5; -#X obj 351 172 cos~; -#X obj 351 125 *~ 3; -#X obj 486 100 -~ 0.5; -#X obj 486 149 clip~ -0.5 0.5; -#X obj 486 172 cos~; -#X obj 486 125 *~ 3; +#X obj 216 99 -~ 0.5; +#X obj 216 153 clip~ -0.5 0.5; +#X obj 216 184 cos~; +#X obj 216 126 *~ 3; +#X obj 351 102 -~ 0.5; +#X obj 351 156 clip~ -0.5 0.5; +#X obj 351 187 cos~; +#X obj 351 129 *~ 3; +#X obj 486 102 -~ 0.5; +#X obj 486 156 clip~ -0.5 0.5; +#X obj 486 187 cos~; +#X obj 486 129 *~ 3; #X obj 216 74 phasor~ 251; #X obj 351 77 phasor~ 281; #X obj 486 77 phasor~ 311; -#X text 142 32 test sound for phaser; -#X obj 216 293 *~ 0.2; +#X text 236 34 test sound for phaser; +#X obj 216 300 *~ 0.2; #X connect 0 0 5 0; #X connect 1 0 2 0; #X connect 2 0 3 0; @@ -50,21 +50,21 @@ #X connect 23 0 4 0; #X restore 67 288 pd chord; #X obj 66 560 output~; -#X obj 83 352 rpole~; -#X obj 83 327 rzero_rev~; -#X obj 83 401 rpole~; -#X obj 83 376 rzero_rev~; -#X obj 83 449 rpole~; -#X obj 83 424 rzero_rev~; -#X obj 83 498 rpole~; -#X obj 83 473 rzero_rev~; +#X obj 84 352 rpole~; +#X obj 84 327 rzero_rev~; +#X obj 84 401 rpole~; +#X obj 84 376 rzero_rev~; +#X obj 84 449 rpole~; +#X obj 84 424 rzero_rev~; +#X obj 84 498 rpole~; +#X obj 84 473 rzero_rev~; #X obj 66 528 +~; #X obj 238 444 phasor~ 0.3; #X obj 238 476 expr~ 1 - 0.03 - 0.6*abs($v1-0.5)*abs($v1-0.5); -#X text 31 171 Many variations of this have been used. A more pronounced effect can be got by using 12 all-pass filters and adding the outputs of the 4th \, 8th \, and 12th one to the original. Various stereo configurations are possible. Some designers have used 6 instead of the 4 stages used here. Controls are often added to set the frequency of sweeping and the range of the all-pass coefficients., f 66; +#X text 31 172 Many variations of this have been used. A more pronounced effect can be got by using 12 all-pass filters and adding the outputs of the 4th \, 8th \, and 12th one to the original. Various stereo configurations are possible. Some designers have used 6 instead of the 4 stages used here. Controls are often added to set the frequency of sweeping and the range of the all-pass coefficients., f 66; #X text 330 584 updated for Pd version 0.47; -#X text 31 47 The phaser ranks \, along with fuzz and wah-wah \, as one of the great guitar pedals. A phaser adds an all-pass filtered copy of a signal to the original \, causing phase reinforcement and cancellation at frequencies that depend on the all-pass coefficients. In this example the coefficients range from 0.88 to 0.98 \, controlled by a phasor~ object (no relation). The phasor~ is converted to a triangle wave (abs($v1-0.5)) and then nonlinearly mapped into a suitable range., f 66; -#X obj 424 13 declare -stdpath ./; +#X obj 382 301 declare -stdpath ./; +#X text 31 47 The phaser ranks \, along with fuzz and wah-wah \, as one of the great guitar pedals. A phaser adds an all-pass filtered copy of a signal to the original \, causing phase reinforcement and cancellation at frequencies that depend on the all-pass coefficients. In this example the coefficients range from 0.88 to 0.98 \, controlled by a [phasor~] object (no relation). The [phasor~] is converted to a triangle wave (abs($v1-0.5)) and then nonlinearly mapped into a suitable range., f 66; #X connect 1 0 4 0; #X connect 1 0 11 0; #X connect 3 0 6 0; diff --git a/doc/3.audio.examples/H16.adsr.filter.qlist.pd b/doc/3.audio.examples/H16.adsr.filter.qlist.pd index 50905341..370ffaa4 100644 --- a/doc/3.audio.examples/H16.adsr.filter.qlist.pd +++ b/doc/3.audio.examples/H16.adsr.filter.qlist.pd @@ -1,4 +1,4 @@ -#N canvas 377 29 843 687 12; +#N canvas 377 38 843 705 12; #X declare -stdpath ./; #X obj 30 250 r trigger; #X obj 30 471 *~; @@ -8,16 +8,16 @@ #X obj 77 393 r pitch; #X obj 77 443 mtof; #X floatatom 77 418 4 0 0 0 - - - 0; -#X floatatom 49 305 4 0 0 0 - - - 0; -#X obj 49 280 r level; -#X floatatom 112 305 4 0 0 0 - - - 0; -#X obj 112 280 r attack; -#X floatatom 180 305 4 0 0 0 - - - 0; -#X obj 180 280 r decay; -#X floatatom 244 305 4 0 0 0 - - - 0; -#X floatatom 320 305 4 0 0 0 - - - 0; -#X obj 244 280 r sustain; -#X obj 320 280 r release; +#X floatatom 51 305 4 0 0 0 - - - 0; +#X obj 51 280 r level; +#X floatatom 114 305 4 0 0 0 - - - 0; +#X obj 114 280 r attack; +#X floatatom 182 305 4 0 0 0 - - - 0; +#X obj 182 280 r decay; +#X floatatom 246 305 4 0 0 0 - - - 0; +#X floatatom 322 305 4 0 0 0 - - - 0; +#X obj 246 280 r sustain; +#X obj 322 280 r release; #X obj 481 186 r note; #X msg 481 275 \; trigger 1; #X msg 577 289 \; trigger 0; @@ -25,7 +25,7 @@ #X obj 50 15 r qlist; #X msg 68 67 rewind; #X obj 78 96 r tempo; -#X floatatom 78 121 4 0 0 0 - - - 0; +#X floatatom 78 121 4 1 10 0 - - - 0; #X msg 78 146 tempo \$1; #X obj 481 233 t b f; #X obj 539 229 s pitch; @@ -44,62 +44,63 @@ #X obj 541 408 r sustain2; #X obj 637 408 r release2; #X obj 77 468 tabosc4~ array1; -#X floatatom 236 393 4 0 0 0 - - - 0; +#X floatatom 237 393 4 0 0 0 - - - 0; #X obj 225 576 vcf~; #X floatatom 329 528 4 0 0 0 - - - 0; #X obj 329 503 r q; -#X obj 286 471 adsr 0 0 0 0 0; #X obj 305 428 / 69.23; -#X obj 236 418 mtof; -#X obj 236 443 sqrt; -#X obj 236 468 sqrt; +#X obj 237 418 mtof; +#X obj 237 443 sqrt; +#X obj 237 468 sqrt; #X obj 215 361 r filter; #X obj 237 521 *~; #X obj 237 546 *~; #X obj 286 496 +~ 1; -#X obj 236 493 *~; +#X obj 237 493 *~; #X text 107 250 ADSR for amplitude:; -#N canvas 0 258 703 380 otherstuff 0; -#X obj 289 86 loadbang; -#X obj 418 85 loadbang; -#N canvas 0 0 450 300 (subpatch) 0; -#X array array1 67 float 1; -#A 0 0 0 0 0 0.714286 0.742857 0.757143 0.771429 0.778571 0.785714 0.785714 0.785714 0.785714 0.790476 0.795238 0.614286 0.585714 0.442857 0.271429 -0.128571 -0.142857 -0.157143 -0.171429 -0.642857 -0.528571 -0.614286 -0.685714 -0.828571 -0.828571 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.557143 0.571429 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 66 -1 200 140 1; -#X restore 62 81 graph; -#X msg 418 115 \; qlist read qlist2.txt; -#X msg 289 111 \; level 100 \; attack 20 \; decay 300 \; sustain 70 \; release 300 \; duration 300 \; pitch 72 \; filter 38 \; level2 49 \; attack2 19 \; decay2 300 \; sustain2 17 \; release2 700 \; q 3 \; tempo 4; -#X connect 0 0 4 0; -#X connect 1 0 3 0; -#X restore 492 482 pd otherstuff; -#X msg 149 196 \; qlist read qlist2.txt; +#X msg 149 189 \; qlist read qlist2.txt; #X obj 225 616 output~; -#X text 240 112 The qlist reads the file \, "qlist2.txt" \, which contains four "note" messages and a message at the end that restarts the qlist at the beginning. The "note" messages are translated into a pitch change and triggers for the ADSRs., f 77; -#X text 392 338 ADSR for filter. Here \, it works better to make the envelope modify a constant "filter pitch"--so the "filter" receive gets the "mtof" treatment and the ADSR is an offset in halftones., f 50; -#X text 323 17 ANALOG_STYLE SYNTH USING QLIST; -#X text 594 481 <= loadbangs and table; -#X text 86 41 <= start loop; -#X text 117 67 <= stop loop; -#X text 118 121 <= set tempo; -#X obj 30 338 adsr 0 0 0 0 0; +#X text 392 335 ADSR for filter. Here \, it works better to make the envelope modify a constant "filter pitch"--so the "filter" receive gets the "mtof" treatment and the ADSR is an offset in halftones., f 50; #X obj 613 14 declare -stdpath ./; #X obj 577 264 delay; -#X text 309 202 reload qlist2.txt; -#X text 240 60 This is an analog-synth sound made using a wavetable oscillator and a [vcf~] object. Unlike the "floyd" example earlier \, we use a qlist object to do the sequencing. This can also be adapted to make a keyboard synth., f 77; -#X msg 397 584 line 0 \, auto; -#X text 645 578 click to open:, f 15; -#X obj 397 558 r text; -#X obj 642 602 text define -k seq2; +#X text 309 195 reload qlist2.txt; +#X msg 398 562 line 0 \, auto; +#X text 695 562 click to open:; +#X obj 398 505 r text; +#X obj 662 588 text define -k seq2; #A set note 36 \; 1000 note 34 \; 1000 note 33 \; 1000 note 31 \; 1000 text bang \;; -#X obj 397 623 text sequence seq2 -g; +#X obj 398 631 text sequence seq2 -g; #X text 603 645 updated for Pd version 0.52; -#X msg 353 583 stop; -#X msg 498 591 tempo \$1 permsec; -#X obj 498 541 r tempo; -#X floatatom 498 566 4 0 0 0 - - - 0; -#X text 631 525 You can also use the more modern [text] object as previsously mentioned., f 25; +#X msg 413 591 stop; +#X msg 504 589 tempo \$1 permsec; +#X obj 504 539 r tempo; +#X floatatom 504 564 4 0 0 0 - - - 0; +#X text 590 506 You can also use the more modern [text] object as previsously mentioned., f 25; #X obj 62 42 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X connect 0 0 69 0; +#X text 86 41 <-- start loop; +#X text 117 67 <-- stop loop; +#X text 114 121 <-- set tempo; +#X text 240 60 This is an analog-synth sound made using a wavetable oscillator and a [vcf~] object. Unlike the "floyd" example earlier \, we use a [qlist] object to do the sequencing. This can also be adapted to make a keyboard synth., f 77; +#X text 240 112 The [qlist] reads the file \, "qlist2.txt" \, which contains four "note" messages and a message at the end that restarts the qlist at the beginning. The "note" messages are translated into a pitch change and triggers for the ADSRs., f 77; +#X obj 286 471 adsr, f 15; +#N canvas 818 375 459 345 init 0; +#X obj 65 30 loadbang; +#X obj 214 30 loadbang; +#N canvas 0 0 450 300 (subpatch) 0; +#X array array1 67 float 1; +#A 0 0 0 0 0 0.714286 0.742857 0.757143 0.771429 0.778571 0.785714 0.785714 0.785714 0.785714 0.790476 0.795238 0.614286 0.585714 0.442857 0.271429 -0.128571 -0.142857 -0.157143 -0.171429 -0.642857 -0.528571 -0.614286 -0.685714 -0.828571 -0.828571 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.557143 0.571429 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 66 -1 200 140 1; +#X restore 200 140 graph; +#X msg 214 67 \; qlist read qlist2.txt; +#X msg 65 67 \; level 100 \; attack 20 \; decay 300 \; sustain 70 \; release 300 \; duration 300 \; pitch 72 \; filter 38 \; level2 49 \; attack2 19 \; decay2 300 \; sustain2 17 \; release2 700 \; q 3 \; tempo 4; +#X connect 0 0 4 0; +#X connect 1 0 3 0; +#X restore 95 614 pd init; +#X obj 30 338 adsr, f 16; +#X text 323 17 ANALOG STYLE SYNTH USING QLIST; +#X obj 398 532 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 425 533 start; +#X connect 0 0 83 0; #X connect 1 0 45 0; #X connect 2 0 3 0; #X connect 2 0 3 1; @@ -109,14 +110,14 @@ #X connect 5 0 7 0; #X connect 6 0 43 0; #X connect 7 0 6 0; -#X connect 8 0 69 1; +#X connect 8 0 83 1; #X connect 9 0 8 0; -#X connect 10 0 69 2; +#X connect 10 0 83 2; #X connect 11 0 10 0; -#X connect 12 0 69 3; +#X connect 12 0 83 3; #X connect 13 0 12 0; -#X connect 14 0 69 4; -#X connect 15 0 69 5; +#X connect 14 0 83 4; +#X connect 15 0 83 5; #X connect 16 0 14 0; #X connect 17 0 15 0; #X connect 18 0 31 0; @@ -126,45 +127,46 @@ #X connect 25 0 26 0; #X connect 26 0 21 0; #X connect 27 0 19 0; -#X connect 27 0 71 0; +#X connect 27 0 62 0; #X connect 27 1 28 0; #X connect 29 0 30 0; -#X connect 30 0 71 1; +#X connect 30 0 62 1; #X connect 31 0 27 0; -#X connect 32 0 48 0; -#X connect 33 0 49 0; -#X connect 34 0 48 2; -#X connect 35 0 48 3; -#X connect 36 0 48 4; -#X connect 37 0 48 5; +#X connect 32 0 81 0; +#X connect 33 0 48 0; +#X connect 34 0 81 2; +#X connect 35 0 81 3; +#X connect 36 0 81 4; +#X connect 37 0 81 5; #X connect 38 0 33 0; #X connect 39 0 34 0; #X connect 40 0 35 0; #X connect 41 0 36 0; #X connect 42 0 37 0; #X connect 43 0 1 1; -#X connect 44 0 50 0; -#X connect 45 0 61 0; +#X connect 44 0 49 0; +#X connect 45 0 59 0; #X connect 46 0 45 2; #X connect 47 0 46 0; -#X connect 48 0 56 0; -#X connect 49 0 48 1; +#X connect 48 0 81 1; +#X connect 49 0 50 0; #X connect 50 0 51 0; -#X connect 51 0 52 0; -#X connect 52 0 57 0; -#X connect 53 0 44 0; -#X connect 54 0 55 0; -#X connect 54 0 55 1; -#X connect 55 0 45 1; -#X connect 56 0 57 1; -#X connect 57 0 54 0; -#X connect 57 0 54 1; -#X connect 69 0 2 0; -#X connect 71 0 20 0; -#X connect 74 0 78 0; -#X connect 76 0 74 0; -#X connect 80 0 78 0; -#X connect 81 0 78 0; -#X connect 82 0 83 0; -#X connect 83 0 81 0; -#X connect 85 0 21 0; +#X connect 51 0 56 0; +#X connect 52 0 44 0; +#X connect 53 0 54 0; +#X connect 53 0 54 1; +#X connect 54 0 45 1; +#X connect 55 0 56 1; +#X connect 56 0 53 0; +#X connect 56 0 53 1; +#X connect 62 0 20 0; +#X connect 64 0 68 0; +#X connect 66 0 85 0; +#X connect 70 0 68 0; +#X connect 71 0 68 0; +#X connect 72 0 73 0; +#X connect 73 0 71 0; +#X connect 75 0 21 0; +#X connect 81 0 55 0; +#X connect 83 0 2 0; +#X connect 85 0 64 0; diff --git a/doc/3.audio.examples/I01.Fourier.analysis.pd b/doc/3.audio.examples/I01.Fourier.analysis.pd index 2bcecd17..9937fadb 100644 --- a/doc/3.audio.examples/I01.Fourier.analysis.pd +++ b/doc/3.audio.examples/I01.Fourier.analysis.pd @@ -1,4 +1,4 @@ -#N canvas 571 23 714 719 12; +#N canvas 492 38 714 719 12; #X floatatom 60 295 7 0 0 0 - - - 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-real 64 float 2; @@ -8,53 +8,42 @@ #X obj 92 267 samplerate~; #X obj 60 242 t f b; #X obj 60 267 *; -#X obj 97 613 metro 250; -#X obj 59 682 tabwrite~ \$0-real; -#X obj 84 659 tabwrite~ \$0-imaginary; +#X obj 97 616 metro 250; +#X obj 59 685 tabwrite~ \$0-real; +#X obj 84 662 tabwrite~ \$0-imaginary; #X obj 59 424 osc~; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-imaginary 64 float 2; #X coords 0 64 64 -64 256 200 1; #X restore 422 449 graph; -#X obj 85 400 f; -#X floatatom 103 354 3 0 100 0 - - - 0; -#X obj 103 375 / 100; +#X obj 84 400 f; +#X floatatom 102 351 5 0 100 0 - - - 0; +#X obj 102 375 / 100; #X obj 60 218 / 64; -#X text 594 197 real part; -#X text 549 430 imaginary part; -#X obj 97 580 loadbang; -#X text 159 383 of a cycle; -#X obj 103 636 s \$0-snap; -#X obj 85 322 r \$0-snap; -#X text 159 369 hundredths; -#X text 109 450 given the real and imaginary part; -#X text 110 466 of a complex-valued signal. Here; -#X text 109 482 the imaginary part is zero (the; -#X text 108 435 fft~ computes the Fourier transform \,; -#X text 253 654 real and imaginary; -#X text 253 670 outputs are graphed; -#X text 252 687 separately.; -#X text 108 499 input is real-valued). The output; -#X text 107 517 is a (real \, imaginary) pair for each; -#X text 108 535 frequency from 0 to 63 (in units of; -#X text 109 555 SR/64).; +#X text 603 197 real part; +#X text 569 430 imaginary part; +#X obj 97 583 loadbang; +#X obj 103 639 s \$0-snap; +#X obj 84 322 r \$0-snap; #X text 49 54 ANALYSIS; #X text 50 36 FOURIER; #X msg 60 106 0; #X msg 68 131 10; #X msg 75 154 10.5; -#X text 175 319 bang-on-snapshot; -#X text 173 333 from below; -#X text 116 403 sync phase with snapshots; -#X obj 59 458 fft~; -#X text 103 195 <= frequency (as multiple of SR/64 \, the fundamental), f 26; -#X text 139 353 <= phase in; -#X text 127 295 <= frequency \, Hz.; +#X text 115 403 sync phase with snapshots; +#X obj 59 456 fft~; #X text 163 12 The [fft~] object has separate inlets for the real and imaginary parts of a complex-valued signal and outputs its Fourier transform \, again using separate outlets for the real and imaginary part. The transform is done on one block of samples (here the block size is 64 \, Pd's default.) The outputs give the complex amplitudes of the harmonics of the input signal \, from DC up. The harmonics are tuned to the fundamental frequency of the analysis \, 1/64th of the sample rate. If the frequency (in harmonics) is an integer \, the result is two harmonics symmetric about the Nyquist frequency. Fractional frequencies spill across harmonics. Changing the initial phase rotates energy from real to imaginary and back., f 67; #X text 478 674 updated for Pd version 0.39; -#X obj 235 565 ../5.reference/set-dsp-tgl; -#X text 266 568 DSP on/off; -#X msg 235 602 \; pd dsp \$1; +#X obj 238 572 ../5.reference/set-dsp-tgl; +#X text 269 575 DSP on/off; +#X msg 238 607 \; pd dsp \$1; +#X text 103 195 <-- frequency (as multiple of SR/64 \, the fundamental), f 26; +#X text 117 295 <-- frequency \, Hz.; +#X text 147 350 <--; +#X text 174 349 phase in hundredths of a cycle, f 10; +#X text 156 322 bang-on-snapshot from below; +#X text 100 457 [fft~] computes the Fourier transform \, given the real and imaginary part of a complex-valued signal. Here the imaginary part is zero (the input is real-valued). The output is a (real \, imaginary) pair for each frequency from 0 to 63 (in units of SR/64)., f 41; +#X text 249 668 real and imaginary outputs are graphed separately., f 27; #X connect 0 0 9 0; #X connect 2 0 14 0; #X connect 3 0 5 1; @@ -63,17 +52,17 @@ #X connect 5 0 0 0; #X connect 6 0 7 0; #X connect 6 0 8 0; -#X connect 6 0 19 0; -#X connect 9 0 41 0; +#X connect 6 0 18 0; +#X connect 9 0 26 0; #X connect 11 0 9 1; #X connect 12 0 13 0; #X connect 13 0 11 1; #X connect 14 0 4 0; #X connect 17 0 6 0; -#X connect 20 0 11 0; -#X connect 35 0 2 0; -#X connect 36 0 2 0; -#X connect 37 0 2 0; -#X connect 41 0 7 0; -#X connect 41 1 8 0; -#X connect 47 0 49 0; +#X connect 19 0 11 0; +#X connect 22 0 2 0; +#X connect 23 0 2 0; +#X connect 24 0 2 0; +#X connect 26 0 7 0; +#X connect 26 1 8 0; +#X connect 29 0 31 0; diff --git a/doc/3.audio.examples/I02.Hann.window.pd b/doc/3.audio.examples/I02.Hann.window.pd index 8a26c210..3b19ab7f 100644 --- a/doc/3.audio.examples/I02.Hann.window.pd +++ b/doc/3.audio.examples/I02.Hann.window.pd @@ -1,30 +1,24 @@ -#N canvas 616 23 568 608 12; -#N canvas 228 148 612 574 fft-analysis 0; -#X obj 45 184 *~; -#X obj 44 119 inlet~; -#X obj 45 238 rfft~; -#X obj 66 160 tabreceive~ \$0-hann; -#X obj 44 326 *~; +#N canvas 616 38 568 608 12; +#N canvas 349 161 612 574 fft-analysis 0; +#X obj 46 184 *~; +#X obj 45 119 inlet~; +#X obj 46 238 rfft~; +#X obj 64 158 tabreceive~ \$0-hann; +#X obj 45 326 *~; #X obj 86 326 *~; #X obj 45 376 sqrt~; #X obj 44 518 tabwrite~ \$0-magnitude; -#X obj 53 436 loadbang; -#X obj 53 490 metro 250; -#X obj 53 466 tgl 17 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 58 427 loadbang; +#X obj 58 457 tgl 17 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X obj 35 35 block~ 512; -#X text 255 151 tabreceive~ outputs array contents \,; -#X text 255 169 constantly \, every block. Here it's; -#X text 253 189 used to get the Hann window to; -#X text 255 207 multiply by the input.; -#X text 131 13 block~ object does no computation but declares this; -#X text 131 30 window to be operating at a different block size from; -#X text 133 64 Fourier transform.; -#X text 132 46 the parent window. This determines the size of the; -#X text 106 119 The inlet~ automatically re-blocks to the new block size.; #X obj 45 352 +~; -#X text 124 328 Take the magnitude by squaring real and imaginary part \, adding and taking square root.; -#X text 140 444 periodically graph the output. It appears every 512 samples (about 12 milliseconds) but we only update the graph 4 times per second. The graph is back on the main (parent) window.; -#X text 112 235 forward real FFT. Like "fft~" \, but only one inlet (for the real part) and only the first half of the output signals are used. (The others are determined by symmetry: they're complex conjugates of the first half \, in reverse order.) This takes 1/2 the CPU time of "fft".; +#X text 136 324 Take the magnitude by squaring real and imaginary part \, adding and taking square root., f 40; +#X text 127 13 [block~] object does no computation but declares this window to be operating at a different block size from the parent window. This determines the size of the Fourier transform., f 48; +#X text 106 119 The [inlet~] automatically re-blocks to the new block size.; +#X text 218 150 [tabreceive~] outputs array contents \, constantly \, every block. Here it's used to get the Hann window to multiply by the input., f 41; +#X text 112 235 forward real FFT. Like [fft~] \, but only one inlet (for the real part) and only the first half of the output signals are used. (The others are determined by symmetry: they're complex conjugates of the first half \, in reverse order.) This takes 1/2 the CPU time of [fft~]., f 58; +#X obj 58 481 metro 150; +#X text 142 428 periodically graph the output. It appears every 512 samples (about 12 milliseconds) but we only update the graph at a rate of 150 milliseconds. The graph is back on the main (parent) window., f 47; #X connect 0 0 2 0; #X connect 1 0 0 0; #X connect 2 0 4 0; @@ -32,68 +26,66 @@ #X connect 2 1 5 0; #X connect 2 1 5 1; #X connect 3 0 0 1; -#X connect 4 0 21 0; -#X connect 5 0 21 1; +#X connect 4 0 11 0; +#X connect 5 0 11 1; #X connect 6 0 7 0; -#X connect 8 0 10 0; -#X connect 9 0 7 0; -#X connect 10 0 9 0; -#X connect 21 0 6 0; -#X restore 26 293 pd fft-analysis; +#X connect 8 0 9 0; +#X connect 9 0 17 0; +#X connect 11 0 6 0; +#X connect 17 0 7 0; +#X restore 33 298 pd fft-analysis; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-magnitude 256 float 0; #X coords 0 256 255 0 256 100 1; -#X restore 256 212 graph; -#X text 89 17 WINDOWING AND BLOCKING FOURIER TRANSFORMS; -#X obj 26 266 osc~; -#X floatatom 26 217 5 0 0 0 - - - 0; -#X obj 26 242 * 10; -#X text 306 561 updated for Pd version 0.39; -#X text 414 190 magnitude; -#X text 253 315 0; -#X text 491 315 255; -#X text 242 301 0; -#X text 224 257 128; -#X text 223 207 256; +#X restore 279 208 graph; +#X text 118 15 WINDOWING AND BLOCKING FOURIER TRANSFORMS; +#X obj 33 266 osc~; +#X floatatom 33 237 9 0 0 0 - - - 0; +#X text 326 561 updated for Pd version 0.39; +#X text 437 186 magnitude; +#X text 276 311 0; +#X text 514 311 255; +#X text 265 297 0; +#X text 247 253 128; +#X text 246 203 256; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 512 float 1; #A 0 0 3.76403e-05 0.000150591 0.000338793 0.000602275 0.000940949 0.00135478 0.00184369 0.00240764 0.00304651 0.00376022 0.00454867 0.00541174 0.0063493 0.00736117 0.00844723 0.00960734 0.0108413 0.0121489 0.01353 0.0149843 0.0165117 0.0181119 0.0197847 0.0215298 0.0233469 0.0252359 0.0271963 0.0292279 0.0313304 0.0335035 0.0357469 0.0380601 0.040443 0.042895 0.0454159 0.0480052 0.0506626 0.0533877 0.05618 0.0590392 0.0619648 0.0649563 0.0680134 0.0711355 0.0743222 0.077573 0.0808874 0.0842649 0.0877051 0.0912073 0.0947711 0.0983959 0.102081 0.105826 0.109631 0.113494 0.117416 0.121395 0.125431 0.129524 0.133672 0.137876 0.142134 0.146446 0.150811 0.155229 0.159699 0.16422 0.168792 0.173413 0.178084 0.182803 0.18757 0.192384 0.197244 0.20215 0.2071 0.212095 0.217133 0.222214 0.227337 0.2325 0.237704 0.242948 0.24823 0.25355 0.258907 0.264301 0.26973 0.275194 0.280691 0.286222 0.291785 0.297379 0.303003 0.308658 0.314341 0.320052 0.32579 0.331555 0.337344 0.343159 0.348997 0.354857 0.36074 0.366643 0.372567 0.37851 0.384471 0.390449 0.396444 0.402454 0.40848 0.414519 0.420571 0.426634 0.432709 0.438794 0.444889 0.450991 0.457101 0.463218 0.469339 0.475466 0.481596 0.487729 0.493864 0.5 0.506136 0.512271 0.518404 0.524534 0.53066 0.536782 0.542899 0.549009 0.555111 0.561205 0.56729 0.573365 0.579429 0.585481 0.59152 0.597545 0.603556 0.609551 0.615529 0.62149 0.627433 0.633357 0.63926 0.645143 0.651003 0.656841 0.662656 0.668445 0.67421 0.679948 0.685659 0.691342 0.696997 0.702621 0.708215 0.713778 0.719309 0.724806 0.73027 0.735699 0.741092 0.74645 0.75177 0.757052 0.762295 0.767499 0.772663 0.777786 0.782867 0.787905 0.7929 0.79785 0.802756 0.807616 0.81243 0.817197 0.821916 0.826587 0.831209 0.83578 0.840301 0.844771 0.849189 0.853554 0.857866 0.862124 0.866328 0.870476 0.874569 0.878605 0.882584 0.886506 0.890369 0.894174 0.897919 0.901605 0.905229 0.908793 0.912295 0.915736 0.919113 0.922428 0.925678 0.928865 0.931987 0.935044 0.938036 0.940961 0.94382 0.946613 0.949338 0.951995 0.954585 0.957106 0.959558 0.96194 0.964254 0.966497 0.96867 0.970773 0.972804 0.974765 0.976654 0.978471 0.980216 0.981889 0.983489 0.985016 0.98647 0.987852 0.989159 0.990393 0.991553 0.992639 0.993651 0.994589 0.995452 0.99624 0.996954 0.997593 0.998156 0.998645 0.999059 0.999398 0.999661 0.999849 0.999962 1 0.999962 0.999849 0.999661 0.999398 0.999059 0.998645 0.998156 0.997592 0.996953 0.996239 0.995451 0.994588 0.99365 0.992638 0.991552 0.990392 0.989158 0.987851 0.986469 0.985015 0.983488 0.981887 0.980215 0.978469 0.976652 0.974763 0.972803 0.970771 0.968669 0.966495 0.964252 0.961939 0.959556 0.957104 0.954583 0.951993 0.949336 0.946611 0.943819 0.940959 0.938034 0.935042 0.931985 0.928863 0.925676 0.922425 0.919111 0.915733 0.912293 0.908791 0.905227 0.901602 0.897917 0.894171 0.890367 0.886503 0.882582 0.878602 0.874566 0.870473 0.866325 0.862121 0.857863 0.853551 0.849186 0.844768 0.840298 0.835777 0.831205 0.826584 0.821913 0.817194 0.812427 0.807613 0.802753 0.797847 0.792896 0.787901 0.782863 0.777782 0.77266 0.767496 0.762292 0.757048 0.751766 0.746446 0.741089 0.735695 0.730266 0.724802 0.719305 0.713774 0.708211 0.702617 0.696993 0.691338 0.685655 0.679944 0.674206 0.668441 0.662652 0.656837 0.650999 0.645139 0.639256 0.633353 0.627429 0.621486 0.615525 0.609547 0.603552 0.597541 0.591516 0.585477 0.579425 0.573361 0.567286 0.561201 0.555107 0.549004 0.542895 0.536778 0.530656 0.52453 0.518399 0.512266 0.506132 0.499996 0.49386 0.487725 0.481592 0.475462 0.469335 0.463213 0.457097 0.450987 0.444885 0.43879 0.432705 0.42663 0.420566 0.414515 0.408476 0.40245 0.39644 0.390445 0.384466 0.378505 0.372563 0.366639 0.360736 0.354853 0.348993 0.343155 0.33734 0.331551 0.325786 0.320048 0.314337 0.308654 0.303 0.297375 0.291781 0.286218 0.280687 0.27519 0.269726 0.264297 0.258904 0.253547 0.248226 0.242944 0.237701 0.232497 0.227333 0.222211 0.21713 0.212092 0.207097 0.202146 0.19724 0.19238 0.187566 0.182799 0.17808 0.17341 0.168788 0.164217 0.159696 0.155226 0.150808 0.146443 0.142131 0.137873 0.133669 0.129521 0.125428 0.121392 0.117413 0.113491 0.109628 0.105823 0.102078 0.0983929 0.0947681 0.0912044 0.0877022 0.0842621 0.0808846 0.0775702 0.0743194 0.0711327 0.0680107 0.0649537 0.0619622 0.0590366 0.0561775 0.0533853 0.0506602 0.0480029 0.0454136 0.0428928 0.0404408 0.038058 0.0357448 0.0335015 0.0313284 0.029226 0.0271944 0.025234 0.0233452 0.0215281 0.019783 0.0181104 0.0165102 0.0149829 0.0135286 0.0121476 0.01084 0.00960615 0.0084461 0.0073601 0.00634828 0.00541082 0.00454783 0.00375944 0.00304583 0.00240701 0.00184315 0.00135431 0.000940561 0.000601947 0.000338584 0.000150442 3.75807e-05; #X coords 0 1 511 0 200 120 1; -#X restore 317 398 graph; -#X msg 150 438 0; -#X obj 44 487 osc~; -#X obj 44 439 samplerate~; -#X obj 44 510 *~ -0.5; -#X obj 44 533 +~ 0.5; -#X obj 36 558 tabwrite~ \$0-hann; -#X text 303 390 1; -#X text 296 508 0; -#X text 312 521 0; -#X obj 44 463 / 512; -#X text 422 375 Hann window; -#X text 92 485 period 512; -#X text 34 391 recalculate Hann; -#X text 69 406 window table; -#X text 91 233 tens of Hz.; -#X text 86 273 click here and; -#X text 34 50 In this example we use a sub-patch ("pd fft-analysis") to re-block the Fourier transform to 512 points. The signal is multiplied by the Hann window function (which is just a raised cosine.) The magnitude \, which is computed in the sub-patch \, is graphed below in this window. The point at 255 corresponds to just below the Nyquist frequency. Phase isn't shown \, and unlike the previous patch we don't control the initial phase of the oscillator. (For fun \, try drawing other window functions with the mouse...), f 68; -#X text 498 524 511; -#X text 142 292 <= see; -#X text 71 215 <= frequency \,; -#X obj 36 411 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 194 347 ../5.reference/set-dsp-tgl; -#X text 225 350 DSP on/off; -#X msg 194 384 \; pd dsp \$1; +#X restore 323 380 graph; +#X msg 150 428 0; +#X obj 44 477 osc~; +#X obj 44 429 samplerate~; +#X obj 44 500 *~ -0.5; +#X obj 44 523 +~ 0.5; +#X obj 36 551 tabwrite~ \$0-hann; +#X text 309 372 1; +#X text 302 490 0; +#X text 318 503 0; +#X obj 44 453 / 512; +#X text 428 357 Hann window; +#X text 36 379 recalculate Hann; +#X text 64 394 window table; +#X text 101 278 click here and; +#X text 504 506 511; +#X obj 36 401 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 196 478 ../5.reference/set-dsp-tgl; +#X text 117 482 DSP on/off; +#X msg 196 515 \; pd dsp \$1; +#X text 150 296 <-- see; +#X text 41 50 In this example we use the sub-patch [pd fft-analysis] to re-block the Fourier transform to 512 points. The signal is multiplied by the Hann window function (which is just a raised cosine.) The magnitude \, which is computed in the sub-patch \, is graphed below in this window. The point at 255 corresponds to just below the Nyquist frequency. Phase isn't shown \, and unlike the previous patch we don't control the initial phase of the oscillator. (For fun \, try drawing other window functions with the mouse...), f 68; +#X obj 36 208 hsl 162 19 0 22050 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 104 236 Hz.; #X connect 3 0 0 0; -#X connect 4 0 5 0; -#X connect 5 0 3 0; -#X connect 14 0 15 1; -#X connect 15 0 17 0; -#X connect 16 0 23 0; +#X connect 4 0 3 0; +#X connect 13 0 14 1; +#X connect 14 0 16 0; +#X connect 15 0 22 0; +#X connect 16 0 17 0; #X connect 17 0 18 0; -#X connect 18 0 19 0; -#X connect 23 0 15 0; -#X connect 34 0 16 0; -#X connect 34 0 14 0; -#X connect 34 0 19 0; -#X connect 35 0 37 0; +#X connect 22 0 14 0; +#X connect 28 0 15 0; +#X connect 28 0 13 0; +#X connect 28 0 18 0; +#X connect 29 0 31 0; +#X connect 34 0 4 0; diff --git a/doc/3.audio.examples/I03.resynthesis.pd b/doc/3.audio.examples/I03.resynthesis.pd index 28cd63c1..a4c6f250 100644 --- a/doc/3.audio.examples/I03.resynthesis.pd +++ b/doc/3.audio.examples/I03.resynthesis.pd @@ -1,4 +1,4 @@ -#N canvas 443 42 623 510 12; +#N canvas 510 55 623 510 12; #X declare -stdpath ./; #N canvas 353 76 558 670 fft-analysis 0; #X obj 32 186 *~; @@ -8,42 +8,42 @@ #X obj 32 365 *~; #X obj 71 365 *~; #X obj 30 33 block~ 512 4; -#X text 92 101 The inlet~ now re-uses 3/4 of the previous block \, along with the 128 new samples., f 49; #X text 197 159 window function as before.; #X obj 89 205 tabreceive~ \$0-gain; #X obj 89 235 *~; #X obj 32 518 *~; #X obj 50 492 tabreceive~ \$0-hann; #X obj 89 310 /~ 768; -#X text 152 292 divide by 3N/2 (factor of N because rfft and rifft aren't normalized \, and 3/2 is the gain of overlap-4 reconstruction when Hann window function is applied twice.), f 52; #X text 132 235 Just to show we're doing something \, we multiply each channel by a gain controlled by an array in the main window. The control is quartic-scaled for easy editing., f 55; #X obj 89 263 *~; #X text 107 357 Multiply the (complex-valued) spectrum amplitudes by the (real-valued) gain-and-normalization-factor, f 50; -#X obj 32 411 rifft~; -#X text 98 403 Real-valued inverse Fourier transform. This uses only the first N/@ points of its inputs \, supplying the rest by symmetry (so it's OK that rfft~ only puts out those N/2 points.) There's only one outlet because the output is real-valued.; +#X obj 32 421 rifft~; #X obj 31 599 outlet~; -#X text 76 518 Multiply by the Hann window function again \, necessary because the operation we performed might result in a signal that doesn't go smoothly to zero at both ends.; -#X text 107 583 This repackages the output into 64-sample chunks for the parent window. Since we're operating with an overlap \, the outlet~ object performs an overlapped sum of the blocks computed in this window.; -#X text 129 19 block~ object specifies vector size of 512 and overlap four. This window now computes blocks of 512 samples at intervals of 128 samples computed on the parent patch., f 55; +#X text 76 518 Multiply by the Hann window function again \, necessary because the operation we performed might result in a signal that doesn't go smoothly to zero at both ends., f 53; +#X text 129 19 [block~] object specifies vector size of 512 and overlap four. This window now computes blocks of 512 samples at intervals of 128 samples computed on the parent patch.; +#X text 92 101 The [inlet~] now re-uses 3/4 of the previous block \, along with the 128 new samples., f 44; +#X text 154 289 divide by 3N/2 (factor of N because [rfft~] and [rifft~] aren't normalized \, and 3/2 is the gain of overlap-4 reconstruction when Hann window function is applied twice.), f 50; +#X text 100 398 Real-valued inverse Fourier transform. This uses only the first N/@ points of its inputs \, supplying the rest by symmetry (so it's OK that [rfft~] only puts out those N/2 points.) There's only one outlet because the output is real-valued.; +#X text 107 583 This repackages the output into 64-sample chunks for the parent window. Since we're operating with an overlap \, the [outlet~] object performs an overlapped sum of the blocks computed in this window.; #X connect 0 0 2 0; #X connect 1 0 0 0; #X connect 2 0 4 0; #X connect 2 1 5 0; #X connect 3 0 0 1; -#X connect 4 0 18 0; -#X connect 5 0 18 1; -#X connect 9 0 10 0; -#X connect 9 0 10 1; -#X connect 10 0 16 0; -#X connect 10 0 16 1; -#X connect 11 0 20 0; -#X connect 12 0 11 1; -#X connect 13 0 4 1; -#X connect 13 0 5 1; -#X connect 16 0 13 0; -#X connect 18 0 11 0; -#X restore 97 376 pd fft-analysis; -#X text 378 471 updated for Pd version 0.39; +#X connect 4 0 16 0; +#X connect 5 0 16 1; +#X connect 8 0 9 0; +#X connect 8 0 9 1; +#X connect 9 0 14 0; +#X connect 9 0 14 1; +#X connect 10 0 17 0; +#X connect 11 0 10 1; +#X connect 12 0 4 1; +#X connect 12 0 5 1; +#X connect 14 0 12 0; +#X connect 16 0 10 0; +#X restore 63 385 pd fft-analysis; +#X text 393 458 updated for Pd version 0.39; #N canvas 687 159 571 372 Hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 512 float 0; @@ -65,8 +65,8 @@ #X text 100 117 recalculate Hann; #X text 135 132 window table; #X obj 57 82 loadbang; -#X text 91 26 The Hann window is now recomputed on 'loadbang' to make the file smaller (it doesn't have to be saved with the array.); #X text 474 277 511; +#X text 91 26 The Hann window is now recomputed on [loadbang] to make the file smaller (it doesn't have to be saved with the array.); #X connect 1 0 2 1; #X connect 2 0 4 0; #X connect 3 0 10 0; @@ -77,25 +77,27 @@ #X connect 11 0 1 0; #X connect 11 0 6 0; #X connect 16 0 11 0; -#X restore 268 418 pd Hann-window; -#X obj 97 410 output~; -#X obj 97 345 noise~; +#X restore 233 456 pd Hann-window; +#X obj 63 419 output~; +#X obj 63 354 noise~; #N canvas 0 0 450 300 (subpatch) 0; -#X array \$0-gain 256 float 1; -#A 0 0 0 0 0 0 0 0 0 0 0 0.686907 0.686907 0.697007 0.697007 0.707107 0.717207 0.717207 0.717207 0.727307 0.727307 0.727307 0.727307 0.732357 0.737407 0.737407 0.737407 0.742457 0.747508 0.747508 0.747508 0.747508 0.747508 0.747508 0.747508 0.747508 0.747508 0.752558 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.757608 0.754241 0.750874 0.747508 0.747508 0.747508 0.747508 0.742457 0.737407 0.737407 0.737407 0.737407 0.732357 0.727307 0.727307 0.727307 0.727307 0.722257 0.717207 0.717207 0.717207 0.712157 0.707107 0.707107 0.707107 0.707107 0.70374 0.700374 0.697007 0.697007 0.697007 0.697007 0.697007 0.697007 0.69364 0.690273 0.686907 0.686907 0.686907 0.686907 0.686907 0.686907 0.686907 0.686907 0.686907 0.686907 0.676807 0.676807 0.676807 0.676807 0.676807 0.676807 0.676807 0.666707 0.666707 0.666707 0.666707 0.656606 0.646506 0.101099 0.101099 0.101099 0.101099 0.101099 0.106149 0.1112 0.1112 0.1112 0.1213 0.1314 0.1415 0.1617 0.192001 0.212201 0.232401 0.282902 0.323302 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 255 -0.01 512 100 1 0 0; +#X array \$0-gain 256 float 0; +#X coords 0 1.025 255 -0.025 512 100 1 0 0; #X restore 54 205 graph; -#X msg 268 364 const 0; -#X obj 268 393 s \$0-gain; +#X obj 233 420 s \$0-gain; #X text 70 32 FOURIER RESYNTHESIS; #X text 38 294 0; #X text 38 195 1; #X text 51 304 0; #X text 548 307 22K; #X text 267 180 GAIN; -#X text 53 68 Using Fourier resynthesis you can take an incoming sound \, operate on its spectrum \, and hear the result. Here we start with white noise and apply a frequency-dependent gain \, which works as a graphic equalizer. There are N/2 = 256 points \, each spaced SR/512 Hz. apart (although their frequency ranges overlap). Open the "fft-analysis" patch to see the workings., f 68; -#X text 326 363 <= reset gain; #X obj 441 20 declare -stdpath ./; +#X text 53 68 Using Fourier resynthesis you can take an incoming sound \, operate on its spectrum \, and hear the result. Here we start with white noise and apply a frequency-dependent gain \, which works as a graphic equalizer. There are N/2 = 256 points \, each spaced SR/512 Hz. apart (although their frequency ranges overlap). Open the [pd fft-analysis] subpatch to see the workings., f 73; +#X text 291 390 <-- reset gain; +#X msg 233 391 const 1; +#X text 173 323 Click on the array to draw and change the gains.; +#X obj 233 364 loadbang; #X connect 0 0 3 0; #X connect 4 0 0 0; -#X connect 6 0 7 0; +#X connect 16 0 6 0; +#X connect 18 0 16 0; diff --git a/doc/3.audio.examples/I04.noisegate.pd b/doc/3.audio.examples/I04.noisegate.pd index 50bbc095..191522b8 100644 --- a/doc/3.audio.examples/I04.noisegate.pd +++ b/doc/3.audio.examples/I04.noisegate.pd @@ -17,49 +17,46 @@ #X obj 112 176 +~; #X obj 160 260 r mask-level; #X obj 93 422 /~; -#X obj 355 23 block~ 1024 4; -#X text 169 446 is signal power and "m" is mask.; #X obj 124 312 -~; #X obj 124 338 max~ 0; -#X text 168 464 (zero if s < m).; #X obj 142 236 tabreceive~ \$0-mask; #X obj 76 72 tabreceive~ \$0-hann; #X obj 69 590 tabreceive~ \$0-hann; -#N canvas 459 59 615 568 calculate-mask 0; -#X obj 37 99 inlet~; -#X msg 279 316 0; -#X msg 279 199 0; -#X obj 202 233 + 1; -#X obj 148 177 bang~; -#X obj 148 202 spigot; -#X floatatom 319 251 7 0 0 0 - - - 0; -#X obj 37 397 -~; -#X obj 279 286 sel 0; -#X obj 37 430 *~; -#X obj 102 488 +~; -#X floatatom 279 346 9 0 0 0 - - - 0; -#X obj 148 252 t f f; -#X obj 278 137 r make-mask; -#X obj 279 174 t b f; -#X obj 319 207 /; -#X floatatom 369 202 8 0 0 0 - - - 0; -#X obj 368 137 r window-msec; -#X obj 369 169 / 4; -#X text 409 166 hop size (analysis; -#X text 434 182 period) in msec; -#X obj 102 344 tabreceive~ \$0-mask; -#X obj 102 522 tabsend~ \$0-mask; -#X obj 279 251 <; -#X text 228 21 calculate a mask using N msec of background noise; -#X text 30 48 current power (for each channel), f 14; -#X text 164 425 average the current power into the last mask to get the new mask. The new value is weighted 1/n on the nth iteration.; -#X text 350 340 weight to average in new power to mask, f 20; -#X text 166 43 This loops for "make-mask" milliseconds \, averaging power in each channel over that amount of time. This is done by a moving average whose weight is adjusted to average each new value equally with each of the accumulating ones.; -#X text 391 245 number of frames; -#X text 61 191 loop counting to desired number of frames, f 10; -#X obj 148 229 f; -#X obj 180 278 + 1; -#X obj 180 302 expr 1/$f1; +#N canvas 459 59 615 591 calculate-mask 0; +#X obj 37 115 inlet~; +#X msg 279 332 0; +#X msg 279 215 0; +#X obj 202 249 + 1; +#X obj 148 193 bang~; +#X obj 148 218 spigot; +#X floatatom 319 267 7 0 0 0 - - - 0; +#X obj 37 413 -~; +#X obj 279 302 sel 0; +#X obj 37 446 *~; +#X obj 102 504 +~; +#X floatatom 279 362 9 0 0 0 - - - 0; +#X obj 148 268 t f f; +#X obj 279 153 r make-mask; +#X obj 279 190 t b f; +#X obj 319 223 /; +#X floatatom 369 218 8 0 0 0 - - - 0; +#X obj 369 153 r window-msec; +#X obj 369 185 / 4; +#X text 409 182 hop size (analysis; +#X text 430 198 period) in msec; +#X obj 102 360 tabreceive~ \$0-mask; +#X obj 102 538 tabsend~ \$0-mask; +#X obj 279 267 <; +#X text 216 20 calculate a mask using N msec of background noise; +#X text 30 64 current power (for each channel), f 14; +#X text 150 439 average the current power into the last mask to get the new mask. The new value is weighted 1/n on the nth iteration.; +#X text 350 356 weight to average in new power to mask, f 20; +#X text 166 59 This loops for "make-mask" milliseconds \, averaging power in each channel over that amount of time. This is done by a moving average whose weight is adjusted to average each new value equally with each of the accumulating ones., f 57; +#X text 379 268 number of frames; +#X text 61 207 loop counting to desired number of frames, f 10; +#X obj 148 245 f; +#X obj 180 294 + 1; +#X obj 180 318 expr 1/$f1; #X connect 0 0 7 0; #X connect 1 0 11 0; #X connect 2 0 23 0; @@ -92,21 +89,24 @@ #X connect 33 0 11 0; #X restore 129 203 pd calculate-mask; #X text 91 98 real Fourier transform; -#X obj 357 57 loadbang; #X text 186 338 ... but not less than zero; #X text 87 558 real inverse Fourier transform; -#X text 151 500 normalize by 2/(3N) where N is window size; +#X text 151 489 normalize by 2/(3N) where N is window size, f 23; #X text 161 312 current power ("s") minus level-adjusted mask ("m"); #X text 149 175 compute power (call it "s") in each channel; #X obj 111 398 +~ 1e-20; #X text 177 398 protect against division by zero; -#X text 172 426 compute sqrt((s-m)/s) where "s"; -#X obj 92 499 /~ 1536; -#X msg 357 80 \; window-size 1024; +#X obj 92 495 /~ 1536; #X text 257 203 <-- subwindow calculates noise mask; #X obj 92 448 sqrt~; +#X obj 303 38 r window-size; +#X msg 303 93 set \$1 4; +#X obj 303 124 block~; +#X text 145 431 compute sqrt((s-m)/s) where "s" is signal power and "m" is mask. (zero if s < m)., f 27; +#X floatatom 303 65 5 0 0 0 - - - 0; +#X text 375 87 set window size and overlap, f 15; #X connect 0 0 9 0; -#X connect 1 0 16 1; +#X connect 1 0 14 1; #X connect 2 0 11 1; #X connect 3 0 7 0; #X connect 4 0 8 1; @@ -120,104 +120,106 @@ #X connect 7 1 2 1; #X connect 8 0 0 0; #X connect 10 0 11 0; -#X connect 11 0 16 0; -#X connect 11 0 22 0; -#X connect 11 0 30 0; +#X connect 11 0 14 0; +#X connect 11 0 19 0; +#X connect 11 0 26 0; #X connect 12 0 1 1; -#X connect 13 0 36 0; -#X connect 16 0 17 0; -#X connect 17 0 13 0; -#X connect 19 0 1 0; -#X connect 20 0 3 1; -#X connect 21 0 0 1; -#X connect 24 0 34 0; -#X connect 30 0 13 1; -#X connect 33 0 6 1; -#X connect 33 0 4 1; -#X connect 36 0 33 0; +#X connect 13 0 30 0; +#X connect 14 0 15 0; +#X connect 15 0 13 0; +#X connect 16 0 1 0; +#X connect 17 0 3 1; +#X connect 18 0 0 1; +#X connect 26 0 13 1; +#X connect 28 0 6 1; +#X connect 28 0 4 1; +#X connect 30 0 28 0; +#X connect 31 0 35 0; +#X connect 32 0 33 0; +#X connect 35 0 32 0; #X restore 82 422 pd fft-analysis; -#N canvas 459 123 514 524 hann-window 0; +#N canvas 580 123 509 564 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 1024 float 0; -#X coords 0 1 1023 0 300 100 1; -#X restore 110 394 graph; -#X obj 327 184 osc~; -#X obj 327 209 *~ -0.5; -#X obj 327 233 +~ 0.5; -#X obj 310 276 tabwrite~ \$0-hann; -#X obj 86 113 r window-size; -#X obj 157 237 /; -#X obj 175 205 samplerate~; -#X obj 157 315 s window-sec; -#X obj 67 251 swap; -#X obj 67 275 /; -#X obj 67 299 s window-hz; -#X obj 168 265 * 1000; -#X obj 168 292 s window-msec; -#X obj 86 148 t f b f; -#X msg 175 155 resize \$1; -#X obj 175 179 s \$0-hann; -#X obj 279 122 r window-hz; -#X msg 352 154 0; -#X obj 279 150 t f b; -#X text 56 20 calculate Hann window table (variable window size) and constants window-hz (fundamental frequency of analysis) \, window-sec and window-msec (analysis window size in seconds and msec)., f 56; +#X coords 0 1 1023 0 227 152 1; +#X restore 234 283 graph; +#X obj 93 419 osc~; +#X obj 93 444 *~ -0.5; +#X obj 93 468 +~ 0.5; +#X obj 76 511 tabwrite~ \$0-hann; +#X obj 92 256 /; +#X obj 110 224 samplerate~; +#X obj 45 249 swap; +#X obj 45 273 /; +#X obj 92 284 * 1000; +#X obj 92 311 s window-msec; +#X obj 64 146 t f b f; +#X msg 110 174 resize \$1; +#X obj 110 198 s \$0-hann; +#X msg 118 389 0; +#X obj 45 385 t f b; +#X obj 64 24 loadbang; +#X msg 64 52 1024; +#X floatatom 64 79 5 0 0 0 - - - 0; +#X obj 77 117 s window-size; +#X text 107 52 default window size; +#X floatatom 45 347 8 0 0 0 - - - 0; +#X text 111 347 window hz; +#X text 224 128 Calculate Hann window table (variable window size) by getting the period of the window and Hz. Also get the analysis window size in seconds and msec., f 33; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 3 0 4 0; -#X connect 5 0 14 0; -#X connect 6 0 8 0; -#X connect 6 0 12 0; -#X connect 7 0 6 1; -#X connect 7 0 9 1; +#X connect 5 0 9 0; +#X connect 6 0 5 1; +#X connect 6 0 7 1; +#X connect 7 0 8 0; +#X connect 7 1 8 1; +#X connect 8 0 21 0; #X connect 9 0 10 0; -#X connect 9 1 10 1; -#X connect 10 0 11 0; +#X connect 11 0 5 0; +#X connect 11 0 7 0; +#X connect 11 1 6 0; +#X connect 11 2 12 0; #X connect 12 0 13 0; -#X connect 14 0 6 0; -#X connect 14 0 9 0; -#X connect 14 1 7 0; -#X connect 14 2 15 0; -#X connect 15 0 16 0; -#X connect 17 0 19 0; -#X connect 18 0 1 1; -#X connect 19 0 1 0; -#X connect 19 1 4 0; -#X connect 19 1 18 0; +#X connect 14 0 1 1; +#X connect 15 0 1 0; +#X connect 15 1 4 0; +#X connect 15 1 14 0; +#X connect 16 0 17 0; +#X connect 17 0 18 0; +#X connect 18 0 19 0; +#X connect 18 0 11 0; +#X connect 21 0 15 0; #X restore 354 467 pd hann-window; #X text 172 334 noise; -#N canvas 324 211 733 427 insample 0; +#N canvas 636 235 719 406 insample 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-sample 155944 float 2; -#X coords 0 1 155944 -1 400 150 1; -#X restore 282 77 graph; -#X obj 65 65 r read-sample; -#X obj 65 126 unpack s f; -#X obj 162 126 s insamprate; -#X obj 65 236 soundfiler; -#X obj 65 260 s insamplength; -#X text 159 304 read a sample; -#X obj 79 303 loadbang; -#X obj 65 152 t s b; -#X obj 118 158 symbol \$0-sample; -#X obj 65 187 pack s s; -#X msg 65 212 read -resize \$1 \$2; -#X msg 79 327 \; read-sample ../sound/bell.aiff; -#X msg 77 374 \; read-sample ../sound/voice.wav; -#X obj 65 99 t a b; -#X obj 162 98 f 44100; -#X connect 1 0 14 0; -#X connect 2 0 8 0; -#X connect 2 1 3 0; -#X connect 4 0 5 0; -#X connect 7 0 12 0; -#X connect 8 0 10 0; -#X connect 8 1 9 0; -#X connect 9 0 10 1; -#X connect 10 0 11 0; -#X connect 11 0 4 0; -#X connect 14 0 2 0; -#X connect 14 1 15 0; -#X connect 15 0 3 0; +#X coords 0 1 155944 -1 375 207 1; +#X restore 317 102 graph; +#X obj 65 187 r read-sample; +#X obj 179 338 s insamprate; +#X obj 65 300 soundfiler; +#X obj 65 338 s insamplength; +#X text 115 40 read a sample; +#X obj 35 39 loadbang; +#X obj 118 217 symbol \$0-sample; +#X obj 65 246 pack s s; +#X msg 65 271 read -resize \$1 \$2; +#X msg 35 63 \; read-sample ../sound/bell.aiff; +#X msg 35 122 \; read-sample ../sound/voice.wav; +#X msg 179 308 \$1; +#X obj 65 218 t a b; +#X connect 1 0 13 0; +#X connect 3 0 4 0; +#X connect 3 1 12 0; +#X connect 6 0 10 0; +#X connect 7 0 8 1; +#X connect 8 0 9 0; +#X connect 9 0 3 0; +#X connect 12 0 2 0; +#X connect 13 0 8 0; +#X connect 13 1 7 0; #X restore 354 445 pd insample; #X obj 274 397 s mask-level; #X floatatom 177 358 6 0 100 0 - - - 0; @@ -226,7 +228,7 @@ #X text 275 295 masking; #X text 107 12 DENOISER; #X msg 319 335 0; -#N canvas 500 38 431 582 test-signal 0; +#N canvas 228 38 431 582 test-signal 0; #X obj 89 316 line~; #X obj 213 152 r insamprate; #X obj 246 451 *~; @@ -283,9 +285,9 @@ #X connect 27 0 26 0; #X restore 82 387 pd test-signal; #X text 76 332 sampler; -#X text 418 323 calculate noise mask, f 10; +#X text 416 320 calculate noise mask, f 10; #X obj 82 459 output~; -#X msg 414 358 \; make-mask 2000; +#X msg 405 358 \; make-mask 2000; #X msg 274 334 15; #N canvas 647 275 498 424 mask-table 0; #N canvas 0 0 450 300 (subpatch) 0; @@ -295,9 +297,9 @@ #X text 108 22 This table is the average power measured in each channel of the spectrum \, presumed to represent the noise floor., f 41; #X restore 354 489 pd mask-table; #X text 99 301 amplitudes (dB); -#X text 50 47 This patch attempts to scrub the noise floor from a sample in two steps. First using the "make-mask" message (which is caught in the "fft-analysis" window) \, you estimate the background spectrum. You would normally do this at a moment when only the background noise is audible. Then \, turn on "masking" (to 15 by default \, but try other values) and the patch will try to clean the background noise out of a signal., f 65; -#X text 50 153 For this demonstration \, you control the amplitudes of a looping sample and a filtered noise source. Normally you'd hit "calculate noise mask" with only the noise turned on \, then turn both the noise and the sampler on \, and also "masking" \, to see if the patch can clean the noise out of the signal. Open the "fft-analysis" window to see the algorithm \, or the "insample" window to change samples \, or "mask-table" to see the current mask (the average signal power of the noise to clean out of the signal)., f 65; #X obj 396 13 declare -stdpath ./; +#X text 50 47 This patch attempts to scrub the noise floor from a sample in two steps. First using the "make-mask" message (which is caught in the [pd fft-analysis] subpatch) \, you estimate the background spectrum. You would normally do this at a moment when only the background noise is audible. Then \, turn on "masking" (to 15 by default \, but try other values) and the patch will try to clean the background noise out of a signal., f 65; +#X text 50 153 For this demonstration \, you control the amplitudes of a looping sample and a filtered noise source. Normally you'd hit "calculate noise mask" with only the noise turned on \, then turn both the noise and the sampler on \, and also "masking" \, to see if the patch can clean the noise out of the signal. Open the [pd fft-analysis] window to see the algorithm \, or the "insample" window to change samples \, or "mask-table" to see the current mask (the average signal power of the noise to clean out of the signal)., f 65; #X connect 0 0 6 0; #X connect 1 0 13 0; #X connect 2 0 16 0; diff --git a/doc/3.audio.examples/I05.compressor.pd b/doc/3.audio.examples/I05.compressor.pd index 0a099aba..9e5d7ef1 100644 --- a/doc/3.audio.examples/I05.compressor.pd +++ b/doc/3.audio.examples/I05.compressor.pd @@ -1,4 +1,4 @@ -#N canvas 483 68 545 468 12; +#N canvas 500 65 576 508 12; #X declare -stdpath ./; #N canvas 394 108 652 570 fft-analysis 0; #X obj 101 425 *~; @@ -12,12 +12,10 @@ #X obj 62 511 outlet~; #X obj 119 189 *~; #X obj 119 212 +~; -#X obj 319 116 block~ 1024 4; #X obj 119 363 clip~; #X obj 151 315 r squelch; #X obj 97 124 tabreceive~ \$0-hann; #X obj 151 338 expr 0.01*$f1*$f1; -#X obj 448 117 loadbang; #X obj 119 393 *~ 0.00065; #X obj 119 237 +~ 1e-20; #X obj 100 482 tabreceive~ \$0-hann; @@ -28,9 +26,11 @@ #X text 117 149 outputs complex amplitudes; #X text 166 363 limit the gain to squelch * squelch/100; #X text 131 416 multiply gain by real and complex part of the amplitude, f 29; -#X msg 448 140 \; window-size 1024 \; squelch 10 \; squelch-set set 10; #X obj 119 274 rsqrt~; #X text 169 274 reciprocal square root; +#X obj 360 113 r window-size; +#X msg 360 139 set \$1 4; +#X obj 360 165 block~; #X connect 0 0 7 1; #X connect 1 0 7 0; #X connect 2 0 4 0; @@ -45,178 +45,181 @@ #X connect 6 0 10 1; #X connect 7 0 5 0; #X connect 9 0 10 0; -#X connect 10 0 18 0; -#X connect 12 0 17 0; -#X connect 13 0 15 0; -#X connect 14 0 2 1; -#X connect 15 0 12 2; -#X connect 16 0 27 0; -#X connect 17 0 0 1; -#X connect 17 0 1 1; -#X connect 18 0 28 0; -#X connect 19 0 5 1; -#X connect 28 0 12 0; -#X restore 85 301 pd fft-analysis; -#X floatatom 74 179 5 0 500 0 - squelch-set - 0; -#X obj 74 203 s squelch; -#N canvas 240 72 458 613 test-signal 0; -#X obj 134 457 line~; -#X obj 134 537 outlet~; -#X msg 134 432 0 \, \$1 \$2; -#X obj 187 353 /; -#X obj 271 322 * 0.001; -#X obj 134 510 hip~ 5; -#X obj 87 236 loadbang; -#X msg 87 331 1; -#X obj 87 353 metro 1000; -#X obj 225 292 t b b f; -#X obj 107 291 t b f; -#X obj 134 482 tabread4~ \$0-sample; -#X text 76 43 test signal: looped sample playback; -#X obj 129 153 hip~ 5; -#X obj 129 129 adc~ 1; -#X obj 191 147 s insamprate; -#X obj 119 82 inlet; -#X obj 191 123 samplerate~; -#X obj 106 267 r \$0-samplength; -#X obj 225 266 r \$0-insamprate; -#X obj 119 176 tabwrite~ \$0-sample; -#X obj 134 406 pack f f; -#X obj 87 378 float; +#X connect 10 0 16 0; +#X connect 11 0 15 0; +#X connect 12 0 14 0; +#X connect 13 0 2 1; +#X connect 14 0 11 2; +#X connect 15 0 0 1; +#X connect 15 0 1 1; +#X connect 16 0 25 0; +#X connect 17 0 5 1; +#X connect 25 0 11 0; +#X connect 27 0 28 0; +#X connect 28 0 29 0; +#X restore 114 294 pd fft-analysis; +#X floatatom 161 196 5 1 200 0 squelch squelch-set squelch 16; +#N canvas 406 293 420 439 test-signal 0; +#X obj 126 276 line~; +#X obj 126 369 outlet~; +#X msg 126 251 0 \, \$1 \$2; +#X obj 179 172 /; +#X obj 263 141 * 0.001; +#X obj 126 329 hip~ 5; +#X obj 79 55 loadbang; +#X msg 79 150 1; +#X obj 79 172 metro 1000; +#X obj 217 111 t b b f; +#X obj 99 110 t b f; +#X obj 126 301 tabread4~ \$0-sample; +#X text 63 10 test signal: looped sample playback; +#X obj 98 86 r \$0-samplength; +#X obj 217 85 r \$0-insamprate; +#X obj 126 225 pack f f; +#X obj 79 197 float; #X connect 0 0 11 0; #X connect 2 0 0 0; #X connect 3 0 8 1; -#X connect 3 0 21 1; +#X connect 3 0 15 1; #X connect 4 0 3 1; #X connect 5 0 1 0; #X connect 6 0 7 0; #X connect 7 0 8 0; -#X connect 8 0 22 0; +#X connect 8 0 16 0; #X connect 9 0 7 0; #X connect 9 1 3 0; #X connect 9 2 4 0; #X connect 10 0 7 0; #X connect 10 1 3 0; -#X connect 10 1 22 1; +#X connect 10 1 16 1; #X connect 11 0 5 0; -#X connect 13 0 20 0; -#X connect 14 0 13 0; -#X connect 16 0 17 0; -#X connect 16 0 20 0; -#X connect 17 0 15 0; -#X connect 18 0 10 0; -#X connect 19 0 9 0; -#X connect 21 0 2 0; -#X connect 22 0 21 0; -#X restore 85 270 pd test-signal; -#X obj 85 334 output~; -#N canvas 444 61 689 350 insample 0; +#X connect 13 0 10 0; +#X connect 14 0 9 0; +#X connect 15 0 2 0; +#X connect 16 0 15 0; +#X restore 114 263 pd test-signal; +#X obj 114 327 output~; +#N canvas 444 61 780 500 insample 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-sample 155944 float 2; -#X coords 0 1 155944 -1 400 150 1; -#X restore 262 48 graph; -#X obj 27 24 r read-sample; -#X obj 27 80 unpack s f; -#X obj 27 190 soundfiler; -#X text 364 250 read a sample; -#X obj 293 249 loadbang; -#X obj 27 106 t s b; -#X obj 80 111 symbol \$0-sample; -#X obj 27 141 pack s s; -#X msg 27 166 read -resize \$1 \$2; -#X obj 27 53 t a b; -#X msg 293 273 \; read-sample ../sound/bell.aiff; -#X obj 37 218 s \$0-samplength; -#X obj 124 80 s \$0-insamprate; -#X obj 27 253 /; -#X obj 27 287 * 1000; -#X obj 27 310 s \$0-samp-msec; -#X obj 65 253 r \$0-insamprate; -#X obj 124 54 f 44100; -#X connect 1 0 10 0; -#X connect 2 0 6 0; -#X connect 2 1 13 0; -#X connect 3 0 12 0; -#X connect 3 0 14 0; -#X connect 5 0 11 0; -#X connect 6 0 8 0; -#X connect 6 1 7 0; -#X connect 7 0 8 1; -#X connect 8 0 9 0; -#X connect 9 0 3 0; -#X connect 10 0 2 0; -#X connect 10 1 18 0; -#X connect 14 0 15 0; +#X coords 0 1 155944 -1 347 169 1; +#X restore 364 263 graph; +#X obj 74 174 soundfiler; +#X obj 127 84 symbol \$0-sample; +#X obj 74 114 pack s s; +#X msg 74 145 read -resize \$1 \$2; +#X obj 138 262 s \$0-samplength; +#X obj 74 247 /; +#X obj 74 281 * 1000; +#X obj 74 43 inlet; +#X obj 271 334 outlet; +#X msg 141 202 \$1; +#X obj 141 232 s \$0-insamprate; +#X obj 74 79 t a b; +#X obj 316 107 hip~ 5; +#X obj 316 83 adc~ 1; +#X obj 303 33 inlet; +#X obj 452 83 samplerate~; +#X obj 303 155 tabwrite~ \$0-sample; +#X obj 452 198 s \$0-insamprate; +#X obj 465 167 s \$0-sample; +#X msg 465 140 resize \$1; +#X obj 465 111 * 2; +#X text 536 140 2 seconds; +#X msg 271 191 2000; +#X connect 1 0 5 0; +#X connect 1 0 6 0; +#X connect 1 1 10 0; +#X connect 2 0 3 1; +#X connect 3 0 4 0; +#X connect 4 0 1 0; +#X connect 6 0 7 0; +#X connect 7 0 9 0; +#X connect 8 0 12 0; +#X connect 10 0 6 1; +#X connect 10 0 11 0; +#X connect 12 0 3 0; +#X connect 12 1 2 0; +#X connect 13 0 17 0; +#X connect 14 0 13 0; #X connect 15 0 16 0; -#X connect 17 0 14 1; -#X connect 18 0 13 0; -#X restore 299 314 pd insample; -#X text 291 420 updated for Pd version 0.39; -#X text 53 49 Here we divide each complex channel in the Fourier analysis by its own magnitude to "flatten" the spectrum. The "squelch" control limits the amplitude boost the algorithm will apply. If infinite \, you'll get a white spectrum. If less \, the louder parts of the spectrum will be flattened but the quieter ones will only be boosted by the squelch value.; -#X text 74 12 DYNAMIC RANGE COMPRESSION BY FOURIER ANALYSIS CHANNEL; -#X floatatom 299 367 8 0 0 0 - \$0-samp-msec - 0; -#X obj 85 239 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 369 366 sample length \, msec; -#X msg 293 189 ../sound/bell.aiff; -#X msg 299 212 ../sound/voice.wav; -#X msg 305 236 ../sound/voice2.wav; -#X text 296 167 change input sound; -#X obj 293 265 s read-sample; -#N canvas 796 122 565 538 hann-window 0; +#X connect 15 0 17 0; +#X connect 15 0 23 0; +#X connect 16 0 18 0; +#X connect 16 0 21 0; +#X connect 20 0 19 0; +#X connect 21 0 20 0; +#X connect 23 0 9 0; +#X restore 299 323 pd insample; +#X text 92 431 updated for Pd version 0.39; +#X text 63 61 Here we divide each complex channel in the Fourier analysis by its own magnitude to "flatten" the spectrum. The "squelch" control limits the amplitude boost the algorithm will apply. If infinite \, you'll get a white spectrum. If less \, the louder parts of the spectrum will be flattened but the quieter ones will only be boosted by the squelch value., f 61; +#X text 84 24 DYNAMIC RANGE COMPRESSION BY FOURIER ANALYSIS CHANNEL; +#X floatatom 299 359 8 0 0 0 - - - 0; +#X obj 373 293 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 364 360 sample length \, msec; +#X msg 290 207 ../sound/bell.aiff; +#X msg 299 230 ../sound/voice.wav; +#X msg 307 254 ../sound/voice2.wav; +#X text 448 205 change input sound, f 7; +#X obj 290 179 loadbang; +#N canvas 580 123 518 506 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 1024 float 0; -#X coords 0 1 1023 0 300 100 1; -#X restore 110 394 graph; -#X obj 327 184 osc~; -#X obj 327 209 *~ -0.5; -#X obj 327 233 +~ 0.5; -#X obj 310 276 tabwrite~ \$0-hann; -#X obj 86 113 r window-size; -#X obj 157 237 /; -#X obj 175 205 samplerate~; -#X obj 157 315 s window-sec; -#X obj 67 251 swap; -#X obj 67 275 /; -#X obj 67 299 s window-hz; -#X obj 168 265 * 1000; -#X obj 168 292 s window-msec; -#X obj 86 148 t f b f; -#X msg 175 155 resize \$1; -#X obj 175 179 s \$0-hann; -#X obj 279 122 r window-hz; -#X msg 352 154 0; -#X obj 279 150 t f b; -#X text 56 20 calculate Hann window table (variable window size) and constants window-hz (fundamental frequency of analysis) \, window-sec and window-msec (analysis window size in seconds and msec)., f 56; +#X coords 0 1 1023 0 227 152 1; +#X restore 240 262 graph; +#X obj 112 366 osc~; +#X obj 112 391 *~ -0.5; +#X obj 112 415 +~ 0.5; +#X obj 95 458 tabwrite~ \$0-hann; +#X obj 64 236 swap; +#X obj 64 260 /; +#X msg 140 150 resize \$1; +#X obj 140 174 s \$0-hann; +#X msg 137 336 0; +#X obj 64 332 t f b; +#X obj 64 30 loadbang; +#X msg 64 58 1024; +#X floatatom 64 85 5 0 0 0 - - - 0; +#X obj 75 114 s window-size; +#X text 107 58 default window size; +#X floatatom 64 294 8 0 0 0 - - - 0; +#X text 130 294 window hz; +#X text 234 126 Calculate Hann window table (variable window size) by getting the period of the window and Hz. Also get the analysis window size in seconds and msec., f 33; +#X obj 89 206 samplerate~; +#X obj 64 160 t f b f; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 3 0 4 0; -#X connect 5 0 14 0; -#X connect 6 0 8 0; -#X connect 6 0 12 0; -#X connect 7 0 6 1; -#X connect 7 0 9 1; -#X connect 9 0 10 0; -#X connect 9 1 10 1; -#X connect 10 0 11 0; +#X connect 5 0 6 0; +#X connect 5 1 6 1; +#X connect 6 0 16 0; +#X connect 7 0 8 0; +#X connect 9 0 1 1; +#X connect 10 0 1 0; +#X connect 10 1 4 0; +#X connect 10 1 9 0; +#X connect 11 0 12 0; #X connect 12 0 13 0; -#X connect 14 0 6 0; -#X connect 14 0 9 0; -#X connect 14 1 7 0; -#X connect 14 2 15 0; -#X connect 15 0 16 0; -#X connect 17 0 19 0; -#X connect 18 0 1 1; -#X connect 19 0 1 0; -#X connect 19 1 4 0; -#X connect 19 1 18 0; -#X restore 299 336 pd hann-window; -#X obj 75 416 declare -stdpath ./; -#X text 113 242 <-- record; -#X text 117 179 <-- squelch; -#X connect 0 0 4 0; +#X connect 13 0 14 0; +#X connect 13 0 20 0; +#X connect 16 0 10 0; +#X connect 19 0 5 1; +#X connect 20 0 5 0; +#X connect 20 1 19 0; +#X connect 20 2 7 0; +#X restore 322 434 pd hann-window; +#X text 401 296 <-- record 2 seconds, f 10; +#N canvas 208 188 323 266 init 0; +#X obj 60 146 declare -stdpath ./; +#X obj 64 61 loadbang; +#X msg 64 87 \; squelch-set 10; #X connect 1 0 2 0; -#X connect 3 0 0 0; -#X connect 10 0 3 0; -#X connect 12 0 16 0; -#X connect 13 0 16 0; -#X connect 14 0 16 0; +#X restore 457 434 pd init; +#X connect 0 0 3 0; +#X connect 2 0 0 0; +#X connect 4 0 8 0; +#X connect 9 0 4 1; +#X connect 11 0 4 0; +#X connect 12 0 4 0; +#X connect 13 0 4 0; +#X connect 15 0 11 0; diff --git a/doc/3.audio.examples/I06.timbre.stamp.pd b/doc/3.audio.examples/I06.timbre.stamp.pd index cd7c1f33..4e276dc5 100644 --- a/doc/3.audio.examples/I06.timbre.stamp.pd +++ b/doc/3.audio.examples/I06.timbre.stamp.pd @@ -1,13 +1,13 @@ -#N canvas 485 38 631 544 12; +#N canvas 441 38 631 544 12; #X declare -stdpath ./; -#N canvas 352 24 545 673 fft-analysis 0; +#N canvas 352 38 545 673 fft-analysis 0; #X obj 92 534 *~; #X obj 53 534 *~; #X obj 330 325 *~; #X obj 298 325 *~; #X obj 298 351 +~; #X obj 53 176 *~; -#X obj 53 151 inlet~; +#X obj 53 147 inlet~; #X obj 53 199 rfft~; #X obj 53 603 *~; #X obj 144 238 *~; @@ -16,41 +16,34 @@ #X obj 53 636 outlet~; #X obj 110 238 *~; #X obj 110 261 +~; -#X text 379 355 modulus; #X obj 110 443 *~; #X obj 357 459 block~ 1024 4; #X obj 110 391 clip~; #X obj 86 177 tabreceive~ \$0-hann; #X obj 356 499 loadbang; -#X obj 143 342 r squelch; +#X obj 142 341 r squelch; #X obj 142 365 expr 0.01*$f1*$f1; #X obj 110 287 +~ 1e-20; #X obj 110 503 *~ 0.00065; #X obj 86 603 tabreceive~ \$0-hann; #X obj 298 268 *~; -#X obj 298 239 inlet~; -#X obj 331 269 tabreceive~ \$0-hann; -#X text 379 372 of control; -#X text 377 389 amplitude; -#X text 187 242 reciprocal; -#X text 190 261 modulus of; -#X text 186 281 filter input; -#X text 187 300 amplitude; -#X text 114 152 filter input; -#X text 363 239 control source; +#X obj 298 147 inlet~; +#X obj 316 237 tabreceive~ \$0-hann; +#X text 108 146 filter input; +#X text 356 146 control source; #X text 360 296 Fourier transform; #X text 43 19 Internal workings of the timbre stamping algorithm. First the "filter input" is treated as in the compressor patch \, multiplying each channel amplitude by one over its modulus (but limited by the "squelch" parameter.) It is then multiplied by the modulus of the channel amplitude for the control source (which is Fourier analyzed in parallel with the filter input.); -#X text 148 440 multiply the two amplitude; -#X text 146 457 factors (for compression; -#X text 148 473 and to apply new timbre); #X msg 356 522 \; window-size 1024 \; squelch 30 \; squelch-set set 30; -#X obj 110 314 rsqrt~; +#X obj 110 312 rsqrt~; #X obj 298 374 sqrt~; +#X text 365 353 modulus of control amplitude, f 10; +#X text 148 440 multiply the two amplitude factors (for compression and to apply new timbre), f 26; +#X text 181 254 reciprocal modulus of filter input amplitude, f 12; #X connect 0 0 11 1; #X connect 1 0 11 0; #X connect 2 0 4 1; #X connect 3 0 4 0; -#X connect 4 0 44 0; +#X connect 4 0 34 0; #X connect 5 0 7 0; #X connect 6 0 5 0; #X connect 7 0 13 0; @@ -67,28 +60,28 @@ #X connect 10 1 2 1; #X connect 11 0 8 0; #X connect 13 0 14 0; -#X connect 14 0 23 0; -#X connect 16 0 24 0; -#X connect 18 0 16 0; -#X connect 19 0 5 1; -#X connect 20 0 42 0; -#X connect 21 0 22 0; -#X connect 22 0 18 2; -#X connect 23 0 43 0; -#X connect 24 0 0 1; -#X connect 24 0 1 1; -#X connect 25 0 8 1; -#X connect 26 0 10 0; -#X connect 27 0 26 0; -#X connect 28 0 26 1; -#X connect 43 0 18 0; -#X connect 44 0 16 1; +#X connect 14 0 22 0; +#X connect 15 0 23 0; +#X connect 17 0 15 0; +#X connect 18 0 5 1; +#X connect 19 0 32 0; +#X connect 20 0 21 0; +#X connect 21 0 17 2; +#X connect 22 0 33 0; +#X connect 23 0 0 1; +#X connect 23 0 1 1; +#X connect 24 0 8 1; +#X connect 25 0 10 0; +#X connect 26 0 25 0; +#X connect 27 0 25 1; +#X connect 33 0 17 0; +#X connect 34 0 15 1; #X restore 103 421 pd fft-analysis; #X text 41 399 filter; #X text 43 414 input; #X text 223 415 source; #X text 224 396 control; -#X floatatom 54 262 4 0 500 0 - squelch-set - 0; +#X floatatom 54 252 4 0 500 0 - squelch-set - 16; #X obj 54 286 s squelch; #X obj 103 457 output~; #X msg 158 240 ../sound/bell.aiff; @@ -102,7 +95,7 @@ #X text 347 218 control source; #X text 170 217 filter input; #X text 246 193 change input sounds; -#X floatatom 413 383 8 0 0 0 - \$0-samp-msec - 0; +#X floatatom 433 383 8 0 0 0 - \$0-samp-msec - 0; #N canvas 386 50 626 626 test-signals 0; #X obj 80 481 line~; #X obj 80 561 outlet~; @@ -203,8 +196,8 @@ #X f 16; #N canvas 388 86 710 358 insample2 0; #N canvas 0 50 450 300 (subpatch) 0; -#X array \$0-sample2 62079 float 0; -#X coords 0 1 62078 -1 400 150 1; +#X array \$0-sample2 62079 float 2; +#X coords 0 1 62079 -1 400 150 1; #X restore 275 54 graph; #X obj 27 74 unpack s f; #X obj 26 191 soundfiler; @@ -241,7 +234,7 @@ #X connect 13 0 6 1; #X connect 15 0 9 1; #X connect 18 0 12 0; -#X restore 293 404 pd insample2; +#X restore 313 404 pd insample2; #N canvas 498 195 722 350 insample1 0; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-sample 155944 float 2; @@ -282,8 +275,8 @@ #X connect 15 0 12 1; #X connect 16 0 9 0; #X connect 18 0 11 0; -#X restore 293 382 pd insample1; -#X floatatom 412 406 8 0 0 0 - \$0-samp2-msec - 0; +#X restore 313 382 pd insample1; +#X floatatom 432 406 8 0 0 0 - \$0-samp2-msec - 0; #N canvas 163 152 567 523 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 1024 float 0; @@ -331,9 +324,9 @@ #X connect 19 0 1 0; #X connect 19 1 4 0; #X connect 19 1 18 0; -#X restore 293 427 pd hann-window; -#X text 475 383 sample lengths \,; -#X text 479 406 msec; +#X restore 313 427 pd hann-window; +#X text 495 383 sample lengths \,; +#X text 499 406 msec; #X text 61 54 This is a Fourier-based "vocoder" (perhaps better called a "timbre stamp") like the one the Convolution brothers use. The "control source" is analyzed to get its spectral envelope \, which is then stamped onto the "filter input" by adjusting the amplitudes of its Fourier transform. The "filter input" is first whitened by the compression algorithm from the previous patch in this series. The best value of "squelch" to use depends critically on what kind of sounds are used for the filter input and the control source., f 67; #X text 387 475 updated for Pd version 0.39; #X obj 451 20 declare -stdpath ./; diff --git a/doc/3.audio.examples/I07.phase.vocoder.pd b/doc/3.audio.examples/I07.phase.vocoder.pd index 8178449e..a34dfb94 100644 --- a/doc/3.audio.examples/I07.phase.vocoder.pd +++ b/doc/3.audio.examples/I07.phase.vocoder.pd @@ -1,9 +1,9 @@ -#N canvas 388 26 672 589 12; +#N canvas 388 38 672 589 12; #X declare -stdpath ./; #X floatatom 404 277 5 0 0 0 - transpo-set - 0; #X floatatom 123 317 5 0 0 0 - speed-set - 0; #X floatatom 30 319 7 0 0 0 - location-set - 0; -#N canvas 457 34 740 709 fft-analysis 0; +#N canvas 457 38 740 709 fft-analysis 0; #X obj 54 483 *~; #X obj 21 483 *~; #X obj 21 505 -~; @@ -454,7 +454,6 @@ #X text 530 252 samples; #X text 72 240 ------- location controls -------; #X obj 286 344 s auto; -#X text 38 65 This patch takes a sound \, analyzes windows in it both for channel magnitude and for phase precession in each channel (compared to another overlapping window). The real-time output recreates the same magnitudes and phase precession \, although the phases themselves are in general different. You can control either the location or its motion (setting location stops motion \, while setting a non-zero motion causes the location to change automatically). "Rewind" goes back to the beginning. You can use different window sizes (use the message boxes - the number box is for readout). The "lock" feature forces phase coherency between neighboring channels \, which makes a more present sound but can add artifacts to the sound. Look in "pd fft-analysis" to see the workings., f 82; #X obj 402 243 bng 22 250 50 0 no-detune empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X text 41 20 PHASE VOCODER FOR TIME STRETCHING AND CONTRACTION; #X obj 467 18 declare -stdpath ./; @@ -469,6 +468,7 @@ #X text 371 439 record -->; #X text 517 484 sample length in msec, f 13; #X text 521 430 window size; +#X text 38 65 This patch takes a sound \, analyzes windows in it both for channel magnitude and for phase precession in each channel (compared to another overlapping window). The real-time output recreates the same magnitudes and phase precession \, although the phases themselves are in general different. You can control either the location or its motion (setting location stops motion \, while setting a non-zero motion causes the location to change automatically). "Rewind" goes back to the beginning. You can use different window sizes (use the message boxes - the number box is for readout). The "lock" feature forces phase coherency between neighboring channels \, which makes a more present sound but can add artifacts to the sound. Look into the [pd fft-analysis] subppatch to see the workings., f 82; #X connect 0 0 4 0; #X connect 1 0 17 0; #X connect 2 0 16 0; @@ -484,6 +484,6 @@ #X connect 32 0 35 0; #X connect 33 0 35 0; #X connect 34 0 35 0; -#X connect 44 0 18 0; -#X connect 45 0 9 0; -#X connect 46 0 9 1; +#X connect 43 0 18 0; +#X connect 44 0 9 0; +#X connect 45 0 9 1; diff --git a/doc/3.audio.examples/I08.pvoc.reverb.pd b/doc/3.audio.examples/I08.pvoc.reverb.pd index 0053ca6a..dc8d1f65 100644 --- a/doc/3.audio.examples/I08.pvoc.reverb.pd +++ b/doc/3.audio.examples/I08.pvoc.reverb.pd @@ -1,6 +1,6 @@ -#N canvas 441 74 551 460 12; +#N canvas 514 91 551 460 12; #X declare -stdpath ./; -#N canvas 359 23 837 719 fft 0; +#N canvas 359 38 837 719 fft 0; #X obj 63 584 *~; #X obj 288 539 *~; #X obj 259 538 *~; @@ -25,30 +25,30 @@ #X obj 243 173 +~; #X obj 397 470 *~; #X obj 101 583 sig~ 0.0002; -#N canvas 167 161 699 396 decision 0; -#X obj 49 101 inlet~; -#X obj 50 341 outlet~; -#X obj 50 183 -~; -#X obj 50 226 clip~ 0 1; -#X obj 50 204 *~ 1e+20; -#X obj 196 98 inlet~; -#X text 137 213 stronger than; -#X text 139 228 old one; -#X obj 274 202 -~; -#X obj 288 177 lrshift~ 1; -#X obj 274 250 clip~ 0 1; -#X obj 274 228 *~ 1e+20; -#X obj 450 202 -~; -#X obj 450 250 clip~ 0 1; -#X obj 450 228 *~ 1e+20; -#X obj 464 177 lrshift~ -1; -#X obj 50 283 *~; -#X obj 50 312 *~; -#X text 135 199 1 if new signal; -#X text 55 73 new; -#X text 203 70 old; -#X text 51 12 Choose whether to replace the "old" signal with the "new" one. The "new" one must be stronger than the old one and also must be stronger than its two neighboring channels; -#X text 267 283 1 if we're louder than neighbor; +#N canvas 167 161 701 458 decision 0; +#X obj 298 131 inlet~; +#X obj 279 400 outlet~; +#X obj 74 213 -~; +#X obj 74 256 clip~ 0 1; +#X obj 74 234 *~ 1e+20; +#X obj 445 128 inlet~; +#X text 161 243 stronger than; +#X text 163 258 old one; +#X obj 298 232 -~; +#X obj 316 207 lrshift~ 1; +#X obj 298 280 clip~ 0 1; +#X obj 298 258 *~ 1e+20; +#X obj 474 212 -~; +#X obj 474 260 clip~ 0 1; +#X obj 474 238 *~ 1e+20; +#X obj 492 187 lrshift~ -1; +#X obj 279 342 *~; +#X obj 279 371 *~; +#X text 159 229 1 if new signal; +#X text 304 103 new; +#X text 452 100 old; +#X text 135 27 Choose whether to replace the "old" signal with the "new" one. The "new" one must be stronger than the old one and also must be stronger than its two neighboring channels; +#X text 419 327 1 if we're louder than neighbor; #X connect 0 0 2 0; #X connect 0 0 9 0; #X connect 0 0 8 0; @@ -106,20 +106,20 @@ #X obj 61 160 inlet~; #X obj 149 96 inlet~; #X obj 211 97 inlet~; -#X obj 315 94 inlet~; -#X obj 375 94 inlet~; -#X obj 409 182 -~; -#X obj 380 228 +~; -#X obj 414 226 *~; -#X obj 292 179 -~; -#X obj 262 225 +~; -#X obj 296 225 *~; -#X obj 261 275 outlet~; -#X obj 380 271 outlet~; +#X obj 284 94 inlet~; +#X obj 352 94 inlet~; +#X obj 384 182 -~; +#X obj 350 228 +~; +#X obj 384 226 *~; +#X obj 266 179 -~; +#X obj 232 225 +~; +#X obj 266 225 *~; +#X obj 231 275 outlet~; +#X obj 350 271 outlet~; #X text 88 25 switch between two pairs of inputs. If first inlet is one \, take the left-hand pair \, otherwise the right-hand one.; #X text 57 137 switch; #X text 134 73 pass this if one; -#X text 311 74 pass this if zero; +#X text 280 74 pass this if zero; #X connect 0 0 10 1; #X connect 0 0 7 1; #X connect 1 0 8 0; diff --git a/doc/3.audio.examples/I09.sheep.from.goats.pd b/doc/3.audio.examples/I09.sheep.from.goats.pd index 06dce2c6..60d7b2ea 100644 --- a/doc/3.audio.examples/I09.sheep.from.goats.pd +++ b/doc/3.audio.examples/I09.sheep.from.goats.pd @@ -1,6 +1,6 @@ #N canvas 495 50 618 619 12; #X declare -stdpath ./; -#N canvas 447 23 682 723 fft-analysis 0; +#N canvas 447 38 690 818 fft-analysis 0; #X obj 71 702 *~; #X obj 32 752 *~; #X obj 242 133 *~; @@ -159,12 +159,12 @@ #X connect 60 0 58 0; #X connect 61 0 59 0; #X restore 59 408 pd fft-analysis; -#X floatatom 338 279 0 0 100 0 - - - 0; +#X floatatom 358 276 6 0 100 0 - - - 0; #X text 60 12 PITCHED/UNPITCHED SEPARATION; #X obj 59 443 output~; -#X floatatom 59 348 0 0 100 0 - - - 0; -#X text 103 329 noise; -#X floatatom 106 348 0 0 100 0 - - - 0; +#X floatatom 59 348 5 0 100 0 - - - 0; +#X text 103 326 noise; +#X floatatom 106 348 5 0 100 0 - - - 0; #N canvas 272 180 466 593 test-signal 0; #X obj 72 295 line~; #X obj 242 395 *~; @@ -175,18 +175,18 @@ #X obj 260 369 dbtorms; #X obj 90 357 inlet; #X obj 260 345 inlet; -#X obj 223 535 outlet~; +#X obj 224 538 outlet~; #X msg 72 267 0 \, \$1 \$2; #X obj 181 212 /; #X obj 196 160 * 0.001; #X obj 196 186 t b f; -#X obj 223 507 hip~ 5; -#X obj 72 100 loadbang; +#X obj 224 510 hip~ 5; +#X obj 72 94 loadbang; #X obj 72 146 metro 1000; #X obj 242 311 bp~ 10000 3; -#X obj 72 125 tgl 15 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000 0 1; +#X obj 72 119 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X text 215 211 sample duration \, msec; -#X text 87 69 looped sample playback; +#X text 87 63 looped sample playback; #X obj 72 323 tabread4~ \$0-sample; #X text 239 259 filtered noise; #X text 67 16 TEST SIGNAL: looped sample plus noise. The inlets control amplitude of each in dB., f 42; @@ -233,7 +233,7 @@ #X connect 33 0 10 0; #X restore 59 377 pd test-signal; #X text 43 326 sampler; -#X text 64 306 amplitudes (dB); +#X text 64 295 amplitudes (dB); #N canvas 388 86 722 350 insample 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-sample 155944 float 2; @@ -274,31 +274,31 @@ #X connect 15 0 16 0; #X connect 17 0 14 1; #X connect 18 0 13 0; -#X restore 216 496 pd insample; -#X msg 216 395 ../sound/bell.aiff; -#X msg 223 418 ../sound/voice.wav; -#X msg 230 441 ../sound/voice2.wav; -#X text 219 375 change input sound; -#X obj 216 468 s read-sample; -#X floatatom 216 523 5 0 0 0 - \$0-samp-msec - 0; -#X text 269 522 sample length \, msec; -#X floatatom 216 277 0 0 100 0 - - - 0; -#X floatatom 154 348 0 0 100 0 - - - 0; -#X text 152 328 osc; -#X msg 436 296 512; -#X msg 442 319 1024; -#X msg 447 343 2048; -#X obj 436 392 s window-size; -#X msg 453 366 4096; -#X obj 216 300 s clean; -#X text 216 323 0=silent; -#X text 214 343 100=all; -#X obj 338 302 s dirty; -#X text 334 323 100=silent; -#X text 336 340 0=all; +#X restore 236 496 pd insample; +#X msg 236 395 ../sound/bell.aiff; +#X msg 243 418 ../sound/voice.wav; +#X msg 250 441 ../sound/voice2.wav; +#X text 239 375 change input sound; +#X obj 236 468 s read-sample; +#X floatatom 236 523 5 0 0 0 - \$0-samp-msec - 0; +#X text 289 522 sample length \, msec; +#X floatatom 236 274 6 0 100 0 - - - 0; +#X floatatom 154 348 6 0 100 0 - - - 0; +#X text 162 326 osc; +#X msg 456 296 512; +#X msg 462 319 1024; +#X msg 467 343 2048; +#X obj 456 392 s window-size; +#X msg 473 366 4096; +#X obj 236 300 s clean; +#X text 236 323 0=silent; +#X text 234 343 100=all; +#X obj 358 302 s dirty; +#X text 354 323 100=silent; +#X text 356 340 0=all; #X text 351 566 updated for Pd version 0.39; -#X text 43 198 Two separate thresholds may be adjusted to listen to the "clean" or "dirty" part of the signal. You'll hear anything less incoherent than the clean threshold \, OR more incoherent than the dirty one., f 67; -#X text 43 48 This patch applies a very simple coherence test to distinguish between sinusoids and noise in an input signal. It works very imperfectly (since noise is random \, no matter what test we place on it it will sometimes spoof its way in.) Here we just test that neighboring channels are 180 degrees (pi radians) out of phase \, as they should be in the main lobe in response to a sinusoid. If any three channels are so arranged \, all three are considered as contributing to a sinusoid. To do this we make an "incoherence" measure which is zero if the phase relationship is perfect and progressively larger otherwise., f 67; +#X text 43 198 Two separate thresholds may be adjusted to listen to the "clean" or "dirty" part of the signal. You'll hear anything less incoherent than the clean threshold \, OR more incoherent than the dirty one., f 75; +#X text 43 54 This patch applies a very simple coherence test to distinguish between sinusoids and noise in an input signal. It works very imperfectly (since noise is random \, no matter what test we place on it it will sometimes spoof its way in.) Here we just test that neighboring channels are 180 degrees (pi radians) out of phase \, as they should be in the main lobe in response to a sinusoid. If any three channels are so arranged \, all three are considered as contributing to a sinusoid. To do this we make an "incoherence" measure which is zero if the phase relationship is perfect and progressively larger otherwise., f 75; #N canvas 577 259 559 559 tables 0; #N canvas 0 22 450 278 (subpatch) 0; #X array \$0-inc-imag 2048 float 2; @@ -324,7 +324,7 @@ #X array \$0-last-real 2048 float 2; #X coords 0 1 2048 -1 200 140 1 0 0; #X restore 77 38 graph; -#X restore 435 465 pd tables; +#X restore 455 465 pd tables; #N canvas 734 203 602 538 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 1024 float 0; @@ -372,7 +372,7 @@ #X connect 19 0 1 0; #X connect 19 1 4 0; #X connect 19 1 18 0; -#X restore 435 440 pd hann-window; +#X restore 455 440 pd hann-window; #X obj 449 13 declare -stdpath ./; #X connect 0 0 3 0; #X connect 1 0 29 0; diff --git a/doc/3.audio.examples/I10.phase.bash.pd b/doc/3.audio.examples/I10.phase.bash.pd index c27cfa9d..901410ee 100644 --- a/doc/3.audio.examples/I10.phase.bash.pd +++ b/doc/3.audio.examples/I10.phase.bash.pd @@ -1,7 +1,7 @@ -#N canvas 479 32 802 610 12; +#N canvas 479 38 802 610 12; #X declare -stdpath ./; #X floatatom 468 293 4 0 0 0 - - - 0; -#N canvas 575 55 791 659 fft 0; +#N canvas 293 108 791 659 fft 0; #X obj 98 224 *~; #X obj 66 224 *~; #X obj 66 167 *~; @@ -11,7 +11,7 @@ #X obj 66 435 rifft~; #X obj 102 168 tabreceive~ \$0-hann; #X obj 366 217 samplerate~; -#X obj 357 183 bang~; +#X obj 357 173 bang~; #X obj 366 242 t f b, f 6; #X obj 163 35 loadbang; #X obj 352 66 r window-size; @@ -24,42 +24,31 @@ #X obj 112 384 r window-size; #X obj 66 410 /~ 1000; #X msg 352 88 set \$1 2; -#X obj 429 322 r \$0-start; -#X obj 357 377 spigot; -#X msg 429 349 1; -#X msg 396 349 0; +#X obj 429 312 r \$0-start; +#X obj 357 367 spigot; +#X msg 429 339 1; +#X msg 396 339 0; #X obj 357 595 outlet; -#X obj 393 439 r window-size; -#X obj 393 509 t f b; -#X obj 425 532 samplerate~; -#X obj 393 532 /; -#X obj 393 555 * 1000; -#X obj 357 561 del; -#X obj 393 463 / 2; -#X obj 393 486 - 1; +#X obj 400 449 r window-size; +#X obj 400 519 t f b; +#X obj 432 542 samplerate~; +#X obj 400 542 /; +#X obj 400 565 * 1000; +#X obj 357 541 del; +#X obj 400 473 / 2; +#X obj 400 496 - 1; #X text 111 268 magnitude of FT; #X text 77 346 align partials to middle of window; #X text 98 329 alternate every other sign to; -#X text 412 181 control computations to do every frame; -#X text 454 211 set sample rate of the oscillator to; -#X text 456 226 Nyquist (here we're operating at twice; -#X text 458 242 the global "samplerate~" because of; -#X text 457 259 the overlap-2 blocking.) Also set phase; -#X text 457 275 to zero at beginning of frame.; -#X text 465 341 When analysis starts \, set a delay to, f 37; -#X text 465 358 one frame minus a sample (i.e. \, just, f 37; -#X text 465 375 one 64-sample block before the next, f 37; -#X text 465 392 frame) which is synchronized with the; -#X text 465 409 first frame emerging from outlet~ at, f 37; -#X text 542 427 left. In the parent window; -#X text 542 445 this is used to start, f 26; -#X text 542 463 recording synchronously., f 26; +#X text 409 173 control computations to do every frame; #X text 65 618 output phase-aligned frames; #X text 351 618 output a bang to start recording; #X msg 163 61 \; window-size 1024 \; pitch 48 \; specshift 0; #X obj 66 267 sqrt~; -#X connect 0 0 55 0; -#X connect 1 0 55 0; +#X text 456 205 set sample rate of the oscillator to Nyquist (here we're operating at twice the global sample rate (queried from [samplerate~]) because of the overlap-2 blocking.) Also set phase to zero at beginning of frame., f 39; +#X text 465 331 When analysis starts \, set a delay to one frame minus a sample (i.e. \, just one 64-sample block before the next frame) which is synchronized with the first frame emerging from [outlet~] at left. In the parent window this is used to start recording synchronously., f 40; +#X connect 0 0 42 0; +#X connect 1 0 42 0; #X connect 2 0 4 0; #X connect 3 0 2 0; #X connect 4 0 1 0; @@ -74,7 +63,7 @@ #X connect 9 0 23 0; #X connect 10 0 14 0; #X connect 10 1 15 0; -#X connect 11 0 54 0; +#X connect 11 0 41 0; #X connect 12 0 21 0; #X connect 14 0 5 1; #X connect 15 0 14 1; @@ -97,14 +86,14 @@ #X connect 32 0 26 0; #X connect 33 0 34 0; #X connect 34 0 28 0; -#X connect 55 0 5 0; +#X connect 42 0 5 0; #X restore 99 461 pd fft; #X floatatom 641 353 3 0 120 0 - pitch-set - 0; #X floatatom 638 296 4 0 0 0 - specshift-set - 0; #X obj 638 319 s specshift; #X obj 468 400 s loco; #X obj 641 376 s pitch; -#X obj 428 480 output~; +#X obj 397 489 output~; #X text 61 22 PHASE BASHING; #X text 566 500 updated for Pd version 0.39; #X floatatom 260 347 8 0 0 0 - \$0-samp-msec - 0; @@ -114,7 +103,7 @@ #X msg 271 293 ../sound/voice2.wav; #X text 262 227 change input sound; #X obj 259 322 s read-sample; -#N canvas 784 65 488 425 test-signal 0; +#N canvas 331 87 488 425 test-signal 0; #X obj 50 247 line~; #X obj 50 167 f; #X obj 50 379 outlet~; @@ -245,8 +234,8 @@ #X obj 53 272 r \$0-insamprate; #X msg 54 422 \; read-sample ../sound/voice.wav; #N canvas 0 0 450 300 (subpatch) 0; -#X array \$0-nophase 62079 float 0; -#X coords 0 1 62078 -1 400 150 1; +#X array \$0-nophase 62079 float 2; +#X coords 0 1 62079 -1 400 150 1; #X restore 263 214 graph; #X msg 381 408 resize \$1; #X obj 381 384 r \$0-samplength; @@ -279,234 +268,230 @@ #X msg 476 341 0 \, 400 4000; #X msg 481 368 0 \, 400 10000; #X text 55 55 This patch takes an incoming sound \, does an overlap-2 FFT analysis of it \, and bashes the phases of the spectra so that when regenerated the components will all have zero phase at the middle of each window. You can use the windows as waveforms and cross-fade them at will without getting phase modulation. This might be useful for making synthetic instruments that mimic the spectral variation of recorded sounds., f 46; -#X text 459 271 (hundredths of sec); -#X text 462 255 location in sample; -#X text 563 334 normal speed, f 6; +#X text 564 333 normal speed, f 6; #X text 574 367 slow; #X text 509 228 ------ playback -------; -#N canvas 2782 23 940 931 playback 0; -#X obj 167 633 r invblk; -#X obj 68 660 *~; -#X obj 129 658 clip~ 1 1000; -#X floatatom 154 143 0 0 0 0 - - - 0; -#X floatatom 589 48 0 0 0 0 - - - 0; -#X obj 488 636 *~; -#X obj 634 606 samphold~; -#X obj 721 606 samphold~; -#X obj 529 606 samphold~; -#X obj 473 748 clip~ -0.5 0.5; -#X obj 473 771 cos~; -#X obj 651 694 +~; -#X obj 652 773 -~; -#X obj 634 800 *~; -#X obj 662 825 +~; -#X obj 644 849 *~; -#X obj 86 589 *~; -#X obj 254 569 samphold~; -#X obj 362 596 samphold~; -#X obj 589 462 phasor~; -#X obj 254 325 wrap~; -#X obj 589 23 r pitch; -#X obj 589 97 mtof; -#X obj 362 268 line~; -#X obj 362 368 -~; -#X text 124 96 spectral stretch; -#X obj 129 542 samphold~; -#X obj 695 349 t b f, f 8; -#X obj 730 374 /; -#X obj 695 371 1; -#X obj 68 685 clip~ -0.5 0.5; -#X obj 68 707 cos~; -#X obj 279 633 +~; -#X obj 272 712 -~; -#X obj 254 735 *~; -#X obj 291 760 +~; -#X text 428 246 samples; -#X text 428 231 period in; -#X text 260 589 weight for; -#X text 260 604 next block; -#X obj 589 529 wrap~; -#X obj 730 399 s invblk; -#X obj 569 693 r invblk; -#X obj 695 273 r window-size; -#X obj 154 119 r specshift; -#X obj 272 76 r loco; -#X obj 473 718 *~; -#X obj 529 718 clip~ 1 1000; -#X obj 589 72 - 12; -#X obj 154 190 + 69; -#X obj 154 213 mtof; -#X obj 154 236 / 440; -#X obj 129 328 *~ 1; -#X obj 589 504 +~ 0.5; -#X obj 129 633 *~ 1; -#X obj 529 693 *~ 1; -#X obj 473 793 +~ 1; -#X obj 68 730 +~ 1; -#X obj 362 449 *~ 1; -#X obj 272 660 +~ 0; -#X obj 652 723 +~ 0; -#X obj 68 541 -~ 0.5; -#X obj 473 606 -~ 0.5; -#X obj 273 880 outlet~; -#X obj 272 686 tabread4~ \$0-nophase; -#X obj 309 712 tabread4~ \$0-nophase; -#X obj 652 747 tabread4~ \$0-nophase; -#X obj 687 772 tabread4~ \$0-nophase; -#X obj 362 391 +~ 0.5; -#X text 136 564 grain size; -#X text 389 368 integer part of loc; -#X text 416 392 middle of block; -#X text 309 430 convert to samples, f 10; -#X text 654 454 run two copies 180 degrees out of phase, f 20; -#X obj 273 785 *~; -#X obj 273 826 +~; -#X obj 709 323 s blksize; -#X obj 683 696 r blksize; -#X obj 317 661 r blksize; -#X obj 403 419 r blksize; -#X obj 695 297 / 2; -#X obj 426 209 /; -#X obj 426 182 samplerate~; -#X obj 426 159 t b f; -#X obj 154 166 * 0.125; -#X text 325 65 read location in sec/100, f 13; -#X obj 304 192 samplerate~; -#X obj 272 145 / 100; -#X obj 272 169 t f b; -#X obj 272 192 *; -#X obj 305 217 r blksize; -#X obj 272 217 /; -#X text 207 181 read location \, blocks, f 9; -#X msg 658 135 set \$1; -#X obj 784 111 r pitch; -#X msg 784 135 set \$1; -#X obj 658 111 r specshift; -#X text 760 374 1/(block size); -#X obj 658 159 s specshift-set; -#X obj 784 159 s pitch-set; -#X text 117 28 OVERLAPPED \, WINDOWED SAMPLE PLAYBACK; -#X text 655 70 - with controls for pitch \, location \, and spectral shift, f 28; -#X text 682 218 analysis overlap was 2 so our block size is (window size)/2, f 20; -#X obj 272 102 unpack float float; -#X text 32 759 window shaped by raised cos, f 13; -#X text 19 574 offset into ==> sample, f 9; -#X text 386 615 middle of block, f 8; -#X text 325 733 weighted sum of 2 windows, f 12; -#X text 172 316 fractional part of loc, f 11; -#X text 78 255 grain size in samples, f 10; -#X connect 0 0 54 1; -#X connect 1 0 30 0; +#N canvas 226 38 923 890 playback 0; +#X obj 170 619 r invblk; +#X obj 71 646 *~; +#X obj 132 644 clip~ 1 1000; +#X floatatom 157 129 0 0 0 0 - - - 0; +#X floatatom 592 48 0 0 0 0 - - - 0; +#X obj 491 622 *~; +#X obj 637 592 samphold~; +#X obj 724 592 samphold~; +#X obj 532 592 samphold~; +#X obj 476 734 clip~ -0.5 0.5; +#X obj 476 757 cos~; +#X obj 654 680 +~; +#X obj 655 759 -~; +#X obj 637 786 *~; +#X obj 665 811 +~; +#X obj 647 835 *~; +#X obj 89 575 *~; +#X obj 257 555 samphold~; +#X obj 365 582 samphold~; +#X obj 592 448 phasor~; +#X obj 257 311 wrap~; +#X obj 592 23 r pitch; +#X obj 592 97 mtof; +#X obj 365 254 line~; +#X obj 365 354 -~; +#X text 127 82 spectral stretch; +#X obj 132 528 samphold~; +#X obj 698 335 t b f, f 8; +#X obj 733 360 /; +#X obj 71 671 clip~ -0.5 0.5; +#X obj 71 693 cos~; +#X obj 282 619 +~; +#X obj 275 698 -~; +#X obj 257 721 *~; +#X obj 294 746 +~; +#X text 431 232 samples; +#X text 431 217 period in; +#X text 263 575 weight for; +#X text 263 590 next block; +#X obj 592 515 wrap~; +#X obj 733 385 s invblk; +#X obj 572 679 r invblk; +#X obj 698 259 r window-size; +#X obj 157 105 r specshift; +#X obj 275 62 r loco; +#X obj 476 704 *~; +#X obj 532 704 clip~ 1 1000; +#X obj 592 72 - 12; +#X obj 157 176 + 69; +#X obj 157 199 mtof; +#X obj 157 222 / 440; +#X obj 132 314 *~ 1; +#X obj 592 490 +~ 0.5; +#X obj 132 619 *~ 1; +#X obj 532 679 *~ 1; +#X obj 476 779 +~ 1; +#X obj 71 716 +~ 1; +#X obj 365 435 *~ 1; +#X obj 275 646 +~ 0; +#X obj 655 709 +~ 0; +#X obj 71 527 -~ 0.5; +#X obj 476 592 -~ 0.5; +#X obj 276 866 outlet~; +#X obj 275 672 tabread4~ \$0-nophase; +#X obj 312 698 tabread4~ \$0-nophase; +#X obj 655 733 tabread4~ \$0-nophase; +#X obj 690 758 tabread4~ \$0-nophase; +#X obj 365 377 +~ 0.5; +#X text 139 550 grain size; +#X text 392 354 integer part of loc; +#X text 419 378 middle of block; +#X text 312 416 convert to samples, f 10; +#X text 657 440 run two copies 180 degrees out of phase, f 20; +#X obj 276 771 *~; +#X obj 276 812 +~; +#X obj 712 309 s blksize; +#X obj 686 682 r blksize; +#X obj 320 647 r blksize; +#X obj 406 405 r blksize; +#X obj 698 283 / 2; +#X obj 429 195 /; +#X obj 429 168 samplerate~; +#X obj 429 145 t b f; +#X obj 157 152 * 0.125; +#X text 328 51 read location in sec/100, f 13; +#X obj 307 178 samplerate~; +#X obj 275 131 / 100; +#X obj 275 155 t f b; +#X obj 275 178 *; +#X obj 308 203 r blksize; +#X obj 275 203 /; +#X text 210 167 read location \, blocks, f 9; +#X msg 661 135 set \$1; +#X obj 787 111 r pitch; +#X msg 787 135 set \$1; +#X obj 661 111 r specshift; +#X text 763 360 1/(block size); +#X obj 661 159 s specshift-set; +#X obj 787 159 s pitch-set; +#X text 120 14 OVERLAPPED \, WINDOWED SAMPLE PLAYBACK; +#X text 658 70 - with controls for pitch \, location \, and spectral shift, f 28; +#X text 685 204 analysis overlap was 2 so our block size is (window size)/2, f 20; +#X obj 275 88 unpack float float; +#X text 35 745 window shaped by raised cos, f 13; +#X text 22 560 offset into ==> sample, f 9; +#X text 389 601 middle of block, f 8; +#X text 328 719 weighted sum of 2 windows, f 12; +#X text 175 302 fractional part of loc, f 11; +#X text 81 241 grain size in samples, f 10; +#X msg 698 357 1; +#X connect 0 0 53 1; +#X connect 1 0 29 0; #X connect 2 0 1 1; -#X connect 3 0 84 0; -#X connect 4 0 48 0; +#X connect 3 0 83 0; +#X connect 4 0 47 0; #X connect 5 0 11 0; #X connect 6 0 13 0; #X connect 7 0 11 1; #X connect 8 0 5 1; -#X connect 8 0 55 0; +#X connect 8 0 54 0; #X connect 9 0 10 0; -#X connect 10 0 56 0; -#X connect 11 0 60 0; -#X connect 11 0 67 0; +#X connect 10 0 55 0; +#X connect 11 0 59 0; +#X connect 11 0 66 0; #X connect 12 0 13 1; #X connect 13 0 14 0; #X connect 14 0 15 1; -#X connect 15 0 75 1; -#X connect 16 0 32 0; -#X connect 17 0 34 0; -#X connect 18 0 32 1; +#X connect 15 0 74 1; +#X connect 16 0 31 0; +#X connect 17 0 33 0; +#X connect 18 0 31 1; #X connect 19 0 26 1; #X connect 19 0 18 1; #X connect 19 0 17 1; -#X connect 19 0 53 0; -#X connect 19 0 61 0; +#X connect 19 0 52 0; +#X connect 19 0 60 0; #X connect 20 0 24 1; #X connect 20 0 17 0; #X connect 20 0 6 0; #X connect 21 0 4 0; #X connect 22 0 19 0; -#X connect 22 0 83 0; +#X connect 22 0 82 0; #X connect 23 0 20 0; #X connect 23 0 24 0; -#X connect 24 0 68 0; +#X connect 24 0 67 0; #X connect 26 0 16 1; -#X connect 26 0 54 0; -#X connect 27 0 29 0; +#X connect 26 0 53 0; +#X connect 27 0 109 0; #X connect 27 1 28 1; -#X connect 28 0 41 0; -#X connect 29 0 28 0; -#X connect 30 0 31 0; -#X connect 31 0 57 0; -#X connect 32 0 59 0; -#X connect 32 0 65 0; -#X connect 33 0 34 1; -#X connect 34 0 35 0; -#X connect 35 0 74 1; -#X connect 40 0 8 1; -#X connect 40 0 6 1; -#X connect 40 0 7 1; -#X connect 40 0 62 0; -#X connect 42 0 55 1; -#X connect 43 0 80 0; -#X connect 44 0 3 0; -#X connect 45 0 103 0; -#X connect 46 0 9 0; -#X connect 47 0 46 1; -#X connect 48 0 22 0; +#X connect 28 0 40 0; +#X connect 29 0 30 0; +#X connect 30 0 56 0; +#X connect 31 0 58 0; +#X connect 31 0 64 0; +#X connect 32 0 33 1; +#X connect 33 0 34 0; +#X connect 34 0 73 1; +#X connect 39 0 8 1; +#X connect 39 0 6 1; +#X connect 39 0 7 1; +#X connect 39 0 61 0; +#X connect 41 0 54 1; +#X connect 42 0 79 0; +#X connect 43 0 3 0; +#X connect 44 0 102 0; +#X connect 45 0 9 0; +#X connect 46 0 45 1; +#X connect 47 0 22 0; +#X connect 48 0 49 0; #X connect 49 0 50 0; -#X connect 50 0 51 0; -#X connect 51 0 52 1; -#X connect 52 0 26 0; -#X connect 52 0 8 0; -#X connect 53 0 40 0; -#X connect 54 0 2 0; -#X connect 55 0 47 0; -#X connect 56 0 15 0; -#X connect 57 0 74 0; -#X connect 58 0 18 0; -#X connect 58 0 7 0; -#X connect 59 0 64 0; -#X connect 60 0 66 0; -#X connect 61 0 16 0; -#X connect 61 0 1 0; -#X connect 62 0 5 0; -#X connect 62 0 46 0; -#X connect 64 0 33 0; -#X connect 65 0 33 1; -#X connect 65 0 35 1; -#X connect 66 0 12 0; -#X connect 67 0 12 1; -#X connect 67 0 14 1; -#X connect 68 0 58 0; -#X connect 74 0 75 0; -#X connect 75 0 63 0; -#X connect 77 0 60 1; -#X connect 78 0 59 1; -#X connect 79 0 58 1; -#X connect 80 0 76 0; -#X connect 80 0 27 0; -#X connect 81 0 52 0; +#X connect 50 0 51 1; +#X connect 51 0 26 0; +#X connect 51 0 8 0; +#X connect 52 0 39 0; +#X connect 53 0 2 0; +#X connect 54 0 46 0; +#X connect 55 0 15 0; +#X connect 56 0 73 0; +#X connect 57 0 18 0; +#X connect 57 0 7 0; +#X connect 58 0 63 0; +#X connect 59 0 65 0; +#X connect 60 0 16 0; +#X connect 60 0 1 0; +#X connect 61 0 5 0; +#X connect 61 0 45 0; +#X connect 63 0 32 0; +#X connect 64 0 32 1; +#X connect 64 0 34 1; +#X connect 65 0 12 0; +#X connect 66 0 12 1; +#X connect 66 0 14 1; +#X connect 67 0 57 0; +#X connect 73 0 74 0; +#X connect 74 0 62 0; +#X connect 76 0 59 1; +#X connect 77 0 58 1; +#X connect 78 0 57 1; +#X connect 79 0 75 0; +#X connect 79 0 27 0; +#X connect 80 0 51 0; +#X connect 81 0 80 0; #X connect 82 0 81 0; -#X connect 83 0 82 0; -#X connect 83 1 81 1; -#X connect 84 0 49 0; -#X connect 86 0 89 1; +#X connect 82 1 80 1; +#X connect 83 0 48 0; +#X connect 85 0 88 1; +#X connect 86 0 87 0; #X connect 87 0 88 0; -#X connect 88 0 89 0; -#X connect 88 1 86 0; -#X connect 89 0 91 0; -#X connect 90 0 91 1; -#X connect 91 0 23 0; -#X connect 93 0 98 0; -#X connect 94 0 95 0; -#X connect 95 0 99 0; -#X connect 96 0 93 0; -#X connect 103 0 87 0; -#X connect 103 1 23 1; -#X restore 428 442 pd playback; -#X text 620 256 spectral shift; -#X text 618 272 (hundredths of; +#X connect 87 1 85 0; +#X connect 88 0 90 0; +#X connect 89 0 90 1; +#X connect 90 0 23 0; +#X connect 92 0 97 0; +#X connect 93 0 94 0; +#X connect 94 0 98 0; +#X connect 95 0 92 0; +#X connect 102 0 86 0; +#X connect 102 1 23 1; +#X connect 109 0 28 0; +#X restore 397 451 pd playback; #X text 681 289 octave); #X text 181 384 live; #X text 400 58 You can save the analyses and needn't be running the FFT patch to do the resynthesis. You can read a sample \, select window size \, and press "sample" to analyze it \, or else analyze a "live" input. You'll hear the phase-bashed sample as the analysis runs. You can regenerate the sound with specified pitch \, sample location \, and spectral shift \, using the "playback" controls., f 44; @@ -520,7 +505,9 @@ #X obj 468 316 pack f 100; #X obj 194 404 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 99 403 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X connect 0 0 50 0; +#X text 632 259 spectral shift (hundredths of, f 14; +#X text 462 255 location in sample (hundredths of sec), f 19; +#X connect 0 0 46 0; #X connect 1 0 27 0; #X connect 1 0 28 0; #X connect 1 1 27 0; @@ -536,7 +523,7 @@ #X connect 23 0 22 0; #X connect 29 0 5 0; #X connect 30 0 5 0; -#X connect 37 0 7 0; -#X connect 50 0 5 0; -#X connect 51 0 17 1; -#X connect 52 0 17 0; +#X connect 35 0 7 0; +#X connect 46 0 5 0; +#X connect 47 0 17 1; +#X connect 48 0 17 0; diff --git a/doc/3.audio.examples/J01.even.odd.pd b/doc/3.audio.examples/J01.even.odd.pd index ada5659a..7a505f1b 100644 --- a/doc/3.audio.examples/J01.even.odd.pd +++ b/doc/3.audio.examples/J01.even.odd.pd @@ -1,4 +1,4 @@ -#N canvas 524 38 842 658 12; +#N canvas 417 38 842 658 12; #X declare -stdpath ./; #X obj 280 168 wrap~; #N canvas 0 0 450 300 (subpatch) 0; @@ -24,11 +24,6 @@ #X text 349 69 original sawtooth; #X obj 136 224 +~; #X obj 262 224 -~; -#X text 38 484 This patch splits a sawtooth wave into its even and odd harmonics. The wrap~ object is used to make the phased copy. Adding and subtracting this to and from the original gives the results shown and heard. (Listen to the two outputs separately \, then together.), f 66; -#X text 272 331 output level; -#X text 255 427 for sum; -#X text 257 410 output level; -#X text 270 348 for difference; #X msg 390 172 \; pd dsp 1; #X obj 359 252 tabwrite~ \$0-difference; #X obj 345 280 tabwrite~ \$0-sum; @@ -39,19 +34,22 @@ #X obj 664 35 declare -stdpath ./; #X obj 345 139 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X text 368 138 <-- click to graph; +#X text 257 410 output level for sum, f 12; +#X text 272 331 output level for difference, f 14; +#X text 38 484 This patch splits a sawtooth wave into its even and odd harmonics. The [wrap~] object is used to make the phased copy. Adding and subtracting this to and from the original gives the results shown and heard. (Listen to the two outputs separately \, then together.), f 66; #X connect 0 0 3 0; #X connect 2 0 0 0; #X connect 2 0 13 0; #X connect 2 0 14 0; -#X connect 2 0 23 0; +#X connect 2 0 18 0; #X connect 3 0 13 1; #X connect 3 0 14 1; #X connect 10 0 2 0; #X connect 13 0 8 0; -#X connect 13 0 22 0; +#X connect 13 0 17 0; #X connect 14 0 9 1; -#X connect 14 0 21 0; -#X connect 28 0 20 0; -#X connect 28 0 21 0; -#X connect 28 0 22 0; -#X connect 28 0 23 0; +#X connect 14 0 16 0; +#X connect 23 0 15 0; +#X connect 23 0 16 0; +#X connect 23 0 17 0; +#X connect 23 0 18 0; diff --git a/doc/3.audio.examples/J02.trapezoids.pd b/doc/3.audio.examples/J02.trapezoids.pd index 047c9b43..3211b8da 100644 --- a/doc/3.audio.examples/J02.trapezoids.pd +++ b/doc/3.audio.examples/J02.trapezoids.pd @@ -1,4 +1,4 @@ -#N canvas 553 23 751 702 12; +#N canvas 553 38 751 702 12; #X declare -stdpath ./; #X obj 132 178 wrap~; #X obj 132 207 -~ 0.5; diff --git a/doc/3.audio.examples/J03.pulse.width.mod.pd b/doc/3.audio.examples/J03.pulse.width.mod.pd index dd2408aa..38fc3a85 100644 --- a/doc/3.audio.examples/J03.pulse.width.mod.pd +++ b/doc/3.audio.examples/J03.pulse.width.mod.pd @@ -1,9 +1,9 @@ -#N canvas 580 65 668 554 12; +#N canvas 371 70 668 554 12; #X declare -stdpath ./; #X floatatom 129 87 5 0 0 0 - - - 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-difference 882 float 0; -#X coords 0 1.02 882 -1.02 200 130 1; +#X coords 0 1.02 881 -1.02 200 130 1; #X restore 430 378 graph; #X text 51 87 frequency; #N canvas 0 0 450 300 (subpatch) 0; @@ -17,7 +17,6 @@ #X array \$0-phasor2 882 float 0; #X coords 0 1.02 882 -1.02 200 130 1; #X restore 430 218 graph; -#X text 43 350 This patch demonstrates pulse width modulation \, which is accomplished simply by subtracting two sawtooth waves at a varying phase difference. Here their frequencies are set to differ by 1/5 Hz. so that the relative phase wanders continuously., f 47; #X text 450 519 ---- 0.02 seconds ----; #X text 92 480 updated for Pd version 0.39; #X obj 111 283 output~; @@ -27,19 +26,20 @@ #X obj 55 141 phasor~; #X obj 196 120 metro 193; #X obj 196 93 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 220 93 <= start/stop graphing; #X obj 506 9 declare -stdpath ./; #X obj 129 141 phasor~; +#X text 220 92 <-- start/stop graphing; +#X text 43 357 This patch demonstrates pulse width modulation \, which is accomplished simply by subtracting two sawtooth waves at a varying phase difference. Here their frequencies are set to differ by 1/5 Hz so that the relative phase wanders continuously., f 47; #X connect 0 0 5 0; -#X connect 0 0 15 0; -#X connect 5 0 20 0; -#X connect 6 0 11 0; -#X connect 6 0 14 0; -#X connect 15 0 6 0; +#X connect 0 0 14 0; +#X connect 5 0 18 0; +#X connect 6 0 10 0; +#X connect 6 0 13 0; +#X connect 14 0 6 0; +#X connect 14 0 11 0; +#X connect 15 0 11 0; #X connect 15 0 12 0; -#X connect 16 0 12 0; -#X connect 16 0 13 0; -#X connect 16 0 14 0; -#X connect 17 0 16 0; -#X connect 20 0 6 1; -#X connect 20 0 13 0; +#X connect 15 0 13 0; +#X connect 16 0 15 0; +#X connect 18 0 6 1; +#X connect 18 0 12 0; diff --git a/doc/3.audio.examples/J04.corners.pd b/doc/3.audio.examples/J04.corners.pd index 330ca853..41cdc7e1 100644 --- a/doc/3.audio.examples/J04.corners.pd +++ b/doc/3.audio.examples/J04.corners.pd @@ -1,4 +1,4 @@ -#N canvas 486 23 684 723 12; +#N canvas 486 38 684 723 12; #X declare -stdpath ./; #X obj 136 177 wrap~; #X obj 136 204 -~ 0.5; @@ -36,7 +36,7 @@ #X text 364 310 AMPLITUDES (percent); #X obj 136 396 +~; #X obj 293 434 +~; -#X obj 339 422 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 339 405 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X obj 339 438 metro 193; #X obj 81 109 phasor~; #X floatatom 81 88 5 0 0 0 - - - 0; diff --git a/doc/3.audio.examples/J05.triangle.pd b/doc/3.audio.examples/J05.triangle.pd index 54a101f2..de7ea4c3 100644 --- a/doc/3.audio.examples/J05.triangle.pd +++ b/doc/3.audio.examples/J05.triangle.pd @@ -1,4 +1,4 @@ -#N canvas 539 44 606 633 12; +#N canvas 507 44 606 633 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-sum 882 float 0; @@ -23,13 +23,13 @@ #X obj 95 194 +~ 1; #X obj 204 242 *~; #X obj 179 269 min~; -#X text 295 127 0.5; -#X text 296 246 -0.5; +#X text 305 122 0.5; +#X text 299 246 -0.5; #X text 175 92 up; #X text 222 92 down; -#X text 51 441 Occasionally a second method for making corners is more convenient. Here we specify the slopes of the rising and falling segments (as always \, in units per cycle). We then make a triangle wave with a corner at (0 \, 0) and another one \, placed somewhere within the cycle. The slopes of the two lines determine the second point \, which will have an x value of t/(s+t) (if we let s denote the rising slope and t the falling one \, both as positive numbers). The y value is st/(s+t). If we wish instead to specify the corner location (x \, y) (with x in cycles \, 0= \$1; #X msg 530 366 0; #X obj 150 297 metro; -#X text 122 64 filter-graph1 -- generate sinusoids to test a filter; -#X text 124 80 arg 1: number of steps - arg2: frequency range; -#X text 124 111 This \, together with its companion filter-graph2 \, measure a filter's frequency and phase response. Here we count from 0 to n-1 (where n is the table size) and output the index and a complex sinusoid at each frequency to test., f 48; +#X text 114 80 arg 1: number of steps - arg2: frequency range; #X text 237 261 fudge to estimate settling time; #X obj 502 109 loadbang; #X obj 502 160 t b b, f 6; @@ -36,6 +34,8 @@ #X obj 502 134 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 217 242 expr max(50 \, 40000/($f2*max($f1 \, 1))); #X obj 221 427 pack f f; +#X text 112 58 [filter-graph1] -- generate sinusoids to test a filter; +#X text 114 106 This \, together with its companion [filter-graph2] \, measures a filter's frequency and phase response. Here we count from 0 to n-1 (where n is the table size) and output the index and a complex sinusoid at each frequency to test., f 50; #X connect 0 0 1 0; #X connect 0 0 15 0; #X connect 0 0 18 0; @@ -54,26 +54,26 @@ #X connect 10 0 14 0; #X connect 11 0 10 0; #X connect 12 0 2 0; -#X connect 15 0 36 0; -#X connect 15 1 31 0; -#X connect 15 1 35 0; +#X connect 15 0 34 0; +#X connect 15 1 29 0; +#X connect 15 1 33 0; #X connect 18 0 4 0; #X connect 19 0 8 1; #X connect 20 0 0 0; #X connect 20 0 19 0; -#X connect 25 0 34 0; +#X connect 23 0 32 0; +#X connect 24 0 26 0; +#X connect 24 1 27 0; +#X connect 25 0 28 1; #X connect 26 0 28 0; -#X connect 26 1 29 0; -#X connect 27 0 30 1; +#X connect 27 0 25 0; #X connect 28 0 30 0; -#X connect 29 0 27 0; -#X connect 30 0 32 0; -#X connect 30 0 35 1; -#X connect 31 0 7 0; -#X connect 31 0 36 1; -#X connect 32 0 31 1; -#X connect 33 0 20 1; -#X connect 34 0 26 0; -#X connect 35 0 33 0; -#X connect 35 0 36 1; -#X connect 36 0 16 0; +#X connect 28 0 33 1; +#X connect 29 0 7 0; +#X connect 29 0 34 1; +#X connect 30 0 29 1; +#X connect 31 0 20 1; +#X connect 32 0 24 0; +#X connect 33 0 31 0; +#X connect 33 0 34 1; +#X connect 34 0 16 0; diff --git a/doc/3.audio.examples/filter-graph2.pd b/doc/3.audio.examples/filter-graph2.pd index dde53c68..a61224bc 100644 --- a/doc/3.audio.examples/filter-graph2.pd +++ b/doc/3.audio.examples/filter-graph2.pd @@ -1,4 +1,4 @@ -#N canvas 439 23 870 680 12; +#N canvas 439 38 870 680 12; #X obj 294 247 *~; #X obj 365 245 *~; #X obj 229 322 t b b; @@ -49,7 +49,6 @@ #X text 646 563 is specified for phase; #X text 646 579 (don't compute it if; #X text 647 594 not.); -#X text 53 30 filter-graph2: measures frequency and phase response of a filter \, which should be driven by a "filter-graph1" object. We need the three outputs of filter-graph1 \, plus the filter output., f 64; #X text 518 99 1: table name for frequency response; #X text 597 78 creation arguments:; #X text 518 115 2 (optional): table name for phase response; @@ -58,14 +57,15 @@ #X floatatom 221 258 5 0 0 0 - - - 0; #X text 101 254 cutoff freq. for low-pass filters, f 16; #X obj 653 271 b; -#X connect 0 0 54 0; +#X text 53 30 [filter-graph2]: measures frequency and phase response of a filter \, which should be driven by a [filter-graph1] object. We need the three outputs of filter-graph1 \, plus the filter output., f 64; +#X connect 0 0 53 0; #X connect 1 0 6 0; #X connect 2 0 4 0; #X connect 2 1 5 0; #X connect 3 0 8 0; #X connect 4 0 29 0; #X connect 5 0 31 1; -#X connect 5 0 55 0; +#X connect 5 0 54 0; #X connect 6 0 5 0; #X connect 7 0 34 0; #X connect 8 0 22 0; @@ -102,16 +102,16 @@ #X connect 30 0 31 2; #X connect 31 0 24 0; #X connect 32 1 33 0; -#X connect 32 1 58 0; +#X connect 32 1 57 0; #X connect 33 0 9 0; #X connect 34 0 32 0; #X connect 34 1 35 0; -#X connect 35 0 56 0; +#X connect 35 0 55 0; #X connect 43 0 3 0; #X connect 43 1 3 1; -#X connect 54 0 4 0; -#X connect 55 0 43 1; -#X connect 56 0 54 1; -#X connect 56 0 6 1; -#X connect 58 0 6 4; -#X connect 58 0 54 4; +#X connect 53 0 4 0; +#X connect 54 0 43 1; +#X connect 55 0 53 1; +#X connect 55 0 6 1; +#X connect 57 0 6 4; +#X connect 57 0 53 4; diff --git a/doc/3.audio.examples/osc-voice.pd b/doc/3.audio.examples/osc-voice.pd index a91905e9..cc588b5d 100644 --- a/doc/3.audio.examples/osc-voice.pd +++ b/doc/3.audio.examples/osc-voice.pd @@ -1,61 +1,53 @@ -#N canvas 415 23 796 611 12; -#X obj 175 371 line~; -#X obj 354 422 line~; -#X obj 305 527 *~; -#X obj 354 300 dbtorms; -#X obj 374 239 t l b, f 8; -#X obj 354 396 pack; -#X obj 175 267 unpack; -#X obj 175 451 osc~; -#X obj 175 293 mtof; -#X obj 354 326 sqrt; -#X obj 354 352 sqrt; -#X obj 175 319 sqrt; -#X obj 175 345 sqrt; -#X obj 175 399 *~; -#X obj 175 425 *~; -#X obj 354 448 *~; -#X obj 353 476 *~; -#X obj 305 574 outlet~; -#X floatatom 285 326 5 0 0 0 - - - 0; -#X msg 285 300 set \$1; -#X floatatom 108 317 5 0 0 0 - - - 0; -#X msg 108 291 set \$1; -#X text 361 186 amplitude; -#X text 169 214 pitch; -#X text 34 61 The amplitude and pitch are controlled by quartic envelopes -as in the previous example. Here we introduce two new features. First -\, there are number boxes to show the most recent targets for amplitude -and frequency \, which you can also use to change the values. Also -\, if amplitude gets a message without an explicit time value \, we -supply a default of "30"., f 52; -#X text 47 280 see or; -#X text 47 298 change; -#X text 235 309 and; -#X text 404 387 The "pack" always gets a 30 \, but if you send a pair -of numbers to amplitude \, the second one overrides the 30, f 27; -#X text 450 234 first bang the "30" \, then pass the list on; -#X text 47 317 pitch =>; -#X text 235 326 amp =>; -#X obj 374 265 unpack f f; -#X text 39 20 This abstraction is used in patch D13.additive.qlist.pd. -; -#X obj 458 265 f 30; -#X text 496 259 This is more CPU efficient than a message., f 27; -#X obj 374 213 r amp\$1; -#X obj 285 352 s amp\$1; -#X obj 108 343 s pit\$1; -#X obj 175 241 r pit\$1; -#X text 425 80 Other small differences from the previous patch: pitch -and amplitude are now in MIDI and dB., f 45; +#N canvas 457 58 609 673 12; +#X obj 148 423 line~; +#X obj 327 474 line~; +#X obj 309 579 *~; +#X obj 327 352 dbtorms; +#X obj 347 291 t l b, f 8; +#X obj 327 448 pack; +#X obj 148 319 unpack; +#X obj 148 503 osc~; +#X obj 148 345 mtof; +#X obj 327 378 sqrt; +#X obj 327 404 sqrt; +#X obj 148 371 sqrt; +#X obj 148 397 sqrt; +#X obj 148 451 *~; +#X obj 148 477 *~; +#X obj 327 500 *~; +#X obj 327 528 *~; +#X obj 309 616 outlet~; +#X floatatom 258 378 5 0 0 0 - - - 0; +#X msg 258 352 set \$1; +#X floatatom 81 369 5 0 0 0 - - - 0; +#X msg 81 343 set \$1; +#X text 334 238 amplitude; +#X text 142 266 pitch; +#X text 85 63 The amplitude and pitch are controlled by quartic envelopes as in the previous example. Here we introduce two new features. First \, there are number boxes to show the most recent targets for amplitude and frequency \, which you can also use to change the values. Also \, if amplitude gets a message without an explicit time value \, we supply a default of "30"., f 63; +#X text 20 332 see or; +#X text 20 350 change; +#X text 208 361 and; +#X text 417 271 first bang the "30" \, then pass the list on, f 22; +#X obj 347 317 unpack f f; +#X text 111 25 This abstraction is used in patch D13.additive.qlist.pd.; +#X obj 431 317 f 30; +#X text 470 308 This is more CPU efficient than a message., f 17; +#X obj 347 265 r amp\$1; +#X obj 258 404 s amp\$1; +#X obj 81 395 s pit\$1; +#X obj 148 293 r pit\$1; +#X text 85 173 Other small differences from the previous patch: pitch and amplitude are now in MIDI and dB., f 55; +#X text 377 439 The [pack] always gets a 30 \, but if you send a pair of numbers to amplitude \, the second one overrides the 30, f 28; +#X text 208 378 amp ->; +#X text 20 369 pitch ->; #X connect 0 0 13 0; #X connect 0 0 13 1; #X connect 1 0 15 0; #X connect 1 0 15 1; #X connect 2 0 17 0; #X connect 3 0 9 0; -#X connect 4 0 32 0; -#X connect 4 1 34 0; +#X connect 4 0 29 0; +#X connect 4 1 31 0; #X connect 5 0 1 0; #X connect 6 0 8 0; #X connect 6 0 21 0; @@ -72,13 +64,13 @@ and amplitude are now in MIDI and dB., f 45; #X connect 15 0 16 0; #X connect 15 0 16 1; #X connect 16 0 2 1; -#X connect 18 0 37 0; +#X connect 18 0 34 0; #X connect 19 0 18 0; -#X connect 20 0 38 0; +#X connect 20 0 35 0; #X connect 21 0 20 0; -#X connect 32 0 3 0; -#X connect 32 0 19 0; -#X connect 32 1 5 1; -#X connect 34 0 5 1; -#X connect 36 0 4 0; -#X connect 39 0 6 0; +#X connect 29 0 3 0; +#X connect 29 0 19 0; +#X connect 29 1 5 1; +#X connect 31 0 5 1; +#X connect 33 0 4 0; +#X connect 36 0 6 0; diff --git a/doc/3.audio.examples/qlist.txt b/doc/3.audio.examples/qlist.txt index 719dc89b..dbdb5c30 100644 --- a/doc/3.audio.examples/qlist.txt +++ b/doc/3.audio.examples/qlist.txt @@ -1,56 +1,56 @@ -# This is a qlist for patch number 68, which demonstrates an oscillator -bank. -; -# comments start with a "#" which must be followed by a space. The comment -is terminated by a semicolon like this: ; - -# first an arpeggio. You can group them in lines as you please. The 100s at -the beginnings of lines are delay times. ; - -pit1 89; amp1 80; -100 pit2 72; amp2 80; -100 pit3 57; amp3 90; -100 pit4 84; amp4 78; -100 pit5 74; amp5 74; -100 pit6 73; amp6 74; -100 pit7 100; amp7 78; -100 pit8 37; amp8 95; - -# after a 600-msec rest, gliss four of the oscillators to new frequencies. ; -600 pit1 70 1000; -300 pit8 40 1000; -300 pit4 89 1000; -300 pit7 95 1000; - -# a second later, turn them off with decay time 1500 ; -1000 -amp1 0 1500; -amp2 0 1500; -amp3 0 1500; -amp4 0 1500; -amp5 0 1500; -amp6 0 1500; -amp7 0 1500; -amp8 0 1500; - -# and re-attack them.. ; -1000 -amp1 85 5; -amp2 85 5; -amp3 85 5; -amp4 90 5; -amp5 85 5; -amp6 85 5; -amp7 90 5; -amp8 85 5; - -# this time, try varying decay times. ; -10 -amp1 0 2000; -amp2 0 2000; -amp3 0 2000; -amp4 0 500; -amp5 0 1000; -amp6 0 1000; -amp7 0 500; -amp8 0 4000; +# This is a [qlist] text file used in the D13 example, which demonstrates an oscillator +bank. ; + +# comments in this file start with a "#" which must be followed by a space. The comment +is terminated by a semicolon like this -> ; + +# first an arpeggio. You can group them in lines as you please. The 100s at +the beginnings of lines are delay times. ; + +pit1 89; amp1 80; +100 pit2 72; amp2 80; +100 pit3 57; amp3 90; +100 pit4 84; amp4 78; +100 pit5 74; amp5 74; +100 pit6 73; amp6 74; +100 pit7 100; amp7 78; +100 pit8 37; amp8 95; + +# after a 600-msec rest, gliss four of the oscillators to new frequencies. ; +600 pit1 70 1000; +300 pit8 40 1000; +300 pit4 89 1000; +300 pit7 95 1000; + +# a second later, turn them off with decay time 1500 ; +1000 +amp1 0 1500; +amp2 0 1500; +amp3 0 1500; +amp4 0 1500; +amp5 0 1500; +amp6 0 1500; +amp7 0 1500; +amp8 0 1500; + +# and re-attack them.. ; +1000 +amp1 85 5; +amp2 85 5; +amp3 85 5; +amp4 90 5; +amp5 85 5; +amp6 85 5; +amp7 90 5; +amp8 85 5; + +# this time, try varying decay times. ; +10 +amp1 0 2000; +amp2 0 2000; +amp3 0 2000; +amp4 0 500; +amp5 0 1000; +amp6 0 1000; +amp7 0 500; +amp8 0 4000; \ No newline at end of file diff --git a/doc/3.audio.examples/qlist2.txt b/doc/3.audio.examples/qlist2.txt index 5c272646..37797782 100644 --- a/doc/3.audio.examples/qlist2.txt +++ b/doc/3.audio.examples/qlist2.txt @@ -1,5 +1,5 @@ -note 36; -1000 note 34; -1000 note 33; -1000 note 31; -1000 qlist bang; +note 36; +1000 note 34; +1000 note 33; +1000 note 31; +1000 qlist bang; diff --git a/doc/3.audio.examples/sampvoice.pd b/doc/3.audio.examples/sampvoice.pd index c8b2498d..0c1cfbaf 100644 --- a/doc/3.audio.examples/sampvoice.pd +++ b/doc/3.audio.examples/sampvoice.pd @@ -1,15 +1,15 @@ -#N canvas 449 25 698 677 12; +#N canvas 449 38 698 677 12; #X obj 250 507 *~; -#X obj 337 635 outlet~; +#X obj 319 636 outlet~; #X obj 103 412 makefilename sample%d; #X msg 103 438 set \$1; #X obj 317 433 dbtorms; #X obj 335 402 unpack; #X obj 317 456 sqrt; #X obj 317 479 sqrt; -#X obj 337 593 *~; -#X obj 355 534 *~; -#X obj 355 557 *~; +#X obj 319 594 *~; +#X obj 337 535 *~; +#X obj 337 564 *~; #X obj 222 96 delay 5; #X obj 437 195 f; #X obj 388 170 f; diff --git a/doc/3.audio.examples/sampvoice2.pd b/doc/3.audio.examples/sampvoice2.pd index 42059d47..c3b1d5d5 100644 --- a/doc/3.audio.examples/sampvoice2.pd +++ b/doc/3.audio.examples/sampvoice2.pd @@ -1,60 +1,59 @@ -#N canvas 392 23 708 715 12; -#X obj 251 572 *~; -#X obj 251 682 outlet~; -#X obj 94 489 makefilename sample%d; -#X msg 94 512 set \$1; -#X obj 329 515 dbtorms; -#X obj 329 538 sqrt; -#X obj 329 561 sqrt; -#X obj 329 584 line~; -#X obj 251 620 *~; -#X obj 329 607 *~; -#X obj 329 630 *~; -#X obj 104 206 delay 5; -#X obj 405 273 f; -#X obj 370 273 f; -#X obj 296 273 f; -#X obj 257 273 f; -#X obj 226 273 f; -#X obj 127 265 f; -#X obj 127 288 mtof; -#X obj 127 311 / 261.62; -#X obj 127 334 * 4.41e+08; -#X obj 127 365 +; -#X obj 104 229 t b b b; -#X obj 296 319 + 1; -#X obj 296 296 * 44.1; -#X msg 92 437 0 5; -#X msg 269 437 1 5; -#X msg 329 437 0 \, \$1 \$2; -#X msg 128 437 \$3 \, \$4 1e+07; -#X msg 227 437 \$5; -#X msg 405 437 0 \$1; -#X obj 254 108 inlet; -#X text 474 232 pitch in halftones; -#X text 475 209 amplitude (dB); -#X text 475 257 sample number; -#X text 475 281 start location (msec); -#X text 475 305 rise time (msec); -#X text 475 329 decay time (msec); -#X text 474 184 ARGUMENTS FOR NOTE ON:; -#X text 436 368 (Zero amplitude means note off \;; -#X text 457 389 other parameters are ignored.); -#X obj 254 141 route 0; -#X text 37 15 This is an abstraction used by the polyphonic sampler \, version 2 \, which takes separate note-on and note-off messages. Unlike "sampvoice" (the first version) \, there is no "duration" field \, and the amplitude and pitch fields are reversed to make it easy to separate note-on from note-off messages (which have amplitude zero.), f 71; -#X text 323 152 note-on; -#X text 187 152 note-off; -#X obj 34 492 vline~; -#X obj 269 489 vline~; -#X obj 300 174 unpack f f f f f f; -#X obj 227 402 pack f f f f f; -#X obj 329 489 unpack f f; -#X obj 254 165 b; -#X obj 94 538 tabread4~; -#X obj 92 179 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#N canvas 392 38 707 752 12; +#X obj 251 594 *~; +#X obj 251 704 outlet~; +#X obj 94 511 makefilename sample%d; +#X msg 94 534 set \$1; +#X obj 329 537 dbtorms; +#X obj 329 560 sqrt; +#X obj 329 583 sqrt; +#X obj 329 606 line~; +#X obj 251 642 *~; +#X obj 311 634 *~; +#X obj 311 662 *~; +#X obj 104 228 delay 5; +#X obj 405 295 f; +#X obj 370 295 f; +#X obj 296 295 f; +#X obj 257 295 f; +#X obj 226 295 f; +#X obj 127 287 f; +#X obj 127 310 mtof; +#X obj 127 333 / 261.62; +#X obj 127 356 * 4.41e+08; +#X obj 127 387 +; +#X obj 104 251 t b b b; +#X obj 296 341 + 1; +#X obj 296 318 * 44.1; +#X msg 92 459 0 5; +#X msg 269 459 1 5; +#X msg 329 459 0 \, \$1 \$2; +#X msg 128 459 \$3 \, \$4 1e+07; +#X msg 227 459 \$5; +#X msg 405 459 0 \$1; +#X obj 254 130 inlet; +#X text 474 254 pitch in halftones; +#X text 475 231 amplitude (dB); +#X text 475 279 sample number; +#X text 475 303 start location (msec); +#X text 475 327 rise time (msec); +#X text 475 351 decay time (msec); +#X text 474 206 ARGUMENTS FOR NOTE ON:; +#X obj 254 163 route 0; +#X text 323 174 note-on; +#X text 187 174 note-off; +#X obj 34 514 vline~; +#X obj 269 511 vline~; +#X obj 300 196 unpack f f f f f f; +#X obj 227 424 pack f f f f f; +#X obj 329 511 unpack f f; +#X obj 254 187 b; +#X obj 94 560 tabread4~; +#X obj 92 201 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 99 28 This is an abstraction used by the polyphonic sampler \, version 2 \, which takes separate note-on and note-off messages. Unlike [sampvoice] (the first version) \, there is no "duration" field \, and the amplitude and pitch fields are reversed to make it easy to separate note-on from note-off messages (which have amplitude zero.), f 71; +#X text 442 388 (Zero amplitude means note off other parameters are ignored.), f 31; #X connect 0 0 8 0; #X connect 2 0 3 0; -#X connect 3 0 51 0; +#X connect 3 0 48 0; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 6 0 7 0; @@ -66,48 +65,48 @@ #X connect 10 0 8 1; #X connect 11 0 22 0; #X connect 12 0 30 0; -#X connect 13 0 48 1; +#X connect 13 0 45 1; #X connect 14 0 24 0; -#X connect 15 0 48 4; -#X connect 16 0 48 0; +#X connect 15 0 45 4; +#X connect 16 0 45 0; #X connect 17 0 18 0; #X connect 18 0 19 0; #X connect 19 0 20 0; #X connect 20 0 21 0; -#X connect 21 0 48 3; +#X connect 21 0 45 3; #X connect 22 0 16 0; #X connect 22 1 17 0; #X connect 22 2 13 0; #X connect 22 2 14 0; #X connect 22 2 15 0; #X connect 23 0 21 1; -#X connect 23 0 48 2; +#X connect 23 0 45 2; #X connect 24 0 23 0; -#X connect 25 0 46 0; -#X connect 26 0 46 0; -#X connect 27 0 49 0; -#X connect 28 0 45 0; +#X connect 25 0 43 0; +#X connect 26 0 43 0; +#X connect 27 0 46 0; +#X connect 28 0 42 0; #X connect 29 0 2 0; -#X connect 30 0 49 0; -#X connect 31 0 41 0; -#X connect 41 0 50 0; -#X connect 41 1 47 0; -#X connect 45 0 51 0; -#X connect 46 0 0 1; -#X connect 47 0 16 1; -#X connect 47 0 52 0; -#X connect 47 1 17 1; -#X connect 47 2 15 1; -#X connect 47 3 14 1; -#X connect 47 4 13 1; -#X connect 47 5 12 1; -#X connect 48 0 26 0; -#X connect 48 0 27 0; -#X connect 48 0 28 0; -#X connect 48 0 29 0; -#X connect 49 0 4 0; -#X connect 49 1 7 1; -#X connect 50 0 12 0; -#X connect 51 0 0 0; -#X connect 52 0 11 0; -#X connect 52 0 25 0; +#X connect 30 0 46 0; +#X connect 31 0 39 0; +#X connect 39 0 47 0; +#X connect 39 1 44 0; +#X connect 42 0 48 0; +#X connect 43 0 0 1; +#X connect 44 0 16 1; +#X connect 44 0 49 0; +#X connect 44 1 17 1; +#X connect 44 2 15 1; +#X connect 44 3 14 1; +#X connect 44 4 13 1; +#X connect 44 5 12 1; +#X connect 45 0 26 0; +#X connect 45 0 27 0; +#X connect 45 0 28 0; +#X connect 45 0 29 0; +#X connect 46 0 4 0; +#X connect 46 1 7 1; +#X connect 47 0 12 0; +#X connect 48 0 0 0; +#X connect 49 0 11 0; +#X connect 49 0 25 0; diff --git a/doc/3.audio.examples/shepvoice.pd b/doc/3.audio.examples/shepvoice.pd index 766adf85..00c8e411 100644 --- a/doc/3.audio.examples/shepvoice.pd +++ b/doc/3.audio.examples/shepvoice.pd @@ -1,30 +1,26 @@ #N canvas 422 88 682 458 12; -#X obj 153 279 line~; -#X obj 211 315 line~; -#X obj 153 346 *~; -#X obj 153 382 outlet~; -#X obj 312 202 r pitch+; -#X obj 221 175 r interval+; -#X obj 153 201 expr $f1 * $f2 + $f3; -#X obj 542 177 r dropoff+; -#X obj 308 92 expr ($i1% 10000) * 0.0002 - 1; -#X obj 308 40 r phase; -#X obj 391 203 expr exp(-$f1*$f1*$f2); -#X obj 153 227 mtof; -#X obj 153 305 osc~; -#X text 89 30 our local phase =; -#X text 86 48 overall phase + our; -#X text 85 67 relative phase; -#X text 82 86 (modulo 10000); -#X text 84 103 normalized from -1 to 1; -#X text 470 65 \$1: relative phase; -#X text 34 132 pitch is center pitch; -#X text 41 147 + interval*phase; -#X text 388 232 amplitude is Gaussian \, with; -#X text 336 253 peak width controlled by "dropoff"; -#X obj 308 66 expr $f1 + (\$1 * 500); -#X obj 211 289 pack f 50; -#X obj 153 254 pack f 50; +#X obj 180 284 line~; +#X obj 238 320 line~; +#X obj 180 351 *~; +#X obj 180 387 outlet~; +#X obj 339 207 r pitch+; +#X obj 248 180 r interval+; +#X obj 180 206 expr $f1 * $f2 + $f3; +#X obj 569 182 r dropoff+; +#X obj 335 97 expr ($i1% 10000) * 0.0002 - 1; +#X obj 335 45 r phase; +#X obj 418 208 expr exp(-$f1*$f1*$f2); +#X obj 180 232 mtof; +#X obj 180 310 osc~; +#X text 497 70 \$1: relative phase; +#X text 61 137 pitch is center pitch; +#X text 68 152 + interval*phase; +#X text 415 237 amplitude is Gaussian \, with; +#X text 377 257 peak width controlled by "dropoff"; +#X obj 335 71 expr $f1 + (\$1 * 500); +#X obj 238 294 pack f 50; +#X obj 180 259 pack f 50; +#X text 32 63 our local phase = overall phase + our relative phase (modulo 10000) normalized from -1 to 1, f 40; #X connect 0 0 12 0; #X connect 1 0 2 1; #X connect 2 0 3 0; @@ -34,10 +30,10 @@ #X connect 7 0 10 1; #X connect 8 0 6 0; #X connect 8 0 10 0; -#X connect 9 0 23 0; -#X connect 10 0 24 0; -#X connect 11 0 25 0; +#X connect 9 0 18 0; +#X connect 10 0 19 0; +#X connect 11 0 20 0; #X connect 12 0 2 0; -#X connect 23 0 8 0; -#X connect 24 0 1 0; -#X connect 25 0 0 0; +#X connect 18 0 8 0; +#X connect 19 0 1 0; +#X connect 20 0 0 0; diff --git a/doc/5.reference/qlist.txt b/doc/5.reference/qlist.txt index 790a8945..8716a87d 100644 --- a/doc/5.reference/qlist.txt +++ b/doc/5.reference/qlist.txt @@ -1,3 +1,3 @@ this text file is read by qlist.pd; 1000 that should explain everything; -1000; +1000; \ No newline at end of file diff --git a/doc/5.reference/tabplay~-help.pd b/doc/5.reference/tabplay~-help.pd index b0305e94..18b59973 100644 --- a/doc/5.reference/tabplay~-help.pd +++ b/doc/5.reference/tabplay~-help.pd @@ -1,25 +1,25 @@ -#N canvas 287 58 867 486 12; +#N canvas 287 58 866 500 12; #X declare -stdpath ./; -#X text 148 139 "set" message permits you to switch between arrays; -#X obj 105 446 tabwrite~; +#X text 146 151 "set" message permits you to switch between arrays; +#X obj 105 454 tabwrite~; #X obj 55 18 tabplay~; #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; -#X text 131 188 play starting at 44100th sample; -#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 447 updated for Pd version 0.43; -#X msg 102 264 stop; -#X text 138 265 stop playing (outputs zeros when stopped); -#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 446 see also:; -#X obj 63 336 output~; +#X obj 177 454 soundfiler; +#X obj 325 454 tabread4~; +#X msg 90 226 0 44100; +#X msg 84 201 44100; +#X text 101 176 "bang" or 0 plays whole sample; +#X text 131 200 play starting at 44100th sample; +#X text 148 224 play starting at beginning for 44100 samples; +#X msg 95 251 44100 1000; +#X text 173 250 play from 44100 through 45099 (1000 samples); +#X text 654 454 updated for Pd version 0.43; +#X msg 102 276 stop; +#X text 138 277 stop playing (outputs zeros when stopped); +#X obj 207 346 bng 23 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X msg 63 151 set sample; +#X text 26 454 see also:; +#X obj 63 348 output~; #X obj 699 145 declare -stdpath ./; #X text 641 80 load table; #X obj 574 80 loadbang; @@ -50,9 +50,9 @@ #X connect 11 0 2 0; #X connect 13 0 11 0; #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 445 array; +#X restore 359 392 pd Dealing_with_"\$0"; +#X text 197 383 open subpatch to see how to deal with '\$0', f 21; +#X obj 399 453 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; @@ -78,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 423 cnv 1 850 1 empty empty empty 8 12 0 13 #000000 #000000 0; +#X obj 8 431 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; @@ -101,11 +101,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 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 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 446 tabread~; +#X restore 502 454 pd array-examples; +#X text 237 349 <-- bang when finished playing the table; +#X obj 77 177 bng 17 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 259 454 tabread~; #N canvas 519 131 758 403 multichannel 0; #X obj 58 183 tabplay~ left right; #X obj 58 281 output~; @@ -142,20 +141,21 @@ #X text 570 358 mutichannel signal support ----------->, f 20; #X text 122 17 - play back from tables (non-transposing); #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 63 303 tabplay~ sample-table; +#X text 219 302 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; +#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. This also means it is less flexible and can only play samples that have the same sample rate that Pd is running., f 62; +#X connect 6 0 38 0; +#X connect 7 0 38 0; +#X connect 11 0 38 0; +#X connect 14 0 38 0; +#X connect 17 0 38 0; +#X connect 22 0 37 0; +#X connect 32 0 38 0; +#X connect 37 0 3 0; +#X connect 38 0 19 0; +#X connect 38 1 16 0; diff --git a/doc/5.reference/tabread4~-help.pd b/doc/5.reference/tabread4~-help.pd index c089d0da..4ddb8869 100644 --- a/doc/5.reference/tabread4~-help.pd +++ b/doc/5.reference/tabread4~-help.pd @@ -1,8 +1,8 @@ #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; -#X floatatom 36 427 6 0 0 0 - - - 0; +#X obj 36 411 snapshot~; +#X obj 36 175 sig~; +#X floatatom 36 149 6 1 8 0 - - - 0; +#X floatatom 36 437 6 0 0 0 - - - 0; #X obj 44 17 tabread4~; #X obj 94 487 tabwrite~; #X obj 229 487 tabread; @@ -10,8 +10,8 @@ #X obj 353 487 tabsend~; #X obj 94 513 tabreceive~; #X obj 165 487 tabplay~; -#X floatatom 166 250 5 0 10 0 - - - 0; -#X obj 231 381 ../3.audio.examples/B15.tabread4~-onset; +#X floatatom 166 260 5 0 10 0 - - - 0; +#X obj 231 391 ../3.audio.examples/B15.tabread4~-onset; #X obj 181 513 tabosc4~; #X obj 249 513 soundfiler; #N canvas 780 240 401 220 init-table 0; @@ -19,8 +19,8 @@ #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; -#X msg 52 207 set table2-ex; +#X obj 36 323 tabread4~ table2-ex; +#X msg 52 217 set table2-ex; #X text 124 16 - 4-point-interpolating table lookup for signals; #N canvas 721 150 593 441 Dealing_with_"\$0" 0; #X text 462 275 <= array with local name, f 13; @@ -52,7 +52,7 @@ #X connect 13 0 12 0; #X connect 15 0 13 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; +#X obj 39 121 hsl 162 19 1 8 0 0 empty empty empty -2 -8 0 10 #dfdfdf #000000 #000000 0 1; #N canvas 722 96 575 293 reference 0; #X obj 11 52 cnv 5 550 5 empty empty INLET: 8 18 0 13 #202020 #000000 0; #X obj 11 186 cnv 2 550 2 empty empty OUTLET: 8 12 0 13 #202020 #000000 0; @@ -74,7 +74,7 @@ #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 342 Open this example for more details on setting onset:, f 35; +#X text 245 352 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:; @@ -101,10 +101,9 @@ #X connect 1 0 0 0; #X connect 2 0 0 0; #X restore 331 513 pd array-examples; -#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; +#X msg 457 244 \; pd dsp \$1; +#X obj 457 209 set-dsp-tgl; +#X text 374 212 DSP on/off; #N canvas 749 203 563 414 multichannel 0; #X obj 68 270 snake~ out, f 12; #X obj 69 151 sig~; @@ -145,30 +144,31 @@ #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; -#X obj 56 368 r bang; -#X text 89 137 incoming signal is index. Indices should range from 1 to (size-2) so that the 4-point interpolation is meaningful (from 1 to 8 in this example)., f 52; -#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 obj 128 402 metro 200; +#X obj 128 375 loadbang; +#X obj 128 430 s bang; +#X obj 56 378 r bang; +#X text 89 147 incoming signal is index. Indices should range from 1 to (size-2) so that the 4-point interpolation is meaningful (from 1 to 8 in this example)., f 52; +#X text 212 255 set table onset to improve the accuracy of indexing (useful if you have Pd compiled for single precision), f 31; +#X text 157 210 "set" message lets you switch between arrays, f 22; +#X text 102 260 onset ->; #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 obj 166 281 sig~; +#X obj 166 291 sig~; #X text 625 507 updated for Pd version 0.55; +#X text 30 63 [tabread4~] is used to build samplers with more flexibility than [tabplay~] and other table lookup algorithms. The interpolation scheme is 4-point polynomial as used in [delread4~] and [tabosc4~]., f 67; #X connect 0 0 3 0; #X connect 1 0 16 0; #X connect 2 0 1 0; -#X connect 11 0 45 0; +#X connect 11 0 44 0; #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; -#X connect 45 0 16 1; +#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 44 0 16 1; From 41f04bcf2233dbd07b19e1ecb65ef4969d032a25 Mon Sep 17 00:00:00 2001 From: porres Date: Tue, 16 Jul 2024 01:13:52 -0300 Subject: [PATCH 41/89] remove "updated for version x.xx-x" in tutorials closes https://github.com/pure-data/pddp/issues/231 a remark was made for the phase vocoder example to say algorithm changed in 0.44 --- doc/2.control.examples/01.PART1.hello.pd | 5 +- doc/2.control.examples/02.editing.pd | 3 +- doc/2.control.examples/03.connections.pd | 13 +- doc/2.control.examples/04.messages.pd | 13 +- doc/2.control.examples/05.counter.pd | 7 +- doc/2.control.examples/06.more.counters.pd | 9 +- doc/2.control.examples/07.time.pd | 7 +- doc/2.control.examples/08.depthfirst.pd | 21 ++-- doc/2.control.examples/09.send_receive.pd | 1 - doc/2.control.examples/10.more.messages.pd | 34 ++---- doc/2.control.examples/11.review.pd | 3 +- doc/2.control.examples/12.PART2.subpatch.pd | 19 ++- doc/2.control.examples/13.locality.pd | 20 ++-- doc/2.control.examples/14.dollarsigns.pd | 8 +- doc/2.control.examples/15.array.pd | 21 ++-- doc/2.control.examples/16.more.arrays.pd | 21 ++-- doc/2.control.examples/17.PART3.midi.pd | 15 +-- doc/2.control.examples/18.conditional.pd | 47 ++++---- doc/2.control.examples/19.random.pd | 25 ++-- doc/2.control.examples/20.weighted-random.pd | 23 ++-- doc/2.control.examples/21.markov.chain.pd | 51 ++++---- doc/2.control.examples/22.random-walk.pd | 9 +- doc/2.control.examples/23.sequencing.pd | 34 ++---- doc/2.control.examples/24.loops.pd | 5 +- doc/3.audio.examples/A00.intro.pd | 3 +- doc/3.audio.examples/A01.sinewave.pd | 7 +- doc/3.audio.examples/A02.amplitude.pd | 5 +- doc/3.audio.examples/A03.line.pd | 15 ++- doc/3.audio.examples/A04.line2.pd | 7 +- doc/3.audio.examples/A05.output.subpatch.pd | 1 - doc/3.audio.examples/A06.frequency.pd | 9 +- doc/3.audio.examples/A07.fusion.pd | 5 +- doc/3.audio.examples/A08.beating.pd | 1 - doc/3.audio.examples/A09.frequency.mod.pd | 5 +- doc/3.audio.examples/A10.review.pd | 1 - doc/3.audio.examples/B01.wavetables.pd | 7 +- doc/3.audio.examples/B02.two-wavetables.pd | 7 +- doc/3.audio.examples/B03.tabread4.pd | 11 +- .../B04.tabread4.interpolation.pd | 17 ++- doc/3.audio.examples/B05.tabread.FM.pd | 5 +- doc/3.audio.examples/B06.table.switching.pd | 1 - doc/3.audio.examples/B07.sampler.pd | 15 ++- doc/3.audio.examples/B08.sampler.loop.pd | 21 ++-- .../B09.sampler.loop.smooth.pd | 5 +- doc/3.audio.examples/B10.sampler.scratch.pd | 31 +++-- doc/3.audio.examples/B11.sampler.nodoppler.pd | 7 +- doc/3.audio.examples/B12.sampler.transpose.pd | 21 ++-- doc/3.audio.examples/B13.sampler.overlap.pd | 59 +++++---- .../B14.sampler.rockafella.pd | 103 ++++++++-------- doc/3.audio.examples/B15.tabread4~-onset.pd | 1 - doc/3.audio.examples/B16.long-varispeed.pd | 1 - doc/3.audio.examples/C01.nyquist.pd | 9 +- doc/3.audio.examples/C02.sawtooth-foldover.pd | 19 ++- doc/3.audio.examples/C03.zipper.noise.pd | 29 +++-- doc/3.audio.examples/C04.control.to.signal.pd | 3 +- doc/3.audio.examples/C05.sampler.oneshot.pd | 11 +- doc/3.audio.examples/C06.signal.to.control.pd | 7 +- doc/3.audio.examples/C07.envelope.follower.pd | 21 ++-- doc/3.audio.examples/C08.analog.sequencer.pd | 33 +++--- doc/3.audio.examples/C09.sample.hold.pd | 25 ++-- doc/3.audio.examples/C10.monophonic.synth.pd | 13 +- doc/3.audio.examples/D01.envelope.gen.pd | 21 ++-- doc/3.audio.examples/D02.adsr.pd | 19 ++- doc/3.audio.examples/D03.envelope.dB.pd | 7 +- doc/3.audio.examples/D04.envelope.quartic.pd | 3 +- doc/3.audio.examples/D05.envelope.pitch.pd | 17 ++- .../D06.envelope.portamento.pd | 15 ++- doc/3.audio.examples/D07.additive.pd | 23 ++-- doc/3.audio.examples/D08.table.spectrum.pd | 1 - doc/3.audio.examples/D09.shepard.tone.pd | 1 - doc/3.audio.examples/D10.sampler.notes.pd | 1 - doc/3.audio.examples/D11.sampler.poly.pd | 7 +- doc/3.audio.examples/D12.sampler.bis.pd | 1 - doc/3.audio.examples/D13.additive.qlist.pd | 19 ++- doc/3.audio.examples/D14.vibrato.pd | 1 - doc/3.audio.examples/E01.spectrum.pd | 69 ++++++----- doc/3.audio.examples/E02.ring.modulation.pd | 112 +++++++++--------- doc/3.audio.examples/E03.octave.divider.pd | 21 ++-- doc/3.audio.examples/E04.difference.tone.pd | 13 +- doc/3.audio.examples/E05.chebychev.pd | 29 +++-- doc/3.audio.examples/E06.exponential.pd | 29 +++-- doc/3.audio.examples/E07.evenodd.pd | 39 +++--- doc/3.audio.examples/E08.phase.mod.pd | 9 +- doc/3.audio.examples/E09.FM.spectrum.pd | 23 ++-- doc/3.audio.examples/E10.complex.FM.pd | 47 ++++---- doc/3.audio.examples/F01.pulse.pd | 13 +- doc/3.audio.examples/F02.just.say.pd | 11 +- doc/3.audio.examples/F03.pulse.spectrum.pd | 9 +- doc/3.audio.examples/F04.waveshaping.pulse.pd | 1 - doc/3.audio.examples/F05.ring.modulation.pd | 23 ++-- doc/3.audio.examples/F06.packets.pd | 11 +- doc/3.audio.examples/F07.packet.spectrum.pd | 5 +- doc/3.audio.examples/F08.two.cosines.pd | 15 ++- doc/3.audio.examples/F09.declickit.pd | 41 ++++--- doc/3.audio.examples/F10.sweepable.FM.pd | 11 +- doc/3.audio.examples/F11.anharmonic.FM.pd | 25 ++-- doc/3.audio.examples/F12.paf.pd | 1 - doc/3.audio.examples/F13.paf.control.pd | 5 +- doc/3.audio.examples/F14.wave.packet.pd | 1 - doc/3.audio.examples/G01.delay.pd | 7 +- doc/3.audio.examples/G02.delay.loop.pd | 1 - doc/3.audio.examples/G03.delay.variable.pd | 11 +- doc/3.audio.examples/G04.control.blocksize.pd | 13 +- doc/3.audio.examples/G05.execution.order.pd | 7 +- doc/3.audio.examples/G06.octave.doubler.pd | 17 ++- doc/3.audio.examples/G07.shaker.pd | 9 +- doc/3.audio.examples/G08.reverb.pd | 11 +- doc/3.audio.examples/G09.pitchshift.pd | 9 +- doc/3.audio.examples/H01.low-pass.pd | 1 - doc/3.audio.examples/H02.high-pass.pd | 11 +- doc/3.audio.examples/H03.band-pass.pd | 15 ++- doc/3.audio.examples/H04.filter.sweep.pd | 5 +- doc/3.audio.examples/H05.filter.floyd.pd | 35 +++--- doc/3.audio.examples/H06.envelope.follower.pd | 21 ++-- doc/3.audio.examples/H07.measure.spectrum.pd | 5 +- doc/3.audio.examples/H08.heterodyning.pd | 43 ++++--- doc/3.audio.examples/H09.ssb.modulation.pd | 13 +- doc/3.audio.examples/H10.measurement.pd | 19 ++- doc/3.audio.examples/H11.shelving.pd | 1 - doc/3.audio.examples/H12.peaking.pd | 49 ++++---- doc/3.audio.examples/H13.butterworth.pd | 19 ++- doc/3.audio.examples/H14.all.pass.pd | 23 ++-- doc/3.audio.examples/H15.phaser.pd | 1 - doc/3.audio.examples/H16.adsr.filter.qlist.pd | 41 ++++--- doc/3.audio.examples/I01.Fourier.analysis.pd | 3 +- doc/3.audio.examples/I02.Hann.window.pd | 21 ++-- doc/3.audio.examples/I03.resynthesis.pd | 9 +- doc/3.audio.examples/I05.compressor.pd | 9 +- doc/3.audio.examples/I06.timbre.stamp.pd | 5 +- doc/3.audio.examples/I07.phase.vocoder.pd | 110 ++++++++--------- doc/3.audio.examples/I08.pvoc.reverb.pd | 7 +- doc/3.audio.examples/I09.sheep.from.goats.pd | 5 +- doc/3.audio.examples/I10.phase.bash.pd | 33 +++--- doc/3.audio.examples/J01.even.odd.pd | 25 ++-- doc/3.audio.examples/J02.trapezoids.pd | 63 +++++----- doc/3.audio.examples/J03.pulse.width.mod.pd | 23 ++-- doc/3.audio.examples/J04.corners.pd | 83 +++++++------ doc/3.audio.examples/J05.triangle.pd | 29 +++-- doc/3.audio.examples/J06.enveloping.pd | 47 ++++---- doc/3.audio.examples/J07.oversampling.pd | 5 +- doc/3.audio.examples/J08.classicsynth.pd | 65 +++++----- doc/3.audio.examples/J09.bandlimited.pd | 7 +- doc/4.data.structures/01.scalars.pd | 3 +- doc/4.data.structures/02.getting.data.pd | 3 +- doc/4.data.structures/03.setting.data.pd | 53 ++++----- doc/4.data.structures/04.append.pd | 7 +- doc/4.data.structures/05.symbol.text.pd | 45 ++++--- doc/4.data.structures/06.array.pd | 45 ++++--- doc/4.data.structures/07.graph.on.parent.pd | 36 ++---- doc/4.data.structures/08.file.pd | 3 +- doc/4.data.structures/09.sequencer.pd | 1 - doc/4.data.structures/10.interaction.pd | 30 +---- doc/4.data.structures/11.scaling.pd | 1 - doc/4.data.structures/12.onoff.pd | 27 ++--- doc/4.data.structures/13.array.controls.pd | 35 ++---- doc/4.data.structures/16.FFT-plot.pd | 35 +++--- doc/4.data.structures/17.partialtracer.pd | 3 +- doc/4.data.structures/add-trace.pd | 2 +- 158 files changed, 1345 insertions(+), 1574 deletions(-) diff --git a/doc/2.control.examples/01.PART1.hello.pd b/doc/2.control.examples/01.PART1.hello.pd index 63a635d5..28059964 100644 --- a/doc/2.control.examples/01.PART1.hello.pd +++ b/doc/2.control.examples/01.PART1.hello.pd @@ -1,8 +1,7 @@ -#N canvas 576 35 490 585 12; +#N canvas 576 38 490 568 12; #X msg 126 84 hello world; #X obj 126 177 print; #X floatatom 149 115 5 0 0 0 - - - 0; -#X text 274 540 updated for version 0.52; #X obj 164 144 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X text 24 418 Objects \, like [print] above \, may have all sorts of functions depending on what's typed into them. The [print] object simply prints out every message it receives \, either from message boxes \, GUIs or the outlet of other objects., f 63; #X text 173 177 <-- object box; @@ -15,4 +14,4 @@ #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; +#X connect 3 0 1 0; diff --git a/doc/2.control.examples/02.editing.pd b/doc/2.control.examples/02.editing.pd index 26e6d921..27bc8ad7 100644 --- a/doc/2.control.examples/02.editing.pd +++ b/doc/2.control.examples/02.editing.pd @@ -14,7 +14,6 @@ #X text 29 140 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 58; #X text 29 276 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 58; #X text 29 333 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 58; -#X text 737 503 updated for Pd version 0.55; #X text 497 247 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 556 462 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #N canvas 798 148 456 264 open-manual 0; @@ -34,4 +33,4 @@ #X connect 0 0 1 0; #X connect 2 0 1 0; #X connect 10 0 1 0; -#X connect 17 0 18 0; +#X connect 16 0 17 0; diff --git a/doc/2.control.examples/03.connections.pd b/doc/2.control.examples/03.connections.pd index 59d9033b..e1def01e 100644 --- a/doc/2.control.examples/03.connections.pd +++ b/doc/2.control.examples/03.connections.pd @@ -1,4 +1,4 @@ -#N canvas 511 32 530 673 12; +#N canvas 511 38 529 651 12; #X floatatom 245 490 5 0 0 0 - - - 0; #X floatatom 198 490 5 0 0 0 - - - 0; #X floatatom 216 390 4 0 0 0 - - - 0; @@ -19,7 +19,6 @@ #X obj 198 464 -; #X text 285 489 square; #X text 76 491 first difference; -#X text 296 637 updated for Pd version 0.33; #X obj 216 417 t f f; #X text 265 417 same as:; #X obj 330 417 trigger float float; @@ -27,7 +26,7 @@ #X text 37 233 In Pd you must sometimes think about what order an object is going to get its messages in. If an outlet is connected to more than one inlet it's undefined which inlet will get the cookie first. I've rigged this example so that the left-hand side box gets its inputs in the good \, right-to-left order \, so that the hot inlet gets hit when all the data are good. The "bad adder" happens to receive its inputs in the wrong order and is perpetually doing its addition before all the data are in. There's a [trigger] object that exists solely to allow you to control message order explicitly:, f 67; #X text 44 544 A [trigger] takes any number of "bang" and "float" arguments (among others). The object and arguments can be abbreviated with the first letter. It sequences messages in right-to-left order. Hook it to two inputs without crossing the wires and you get the expected result. Cross the wires and you get a memory effect., f 64; #X text 235 99 Here's the downside: drag this -->, f 20; -#X connect 2 0 21 0; +#X connect 2 0 20 0; #X connect 5 0 3 0; #X connect 6 0 7 0; #X connect 6 0 7 1; @@ -39,7 +38,7 @@ #X connect 11 0 8 0; #X connect 16 0 0 0; #X connect 17 0 1 0; -#X connect 21 0 16 0; -#X connect 21 0 17 1; -#X connect 21 1 16 1; -#X connect 21 1 17 0; +#X connect 20 0 16 0; +#X connect 20 0 17 1; +#X connect 20 1 16 1; +#X connect 20 1 17 0; diff --git a/doc/2.control.examples/04.messages.pd b/doc/2.control.examples/04.messages.pd index 02168c92..8fa8ea44 100644 --- a/doc/2.control.examples/04.messages.pd +++ b/doc/2.control.examples/04.messages.pd @@ -1,4 +1,4 @@ -#N canvas 502 103 499 476 12; +#N canvas 502 103 499 449 12; #X floatatom 236 115 3 0 0 0 - - - 0; #X msg 197 55 5 6; #X text 33 21 Most Pd messages are just numbers or short lists of numbers:; @@ -14,7 +14,6 @@ #X msg 184 270 1.2 3.4; #X msg 194 298 5 6; #X text 48 386 For more on messages \, get help on any message box by right-clicking.; -#X text 280 437 updated for Pd version 0.33; #X floatatom 197 115 3 0 0 0 - - - 0; #X floatatom 135 115 3 0 0 0 - - - 0; #X floatatom 67 115 3 0 0 0 - - - 0; @@ -25,13 +24,13 @@ #X text 31 152 If you send a list to an object with more than one inlet \, the items (or 'atoms') in the list are spread out over the inlets \, as seen in the "5 + 6" example above (unless the object has a special list input.), f 62; #X connect 1 0 6 0; #X connect 3 0 4 0; -#X connect 4 0 18 0; -#X connect 5 0 17 0; -#X connect 6 0 16 0; +#X connect 4 0 17 0; +#X connect 5 0 16 0; +#X connect 6 0 15 0; #X connect 6 1 0 0; -#X connect 7 0 19 0; +#X connect 7 0 18 0; #X connect 9 0 5 0; #X connect 11 0 10 0; #X connect 12 0 11 0; #X connect 13 0 11 0; -#X connect 19 0 8 0; +#X connect 18 0 8 0; diff --git a/doc/2.control.examples/05.counter.pd b/doc/2.control.examples/05.counter.pd index 626cb1dc..fbae7bce 100644 --- a/doc/2.control.examples/05.counter.pd +++ b/doc/2.control.examples/05.counter.pd @@ -1,4 +1,4 @@ -#N canvas 531 23 423 672 12; +#N canvas 531 38 423 657 12; #X floatatom 107 605 4 0 0 0 - - - 0; #X obj 107 580 + 1; #X obj 177 351 + 1; @@ -26,7 +26,6 @@ #X obj 53 486 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1; #X text 40 433 Here's a timed counter. Hit the "toggle" GUI object to start and stop it..., f 41; #X text 76 485 <-- click toggle to turn on/off; -#X text 205 641 updated for Pd version 0.52; #X floatatom 53 513 3 0 0 0 - - - 0; #X text 77 513 (toggle outputs "1" when on and "0" when off); #X text 132 542 <-- new object: a "metronome".; @@ -45,5 +44,5 @@ #X connect 14 0 18 0; #X connect 20 0 9 0; #X connect 21 0 14 0; -#X connect 24 0 28 0; -#X connect 28 0 7 0; +#X connect 24 0 27 0; +#X connect 27 0 7 0; diff --git a/doc/2.control.examples/06.more.counters.pd b/doc/2.control.examples/06.more.counters.pd index f6e34f2e..8db01168 100644 --- a/doc/2.control.examples/06.more.counters.pd +++ b/doc/2.control.examples/06.more.counters.pd @@ -15,7 +15,6 @@ #X obj 163 434 float; #X obj 217 435 + 1; #X msg 130 405 -1; -#X text 396 464 updated for Pd version 0.34; #X text 51 77 conditionally stop the metronome, f 13; #X text 293 194 select can be abbreviated as:; #X obj 509 193 sel; @@ -42,10 +41,10 @@ #X connect 11 0 12 0; #X connect 12 0 15 0; #X connect 12 1 13 0; -#X connect 12 1 25 0; +#X connect 12 1 24 0; #X connect 13 0 14 0; #X connect 14 0 13 1; -#X connect 14 0 21 0; +#X connect 14 0 20 0; #X connect 15 0 13 0; -#X connect 20 0 11 0; -#X connect 22 0 5 0; +#X connect 19 0 11 0; +#X connect 21 0 5 0; diff --git a/doc/2.control.examples/07.time.pd b/doc/2.control.examples/07.time.pd index 227524f4..54929287 100644 --- a/doc/2.control.examples/07.time.pd +++ b/doc/2.control.examples/07.time.pd @@ -9,7 +9,6 @@ #X obj 68 395 pipe 2000; #X floatatom 68 368 5 0 0 0 - - - 0; #X floatatom 68 423 5 0 0 0 - - - 0; -#X text 346 464 updated for Pd version 0.43; #X text 46 297 Note that all time calculations are idealized. They do not show the effects of computation time or OS latency. This way you can write deterministic algorithms dealing with time passage., f 63; #X text 34 18 Besides [metro] \, there are three objects for dealing with time:, f 69; #X text 154 51 The [delay] object schedules an event for a future time expressed in milliseconds. Unlike in Max \, time values need not be integers. If a delay has been scheduled and you "bang" it again \, it is rescheduled (the previously scheduled output is canceled.), f 55; @@ -23,6 +22,6 @@ #X connect 5 0 3 1; #X connect 7 0 9 0; #X connect 8 0 7 0; -#X connect 14 0 2 0; -#X connect 15 0 3 0; -#X connect 15 0 5 0; +#X connect 13 0 2 0; +#X connect 14 0 3 0; +#X connect 14 0 5 0; diff --git a/doc/2.control.examples/08.depthfirst.pd b/doc/2.control.examples/08.depthfirst.pd index a8571349..1ae9b2cb 100644 --- a/doc/2.control.examples/08.depthfirst.pd +++ b/doc/2.control.examples/08.depthfirst.pd @@ -11,7 +11,6 @@ #X obj 154 340 + 1; #X obj 115 339 f; #X floatatom 115 371 5 0 0 0 - - - 0; -#X text 229 509 updated for Pd version 0.34; #X text 44 400 ... because the "depth" is infinite. The counters you've seen always have the message chain terminated somewhere in a cold inlet:, f 52; #X msg 106 464 1; #X obj 145 494 + 1; @@ -24,8 +23,8 @@ #X text 106 63 <-- click here; #X text 146 309 <-- maybe you shouldn't click here; #X text 142 464 <-- better; -#X connect 0 0 18 0; -#X connect 1 0 19 0; +#X connect 0 0 17 0; +#X connect 1 0 18 0; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 6 0 2 0; @@ -33,11 +32,11 @@ #X connect 9 0 10 0; #X connect 10 0 11 0; #X connect 10 0 9 0; -#X connect 14 0 16 0; -#X connect 15 0 16 1; -#X connect 16 0 17 0; -#X connect 16 0 15 0; -#X connect 18 0 20 0; -#X connect 18 1 1 0; -#X connect 18 2 3 0; -#X connect 18 3 4 0; +#X connect 13 0 15 0; +#X connect 14 0 15 1; +#X connect 15 0 16 0; +#X connect 15 0 14 0; +#X connect 17 0 19 0; +#X connect 17 1 1 0; +#X connect 17 2 3 0; +#X connect 17 3 4 0; diff --git a/doc/2.control.examples/09.send_receive.pd b/doc/2.control.examples/09.send_receive.pd index c8b368f8..b6fe0bb7 100644 --- a/doc/2.control.examples/09.send_receive.pd +++ b/doc/2.control.examples/09.send_receive.pd @@ -15,7 +15,6 @@ #X obj 211 421 r crackers; #X obj 211 394 s crackers; #X text 65 398 send and receive can be abbreviated:, f 19; -#X text 342 407 updated for Pd version 0.34; #X text 50 245 You can use the semicolon feature of message boxes to address [receives] \, too. This is useful if you want to do a whole list of things:, f 63; #X text 40 15 The [send] and [receive] objects allow you to make non-local connections. These work globally--you can use them to make two different patches intercommunicate if you wish. Any message a [send] gets appears at the output of every [receive] of the same name. There can be any number of [send] and [receive] objects sharing the same name:, f 73; #X text 173 311 The transaction takes place in zero time--i.e. \, if you tried to use [timer] to measure the time delay between the two \, you would get zero., f 48; diff --git a/doc/2.control.examples/10.more.messages.pd b/doc/2.control.examples/10.more.messages.pd index 7a439574..972e88d2 100644 --- a/doc/2.control.examples/10.more.messages.pd +++ b/doc/2.control.examples/10.more.messages.pd @@ -1,4 +1,4 @@ -#N canvas 526 23 530 672 12; +#N canvas 526 38 530 672 12; #X obj 240 414 print; #X msg 107 112 3 \, 4 \, 5; #X msg 88 85 3 4 5; @@ -14,15 +14,10 @@ #X obj 192 211 receive number9; #X obj 338 211 receive 9bis; #X obj 107 201 print; -#X text 46 18 In addition to using semicolons to separate messages -\, you can use commas \, which continue a stream of messages to the -same destination. Thus:; +#X text 46 18 In addition to using semicolons to separate messages \, you can use commas \, which continue a stream of messages to the same destination. Thus:; #X msg 128 139 3 \; number9 5 \; 9bis 45; -#X text 293 626 updated for Pd version 0.34; #X msg 318 388 \; number9 \$1 \; 9bis \$2; -#X text 44 271 You can use "\$1" \, etc. \, as variables in messages. -Send the message box a list whose elements supply the values. A number -is just a list with one element.; +#X text 44 271 You can use "\$1" \, etc. \, as variables in messages. Send the message box a list whose elements supply the values. A number is just a list with one element.; #X obj 86 412 print; #X text 80 338 one variable:; #X text 245 336 two variables:; @@ -31,26 +26,23 @@ is just a list with one element.; #X msg 82 588 cis \$1 \, boom \$2 \, bah \$3; #X text 133 83 <= one message: the list \, "3 4 5".; #X text 171 111 <= three separate messages; -#X text 211 141 <= three separate messages \, with three destinations. -, f 27; +#X text 211 141 <= three separate messages \, with three destinations., f 27; #X obj 82 547 pack float float float; -#X text 61 450 But to really exploit the possibilities using multiple -variables \, you will need the [pack] object to get two or more values -into the same message:; -#X text 246 546 <-- number of creation arguments, f 32; +#X text 61 450 But to really exploit the possibilities using multiple variables \, you will need the [pack] object to get two or more values into the same message:; +#X text 246 546 <-- number of creation arguments; #X text 274 563 sets the number of inlets.; #X connect 1 0 14 0; #X connect 2 0 14 0; -#X connect 3 0 20 0; +#X connect 3 0 19 0; #X connect 4 0 3 0; #X connect 5 0 0 0; #X connect 6 0 5 0; -#X connect 7 0 18 0; -#X connect 8 0 29 0; -#X connect 9 0 29 1; +#X connect 7 0 17 0; +#X connect 8 0 28 0; +#X connect 9 0 28 1; #X connect 12 0 11 0; #X connect 13 0 10 0; #X connect 16 0 14 0; -#X connect 24 0 29 2; -#X connect 25 0 23 0; -#X connect 29 0 25 0; +#X connect 23 0 28 2; +#X connect 24 0 22 0; +#X connect 28 0 24 0; diff --git a/doc/2.control.examples/11.review.pd b/doc/2.control.examples/11.review.pd index 08d13ba4..a5f9a1ee 100644 --- a/doc/2.control.examples/11.review.pd +++ b/doc/2.control.examples/11.review.pd @@ -1,5 +1,4 @@ -#N canvas 540 23 492 597 12; -#X text 269 561 updated for Pd version 0.34; +#N canvas 540 38 492 584 12; #X obj 82 252 receive; #X obj 82 223 send; #X obj 82 310 pack; diff --git a/doc/2.control.examples/12.PART2.subpatch.pd b/doc/2.control.examples/12.PART2.subpatch.pd index 164a6a74..a09595d3 100644 --- a/doc/2.control.examples/12.PART2.subpatch.pd +++ b/doc/2.control.examples/12.PART2.subpatch.pd @@ -22,14 +22,13 @@ #X floatatom 278 202 0 0 0 0 - - - 0; #X floatatom 183 257 0 0 0 0 - - - 0; #X obj 84 407 sendnumber 45 cookies; -#X obj 548 57 sendnumber 67 pretzels; -#X floatatom 750 77 4 0 0 0 - - - 0; -#X text 538 335 Note that "\$1" \, etc \, has a different meaning in object boxes. Open one of the "sendnumber" abstractions for details., f 42; -#X text 537 240 If you change one copy of an abstraction the change isn't automatically made on any other copies. You must keep track \, save the changes \, and cause Pd to reload the other copies (for example \, by closing and reopening the containing patch.), f 42; +#X obj 538 67 sendnumber 67 pretzels; +#X floatatom 740 87 4 0 0 0 - - - 0; +#X text 528 345 Note that "\$1" \, etc \, has a different meaning in object boxes. Open one of the "sendnumber" abstractions for details., f 42; +#X text 527 250 If you change one copy of an abstraction the change isn't automatically made on any other copies. You must keep track \, save the changes \, and cause Pd to reload the other copies (for example \, by closing and reopening the containing patch.), f 42; #X obj 313 383 r cookies; -#X obj 750 50 r pretzels; -#X text 636 408 updated for Pd version 0.34; -#X text 536 119 There is a separate file in this directory named "sendnumber.pd" which is loaded every time you type "sendnumber" in a box. Click on a "sendnumber" box above to see it. You can make changes in the subpatch and save them. The changes will be saved back to sendnumber.pd and not as part of this (containing) patch., f 43; +#X obj 740 60 r pretzels; +#X text 526 129 There is a separate file in this directory named "sendnumber.pd" which is loaded every time you type "sendnumber" in a box. Click on a "sendnumber" box above to see it. You can make changes in the subpatch and save them. The changes will be saved back to sendnumber.pd and not as part of this (containing) patch., f 43; #X text 52 111 click --> to open, f 9; #X text 259 111 <-- you can give the window; #X text 288 127 a name as an argument; @@ -37,11 +36,11 @@ #X text 34 16 You can nest entire windows inside Pd boxes (and so on \, as deep as you wish.) There are two different ways to do it. First \, if you just want to add a room to the house \, so to speak \, type "pd" into an object box. If you click on the box (in run mode) the subwindow appears., f 63; #X text 37 290 There is also a facility for making many copies of a patch which track any changes you make in the original. This subpatch type is called an abstraction. For example \, here's a simple abstraction that sends a number to a "receive" on command:, f 65; #X obj 84 374 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 548 24 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 538 34 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X connect 2 0 5 0; #X connect 3 0 2 0; #X connect 4 0 2 1; #X connect 11 0 0 0; #X connect 12 0 8 0; -#X connect 21 0 6 0; -#X connect 22 0 7 0; +#X connect 20 0 6 0; +#X connect 21 0 7 0; diff --git a/doc/2.control.examples/13.locality.pd b/doc/2.control.examples/13.locality.pd index c1a65b75..48df89fa 100644 --- a/doc/2.control.examples/13.locality.pd +++ b/doc/2.control.examples/13.locality.pd @@ -1,6 +1,5 @@ -#N canvas 618 33 468 455 12; -#X text 70 18 You can use dollarsigns in abstractions to get local -sends and receives as shown here., f 45; +#N canvas 618 38 468 417 12; +#X text 70 18 You can use dollarsigns in abstractions to get local sends and receives as shown here., f 45; #X obj 94 97 dollarsign one; #X obj 252 97 dollarsign two; #X obj 95 189 r one-a; @@ -17,7 +16,6 @@ sends and receives as shown here., f 45; #X floatatom 340 361 5 0 0 0 - - - 0; #X obj 339 303 s \$0-d; #X obj 340 333 r \$0-d; -#X text 238 414 updated for Pd version 0.52; #X floatatom 189 71 4 0 0 0 - - - 0; #X floatatom 252 71 4 0 0 0 - - - 0; #X floatatom 347 71 4 0 0 0 - - - 0; @@ -25,15 +23,15 @@ sends and receives as shown here., f 45; #X floatatom 248 219 4 0 0 0 - - - 0; #X floatatom 167 219 4 0 0 0 - - - 0; #X floatatom 321 219 4 0 0 0 - - - 0; -#X connect 3 0 21 0; -#X connect 4 0 22 0; -#X connect 5 0 23 0; -#X connect 6 0 24 0; +#X connect 3 0 20 0; +#X connect 4 0 21 0; +#X connect 5 0 22 0; +#X connect 6 0 23 0; #X connect 8 0 1 0; #X connect 10 0 11 0; #X connect 12 0 9 0; #X connect 13 0 15 0; #X connect 16 0 14 0; -#X connect 18 0 1 1; -#X connect 19 0 2 0; -#X connect 20 0 2 1; +#X connect 17 0 1 1; +#X connect 18 0 2 0; +#X connect 19 0 2 1; diff --git a/doc/2.control.examples/14.dollarsigns.pd b/doc/2.control.examples/14.dollarsigns.pd index d26579b1..64c95dfc 100644 --- a/doc/2.control.examples/14.dollarsigns.pd +++ b/doc/2.control.examples/14.dollarsigns.pd @@ -1,5 +1,3 @@ -#N canvas 477 173 433 205 12; -#X text 148 131 updated for Pd version 0.34; -#X obj 168 78 dollarsign2 three 4; -#X text 53 28 An abstraction's creation arguments may be either numbers -or symbols. Gory details are inside:, f 43; +#N canvas 477 173 413 180 12; +#X obj 173 105 dollarsign2 three 4; +#X text 53 28 An abstraction's creation arguments may be either numbers or symbols. Gory details are inside:, f 43; diff --git a/doc/2.control.examples/15.array.pd b/doc/2.control.examples/15.array.pd index 120df785..74fdd933 100644 --- a/doc/2.control.examples/15.array.pd +++ b/doc/2.control.examples/15.array.pd @@ -26,7 +26,6 @@ #X obj 228 593 tabread~; #X obj 728 473 savepanel; #X msg 728 500 \; array99 write \$1; -#X text 807 655 updated for Pd version 0.51; #X text 911 37 print info; #X obj 509 619 array size array99; #X obj 652 565 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; @@ -61,13 +60,13 @@ #X connect 3 0 4 0; #X connect 4 0 5 0; #X connect 22 0 23 0; -#X connect 26 0 28 0; -#X connect 27 0 26 0; -#X connect 27 0 40 0; -#X connect 30 0 29 0; -#X connect 31 0 29 0; -#X connect 36 0 2 0; -#X connect 37 0 22 0; -#X connect 40 0 41 0; -#X connect 49 0 51 0; -#X connect 51 0 50 0; +#X connect 25 0 27 0; +#X connect 26 0 25 0; +#X connect 26 0 39 0; +#X connect 29 0 28 0; +#X connect 30 0 28 0; +#X connect 35 0 2 0; +#X connect 36 0 22 0; +#X connect 39 0 40 0; +#X connect 48 0 50 0; +#X connect 50 0 49 0; diff --git a/doc/2.control.examples/16.more.arrays.pd b/doc/2.control.examples/16.more.arrays.pd index cb5e3cba..16e5c7bb 100644 --- a/doc/2.control.examples/16.more.arrays.pd +++ b/doc/2.control.examples/16.more.arrays.pd @@ -40,8 +40,7 @@ #X connect 2 0 5 0; #X connect 3 0 1 0; #X connect 5 0 4 0; -#X restore 262 627 pd locality; -#X text 114 613 open subpatch for local array names =>, f 20; +#X restore 215 655 pd locality; #X msg 693 615 0; #X msg 683 578 1; #X text 716 572 allow editing with mouse, f 13; @@ -53,7 +52,6 @@ #X text 26 276 setting the bounds rectangle; #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 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); @@ -76,16 +74,17 @@ #X text 544 425 line width, f 5; #X msg 388 659 \; array97 style \$1; #X msg 506 467 \; array97 width \$1 \; array98 width \$1; +#X text 63 642 open subpatch for local array names -->, f 21; #X connect 1 0 2 0; -#X connect 4 0 53 0; +#X connect 4 0 51 0; #X connect 5 0 6 0; #X connect 7 0 5 0; #X connect 8 0 5 0; #X connect 15 0 3 0; -#X connect 15 0 52 0; -#X connect 26 0 30 0; -#X connect 27 0 30 0; -#X connect 38 0 23 0; -#X connect 39 0 15 0; -#X connect 47 0 5 0; -#X connect 50 0 5 0; +#X connect 15 0 50 0; +#X connect 25 0 29 0; +#X connect 26 0 29 0; +#X connect 36 0 23 0; +#X connect 37 0 15 0; +#X connect 45 0 5 0; +#X connect 48 0 5 0; diff --git a/doc/2.control.examples/17.PART3.midi.pd b/doc/2.control.examples/17.PART3.midi.pd index 7a76b53a..af54723a 100644 --- a/doc/2.control.examples/17.PART3.midi.pd +++ b/doc/2.control.examples/17.PART3.midi.pd @@ -1,4 +1,4 @@ -#N canvas 591 65 452 454 12; +#N canvas 591 65 452 431 12; #X floatatom 225 125 0 0 0 0 - - - 0; #X floatatom 189 125 0 0 0 0 - - - 0; #X obj 170 97 notein; @@ -14,15 +14,12 @@ #X floatatom 59 163 0 0 0 0 - - - 0; #X obj 59 192 bendout; #X text 201 182 ... ad nauseam.; -#X text 205 414 updated for Pd version 0.34; #X obj 68 308 midiout; -#X obj 273 355 sysexin; -#X msg 68 278 240 \, 45 \, 93 \, 3 \, 65 \, 1 \, 2 \, 3 \, 4 \, 247 -; +#X obj 271 363 sysexin; +#X msg 68 278 240 \, 45 \, 93 \, 3 \, 65 \, 1 \, 2 \, 3 \, 4 \, 247; #X text 61 239 You can format your own SYSEX messages as shown:; -#X text 109 354 and receive SYSEX via:; -#X text 39 20 Pd offers input and output objects for MIDI. Get a full -list of objects in the help file of any object below., f 50; +#X text 107 362 and receive SYSEX via:; +#X text 39 20 Pd offers input and output objects for MIDI. Get a full list of objects in the help file of any object below., f 50; #X connect 2 0 3 0; #X connect 2 1 1 0; #X connect 2 2 0 0; @@ -33,4 +30,4 @@ list of objects in the help file of any object below., f 50; #X connect 10 1 8 0; #X connect 11 0 13 1; #X connect 12 0 13 0; -#X connect 18 0 16 0; +#X connect 17 0 15 0; diff --git a/doc/2.control.examples/18.conditional.pd b/doc/2.control.examples/18.conditional.pd index d020b37f..2ae514c9 100644 --- a/doc/2.control.examples/18.conditional.pd +++ b/doc/2.control.examples/18.conditional.pd @@ -1,5 +1,4 @@ -#N canvas 533 27 522 601 12; -#X text 271 545 updated for Pd version 0.26; +#N canvas 533 38 522 601 12; #X obj 87 163 select 1 2; #X floatatom 87 135 0 0 0 0 - - - 0; #X obj 87 240 print select-1; @@ -19,32 +18,32 @@ #X obj 185 374 spigot; #X floatatom 185 401 0 0 0 0 - - - 0; #X text 242 369 if open \, messages coming in at left are sent to output., f 28; -#X floatatom 119 493 0 0 0 0 - - - 0; -#X floatatom 119 549 0 0 0 0 - - - 0; -#X obj 119 521 moses 5; -#X floatatom 165 549 0 0 0 0 - - - 0; +#X floatatom 191 492 0 0 0 0 - - - 0; +#X floatatom 191 548 0 0 0 0 - - - 0; +#X obj 191 520 moses 5; +#X floatatom 237 548 0 0 0 0 - - - 0; #X text 46 20 Pd provides at least four objects for doing conditional computations. The [select] object tests its input against its argument(s) \, and outputs "bang" when they match. The [route] object works similarly but also copies data. In other words \, [route] takes a list \, tests its first element \, and conditionally passes on the rest of the list.; #X text 44 287 You also get [spigot] which turns a flow of messages on and off (like the Gate object in Max \, but with the inputs reversed):, f 54; #X obj 224 348 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1; #X text 245 347 <-- nonzero on right inlet to open; #X text 56 438 And finally \, [moses] sends numbers to the left if they're less than the argument \, right otherwise:, f 49; -#X connect 1 0 3 0; -#X connect 1 1 4 0; -#X connect 1 2 5 0; -#X connect 2 0 1 0; +#X connect 0 0 2 0; +#X connect 0 1 3 0; +#X connect 0 2 4 0; +#X connect 1 0 0 0; +#X connect 5 0 6 0; #X connect 6 0 7 0; -#X connect 7 0 8 0; -#X connect 8 0 12 0; -#X connect 8 1 13 0; -#X connect 8 2 11 0; -#X connect 9 0 7 0; -#X connect 9 1 7 1; -#X connect 10 0 9 0; -#X connect 11 0 14 0; -#X connect 11 1 15 0; +#X connect 7 0 11 0; +#X connect 7 1 12 0; +#X connect 7 2 10 0; +#X connect 8 0 6 0; +#X connect 8 1 6 1; +#X connect 9 0 8 0; +#X connect 10 0 13 0; +#X connect 10 1 14 0; +#X connect 15 0 16 0; #X connect 16 0 17 0; -#X connect 17 0 18 0; -#X connect 20 0 22 0; -#X connect 22 0 21 0; -#X connect 22 1 23 0; -#X connect 26 0 17 1; +#X connect 19 0 21 0; +#X connect 21 0 20 0; +#X connect 21 1 22 0; +#X connect 25 0 16 1; diff --git a/doc/2.control.examples/19.random.pd b/doc/2.control.examples/19.random.pd index 2341dcb4..5896ac34 100644 --- a/doc/2.control.examples/19.random.pd +++ b/doc/2.control.examples/19.random.pd @@ -1,5 +1,4 @@ -#N canvas 418 77 530 570 12; -#X text 265 515 updated for Pd version 0.26; +#N canvas 418 77 516 532 12; #X obj 95 122 random 5; #X floatatom 95 148 0 0 0 0 - - - 0; #X text 129 148 outputs from 0 to 4; @@ -8,7 +7,7 @@ #X obj 328 135 / 1000; #X text 382 160 from 0 to 0.999; #X obj 146 369 random 5; -#X floatatom 146 395 0 0 0 0 - - - 0; +#X floatatom 146 398 4 0 0 0 - - - 0; #X obj 97 247 loadbang; #X obj 146 278 timer; #X msg 146 303 seed \$1; @@ -21,14 +20,14 @@ #X obj 165 333 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X text 200 246 <-- click to seed; #X text 186 332 <-- click to get random numbers; -#X connect 1 0 2 0; -#X connect 5 0 6 0; -#X connect 6 0 4 0; -#X connect 8 0 9 0; +#X connect 0 0 1 0; +#X connect 4 0 5 0; +#X connect 5 0 3 0; +#X connect 7 0 8 0; +#X connect 9 0 10 0; #X connect 10 0 11 0; -#X connect 11 0 12 0; -#X connect 12 0 8 0; -#X connect 16 0 1 0; -#X connect 17 0 5 0; -#X connect 18 0 11 1; -#X connect 19 0 8 0; +#X connect 11 0 7 0; +#X connect 15 0 0 0; +#X connect 16 0 4 0; +#X connect 17 0 10 1; +#X connect 18 0 7 0; diff --git a/doc/2.control.examples/20.weighted-random.pd b/doc/2.control.examples/20.weighted-random.pd index 009c63c9..2b57c4f8 100644 --- a/doc/2.control.examples/20.weighted-random.pd +++ b/doc/2.control.examples/20.weighted-random.pd @@ -1,5 +1,4 @@ -#N canvas 510 33 452 533 12; -#X text 216 487 updated for Pd version 0.35; +#N canvas 510 38 452 533 12; #X text 27 18 You can generate weighted random numbers from uniformly distributed ones. If you just want two possible outcomes with a varying probability for each one \, you can do as shown:; #X obj 128 123 random 100; #X floatatom 181 152 4 0 100 0 - - - 0; @@ -21,14 +20,14 @@ #X obj 215 423 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X obj 268 423 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X obj 125 339 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X connect 2 0 4 0; -#X connect 3 0 4 1; -#X connect 4 0 16 0; -#X connect 4 1 17 0; -#X connect 6 0 7 0; +#X connect 1 0 3 0; +#X connect 2 0 3 1; +#X connect 3 0 15 0; +#X connect 3 1 16 0; +#X connect 5 0 6 0; +#X connect 6 0 17 0; +#X connect 6 1 7 0; #X connect 7 0 18 0; -#X connect 7 1 8 0; -#X connect 8 0 19 0; -#X connect 8 1 20 0; -#X connect 12 0 2 0; -#X connect 21 0 6 0; +#X connect 7 1 19 0; +#X connect 11 0 1 0; +#X connect 20 0 5 0; diff --git a/doc/2.control.examples/21.markov.chain.pd b/doc/2.control.examples/21.markov.chain.pd index 866c8bd6..ec7b2772 100644 --- a/doc/2.control.examples/21.markov.chain.pd +++ b/doc/2.control.examples/21.markov.chain.pd @@ -1,4 +1,4 @@ -#N canvas 446 48 642 550 12; +#N canvas 446 48 643 524 12; #X obj 158 449 s state; #X obj 87 167 bng 25 250 50 0 empty empty Next -51 13 0 19 #dfdfdf #000000 #000000; #X obj 326 449 s state; @@ -13,7 +13,6 @@ #X obj 425 345 moses 70; #X obj 498 345 moses 80; #X floatatom 133 196 4 1 3 0 - - - 0; -#X text 393 504 updated for Pd version 0.35; #X obj 87 280 bng 19 250 50 0 empty empty empty 17 7 0 10 #dcdcdc #000000 #000000; #X obj 256 280 bng 19 250 50 0 empty empty empty 17 7 0 10 #dcdcdc #000000 #000000; #X obj 425 280 bng 19 250 50 0 empty empty empty 17 7 0 10 #dcdcdc #000000 #000000; @@ -44,26 +43,27 @@ #X text 111 281 state 0; #X text 280 281 state 1; #X text 450 280 state 2; -#X connect 1 0 29 0; +#X connect 1 0 28 0; #X connect 4 0 5 0; -#X connect 5 0 18 0; +#X connect 5 0 17 0; #X connect 5 1 6 0; -#X connect 6 0 19 0; -#X connect 6 1 20 0; +#X connect 6 0 18 0; +#X connect 6 1 19 0; #X connect 7 0 8 0; -#X connect 8 0 21 0; +#X connect 8 0 20 0; #X connect 8 1 9 0; -#X connect 9 0 22 0; -#X connect 9 1 23 0; +#X connect 9 0 21 0; +#X connect 9 1 22 0; #X connect 10 0 11 0; -#X connect 11 0 24 0; +#X connect 11 0 23 0; #X connect 11 1 12 0; -#X connect 12 0 25 0; -#X connect 12 1 26 0; -#X connect 13 0 29 1; -#X connect 15 0 4 0; -#X connect 16 0 7 0; -#X connect 17 0 10 0; +#X connect 12 0 24 0; +#X connect 12 1 25 0; +#X connect 13 0 28 1; +#X connect 14 0 4 0; +#X connect 15 0 7 0; +#X connect 16 0 10 0; +#X connect 17 0 30 0; #X connect 18 0 31 0; #X connect 19 0 32 0; #X connect 20 0 33 0; @@ -72,19 +72,18 @@ #X connect 23 0 36 0; #X connect 24 0 37 0; #X connect 25 0 38 0; -#X connect 26 0 39 0; -#X connect 27 0 28 0; -#X connect 28 0 13 0; -#X connect 29 0 30 0; -#X connect 30 0 15 0; -#X connect 30 1 16 0; -#X connect 30 2 17 0; +#X connect 26 0 27 0; +#X connect 27 0 13 0; +#X connect 28 0 29 0; +#X connect 29 0 14 0; +#X connect 29 1 15 0; +#X connect 29 2 16 0; +#X connect 30 0 0 0; #X connect 31 0 0 0; #X connect 32 0 0 0; -#X connect 33 0 0 0; +#X connect 33 0 2 0; #X connect 34 0 2 0; #X connect 35 0 2 0; -#X connect 36 0 2 0; +#X connect 36 0 3 0; #X connect 37 0 3 0; #X connect 38 0 3 0; -#X connect 39 0 3 0; diff --git a/doc/2.control.examples/22.random-walk.pd b/doc/2.control.examples/22.random-walk.pd index 7c86db51..b38d625f 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 510 45 535 586 12; +#N canvas 510 45 536 549 12; #X floatatom 140 248 5 0 0 0 - - - 0; #X obj 167 125 f; #X obj 140 198 random 4; @@ -27,14 +27,13 @@ #X text 227 355 to random increment; #X text 282 28 coercion to range 0-100 \; if out of range \, reflect; #X text 281 58 us back in.; -#X text 270 542 updated for Pd version 0.37-1; #X obj 74 276 sel 0 1; #X text 59 398 A random walk is a special case of a Markov chain \, in which the states are integers and the transitions add or subtract a small amount from the previous state to get a new one. Here the [f] holds the state. When it gets a bang \, the previous state is added to a random number (from 1 to 4) multiplied by a random sign (-1 or 1). The new value is then coerced into the range (from 0 to 100).; #X connect 0 0 9 0; #X connect 1 0 5 0; #X connect 2 0 0 0; #X connect 3 0 4 0; -#X connect 4 0 29 0; +#X connect 4 0 28 0; #X connect 5 0 3 0; #X connect 5 1 2 0; #X connect 5 2 6 1; @@ -53,5 +52,5 @@ #X connect 16 0 17 0; #X connect 17 0 10 0; #X connect 18 0 11 0; -#X connect 29 0 12 0; -#X connect 29 1 18 0; +#X connect 28 0 12 0; +#X connect 28 1 18 0; diff --git a/doc/2.control.examples/23.sequencing.pd b/doc/2.control.examples/23.sequencing.pd index f3226861..3d8b47f7 100644 --- a/doc/2.control.examples/23.sequencing.pd +++ b/doc/2.control.examples/23.sequencing.pd @@ -1,13 +1,11 @@ #N canvas 334 58 895 518 12; #X obj 186 167 r receive1; #X obj 282 169 r receive2; -#X msg 46 111 clear \, add receive1 1 \, add 1000 receive1 0 \, add -receive2 2 \, add 1000 receive2 0 \, add receive1 3 \, bang; +#X msg 46 111 clear \, add receive1 1 \, add 1000 receive1 0 \, add receive2 2 \, add 1000 receive2 0 \, add receive1 3 \, bang; #X obj 46 152 qlist; #X floatatom 186 193 0 0 0 0 - - - 0; #X floatatom 282 194 0 0 0 0 - - - 0; -#X text 52 231 The "add" messages add lines to the qlist \, so that -it contains:; +#X text 52 231 The "add" messages add lines to the qlist \, so that it contains:; #X text 159 267 receive1 1; #X text 158 288 1000 receive1 0; #X text 159 308 receive2 2; @@ -16,28 +14,14 @@ it contains:; #X msg 576 319 line 0 \, auto; #X text 696 319 rewind and start automatically, f 16; #X obj 565 195 text define -k seq; -#A set receive1 1 \; 1000 receive1 0 \; receive2 2 \; 1000 receive2 -0 \; receive1 3 \;; +#A set receive1 1 \; 1000 receive1 0 \; receive2 2 \; 1000 receive2 0 \; receive1 3 \;; #X obj 576 373 text sequence seq -g, f 21; -#X text 559 265 Now click on the message below to run the sequencer. -, f 29; -#X text 633 449 updated for Pd version 0.52; -#X text 57 378 and the "bang" instructs qlist to play the sequence -by sending messages to [receive] objects. Messages starting with numbers -request that amount of delay.; -#X text 57 428 If you have more than 5 lines or so you will probably -want to store them as a separate file and have [qlist] read it. You -can also write files \, set tempo \, and single step... see the help -patch for details.; -#X text 69 27 You can use the [qlist] \, [textfile] or the more modern -[text sequence] object for sequencing messages. The [qlist] object -is the simplest to use and is quite similar to [textfile]., f 54; -#X text 518 53 A more recent and powerful addition is the [text] object -that can perform many text operations and substitute both [qlist] and -[textfile]., f 49; -#X text 519 111 You can use [text sequence] in a very similar way to -[qlist]. Click on [text define] to see the text messages to be sequenced. -Note that it is the same as added to [qlist]., f 49; +#X text 559 265 Now click on the message below to run the sequencer., f 29; +#X text 57 378 and the "bang" instructs qlist to play the sequence by sending messages to [receive] objects. Messages starting with numbers request that amount of delay.; +#X text 57 428 If you have more than 5 lines or so you will probably want to store them as a separate file and have [qlist] read it. You can also write files \, set tempo \, and single step... see the help patch for details.; +#X text 69 27 You can use the [qlist] \, [textfile] or the more modern [text sequence] object for sequencing messages. The [qlist] object is the simplest to use and is quite similar to [textfile]., f 54; +#X text 518 53 A more recent and powerful addition is the [text] object that can perform many text operations and substitute both [qlist] and [textfile]., f 49; +#X text 519 111 You can use [text sequence] in a very similar way to [qlist]. Click on [text define] to see the text messages to be sequenced. Note that it is the same as added to [qlist]., f 49; #X text 704 195 <-- click to open; #X text 669 319 <--; #X connect 0 0 4 0; diff --git a/doc/2.control.examples/24.loops.pd b/doc/2.control.examples/24.loops.pd index d11d8a2c..3565df49 100644 --- a/doc/2.control.examples/24.loops.pd +++ b/doc/2.control.examples/24.loops.pd @@ -1,4 +1,4 @@ -#N canvas 561 23 511 708 12; +#N canvas 561 38 513 680 12; #X obj 180 286 until; #X floatatom 180 254 5 0 0 1 - - - 0; #X obj 180 330 print repetition; @@ -15,7 +15,6 @@ #X text 33 179 You can perform a counting loop by sending a positive number to until:; #X text 291 595 In pseudo-code: "x=0 \; do print x++ until x>=10"; #X text 42 360 In pseudo-code: "for i = 1 to 5 do print end"; -#X text 275 662 updated for Pd version 0.41; #X text 39 12 Looping with the [until] object; #X text 37 39 It is sometimes desirable to make a loop without an embedded delay (as in "06.more.counters.pd") but rather to make the entire loop take place in the context of a single incoming message.; #X text 33 103 The [until] object is provided to make this possible and has two modes: It can either run automatically for a certain number of times (a "counting" loop) or it can run forever until stopped through its right inlet (a "conditional" loop).; @@ -34,4 +33,4 @@ #X connect 7 1 8 0; #X connect 8 0 6 1; #X connect 10 0 5 1; -#X connect 22 0 6 0; +#X connect 21 0 6 0; diff --git a/doc/3.audio.examples/A00.intro.pd b/doc/3.audio.examples/A00.intro.pd index 23748847..6492b4d6 100644 --- a/doc/3.audio.examples/A00.intro.pd +++ b/doc/3.audio.examples/A00.intro.pd @@ -1,9 +1,8 @@ -#N canvas 614 38 541 452 12; +#N canvas 614 38 549 415 12; #X text 90 27 INTRODUCTION TO THE PD AUDIO EXAMPLE PATCHES; #X msg 146 218 browse http://msp.ucsd.edu/techniques.htm; #X obj 146 252 pdcontrol; #X text 37 66 This is the second of three tutorial series on Pd. This one shows the time and frequency domain audio processing features. (The first one showed how to use Pd to do "control" computations \, and the third is about data structures.), f 67; #X text 36 135 These patches are accompanied by an ONLINE BOOK \, which develops the underlying theory at . Click on the message below to open it., f 67; #X text 60 308 Note \, however \, that the examples here on this version of Pd are a bit more up to date with the more recent features. The link above carries a download for the exact example files that were used on the book., f 65; -#X text 290 410 updated for Pd version 0.55; #X connect 1 0 2 0; diff --git a/doc/3.audio.examples/A01.sinewave.pd b/doc/3.audio.examples/A01.sinewave.pd index ebcf62d2..88c28cbc 100644 --- a/doc/3.audio.examples/A01.sinewave.pd +++ b/doc/3.audio.examples/A01.sinewave.pd @@ -1,4 +1,4 @@ -#N canvas 619 38 527 791 12; +#N canvas 619 38 527 752 12; #X obj 129 128 osc~ 440; #X obj 129 187 dac~; #X obj 129 157 *~ 0.05; @@ -13,7 +13,6 @@ #X obj 327 651 ../5.reference/set-dsp-tgl; #X text 328 630 DSP on/off; #X msg 327 688 \; pd dsp \$1; -#X text 309 753 updated for Pd version 0.54; #X text 363 655 <-- open abstraction; #X text 80 336 click these -->, f 9; #X obj 298 378 send pd; @@ -29,5 +28,5 @@ #X connect 0 0 2 0; #X connect 2 0 1 0; #X connect 11 0 13 0; -#X connect 19 0 17 0; -#X connect 20 0 17 0; +#X connect 18 0 16 0; +#X connect 19 0 16 0; diff --git a/doc/3.audio.examples/A02.amplitude.pd b/doc/3.audio.examples/A02.amplitude.pd index 646eefee..3d1f1d92 100644 --- a/doc/3.audio.examples/A02.amplitude.pd +++ b/doc/3.audio.examples/A02.amplitude.pd @@ -1,4 +1,4 @@ -#N canvas 614 76 546 671 12; +#N canvas 614 76 546 638 12; #X obj 83 141 osc~ 440; #X obj 71 360 dac~; #X text 75 56 CONTROLLING AMPLITUDE; @@ -6,7 +6,6 @@ #X floatatom 108 241 8 0 0 0 - - - 0; #X obj 108 208 dbtorms; #X floatatom 108 176 8 0 80 0 - - - 0; -#X text 302 615 updated for Pd version 0.33; #X obj 325 37 ../5.reference/set-dsp-tgl; #X text 356 40 DSP on/off; #X msg 325 74 \; pd dsp \$1; @@ -25,4 +24,4 @@ #X connect 4 0 3 1; #X connect 5 0 4 0; #X connect 6 0 5 0; -#X connect 8 0 10 0; +#X connect 7 0 9 0; diff --git a/doc/3.audio.examples/A03.line.pd b/doc/3.audio.examples/A03.line.pd index d837116d..7b6ff3bc 100644 --- a/doc/3.audio.examples/A03.line.pd +++ b/doc/3.audio.examples/A03.line.pd @@ -18,7 +18,6 @@ #X obj 362 127 ../5.reference/set-dsp-tgl; #X text 393 130 DSP on/off; #X msg 362 164 \; pd dsp \$1; -#X text 615 569 updated for Pd version 0.54; #X obj 649 244 hsl 162 19 0 1 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; #X obj 646 303 pow 4; #X obj 560 381 osc~ 440; @@ -55,12 +54,12 @@ #X connect 8 0 3 0; #X connect 9 0 3 0; #X connect 16 0 18 0; +#X connect 19 0 26 0; #X connect 20 0 27 0; -#X connect 21 0 28 0; -#X connect 22 0 25 0; -#X connect 23 0 24 0; +#X connect 21 0 24 0; +#X connect 22 0 23 0; +#X connect 23 0 24 1; +#X connect 24 0 25 0; #X connect 24 0 25 1; -#X connect 25 0 26 0; -#X connect 25 0 26 1; -#X connect 27 0 21 0; -#X connect 28 0 23 0; +#X connect 26 0 20 0; +#X connect 27 0 22 0; diff --git a/doc/3.audio.examples/A04.line2.pd b/doc/3.audio.examples/A04.line2.pd index 672e5ee1..675e9fad 100644 --- a/doc/3.audio.examples/A04.line2.pd +++ b/doc/3.audio.examples/A04.line2.pd @@ -25,7 +25,6 @@ #X text 227 379 ramp down; #X text 398 379 to 1/2; #X text 597 518 ------ 1 second ------; -#X text 581 622 updated for Pd version 0.33; #X obj 222 137 tabwrite~ oscillator; #X text 31 33 Here again is a [line~] controlling the amplitude of an [osc~] \, but with the outputs graphed:, f 63; #X text 33 478 Click the message boxes above to try it. Note that in the first two boxes \, the [line~] objects get two messages. The first one \, with no time value \, causes the [line~] to jump immediately to the value. The third box takes [line~]'s previous value as a point of departure. What you see will depend on which box you last clicked and how long you waited between the two., f 68; @@ -38,15 +37,15 @@ #X text 153 328 <-- out; #X text 31 571 On very old machines you may hear an interruption in the sound one second after you click on the first or third box. This is because the graphical updates are likely to eat more CPU time than your audio buffer has pre-buffered for. You can avoid this if you keep your graphs in sub-windows and open them only when you need them. In some future version of Pd this behavior will be improved. Until then \, you'll have to avoid having arrays getting re-drawn during music performances., f 68; #X connect 0 0 2 0; -#X connect 0 0 18 0; +#X connect 0 0 17 0; #X connect 2 0 10 0; #X connect 2 0 12 0; #X connect 3 0 2 1; #X connect 3 0 11 0; -#X connect 5 0 18 0; +#X connect 5 0 17 0; #X connect 5 0 11 0; #X connect 5 0 12 0; #X connect 6 0 3 0; #X connect 10 0 1 0; #X connect 10 0 1 1; -#X connect 21 0 23 0; +#X connect 20 0 22 0; diff --git a/doc/3.audio.examples/A05.output.subpatch.pd b/doc/3.audio.examples/A05.output.subpatch.pd index 6d8c121d..6f0ab66c 100644 --- a/doc/3.audio.examples/A05.output.subpatch.pd +++ b/doc/3.audio.examples/A05.output.subpatch.pd @@ -10,7 +10,6 @@ #X obj 60 482 declare -stdpath ./; #X text 27 423 The [output~] abstraction is in the 'extra' folder (aka 'standard path') \, so we use [declare -stdpath ./] to make sure Pd finds it., f 73; #X text 27 267 In this and subsequent patches \, we'll use the [output~] abstraction to control overall amplitude. Use the slider to control horizontally from 0 (silence) to 1 (full blast). Note \, however \, that a quartic function is applied. In this example \, you can't actually push the output amplitude all the way up without clipping. You'll know you're clipping if \, instead of an A major chord \, you hear a single \, distorted tone two octaves down. The clipping happens at Pd's last stage of audio output. Audio signals internal to Pd have essentially no level limit., f 73; -#X text 327 482 updated for Pd version 0.54; #X text 27 388 The output control automatically starts DSP whenever you touch the sider. You can use the "mute" toggle to turn mute on or off., f 73; #X text 180 86 <-- Here we make an A major triad as a test signal., f 28; #X text 200 183 <--; diff --git a/doc/3.audio.examples/A06.frequency.pd b/doc/3.audio.examples/A06.frequency.pd index 233046bd..25ace666 100644 --- a/doc/3.audio.examples/A06.frequency.pd +++ b/doc/3.audio.examples/A06.frequency.pd @@ -23,7 +23,6 @@ #X text 85 588 Note also the "set" messages going to the number boxes so that they can each update the other without bringing on an infinite loop. (get help on number boxes for details.), f 70; #X text 152 195 to "MIDI" pitch; #X obj 106 354 output~; -#X text 471 659 updated for Pd version 0.36; #X obj 106 287 osc~; #X obj 512 25 declare -stdpath ./; #X text 100 127 <-- set frequency; @@ -38,7 +37,7 @@ #X text 190 286 <-- bang button \, click to graph; #X connect 2 0 10 0; #X connect 2 0 11 0; -#X connect 3 0 21 0; +#X connect 3 0 20 0; #X connect 4 0 2 0; #X connect 5 0 8 0; #X connect 5 0 14 0; @@ -47,6 +46,6 @@ #X connect 9 0 4 0; #X connect 11 0 12 0; #X connect 14 0 13 0; -#X connect 21 0 1 0; -#X connect 21 0 19 0; -#X connect 27 0 1 0; +#X connect 20 0 1 0; +#X connect 20 0 19 0; +#X connect 26 0 1 0; diff --git a/doc/3.audio.examples/A07.fusion.pd b/doc/3.audio.examples/A07.fusion.pd index 124286a7..8a8ab900 100644 --- a/doc/3.audio.examples/A07.fusion.pd +++ b/doc/3.audio.examples/A07.fusion.pd @@ -38,7 +38,6 @@ #X text 176 99 <-- choose a different pitch; #X text 70 487 A simple way to build non-sinusoidal \, periodic musical tones is to sum a series of harmonically tuned sinusoids. Here the four oscillators have frequencies in a 1:2:3:4 ratio (the three [*] objects compute the second \, third \, and fourth one). The amplitudes are adjusted by the [*~ 0.1] \, etc. \, objects. Note that \, since the frequency (from [mtof]) is a message \, a [*] box suffices to operate on it \, but the oscillator's output \, being an audio signal \, needs [*~] instead. The control marked "overtones ON/OFF" is a toggle switch. Click to turn it on and off. Of the overtones are "off" you hear only a sinusoid from the first oscillator. If on \, you hear all four., f 74; #X text 70 623 To hear the output \, choose a pitch (at top) \, optionally click the "overtones" control \, and mouse up the output volume. Click the "bang" button to graph it., f 74; -#X text 408 678 updated for Pd version 0.40-0; #X obj 138 360 tabwrite~ fusion; #X connect 0 0 1 0; #X connect 1 0 4 0; @@ -55,12 +54,12 @@ #X connect 10 0 9 0; #X connect 11 0 15 1; #X connect 12 0 2 0; -#X connect 12 0 36 0; +#X connect 12 0 35 0; #X connect 13 0 12 1; #X connect 14 0 13 1; #X connect 15 0 16 0; #X connect 16 0 13 0; #X connect 23 0 15 0; #X connect 24 0 16 1; -#X connect 27 0 36 0; +#X connect 27 0 35 0; #X connect 31 0 3 0; diff --git a/doc/3.audio.examples/A08.beating.pd b/doc/3.audio.examples/A08.beating.pd index aa651415..c333b936 100644 --- a/doc/3.audio.examples/A08.beating.pd +++ b/doc/3.audio.examples/A08.beating.pd @@ -17,7 +17,6 @@ #X text 40 499 In contrast to the previous example \, the oscillators are not tuned to the overtone series (ratios 1:2:3:4...) and so the frequencies 330 \, 440 \, and 587 are heard separately.; #X obj 57 569 declare -stdpath ./; #X text 41 432 They are all summed using [+~] objects. They could have been summed in any order ([+~] is commutative for practical purposes) but here they are added in pairs to emphasize the relationships between them.; -#X text 298 578 updated for Pd version 0.40-0; #X connect 1 0 0 0; #X connect 2 0 11 0; #X connect 3 0 11 1; diff --git a/doc/3.audio.examples/A09.frequency.mod.pd b/doc/3.audio.examples/A09.frequency.mod.pd index 56511b3f..ca9456a0 100644 --- a/doc/3.audio.examples/A09.frequency.mod.pd +++ b/doc/3.audio.examples/A09.frequency.mod.pd @@ -1,4 +1,4 @@ -#N canvas 495 38 652 674 12; +#N canvas 495 38 650 659 12; #X declare -stdpath ./; #X obj 218 172 *~; #X floatatom 218 87 5 0 0 0 - - - 0; @@ -23,7 +23,6 @@ #X text 426 233 --- 0.01 seconds ----; #X text 61 489 To get the FM sound \, set all three of carrier frequency \, modulation frequency \, and modulation index in the hundreds. Note that you get a timbral change as you sweep modulation index \, because this changes the amplitudes of the components of the output sound but not their frequencies., f 71; #X obj 148 319 output~; -#X text 390 630 updated for Pd version 0.37; #X text 61 393 This patch shows the classical FM synthesis technique developed by John Chowning. It's nothing but an oscillator with vibrato controlled by another "modulation" oscillator. First \, to understand the patch \, set carrier frequency to 400 or so \, modulation frequency between 5 and 10 \, and try modulation index values between 0 and 400 \, say. You'll hear a sine wave with vibrato., f 71; #X text 61 568 The component frequencies are equal to the carrier frequency \, plus or minus multiples of the modulator frequency. A more complete discussion of FM occurs in part 5 of this series., f 71; #X obj 461 26 declare -stdpath ./; @@ -39,4 +38,4 @@ #X connect 12 0 5 0; #X connect 12 0 19 0; #X connect 16 0 0 0; -#X connect 24 0 5 0; +#X connect 23 0 5 0; diff --git a/doc/3.audio.examples/A10.review.pd b/doc/3.audio.examples/A10.review.pd index 4ea3a933..e077073e 100644 --- a/doc/3.audio.examples/A10.review.pd +++ b/doc/3.audio.examples/A10.review.pd @@ -28,7 +28,6 @@ #X msg 84 522; #X text 121 522 -- message box; #X text 26 397 ... and these other (non-object) boxes:; -#X text 417 615 updated for Pd version 0.54; #X text 117 69 (etc.) -- bynary operation on audio signals; #X obj 85 596 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; #X text 112 596 -- bang button; diff --git a/doc/3.audio.examples/B01.wavetables.pd b/doc/3.audio.examples/B01.wavetables.pd index f3a36aec..fbfc4266 100644 --- a/doc/3.audio.examples/B01.wavetables.pd +++ b/doc/3.audio.examples/B01.wavetables.pd @@ -6,7 +6,6 @@ #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.612 0.612 0.612 0.612 0.612 0.627692 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.470769 -0.470769 -0.470769 -0.470769 -0.470769 -0.470769 -0.470769 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.627692 0.627692 0.627692 0.643385 0.643385 0.643385 0.659077 0 -0.502154 -0.502154 -0.502154 -0.486462 -0.486462 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.580615 0.596308 0.596308 0.596308 0.596308 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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.02 258 -1.02 258 130 1; #X restore 279 92 graph; -#X text 459 553 updated for Pd version 0.34; #X text 78 18 WAVETABLE OSCILLATORS; #X text 25 123 wavetable; #X obj 127 87 mtof; @@ -23,7 +22,7 @@ #X text 83 263 Here \, in place of the [osc~] cosine wave oscillator \, we introduce the [tabosc4~] oscillator which uses arbitrary waveforms from arrays. You can draw a waveform in the array with the mouse., f 73; #X text 83 399 For efficiency's sake [tabosc4~] requires that the table has a power of two plus three points (64+3=67 \, 128+3=131 \, 256+3=259 \, etc.) If you want wraparound to work smoothly \, you should make the last three points copies of the first three. This is done because [tabread4~] does 4-point interpolation., f 73; #X text 83 319 Note that I selected "save contents" in the properties dialog for table10 (right click on the table to see.) If this isn't set \, the waveform won't be remembered as part of the patch but will be reinitialized to zero when the patch is reopened. If it this is set and you modified the waveform \, the current waveform gets stored with the file when you save the patch., f 73; -#X connect 0 0 5 0; +#X connect 0 0 4 0; +#X connect 4 0 5 0; #X connect 5 0 6 0; -#X connect 6 0 7 0; -#X connect 7 0 11 0; +#X connect 6 0 10 0; diff --git a/doc/3.audio.examples/B02.two-wavetables.pd b/doc/3.audio.examples/B02.two-wavetables.pd index 0a433365..29924522 100644 --- a/doc/3.audio.examples/B02.two-wavetables.pd +++ b/doc/3.audio.examples/B02.two-wavetables.pd @@ -5,7 +5,6 @@ #A 0 -0.0896033 0 0.0896033 0.178356 0.265425 0.350007 0.431348 0.508756 0.58161 0.649372 0.711597 0.767935 0.818137 0.862053 0.89963 0.930912 0.956028 0.975187 0.988669 0.996811 1 0.998655 0.993223 0.984158 0.971919 0.956953 0.939691 0.920538 0.899867 0.878018 0.85529 0.831945 0.808204 0.784252 0.760239 0.736284 0.712477 0.688888 0.665568 0.642553 0.619872 0.59755 0.575607 0.554066 0.532953 0.512296 0.49213 0.472491 0.453419 0.434957 0.417147 0.400027 0.383632 0.367992 0.353126 0.339046 0.32575 0.313227 0.301453 0.290394 0.280002 0.270224 0.260995 0.252248 0.24391 0.235908 0.22817 0.220628 0.213219 0.205888 0.198586 0.191278 0.183936 0.176545 0.169098 0.1616 0.154063 0.146505 0.138954 0.131437 0.123987 0.116636 0.109415 0.102354 0.0954784 0.0888083 0.08236 0.0761442 0.0701659 0.0644253 0.0589178 0.0536354 0.0485669 0.0436994 0.0390194 0.0345135 0.0301695 0.0259776 0.0219306 0.0180245 0.0142591 0.0106377 0.00716724 0.00385775 0.000722025 -0.00222511 -0.0049675 -0.00748845 -0.00977153 -0.0118014 -0.0135644 -0.0150493 -0.0162479 -0.0171551 -0.0177693 -0.0180928 -0.0181312 -0.0178936 -0.017392 -0.0166417 -0.0156601 -0.0144666 -0.0130822 -0.0115294 -0.00983114 -0.0080113 -0.00609396 -0.0041034 -0.00206402 -2.23572e-07 0.00206358 0.00410297 0.00609353 0.00801089 0.00983075 0.011529 0.0130819 0.0144663 0.0156599 0.0166416 0.0173919 0.0178935 0.0181312 0.0180929 0.0177695 0.0171552 0.0162481 0.0150496 0.0135647 0.0118018 0.009772 0.00748897 0.00496807 0.00222573 -0.000721367 -0.00385706 -0.00716651 -0.010637 -0.0142583 -0.0180237 -0.0219297 -0.0259767 -0.0301686 -0.0345125 -0.0390184 -0.0436984 -0.0485658 -0.0536343 -0.0589167 -0.0644241 -0.0701647 -0.0761429 -0.0823587 -0.0888069 -0.0954769 -0.102353 -0.109414 -0.116634 -0.123985 -0.131435 -0.138952 -0.146504 -0.154061 -0.161598 -0.169097 -0.176543 -0.183935 -0.191276 -0.198584 -0.205886 -0.213218 -0.220627 -0.228169 -0.235906 -0.243908 -0.252246 -0.260993 -0.270222 -0.28 -0.290392 -0.301451 -0.313224 -0.325747 -0.339043 -0.353123 -0.367989 -0.383629 -0.400023 -0.417143 -0.434954 -0.453415 -0.472486 -0.492125 -0.512292 -0.532948 -0.554062 -0.575602 -0.597545 -0.619868 -0.642548 -0.665563 -0.688883 -0.712472 -0.736279 -0.760234 -0.784247 -0.808199 -0.83194 -0.855285 -0.878013 -0.899863 -0.920533 -0.939687 -0.956949 -0.971916 -0.984156 -0.993221 -0.998655 -1 -0.996813 -0.988671 -0.975191 -0.956033 -0.930918 -0.899638 -0.862061 -0.818147 -0.767947 -0.71161 -0.649386 -0.581625 -0.508772 -0.431366 -0.350025 -0.265443 -0.178375 -0.0896226 -1.94061e-05 0.089584; #X coords 0 1.02 258 -1.02 258 130 1; #X restore 323 194 graph; -#X text 395 455 updated for Pd version 0.34; #X text 47 147 wavetable; #N canvas 0 22 450 278 (subpatch) 0; #X array pitch11 259 float 1; @@ -22,6 +21,6 @@ #X text 41 164 oscillator -->; #X text 63 349 Here's a [tabosc4~] controlling the frequency of another one. If you get properties on the two arrays \, you'll see that the top graph has a vertical scale from 0 to 1000 \, to represent a range in Hz., f 69; #X text 63 397 We're looping through that at a frequency of 0.5 Hz and the output is used as the frequency input of the second [tabosc4~]. I've detected Klingons \, Captain Kirk..., f 69; -#X connect 4 0 5 0; -#X connect 5 0 7 0; -#X connect 6 0 4 0; +#X connect 3 0 4 0; +#X connect 4 0 6 0; +#X connect 5 0 3 0; diff --git a/doc/3.audio.examples/B03.tabread4.pd b/doc/3.audio.examples/B03.tabread4.pd index a828601e..81074976 100644 --- a/doc/3.audio.examples/B03.tabread4.pd +++ b/doc/3.audio.examples/B03.tabread4.pd @@ -1,4 +1,4 @@ -#N canvas 376 88 740 645 12; +#N canvas 376 88 740 623 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array waveform12 131 float 1; @@ -23,7 +23,6 @@ #X restore 399 193 graph; #X obj 197 267 tabwrite~ wave-out12; #X obj 250 139 +~ 128; -#X text 484 599 updated for Pd version 0.37; #X obj 157 307 output~; #X obj 522 357 declare -stdpath ./; #X obj 197 231 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; @@ -35,12 +34,12 @@ #X text 71 518 You would use [tabread4~] (as opposed to [tabosc4~]) if you need direct control of the phase \, for instance to advance nonlinearly through the table. In the case shown here \, the "squeeze" factor makes the phase grow to a value at least \, and possibly much greater than \, 129 (to which [tabread4~] then limits it). So the resulting waveform is compressed in time., f 87; #X connect 2 0 8 0; #X connect 3 0 14 0; -#X connect 3 0 17 0; +#X connect 3 0 16 0; #X connect 4 0 3 0; #X connect 5 0 2 0; -#X connect 6 0 21 0; +#X connect 6 0 20 0; #X connect 7 0 15 0; #X connect 8 0 4 0; #X connect 15 0 8 1; -#X connect 19 0 14 0; -#X connect 21 0 7 0; +#X connect 18 0 14 0; +#X connect 20 0 7 0; diff --git a/doc/3.audio.examples/B04.tabread4.interpolation.pd b/doc/3.audio.examples/B04.tabread4.interpolation.pd index d5e41938..bceb1c1e 100644 --- a/doc/3.audio.examples/B04.tabread4.interpolation.pd +++ b/doc/3.audio.examples/B04.tabread4.interpolation.pd @@ -1,10 +1,9 @@ -#N canvas 456 108 738 541 12; +#N canvas 456 108 739 519 12; #N canvas 0 22 450 278 (subpatch) 0; #X array waveform13 11 float 1; #A 0 1 1 1 1 1 1 1 -1 -1 -1 -1; #X coords 0 1.02 10 -1.02 180 130 1; #X restore 404 24 graph; -#X text 502 500 updated for Pd version 0.34; #X obj 162 159 +~ 1; #X text 52 82 phase; #X text 52 131 range; @@ -34,10 +33,10 @@ #X text 195 52 initialize waveform; #X connect 0 0 1 0; #X restore 564 429 pd init_waveform; -#X connect 2 0 7 0; -#X connect 7 0 6 0; -#X connect 8 0 2 0; -#X connect 9 0 8 0; -#X connect 11 0 12 0; -#X connect 14 0 6 0; -#X connect 15 0 17 0; +#X connect 1 0 6 0; +#X connect 6 0 5 0; +#X connect 7 0 1 0; +#X connect 8 0 7 0; +#X connect 10 0 11 0; +#X connect 13 0 5 0; +#X connect 14 0 16 0; diff --git a/doc/3.audio.examples/B05.tabread.FM.pd b/doc/3.audio.examples/B05.tabread.FM.pd index 5771bfb6..1a82880d 100644 --- a/doc/3.audio.examples/B05.tabread.FM.pd +++ b/doc/3.audio.examples/B05.tabread.FM.pd @@ -1,4 +1,4 @@ -#N canvas 478 98 693 435 12; +#N canvas 478 98 692 410 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array pitchmod14 131 float 1; @@ -13,7 +13,6 @@ #X obj 127 265 osc~; #X obj 145 130 tabosc4~ pitchmod14; #X text 65 31 FREQUENCY MODULATION BY WAVETABLE; -#X text 399 361 updated for Pd version 0.37; #X obj 127 307 output~; #X obj 445 31 declare -stdpath ./; #X text 357 88 This [tabosc4~] controls the pitch of a sinusoidal oscillator ([osc~]). Try changing the waveform as well as the three familiar parameters., f 37; @@ -25,5 +24,5 @@ #X connect 3 0 5 1; #X connect 4 0 3 1; #X connect 5 0 6 0; -#X connect 6 0 10 0; +#X connect 6 0 9 0; #X connect 7 0 3 0; diff --git a/doc/3.audio.examples/B06.table.switching.pd b/doc/3.audio.examples/B06.table.switching.pd index 1a46c38c..d7e65ce7 100644 --- a/doc/3.audio.examples/B06.table.switching.pd +++ b/doc/3.audio.examples/B06.table.switching.pd @@ -20,7 +20,6 @@ #X obj 79 466 array define -k waveshape15c 131; #A 0 0 -0.553343 -0.486675 -0.426674 -0.333339 -0.300005 -0.233338 -0.173337 -0.113336 -0.0600014 -0.0133339 0.0333335 0.0866678 0.133335 0.173336 0.213337 0.24667 0.280004 0.313338 0.333339 0.353339 0.346672 0.300005 -0.240004 -0.306672 -0.306672 -0.306672 -0.306672 -0.313339 -0.326673 -0.333339 -0.35334 -0.360006 -0.37334 -0.453341 -0.460008 -0.460008 -0.460008 -0.453341 -0.426674 -0.400007 -0.340006 -0.253338 -0.18667 -3.57628e-07 0.0533339 0.180003 0.200003 0.280004 0.320005 0.360006 0.392006 0.424007 0.456007 0.488008 0.520008 0.540009 0.563343 0.586676 0.606677 0.62001 0.62001 0.420007 -0.506676 -0.586677 -0.673345 -0.720013 -0.74668 -0.780014 -0.900016 -0.900016 -0.886682 -0.860015 -0.840015 -0.820014 -0.78668 -0.76668 -0.74668 -0.693345 -0.662234 -0.631122 -0.600011 -0.573343 -0.543343 -0.513342 -0.480008 -0.446675 -0.418341 -0.390007 -0.361673 -0.333339 -0.293339 -0.253338 -0.220004 -0.18667 -0.153336 -0.120002 -0.0866685 -0.0533346 -0.0200007 0.00999981 0.0400003 0.0666674 0.0933346 0.123335 0.153336 0.20667 0.233337 0.260004 0.291116 0.322227 0.353339 0.400006 0.440007 0.480008 0.500008 0.533342 0.566676 0.60001 0.626677 0.653344 0.683345 0.740012 0.780013 0.82668 0.853347 0.846681 0.833347 0.773346 0.706678 0.646677; #X msg 184 244 set waveshape15c; -#X text 560 499 updated for Pd version 0.52; #X obj 79 505 table; #X text 48 385 There's also an [array] object so that you can have arrays with parameterizable names and sizes. You can also save the state of the array in this case \, and read it in from a file or calculate it at startup.; #X text 123 506 <-- see also this older and less powerful object (you can't save contents in this one)., f 46; diff --git a/doc/3.audio.examples/B07.sampler.pd b/doc/3.audio.examples/B07.sampler.pd index 154b1258..93db7df4 100644 --- a/doc/3.audio.examples/B07.sampler.pd +++ b/doc/3.audio.examples/B07.sampler.pd @@ -17,7 +17,6 @@ #X text 101 235 convert smoothly to audio signal; #X text 107 66 (range is 0-100.) YOU ONLY HEAR OUTPUT; #X text 108 82 WHEN THIS IS 0-100 AND ACTIVELY CHANGING.; -#X text 532 647 updated for Pd version 0.33; #X msg 204 359 read ../sound/voice.wav sample-table; #X obj 204 384 soundfiler; #X obj 59 348 output~; @@ -35,13 +34,13 @@ #X text 527 160 --- 44103 samples ---; #X msg 78 198 1 \, 44101 1000; #X text 182 197 read the whole table (from 1 to n-2); -#X connect 0 0 17 0; +#X connect 0 0 16 0; #X connect 2 0 0 0; #X connect 3 0 2 0; -#X connect 4 0 19 0; +#X connect 4 0 18 0; #X connect 5 0 4 0; -#X connect 8 0 15 0; -#X connect 15 0 16 0; -#X connect 19 0 22 0; -#X connect 22 0 3 0; -#X connect 30 0 3 0; +#X connect 8 0 14 0; +#X connect 14 0 15 0; +#X connect 18 0 21 0; +#X connect 21 0 3 0; +#X connect 29 0 3 0; diff --git a/doc/3.audio.examples/B08.sampler.loop.pd b/doc/3.audio.examples/B08.sampler.loop.pd index c0b5b189..ece108fe 100644 --- a/doc/3.audio.examples/B08.sampler.loop.pd +++ b/doc/3.audio.examples/B08.sampler.loop.pd @@ -24,7 +24,6 @@ #X obj 625 443 soundfiler; #X text 699 206 ---- 44103 samples ----; #X obj 55 375 output~; -#X text 717 527 updated for Pd version 0.37; #X obj 55 243 tabread4~ table17; #X obj 616 331 tabwrite~ table17; #X msg 625 418 read ../sound/voice.wav table17; @@ -40,17 +39,17 @@ #X obj 55 107 phasor~; #X obj 88 272 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X text 482 206 ------ 1 second ------; -#X connect 2 0 21 0; +#X connect 2 0 20 0; #X connect 4 0 17 0; -#X connect 5 0 31 0; +#X connect 5 0 30 0; #X connect 8 0 9 0; #X connect 9 0 10 1; #X connect 10 0 11 0; -#X connect 11 0 19 0; -#X connect 12 0 20 0; -#X connect 19 0 4 0; -#X connect 19 0 3 0; -#X connect 21 0 15 0; -#X connect 25 0 20 0; -#X connect 31 0 10 0; -#X connect 32 0 3 0; +#X connect 11 0 18 0; +#X connect 12 0 19 0; +#X connect 18 0 4 0; +#X connect 18 0 3 0; +#X connect 20 0 15 0; +#X connect 24 0 19 0; +#X connect 30 0 10 0; +#X connect 31 0 3 0; diff --git a/doc/3.audio.examples/B09.sampler.loop.smooth.pd b/doc/3.audio.examples/B09.sampler.loop.smooth.pd index 3a40c4e7..dcd3cdb6 100644 --- a/doc/3.audio.examples/B09.sampler.loop.smooth.pd +++ b/doc/3.audio.examples/B09.sampler.loop.smooth.pd @@ -33,7 +33,6 @@ #X msg 509 502 read ../sound/voice.wav table18; #X text 550 403 <-- click here to record to table; #X text 600 481 v-- re-read the original sound; -#X text 613 562 updated for Pd version 0.37; #X obj 221 313 declare -stdpath ./; #X text 225 220 <-- click to graph envelope; #X text 131 49 <-- frequency (Hz.); @@ -59,5 +58,5 @@ #X connect 19 0 7 0; #X connect 22 0 12 1; #X connect 24 0 13 0; -#X connect 32 0 20 0; -#X connect 33 0 23 0; +#X connect 31 0 20 0; +#X connect 32 0 23 0; diff --git a/doc/3.audio.examples/B10.sampler.scratch.pd b/doc/3.audio.examples/B10.sampler.scratch.pd index 825c317e..a921a252 100644 --- a/doc/3.audio.examples/B10.sampler.scratch.pd +++ b/doc/3.audio.examples/B10.sampler.scratch.pd @@ -27,7 +27,6 @@ #X text 527 164 ---- 44103 samples ---; #X obj 355 441 tabwrite~ table19; #X msg 544 444 read ../sound/voice.wav table19; -#X text 603 632 updated for Pd version 0.37; #X obj 86 173 -~ 0.5; #X obj 147 91 phasor~; #X obj 86 201 *~ 0.5; @@ -50,29 +49,29 @@ #X text 259 183 read point (100ths of a second), f 19; #X text 550 349 ----- 1 second -----; #X msg 534 502 \; graph19 ylabel 46000 0 44100; -#X connect 1 0 23 0; +#X connect 1 0 22 0; #X connect 2 0 3 0; #X connect 3 0 4 1; #X connect 4 0 5 0; #X connect 5 0 13 0; #X connect 6 0 7 0; #X connect 7 0 19 0; -#X connect 9 0 37 0; +#X connect 9 0 36 0; #X connect 10 0 13 1; -#X connect 11 0 33 0; +#X connect 11 0 32 0; #X connect 12 0 11 0; +#X connect 13 0 28 0; #X connect 13 0 29 0; -#X connect 13 0 30 0; -#X connect 15 0 43 0; +#X connect 15 0 42 0; #X connect 15 0 20 0; #X connect 20 0 17 0; -#X connect 22 0 24 0; -#X connect 23 0 4 0; -#X connect 23 0 22 0; -#X connect 24 0 25 0; -#X connect 25 0 9 0; -#X connect 29 0 9 1; -#X connect 33 0 10 0; -#X connect 34 0 19 0; -#X connect 35 0 30 0; -#X connect 37 0 26 0; +#X connect 21 0 23 0; +#X connect 22 0 4 0; +#X connect 22 0 21 0; +#X connect 23 0 24 0; +#X connect 24 0 9 0; +#X connect 28 0 9 1; +#X connect 32 0 10 0; +#X connect 33 0 19 0; +#X connect 34 0 29 0; +#X connect 36 0 25 0; diff --git a/doc/3.audio.examples/B11.sampler.nodoppler.pd b/doc/3.audio.examples/B11.sampler.nodoppler.pd index 9247af91..f8bf74ba 100644 --- a/doc/3.audio.examples/B11.sampler.nodoppler.pd +++ b/doc/3.audio.examples/B11.sampler.nodoppler.pd @@ -39,7 +39,6 @@ #X obj 420 307 tabwrite~ table20; #X msg 459 419 read ../sound/voice.wav table20; #X text 310 525 This example differs from the previous one in having samphold~ objects which allow the chunk size and especially the read point to change only at points where the phase wraps around. This removes signal discontinuities (when the chunk size changes) and doppler shift when the read point is changing., f 67; -#X text 640 606 updated for Pd version 0.37; #X obj 397 58 declare -stdpath ./; #X text 250 343 <-- graph table index; #X text 459 279 <-- record; @@ -50,7 +49,7 @@ #X text 275 169 <-- read point in 100ths of a second; #X text 601 362 ------ 1 second ------; #X msg 447 474 \; graph20 ylabel 46000 0 44100; -#X connect 1 0 43 0; +#X connect 1 0 42 0; #X connect 1 0 31 0; #X connect 2 0 24 0; #X connect 3 0 7 0; @@ -78,5 +77,5 @@ #X connect 27 0 12 0; #X connect 29 0 12 1; #X connect 31 0 22 0; -#X connect 37 0 30 0; -#X connect 38 0 28 0; +#X connect 36 0 30 0; +#X connect 37 0 28 0; diff --git a/doc/3.audio.examples/B12.sampler.transpose.pd b/doc/3.audio.examples/B12.sampler.transpose.pd index 9ce60fd6..8167a0cc 100644 --- a/doc/3.audio.examples/B12.sampler.transpose.pd +++ b/doc/3.audio.examples/B12.sampler.transpose.pd @@ -46,7 +46,6 @@ #X obj 81 576 output~; #X obj 81 481 tabread4~ table21; #X text 459 540 v-- re-read original table; -#X text 615 604 updated for Pd version 0.37; #X text 592 430 --- 44103 samples ---; #X obj 29 87 expr pow(2 \, $f1/120); #X text 190 86 speed change; @@ -61,14 +60,14 @@ #X text 71 62 <-- transposition (10ths of a halftone); #X text 95 261 <-- chunk size (100ths of a second); #X text 184 352 <-- read point in 100ths of a second; -#X connect 1 0 50 0; +#X connect 1 0 49 0; #X connect 2 0 3 0; #X connect 2 0 25 0; #X connect 3 0 15 0; #X connect 4 0 12 0; #X connect 5 0 6 0; -#X connect 6 0 49 0; -#X connect 7 0 54 0; +#X connect 6 0 48 0; +#X connect 7 0 53 0; #X connect 8 0 13 0; #X connect 9 0 11 0; #X connect 10 0 9 0; @@ -82,19 +81,19 @@ #X connect 20 0 14 1; #X connect 21 0 16 1; #X connect 22 0 13 1; -#X connect 24 0 45 0; +#X connect 24 0 44 0; #X connect 25 0 23 0; #X connect 28 0 29 0; #X connect 29 0 30 0; #X connect 29 1 30 1; -#X connect 30 0 48 0; +#X connect 30 0 47 0; #X connect 36 0 24 0; #X connect 37 0 38 0; #X connect 38 0 39 0; #X connect 39 0 7 1; #X connect 41 0 7 0; -#X connect 45 0 30 0; -#X connect 48 0 19 0; -#X connect 50 0 35 0; -#X connect 53 0 49 0; -#X connect 54 0 40 0; +#X connect 44 0 30 0; +#X connect 47 0 19 0; +#X connect 49 0 35 0; +#X connect 52 0 48 0; +#X connect 53 0 40 0; diff --git a/doc/3.audio.examples/B13.sampler.overlap.pd b/doc/3.audio.examples/B13.sampler.overlap.pd index be8a54a4..b4ed7958 100644 --- a/doc/3.audio.examples/B13.sampler.overlap.pd +++ b/doc/3.audio.examples/B13.sampler.overlap.pd @@ -1,4 +1,4 @@ -#N canvas 499 23 685 718 12; +#N canvas 499 38 685 718 12; #X declare -stdpath ./; #X floatatom 35 48 5 0 100 0 - - - 0; #X obj 35 93 * 441; @@ -30,7 +30,6 @@ #X obj 193 437 *~ 0.5; #X obj 193 460 cos~; #X obj 60 600 output~; -#X text 19 679 updated for Pd version 0.37; #X obj 380 77 expr pow(2 \, $f1/120); #X text 549 77 speed change; #X obj 380 181 phasor~; @@ -98,14 +97,14 @@ #X obj 60 569 hip~ 5; #X connect 0 0 1 0; #X connect 0 0 19 0; -#X connect 1 0 36 0; +#X connect 1 0 35 0; #X connect 2 0 8 0; -#X connect 3 0 59 0; -#X connect 4 0 38 0; +#X connect 3 0 58 0; +#X connect 4 0 37 0; #X connect 5 0 7 0; #X connect 6 0 5 0; #X connect 7 0 4 0; -#X connect 8 0 69 0; +#X connect 8 0 68 0; #X connect 9 0 8 1; #X connect 10 0 11 0; #X connect 11 0 2 0; @@ -113,39 +112,39 @@ #X connect 14 0 10 1; #X connect 15 0 11 1; #X connect 16 0 9 1; -#X connect 18 0 31 0; +#X connect 18 0 30 0; #X connect 19 0 17 0; #X connect 22 0 23 0; #X connect 23 0 24 0; #X connect 23 1 24 1; -#X connect 24 0 33 0; +#X connect 24 0 32 0; #X connect 25 0 18 0; #X connect 26 0 27 0; #X connect 27 0 28 0; #X connect 28 0 3 1; -#X connect 31 0 24 0; -#X connect 33 0 13 0; -#X connect 33 0 40 0; -#X connect 39 0 9 0; +#X connect 30 0 24 0; +#X connect 32 0 13 0; +#X connect 32 0 39 0; +#X connect 38 0 9 0; +#X connect 39 0 40 0; #X connect 40 0 41 0; -#X connect 41 0 42 0; -#X connect 43 0 10 0; -#X connect 44 0 46 0; -#X connect 45 0 59 1; -#X connect 46 0 70 0; -#X connect 47 0 46 1; -#X connect 48 0 49 0; -#X connect 49 0 44 0; +#X connect 42 0 10 0; +#X connect 43 0 45 0; +#X connect 44 0 58 1; +#X connect 45 0 69 0; +#X connect 46 0 45 1; +#X connect 47 0 48 0; +#X connect 48 0 43 0; +#X connect 49 0 50 0; #X connect 50 0 51 0; -#X connect 51 0 52 0; -#X connect 52 0 45 1; +#X connect 51 0 44 1; +#X connect 52 0 46 0; #X connect 53 0 47 0; -#X connect 54 0 48 0; +#X connect 54 0 47 1; #X connect 55 0 48 1; -#X connect 56 0 49 1; -#X connect 57 0 50 0; -#X connect 58 0 47 1; -#X connect 59 0 75 0; -#X connect 69 0 3 0; -#X connect 70 0 45 0; -#X connect 75 0 29 0; +#X connect 56 0 49 0; +#X connect 57 0 46 1; +#X connect 58 0 74 0; +#X connect 68 0 3 0; +#X connect 69 0 44 0; +#X connect 74 0 29 0; diff --git a/doc/3.audio.examples/B14.sampler.rockafella.pd b/doc/3.audio.examples/B14.sampler.rockafella.pd index db89a24d..698f4662 100644 --- a/doc/3.audio.examples/B14.sampler.rockafella.pd +++ b/doc/3.audio.examples/B14.sampler.rockafella.pd @@ -18,7 +18,6 @@ #X obj 205 402 *~ 0.5; #X obj 205 449 cos~; #X obj 187 573 output~; -#X text 626 614 updated for Pd version 0.37; #X obj 550 180 phasor~; #X obj 395 235 s~ read-pt; #X obj 95 355 r~ read-pt; @@ -90,67 +89,67 @@ #X text 187 88 precession --> (percent), f 14; #X text 101 143 <-- chunk size (msec); #X text 523 347 Here \, rather than ask you to push the read pointer back and forth in the sample \, we use a [phasor~]. This makes it possible to avoid the samphold~ on the read pointer ([r~ read-pt]) \, since \, knowing the precession \, we can correct for it in computing the frequency of the original [phasor~] above at right., f 46; -#X text 603 28 <--, f 3; +#X text 603 28 <--; #X text 630 28 transposition \, halftones/10, f 14; -#X connect 0 0 26 0; -#X connect 1 0 25 0; -#X connect 2 0 36 0; -#X connect 3 0 28 0; +#X connect 0 0 25 0; +#X connect 1 0 24 0; +#X connect 2 0 35 0; +#X connect 3 0 27 0; #X connect 4 0 5 0; #X connect 5 0 3 0; #X connect 7 0 4 1; #X connect 7 0 5 1; #X connect 7 0 14 0; -#X connect 9 0 57 0; +#X connect 9 0 56 0; #X connect 12 0 13 0; -#X connect 13 0 57 0; -#X connect 13 1 57 1; +#X connect 13 0 56 0; +#X connect 13 1 56 1; #X connect 14 0 15 0; #X connect 15 0 16 0; #X connect 16 0 1 1; -#X connect 19 0 22 0; -#X connect 19 0 6 0; -#X connect 21 0 3 1; +#X connect 18 0 21 0; +#X connect 18 0 6 0; +#X connect 20 0 3 1; +#X connect 21 0 22 0; #X connect 22 0 23 0; -#X connect 23 0 24 0; -#X connect 25 0 65 0; -#X connect 26 0 8 0; -#X connect 27 0 61 0; -#X connect 28 0 31 0; -#X connect 29 0 1 0; -#X connect 30 0 4 0; -#X connect 31 0 29 0; -#X connect 32 0 19 0; -#X connect 34 0 57 0; -#X connect 34 1 57 2; -#X connect 35 0 34 0; -#X connect 36 0 33 0; -#X connect 36 0 62 0; -#X connect 37 0 25 1; -#X connect 38 0 45 0; -#X connect 39 0 40 0; -#X connect 40 0 38 0; +#X connect 24 0 64 0; +#X connect 25 0 8 0; +#X connect 26 0 60 0; +#X connect 27 0 30 0; +#X connect 28 0 1 0; +#X connect 29 0 4 0; +#X connect 30 0 28 0; +#X connect 31 0 18 0; +#X connect 33 0 56 0; +#X connect 33 1 56 2; +#X connect 34 0 33 0; +#X connect 35 0 32 0; +#X connect 35 0 61 0; +#X connect 36 0 24 1; +#X connect 37 0 44 0; +#X connect 38 0 39 0; +#X connect 39 0 37 0; +#X connect 40 0 41 0; #X connect 41 0 42 0; -#X connect 42 0 43 0; +#X connect 42 0 36 1; #X connect 43 0 37 1; -#X connect 44 0 38 1; -#X connect 45 0 48 0; -#X connect 46 0 37 0; -#X connect 47 0 39 0; -#X connect 48 0 46 0; -#X connect 49 0 41 0; -#X connect 49 0 40 1; -#X connect 49 0 39 1; -#X connect 50 0 53 0; -#X connect 53 0 0 0; -#X connect 54 0 55 0; -#X connect 55 0 58 0; -#X connect 56 0 54 0; -#X connect 57 0 32 0; -#X connect 58 0 62 0; -#X connect 58 1 62 1; -#X connect 58 1 61 1; -#X connect 59 0 56 0; -#X connect 61 0 20 0; -#X connect 62 0 27 0; -#X connect 65 0 17 0; +#X connect 44 0 47 0; +#X connect 45 0 36 0; +#X connect 46 0 38 0; +#X connect 47 0 45 0; +#X connect 48 0 40 0; +#X connect 48 0 39 1; +#X connect 48 0 38 1; +#X connect 49 0 52 0; +#X connect 52 0 0 0; +#X connect 53 0 54 0; +#X connect 54 0 57 0; +#X connect 55 0 53 0; +#X connect 56 0 31 0; +#X connect 57 0 61 0; +#X connect 57 1 61 1; +#X connect 57 1 60 1; +#X connect 58 0 55 0; +#X connect 60 0 19 0; +#X connect 61 0 26 0; +#X connect 64 0 17 0; diff --git a/doc/3.audio.examples/B15.tabread4~-onset.pd b/doc/3.audio.examples/B15.tabread4~-onset.pd index 28d1c000..d865cc56 100644 --- a/doc/3.audio.examples/B15.tabread4~-onset.pd +++ b/doc/3.audio.examples/B15.tabread4~-onset.pd @@ -27,7 +27,6 @@ #X msg 418 382 \; pd dsp 1 \, fast-forward 4000; #X text 20 178 You can use the "onset" inlet to [tabread4~] to get good accuracy reading longer arrays. The [tabread4~] object adds the index and the "main" (signal) inlet in double precision. So if \, for example \, the onset inlet could specify an integer exactly up to about 8 million (190 seconds at 44100 Hz) \, and the signal inlet could act as a displacement., f 89; #X obj 300 383 sig~; -#X text 426 585 updated for Pd version 0.55; #X connect 1 0 2 0; #X connect 2 0 5 0; #X connect 4 0 0 0; diff --git a/doc/3.audio.examples/B16.long-varispeed.pd b/doc/3.audio.examples/B16.long-varispeed.pd index 2f24c9d1..84a56119 100644 --- a/doc/3.audio.examples/B16.long-varispeed.pd +++ b/doc/3.audio.examples/B16.long-varispeed.pd @@ -66,7 +66,6 @@ #X obj 737 15 declare -stdpath ./; #X msg 669 162 \; pd dsp 1 \, fast-forward 22680; #X text 539 55 *** The table is now 1 million points and takes about 23 seconds to fill \, we also use the 'fast-forward' message to fill it., f 47; -#X text 711 809 updated for Pd version 0.52; #X text 24 43 Here is how to use the [tabread~]'s "onset" input to allow clean varispeed playback from a long table. At left \, a [phasor~] is naively rescaled to the size of the table. At right \, the [phasor~] gets only a 10000-point range about a moving "onset". Ten times per second \, we poll the [phasor~]'s phase \, sum its value into the onset \, and back up the phase of the [phasor~] correspondingly., f 69; #X text 24 133 The tricky bits are \, first \, that we need to poll the [phasor~]'s phase one sample into the future (so we add the per-sample increment into the [snapshot~] result). Second \, we can't just reset the [phasor~] to a fixed point - instead \, we measure how much the onset has actually increased (which has truncation error from summing in the phase snapshot) \, and subtract that increase from the phase \, giving a value that differs from zero by the truncation error but reflects the true phase we should reset to for continuity., f 69; #X text 24 252 The metronome rate is arbitrary but should be fast enough that the [phasor~] never has time to wrap., f 69; diff --git a/doc/3.audio.examples/C01.nyquist.pd b/doc/3.audio.examples/C01.nyquist.pd index 3a04361e..20f5e677 100644 --- a/doc/3.audio.examples/C01.nyquist.pd +++ b/doc/3.audio.examples/C01.nyquist.pd @@ -1,4 +1,4 @@ -#N canvas 604 54 543 674 12; +#N canvas 604 54 543 646 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array table24 259 float 0; @@ -34,7 +34,6 @@ #X text 101 17 THE NYQUIST THEOREM AND FOLDOVER; #X text 47 52 WARNING: PLAY THIS QUIETLY TO AVOID UNPLEASANTNESS AND POSSIBLE EAR DAMAGE., f 39; #X text 46 99 Foldover occurs when you synthesize frequencies greater than the Nyquist frequency (half the sample rate). In this example \, the fundamental only reaches 1423 \, but the tables contain high partials. As the partials sweep upward you hear them reflect off the Nyquist frequency. Also \, partials can come into contact with each other causing beating. The value of 1423 was chosen to make the beating effect especially strong if you're running at a sample rate of 44100 (the usual one.); -#X text 294 632 updated for Pd version 0.37; #X obj 373 45 declare -stdpath ./; #X obj 349 272 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 374 302 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; @@ -45,6 +44,6 @@ #X connect 3 0 1 0; #X connect 6 0 7 0; #X connect 12 0 5 0; -#X connect 18 0 7 1; -#X connect 19 0 7 2; -#X connect 20 0 7 3; +#X connect 17 0 7 1; +#X connect 18 0 7 2; +#X connect 19 0 7 3; diff --git a/doc/3.audio.examples/C02.sawtooth-foldover.pd b/doc/3.audio.examples/C02.sawtooth-foldover.pd index 1d9c113a..6134762f 100644 --- a/doc/3.audio.examples/C02.sawtooth-foldover.pd +++ b/doc/3.audio.examples/C02.sawtooth-foldover.pd @@ -1,7 +1,6 @@ -#N canvas 516 98 520 604 12; +#N canvas 516 98 521 549 12; #X declare -stdpath ./; #X obj 136 395 output~; -#X text 273 533 updated for Pd version 0.37; #X text 77 17 FOLDOVER IN SAWTOOTH WAVES; #X obj 136 358 clip~ 0 1; #X obj 136 168 mtof; @@ -24,11 +23,11 @@ #X text 271 248 <-- sawtooth amplitude; #X text 259 414 <-- pulse train amplitude; #X text 179 145 <-- pitch; -#X connect 3 0 0 0; -#X connect 4 0 8 0; -#X connect 5 0 4 0; -#X connect 6 0 7 0; -#X connect 7 0 3 0; -#X connect 8 0 6 0; -#X connect 8 0 9 0; -#X connect 12 0 5 0; +#X connect 2 0 0 0; +#X connect 3 0 7 0; +#X connect 4 0 3 0; +#X connect 5 0 6 0; +#X connect 6 0 2 0; +#X connect 7 0 5 0; +#X connect 7 0 8 0; +#X connect 11 0 4 0; diff --git a/doc/3.audio.examples/C03.zipper.noise.pd b/doc/3.audio.examples/C03.zipper.noise.pd index b2766b91..e943646f 100644 --- a/doc/3.audio.examples/C03.zipper.noise.pd +++ b/doc/3.audio.examples/C03.zipper.noise.pd @@ -1,14 +1,13 @@ -#N canvas 521 48 486 508 12; +#N canvas 521 48 486 495 12; #X declare -stdpath ./; #X obj 165 378 output~; -#X text 238 471 updated for Pd version 0.37; #X text 55 16 ZIPPER NOISE; #X obj 165 338 *~; #X obj 299 378 output~; #X obj 299 339 *~; #X obj 183 279 line; #X obj 317 279 line~; -#N canvas 870 186 268 250 metro 1; +#N canvas 870 186 268 250 metro 0; #X obj 86 35 loadbang; #X msg 86 65 1; #X obj 86 96 metro 500; @@ -30,17 +29,17 @@ #X obj 183 205 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 317 206 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X text 25 44 Here is a related issue: if we use a (control) [line] object to change an amplitude \, it sends ramping control messages \, once every 20 msec by default. At left we use this to control the amplitude of a sinusoid. In effect we're multiplying the sinusoid by a staircase signal (50 increments per second.) Using the signal version \, [line~] \, fixes the problem \, since [line~] outputs a ramp that is incremented every sample., f 61; -#X connect 3 0 0 0; -#X connect 5 0 4 0; -#X connect 6 0 3 1; -#X connect 7 0 5 1; -#X connect 8 0 13 0; -#X connect 8 1 14 0; +#X connect 2 0 0 0; +#X connect 4 0 3 0; +#X connect 5 0 2 1; +#X connect 6 0 4 1; +#X connect 7 0 12 0; +#X connect 7 1 13 0; +#X connect 8 0 5 0; +#X connect 8 0 6 0; +#X connect 9 0 5 0; #X connect 9 0 6 0; -#X connect 9 0 7 0; -#X connect 10 0 6 0; -#X connect 10 0 7 0; -#X connect 11 0 3 0; -#X connect 11 0 5 0; +#X connect 10 0 2 0; +#X connect 10 0 4 0; +#X connect 12 0 8 0; #X connect 13 0 9 0; -#X connect 14 0 10 0; diff --git a/doc/3.audio.examples/C04.control.to.signal.pd b/doc/3.audio.examples/C04.control.to.signal.pd index 97ed6d27..c86dcd16 100644 --- a/doc/3.audio.examples/C04.control.to.signal.pd +++ b/doc/3.audio.examples/C04.control.to.signal.pd @@ -1,4 +1,4 @@ -#N canvas 544 38 544 580 12; +#N canvas 544 38 544 544 12; #X declare -stdpath ./; #X text 47 16 CONVERTING CONTROL TO SIGNALS; #X obj 214 387 output~; @@ -23,7 +23,6 @@ #X msg 214 305 1 2.1; #X msg 332 305 0 2.1; #X obj 379 19 declare -stdpath ./; -#X text 307 523 Updated for Pd version 0.37; #X text 46 49 For controlling amplitudes \, [line~] \, with its block-aligned breakpoints \, is accurate enough for most purposes. But certain usages \, such as this patch \, demand more accuracy. The [vline~] object \, somewhat more expensive than [line~] \, can handle breakpoints to sub-sample accuracy., f 60; #X text 46 129 Here we try out [line~] and [vline~] as triangle wave generators. The subpatch is still sending alternating bangs as in the last patch \, but now at an audible frequency \, every 2 msec.; #X text 47 195 The effect of [line~] rounding breakpoints to the nearest block (on the order of a millisecond) is that each 4-ms-long cycle has a different shape. Using [vline~] resolves the problem.; diff --git a/doc/3.audio.examples/C05.sampler.oneshot.pd b/doc/3.audio.examples/C05.sampler.oneshot.pd index 6c3e09b6..21f6b472 100644 --- a/doc/3.audio.examples/C05.sampler.oneshot.pd +++ b/doc/3.audio.examples/C05.sampler.oneshot.pd @@ -30,7 +30,6 @@ #X obj 405 119 tabread4~ tab28; #X msg 149 178 \; phase 1 \, 4.41e+08 1e+07 \; cutoff 1; #X msg 662 116 0 \, 1 5; -#X text 670 595 updated for Pd version 0.37; #X text 651 532 My apologies to Jonathan Harvey whose bell this is., f 26; #X text 132 236 set the upper line~ to start at the first sample and go forever (until the next trigger), f 31; #X text 54 140 cut the sound off, f 9; @@ -61,8 +60,8 @@ #X connect 23 0 18 0; #X connect 24 0 7 0; #X connect 26 0 12 0; -#X connect 35 0 11 0; -#X connect 35 0 10 0; -#X connect 36 0 15 0; -#X connect 36 0 26 0; -#X connect 36 0 22 0; +#X connect 34 0 11 0; +#X connect 34 0 10 0; +#X connect 35 0 15 0; +#X connect 35 0 26 0; +#X connect 35 0 22 0; diff --git a/doc/3.audio.examples/C06.signal.to.control.pd b/doc/3.audio.examples/C06.signal.to.control.pd index 744c8ccf..2cb0255a 100644 --- a/doc/3.audio.examples/C06.signal.to.control.pd +++ b/doc/3.audio.examples/C06.signal.to.control.pd @@ -3,7 +3,6 @@ #X obj 151 237 phasor~ 1; #X floatatom 126 298 10 0 0 0 - - - 16; #X text 25 18 CONVERTING SIGNALS TO CONTROLS; -#X text 276 299 Updated for Pd version 0.37; #X obj 126 201 metro 100; #X obj 126 168 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1; #X text 31 51 The [snapshot~] object allows you to convert from signals to control streams (float messages) -- an opposite of [sig~]. The value output is always the end of the most recently computed audio block \, so that even if you bang it metronomically (as here) it need not give you samples that are exactly evenly spaced., f 62; @@ -12,6 +11,6 @@ #X msg 280 202 \; pd dsp \$1; #X connect 0 0 2 0; #X connect 1 0 0 0; -#X connect 5 0 0 0; -#X connect 6 0 5 0; -#X connect 8 0 10 0; +#X connect 4 0 0 0; +#X connect 5 0 4 0; +#X connect 7 0 9 0; diff --git a/doc/3.audio.examples/C07.envelope.follower.pd b/doc/3.audio.examples/C07.envelope.follower.pd index e890b930..af3324bf 100644 --- a/doc/3.audio.examples/C07.envelope.follower.pd +++ b/doc/3.audio.examples/C07.envelope.follower.pd @@ -34,7 +34,6 @@ #X text 699 228 route the RMS value according to state; #X text 672 127 ATTACK DETECTION; #X text 579 350 REST DETECTION; -#X text 95 569 updated for Pd version 0.37; #X obj 511 78 *~; #X text 385 111 note 3.01 dB difference between peak and RMS amplitudes., f 16; #X text 639 462 regardless of state \, when RMS isn't low reset the timer, f 29; @@ -51,14 +50,14 @@ #X msg 156 146 \; pd dsp \$1; #X text 49 221 The [env~] object reports the RMS signal level over the last 512 samples (by default) or any other power of 2 that's at least twice the block size. The analysis is done in an overlapped fashion so that results appear every N/2 points if N is the analysis window size. So the larger the window \, the stabler the result and the less frequently it appears. Computation time doesn't depend heavily on N., f 59; #X text 48 408 Both detectors are state machines with two states \, "on" and "off". If on \, a test is run to determine whether to turn off \, and vice versa. The tests are run at each output of the [env~] object., f 56; -#X connect 2 0 36 1; -#X connect 3 0 36 0; +#X connect 2 0 35 1; +#X connect 3 0 35 0; #X connect 4 0 5 0; #X connect 4 0 7 0; #X connect 5 0 18 0; #X connect 6 0 2 0; #X connect 7 0 8 0; -#X connect 7 1 45 1; +#X connect 7 1 44 1; #X connect 8 0 17 0; #X connect 9 0 10 0; #X connect 9 1 11 0; @@ -69,7 +68,7 @@ #X connect 13 0 15 0; #X connect 14 0 8 0; #X connect 15 0 8 0; -#X connect 17 0 45 0; +#X connect 17 0 44 0; #X connect 18 0 19 0; #X connect 18 1 25 0; #X connect 19 0 24 0; @@ -78,16 +77,16 @@ #X connect 21 0 26 1; #X connect 22 0 19 0; #X connect 23 0 19 0; -#X connect 24 0 46 0; +#X connect 24 0 45 0; #X connect 25 0 27 0; -#X connect 25 0 46 1; +#X connect 25 0 45 1; #X connect 26 0 31 0; #X connect 27 0 26 0; #X connect 28 0 23 0; #X connect 29 0 22 0; #X connect 29 0 30 0; #X connect 31 0 29 0; -#X connect 36 0 4 0; -#X connect 45 0 9 0; -#X connect 46 0 20 0; -#X connect 47 0 49 0; +#X connect 35 0 4 0; +#X connect 44 0 9 0; +#X connect 45 0 20 0; +#X connect 46 0 48 0; diff --git a/doc/3.audio.examples/C08.analog.sequencer.pd b/doc/3.audio.examples/C08.analog.sequencer.pd index 3d5066ad..0cec4cd4 100644 --- a/doc/3.audio.examples/C08.analog.sequencer.pd +++ b/doc/3.audio.examples/C08.analog.sequencer.pd @@ -17,7 +17,6 @@ #A 0 1 0.989177 0.95694 0.903989 0.83147 0.740951 0.634393 0.514103 0.382683 0.24298 0.0980171 -0.0490677 -0.19509 -0.33689 -0.471397 -0.595699 -0.707107 -0.803208 -0.881921 -0.941544 -0.980785 -0.998795 -0.995185 -0.970031 -0.92388 -0.857729 -0.77301 -0.671559 -0.55557 -0.427555 -0.290285 -0.14673 -1.83697e-16 0.14673 0.290285 0.427555 0.55557 0.671559 0.77301 0.857729 0.92388 0.970031 0.995185 0.998795 0.980785 0.941544 0.881921 0.803208 0.707107 0.595699 0.471397 0.33689 0.19509 0.0490677 -0.0980171 -0.24298 -0.382683 -0.514103 -0.634393 -0.740951 -0.83147 -0.903989 -0.95694 -0.989177 -1 -0.989177 -0.95694 -0.903989 -0.83147 -0.740951 -0.634393 -0.514103 -0.382683 -0.24298 -0.0980171 0.0490677 0.19509 0.33689 0.471397 0.595699 0.707107 0.803208 0.881921 0.941544 0.980785 0.998795 0.995185 0.970031 0.92388 0.857729 0.77301 0.671559 0.55557 0.427555 0.290285 0.14673 5.51091e-16 -0.14673 -0.290285 -0.427555 -0.55557 -0.671559 -0.77301 -0.857729 -0.92388 -0.970031 -0.995185 -0.998795 -0.980785 -0.941544 -0.881921 -0.803208 -0.707107 -0.595699 -0.471397 -0.33689 -0.19509 -0.0490677 0.0980171 0.24298 0.382683 0.514103 0.634393 0.740951 0.83147 0.903989 0.95694 0.989177 1 0.989177 0.95694 0.903989 0.83147 0.740951 0.634393 0.514103 0.382683 0.24298 0.0980171 -0.0490677 -0.19509 -0.33689 -0.471397 -0.595699 -0.707107 -0.803208 -0.881921 -0.941544 -0.980785 -0.998795 -0.995185 -0.970031 -0.92388 -0.857729 -0.77301 -0.671559 -0.55557 -0.427555 -0.290285 -0.14673 -2.69484e-15 0.14673 0.290285 0.427555 0.55557 0.671559 0.77301 0.857729 0.92388 0.970031 0.995185 0.998795 0.980785 0.941544 0.881921 0.803208 0.707107 0.595699 0.471397 0.33689 0.19509 0.0490677 -0.0980171 -0.24298 -0.382683 -0.514103 -0.634393 -0.740951 -0.83147 -0.903989 -0.95694 -0.989177 -1 -0.989177 -0.95694 -0.903989 -0.83147 -0.740951 -0.634393 -0.514103 -0.382683 -0.24298 -0.0980171 0.0490677 0.19509 0.33689 0.471397 0.595699 0.707107 0.803208 0.881921 0.941544 0.980785 0.998795 0.995185 0.970031 0.92388 0.857729 0.77301 0.671559 0.55557 0.427555 0.290285 0.14673 -4.90478e-16 -0.14673 -0.290285 -0.427555 -0.55557 -0.671559 -0.77301 -0.857729 -0.92388 -0.970031 -0.995185 -0.998795 -0.980785 -0.941544 -0.881921 -0.803208 -0.707107 -0.595699 -0.471397 -0.33689 -0.19509 -0.0490677 0.0980171 0.24298 0.382683 0.514103 0.634393 0.740951 0.83147 0.903989 0.95694 0.989177 1 0.989177 0.95694; #X coords 0 1 258 -1 200 100 1; #X restore 533 316 graph; -#X text 542 566 updated for Pd version 0.37; #X obj 72 257 tabread~ 29-sequence; #X obj 131 289 wrap~; #X obj 131 312 *~ 100; @@ -79,21 +78,21 @@ #X text 187 312 adjust for reading envelope sample; #X text 49 41 Some control operations can be carried out entirely by tilde objects passing audio signals around. Here is an imitation of an analog sequencer and envelope generator. A [phasor~] loops through the "sequence" table at 0.6 Hz \, generating 9 frequencies. Simultaneously \, by multiplying by 9 and wrapping \, we create a sawtooth at 9 * 0.6 = 5.4 Hz \, which reads a second table for an envelope shape. This becomes the grain size for a sampler based on the B08.sampler.loop example earlier., f 57; #X connect 1 0 2 0; -#X connect 2 0 14 0; -#X connect 6 0 10 0; +#X connect 2 0 13 0; +#X connect 5 0 9 0; +#X connect 6 0 7 0; #X connect 7 0 8 0; -#X connect 8 0 9 0; -#X connect 9 0 16 0; +#X connect 8 0 15 0; +#X connect 9 0 10 0; +#X connect 10 0 12 0; #X connect 10 0 11 0; -#X connect 11 0 13 0; -#X connect 11 0 12 0; -#X connect 12 0 19 0; -#X connect 13 0 17 0; -#X connect 15 0 1 1; -#X connect 16 0 13 1; -#X connect 17 0 18 0; -#X connect 18 0 15 0; -#X connect 19 0 1 0; -#X connect 20 0 6 0; -#X connect 20 0 7 0; -#X connect 23 0 20 0; +#X connect 11 0 18 0; +#X connect 12 0 16 0; +#X connect 14 0 1 1; +#X connect 15 0 12 1; +#X connect 16 0 17 0; +#X connect 17 0 14 0; +#X connect 18 0 1 0; +#X connect 19 0 5 0; +#X connect 19 0 6 0; +#X connect 22 0 19 0; diff --git a/doc/3.audio.examples/C09.sample.hold.pd b/doc/3.audio.examples/C09.sample.hold.pd index 35ba6f70..0d02829c 100644 --- a/doc/3.audio.examples/C09.sample.hold.pd +++ b/doc/3.audio.examples/C09.sample.hold.pd @@ -21,7 +21,6 @@ #X msg 103 173 2 11; #X msg 179 173 3.7 8.8; #X msg 244 173 3.4 8.9; -#X text 574 494 updated for Pd version 0.37; #X obj 144 471 output~; #X text 356 280 <= reset phase; #X obj 651 24 declare -stdpath ./; @@ -37,17 +36,17 @@ #X connect 5 0 3 0; #X connect 6 0 2 0; #X connect 8 0 9 0; -#X connect 9 0 25 0; -#X connect 10 0 19 0; +#X connect 9 0 24 0; +#X connect 10 0 18 0; #X connect 11 0 2 1; #X connect 11 0 3 1; -#X connect 12 0 22 0; -#X connect 13 0 22 0; -#X connect 14 0 22 0; -#X connect 15 0 22 0; -#X connect 16 0 22 0; -#X connect 17 0 22 0; -#X connect 22 0 5 0; -#X connect 22 1 6 0; -#X connect 23 0 7 0; -#X connect 25 0 10 0; +#X connect 12 0 21 0; +#X connect 13 0 21 0; +#X connect 14 0 21 0; +#X connect 15 0 21 0; +#X connect 16 0 21 0; +#X connect 17 0 21 0; +#X connect 21 0 5 0; +#X connect 21 1 6 0; +#X connect 22 0 7 0; +#X connect 24 0 10 0; diff --git a/doc/3.audio.examples/C10.monophonic.synth.pd b/doc/3.audio.examples/C10.monophonic.synth.pd index b16ee02f..743b6fb2 100644 --- a/doc/3.audio.examples/C10.monophonic.synth.pd +++ b/doc/3.audio.examples/C10.monophonic.synth.pd @@ -24,7 +24,6 @@ #X text 71 241 The synthesis technique is the same as in the previous patch \, done in a simpler (but less general) way with a [cos~] object replacing the wavetable lookup., f 58; #X obj 105 424 poly 1 1; #X text 208 443 velocity; -#X text 304 751 updated for Pd version 0.55; #X msg 153 322 55 64; #X msg 246 322 55 0; #X msg 105 322 48 64; @@ -56,9 +55,9 @@ #X connect 18 0 11 1; #X connect 22 1 0 0; #X connect 22 2 16 0; -#X connect 25 0 30 0; -#X connect 26 0 30 0; -#X connect 27 0 30 0; -#X connect 28 0 30 0; -#X connect 29 0 30 0; -#X connect 30 0 22 0; +#X connect 24 0 29 0; +#X connect 25 0 29 0; +#X connect 26 0 29 0; +#X connect 27 0 29 0; +#X connect 28 0 29 0; +#X connect 29 0 22 0; diff --git a/doc/3.audio.examples/D01.envelope.gen.pd b/doc/3.audio.examples/D01.envelope.gen.pd index 257c907b..59dde186 100644 --- a/doc/3.audio.examples/D01.envelope.gen.pd +++ b/doc/3.audio.examples/D01.envelope.gen.pd @@ -12,7 +12,6 @@ #X obj 86 433 -~ 0.5; #X msg 123 355 10 200; #X obj 171 586 output~; -#X text 319 603 updated for Pd version 0.37; #X obj 171 498 +~ 0.5; #X obj 171 552 hip~ 5; #X msg 198 330 stop; @@ -26,16 +25,16 @@ #X connect 2 0 6 1; #X connect 3 0 2 0; #X connect 5 0 9 0; -#X connect 6 0 13 0; -#X connect 7 0 14 0; +#X connect 6 0 12 0; +#X connect 7 0 13 0; #X connect 8 0 2 0; #X connect 9 0 6 0; #X connect 10 0 2 0; -#X connect 13 0 7 0; -#X connect 14 0 11 0; -#X connect 15 0 20 0; -#X connect 18 0 10 0; -#X connect 18 0 20 0; -#X connect 19 0 3 0; -#X connect 19 0 15 0; -#X connect 20 0 8 0; +#X connect 12 0 7 0; +#X connect 13 0 11 0; +#X connect 14 0 19 0; +#X connect 17 0 10 0; +#X connect 17 0 19 0; +#X connect 18 0 3 0; +#X connect 18 0 14 0; +#X connect 19 0 8 0; diff --git a/doc/3.audio.examples/D02.adsr.pd b/doc/3.audio.examples/D02.adsr.pd index 3623d891..fda98230 100644 --- a/doc/3.audio.examples/D02.adsr.pd +++ b/doc/3.audio.examples/D02.adsr.pd @@ -1,4 +1,4 @@ -#N canvas 616 48 533 748 12; +#N canvas 616 48 533 728 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array adsr-output 44100 float 0; @@ -13,7 +13,6 @@ #X msg 297 194 \; trigger 0; #X text 463 424 1; #X text 151 19 ENVELOPE GENERATOR ABSTRACTION; -#X text 296 696 updated for Pd version 0.37; #X obj 45 147 osc~ 440; #X obj 45 393 *~; #X obj 45 428 output~; @@ -28,13 +27,13 @@ #X obj 297 169 del 750; #X obj 63 261 adsr 1 100 200 50 250; #X text 461 549 0; -#X connect 2 0 21 0; +#X connect 2 0 20 0; #X connect 4 0 3 0; +#X connect 10 0 11 0; #X connect 11 0 12 0; -#X connect 12 0 13 0; -#X connect 15 0 5 0; -#X connect 15 0 22 0; -#X connect 21 0 23 0; -#X connect 22 0 7 0; -#X connect 23 0 3 0; -#X connect 23 0 12 1; +#X connect 14 0 5 0; +#X connect 14 0 21 0; +#X connect 20 0 22 0; +#X connect 21 0 7 0; +#X connect 22 0 3 0; +#X connect 22 0 11 1; diff --git a/doc/3.audio.examples/D03.envelope.dB.pd b/doc/3.audio.examples/D03.envelope.dB.pd index 597a6cf7..03c3566f 100644 --- a/doc/3.audio.examples/D03.envelope.dB.pd +++ b/doc/3.audio.examples/D03.envelope.dB.pd @@ -1,4 +1,4 @@ -#N canvas 542 38 581 742 12; +#N canvas 542 38 578 742 12; #X declare -stdpath ./; #X obj 114 121 r trigger; #X text 124 16 USING ADSR'S OUTPUT AS dB; @@ -61,16 +61,15 @@ #X text 82 437 The table is indexed from 1 to 120 so that 1 gives a true zero out and 120 gives 10 (a 20 dB boost.) The extra 20 dB are for headroom.; #X text 80 606 Notice how the attack sounds different when you retrigger than when you start from zero. This is because if you go from the steady state you only rise 30 dB instead of 100 \, so it sounds slower... a slur effect. If you don't want this \, you might try increasing the amplitude of retriggered notes in comparison to isolated ones.; #X obj 96 266 output~; -#X text 331 707 updated for Pd version 0.37; #X obj 96 344 declare -stdpath ./; #X text 76 47 For more natural sounding amplitude control \, you can use the ADSR's output as log amplitude. Technically \, this is more efficient if done using a lookup table.; #X text 78 487 There's also a "real" [dbtorms~] object that you can just use instead if CPU cost is not a concern and the next example will use that instead \, but for didatical reasons it's shown how to implement a lookup table instead in cases where you might be really concerned (as running Pd in a microcontroller) since [dbtorms~] it's almost certainly much more compute-intensive than ptabread4~] \, since it has to call a library "exp" function.); #X obj 114 147 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; #X text 324 110 attack:; #X text 414 110 release:; -#X connect 0 0 21 0; +#X connect 0 0 20 0; #X connect 2 0 11 1; #X connect 6 0 11 0; #X connect 11 0 16 0; #X connect 13 0 2 0; -#X connect 21 0 13 0; +#X connect 20 0 13 0; diff --git a/doc/3.audio.examples/D04.envelope.quartic.pd b/doc/3.audio.examples/D04.envelope.quartic.pd index ef7afd43..b8cd2404 100644 --- a/doc/3.audio.examples/D04.envelope.quartic.pd +++ b/doc/3.audio.examples/D04.envelope.quartic.pd @@ -1,4 +1,4 @@ -#N canvas 520 54 686 677 12; +#N canvas 520 54 686 666 12; #X declare -stdpath ./; #X obj 55 377 osc~; #X obj 55 407 *~; @@ -29,7 +29,6 @@ #X text 202 268 QUARTIC; #X obj 55 446 output~; #X obj 250 578 output~; -#X text 452 603 updated for Pd version 0.37; #X text 75 61 This patch has two sine wave oscillators \, one with linear envelopes \, the other with quartic ones which sound more uniform. The message boxes sweep the amplitude and frequency up and down. You can compare the two to see that quartic-shaped changes sound more uniform than linear ones., f 68; #X obj 55 574 declare -stdpath ./; #X text 75 141 In the quartic example \, for both the amplitude and the frequency \, we have to take the fourth root of the target value (which we get by taking square root twice.) Then we raise the [line~] output to the fourth power by squaring twice (the [*~] objects \, whose left and right inlets are the same.) The cost is mostly that of the four additional [*~] objects., f 68; diff --git a/doc/3.audio.examples/D05.envelope.pitch.pd b/doc/3.audio.examples/D05.envelope.pitch.pd index 9254c4f9..5f0b6f1e 100644 --- a/doc/3.audio.examples/D05.envelope.pitch.pd +++ b/doc/3.audio.examples/D05.envelope.pitch.pd @@ -1,4 +1,4 @@ -#N canvas 529 38 616 742 12; +#N canvas 529 38 615 718 12; #X declare -stdpath ./; #X obj 68 397 *~; #X text 90 19 PITCH ENVELOPES; @@ -8,7 +8,6 @@ #X text 62 515 This is an extreme use of pitch enveloping. In a real situation you might want an envelope controlling vibrato depth or the like instead of straight pitch., f 69; #X obj 68 319 adsr 100 50 200 90 1000; #X obj 260 319 adsr 20 200 100 100 1000; -#X text 392 694 updated for Pd version 0.37; #X obj 68 438 output~; #X obj 263 466 declare -stdpath ./; #X text 130 176 <-- attack; @@ -71,16 +70,16 @@ #X msg 224 159 \; trigger 1 \; trigger2 -1; #X msg 427 159 \; trigger 0 \; trigger2 0; #X text 321 162 <-- attack restarting pitch env, f 10; -#X connect 0 0 9 0; +#X connect 0 0 8 0; #X connect 2 0 3 0; #X connect 3 0 0 1; #X connect 4 0 2 0; -#X connect 6 0 15 0; +#X connect 6 0 14 0; #X connect 7 0 4 0; -#X connect 15 0 0 0; -#X connect 18 0 6 0; -#X connect 19 0 7 0; +#X connect 14 0 0 0; +#X connect 17 0 6 0; +#X connect 18 0 7 0; +#X connect 19 0 21 0; #X connect 20 0 22 0; -#X connect 21 0 23 0; +#X connect 21 0 17 0; #X connect 22 0 18 0; -#X connect 23 0 19 0; diff --git a/doc/3.audio.examples/D06.envelope.portamento.pd b/doc/3.audio.examples/D06.envelope.portamento.pd index 4b7a64d7..132626af 100644 --- a/doc/3.audio.examples/D06.envelope.portamento.pd +++ b/doc/3.audio.examples/D06.envelope.portamento.pd @@ -16,7 +16,6 @@ #X msg 400 175 96, f 2; #X floatatom 117 111 4 0 0 0 - - - 0; #X floatatom 319 214 6 0 0 0 - - - 0; -#X text 334 302 updated for Pd version 0.35; #X obj 291 149 loadbang; #X obj 50 274 output~; #X obj 407 97 declare -stdpath ./; @@ -25,9 +24,9 @@ #X obj 50 203 mtof~; #X text 44 49 Portamento can be done using just [line~] \, but you still might want to sweep in pitch \, not frequency:; #X text 429 175 <-- set pitch; -#X connect 0 0 18 0; -#X connect 2 0 22 0; -#X connect 3 0 20 0; +#X connect 0 0 17 0; +#X connect 2 0 21 0; +#X connect 3 0 19 0; #X connect 4 0 15 0; #X connect 5 0 15 0; #X connect 6 0 15 0; @@ -37,8 +36,8 @@ #X connect 10 0 15 0; #X connect 12 0 15 0; #X connect 13 0 15 0; -#X connect 14 0 20 1; +#X connect 14 0 19 1; #X connect 15 0 11 0; -#X connect 17 0 7 0; -#X connect 20 0 2 0; -#X connect 22 0 0 0; +#X connect 16 0 7 0; +#X connect 19 0 2 0; +#X connect 21 0 0 0; diff --git a/doc/3.audio.examples/D07.additive.pd b/doc/3.audio.examples/D07.additive.pd index 3a61355e..b89f504d 100644 --- a/doc/3.audio.examples/D07.additive.pd +++ b/doc/3.audio.examples/D07.additive.pd @@ -7,7 +7,6 @@ #X obj 188 463 output~; #X obj 109 262 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 21 480 declare -stdpath ./; -#X text 377 475 updated for Pd version 0.52; #X msg 109 294 all bang; #X obj 188 418 clone 11 partial; #X msg 242 386 all \$1; @@ -23,14 +22,14 @@ #X text 27 41 This patch demonstrates using an abstraction \, [partial] \, to make a simple additive synthesis instrument originally from Jean-Claude Risset., f 78; #X text 27 81 We use [clone] to create 11 copies of the abstraction and send list messages from a [text] object whose arguments are: instance number \, amplitude \, relative duration \, relative frequency and detuning frequency - click [text define] to see this. The usage of [text] is merely cosmetical as it's less polluted than using many messages in a message box. All the messages in [text define] are "dumped" with [text sequence]. You set absolute duration and pitch using the number box controls below. Click the bang to make sound., f 78; #X text 437 262 click to open:; -#X connect 0 0 11 0; -#X connect 1 0 10 0; -#X connect 5 0 8 0; -#X connect 8 0 9 0; -#X connect 9 0 4 0; -#X connect 10 0 9 1; -#X connect 11 0 9 2; -#X connect 13 0 9 0; -#X connect 14 0 13 0; -#X connect 16 0 14 0; -#X connect 16 0 17 0; +#X connect 0 0 10 0; +#X connect 1 0 9 0; +#X connect 5 0 7 0; +#X connect 7 0 8 0; +#X connect 8 0 4 0; +#X connect 9 0 8 1; +#X connect 10 0 8 2; +#X connect 12 0 8 0; +#X connect 13 0 12 0; +#X connect 15 0 13 0; +#X connect 15 0 16 0; diff --git a/doc/3.audio.examples/D08.table.spectrum.pd b/doc/3.audio.examples/D08.table.spectrum.pd index 6baad465..6c522c6f 100644 --- a/doc/3.audio.examples/D08.table.spectrum.pd +++ b/doc/3.audio.examples/D08.table.spectrum.pd @@ -26,7 +26,6 @@ #X text 205 437 And here we send bangs to "poll-table" needed by the abstraction., f 23; #X text 54 290 The [clone] object carries the bank of oscillators \, which is 30 copies of the [spectrum-partial] abstraction - click to open and see it:, f 39; #X obj 67 390 clone -s 1 spectrum-partial 30; -#X text 514 464 Updated for Pd version 0.52; #X text 144 126 <-- pitch; #X text 148 196 <-- left or right shift (normally 0), f 19; #X text 598 402 <-- make the number labels, f 14; diff --git a/doc/3.audio.examples/D09.shepard.tone.pd b/doc/3.audio.examples/D09.shepard.tone.pd index 5c2469be..5865017d 100644 --- a/doc/3.audio.examples/D09.shepard.tone.pd +++ b/doc/3.audio.examples/D09.shepard.tone.pd @@ -32,7 +32,6 @@ #X obj 324 386 clone 20 shepvoice; #X text 26 53 This patch has a bank of 20 sinusoids (the [shepvoice] abstraction with 20 copies in [clone]) \, arranged so that their frequencies sweep upward or downward in parallel \, and their amplitudes fade in and out so that each one is quiet when it wraps around from one end to the other. The overall "phase" computed here is added to each voice's relative phase (its creation argument). The "incr" parameter controls how fast the phase changes \, "dropoff" the slope at which the amplitudes fall off at the ends \, "pitch" the center pitch of the cluster \, "interval" the number of (tenths of halftones) between successive voices \, and "rev" and "revtime" the reverberator at bottom., f 71; #X msg 322 238 \; dropoff 10 \; pitch 60 \; interval 120 \; metro 1 \; rev 84 \; revtime 87 \; incr -2; -#X text 348 607 updated for Pd version 0.52; #X connect 0 0 12 0; #X connect 1 0 9 0; #X connect 3 0 23 1; diff --git a/doc/3.audio.examples/D10.sampler.notes.pd b/doc/3.audio.examples/D10.sampler.notes.pd index 04cb5c06..2fcb1f28 100644 --- a/doc/3.audio.examples/D10.sampler.notes.pd +++ b/doc/3.audio.examples/D10.sampler.notes.pd @@ -184,7 +184,6 @@ #X obj 372 25 r note; #X listbox 372 54 23 0 0 0 - - - 0; #X text 289 693 microtones OK too; -#X text 587 711 updated for Pd version 0.52; #X connect 0 0 26 0; #X connect 3 0 2 0; #X connect 4 0 2 0; diff --git a/doc/3.audio.examples/D11.sampler.poly.pd b/doc/3.audio.examples/D11.sampler.poly.pd index c9fd5981..067ade36 100644 --- a/doc/3.audio.examples/D11.sampler.poly.pd +++ b/doc/3.audio.examples/D11.sampler.poly.pd @@ -93,7 +93,6 @@ #X obj 561 47 unpack f f f f f f f; #X obj 547 296 clone -s 1 sampvoice 8; #X text 18 410 The [poly] object essentially repeats pitch and velocity pairs to its output \, but also sending a voice number from its left outlet. To use it \, we unpack the 7 parameters \, calculate the voice number \, repack the message as 8 parameters with voice number first \, and [clone] routes to internal instances of the abstraction., f 61; -#X text 762 602 updated for Pd version 0.52; #X msg 691 413 read qlist-sampler.txt \, rewind \, tempo 1 \, bang, f 23; #X obj 568 447 print comment; #X msg 495 546 line 0 \, auto; @@ -120,7 +119,7 @@ #X connect 16 0 17 0; #X connect 16 2 17 1; #X connect 17 0 32 0; -#X connect 22 0 38 0; +#X connect 22 0 37 0; #X connect 26 0 25 0; #X connect 27 0 25 0; #X connect 28 0 25 0; @@ -136,5 +135,5 @@ #X connect 33 5 32 6; #X connect 33 6 32 7; #X connect 34 0 23 0; -#X connect 37 0 21 0; -#X connect 39 0 42 0; +#X connect 36 0 21 0; +#X connect 38 0 41 0; diff --git a/doc/3.audio.examples/D12.sampler.bis.pd b/doc/3.audio.examples/D12.sampler.bis.pd index 568cc03a..d4b1fe5a 100644 --- a/doc/3.audio.examples/D12.sampler.bis.pd +++ b/doc/3.audio.examples/D12.sampler.bis.pd @@ -109,7 +109,6 @@ #X obj 611 296 clone -s 1 sampvoice2 8; #X msg 542 217 \$1 0; #X msg 588 218 \$2; -#X text 822 606 updated for Pd version 0.52; #X msg 93 513 \; onoff 1 90 60 5 0 0 100; #X msg 94 555 \; onoff 2 90 48 5 0 0 100; #X msg 224 608 \; note 51 90 1000 5 0 0 100; diff --git a/doc/3.audio.examples/D13.additive.qlist.pd b/doc/3.audio.examples/D13.additive.qlist.pd index db1ea1d7..7cef7d66 100644 --- a/doc/3.audio.examples/D13.additive.qlist.pd +++ b/doc/3.audio.examples/D13.additive.qlist.pd @@ -14,7 +14,6 @@ #X obj 49 227 output~; #X obj 489 21 declare -stdpath ./; #X obj 49 178 clone -s 1 osc-voice 8; -#X text 415 565 updated for Pd version 0.52; #X text 436 490 click to open:; #X obj 421 516 text define -k additive; #A set # This is the contents of a [text] object for the D13.additive.qlist patch \, which demonstrates an oscillator bank. \; # comments start with a "#" which must be followed by a space. The comment is terminated by a semicolon \; # first an arpeggio. You can group them in lines as you please. The 100s at the beginnings of lines are delay times. \; pit1 89 \; amp1 80 \; 100 pit2 72 \; amp2 80 \; 100 pit3 57 \; amp3 90 \; 100 pit4 84 \; amp4 78 \; 100 pit5 74 \; amp5 74 \; 100 pit6 73 \; amp6 74 \; 100 pit7 100 \; amp7 78 \; 100 pit8 37 \; amp8 95 \; # after a 600-msec rest \, gliss four of the oscillators to new frequencies. \; 600 pit1 70 1000 \; 300 pit8 40 1000 \; 300 pit4 89 1000 \; 300 pit7 95 1000 \; # a second later \, turn them off with decay time 1500 \; 1000 amp1 0 1500 \; amp2 0 1500 \; amp3 0 1500 \; amp4 0 1500 \; amp5 0 1500 \; amp6 0 1500 \; amp7 0 1500 \; amp8 0 1500 \; # and re-attack them.. \; 1000 amp1 85 5 \; amp2 85 5 \; amp3 85 5 \; amp4 90 5 \; amp5 85 5 \; amp6 85 5 \; amp7 90 5 \; amp8 85 5 \; # this time \, try varying decay times. \; 10 amp1 0 2000 \; amp2 0 2000 \; amp3 0 2000 \; amp4 0 500 \; amp5 0 1000 \; amp6 0 1000 \; amp7 0 500 \; amp8 0 4000 \;; @@ -41,13 +40,13 @@ #X connect 5 0 0 0; #X connect 6 0 0 0; #X connect 7 0 0 0; -#X connect 10 0 18 0; +#X connect 10 0 17 0; #X connect 13 0 11 0; -#X connect 19 0 29 0; -#X connect 20 0 17 0; -#X connect 21 0 17 0; -#X connect 25 0 0 0; -#X connect 26 0 17 0; -#X connect 28 0 29 0; -#X connect 29 0 17 0; -#X connect 30 0 17 0; +#X connect 18 0 28 0; +#X connect 19 0 16 0; +#X connect 20 0 16 0; +#X connect 24 0 0 0; +#X connect 25 0 16 0; +#X connect 27 0 28 0; +#X connect 28 0 16 0; +#X connect 29 0 16 0; diff --git a/doc/3.audio.examples/D14.vibrato.pd b/doc/3.audio.examples/D14.vibrato.pd index 58b22380..eb33184d 100644 --- a/doc/3.audio.examples/D14.vibrato.pd +++ b/doc/3.audio.examples/D14.vibrato.pd @@ -47,7 +47,6 @@ #X obj 55 592 output~; #X text 75 14 USING ADSRS FOR PORTAMENTO AND ADDING VIBRATO TOO; #X text 25 56 Portamento can be treated as a special case of an ADSR envelope \, with 100 percent sustain. Vibrato is properly computed in units of pitch \, but it's also possible to do the job without having to convert from pitch to frequency units at the audio rate. To do this we just raise the "pitch" to the fourth power \, so that it acts pseudo-exponentially. Rather than add vibrato to the ADSR output \, we multiply a signal which controls relative frequency. The relative frequency change is one plus an oscillator., f 94; -#X text 479 632 updated for Pd version 0.39; #X text 25 152 The table below holds 6 cycles of vibrato with small variations to get a not-exactly-repeating vibrato. We thus have to divide vibrato frequency by six. You can just use a sine or triangle wave if you prefer., f 94; #X obj 238 622 declare -stdpath ./; #X text 576 414 <-- middle C; diff --git a/doc/3.audio.examples/E01.spectrum.pd b/doc/3.audio.examples/E01.spectrum.pd index d64db91f..e11f7489 100644 --- a/doc/3.audio.examples/E01.spectrum.pd +++ b/doc/3.audio.examples/E01.spectrum.pd @@ -1,4 +1,4 @@ -#N canvas 372 54 733 807 12; +#N canvas 372 54 733 774 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array E01-signal 882 float 0; @@ -58,7 +58,6 @@ #X obj 191 268 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 119 372 output~; #X obj 191 303 tabwrite~ E01-signal; -#X text 506 763 updated for Pd version 0.37; #X text 458 423 1; #X text 504 423 2; #X text 549 423 3; @@ -113,36 +112,36 @@ #X connect 1 0 6 0; #X connect 5 0 3 1; #X connect 5 0 7 0; -#X connect 16 0 49 0; -#X connect 16 0 50 0; -#X connect 16 0 51 0; -#X connect 16 0 52 0; -#X connect 16 0 53 0; -#X connect 16 0 54 0; -#X connect 17 0 18 0; -#X connect 18 0 34 0; -#X connect 19 0 20 0; -#X connect 20 0 34 0; -#X connect 21 0 22 0; -#X connect 22 0 34 0; -#X connect 23 0 24 0; -#X connect 24 0 34 0; -#X connect 25 0 26 0; -#X connect 26 0 34 0; -#X connect 27 0 28 0; -#X connect 28 0 34 0; -#X connect 34 0 3 0; -#X connect 34 0 1 0; -#X connect 34 0 7 0; -#X connect 40 0 18 1; -#X connect 41 0 20 1; -#X connect 42 0 22 1; -#X connect 43 0 24 1; -#X connect 44 0 26 1; -#X connect 45 0 28 1; -#X connect 49 0 17 0; -#X connect 50 0 19 0; -#X connect 51 0 21 0; -#X connect 52 0 23 0; -#X connect 53 0 25 0; -#X connect 54 0 27 0; +#X connect 15 0 48 0; +#X connect 15 0 49 0; +#X connect 15 0 50 0; +#X connect 15 0 51 0; +#X connect 15 0 52 0; +#X connect 15 0 53 0; +#X connect 16 0 17 0; +#X connect 17 0 33 0; +#X connect 18 0 19 0; +#X connect 19 0 33 0; +#X connect 20 0 21 0; +#X connect 21 0 33 0; +#X connect 22 0 23 0; +#X connect 23 0 33 0; +#X connect 24 0 25 0; +#X connect 25 0 33 0; +#X connect 26 0 27 0; +#X connect 27 0 33 0; +#X connect 33 0 3 0; +#X connect 33 0 1 0; +#X connect 33 0 7 0; +#X connect 39 0 17 1; +#X connect 40 0 19 1; +#X connect 41 0 21 1; +#X connect 42 0 23 1; +#X connect 43 0 25 1; +#X connect 44 0 27 1; +#X connect 48 0 16 0; +#X connect 49 0 18 0; +#X connect 50 0 20 0; +#X connect 51 0 22 0; +#X connect 52 0 24 0; +#X connect 53 0 26 0; diff --git a/doc/3.audio.examples/E02.ring.modulation.pd b/doc/3.audio.examples/E02.ring.modulation.pd index 870a283f..60341ca8 100644 --- a/doc/3.audio.examples/E02.ring.modulation.pd +++ b/doc/3.audio.examples/E02.ring.modulation.pd @@ -1,4 +1,4 @@ -#N canvas 425 38 742 699 12; +#N canvas 425 38 741 685 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array E02-signal 882 float 0; @@ -11,7 +11,6 @@ #X restore 404 291 graph; #X obj 189 349 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 115 411 output~; -#X text 482 668 updated for Pd version 0.37; #X text 435 424 1; #X text 469 424 2; #X text 501 424 3; @@ -57,7 +56,7 @@ #X obj 189 301 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X obj 189 325 metro 500; #X text 63 568 If you choose a multiple of the fundamental as a modulation frequency (16 \, 32 \, 48 \, 64 \, ... "steps") the result is again periodic at the original frequency. If you select a half-integer times the fundamental (8 \, 24 \, 40 \, ... steps) the pitch drops by an octave and you get only odd partials. For most other settings you'll get an inharmonic complex of tones. These are sometimes heard as separate pitches and other times they seem to fuse into a single timbre with indeterminate pitch., f 89; -#N canvas 436 82 601 665 fft 1; +#N canvas 436 82 601 665 fft 0; #X obj 86 90 inlet~; #X obj 162 243 inlet; #X obj 96 121 rfft~; @@ -66,8 +65,6 @@ #X obj 96 184 sqrt~; #X obj 96 210 biquad~ 0 0 0 0 1; #X text 160 122 Fourier series; -#X text 165 175 magnitude; -#X text 163 160 calculate; #X text 64 24 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later.; #X text 150 90 signal to analyze; #X text 235 202 delay two samples; @@ -91,10 +88,11 @@ #X obj 399 138 block~ 4096; #X text 163 592 <-- just out of curiosity \, here's the fundamental pitch; #X text 398 113 Window size; +#X text 163 157 calculate magnitude, f 9; #X connect 0 0 2 0; -#X connect 0 0 29 0; -#X connect 1 0 28 0; -#X connect 1 0 29 0; +#X connect 0 0 27 0; +#X connect 1 0 26 0; +#X connect 1 0 27 0; #X connect 2 0 3 0; #X connect 2 0 3 1; #X connect 2 1 4 0; @@ -102,17 +100,17 @@ #X connect 3 0 5 0; #X connect 4 0 5 0; #X connect 5 0 6 0; -#X connect 6 0 28 0; -#X connect 14 0 17 0; -#X connect 14 0 25 0; +#X connect 6 0 26 0; +#X connect 12 0 15 0; +#X connect 12 0 23 0; +#X connect 13 0 12 0; +#X connect 14 0 18 0; +#X connect 14 0 19 0; #X connect 15 0 14 0; -#X connect 16 0 20 0; -#X connect 16 0 21 0; -#X connect 17 0 16 0; -#X connect 18 0 15 0; -#X connect 21 0 19 0; -#X connect 24 0 27 0; -#X connect 25 0 24 0; +#X connect 16 0 13 0; +#X connect 19 0 17 0; +#X connect 22 0 25 0; +#X connect 23 0 22 0; #X restore 128 337 pd fft; #X obj 569 17 declare -stdpath ./; #X text 212 300 <-- graph repeatedly; @@ -131,42 +129,42 @@ #X text 452 221 ------ 0.02 seconds ------; #X text 63 489 Now we ring modulate the signal by multiplying it by another sinusoid. The modulation frequency is controlled in steps of f/16 where "f" is the fundamental frequency \, giving roughly 11 Hz per step. Note that if the modulation frequency is set to zero we can't predict the overall amplitude because it depends on what phase the modulation oscillator happened to have at that moment., f 89; #X connect 1 0 4 0; -#X connect 3 0 51 1; -#X connect 15 0 29 0; -#X connect 15 0 30 0; -#X connect 15 0 22 0; -#X connect 15 0 31 0; -#X connect 15 0 32 0; -#X connect 15 0 33 0; -#X connect 16 0 17 0; -#X connect 17 0 39 0; -#X connect 18 0 19 0; -#X connect 19 0 39 0; -#X connect 20 0 21 0; -#X connect 21 0 39 0; -#X connect 22 0 20 0; -#X connect 23 0 24 0; -#X connect 24 0 39 0; -#X connect 25 0 26 0; -#X connect 26 0 39 0; -#X connect 27 0 28 0; -#X connect 28 0 39 0; -#X connect 29 0 16 0; -#X connect 30 0 18 0; -#X connect 31 0 23 0; -#X connect 32 0 25 0; -#X connect 33 0 27 0; -#X connect 39 0 1 0; -#X connect 39 0 51 0; -#X connect 41 0 39 1; -#X connect 42 0 43 0; -#X connect 43 0 41 0; -#X connect 44 0 43 1; -#X connect 48 0 49 0; -#X connect 49 0 3 0; -#X connect 57 0 17 1; -#X connect 58 0 19 1; -#X connect 59 0 21 1; -#X connect 60 0 24 1; -#X connect 61 0 26 1; -#X connect 62 0 28 1; +#X connect 3 0 50 1; +#X connect 14 0 28 0; +#X connect 14 0 29 0; +#X connect 14 0 21 0; +#X connect 14 0 30 0; +#X connect 14 0 31 0; +#X connect 14 0 32 0; +#X connect 15 0 16 0; +#X connect 16 0 38 0; +#X connect 17 0 18 0; +#X connect 18 0 38 0; +#X connect 19 0 20 0; +#X connect 20 0 38 0; +#X connect 21 0 19 0; +#X connect 22 0 23 0; +#X connect 23 0 38 0; +#X connect 24 0 25 0; +#X connect 25 0 38 0; +#X connect 26 0 27 0; +#X connect 27 0 38 0; +#X connect 28 0 15 0; +#X connect 29 0 17 0; +#X connect 30 0 22 0; +#X connect 31 0 24 0; +#X connect 32 0 26 0; +#X connect 38 0 1 0; +#X connect 38 0 50 0; +#X connect 40 0 38 1; +#X connect 41 0 42 0; +#X connect 42 0 40 0; +#X connect 43 0 42 1; +#X connect 47 0 48 0; +#X connect 48 0 3 0; +#X connect 56 0 16 1; +#X connect 57 0 18 1; +#X connect 58 0 20 1; +#X connect 59 0 23 1; +#X connect 60 0 25 1; +#X connect 61 0 27 1; diff --git a/doc/3.audio.examples/E03.octave.divider.pd b/doc/3.audio.examples/E03.octave.divider.pd index 1bc92c9c..3ddc50b2 100644 --- a/doc/3.audio.examples/E03.octave.divider.pd +++ b/doc/3.audio.examples/E03.octave.divider.pd @@ -1,4 +1,4 @@ -#N canvas 421 52 731 710 12; +#N canvas 421 52 731 652 12; #X declare -stdpath ./; #X obj 367 224 loadbang; #X obj 53 365 hip~ 5; @@ -56,7 +56,6 @@ #X restore 53 154 pd delay; #X text 173 273 on/off for original; #X obj 502 25 declare -stdpath ./; -#X text 490 655 updated for Pd version 0.51; #X obj 111 127 moses 1; #X obj 111 99 sigmund~ -npts 2048; #X text 255 99 track pitch; @@ -84,16 +83,16 @@ #X connect 11 0 12 0; #X connect 12 0 10 1; #X connect 13 0 12 0; -#X connect 14 0 28 0; +#X connect 14 0 27 0; #X connect 15 0 11 0; #X connect 16 0 18 0; -#X connect 16 0 23 0; +#X connect 16 0 22 0; #X connect 17 0 5 0; #X connect 18 0 8 0; -#X connect 18 0 30 0; -#X connect 22 1 9 0; -#X connect 23 0 22 0; -#X connect 27 0 28 1; -#X connect 28 0 1 0; -#X connect 29 0 30 1; -#X connect 30 0 1 0; +#X connect 18 0 29 0; +#X connect 21 1 9 0; +#X connect 22 0 21 0; +#X connect 26 0 27 1; +#X connect 27 0 1 0; +#X connect 28 0 29 1; +#X connect 29 0 1 0; diff --git a/doc/3.audio.examples/E04.difference.tone.pd b/doc/3.audio.examples/E04.difference.tone.pd index 4f0d607d..dee9c7c4 100644 --- a/doc/3.audio.examples/E04.difference.tone.pd +++ b/doc/3.audio.examples/E04.difference.tone.pd @@ -1,4 +1,4 @@ -#N canvas 487 47 654 545 12; +#N canvas 487 47 651 515 12; #X declare -stdpath ./; #X obj 59 170 +~; #X obj 59 350 output~; @@ -11,7 +11,6 @@ #X obj 77 57 loadbang; #X msg 145 163 50; #X obj 145 139 loadbang; -#X text 389 497 updated for Pd version 0.37; #X obj 59 31 osc~ 300; #X msg 77 80 225; #X obj 77 133 osc~; @@ -25,11 +24,11 @@ #X connect 3 0 7 1; #X connect 4 0 3 0; #X connect 5 0 1 0; -#X connect 6 0 14 0; +#X connect 6 0 13 0; #X connect 7 0 5 0; -#X connect 8 0 13 0; +#X connect 8 0 12 0; #X connect 9 0 4 0; #X connect 10 0 9 0; -#X connect 12 0 0 0; -#X connect 13 0 6 0; -#X connect 14 0 0 1; +#X connect 11 0 0 0; +#X connect 12 0 6 0; +#X connect 13 0 0 1; diff --git a/doc/3.audio.examples/E05.chebychev.pd b/doc/3.audio.examples/E05.chebychev.pd index 79a5d89f..9aaaafef 100644 --- a/doc/3.audio.examples/E05.chebychev.pd +++ b/doc/3.audio.examples/E05.chebychev.pd @@ -1,10 +1,9 @@ -#N canvas 426 112 662 580 12; +#N canvas 426 112 664 542 12; #X declare -stdpath ./; #X obj 34 337 output~; #X obj 52 101 / 100; #X floatatom 52 77 5 0 100 0 - - - 0; #X obj 34 182 *~; -#X text 425 531 updated for Pd version 0.37; #X obj 34 50 osc~ 220; #X obj 52 127 pack 0 50; #X obj 52 154 line~; @@ -181,18 +180,18 @@ #X obj 557 146 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 586 146 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X text 99 77 <-- index in; -#X connect 1 0 6 0; +#X connect 1 0 5 0; #X connect 2 0 1 0; -#X connect 3 0 9 0; -#X connect 5 0 3 0; -#X connect 6 0 7 0; -#X connect 7 0 3 1; +#X connect 3 0 8 0; +#X connect 4 0 3 0; +#X connect 5 0 6 0; +#X connect 6 0 3 1; +#X connect 8 0 18 0; #X connect 9 0 19 0; -#X connect 10 0 20 0; -#X connect 13 0 12 0; -#X connect 19 0 10 0; -#X connect 20 0 0 0; -#X connect 28 0 12 1; -#X connect 29 0 12 2; -#X connect 30 0 12 3; -#X connect 31 0 12 4; +#X connect 12 0 11 0; +#X connect 18 0 9 0; +#X connect 19 0 0 0; +#X connect 27 0 11 1; +#X connect 28 0 11 2; +#X connect 29 0 11 3; +#X connect 30 0 11 4; diff --git a/doc/3.audio.examples/E06.exponential.pd b/doc/3.audio.examples/E06.exponential.pd index 099dfb73..f5c8d151 100644 --- a/doc/3.audio.examples/E06.exponential.pd +++ b/doc/3.audio.examples/E06.exponential.pd @@ -9,7 +9,7 @@ #X array E06-spectrum 128 float 0; #X coords 0 4300 127 -40 257 130 1; #X restore 521 434 graph; -#N canvas 455 72 538 658 fft 1; +#N canvas 455 72 538 658 fft 0; #X obj 62 86 inlet~; #X obj 251 237 inlet; #X obj 72 117 rfft~; @@ -75,7 +75,6 @@ #X text 562 375 ---- 0.02 seconds ----; #X obj 208 258 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 125 326 output~; -#X text 584 645 updated for Pd version 0.37; #X text 552 567 1; #X text 586 567 2; #X text 618 567 3; @@ -153,16 +152,16 @@ #X text 25 549 Table lookup is prepared as follows. First add one to the sinusoid and adjust its amplitude according to index so it ranges from 0 to 2*index. Then adjust for the table's input scale (100 points per unit \, so multiply by 100) and add one to skip the interpolation point at the beginning of the table., f 61; #X connect 1 0 6 0; #X connect 5 0 3 1; -#X connect 18 0 19 0; -#X connect 19 0 33 0; -#X connect 25 0 3 2; -#X connect 31 0 40 0; -#X connect 32 0 31 0; -#X connect 33 0 39 0; -#X connect 34 0 38 0; -#X connect 35 0 36 0; -#X connect 36 0 39 1; -#X connect 38 0 35 0; -#X connect 39 0 32 0; -#X connect 40 0 3 0; -#X connect 40 0 1 0; +#X connect 17 0 18 0; +#X connect 18 0 32 0; +#X connect 24 0 3 2; +#X connect 30 0 39 0; +#X connect 31 0 30 0; +#X connect 32 0 38 0; +#X connect 33 0 37 0; +#X connect 34 0 35 0; +#X connect 35 0 38 1; +#X connect 37 0 34 0; +#X connect 38 0 31 0; +#X connect 39 0 3 0; +#X connect 39 0 1 0; diff --git a/doc/3.audio.examples/E07.evenodd.pd b/doc/3.audio.examples/E07.evenodd.pd index 9cb24722..30298ef9 100644 --- a/doc/3.audio.examples/E07.evenodd.pd +++ b/doc/3.audio.examples/E07.evenodd.pd @@ -29,7 +29,6 @@ #X obj 84 308 *~ 0.01; #X obj 288 96 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X obj 155 561 output~; -#X text 634 653 updated for Pd version 0.37; #X obj 84 275 adsr 70 10 90 50 500, f 24; #X obj 288 265 +; #X floatatom 323 265 5 -48 120 0 - - - 0; @@ -59,33 +58,33 @@ #X obj 288 128 metro 150; #X text 393 324 This patch uses a stepping sequencer to control a waveshaping instrument. A metronome ([metro 150]) drives a counter ([f] \, [+ 1] \, and [mod 11]) which counts repeatedly through the 11 values which are read from the stored table ([tabread E07]). The values may be read in sequence \, by twos or threes \, etc. \, according to the "increment" parameter., f 62; #X connect 0 0 1 0; -#X connect 0 0 39 0; +#X connect 0 0 38 0; #X connect 1 0 2 0; #X connect 2 0 0 1; -#X connect 4 0 48 1; -#X connect 5 0 34 0; -#X connect 6 0 27 0; +#X connect 4 0 47 1; +#X connect 5 0 33 0; +#X connect 6 0 26 0; #X connect 7 0 10 0; #X connect 8 0 9 0; #X connect 9 0 25 0; #X connect 10 0 8 0; -#X connect 11 0 27 1; -#X connect 12 0 27 4; -#X connect 13 0 27 2; -#X connect 14 0 27 3; +#X connect 11 0 26 1; +#X connect 12 0 26 4; +#X connect 13 0 26 2; +#X connect 14 0 26 3; #X connect 15 0 10 1; #X connect 16 0 10 1; #X connect 17 0 10 1; #X connect 22 0 1 1; #X connect 23 0 7 0; -#X connect 24 0 31 0; -#X connect 24 0 48 0; -#X connect 27 0 23 0; -#X connect 28 0 5 0; -#X connect 29 0 28 1; -#X connect 31 0 32 0; -#X connect 32 0 27 0; -#X connect 34 0 7 1; -#X connect 39 0 28 0; -#X connect 48 0 0 0; -#X connect 48 0 6 0; +#X connect 24 0 30 0; +#X connect 24 0 47 0; +#X connect 26 0 23 0; +#X connect 27 0 5 0; +#X connect 28 0 27 1; +#X connect 30 0 31 0; +#X connect 31 0 26 0; +#X connect 33 0 7 1; +#X connect 38 0 27 0; +#X connect 47 0 0 0; +#X connect 47 0 6 0; diff --git a/doc/3.audio.examples/E08.phase.mod.pd b/doc/3.audio.examples/E08.phase.mod.pd index a0131d27..d524d37e 100644 --- a/doc/3.audio.examples/E08.phase.mod.pd +++ b/doc/3.audio.examples/E08.phase.mod.pd @@ -34,7 +34,6 @@ #X obj 250 263 tabwrite~ phase-out; #X obj 240 290 tabwrite~ cos-out; #X obj 135 322 output~; -#X text 636 559 updated for Pd version 0.37; #X text 531 392 The "modulation" index \, which in true FM is in units of Hertz \, is dimensionless for phase modulation. "Good" values tend to be between 0 and 1... in this patch the index is in hundredths., f 45; #X obj 691 55 declare -stdpath ./; #X obj 240 225 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; @@ -61,13 +60,13 @@ #X connect 4 0 29 0; #X connect 4 0 30 0; #X connect 5 0 4 0; -#X connect 5 0 36 0; +#X connect 5 0 35 0; #X connect 6 0 0 0; #X connect 7 0 2 0; #X connect 8 0 9 0; #X connect 9 0 7 0; #X connect 20 0 5 0; #X connect 22 0 21 0; -#X connect 34 0 28 0; -#X connect 34 0 29 0; -#X connect 36 0 28 0; +#X connect 33 0 28 0; +#X connect 33 0 29 0; +#X connect 35 0 28 0; diff --git a/doc/3.audio.examples/E09.FM.spectrum.pd b/doc/3.audio.examples/E09.FM.spectrum.pd index 5c73ad96..a6887471 100644 --- a/doc/3.audio.examples/E09.FM.spectrum.pd +++ b/doc/3.audio.examples/E09.FM.spectrum.pd @@ -9,7 +9,6 @@ #X obj 189 162 / 100; #X obj 71 160 phasor~; #X obj 71 321 output~; -#X text 457 514 updated for Pd version 0.37; #N canvas 665 146 599 711 fft 0; #X obj 97 106 inlet~; #X obj 286 257 inlet; @@ -110,19 +109,19 @@ #X text 393 364 ------ partial number ------; #X connect 0 0 3 1; #X connect 1 0 0 1; -#X connect 2 0 10 0; -#X connect 2 0 40 0; +#X connect 2 0 9 0; +#X connect 2 0 39 0; #X connect 3 0 2 0; #X connect 4 0 1 0; #X connect 5 0 6 0; #X connect 6 0 4 0; #X connect 7 0 3 0; -#X connect 11 0 10 1; -#X connect 12 0 10 2; -#X connect 23 0 0 0; -#X connect 24 0 23 0; -#X connect 24 0 33 1; -#X connect 32 0 33 0; -#X connect 33 0 7 0; -#X connect 34 0 32 0; -#X connect 40 0 8 0; +#X connect 10 0 9 1; +#X connect 11 0 9 2; +#X connect 22 0 0 0; +#X connect 23 0 22 0; +#X connect 23 0 32 1; +#X connect 31 0 32 0; +#X connect 32 0 7 0; +#X connect 33 0 31 0; +#X connect 39 0 8 0; diff --git a/doc/3.audio.examples/E10.complex.FM.pd b/doc/3.audio.examples/E10.complex.FM.pd index 1831902b..9e65197e 100644 --- a/doc/3.audio.examples/E10.complex.FM.pd +++ b/doc/3.audio.examples/E10.complex.FM.pd @@ -9,7 +9,6 @@ #X obj 165 264 / 100; #X obj 71 208 phasor~; #X obj 129 493 output~; -#X text 581 495 updated for Pd version 0.37; #N canvas 298 189 621 664 fft 0; #X obj 84 81 inlet~; #X obj 273 232 inlet; @@ -114,32 +113,32 @@ #X text 472 275 -------- partial number --------; #X connect 0 0 3 1; #X connect 1 0 0 1; -#X connect 2 0 10 0; -#X connect 2 0 52 0; +#X connect 2 0 9 0; +#X connect 2 0 51 0; #X connect 3 0 2 0; #X connect 4 0 1 0; #X connect 5 0 6 0; #X connect 6 0 4 0; #X connect 7 0 3 0; -#X connect 11 0 10 1; -#X connect 12 0 10 2; -#X connect 20 0 0 0; -#X connect 21 0 28 1; -#X connect 21 0 32 1; -#X connect 21 0 43 1; -#X connect 27 0 28 0; -#X connect 28 0 7 0; -#X connect 29 0 27 0; -#X connect 32 0 20 0; -#X connect 33 0 32 0; -#X connect 35 0 33 0; -#X connect 37 0 3 1; -#X connect 38 0 37 1; -#X connect 39 0 38 0; -#X connect 40 0 41 0; -#X connect 41 0 39 0; -#X connect 42 0 37 0; +#X connect 10 0 9 1; +#X connect 11 0 9 2; +#X connect 19 0 0 0; +#X connect 20 0 27 1; +#X connect 20 0 31 1; +#X connect 20 0 42 1; +#X connect 26 0 27 0; +#X connect 27 0 7 0; +#X connect 28 0 26 0; +#X connect 31 0 19 0; +#X connect 32 0 31 0; +#X connect 34 0 32 0; +#X connect 36 0 3 1; +#X connect 37 0 36 1; +#X connect 38 0 37 0; +#X connect 39 0 40 0; +#X connect 40 0 38 0; +#X connect 41 0 36 0; +#X connect 42 0 41 0; #X connect 43 0 42 0; -#X connect 44 0 43 0; -#X connect 47 0 44 0; -#X connect 52 0 8 0; +#X connect 46 0 43 0; +#X connect 51 0 8 0; diff --git a/doc/3.audio.examples/F01.pulse.pd b/doc/3.audio.examples/F01.pulse.pd index 55950f0a..fdbfa3aa 100644 --- a/doc/3.audio.examples/F01.pulse.pd +++ b/doc/3.audio.examples/F01.pulse.pd @@ -38,7 +38,6 @@ #X obj 246 546 output~; #X obj 246 407 +~ 1; #X obj 246 450 *~ 0.5; -#X text 667 665 updated for Pd version 0.37; #X text 121 400 add one (range now from 0 to 2), f 16; #X text 147 441 ...and now from 0 to 1, f 12; #X text 65 631 This patch computes a pulse train \, with an "index" control that essentially squeezes the pulses. If "bandwidth" is zero you get a pure cosine wave \, and for larger values of the bandwidth \, the cosine wave is squeezed to fill smaller portions of the waveform., f 75; @@ -57,8 +56,8 @@ #X text 302 110 fix range (1 to 10); #X msg 170 78 220; #X obj 264 189 +~ 1; -#X connect 0 0 47 0; -#X connect 1 0 40 0; +#X connect 0 0 46 0; +#X connect 1 0 39 0; #X connect 2 0 27 0; #X connect 4 0 0 0; #X connect 5 0 9 0; @@ -75,7 +74,7 @@ #X connect 27 0 28 0; #X connect 28 0 11 0; #X connect 28 0 18 0; -#X connect 40 0 7 0; -#X connect 41 0 46 0; -#X connect 46 0 1 0; -#X connect 47 0 8 1; +#X connect 39 0 7 0; +#X connect 40 0 45 0; +#X connect 45 0 1 0; +#X connect 46 0 8 1; diff --git a/doc/3.audio.examples/F02.just.say.pd b/doc/3.audio.examples/F02.just.say.pd index 274c6606..fe97ad2c 100644 --- a/doc/3.audio.examples/F02.just.say.pd +++ b/doc/3.audio.examples/F02.just.say.pd @@ -63,7 +63,6 @@ #X text 345 309 We interrupt this series of patches to bring you an important message from Nancy Reagan. If \, anywhere \, at any time \, someone offers you an illicit drug \, just say one word in reply..., f 40; #X text 345 407 Now that I'm sure you've heard this important message \, we can return to the essentially frivolous occupation of making turn-of-the-millennium western art music., f 40; #X obj 145 208 *~ 6; -#X text 419 510 updated for Pd version 0.34; #X obj 127 482 output~; #X obj 483 49 declare -stdpath ./; #X obj 181 109 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; @@ -71,11 +70,11 @@ #X text 230 33 negative frequency generates downwards ramps, f 25; #X obj 127 369 +~ 1; #X obj 127 401 *~ 0.5; -#X connect 0 0 31 0; +#X connect 0 0 30 0; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 4 0 0 0; -#X connect 5 0 26 0; +#X connect 5 0 25 0; #X connect 6 0 14 0; #X connect 6 0 11 0; #X connect 7 0 14 1; @@ -89,6 +88,6 @@ #X connect 16 0 17 0; #X connect 17 0 2 0; #X connect 24 0 10 0; -#X connect 28 0 11 0; -#X connect 31 0 32 0; -#X connect 32 0 5 0; +#X connect 27 0 11 0; +#X connect 30 0 31 0; +#X connect 31 0 5 0; diff --git a/doc/3.audio.examples/F03.pulse.spectrum.pd b/doc/3.audio.examples/F03.pulse.spectrum.pd index bd7d6598..161ffe4a 100644 --- a/doc/3.audio.examples/F03.pulse.spectrum.pd +++ b/doc/3.audio.examples/F03.pulse.spectrum.pd @@ -1,4 +1,4 @@ -#N canvas 602 38 641 655 12; +#N canvas 602 38 631 631 12; #X declare -stdpath ./; #X obj 193 184 line~; #X obj 71 255 cos~; @@ -90,7 +90,6 @@ #X text 492 205 10; #X text 524 205 12; #X text 556 205 14; -#X text 393 617 updated for Pd version 0.37; #X obj 71 75 r freq; #X obj 469 25 declare -stdpath ./; #X text 214 331 <-- repeatedly; @@ -112,7 +111,7 @@ #X connect 18 0 17 1; #X connect 19 0 17 2; #X connect 20 0 17 0; -#X connect 20 0 39 0; +#X connect 20 0 38 0; #X connect 21 0 4 0; -#X connect 35 0 21 0; -#X connect 39 0 16 0; +#X connect 34 0 21 0; +#X connect 38 0 16 0; diff --git a/doc/3.audio.examples/F04.waveshaping.pulse.pd b/doc/3.audio.examples/F04.waveshaping.pulse.pd index f5686cae..6376e51e 100644 --- a/doc/3.audio.examples/F04.waveshaping.pulse.pd +++ b/doc/3.audio.examples/F04.waveshaping.pulse.pd @@ -98,7 +98,6 @@ #X obj 88 257 hip~ 5; #X text 503 264 ------ partial number ------; #X text 20 495 This is the form of pulse train used in the original Phase Aligned Formant (PAF) algorithm \, which was protected by patents belonging to IRCAM from 1993 to 2011, f 66; -#X text 544 507 updated for Pd version 0.55; #X connect 0 0 3 1; #X connect 1 0 0 0; #X connect 2 0 4 0; diff --git a/doc/3.audio.examples/F05.ring.modulation.pd b/doc/3.audio.examples/F05.ring.modulation.pd index 7133a6b0..9acc41c0 100644 --- a/doc/3.audio.examples/F05.ring.modulation.pd +++ b/doc/3.audio.examples/F05.ring.modulation.pd @@ -8,8 +8,7 @@ #X array F05-spectrum 256 float 0; #X coords 0 0.51 255 -0.008 256 130 1; #X restore 457 50 graph; -#X text 523 433 ---- 0.02 seconds ----; -#X text 542 501 updated for Pd version 0.37; +#X text 523 437 ---- 0.02 seconds ----; #X text 453 183 0; #X text 719 170 0; #X text 716 47 0.5; @@ -133,14 +132,14 @@ #X connect 26 0 28 0; #X restore 147 254 pd fft; #X text 481 211 ------ partial number ------; +#X connect 6 0 7 0; #X connect 7 0 8 0; -#X connect 8 0 9 0; -#X connect 9 0 38 0; -#X connect 9 0 39 0; -#X connect 12 0 39 1; -#X connect 13 0 39 2; -#X connect 26 0 28 0; -#X connect 27 0 9 1; -#X connect 28 0 27 0; -#X connect 29 0 28 1; -#X connect 38 0 11 0; +#X connect 8 0 37 0; +#X connect 8 0 38 0; +#X connect 11 0 38 1; +#X connect 12 0 38 2; +#X connect 25 0 27 0; +#X connect 26 0 8 1; +#X connect 27 0 26 0; +#X connect 28 0 27 1; +#X connect 37 0 10 0; diff --git a/doc/3.audio.examples/F06.packets.pd b/doc/3.audio.examples/F06.packets.pd index b59fabb7..ad43a440 100644 --- a/doc/3.audio.examples/F06.packets.pd +++ b/doc/3.audio.examples/F06.packets.pd @@ -56,7 +56,6 @@ #X text 37 47 The simpler of two techniques for making slidable center frequencies is to synthesize enveloped sinusoidal wave packets. The packets should repeat at the fundamental frequency \, but the frequency of the packet itself controls the center frequency of the formant. The length of the packet varies inversely with bandwidth., f 68; #X obj 106 596 output~; #X obj 265 529 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 571 623 updated for Pd version 0.37; #X obj 106 479 *~ 0.5; #X text 767 190 -1; #X text 769 60 1; @@ -84,11 +83,11 @@ #X connect 7 0 3 0; #X connect 8 0 1 0; #X connect 10 0 6 1; -#X connect 11 0 32 0; +#X connect 11 0 31 0; #X connect 12 0 13 1; #X connect 12 0 18 2; #X connect 13 0 18 0; -#X connect 13 0 47 0; +#X connect 13 0 46 0; #X connect 14 0 15 0; #X connect 15 0 20 0; #X connect 17 0 12 0; @@ -97,6 +96,6 @@ #X connect 23 0 24 0; #X connect 24 0 5 0; #X connect 30 0 18 3; -#X connect 32 0 13 0; -#X connect 32 0 18 1; -#X connect 47 0 29 0; +#X connect 31 0 13 0; +#X connect 31 0 18 1; +#X connect 46 0 29 0; diff --git a/doc/3.audio.examples/F07.packet.spectrum.pd b/doc/3.audio.examples/F07.packet.spectrum.pd index 0a1ce1af..14862eef 100644 --- a/doc/3.audio.examples/F07.packet.spectrum.pd +++ b/doc/3.audio.examples/F07.packet.spectrum.pd @@ -50,7 +50,6 @@ #X text 122 23 WINDOWED PACKET SPECTRUM; #X text 57 69 Here's the spectrum you get. Note that even if you put the center frequency right on a partial \, there is significant energy in neighboring partials (try fundamental 440 \, "center freq" 30 \, bandwidth 0.), f 63; #X text 56 136 The center frequency is in units of ten per partial \, or in other words a value of "30" means "centered on the third partial"., f 63; -#X text 373 654 updated for Pd version 0.34; #X text 55 192 This technique only works if you're doing Hanning-window shaped PWM--you can't combine this naturally with FM or with the waveshaping technique we'll see later., f 63; #X obj 60 630 output~; #X obj 420 381 declare -stdpath ./; @@ -71,7 +70,7 @@ #X connect 10 0 12 0; #X connect 11 0 12 1; #X connect 12 0 23 0; -#X connect 12 0 31 0; +#X connect 12 0 30 0; #X connect 13 0 14 0; #X connect 14 0 19 0; #X connect 15 0 11 0; @@ -81,4 +80,4 @@ #X connect 19 0 18 0; #X connect 20 0 21 0; #X connect 21 0 4 0; -#X connect 33 0 23 1; +#X connect 32 0 23 1; diff --git a/doc/3.audio.examples/F08.two.cosines.pd b/doc/3.audio.examples/F08.two.cosines.pd index 75a63b1d..ee0a05c9 100644 --- a/doc/3.audio.examples/F08.two.cosines.pd +++ b/doc/3.audio.examples/F08.two.cosines.pd @@ -21,7 +21,6 @@ #X obj 161 464 +~; #X obj 161 190 pack 0 50; #X text 210 329 synthesize the two partials; -#X text 461 589 updated for Pd version 0.37; #X obj 161 567 output~; #X text 282 125 The other \, spiffier way is to make a sum of cosines to interpolate between adjacent harmonics. Suppose for example we want a center frequency of 5.3 (in units of the fundamental.) We just take partial 5 with amplitude 0.7 and partial 6 with amplitude 0.3:, f 52; #X obj 246 519 tabwrite~ F08-carrier; @@ -48,7 +47,7 @@ #X connect 5 0 11 0; #X connect 5 0 10 0; #X connect 6 0 16 0; -#X connect 8 0 23 0; +#X connect 8 0 22 0; #X connect 9 0 13 0; #X connect 10 0 11 1; #X connect 10 0 14 1; @@ -56,10 +55,10 @@ #X connect 12 0 9 0; #X connect 13 0 14 0; #X connect 14 0 15 1; -#X connect 15 0 21 0; -#X connect 15 0 33 0; +#X connect 15 0 20 0; +#X connect 15 0 32 0; #X connect 16 0 5 0; -#X connect 22 0 21 0; -#X connect 23 0 4 0; -#X connect 23 0 12 1; -#X connect 33 0 19 0; +#X connect 21 0 20 0; +#X connect 22 0 4 0; +#X connect 22 0 12 1; +#X connect 32 0 18 0; diff --git a/doc/3.audio.examples/F09.declickit.pd b/doc/3.audio.examples/F09.declickit.pd index 6e43dc3d..88145367 100644 --- a/doc/3.audio.examples/F09.declickit.pd +++ b/doc/3.audio.examples/F09.declickit.pd @@ -16,7 +16,6 @@ #X text 138 21 CHANGING THE CENTER FREQUENCY QUICKLY; #X obj 139 614 output~; #X floatatom 228 156 4 0 50 0 - - - 0; -#X text 384 624 updated for Pd version 0.37; #X obj 175 209 line~; #X msg 175 155 13.5; #X msg 137 142 4; @@ -45,24 +44,24 @@ #X connect 7 0 8 1; #X connect 8 0 14 0; #X connect 9 0 10 0; -#X connect 10 0 19 0; +#X connect 10 0 18 0; #X connect 10 0 11 0; -#X connect 11 0 18 0; -#X connect 12 0 24 0; -#X connect 15 0 21 1; -#X connect 17 0 12 0; -#X connect 17 0 28 0; -#X connect 18 0 21 0; -#X connect 19 0 21 0; -#X connect 20 0 1 0; -#X connect 20 0 5 1; -#X connect 20 0 12 1; -#X connect 21 0 17 0; -#X connect 24 0 4 0; -#X connect 24 0 3 0; -#X connect 25 0 26 0; -#X connect 25 0 27 0; -#X connect 26 0 28 1; -#X connect 27 0 24 1; -#X connect 28 0 4 0; -#X connect 28 0 3 0; +#X connect 11 0 17 0; +#X connect 12 0 23 0; +#X connect 15 0 20 1; +#X connect 16 0 12 0; +#X connect 16 0 27 0; +#X connect 17 0 20 0; +#X connect 18 0 20 0; +#X connect 19 0 1 0; +#X connect 19 0 5 1; +#X connect 19 0 12 1; +#X connect 20 0 16 0; +#X connect 23 0 4 0; +#X connect 23 0 3 0; +#X connect 24 0 25 0; +#X connect 24 0 26 0; +#X connect 25 0 27 1; +#X connect 26 0 23 1; +#X connect 27 0 4 0; +#X connect 27 0 3 0; diff --git a/doc/3.audio.examples/F10.sweepable.FM.pd b/doc/3.audio.examples/F10.sweepable.FM.pd index fb955c3f..e37b1be8 100644 --- a/doc/3.audio.examples/F10.sweepable.FM.pd +++ b/doc/3.audio.examples/F10.sweepable.FM.pd @@ -87,7 +87,6 @@ #X restore 240 432 pd fft; #X obj 259 380 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 279 405 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 551 534 updated for Pd version 0.37; #N canvas 0 0 450 300 (subpatch) 0; #X array F10-spectrum 259 float 0; #X coords 0 0.51 258 -0.008 256 130 1; @@ -104,7 +103,7 @@ #X obj 199 466 hip~ 5; #X text 534 449 ---- frequency ----; #X connect 0 0 6 1; -#X connect 0 0 36 0; +#X connect 0 0 35 0; #X connect 1 0 24 0; #X connect 2 0 6 0; #X connect 3 0 4 1; @@ -112,7 +111,7 @@ #X connect 4 0 1 1; #X connect 5 0 2 0; #X connect 6 0 7 0; -#X connect 7 0 36 1; +#X connect 7 0 35 1; #X connect 8 0 4 0; #X connect 8 0 3 0; #X connect 10 0 11 0; @@ -134,6 +133,6 @@ #X connect 24 0 0 0; #X connect 31 0 30 1; #X connect 32 0 30 2; -#X connect 36 0 30 0; -#X connect 36 0 44 0; -#X connect 44 0 29 0; +#X connect 35 0 30 0; +#X connect 35 0 43 0; +#X connect 43 0 29 0; diff --git a/doc/3.audio.examples/F11.anharmonic.FM.pd b/doc/3.audio.examples/F11.anharmonic.FM.pd index 58305f90..814fc7b3 100644 --- a/doc/3.audio.examples/F11.anharmonic.FM.pd +++ b/doc/3.audio.examples/F11.anharmonic.FM.pd @@ -19,7 +19,6 @@ #X obj 186 482 output~; #X obj 259 388 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 279 415 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 457 505 updated for Pd version 0.37; #N canvas 0 0 450 300 (subpatch) 0; #X array F11-spectrum 259 float 0; #X coords 0 0.51 258 -0.008 256 130 1; @@ -95,23 +94,23 @@ #X connect 28 0 23 1; #X connect 29 0 21 1; #X restore 240 441 pd fft; +#X connect 0 0 35 0; #X connect 0 0 36 0; -#X connect 0 0 37 0; #X connect 1 0 2 0; -#X connect 2 0 25 0; -#X connect 3 0 24 0; -#X connect 3 0 26 0; +#X connect 2 0 24 0; +#X connect 3 0 23 0; +#X connect 3 0 25 0; #X connect 8 0 11 0; #X connect 9 0 10 1; #X connect 10 0 13 1; #X connect 11 0 12 0; #X connect 12 0 9 0; #X connect 13 0 0 0; -#X connect 17 0 37 1; -#X connect 18 0 37 2; -#X connect 24 0 27 0; -#X connect 25 0 24 0; -#X connect 25 1 24 1; -#X connect 26 0 10 0; -#X connect 27 0 13 0; -#X connect 36 0 16 0; +#X connect 17 0 36 1; +#X connect 18 0 36 2; +#X connect 23 0 26 0; +#X connect 24 0 23 0; +#X connect 24 1 23 1; +#X connect 25 0 10 0; +#X connect 26 0 13 0; +#X connect 35 0 16 0; diff --git a/doc/3.audio.examples/F12.paf.pd b/doc/3.audio.examples/F12.paf.pd index 04eebe7f..94283ea4 100644 --- a/doc/3.audio.examples/F12.paf.pd +++ b/doc/3.audio.examples/F12.paf.pd @@ -139,7 +139,6 @@ #X connect 29 0 21 1; #X restore 163 672 pd fft; #X text 28 214 Then with [*~] we do the ring modulation and we're done. This is the PAF (phase-aligned formant) synthesis algorithm (patented 1993 by IRCAM \, the patent ran out in 2011)., f 87; -#X text 440 743 updated for Pd version 0.55; #X connect 0 0 6 1; #X connect 0 0 8 0; #X connect 1 0 5 0; diff --git a/doc/3.audio.examples/F13.paf.control.pd b/doc/3.audio.examples/F13.paf.control.pd index 30b92d97..59f745bc 100644 --- a/doc/3.audio.examples/F13.paf.control.pd +++ b/doc/3.audio.examples/F13.paf.control.pd @@ -73,7 +73,6 @@ #X text 200 381 to fundamental; #X text 217 616 ring mod; #X obj 181 655 output~; -#X text 393 672 updated for Pd version 0.37; #X obj 291 413 *~ 0.5; #X obj 457 239 declare -stdpath ./; #X text 23 41 The more "natural" units for describing a formant might be center frequency and bandwidth \, so that you can change the fundamental without having the formant shift up and down in parallel. Here all three frequencies are expressed in MIDI units. The bandwidth and center frequency have to be divided by the fundamental (the expr 1/$f1 takes its reciprocal and two [*~] objects finish the division.), f 81; @@ -100,7 +99,7 @@ #X connect 13 0 9 1; #X connect 13 0 1 0; #X connect 13 0 5 1; -#X connect 13 0 43 0; +#X connect 13 0 42 0; #X connect 14 0 27 0; #X connect 15 0 32 0; #X connect 16 0 33 0; @@ -120,4 +119,4 @@ #X connect 32 0 18 0; #X connect 33 0 34 0; #X connect 34 0 17 1; -#X connect 43 0 21 0; +#X connect 42 0 21 0; diff --git a/doc/3.audio.examples/F14.wave.packet.pd b/doc/3.audio.examples/F14.wave.packet.pd index 11d82a9b..38137d78 100644 --- a/doc/3.audio.examples/F14.wave.packet.pd +++ b/doc/3.audio.examples/F14.wave.packet.pd @@ -48,7 +48,6 @@ #X text 512 418 second phase signal out of phase from first one, f 13; #X obj 459 578 declare -stdpath ./; #X text 67 47 The stretched wavetable method is an alternative to the PAF generator \, slightly more expensive in processing time but with the advantage it can be generalized to use samples instead of sinusoids to make complex spectral shapes., f 71; -#X text 397 668 updated for Pd version 0.55; #X text 67 115 The patch is almost exactly like B13 (the overlapping sample) except that \, instead of using [tabread~] we just use [cos~] \, and that we control pulse width (for bandwidth) as well as wavetable transposition (for center frequency)., f 71; #X text 257 195 center freq., f 6; #X connect 0 0 12 0; diff --git a/doc/3.audio.examples/G01.delay.pd b/doc/3.audio.examples/G01.delay.pd index 3a243ffd..1775e9ce 100644 --- a/doc/3.audio.examples/G01.delay.pd +++ b/doc/3.audio.examples/G01.delay.pd @@ -21,7 +21,6 @@ #X obj 45 420 output~; #X obj 45 387 +~; #X obj 59 242 delwrite~ delay1 1000; -#X text 439 405 updated for Pd version 0.37-1; #X text 61 198 test signal to delay; #X obj 440 62 declare -stdpath ./; #X text 269 126 You can delay a signal using the [delwrite~] and [delread~] objects. In this example \, a sample loops continuously and is added to a delayed copy of itself., f 55; @@ -37,7 +36,7 @@ #X connect 4 0 9 1; #X connect 5 0 9 0; #X connect 5 0 10 0; -#X connect 6 0 20 0; +#X connect 6 0 19 0; #X connect 9 0 8 0; -#X connect 19 0 6 0; -#X connect 20 0 5 0; +#X connect 18 0 6 0; +#X connect 19 0 5 0; diff --git a/doc/3.audio.examples/G02.delay.loop.pd b/doc/3.audio.examples/G02.delay.loop.pd index 7147a4e4..bd7c82c8 100644 --- a/doc/3.audio.examples/G02.delay.loop.pd +++ b/doc/3.audio.examples/G02.delay.loop.pd @@ -24,7 +24,6 @@ #X obj 134 201 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X text 33 138 We've added an amplitude control here so that the test oscillator only speaks while you're dragging the pitch up and down or when hitting 'bang'. Be sure to try shift-dragging on the pitch control., f 66; #X text 189 229 <-- set pitch; -#X text 295 557 updated for Pd version 0.37-1; #X text 356 284 ADSR only uses attack and decay stages, f 22; #X connect 0 0 5 0; #X connect 0 0 6 0; diff --git a/doc/3.audio.examples/G03.delay.variable.pd b/doc/3.audio.examples/G03.delay.variable.pd index 27bf3e4d..9d401cdb 100644 --- a/doc/3.audio.examples/G03.delay.variable.pd +++ b/doc/3.audio.examples/G03.delay.variable.pd @@ -31,7 +31,6 @@ #X obj 155 241 pack f 100; #X obj 99 237 osc~; #X obj 254 397 delread4~ G03-del; -#X text 364 627 updated for Pd version 0.52; #X text 30 58 This is a fuzzed FM generator going into a delay loop \, this time using a variable delay object ([delread4~]) that also performs interpolation for non integer indexes. You can get several interesting effects this way. We have taken the precaution of clipping inside the loop to avoid instabilities. You can push the loop gain past 1 if you want \, it will just oscillate., f 76; #X obj 254 484 pack f 100; #X text 148 152 <-- pitch; @@ -44,10 +43,10 @@ #X connect 0 0 14 0; #X connect 1 0 27 0; #X connect 2 0 18 1; -#X connect 3 0 40 0; +#X connect 3 0 39 0; #X connect 4 0 6 0; #X connect 5 0 17 1; -#X connect 6 0 33 0; +#X connect 6 0 32 0; #X connect 7 0 15 0; #X connect 8 0 9 1; #X connect 9 0 10 0; @@ -69,6 +68,6 @@ #X connect 28 0 8 0; #X connect 29 0 9 0; #X connect 30 0 16 1; -#X connect 33 0 5 0; -#X connect 39 0 20 0; -#X connect 40 0 39 0; +#X connect 32 0 5 0; +#X connect 38 0 20 0; +#X connect 39 0 38 0; diff --git a/doc/3.audio.examples/G04.control.blocksize.pd b/doc/3.audio.examples/G04.control.blocksize.pd index 2e9f6e9f..32c5777e 100644 --- a/doc/3.audio.examples/G04.control.blocksize.pd +++ b/doc/3.audio.examples/G04.control.blocksize.pd @@ -33,7 +33,6 @@ #X text 51 43 In situations where a delay read feeds back to a delay write \, the minimum possible delay you can achieve is one block \, which by default is 64 samples \, or 1.45 msec at 44100 Hz. You can shorten the minimum delay by changing the block size. Do this in a subpatch (open it to see how)., f 62; #X obj 128 504 output~; #X obj 128 422 vline~; -#X text 311 520 updated for Pd version 0.37-1; #X text 51 124 Here we use this principle to make a harpsichord-like sound by sending pulses into a recirculating delay line (which imitates the travel of the wave up and down the harpsichord string.) This is related to Karplus-Strong synthesis \, but the idea is probably much older than their paper., f 62; #X text 34 426 long., f 12; #X text 333 411 length of delay line is; @@ -49,12 +48,12 @@ #X connect 0 0 9 0; #X connect 1 0 0 1; #X connect 2 0 1 0; -#X connect 3 0 23 0; +#X connect 3 0 22 0; #X connect 4 0 6 0; -#X connect 5 0 21 0; +#X connect 5 0 20 0; #X connect 6 0 2 0; #X connect 10 0 0 0; -#X connect 19 0 10 0; -#X connect 21 0 3 0; -#X connect 23 0 19 0; -#X connect 23 0 4 0; +#X connect 18 0 10 0; +#X connect 20 0 3 0; +#X connect 22 0 18 0; +#X connect 22 0 4 0; diff --git a/doc/3.audio.examples/G05.execution.order.pd b/doc/3.audio.examples/G05.execution.order.pd index b7d0f0f8..f82f483d 100644 --- a/doc/3.audio.examples/G05.execution.order.pd +++ b/doc/3.audio.examples/G05.execution.order.pd @@ -44,7 +44,6 @@ #X obj 328 280 declare -stdpath ./; #X text 52 7 ORDER OF EXECUTION OF DELWRITE~ AND DELREAD~/DELREAD4~; #X obj 325 446 delread4~ G05-d1; -#X text 284 645 updated for Pd version 0.52; #X text 18 229 You can use the same strategy to avoid an unwanted delay of one block in pairs of [send~]/[receive~] \, [tabsend~]/[tabreceive~] or [throw~]/[catch~] objects., f 65; #X text 18 99 To get them to go off in the correct order \, put the [delwrite~] into a subpatch \, then the [delread4~] and/or [delread4~] objects into another subpatch. The audio connections between these subpatches force the "reader" to be sorted after the "writer". DSP sorting in Pd follows the hierarchy of subpatches., f 65; #X obj 325 383 pack f 30; @@ -55,11 +54,11 @@ #X text 25 567 "Right flanger", f 8; #X text 247 569 "Wrong flanger", f 8; #X connect 0 0 5 0; -#X connect 1 0 17 0; +#X connect 1 0 16 0; #X connect 2 0 3 0; #X connect 3 0 4 1; #X connect 4 0 6 0; -#X connect 5 0 16 0; +#X connect 5 0 15 0; #X connect 7 0 1 0; #X connect 7 0 2 0; #X connect 7 0 8 0; @@ -67,4 +66,4 @@ #X connect 9 0 3 1; #X connect 9 0 12 0; #X connect 12 0 1 1; -#X connect 16 0 9 0; +#X connect 15 0 9 0; diff --git a/doc/3.audio.examples/G06.octave.doubler.pd b/doc/3.audio.examples/G06.octave.doubler.pd index b748a911..c212961f 100644 --- a/doc/3.audio.examples/G06.octave.doubler.pd +++ b/doc/3.audio.examples/G06.octave.doubler.pd @@ -21,7 +21,6 @@ #X obj 490 64 declare -stdpath ./; #X obj 53 17 adc~ 1; #X obj 95 96 sigmund~ -npts 2048; -#X text 469 617 updated for Pd version 0.53; #X text 240 96 track pitch; #X text 157 120 reject low numbers indicating no pitch found; #X text 187 450 We already saw how to use ring modulation to alias a pitched sound down one octave. Here we do the reverse: filter out all odd harmonics using a variable-delay comb filter tuned one octave above the incoming sound. We use two taps into the delay line. The fixed one (delread~) adjusts for the delayed output of sigmund~. The variable one (vd~) adds to this an additional delay equal to 1/2 the measured period of the incoming sound. These two are added. Odd harmonics are 180 degrees out of phase at the two taps and cancel. Even harmonics get through - so the sound goes up an octave \, without denaturing the timbre as a speed-up would., f 67; @@ -39,19 +38,19 @@ #X connect 7 0 11 0; #X connect 7 1 6 0; #X connect 9 0 10 0; -#X connect 10 0 26 0; +#X connect 10 0 25 0; #X connect 11 0 14 0; #X connect 12 0 7 0; -#X connect 13 0 31 0; +#X connect 13 0 30 0; #X connect 14 0 13 0; #X connect 17 0 11 1; #X connect 17 0 9 0; #X connect 19 0 8 0; #X connect 19 0 20 0; -#X connect 19 0 28 0; +#X connect 19 0 27 0; #X connect 20 0 1 0; -#X connect 25 0 26 1; -#X connect 26 0 5 1; -#X connect 27 0 28 1; -#X connect 28 0 5 0; -#X connect 31 0 10 1; +#X connect 24 0 25 1; +#X connect 25 0 5 1; +#X connect 26 0 27 1; +#X connect 27 0 5 0; +#X connect 30 0 10 1; diff --git a/doc/3.audio.examples/G07.shaker.pd b/doc/3.audio.examples/G07.shaker.pd index 25ca2a3a..67ebd9b2 100644 --- a/doc/3.audio.examples/G07.shaker.pd +++ b/doc/3.audio.examples/G07.shaker.pd @@ -31,7 +31,6 @@ #X text 53 106 frequency; #X text 229 26 on/off; #X text 413 28 time constant (msec); -#X text 555 492 updated for Pd version 0.37-1; #X text 422 377 Any collection of four gains for the four delayed copies of the signal (including the original) defines some sort of irregular comb filter. The peaks and valleys of the comb filter shift constantly as the gains change to new \, random values., f 45; #X obj 546 84 declare -stdpath ./; #X obj 281 209 pack f f 200, f 13; @@ -50,7 +49,7 @@ #X connect 14 0 12 0; #X connect 14 0 16 0; #X connect 15 0 25 0; -#X connect 16 0 34 0; +#X connect 16 0 33 0; #X connect 16 1 15 0; #X connect 17 0 27 0; #X connect 18 0 24 0; @@ -64,8 +63,8 @@ #X connect 21 0 10 0; #X connect 22 0 6 0; #X connect 23 0 4 0; -#X connect 24 0 34 2; -#X connect 25 0 34 1; +#X connect 24 0 33 2; +#X connect 25 0 33 1; #X connect 26 0 21 0; #X connect 27 0 14 0; -#X connect 34 0 19 0; +#X connect 33 0 19 0; diff --git a/doc/3.audio.examples/G08.reverb.pd b/doc/3.audio.examples/G08.reverb.pd index 32d9863d..286524df 100644 --- a/doc/3.audio.examples/G08.reverb.pd +++ b/doc/3.audio.examples/G08.reverb.pd @@ -34,7 +34,6 @@ #X floatatom 87 155 6 10 130 0 - - - 0; #X floatatom 147 221 6 0 100 0 - - - 0; #X obj 87 294 output~; -#X text 211 476 updated for Pd version 0.37-1; #X text 27 57 Here is a simple recirculating reverberator. "Feedback" should be between 0 and 100 - if 100 \, the reverberation lasts forever.; #N canvas 342 38 753 717 reverb 0; #X obj 34 19 inlet~; @@ -141,9 +140,9 @@ #X obj 311 428 rev3~, f 8; #X text 119 129 <-- pitch in MIDI (triggers envelope).; #X text 140 155 <-- you can also click and drag.; -#X connect 0 0 7 0; +#X connect 0 0 6 0; #X connect 2 0 0 0; -#X connect 3 0 7 1; -#X connect 7 0 4 0; -#X connect 7 1 4 1; -#X connect 11 0 2 0; +#X connect 3 0 6 1; +#X connect 6 0 4 0; +#X connect 6 1 4 1; +#X connect 10 0 2 0; diff --git a/doc/3.audio.examples/G09.pitchshift.pd b/doc/3.audio.examples/G09.pitchshift.pd index ff94cb47..7c1b35fa 100644 --- a/doc/3.audio.examples/G09.pitchshift.pd +++ b/doc/3.audio.examples/G09.pitchshift.pd @@ -83,7 +83,6 @@ #X obj 536 79 declare -stdpath ./; #X obj 269 517 delread4~ G09-del, f 9; #X obj 101 506 delread4~ G09-del, f 9; -#X text 519 617 updated for Pd version 0.52; #X text 275 124 <-- window (msec); #X msg 224 342 \$1 200; #X msg 287 408 \$1 200; @@ -132,10 +131,10 @@ #X connect 40 0 1 0; #X connect 40 0 28 0; #X connect 40 0 27 0; -#X connect 41 0 53 0; +#X connect 41 0 52 0; #X connect 44 0 10 0; -#X connect 44 0 52 0; +#X connect 44 0 51 0; #X connect 48 0 22 1; #X connect 49 0 16 1; -#X connect 52 0 2 0; -#X connect 53 0 11 0; +#X connect 51 0 2 0; +#X connect 52 0 11 0; diff --git a/doc/3.audio.examples/H01.low-pass.pd b/doc/3.audio.examples/H01.low-pass.pd index ae20c83f..38b89b8d 100644 --- a/doc/3.audio.examples/H01.low-pass.pd +++ b/doc/3.audio.examples/H01.low-pass.pd @@ -32,7 +32,6 @@ #X connect 2 0 1 0; #X restore 227 558 pd init; #X text 33 54 This and the following patches show how to use filters in Pd \, starting with the simplest one: the one-pole low-pass filter. Here we test it with an input of white noise. The [lop~] object does the filtering. Its left inlet takes an audio signal to be filtered \, and its right inlet takes messages or signals to set its cutoff frequency in Hertz., f 75; -#X text 369 564 updated for Pd version 0.55; #X connect 0 0 5 0; #X connect 1 0 0 0; #X connect 3 0 2 0; diff --git a/doc/3.audio.examples/H02.high-pass.pd b/doc/3.audio.examples/H02.high-pass.pd index 7e94837d..cd1b49a8 100644 --- a/doc/3.audio.examples/H02.high-pass.pd +++ b/doc/3.audio.examples/H02.high-pass.pd @@ -23,19 +23,18 @@ #X msg 97 353 220; #X text 102 12 ONE-POLE \, ONE-ZERO HIGH-PASS FILTER; #X obj 102 529 tabwrite~ H02-graph; -#X obj 40 656 declare -stdpath ./; +#X obj 365 510 declare -stdpath ./; #X text 53 144 The simplest way to do this is to use a one-pole low-pass filter \, tuned to a low frequency such as 3 Hertz \, and to subtract its output from the original. This difference is called a one-pole \, one-zero high-pass filter \, and it is used so often that Pd provides one in the [hip~] object., f 65; -#X text 324 650 updated for Pd version 0.54; #X text 161 578 The [output~] abstraction includes [hip~] objects for this reason., f 34; #X text 129 353 higher frequencies affect the audible part of the signal as well., f 23; #X obj 40 416 hip~ 3; #X connect 1 0 19 0; #X connect 2 0 1 0; -#X connect 7 0 25 0; -#X connect 9 0 25 1; +#X connect 7 0 24 0; +#X connect 9 0 24 1; #X connect 10 0 9 0; #X connect 14 0 9 0; #X connect 16 0 7 0; #X connect 17 0 9 0; -#X connect 25 0 0 0; -#X connect 25 0 19 0; +#X connect 24 0 0 0; +#X connect 24 0 19 0; diff --git a/doc/3.audio.examples/H03.band-pass.pd b/doc/3.audio.examples/H03.band-pass.pd index cdaa9e41..185364c3 100644 --- a/doc/3.audio.examples/H03.band-pass.pd +++ b/doc/3.audio.examples/H03.band-pass.pd @@ -5,7 +5,6 @@ #X obj 67 498 output~; #X obj 67 248 noise~; #X floatatom 76 326 5 0 0 0 - - - 0; -#X text 355 501 updated for Pd version 0.39; #X obj 156 437 metro 250; #X text 178 410 graphing on/off; #X text 391 444 --- 0.02 sec ---; @@ -38,10 +37,10 @@ #X restore 210 516 pd init; #X connect 0 0 4 0; #X connect 1 0 0 0; -#X connect 3 0 10 0; -#X connect 4 0 10 1; -#X connect 6 0 12 0; -#X connect 10 0 2 0; -#X connect 10 0 12 0; -#X connect 13 0 10 2; -#X connect 17 0 6 0; +#X connect 3 0 9 0; +#X connect 4 0 9 1; +#X connect 5 0 11 0; +#X connect 9 0 2 0; +#X connect 9 0 11 0; +#X connect 12 0 9 2; +#X connect 16 0 5 0; diff --git a/doc/3.audio.examples/H04.filter.sweep.pd b/doc/3.audio.examples/H04.filter.sweep.pd index b465855d..eb8532da 100644 --- a/doc/3.audio.examples/H04.filter.sweep.pd +++ b/doc/3.audio.examples/H04.filter.sweep.pd @@ -16,7 +16,6 @@ #X obj 111 226 mtof; #X obj 124 301 phasor~; #X obj 124 355 *~; -#X text 288 562 updated for Pd version 0.39; #X text 52 140 Note the different effects of negative and positive sweep speeds., f 53; #X obj 123 437 mtof~; #X text 52 59 If you want actively changing center frequencies \, use [vcf~] instead of [bp~]. The [vcf~] module takes an audio signal to set center frequency (Q is still set by messages though) \, which makes it computationally somewhat more expensive than [bp~]., f 53; @@ -39,7 +38,7 @@ #X text 171 251 [phasor~] as a sawtooth like oscillator; #X connect 0 0 13 0; #X connect 2 0 8 0; -#X connect 3 0 18 0; +#X connect 3 0 17 0; #X connect 4 0 3 1; #X connect 5 0 14 0; #X connect 6 0 15 1; @@ -48,4 +47,4 @@ #X connect 13 0 2 0; #X connect 14 0 15 0; #X connect 15 0 3 0; -#X connect 18 0 8 1; +#X connect 17 0 8 1; diff --git a/doc/3.audio.examples/H05.filter.floyd.pd b/doc/3.audio.examples/H05.filter.floyd.pd index 41619d55..7b5136bc 100644 --- a/doc/3.audio.examples/H05.filter.floyd.pd +++ b/doc/3.audio.examples/H05.filter.floyd.pd @@ -21,7 +21,6 @@ #X obj 140 140 tgl 19 0 empty \$0-metro empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X text 220 407 at least 61; #X obj 140 295 phasor~; -#X text 365 681 updated for Pd version 0.39; #X obj 154 606 vcf~; #X obj 167 408 max 61; #X text 212 471 smooth & convert to Hz.; @@ -53,29 +52,29 @@ #X text 531 175 72; #X text 67 49 Here's an approximate reconstruction of an old riff by Pink Floyd. Because we're filtering a triangular waveform with odd partials \, it's easier to pick out the partials in the filtered sound than if we had had both even and odd ones., f 66; #X text 459 159 Picthes; -#X connect 0 0 22 0; +#X connect 0 0 21 0; #X connect 1 0 0 0; -#X connect 2 0 20 0; -#X connect 3 0 31 0; -#X connect 4 0 19 0; +#X connect 2 0 19 0; +#X connect 3 0 30 0; +#X connect 4 0 18 0; #X connect 6 0 7 0; #X connect 7 0 8 0; -#X connect 8 0 28 0; +#X connect 8 0 27 0; #X connect 9 0 10 0; -#X connect 9 0 35 0; +#X connect 9 0 34 0; #X connect 10 0 12 0; #X connect 11 0 17 0; #X connect 12 0 9 1; -#X connect 15 0 34 0; +#X connect 15 0 33 0; #X connect 17 0 6 0; #X connect 17 0 8 1; -#X connect 19 0 14 0; -#X connect 20 0 1 0; -#X connect 22 0 4 1; -#X connect 22 0 19 1; -#X connect 28 0 29 0; -#X connect 29 0 4 0; -#X connect 31 0 19 2; -#X connect 31 0 4 2; -#X connect 34 0 9 0; -#X connect 35 0 11 0; +#X connect 18 0 14 0; +#X connect 19 0 1 0; +#X connect 21 0 4 1; +#X connect 21 0 18 1; +#X connect 27 0 28 0; +#X connect 28 0 4 0; +#X connect 30 0 18 2; +#X connect 30 0 4 2; +#X connect 33 0 9 0; +#X connect 34 0 11 0; diff --git a/doc/3.audio.examples/H06.envelope.follower.pd b/doc/3.audio.examples/H06.envelope.follower.pd index 2a1b54cd..fc9f1058 100644 --- a/doc/3.audio.examples/H06.envelope.follower.pd +++ b/doc/3.audio.examples/H06.envelope.follower.pd @@ -14,7 +14,6 @@ #X obj 68 604 dbtorms; #X text 301 449 square the signal; #X text 285 603 convert to RMS; -#X text 311 684 updated for Pd version 0.39; #X text 293 511 low-pass filter; #X text 317 634 output; #X obj 259 546 r \$0-tick; @@ -52,21 +51,21 @@ #X text 122 509 <-- built-in envelope follower for comparison, f 12; #X connect 0 0 12 0; #X connect 1 0 2 0; -#X connect 2 0 22 0; +#X connect 2 0 21 0; #X connect 4 0 9 0; #X connect 5 0 4 1; #X connect 6 0 8 0; #X connect 6 0 8 1; -#X connect 6 0 21 0; +#X connect 6 0 20 0; #X connect 7 0 6 0; #X connect 8 0 4 0; #X connect 9 0 11 0; #X connect 11 0 10 0; -#X connect 12 0 34 0; -#X connect 18 0 9 0; -#X connect 19 0 20 0; -#X connect 20 0 0 0; -#X connect 21 0 20 1; -#X connect 22 0 6 1; -#X connect 23 0 22 1; -#X connect 25 0 27 0; +#X connect 12 0 33 0; +#X connect 17 0 9 0; +#X connect 18 0 19 0; +#X connect 19 0 0 0; +#X connect 20 0 19 1; +#X connect 21 0 6 1; +#X connect 22 0 21 1; +#X connect 24 0 26 0; diff --git a/doc/3.audio.examples/H07.measure.spectrum.pd b/doc/3.audio.examples/H07.measure.spectrum.pd index 7fbf8409..e6257169 100644 --- a/doc/3.audio.examples/H07.measure.spectrum.pd +++ b/doc/3.audio.examples/H07.measure.spectrum.pd @@ -61,7 +61,6 @@ #X obj 193 580 line~; #X obj 193 605 +~ 100; #X obj 145 670 *~; -#X text 411 795 updated for Pd version 0.55; #X obj 62 679 vu 21 160 empty empty -1 -10 0 12 #404040 #000000 1 0; #X obj 61 645 - 100; #X text 130 799 <-- the [vu] object is used to display values in dBFS, f 27; @@ -75,7 +74,7 @@ #X connect 4 0 1 2; #X connect 4 0 0 2; #X connect 5 0 2 0; -#X connect 6 0 33 0; +#X connect 6 0 32 0; #X connect 7 0 8 0; #X connect 8 0 16 0; #X connect 14 0 15 0; @@ -88,4 +87,4 @@ #X connect 28 0 29 0; #X connect 29 0 26 0; #X connect 30 0 12 0; -#X connect 33 0 32 0; +#X connect 32 0 31 0; diff --git a/doc/3.audio.examples/H08.heterodyning.pd b/doc/3.audio.examples/H08.heterodyning.pd index ab7e0cef..b90fbe55 100644 --- a/doc/3.audio.examples/H08.heterodyning.pd +++ b/doc/3.audio.examples/H08.heterodyning.pd @@ -1,5 +1,4 @@ #N canvas 558 38 528 732 12; -#X text 300 685 updated for Pd version 0.39; #X text 94 15 MORE ON MEASURING SPECTRA: HETERODYNING; #X obj 105 251 phasor~ 100; #X obj 158 321 phasor~; @@ -50,26 +49,26 @@ #X restore 423 349 pd init; #X text 40 470 low-pass filters, f 8; #X text 33 245 signal to analyze, f 9; -#X connect 2 0 9 0; -#X connect 2 0 10 0; -#X connect 3 0 5 0; -#X connect 3 0 7 0; -#X connect 4 0 3 0; +#X connect 1 0 8 0; +#X connect 1 0 9 0; +#X connect 2 0 4 0; +#X connect 2 0 6 0; +#X connect 3 0 2 0; +#X connect 4 0 8 1; #X connect 5 0 9 1; -#X connect 6 0 10 1; -#X connect 7 0 6 0; -#X connect 8 0 15 0; +#X connect 6 0 5 0; +#X connect 7 0 14 0; +#X connect 8 0 10 0; #X connect 9 0 11 0; -#X connect 10 0 12 0; -#X connect 11 0 8 0; -#X connect 12 0 14 0; -#X connect 13 0 12 1; -#X connect 13 0 11 1; -#X connect 14 0 16 0; -#X connect 15 0 19 0; -#X connect 16 0 19 1; -#X connect 17 0 18 0; -#X connect 18 0 8 0; -#X connect 18 1 14 0; -#X connect 19 0 20 0; -#X connect 28 0 30 0; +#X connect 10 0 7 0; +#X connect 11 0 13 0; +#X connect 12 0 11 1; +#X connect 12 0 10 1; +#X connect 13 0 15 0; +#X connect 14 0 18 0; +#X connect 15 0 18 1; +#X connect 16 0 17 0; +#X connect 17 0 7 0; +#X connect 17 1 13 0; +#X connect 18 0 19 0; +#X connect 27 0 29 0; diff --git a/doc/3.audio.examples/H09.ssb.modulation.pd b/doc/3.audio.examples/H09.ssb.modulation.pd index 6152569b..e4b896e8 100644 --- a/doc/3.audio.examples/H09.ssb.modulation.pd +++ b/doc/3.audio.examples/H09.ssb.modulation.pd @@ -39,7 +39,6 @@ #X connect 10 0 4 0; #X restore 151 299 pd bell-loop; #X obj 151 531 output~; -#X text 310 563 updated for Pd version 0.39; #X obj 226 362 phasor~; #X text 337 388 to form the real and; #X text 337 404 imaginary part of a; @@ -73,9 +72,9 @@ #X connect 3 0 5 0; #X connect 4 0 5 1; #X connect 5 0 13 0; -#X connect 6 0 15 0; -#X connect 12 0 21 0; -#X connect 15 0 1 0; -#X connect 15 0 0 0; -#X connect 21 0 3 0; -#X connect 21 1 4 0; +#X connect 6 0 14 0; +#X connect 12 0 20 0; +#X connect 14 0 1 0; +#X connect 14 0 0 0; +#X connect 20 0 3 0; +#X connect 20 1 4 0; diff --git a/doc/3.audio.examples/H10.measurement.pd b/doc/3.audio.examples/H10.measurement.pd index 1862a077..b1efea3c 100644 --- a/doc/3.audio.examples/H10.measurement.pd +++ b/doc/3.audio.examples/H10.measurement.pd @@ -14,7 +14,6 @@ #X floatatom 52 372 4 0 0 0 - - - 0; #X text 480 20 2; #X text 77 27 MEASURING FILTER FREQUENCY AND PHASE RESPONSE; -#X text 515 434 updated for Pd version 0.39; #X floatatom 274 318 5 0 10000 0 - \$0-freq - 0; #X floatatom 283 361 4 0 999 0 - \$0-q - 0; #X obj 52 337 filter-graph1 100 44100; @@ -44,12 +43,12 @@ #X obj 65 429 filter-graph2 \$0-amp \$0-phase; #X text 495 374 0 Hz; #X text 678 374 44100 Hz; -#X connect 5 0 12 0; -#X connect 6 0 26 0; -#X connect 10 0 13 1; -#X connect 11 0 13 2; -#X connect 12 0 6 0; -#X connect 12 1 13 0; -#X connect 12 1 26 1; -#X connect 12 2 26 2; -#X connect 13 0 26 3; +#X connect 5 0 11 0; +#X connect 6 0 25 0; +#X connect 9 0 12 1; +#X connect 10 0 12 2; +#X connect 11 0 6 0; +#X connect 11 1 12 0; +#X connect 11 1 25 1; +#X connect 11 2 25 2; +#X connect 12 0 25 3; diff --git a/doc/3.audio.examples/H11.shelving.pd b/doc/3.audio.examples/H11.shelving.pd index 621d3efa..f686d202 100644 --- a/doc/3.audio.examples/H11.shelving.pd +++ b/doc/3.audio.examples/H11.shelving.pd @@ -25,7 +25,6 @@ #X text 318 278 pole; #X text 272 278 zero; #X text 356 278 (in hundredths); -#X text 546 405 updated for Pd version 0.46; #N canvas 876 177 293 245 init 0; #X obj 58 24 loadbang; #X obj 58 51 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; diff --git a/doc/3.audio.examples/H12.peaking.pd b/doc/3.audio.examples/H12.peaking.pd index 32a24040..f0e3b62b 100644 --- a/doc/3.audio.examples/H12.peaking.pd +++ b/doc/3.audio.examples/H12.peaking.pd @@ -16,7 +16,6 @@ #X text 591 79 5; #X text 608 389 0; #X text 596 320 1; -#X text 624 520 updated for Pd version 0.39; #X text 45 9 PEAKING FILTER; #X floatatom 386 303 3 0 180 0 - \$0-pole - 0; #X text 385 281 angle; @@ -54,32 +53,32 @@ #X connect 3 0 8 0; #X connect 6 0 1 0; #X connect 6 1 5 1; -#X connect 6 1 26 0; +#X connect 6 1 25 0; #X connect 6 2 5 2; -#X connect 8 0 23 0; -#X connect 8 0 30 0; +#X connect 8 0 22 0; +#X connect 8 0 29 0; #X connect 9 0 10 0; +#X connect 10 0 30 0; #X connect 10 0 31 0; -#X connect 10 0 32 0; -#X connect 16 0 21 0; -#X connect 19 0 25 0; -#X connect 20 0 24 0; -#X connect 21 0 22 0; -#X connect 22 0 20 0; -#X connect 22 0 19 0; -#X connect 23 0 26 2; -#X connect 24 0 23 0; +#X connect 15 0 20 0; +#X connect 18 0 24 0; +#X connect 19 0 23 0; +#X connect 20 0 21 0; +#X connect 21 0 19 0; +#X connect 21 0 18 0; +#X connect 22 0 25 2; +#X connect 23 0 22 0; +#X connect 23 0 30 0; +#X connect 23 1 22 1; +#X connect 23 1 30 1; +#X connect 24 0 29 0; #X connect 24 0 31 0; -#X connect 24 1 23 1; #X connect 24 1 31 1; -#X connect 25 0 30 0; -#X connect 25 0 32 0; -#X connect 25 1 32 1; -#X connect 25 1 30 1; -#X connect 26 0 27 0; -#X connect 26 1 27 1; -#X connect 27 0 5 3; -#X connect 30 0 26 3; -#X connect 31 0 27 2; -#X connect 32 0 27 3; -#X connect 34 0 6 0; +#X connect 24 1 29 1; +#X connect 25 0 26 0; +#X connect 25 1 26 1; +#X connect 26 0 5 3; +#X connect 29 0 25 3; +#X connect 30 0 26 2; +#X connect 31 0 26 3; +#X connect 33 0 6 0; diff --git a/doc/3.audio.examples/H13.butterworth.pd b/doc/3.audio.examples/H13.butterworth.pd index 345421b0..586f7dcf 100644 --- a/doc/3.audio.examples/H13.butterworth.pd +++ b/doc/3.audio.examples/H13.butterworth.pd @@ -10,7 +10,6 @@ #X text 487 61 5; #X text 504 371 0; #X text 492 302 1; -#X text 516 437 updated for Pd version 0.39; #X text 59 22 BUTTERWORTH FILTER; #X obj 241 409 butterworth3~; #X floatatom 263 351 4 0 100 0 - \$0-lf - 0; @@ -36,13 +35,13 @@ #X text 28 57 The butterworth filter can be configured for low-pass \, high-pass \, and shelving \, depending on the placement of the poles and zeros. For low-pass \, the poles are placed to set the cutoff frequency and the zeros are at -1 (the Nyquist). Leaving the poles fixed and moving the zeros then gives shelving filters. In this example \, the actual filtering is relegated to an abstraction ([butterworth3~]) which takes frequencies corresponding to the pole and zero placement., f 60; #X text 28 184 The [butterworth3~] abstraction computes filter coefficients using control messages \, and so it is not suitable for continuously time-varying Butterworth filters. For that \, it is often appropriate to use time-saving approximations \, but precisely which approximations to use will depend on the way the filter is to be used.; #X connect 1 0 4 0; -#X connect 10 0 4 3; +#X connect 9 0 4 3; +#X connect 10 0 12 0; #X connect 11 0 13 0; -#X connect 12 0 14 0; -#X connect 13 0 10 1; -#X connect 14 0 10 2; -#X connect 16 0 1 0; -#X connect 16 1 4 1; -#X connect 16 1 10 0; -#X connect 16 2 4 2; -#X connect 19 0 16 0; +#X connect 12 0 9 1; +#X connect 13 0 9 2; +#X connect 15 0 1 0; +#X connect 15 1 4 1; +#X connect 15 1 9 0; +#X connect 15 2 4 2; +#X connect 18 0 15 0; diff --git a/doc/3.audio.examples/H14.all.pass.pd b/doc/3.audio.examples/H14.all.pass.pd index 1fe3f988..15b894ba 100644 --- a/doc/3.audio.examples/H14.all.pass.pd +++ b/doc/3.audio.examples/H14.all.pass.pd @@ -1,6 +1,5 @@ #N canvas 296 142 779 445 12; #X floatatom 63 242 5 0 0 0 - - - 0; -#X text 118 382 updated for Pd version 0.39; #X obj 63 210 filter-graph1 100 44100; #X text 50 21 ALL-PASS FILTERS; #X floatatom 371 261 3 -99 99 0 - \$0-pole - 0; @@ -40,14 +39,14 @@ #X text 486 385 0 Hz; #X text 669 385 44100 Hz; #X obj 76 309 filter-graph2 \$0-amp \$0-phase; -#X connect 0 0 24 0; -#X connect 2 0 0 0; -#X connect 2 1 7 0; -#X connect 2 1 24 1; -#X connect 2 2 24 2; -#X connect 4 0 6 0; -#X connect 5 0 24 3; -#X connect 6 0 7 1; -#X connect 6 0 5 1; -#X connect 7 0 5 0; -#X connect 9 0 2 0; +#X connect 0 0 23 0; +#X connect 1 0 0 0; +#X connect 1 1 6 0; +#X connect 1 1 23 1; +#X connect 1 2 23 2; +#X connect 3 0 5 0; +#X connect 4 0 23 3; +#X connect 5 0 6 1; +#X connect 5 0 4 1; +#X connect 6 0 4 0; +#X connect 8 0 1 0; diff --git a/doc/3.audio.examples/H15.phaser.pd b/doc/3.audio.examples/H15.phaser.pd index 099dbf5f..6444170a 100644 --- a/doc/3.audio.examples/H15.phaser.pd +++ b/doc/3.audio.examples/H15.phaser.pd @@ -62,7 +62,6 @@ #X obj 238 444 phasor~ 0.3; #X obj 238 476 expr~ 1 - 0.03 - 0.6*abs($v1-0.5)*abs($v1-0.5); #X text 31 172 Many variations of this have been used. A more pronounced effect can be got by using 12 all-pass filters and adding the outputs of the 4th \, 8th \, and 12th one to the original. Various stereo configurations are possible. Some designers have used 6 instead of the 4 stages used here. Controls are often added to set the frequency of sweeping and the range of the all-pass coefficients., f 66; -#X text 330 584 updated for Pd version 0.47; #X obj 382 301 declare -stdpath ./; #X text 31 47 The phaser ranks \, along with fuzz and wah-wah \, as one of the great guitar pedals. A phaser adds an all-pass filtered copy of a signal to the original \, causing phase reinforcement and cancellation at frequencies that depend on the all-pass coefficients. In this example the coefficients range from 0.88 to 0.98 \, controlled by a [phasor~] object (no relation). The [phasor~] is converted to a triangle wave (abs($v1-0.5)) and then nonlinearly mapped into a suitable range., f 66; #X connect 1 0 4 0; diff --git a/doc/3.audio.examples/H16.adsr.filter.qlist.pd b/doc/3.audio.examples/H16.adsr.filter.qlist.pd index 370ffaa4..e60b7575 100644 --- a/doc/3.audio.examples/H16.adsr.filter.qlist.pd +++ b/doc/3.audio.examples/H16.adsr.filter.qlist.pd @@ -70,7 +70,6 @@ #X obj 662 588 text define -k seq2; #A set note 36 \; 1000 note 34 \; 1000 note 33 \; 1000 note 31 \; 1000 text bang \;; #X obj 398 631 text sequence seq2 -g; -#X text 603 645 updated for Pd version 0.52; #X msg 413 591 stop; #X msg 504 589 tempo \$1 permsec; #X obj 504 539 r tempo; @@ -100,7 +99,7 @@ #X text 323 17 ANALOG STYLE SYNTH USING QLIST; #X obj 398 532 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X text 425 533 start; -#X connect 0 0 83 0; +#X connect 0 0 82 0; #X connect 1 0 45 0; #X connect 2 0 3 0; #X connect 2 0 3 1; @@ -110,14 +109,14 @@ #X connect 5 0 7 0; #X connect 6 0 43 0; #X connect 7 0 6 0; -#X connect 8 0 83 1; +#X connect 8 0 82 1; #X connect 9 0 8 0; -#X connect 10 0 83 2; +#X connect 10 0 82 2; #X connect 11 0 10 0; -#X connect 12 0 83 3; +#X connect 12 0 82 3; #X connect 13 0 12 0; -#X connect 14 0 83 4; -#X connect 15 0 83 5; +#X connect 14 0 82 4; +#X connect 15 0 82 5; #X connect 16 0 14 0; #X connect 17 0 15 0; #X connect 18 0 31 0; @@ -132,12 +131,12 @@ #X connect 29 0 30 0; #X connect 30 0 62 1; #X connect 31 0 27 0; -#X connect 32 0 81 0; +#X connect 32 0 80 0; #X connect 33 0 48 0; -#X connect 34 0 81 2; -#X connect 35 0 81 3; -#X connect 36 0 81 4; -#X connect 37 0 81 5; +#X connect 34 0 80 2; +#X connect 35 0 80 3; +#X connect 36 0 80 4; +#X connect 37 0 80 5; #X connect 38 0 33 0; #X connect 39 0 34 0; #X connect 40 0 35 0; @@ -148,7 +147,7 @@ #X connect 45 0 59 0; #X connect 46 0 45 2; #X connect 47 0 46 0; -#X connect 48 0 81 1; +#X connect 48 0 80 1; #X connect 49 0 50 0; #X connect 50 0 51 0; #X connect 51 0 56 0; @@ -161,12 +160,12 @@ #X connect 56 0 53 1; #X connect 62 0 20 0; #X connect 64 0 68 0; -#X connect 66 0 85 0; +#X connect 66 0 84 0; +#X connect 69 0 68 0; #X connect 70 0 68 0; -#X connect 71 0 68 0; -#X connect 72 0 73 0; -#X connect 73 0 71 0; -#X connect 75 0 21 0; -#X connect 81 0 55 0; -#X connect 83 0 2 0; -#X connect 85 0 64 0; +#X connect 71 0 72 0; +#X connect 72 0 70 0; +#X connect 74 0 21 0; +#X connect 80 0 55 0; +#X connect 82 0 2 0; +#X connect 84 0 64 0; diff --git a/doc/3.audio.examples/I01.Fourier.analysis.pd b/doc/3.audio.examples/I01.Fourier.analysis.pd index 9937fadb..1d2c85c4 100644 --- a/doc/3.audio.examples/I01.Fourier.analysis.pd +++ b/doc/3.audio.examples/I01.Fourier.analysis.pd @@ -33,7 +33,6 @@ #X text 115 403 sync phase with snapshots; #X obj 59 456 fft~; #X text 163 12 The [fft~] object has separate inlets for the real and imaginary parts of a complex-valued signal and outputs its Fourier transform \, again using separate outlets for the real and imaginary part. The transform is done on one block of samples (here the block size is 64 \, Pd's default.) The outputs give the complex amplitudes of the harmonics of the input signal \, from DC up. The harmonics are tuned to the fundamental frequency of the analysis \, 1/64th of the sample rate. If the frequency (in harmonics) is an integer \, the result is two harmonics symmetric about the Nyquist frequency. Fractional frequencies spill across harmonics. Changing the initial phase rotates energy from real to imaginary and back., f 67; -#X text 478 674 updated for Pd version 0.39; #X obj 238 572 ../5.reference/set-dsp-tgl; #X text 269 575 DSP on/off; #X msg 238 607 \; pd dsp \$1; @@ -65,4 +64,4 @@ #X connect 24 0 2 0; #X connect 26 0 7 0; #X connect 26 1 8 0; -#X connect 29 0 31 0; +#X connect 28 0 30 0; diff --git a/doc/3.audio.examples/I02.Hann.window.pd b/doc/3.audio.examples/I02.Hann.window.pd index 3b19ab7f..456c3cb9 100644 --- a/doc/3.audio.examples/I02.Hann.window.pd +++ b/doc/3.audio.examples/I02.Hann.window.pd @@ -41,7 +41,6 @@ #X text 118 15 WINDOWING AND BLOCKING FOURIER TRANSFORMS; #X obj 33 266 osc~; #X floatatom 33 237 9 0 0 0 - - - 0; -#X text 326 561 updated for Pd version 0.39; #X text 437 186 magnitude; #X text 276 311 0; #X text 514 311 255; @@ -78,14 +77,14 @@ #X text 104 236 Hz.; #X connect 3 0 0 0; #X connect 4 0 3 0; -#X connect 13 0 14 1; -#X connect 14 0 16 0; -#X connect 15 0 22 0; +#X connect 12 0 13 1; +#X connect 13 0 15 0; +#X connect 14 0 21 0; +#X connect 15 0 16 0; #X connect 16 0 17 0; -#X connect 17 0 18 0; -#X connect 22 0 14 0; -#X connect 28 0 15 0; -#X connect 28 0 13 0; -#X connect 28 0 18 0; -#X connect 29 0 31 0; -#X connect 34 0 4 0; +#X connect 21 0 13 0; +#X connect 27 0 14 0; +#X connect 27 0 12 0; +#X connect 27 0 17 0; +#X connect 28 0 30 0; +#X connect 33 0 4 0; diff --git a/doc/3.audio.examples/I03.resynthesis.pd b/doc/3.audio.examples/I03.resynthesis.pd index a4c6f250..33028e56 100644 --- a/doc/3.audio.examples/I03.resynthesis.pd +++ b/doc/3.audio.examples/I03.resynthesis.pd @@ -43,7 +43,6 @@ #X connect 14 0 12 0; #X connect 16 0 10 0; #X restore 63 385 pd fft-analysis; -#X text 393 458 updated for Pd version 0.39; #N canvas 687 159 571 372 Hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 512 float 0; @@ -97,7 +96,7 @@ #X msg 233 391 const 1; #X text 173 323 Click on the array to draw and change the gains.; #X obj 233 364 loadbang; -#X connect 0 0 3 0; -#X connect 4 0 0 0; -#X connect 16 0 6 0; -#X connect 18 0 16 0; +#X connect 0 0 2 0; +#X connect 3 0 0 0; +#X connect 15 0 5 0; +#X connect 17 0 15 0; diff --git a/doc/3.audio.examples/I05.compressor.pd b/doc/3.audio.examples/I05.compressor.pd index 9e5d7ef1..1dfa9209 100644 --- a/doc/3.audio.examples/I05.compressor.pd +++ b/doc/3.audio.examples/I05.compressor.pd @@ -151,7 +151,6 @@ #X connect 21 0 20 0; #X connect 23 0 9 0; #X restore 299 323 pd insample; -#X text 92 431 updated for Pd version 0.39; #X text 63 61 Here we divide each complex channel in the Fourier analysis by its own magnitude to "flatten" the spectrum. The "squelch" control limits the amplitude boost the algorithm will apply. If infinite \, you'll get a white spectrum. If less \, the louder parts of the spectrum will be flattened but the quieter ones will only be boosted by the squelch value., f 61; #X text 84 24 DYNAMIC RANGE COMPRESSION BY FOURIER ANALYSIS CHANNEL; #X floatatom 299 359 8 0 0 0 - - - 0; @@ -217,9 +216,9 @@ #X restore 457 434 pd init; #X connect 0 0 3 0; #X connect 2 0 0 0; -#X connect 4 0 8 0; -#X connect 9 0 4 1; +#X connect 4 0 7 0; +#X connect 8 0 4 1; +#X connect 10 0 4 0; #X connect 11 0 4 0; #X connect 12 0 4 0; -#X connect 13 0 4 0; -#X connect 15 0 11 0; +#X connect 14 0 10 0; diff --git a/doc/3.audio.examples/I06.timbre.stamp.pd b/doc/3.audio.examples/I06.timbre.stamp.pd index 4e276dc5..9940ed3f 100644 --- a/doc/3.audio.examples/I06.timbre.stamp.pd +++ b/doc/3.audio.examples/I06.timbre.stamp.pd @@ -328,7 +328,6 @@ #X text 495 383 sample lengths \,; #X text 499 406 msec; #X text 61 54 This is a Fourier-based "vocoder" (perhaps better called a "timbre stamp") like the one the Convolution brothers use. The "control source" is analyzed to get its spectral envelope \, which is then stamped onto the "filter input" by adjusting the amplitudes of its Fourier transform. The "filter input" is first whitened by the compression algorithm from the previous patch in this series. The best value of "squelch" to use depends critically on what kind of sounds are used for the filter input and the control source., f 67; -#X text 387 475 updated for Pd version 0.39; #X obj 451 20 declare -stdpath ./; #X obj 210 365 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X text 121 365 <- record ->; @@ -344,5 +343,5 @@ #X connect 14 0 15 0; #X connect 20 0 0 0; #X connect 20 1 0 1; -#X connect 30 0 20 1; -#X connect 33 0 20 0; +#X connect 29 0 20 1; +#X connect 32 0 20 0; diff --git a/doc/3.audio.examples/I07.phase.vocoder.pd b/doc/3.audio.examples/I07.phase.vocoder.pd index a34dfb94..28da4420 100644 --- a/doc/3.audio.examples/I07.phase.vocoder.pd +++ b/doc/3.audio.examples/I07.phase.vocoder.pd @@ -1,8 +1,8 @@ -#N canvas 388 38 672 589 12; +#N canvas 388 38 674 590 12; #X declare -stdpath ./; -#X floatatom 404 277 5 0 0 0 - transpo-set - 0; -#X floatatom 123 317 5 0 0 0 - speed-set - 0; -#X floatatom 30 319 7 0 0 0 - location-set - 0; +#X floatatom 404 307 5 0 0 0 - transpo-set - 0; +#X floatatom 123 347 5 0 0 0 - speed-set - 0; +#X floatatom 30 349 7 0 0 0 - location-set - 0; #N canvas 457 38 740 709 fft-analysis 0; #X obj 54 483 *~; #X obj 21 483 *~; @@ -314,11 +314,11 @@ #X connect 59 0 38 1; #X connect 61 0 20 1; #X connect 61 0 21 1; -#X restore 28 431 pd fft-analysis; -#X obj 404 308 s transpo; -#X text 120 298 hundredths; -#X text 323 292 normal; -#X obj 28 469 output~; +#X restore 28 461 pd fft-analysis; +#X obj 404 338 s transpo; +#X text 120 328 hundredths; +#X text 323 322 normal; +#X obj 28 499 output~; #N canvas 385 188 595 536 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 2048 float 0; @@ -366,7 +366,7 @@ #X connect 19 0 1 0; #X connect 19 1 4 0; #X connect 19 1 18 0; -#X restore 364 502 pd hann-window; +#X restore 364 532 pd hann-window; #N canvas 409 112 743 468 insample 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-sample 62079 float 2; @@ -422,53 +422,53 @@ #X connect 23 0 24 0; #X connect 24 0 9 0; #X connect 25 0 11 0; -#X restore 364 467 pd insample; +#X restore 364 497 pd insample; #X f 12; -#X floatatom 519 461 9 0 0 0 - \$0-samp-msec - 0; -#X msg 172 428 ../sound/bell.aiff; -#X msg 181 451 ../sound/voice.wav; -#X msg 185 473 ../sound/voice2.wav; -#X obj 172 504 s read-sample; -#X obj 405 337 tgl 22 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 30 341 s location; -#X obj 123 341 s speed; -#X obj 208 344 s rewind; -#X msg 286 268 200; -#X msg 294 292 100; -#X msg 301 316 20; -#X text 315 267 contract; -#X text 331 316 expand; -#X obj 405 367 s lock; -#X text 30 264 location; -#X text 27 280 (stops; -#X text 32 295 motion); -#X text 121 282 motion in; -#X text 175 406 read input sound; -#X floatatom 522 410 7 0 0 0 - window-size - 0; -#X msg 533 279 512; -#X msg 539 302 1024; -#X msg 544 325 2048; -#X msg 549 348 4096; -#X obj 533 374 s window-size; -#X text 530 237 window size \,; -#X text 530 252 samples; -#X text 72 240 ------- location controls -------; -#X obj 286 344 s auto; -#X obj 402 243 bng 22 250 50 0 no-detune empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X floatatom 519 491 9 0 0 0 - \$0-samp-msec - 0; +#X msg 172 458 ../sound/bell.aiff; +#X msg 181 481 ../sound/voice.wav; +#X msg 188 505 ../sound/voice2.wav; +#X obj 172 534 s read-sample; +#X obj 405 367 tgl 22 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 30 371 s location; +#X obj 123 371 s speed; +#X obj 208 374 s rewind; +#X msg 286 298 200; +#X msg 294 322 100; +#X msg 301 346 20; +#X text 315 297 contract; +#X text 331 346 expand; +#X obj 405 397 s lock; +#X text 30 294 location; +#X text 27 310 (stops; +#X text 32 325 motion); +#X text 121 312 motion in; +#X text 175 436 read input sound; +#X floatatom 522 440 7 0 0 0 - window-size - 0; +#X msg 533 309 512; +#X msg 539 332 1024; +#X msg 544 355 2048; +#X msg 549 378 4096; +#X obj 533 404 s window-size; +#X text 530 267 window size \,; +#X text 530 282 samples; +#X text 72 270 ------- location controls -------; +#X obj 286 374 s auto; +#X obj 402 273 bng 22 250 50 0 no-detune empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X text 41 20 PHASE VOCODER FOR TIME STRETCHING AND CONTRACTION; -#X obj 467 18 declare -stdpath ./; -#X obj 208 315 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 364 413 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 445 438 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 431 551 updated for Pd version 0.54; -#X text 444 270 detune in cents, f 8; -#X text 425 245 no detune; -#X text 568 278 <-- set; -#X text 388 413 <-- load file; -#X text 371 439 record -->; -#X text 517 484 sample length in msec, f 13; -#X text 521 430 window size; -#X text 38 65 This patch takes a sound \, analyzes windows in it both for channel magnitude and for phase precession in each channel (compared to another overlapping window). The real-time output recreates the same magnitudes and phase precession \, although the phases themselves are in general different. You can control either the location or its motion (setting location stops motion \, while setting a non-zero motion causes the location to change automatically). "Rewind" goes back to the beginning. You can use different window sizes (use the message boxes - the number box is for readout). The "lock" feature forces phase coherency between neighboring channels \, which makes a more present sound but can add artifacts to the sound. Look into the [pd fft-analysis] subppatch to see the workings., f 82; +#X obj 471 18 declare -stdpath ./; +#X obj 208 345 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 364 443 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 445 468 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 444 300 detune in cents, f 8; +#X text 425 275 no detune; +#X text 568 308 <-- set; +#X text 388 443 <-- load file; +#X text 371 469 record -->; +#X text 517 514 sample length in msec, f 13; +#X text 521 460 window size; +#X text 38 54 This patch takes a sound \, analyzes windows in it both for channel magnitude and for phase precession in each channel (compared to another overlapping window). The real-time output recreates the same magnitudes and phase precession \, although the phases themselves are in general different. You can control either the location or its motion (setting location stops motion \, while setting a non-zero motion causes the location to change automatically). "Rewind" goes back to the beginning. You can use different window sizes (use the message boxes - the number box is for readout). The "lock" feature forces phase coherency between neighboring channels \, which makes a more present sound but can add artifacts to the sound. Look into the [pd fft-analysis] subppatch to see the workings., f 82; +#X text 38 202 Note: The algorithm was altered and updated in Pd version 0.44 in a way that affected the result., f 82; #X connect 0 0 4 0; #X connect 1 0 17 0; #X connect 2 0 16 0; diff --git a/doc/3.audio.examples/I08.pvoc.reverb.pd b/doc/3.audio.examples/I08.pvoc.reverb.pd index dc8d1f65..e8a14fbd 100644 --- a/doc/3.audio.examples/I08.pvoc.reverb.pd +++ b/doc/3.audio.examples/I08.pvoc.reverb.pd @@ -316,8 +316,8 @@ #X text 25 170 For each window \, the amplitude in each channel is propagated by a constant phase increment and multiplied downward by a gain that determines the "reverb time"., f 70; #N canvas 635 123 602 538 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; -#X array \$0-hann 4096 float 0; -#X coords 0 1 4095 0 300 100 1; +#X array \$0-hann 1024 float 0; +#X coords 0 1 1023 0 300 100 1; #X restore 148 395 graph; #X obj 365 185 osc~; #X obj 365 210 *~ -0.5; @@ -365,7 +365,6 @@ #X text 76 425 reverb in; #X text 184 425 reverb out; #X obj 336 14 declare -stdpath ./; -#X text 330 399 Updated for Pd version 0.54; #X obj 59 230 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X text 109 261 short tone pitch; #X connect 0 0 5 0; @@ -373,4 +372,4 @@ #X connect 2 0 9 0; #X connect 9 0 6 0; #X connect 9 0 0 0; -#X connect 17 0 2 0; +#X connect 16 0 2 0; diff --git a/doc/3.audio.examples/I09.sheep.from.goats.pd b/doc/3.audio.examples/I09.sheep.from.goats.pd index 60d7b2ea..1867b5a9 100644 --- a/doc/3.audio.examples/I09.sheep.from.goats.pd +++ b/doc/3.audio.examples/I09.sheep.from.goats.pd @@ -236,8 +236,8 @@ #X text 64 295 amplitudes (dB); #N canvas 388 86 722 350 insample 0; #N canvas 0 0 450 300 (subpatch) 0; -#X array \$0-sample 155944 float 2; -#X coords 0 1 155944 -1 400 150 1; +#X array \$0-sample 62079 float 2; +#X coords 0 1 62079 -1 400 150 1; #X restore 259 38 graph; #X obj 19 23 r read-sample; #X obj 19 74 unpack s f; @@ -296,7 +296,6 @@ #X obj 358 302 s dirty; #X text 354 323 100=silent; #X text 356 340 0=all; -#X text 351 566 updated for Pd version 0.39; #X text 43 198 Two separate thresholds may be adjusted to listen to the "clean" or "dirty" part of the signal. You'll hear anything less incoherent than the clean threshold \, OR more incoherent than the dirty one., f 75; #X text 43 54 This patch applies a very simple coherence test to distinguish between sinusoids and noise in an input signal. It works very imperfectly (since noise is random \, no matter what test we place on it it will sometimes spoof its way in.) Here we just test that neighboring channels are 180 degrees (pi radians) out of phase \, as they should be in the main lobe in response to a sinusoid. If any three channels are so arranged \, all three are considered as contributing to a sinusoid. To do this we make an "incoherence" measure which is zero if the phase relationship is perfect and progressively larger otherwise., f 75; #N canvas 577 259 559 559 tables 0; diff --git a/doc/3.audio.examples/I10.phase.bash.pd b/doc/3.audio.examples/I10.phase.bash.pd index 901410ee..bdd4a4db 100644 --- a/doc/3.audio.examples/I10.phase.bash.pd +++ b/doc/3.audio.examples/I10.phase.bash.pd @@ -95,7 +95,6 @@ #X obj 641 376 s pitch; #X obj 397 489 output~; #X text 61 22 PHASE BASHING; -#X text 566 500 updated for Pd version 0.39; #X floatatom 260 347 8 0 0 0 - \$0-samp-msec - 0; #X text 258 365 sample length \, msec; #X msg 259 249 ../sound/bell.aiff; @@ -507,23 +506,23 @@ #X obj 99 403 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X text 632 259 spectral shift (hundredths of, f 14; #X text 462 255 location in sample (hundredths of sec), f 19; -#X connect 0 0 46 0; +#X connect 0 0 45 0; +#X connect 1 0 26 0; #X connect 1 0 27 0; -#X connect 1 0 28 0; -#X connect 1 1 27 0; +#X connect 1 1 26 0; #X connect 2 0 6 0; #X connect 3 0 4 0; -#X connect 12 0 16 0; -#X connect 13 0 16 0; -#X connect 14 0 16 0; -#X connect 17 0 1 0; -#X connect 19 0 22 0; -#X connect 20 0 22 0; -#X connect 21 0 22 0; -#X connect 23 0 22 0; +#X connect 11 0 15 0; +#X connect 12 0 15 0; +#X connect 13 0 15 0; +#X connect 16 0 1 0; +#X connect 18 0 21 0; +#X connect 19 0 21 0; +#X connect 20 0 21 0; +#X connect 22 0 21 0; +#X connect 28 0 5 0; #X connect 29 0 5 0; -#X connect 30 0 5 0; -#X connect 35 0 7 0; -#X connect 46 0 5 0; -#X connect 47 0 17 1; -#X connect 48 0 17 0; +#X connect 34 0 7 0; +#X connect 45 0 5 0; +#X connect 46 0 16 1; +#X connect 47 0 16 0; diff --git a/doc/3.audio.examples/J01.even.odd.pd b/doc/3.audio.examples/J01.even.odd.pd index 7a505f1b..21fd1dfa 100644 --- a/doc/3.audio.examples/J01.even.odd.pd +++ b/doc/3.audio.examples/J01.even.odd.pd @@ -16,7 +16,6 @@ #X coords 0 1.02 882 -1.02 200 130 1; #X restore 575 411 graph; #X text 591 551 ---- 0.02 seconds ----; -#X text 592 585 updated for Pd version 0.39; #X obj 136 395 output~; #X obj 159 310 output~; #X obj 262 68 phasor~ 100; @@ -39,17 +38,17 @@ #X text 38 484 This patch splits a sawtooth wave into its even and odd harmonics. The [wrap~] object is used to make the phased copy. Adding and subtracting this to and from the original gives the results shown and heard. (Listen to the two outputs separately \, then together.), f 66; #X connect 0 0 3 0; #X connect 2 0 0 0; +#X connect 2 0 12 0; #X connect 2 0 13 0; -#X connect 2 0 14 0; -#X connect 2 0 18 0; +#X connect 2 0 17 0; +#X connect 3 0 12 1; #X connect 3 0 13 1; -#X connect 3 0 14 1; -#X connect 10 0 2 0; -#X connect 13 0 8 0; -#X connect 13 0 17 0; -#X connect 14 0 9 1; -#X connect 14 0 16 0; -#X connect 23 0 15 0; -#X connect 23 0 16 0; -#X connect 23 0 17 0; -#X connect 23 0 18 0; +#X connect 9 0 2 0; +#X connect 12 0 7 0; +#X connect 12 0 16 0; +#X connect 13 0 8 1; +#X connect 13 0 15 0; +#X connect 22 0 14 0; +#X connect 22 0 15 0; +#X connect 22 0 16 0; +#X connect 22 0 17 0; diff --git a/doc/3.audio.examples/J02.trapezoids.pd b/doc/3.audio.examples/J02.trapezoids.pd index 3211b8da..01c5de6b 100644 --- a/doc/3.audio.examples/J02.trapezoids.pd +++ b/doc/3.audio.examples/J02.trapezoids.pd @@ -7,7 +7,6 @@ #X coords 0 1.02 881 -1.02 200 130 1; #X restore 414 304 graph; #X text 429 444 ---- 0.02 seconds ----; -#X text 508 585 updated for Pd version 0.39; #X obj 188 454 output~; #X obj 238 417 tabwrite~ \$0-sum; #X obj 132 150 -~; @@ -44,34 +43,34 @@ #X text 38 13 MAKING TRAPEZOIDAL WAVES FROM SAWTOOTH WAVES; #X obj 514 31 declare -stdpath ./; #X connect 0 0 1 0; -#X connect 1 0 12 0; -#X connect 7 0 0 0; -#X connect 8 0 7 1; -#X connect 9 0 8 0; -#X connect 10 0 12 1; -#X connect 11 0 10 0; -#X connect 12 0 31 0; -#X connect 13 0 14 0; -#X connect 14 0 20 0; -#X connect 15 0 13 0; -#X connect 16 0 15 1; -#X connect 17 0 16 0; -#X connect 18 0 20 1; -#X connect 19 0 18 0; -#X connect 20 0 31 1; -#X connect 21 0 22 0; -#X connect 22 0 28 0; -#X connect 23 0 21 0; -#X connect 24 0 23 1; -#X connect 25 0 24 0; -#X connect 26 0 28 1; -#X connect 27 0 26 0; -#X connect 28 0 32 1; -#X connect 31 0 32 0; -#X connect 32 0 6 0; -#X connect 32 0 5 0; -#X connect 33 0 35 0; -#X connect 34 0 7 0; -#X connect 34 0 15 0; -#X connect 34 0 23 0; -#X connect 35 0 6 0; +#X connect 1 0 11 0; +#X connect 6 0 0 0; +#X connect 7 0 6 1; +#X connect 8 0 7 0; +#X connect 9 0 11 1; +#X connect 10 0 9 0; +#X connect 11 0 30 0; +#X connect 12 0 13 0; +#X connect 13 0 19 0; +#X connect 14 0 12 0; +#X connect 15 0 14 1; +#X connect 16 0 15 0; +#X connect 17 0 19 1; +#X connect 18 0 17 0; +#X connect 19 0 30 1; +#X connect 20 0 21 0; +#X connect 21 0 27 0; +#X connect 22 0 20 0; +#X connect 23 0 22 1; +#X connect 24 0 23 0; +#X connect 25 0 27 1; +#X connect 26 0 25 0; +#X connect 27 0 31 1; +#X connect 30 0 31 0; +#X connect 31 0 5 0; +#X connect 31 0 4 0; +#X connect 32 0 34 0; +#X connect 33 0 6 0; +#X connect 33 0 14 0; +#X connect 33 0 22 0; +#X connect 34 0 5 0; diff --git a/doc/3.audio.examples/J03.pulse.width.mod.pd b/doc/3.audio.examples/J03.pulse.width.mod.pd index 38fc3a85..4b3acf99 100644 --- a/doc/3.audio.examples/J03.pulse.width.mod.pd +++ b/doc/3.audio.examples/J03.pulse.width.mod.pd @@ -18,7 +18,6 @@ #X coords 0 1.02 882 -1.02 200 130 1; #X restore 430 218 graph; #X text 450 519 ---- 0.02 seconds ----; -#X text 92 480 updated for Pd version 0.39; #X obj 111 283 output~; #X obj 208 187 tabwrite~ \$0-phasor1; #X obj 196 221 tabwrite~ \$0-phasor2; @@ -31,15 +30,15 @@ #X text 220 92 <-- start/stop graphing; #X text 43 357 This patch demonstrates pulse width modulation \, which is accomplished simply by subtracting two sawtooth waves at a varying phase difference. Here their frequencies are set to differ by 1/5 Hz so that the relative phase wanders continuously., f 47; #X connect 0 0 5 0; -#X connect 0 0 14 0; -#X connect 5 0 18 0; -#X connect 6 0 10 0; -#X connect 6 0 13 0; -#X connect 14 0 6 0; +#X connect 0 0 13 0; +#X connect 5 0 17 0; +#X connect 6 0 9 0; +#X connect 6 0 12 0; +#X connect 13 0 6 0; +#X connect 13 0 10 0; +#X connect 14 0 10 0; #X connect 14 0 11 0; -#X connect 15 0 11 0; -#X connect 15 0 12 0; -#X connect 15 0 13 0; -#X connect 16 0 15 0; -#X connect 18 0 6 1; -#X connect 18 0 12 0; +#X connect 14 0 12 0; +#X connect 15 0 14 0; +#X connect 17 0 6 1; +#X connect 17 0 11 0; diff --git a/doc/3.audio.examples/J04.corners.pd b/doc/3.audio.examples/J04.corners.pd index 41cdc7e1..dc69d64d 100644 --- a/doc/3.audio.examples/J04.corners.pd +++ b/doc/3.audio.examples/J04.corners.pd @@ -7,7 +7,6 @@ #X coords 0 0.25 881 -0.25 200 130 1; #X restore 447 121 graph; #X text 446 259 ---- 0.02 seconds ----; -#X text 457 696 updated for Pd version 0.39; #X obj 293 500 output~; #X obj 339 470 tabwrite~ \$0-sum; #X obj 136 151 -~; @@ -57,47 +56,47 @@ #X obj 491 25 declare -stdpath ./; #X text 46 645 In general \, the segments of the result will be curved \, but if the three magnitudes sum algebraically to zero \, the segments will be linear. Note the reduced scale of the graph (from -0.25 to 0.25) compared to the previous examples., f 87; #X connect 0 0 1 0; -#X connect 1 0 38 0; -#X connect 1 0 38 1; -#X connect 7 0 0 0; -#X connect 8 0 7 1; -#X connect 9 0 8 0; -#X connect 10 0 12 1; -#X connect 11 0 10 0; -#X connect 12 0 31 0; -#X connect 13 0 14 0; -#X connect 14 0 39 0; -#X connect 14 0 39 1; -#X connect 15 0 13 0; -#X connect 16 0 15 1; -#X connect 17 0 16 0; -#X connect 18 0 20 1; -#X connect 19 0 18 0; -#X connect 20 0 31 1; -#X connect 21 0 22 0; -#X connect 22 0 40 0; -#X connect 22 0 40 1; -#X connect 23 0 21 0; -#X connect 24 0 23 1; -#X connect 25 0 24 0; -#X connect 26 0 28 1; -#X connect 27 0 26 0; -#X connect 28 0 32 1; -#X connect 31 0 32 0; -#X connect 32 0 6 0; -#X connect 32 0 5 0; -#X connect 33 0 34 0; +#X connect 1 0 37 0; +#X connect 1 0 37 1; +#X connect 6 0 0 0; +#X connect 7 0 6 1; +#X connect 8 0 7 0; +#X connect 9 0 11 1; +#X connect 10 0 9 0; +#X connect 11 0 30 0; +#X connect 12 0 13 0; +#X connect 13 0 38 0; +#X connect 13 0 38 1; +#X connect 14 0 12 0; +#X connect 15 0 14 1; +#X connect 16 0 15 0; +#X connect 17 0 19 1; +#X connect 18 0 17 0; +#X connect 19 0 30 1; +#X connect 20 0 21 0; +#X connect 21 0 39 0; +#X connect 21 0 39 1; +#X connect 22 0 20 0; +#X connect 23 0 22 1; +#X connect 24 0 23 0; +#X connect 25 0 27 1; +#X connect 26 0 25 0; +#X connect 27 0 31 1; +#X connect 30 0 31 0; +#X connect 31 0 5 0; +#X connect 31 0 4 0; +#X connect 32 0 33 0; +#X connect 33 0 5 0; #X connect 34 0 6 0; -#X connect 35 0 7 0; -#X connect 35 0 15 0; -#X connect 35 0 23 0; -#X connect 36 0 35 0; -#X connect 38 0 41 0; +#X connect 34 0 14 0; +#X connect 34 0 22 0; +#X connect 35 0 34 0; +#X connect 37 0 40 0; +#X connect 38 0 42 0; #X connect 39 0 43 0; -#X connect 40 0 44 0; -#X connect 41 0 42 0; -#X connect 42 0 12 0; +#X connect 40 0 41 0; +#X connect 41 0 11 0; +#X connect 42 0 44 0; #X connect 43 0 45 0; -#X connect 44 0 46 0; -#X connect 45 0 20 0; -#X connect 46 0 28 0; +#X connect 44 0 19 0; +#X connect 45 0 27 0; diff --git a/doc/3.audio.examples/J05.triangle.pd b/doc/3.audio.examples/J05.triangle.pd index de7ea4c3..558da6e8 100644 --- a/doc/3.audio.examples/J05.triangle.pd +++ b/doc/3.audio.examples/J05.triangle.pd @@ -5,7 +5,6 @@ #X coords 0 0.5 881 -0.5 200 130 1; #X restore 336 128 graph; #X text 357 266 ---- 0.02 seconds ----; -#X text 366 595 updated for Pd version 0.39; #X obj 179 366 output~; #X obj 233 337 tabwrite~ \$0-sum; #X obj 172 137 / 100; @@ -30,18 +29,18 @@ #X text 37 24 MAKING WAVEFORMS WITH CORNERS BY SPECIFYING LINE SEGMENT SLOPES, f 63; #X obj 430 69 declare -stdpath ./; #X text 51 441 Occasionally a second method for making corners is more convenient. Here we specify the slopes of the rising and falling segments (as always \, in units per cycle). We then make a triangle wave with a corner at (0 \, 0) and another one \, placed somewhere within the cycle. The slopes of the two lines determine the second point \, which will have an x value of t/(s+t) (if we let 's' denote the rising slope and 't' the falling one \, both as positive numbers). The y value is st/(s+t). If we wish instead to specify the corner location (x \, y) (with x in cycles \, 0 Date: Tue, 16 Jul 2024 16:23:59 +0200 Subject: [PATCH 42/89] prevent out-of-bounds read in 'upsampling_perform_linear' Closes: https://github.com/pure-data/pure-data/issues/2343 --- src/d_resample.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_resample.c b/src/d_resample.c index 5d834d2b..3fc1222a 100644 --- a/src/d_resample.c +++ b/src/d_resample.c @@ -89,7 +89,7 @@ t_int *upsampling_perform_linear(t_int *w) if (frac==0.)frac=1.; *out++ = frac * b + (1.-frac) * a; fp = in+index; - b=*fp; + b=(index Date: Tue, 16 Jul 2024 15:53:12 -0300 Subject: [PATCH 43/89] use [cnv] for audio example titles closes https://github.com/pure-data/pddp/issues/234 --- doc/3.audio.examples/A00.intro.pd | 16 +- doc/3.audio.examples/A01.sinewave.pd | 60 +++--- doc/3.audio.examples/A02.amplitude.pd | 22 +- doc/3.audio.examples/A03.line.pd | 42 ++-- doc/3.audio.examples/A04.line2.pd | 80 +++---- doc/3.audio.examples/A05.output.subpatch.pd | 8 +- doc/3.audio.examples/A06.frequency.pd | 10 +- doc/3.audio.examples/A07.fusion.pd | 78 +++---- doc/3.audio.examples/A08.beating.pd | 36 ++-- doc/3.audio.examples/A09.frequency.mod.pd | 66 +++--- doc/3.audio.examples/A10.review.pd | 80 +++---- doc/3.audio.examples/B01.wavetables.pd | 42 ++-- doc/3.audio.examples/B02.two-wavetables.pd | 12 +- doc/3.audio.examples/B03.tabread4.pd | 76 +++---- .../B04.tabread4.interpolation.pd | 8 +- doc/3.audio.examples/B05.tabread.FM.pd | 12 +- doc/3.audio.examples/B06.table.switching.pd | 44 ++-- doc/3.audio.examples/B07.sampler.pd | 76 +++---- doc/3.audio.examples/B08.sampler.loop.pd | 28 +-- .../B09.sampler.loop.smooth.pd | 80 +++---- doc/3.audio.examples/B10.sampler.scratch.pd | 24 +-- doc/3.audio.examples/B11.sampler.nodoppler.pd | 46 ++-- doc/3.audio.examples/B12.sampler.transpose.pd | 162 +++++++------- doc/3.audio.examples/B13.sampler.overlap.pd | 200 ++++++++--------- .../B14.sampler.rockafella.pd | 120 +++++------ doc/3.audio.examples/B15.tabread4~-onset.pd | 64 +++--- doc/3.audio.examples/B16.long-varispeed.pd | 154 ++++++------- doc/3.audio.examples/C01.nyquist.pd | 50 ++--- doc/3.audio.examples/C02.sawtooth-foldover.pd | 50 ++--- doc/3.audio.examples/C03.zipper.noise.pd | 80 +++---- doc/3.audio.examples/C04.control.to.signal.pd | 40 ++-- doc/3.audio.examples/C05.sampler.oneshot.pd | 60 +++--- doc/3.audio.examples/C06.signal.to.control.pd | 30 +-- doc/3.audio.examples/C07.envelope.follower.pd | 76 +++---- doc/3.audio.examples/C08.analog.sequencer.pd | 68 +++--- doc/3.audio.examples/C09.sample.hold.pd | 46 ++-- doc/3.audio.examples/C10.monophonic.synth.pd | 118 +++++----- doc/3.audio.examples/D01.envelope.gen.pd | 72 +++---- doc/3.audio.examples/D02.adsr.pd | 18 +- doc/3.audio.examples/D03.envelope.dB.pd | 60 +++--- doc/3.audio.examples/D04.envelope.quartic.pd | 8 +- doc/3.audio.examples/D05.envelope.pitch.pd | 74 +++---- .../D06.envelope.portamento.pd | 84 ++++---- doc/3.audio.examples/D07.additive.pd | 66 +++--- doc/3.audio.examples/D08.table.spectrum.pd | 50 ++--- doc/3.audio.examples/D09.shepard.tone.pd | 4 +- doc/3.audio.examples/D10.sampler.notes.pd | 98 ++++----- doc/3.audio.examples/D11.sampler.poly.pd | 56 ++--- doc/3.audio.examples/D12.sampler.bis.pd | 166 +++++++------- doc/3.audio.examples/D13.additive.qlist.pd | 46 ++-- doc/3.audio.examples/D14.vibrato.pd | 4 +- doc/3.audio.examples/E01.spectrum.pd | 28 +-- doc/3.audio.examples/E02.ring.modulation.pd | 155 +++++++------ doc/3.audio.examples/E03.octave.divider.pd | 14 +- doc/3.audio.examples/E04.difference.tone.pd | 26 +-- doc/3.audio.examples/E05.chebychev.pd | 98 ++++----- doc/3.audio.examples/E06.exponential.pd | 2 +- doc/3.audio.examples/E07.evenodd.pd | 14 +- doc/3.audio.examples/E08.phase.mod.pd | 20 +- doc/3.audio.examples/E09.FM.spectrum.pd | 96 ++++----- doc/3.audio.examples/E10.complex.FM.pd | 32 +-- doc/3.audio.examples/F01.pulse.pd | 36 ++-- doc/3.audio.examples/F02.just.say.pd | 67 +++--- doc/3.audio.examples/F03.pulse.spectrum.pd | 18 +- doc/3.audio.examples/F04.waveshaping.pulse.pd | 100 ++++----- doc/3.audio.examples/F05.ring.modulation.pd | 18 +- doc/3.audio.examples/F06.packets.pd | 18 +- doc/3.audio.examples/F07.packet.spectrum.pd | 6 +- doc/3.audio.examples/F08.two.cosines.pd | 76 +++---- doc/3.audio.examples/F09.declickit.pd | 46 ++-- doc/3.audio.examples/F10.sweepable.FM.pd | 142 ++++++------ doc/3.audio.examples/F11.anharmonic.FM.pd | 84 ++++---- doc/3.audio.examples/F12.paf.pd | 120 +++++------ doc/3.audio.examples/F13.paf.control.pd | 132 ++++++------ doc/3.audio.examples/F14.wave.packet.pd | 174 +++++++-------- doc/3.audio.examples/G01.delay.pd | 20 +- doc/3.audio.examples/G02.delay.loop.pd | 26 +-- doc/3.audio.examples/G03.delay.variable.pd | 114 +++++----- doc/3.audio.examples/G04.control.blocksize.pd | 64 +++--- doc/3.audio.examples/G05.execution.order.pd | 56 ++--- doc/3.audio.examples/G06.octave.doubler.pd | 108 +++++----- doc/3.audio.examples/G07.shaker.pd | 50 ++--- doc/3.audio.examples/G08.reverb.pd | 16 +- doc/3.audio.examples/G09.pitchshift.pd | 204 +++++++++--------- doc/3.audio.examples/H01.low-pass.pd | 42 ++-- doc/3.audio.examples/H02.high-pass.pd | 62 +++--- doc/3.audio.examples/H03.band-pass.pd | 4 +- doc/3.audio.examples/H04.filter.sweep.pd | 26 +-- doc/3.audio.examples/H05.filter.floyd.pd | 128 +++++------ doc/3.audio.examples/H06.envelope.follower.pd | 110 +++++----- doc/3.audio.examples/H07.measure.spectrum.pd | 88 ++++---- doc/3.audio.examples/H08.heterodyning.pd | 116 +++++----- doc/3.audio.examples/H09.ssb.modulation.pd | 56 ++--- doc/3.audio.examples/H10.measurement.pd | 70 +++--- doc/3.audio.examples/H11.shelving.pd | 26 +-- doc/3.audio.examples/H12.peaking.pd | 50 ++--- doc/3.audio.examples/H13.butterworth.pd | 20 +- doc/3.audio.examples/H14.all.pass.pd | 46 ++-- doc/3.audio.examples/H15.phaser.pd | 76 +++---- doc/3.audio.examples/H16.adsr.filter.qlist.pd | 6 +- doc/3.audio.examples/I01.Fourier.analysis.pd | 89 ++++---- doc/3.audio.examples/I02.Hann.window.pd | 94 ++++---- doc/3.audio.examples/I03.resynthesis.pd | 8 +- doc/3.audio.examples/I04.noisegate.pd | 62 +++--- doc/3.audio.examples/I05.compressor.pd | 46 ++-- doc/3.audio.examples/I06.timbre.stamp.pd | 70 +++--- doc/3.audio.examples/I07.phase.vocoder.pd | 112 +++++----- doc/3.audio.examples/I08.pvoc.reverb.pd | 54 ++--- doc/3.audio.examples/I09.sheep.from.goats.pd | 42 ++-- doc/3.audio.examples/I10.phase.bash.pd | 132 ++++++------ doc/3.audio.examples/J01.even.odd.pd | 10 +- doc/3.audio.examples/J02.trapezoids.pd | 80 +++---- doc/3.audio.examples/J03.pulse.width.mod.pd | 40 ++-- doc/3.audio.examples/J04.corners.pd | 182 ++++++++-------- doc/3.audio.examples/J05.triangle.pd | 54 ++--- doc/3.audio.examples/J06.enveloping.pd | 136 ++++++------ doc/3.audio.examples/J07.oversampling.pd | 33 ++- doc/3.audio.examples/J08.classicsynth.pd | 68 +++--- doc/3.audio.examples/J09.bandlimited.pd | 10 +- 119 files changed, 3749 insertions(+), 3749 deletions(-) diff --git a/doc/3.audio.examples/A00.intro.pd b/doc/3.audio.examples/A00.intro.pd index 6492b4d6..b7bd2c8c 100644 --- a/doc/3.audio.examples/A00.intro.pd +++ b/doc/3.audio.examples/A00.intro.pd @@ -1,8 +1,8 @@ -#N canvas 614 38 549 415 12; -#X text 90 27 INTRODUCTION TO THE PD AUDIO EXAMPLE PATCHES; -#X msg 146 218 browse http://msp.ucsd.edu/techniques.htm; -#X obj 146 252 pdcontrol; -#X text 37 66 This is the second of three tutorial series on Pd. This one shows the time and frequency domain audio processing features. (The first one showed how to use Pd to do "control" computations \, and the third is about data structures.), f 67; -#X text 36 135 These patches are accompanied by an ONLINE BOOK \, which develops the underlying theory at . Click on the message below to open it., f 67; -#X text 60 308 Note \, however \, that the examples here on this version of Pd are a bit more up to date with the more recent features. The link above carries a download for the exact example files that were used on the book., f 65; -#X connect 1 0 2 0; +#N canvas 614 38 568 450 12; +#X msg 152 217 browse http://msp.ucsd.edu/techniques.htm; +#X obj 152 251 pdcontrol; +#X text 48 66 This is the second of three tutorial series on Pd. This one shows the time and frequency domain audio processing features. (The first one showed how to use Pd to do "control" computations \, and the third is about data structures.), f 67; +#X text 47 135 These patches are accompanied by an ONLINE BOOK \, which develops the underlying theory at . Click on the message below to open it., f 67; +#X text 57 303 Note \, however \, that the book was designed for an older version of Pd. The examples here part of this version of Pd are more up to date and include more recent features and functionalities \, so they are somewhat different from the book's examples. Nonetheless \, the link above carries a download for the exact example files that were used on the book. One way or another \, these more up to date examples should correspond to the theory presented in the book without significant conflicts., f 66; +#X obj 49 17 cnv 5 5 25 empty empty Introduction\ to\ the\ Pd\ Audio\ Example\ Patches 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 1 0; diff --git a/doc/3.audio.examples/A01.sinewave.pd b/doc/3.audio.examples/A01.sinewave.pd index 88c28cbc..d340d3c2 100644 --- a/doc/3.audio.examples/A01.sinewave.pd +++ b/doc/3.audio.examples/A01.sinewave.pd @@ -1,32 +1,32 @@ -#N canvas 619 38 527 752 12; -#X obj 129 128 osc~ 440; -#X obj 129 187 dac~; -#X obj 129 157 *~ 0.05; -#X text 168 12 MAKING A SINE WAVE; -#X msg 163 324 \; pd dsp 1; -#X msg 163 365 \; pd dsp 0; -#X text 229 331 ON; -#X text 233 372 OFF; -#X text 55 442 You should see the Pd window change to reflect whether audio is on or off. You can also turn audio on and off using the "audio" menu \, but the buttons are provided as a shortcut.; -#X text 56 560 In general when you start a work session with Pd \, you will want to choose "test audio and MIDI" from the help window \, which opens a more comprehensive test patch than this one., f 60; -#X text 44 43 Audio computation in Pd is done using "tilde objects" such as the three below. They use continuous audio streams to intercommunicate \, as well as communicating with other ("control") Pd objects using messages.; -#X obj 327 651 ../5.reference/set-dsp-tgl; -#X text 328 630 DSP on/off; -#X msg 327 688 \; pd dsp \$1; -#X text 363 655 <-- open abstraction; -#X text 80 336 click these -->, f 9; -#X obj 298 378 send pd; -#X text 71 246 Audio computation can be turned on and off by sending messages to the global "pd" object either via a message box or a [send] object as follows:, f 55; -#X msg 298 319 dsp 1; -#X msg 311 348 dsp 0; -#X text 361 336 <-- or these; -#X text 56 494 When DSP is on \, you should hear a tone whose pitch is middle A (440 Hz) and whose amplitude is 0.05. If instead you are greeted with silence \, you might want to read the HTML documentation on setting up audio.; -#X text 199 127 <-- 440 Hz. sine wave at full blast; -#X text 199 156 <-- reduce amplitude to 0.05; -#X text 171 187 <-- send to the audio output device (left channel only), f 28; -#X text 56 642 These examples also use a helper abstraction with a toggle switch control from the documentation help files of Pd. Check it to the right and see how the toggle shows the DSP state., f 35; +#N canvas 619 38 546 788 12; +#X obj 129 148 osc~ 440; +#X obj 129 207 dac~; +#X obj 129 177 *~ 0.05; +#X msg 163 344 \; pd dsp 1; +#X msg 163 385 \; pd dsp 0; +#X text 229 351 ON; +#X text 233 392 OFF; +#X text 55 452 You should see the Pd window change to reflect whether audio is on or off. You can also turn audio on and off using the "audio" menu \, but the buttons are provided as a shortcut.; +#X text 56 570 In general when you start a work session with Pd \, you will want to choose "test audio and MIDI" from the help window \, which opens a more comprehensive test patch than this one., f 60; +#X text 44 63 Audio computation in Pd is done using "tilde objects" such as the three below. They use continuous audio streams to intercommunicate \, as well as communicating with other ("control") Pd objects using messages.; +#X obj 257 659 ../5.reference/set-dsp-tgl; +#X text 258 638 DSP on/off; +#X msg 257 718 \; pd dsp \$1; +#X text 80 356 click these -->, f 9; +#X obj 298 398 send pd; +#X text 71 266 Audio computation can be turned on and off by sending messages to the global "pd" object either via a message box or a [send] object as follows:, f 55; +#X msg 298 339 dsp 1; +#X msg 311 368 dsp 0; +#X text 361 356 <-- or these; +#X text 56 504 When DSP is on \, you should hear a tone whose pitch is middle A (440 Hz) and whose amplitude is 0.05. If instead you are greeted with silence \, you might want to read the HTML documentation on setting up audio.; +#X text 199 147 <-- 440 Hz. sine wave at full blast; +#X text 199 176 <-- reduce amplitude to 0.05; +#X text 171 207 <-- send to the audio output device (left channel only), f 28; +#X text 34 642 These examples also use a helper abstraction with a toggle switch control from the documentation help files of Pd. Check it to the right and see how the toggle shows the DSP state., f 28; +#X obj 138 17 cnv 5 5 25 empty empty Making\ a\ Sine\ Wave 15 13 0 16 #dfdfdf #202020 0; +#X text 293 663 <-- click to turn DSP on/off. Right click to open and check abstraction, f 30; #X connect 0 0 2 0; #X connect 2 0 1 0; -#X connect 11 0 13 0; -#X connect 18 0 16 0; -#X connect 19 0 16 0; +#X connect 10 0 12 0; +#X connect 16 0 14 0; +#X connect 17 0 14 0; diff --git a/doc/3.audio.examples/A02.amplitude.pd b/doc/3.audio.examples/A02.amplitude.pd index 3d1f1d92..fbe2574e 100644 --- a/doc/3.audio.examples/A02.amplitude.pd +++ b/doc/3.audio.examples/A02.amplitude.pd @@ -1,14 +1,13 @@ -#N canvas 614 76 546 638 12; +#N canvas 614 76 546 634 12; #X obj 83 141 osc~ 440; #X obj 71 360 dac~; -#X text 75 56 CONTROLLING AMPLITUDE; #X obj 83 278 *~ 0; #X floatatom 108 241 8 0 0 0 - - - 0; #X obj 108 208 dbtorms; #X floatatom 108 176 8 0 80 0 - - - 0; -#X obj 325 37 ../5.reference/set-dsp-tgl; -#X text 356 40 DSP on/off; -#X msg 325 74 \; pd dsp \$1; +#X obj 372 35 ../5.reference/set-dsp-tgl; +#X text 403 38 DSP on/off; +#X msg 372 72 \; pd dsp \$1; #X text 150 140 <-- 440 Hz sine wave at full blast; #X text 174 175 <-- set amplitude here in dB; #X text 174 207 <-- this converts dB to linear units; @@ -18,10 +17,11 @@ #X text 46 405 Amplitudes of audio signals can have any reasonable range \, but when you output a signal via the [dac~] object \, the samples should range between -1 and +1. Values out of that range will be "clipped"., f 67; #X text 46 556 Pd assumes you have a two channel audio system unless you tell it otherwise. The [dac~] object \, by default \, connects to these two channels., f 67; #X text 46 463 Here we calculate a gain for the multiplier [*~] using a [dbtorms] object (acronym for "dB to RMS"). 100 dB is normalized to one \, and zero dB artificially outputs a true 0 amplitude. Hence \, decibels in Pd are basically dBFS with an offset of 100! The dBFS is usually considered in digital systems and 0 dB corresponds to one \, whereas a true zero amplitude value consists of minus infinity dB., f 67; -#X connect 0 0 3 0; -#X connect 3 0 1 0; -#X connect 3 0 1 1; -#X connect 4 0 3 1; +#X obj 54 52 cnv 5 5 25 empty empty Controlling\ Amplitude 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 2 0; +#X connect 2 0 1 0; +#X connect 2 0 1 1; +#X connect 3 0 2 1; +#X connect 4 0 3 0; #X connect 5 0 4 0; -#X connect 6 0 5 0; -#X connect 7 0 9 0; +#X connect 6 0 8 0; diff --git a/doc/3.audio.examples/A03.line.pd b/doc/3.audio.examples/A03.line.pd index 7b6ff3bc..fd22ab7b 100644 --- a/doc/3.audio.examples/A03.line.pd +++ b/doc/3.audio.examples/A03.line.pd @@ -11,22 +11,21 @@ #X msg 156 295 0; #X text 273 187 ON; #X text 302 276 OFF; -#X text 33 23 CONTROLLING AMPLITUDE USING LINE~; #X text 25 445 The left inlet of [line~] is a target value. It reaches that target in the time specified (in milliseconds) to its right inlet., f 67; #X text 25 481 (In this example \, message boxes with two numbers each are connected to [line~]'s left inlet. Except in some special cases \, Pd objects with more than one inlet will automatically distribute lists of numbers across their inlets. In this case \, "0 50" becomes \, "50 at right and 0 at left."), f 67; #X text 25 558 The [line~] object (and its control brother \, [line]) treat their right inlet specially. The inlets don't retain values the way other inlets do but revert to zero whenever a target is received., f 67; #X obj 362 127 ../5.reference/set-dsp-tgl; #X text 393 130 DSP on/off; #X msg 362 164 \; pd dsp \$1; -#X obj 649 244 hsl 162 19 0 1 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; -#X obj 646 303 pow 4; -#X obj 560 381 osc~ 440; -#X msg 646 365 \$1 10; -#X obj 646 397 line~; -#X obj 628 456 *~; -#X obj 628 510 dac~; -#X floatatom 646 272 10 0 0 0 - - - 0; -#X floatatom 646 335 11 0 0 0 - - - 0; +#X obj 628 304 hsl 162 19 0 1 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 625 363 pow 4; +#X obj 607 244 osc~ 440; +#X msg 625 425 \$1 10; +#X obj 625 457 line~; +#X obj 607 506 *~; +#X obj 607 560 dac~; +#X floatatom 625 332 10 0 0 0 - - - 0; +#X floatatom 625 395 11 0 0 0 - - - 0; #X text 150 132 <-- sine wave; #X text 176 165 <-- slow; #X text 173 189 <-- fast; @@ -40,9 +39,10 @@ #X text 113 361 <----; #X text 123 405 <-- out; #X text 32 57 In this patch \, the multiplier is configured to multiply two signals. The amplitude is now a signal computed by the [line~] object \, which provides a smoothened ramp., f 62; -#X text 528 31 Below use a slider that generates values from 0 to 1 \, which passes through a quartic function (by going through [pow 4]). This non linear function is better suited for the way we perceive amplitudes. The value is then combined in a message by assuming the value of the '\$1' variable into a list followed by 10 \, which means that changes to the slider are smoothened by a 10 ms audio ramp! This mechanism is used in an [output~] abstraction presented later., f 43; -#X text 724 273 <-- linear; -#X text 730 335 <-- quartic; +#X text 507 51 Below use a slider that generates values from 0 to 1 \, which passes through a quartic function (by going through [pow 4]). This non linear function is better suited for the way we perceive amplitudes. The value is then combined in a message by assuming the value of the '\$1' variable into a list followed by 10 \, which means that changes to the slider are smoothened by a 10 ms audio ramp! This mechanism is used in an [output~] abstraction presented later., f 43; +#X text 703 333 <-- linear; +#X text 709 395 <-- quartic; +#X obj 48 15 cnv 5 5 25 empty empty Controlling\ Amplitude\ using\ [line~] 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 2 0; #X connect 2 0 1 0; #X connect 2 0 1 1; @@ -53,13 +53,13 @@ #X connect 7 0 3 0; #X connect 8 0 3 0; #X connect 9 0 3 0; -#X connect 16 0 18 0; +#X connect 15 0 17 0; +#X connect 18 0 25 0; #X connect 19 0 26 0; -#X connect 20 0 27 0; -#X connect 21 0 24 0; -#X connect 22 0 23 0; +#X connect 20 0 23 0; +#X connect 21 0 22 0; +#X connect 22 0 23 1; +#X connect 23 0 24 0; #X connect 23 0 24 1; -#X connect 24 0 25 0; -#X connect 24 0 25 1; -#X connect 26 0 20 0; -#X connect 27 0 22 0; +#X connect 25 0 19 0; +#X connect 26 0 21 0; diff --git a/doc/3.audio.examples/A04.line2.pd b/doc/3.audio.examples/A04.line2.pd index 675e9fad..bf6df909 100644 --- a/doc/3.audio.examples/A04.line2.pd +++ b/doc/3.audio.examples/A04.line2.pd @@ -1,51 +1,51 @@ -#N canvas 353 38 833 719 12; -#X obj 110 77 osc~ 440; -#X obj 110 327 dac~; -#X obj 110 245 *~; -#X obj 128 192 line~; -#X text 140 7 LINES GRAPHED; -#X obj 202 92 r graphit; -#X obj 128 161 r to-line; +#N canvas 429 73 825 757 12; +#X obj 110 117 osc~ 440; +#X obj 110 367 dac~; +#X obj 110 285 *~; +#X obj 128 232 line~; +#X obj 202 132 r graphit; +#X obj 128 201 r to-line; #N canvas 0 22 450 278 (subpatch) 0; #X array product 44100 float 0; #X coords 0 1.02 44100 -1.02 200 130 1; -#X restore 573 376 graph; +#X restore 573 416 graph; #N canvas 0 22 450 278 (subpatch) 0; #X array oscillator 44100 float 0; #X coords 0 1.02 44100 -1.02 200 130 1 0 0; -#X restore 573 46 graph; +#X restore 573 86 graph; #N canvas 0 22 450 278 (subpatch) 0; #X array line-output 44100 float 0; #X coords 0 1.02 44100 -1.02 200 130 1; -#X restore 573 211 graph; -#X obj 110 292 *~ 0.1; -#X obj 214 230 tabwrite~ line-output; -#X obj 202 290 tabwrite~ product; -#X text 74 379 ramp up; -#X text 227 379 ramp down; -#X text 398 379 to 1/2; -#X text 597 518 ------ 1 second ------; -#X obj 222 137 tabwrite~ oscillator; -#X text 31 33 Here again is a [line~] controlling the amplitude of an [osc~] \, but with the outputs graphed:, f 63; -#X text 33 478 Click the message boxes above to try it. Note that in the first two boxes \, the [line~] objects get two messages. The first one \, with no time value \, causes the [line~] to jump immediately to the value. The third box takes [line~]'s previous value as a point of departure. What you see will depend on which box you last clicked and how long you waited between the two., f 68; -#X obj 413 269 ../5.reference/set-dsp-tgl; -#X text 444 272 DSP on/off; -#X msg 413 306 \; pd dsp \$1; -#X msg 42 403 \; to-line 0 \, 1 500 \; graphit bang; -#X msg 202 403 \; to-line 1 \, 0 500 \; graphit bang; -#X msg 367 403 \; to-line 0.5 1000 \; graphit bang; -#X text 153 328 <-- out; -#X text 31 571 On very old machines you may hear an interruption in the sound one second after you click on the first or third box. This is because the graphical updates are likely to eat more CPU time than your audio buffer has pre-buffered for. You can avoid this if you keep your graphs in sub-windows and open them only when you need them. In some future version of Pd this behavior will be improved. Until then \, you'll have to avoid having arrays getting re-drawn during music performances., f 68; +#X restore 573 251 graph; +#X obj 110 332 *~ 0.1; +#X obj 214 270 tabwrite~ line-output; +#X obj 202 330 tabwrite~ product; +#X text 74 419 ramp up; +#X text 227 419 ramp down; +#X text 398 419 to 1/2; +#X text 597 558 ------ 1 second ------; +#X obj 222 177 tabwrite~ oscillator; +#X text 31 73 Here again is a [line~] controlling the amplitude of an [osc~] \, but with the outputs graphed:, f 63; +#X text 33 518 Click the message boxes above to try it. Note that in the first two boxes \, the [line~] objects get two messages. The first one \, with no time value \, causes the [line~] to jump immediately to the value. The third box takes [line~]'s previous value as a point of departure. What you see will depend on which box you last clicked and how long you waited between the two., f 68; +#X obj 413 309 ../5.reference/set-dsp-tgl; +#X text 444 312 DSP on/off; +#X msg 413 346 \; pd dsp \$1; +#X msg 42 443 \; to-line 0 \, 1 500 \; graphit bang; +#X msg 202 443 \; to-line 1 \, 0 500 \; graphit bang; +#X msg 367 443 \; to-line 0.5 1000 \; graphit bang; +#X text 153 368 <-- out; +#X text 31 611 On very old machines you may hear an interruption in the sound one second after you click on the first or third box. This is because the graphical updates are likely to eat more CPU time than your audio buffer has pre-buffered for. You can avoid this if you keep your graphs in sub-windows and open them only when you need them. In some future version of Pd this behavior will be improved. Until then \, you'll have to avoid having arrays getting re-drawn during music performances., f 68; +#X obj 78 28 cnv 5 5 25 empty empty [line~]\ objects\ graphed 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 2 0; -#X connect 0 0 17 0; -#X connect 2 0 10 0; -#X connect 2 0 12 0; +#X connect 0 0 16 0; +#X connect 2 0 9 0; +#X connect 2 0 11 0; #X connect 3 0 2 1; -#X connect 3 0 11 0; -#X connect 5 0 17 0; -#X connect 5 0 11 0; -#X connect 5 0 12 0; -#X connect 6 0 3 0; -#X connect 10 0 1 0; -#X connect 10 0 1 1; -#X connect 20 0 22 0; +#X connect 3 0 10 0; +#X connect 4 0 16 0; +#X connect 4 0 10 0; +#X connect 4 0 11 0; +#X connect 5 0 3 0; +#X connect 9 0 1 0; +#X connect 9 0 1 1; +#X connect 19 0 21 0; diff --git a/doc/3.audio.examples/A05.output.subpatch.pd b/doc/3.audio.examples/A05.output.subpatch.pd index 6f0ab66c..7711269c 100644 --- a/doc/3.audio.examples/A05.output.subpatch.pd +++ b/doc/3.audio.examples/A05.output.subpatch.pd @@ -1,6 +1,5 @@ #N canvas 452 47 568 532 12; #X declare -stdpath ./; -#X text 231 24 CONTROLLING OUTPUT AMPLITUDE; #X obj 66 54 osc~ 440; #X obj 84 85 osc~ 550; #X obj 102 117 osc~ 660; @@ -14,8 +13,9 @@ #X text 180 86 <-- Here we make an A major triad as a test signal., f 28; #X text 200 183 <--; #X text 230 184 this is an abstraction - right click on it and select "open" to see inside. Also select 'help' for more information, f 39; -#X connect 1 0 4 0; +#X obj 196 24 cnv 5 5 25 empty empty Controlling\ output\ amplitude 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 3 0; +#X connect 1 0 3 1; #X connect 2 0 4 1; -#X connect 3 0 5 1; +#X connect 3 0 4 0; #X connect 4 0 5 0; -#X connect 5 0 6 0; diff --git a/doc/3.audio.examples/A06.frequency.pd b/doc/3.audio.examples/A06.frequency.pd index 25ace666..3b17f5ac 100644 --- a/doc/3.audio.examples/A06.frequency.pd +++ b/doc/3.audio.examples/A06.frequency.pd @@ -19,7 +19,6 @@ #X obj 52 206 s pitch; #X obj 52 177 ftom; #X text 472 389 ---- 0.1 seconds ----; -#X text 97 20 FREQUENCY AND PITCH; #X text 85 588 Note also the "set" messages going to the number boxes so that they can each update the other without bringing on an infinite loop. (get help on number boxes for details.), f 70; #X text 152 195 to "MIDI" pitch; #X obj 106 354 output~; @@ -35,9 +34,10 @@ #X text 85 485 Frequency and pitch are converted using the [ftom] and [mtof] objects. Frequency refers to the number of cycles per second. Pitch is "60" for Middle C \, 61 for C sharp \, 72 for the next C up \, and so on., f 70; #X text 85 537 [mtof] and [ftom] work fine for microtones (non-integral "MIDI pitch") and don't have MIDI's range restriction - for example \, MIDI -36 is about 1 Hz., f 70; #X text 190 286 <-- bang button \, click to graph; +#X obj 79 18 cnv 5 5 25 empty empty Frequency\ and\ Pitch 15 13 0 16 #dfdfdf #202020 0; #X connect 2 0 10 0; #X connect 2 0 11 0; -#X connect 3 0 20 0; +#X connect 3 0 19 0; #X connect 4 0 2 0; #X connect 5 0 8 0; #X connect 5 0 14 0; @@ -46,6 +46,6 @@ #X connect 9 0 4 0; #X connect 11 0 12 0; #X connect 14 0 13 0; -#X connect 20 0 1 0; -#X connect 20 0 19 0; -#X connect 26 0 1 0; +#X connect 19 0 1 0; +#X connect 19 0 18 0; +#X connect 25 0 1 0; diff --git a/doc/3.audio.examples/A07.fusion.pd b/doc/3.audio.examples/A07.fusion.pd index 8a8ab900..69e684d5 100644 --- a/doc/3.audio.examples/A07.fusion.pd +++ b/doc/3.audio.examples/A07.fusion.pd @@ -1,44 +1,44 @@ #N canvas 468 38 676 735 12; #X declare -stdpath ./; -#X floatatom 133 98 5 0 0 0 - - - 0; -#X obj 133 124 mtof; -#X obj 92 396 output~; -#X msg 133 72 60; -#X obj 91 190 osc~; -#X obj 133 166 * 2; -#X obj 133 190 osc~; -#X obj 197 190 osc~; -#X obj 197 166 * 3; -#X obj 261 190 osc~; -#X obj 261 166 * 4; -#X obj 197 215 *~ 0.2; -#X obj 92 325 +~; -#X obj 133 295 *~; -#X obj 168 296 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 133 246 +~; -#X obj 133 270 +~; +#X floatatom 133 134 5 0 0 0 - - - 0; +#X obj 133 160 mtof; +#X obj 92 432 output~; +#X msg 133 108 60; +#X obj 91 226 osc~; +#X obj 133 202 * 2; +#X obj 133 226 osc~; +#X obj 197 226 osc~; +#X obj 197 202 * 3; +#X obj 261 226 osc~; +#X obj 261 202 * 4; +#X obj 197 251 *~ 0.2; +#X obj 92 361 +~; +#X obj 133 331 *~; +#X obj 168 332 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 133 282 +~; +#X obj 133 306 +~; #N canvas 0 0 450 300 (subpatch) 0; #X array fusion 882 float 0; #X coords 0 1.02 881 -1.02 200 130 1 0 0; -#X restore 417 261 graph; -#X text 320 165 frequencies of harmonics; -#X text 320 189 four oscillators; -#X text 324 214 adjust amplitudes; -#X text 168 269 add the three overtones together; -#X text 439 399 ---- 0.02 seconds ----; -#X obj 133 215 *~ 0.1; -#X obj 261 215 *~ 0.5; -#X text 77 9 ADDING SINUSOIDS TO MAKE A COMPLEX TONE; -#X obj 489 56 declare -stdpath ./; -#X obj 138 330 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X text 163 330 <-- click to graph; -#X text 188 295 <-- overtones ON/OFF; -#X text 169 72 <-- reset to middle C; -#X obj 133 44 loadbang; -#X text 176 99 <-- choose a different pitch; -#X text 70 487 A simple way to build non-sinusoidal \, periodic musical tones is to sum a series of harmonically tuned sinusoids. Here the four oscillators have frequencies in a 1:2:3:4 ratio (the three [*] objects compute the second \, third \, and fourth one). The amplitudes are adjusted by the [*~ 0.1] \, etc. \, objects. Note that \, since the frequency (from [mtof]) is a message \, a [*] box suffices to operate on it \, but the oscillator's output \, being an audio signal \, needs [*~] instead. The control marked "overtones ON/OFF" is a toggle switch. Click to turn it on and off. Of the overtones are "off" you hear only a sinusoid from the first oscillator. If on \, you hear all four., f 74; -#X text 70 623 To hear the output \, choose a pitch (at top) \, optionally click the "overtones" control \, and mouse up the output volume. Click the "bang" button to graph it., f 74; -#X obj 138 360 tabwrite~ fusion; +#X restore 417 297 graph; +#X text 320 201 frequencies of harmonics; +#X text 320 225 four oscillators; +#X text 324 250 adjust amplitudes; +#X text 168 305 add the three overtones together; +#X text 439 435 ---- 0.02 seconds ----; +#X obj 133 251 *~ 0.1; +#X obj 261 251 *~ 0.5; +#X obj 489 92 declare -stdpath ./; +#X obj 138 366 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X text 163 366 <-- click to graph; +#X text 188 331 <-- overtones ON/OFF; +#X text 169 108 <-- reset to middle C; +#X obj 133 80 loadbang; +#X text 176 135 <-- choose a different pitch; +#X text 70 523 A simple way to build non-sinusoidal \, periodic musical tones is to sum a series of harmonically tuned sinusoids. Here the four oscillators have frequencies in a 1:2:3:4 ratio (the three [*] objects compute the second \, third \, and fourth one). The amplitudes are adjusted by the [*~ 0.1] \, etc. \, objects. Note that \, since the frequency (from [mtof]) is a message \, a [*] box suffices to operate on it \, but the oscillator's output \, being an audio signal \, needs [*~] instead. The control marked "overtones ON/OFF" is a toggle switch. Click to turn it on and off. Of the overtones are "off" you hear only a sinusoid from the first oscillator. If on \, you hear all four., f 74; +#X text 70 659 To hear the output \, choose a pitch (at top) \, optionally click the "overtones" control \, and mouse up the output volume. Click the "bang" button to graph it., f 74; +#X obj 138 396 tabwrite~ fusion; +#X obj 79 18 cnv 5 5 25 empty empty Adding\ Sinusoids\ to\ make\ a\ Complex\ Tone 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 1 0; #X connect 1 0 4 0; #X connect 1 0 5 0; @@ -54,12 +54,12 @@ #X connect 10 0 9 0; #X connect 11 0 15 1; #X connect 12 0 2 0; -#X connect 12 0 35 0; +#X connect 12 0 34 0; #X connect 13 0 12 1; #X connect 14 0 13 1; #X connect 15 0 16 0; #X connect 16 0 13 0; #X connect 23 0 15 0; #X connect 24 0 16 1; -#X connect 27 0 35 0; -#X connect 31 0 3 0; +#X connect 26 0 34 0; +#X connect 30 0 3 0; diff --git a/doc/3.audio.examples/A08.beating.pd b/doc/3.audio.examples/A08.beating.pd index c333b936..280a8b9c 100644 --- a/doc/3.audio.examples/A08.beating.pd +++ b/doc/3.audio.examples/A08.beating.pd @@ -1,22 +1,22 @@ -#N canvas 473 38 538 623 12; +#N canvas 473 38 540 617 12; #X declare -stdpath ./; -#X obj 61 227 output~; -#X obj 61 191 +~; -#X obj 61 123 +~; -#X obj 186 118 +~; -#X obj 186 60 osc~ 440; -#X obj 61 60 osc~ 330; -#X obj 79 91 osc~ 330.2; -#X obj 204 91 osc~ 440.33; -#X obj 321 115 +~; -#X obj 321 60 osc~ 587; -#X obj 339 91 osc~ 587.25; -#X obj 61 160 +~; -#X text 118 14 Beating between closely tuned sinusoids; -#X text 43 305 In each of the three pairs of oscillators above \, the two frequencies are within 1/3 Hz or closer (for example \, the leftmost ones are close to 330 Hz but separated by 1/5 Hz.) The result is a gradual change in amplitude as the phases of the two slip against each other. This is called beating. More complex beating patterns may be made by using three or more oscillators. Also their amplitudes need not be equal (as they are here).; -#X text 40 499 In contrast to the previous example \, the oscillators are not tuned to the overtone series (ratios 1:2:3:4...) and so the frequencies 330 \, 440 \, and 587 are heard separately.; -#X obj 57 569 declare -stdpath ./; -#X text 41 432 They are all summed using [+~] objects. They could have been summed in any order ([+~] is commutative for practical purposes) but here they are added in pairs to emphasize the relationships between them.; +#X obj 68 248 output~; +#X obj 68 212 +~; +#X obj 68 144 +~; +#X obj 193 139 +~; +#X obj 193 81 osc~ 440; +#X obj 68 81 osc~ 330; +#X obj 86 112 osc~ 330.2; +#X obj 211 112 osc~ 440.33; +#X obj 328 136 +~; +#X obj 328 81 osc~ 587; +#X obj 346 112 osc~ 587.25; +#X obj 68 181 +~; +#X text 50 326 In each of the three pairs of oscillators above \, the two frequencies are within 1/3 Hz or closer (for example \, the leftmost ones are close to 330 Hz but separated by 1/5 Hz.) The result is a gradual change in amplitude as the phases of the two slip against each other. This is called beating. More complex beating patterns may be made by using three or more oscillators. Also their amplitudes need not be equal (as they are here).; +#X text 47 520 In contrast to the previous example \, the oscillators are not tuned to the overtone series (ratios 1:2:3:4...) and so the frequencies 330 \, 440 \, and 587 are heard separately.; +#X obj 236 265 declare -stdpath ./; +#X text 48 453 They are all summed using [+~] objects. They could have been summed in any order ([+~] is commutative for practical purposes) but here they are added in pairs to emphasize the relationships between them.; +#X obj 56 14 cnv 5 5 25 empty empty Beating\ between\ closely\ tuned\ sinusoids 15 13 0 16 #dfdfdf #202020 0; #X connect 1 0 0 0; #X connect 2 0 11 0; #X connect 3 0 11 1; diff --git a/doc/3.audio.examples/A09.frequency.mod.pd b/doc/3.audio.examples/A09.frequency.mod.pd index ca9456a0..9736726a 100644 --- a/doc/3.audio.examples/A09.frequency.mod.pd +++ b/doc/3.audio.examples/A09.frequency.mod.pd @@ -1,41 +1,41 @@ #N canvas 495 38 650 659 12; #X declare -stdpath ./; -#X obj 218 172 *~; -#X floatatom 218 87 5 0 0 0 - - - 0; -#X floatatom 148 132 5 0 0 0 - - - 0; -#X obj 148 202 +~; +#X obj 217 210 *~; +#X floatatom 217 125 5 0 0 0 - - - 0; +#X floatatom 147 170 5 0 0 0 - - - 0; +#X obj 147 240 +~; #N canvas 0 0 450 300 (subpatch) 0; #X array fm-output 441 float 0; #X coords 0 1.02 440 -1.02 200 130 1; -#X restore 401 97 graph; -#X obj 196 286 tabwrite~ fm-output; -#X floatatom 236 142 4 0 0 0 - - - 0; -#X text 123 89 carrier; -#X text 122 107 frequency; -#X text 203 63 frequency; -#X text 204 46 modulation; -#X text 64 13 FREQUENCY MODULATION ("FM") USING TWO OSCILLATORS; -#X obj 148 248 osc~; -#X text 56 230 "carrier"; -#X text 275 154 index; -#X text 277 135 modulation; -#X obj 218 112 osc~; -#X text 426 233 --- 0.01 seconds ----; -#X text 61 489 To get the FM sound \, set all three of carrier frequency \, modulation frequency \, and modulation index in the hundreds. Note that you get a timbral change as you sweep modulation index \, because this changes the amplitudes of the components of the output sound but not their frequencies., f 71; -#X obj 148 319 output~; -#X text 61 393 This patch shows the classical FM synthesis technique developed by John Chowning. It's nothing but an oscillator with vibrato controlled by another "modulation" oscillator. First \, to understand the patch \, set carrier frequency to 400 or so \, modulation frequency between 5 and 10 \, and try modulation index values between 0 and 400 \, say. You'll hear a sine wave with vibrato., f 71; -#X text 61 568 The component frequencies are equal to the carrier frequency \, plus or minus multiples of the modulator frequency. A more complete discussion of FM occurs in part 5 of this series., f 71; -#X obj 461 26 declare -stdpath ./; -#X obj 196 252 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X text 220 251 <-- click to graph; -#X text 47 170 add modulator to carrier frequency -->, f 13; -#X text 38 248 oscillator -->; +#X restore 400 135 graph; +#X obj 195 324 tabwrite~ fm-output; +#X floatatom 235 180 4 0 0 0 - - - 0; +#X text 122 127 carrier; +#X text 121 145 frequency; +#X text 202 101 frequency; +#X text 203 84 modulation; +#X obj 147 286 osc~; +#X text 55 268 "carrier"; +#X text 274 192 index; +#X text 276 173 modulation; +#X obj 217 150 osc~; +#X text 425 271 --- 0.01 seconds ----; +#X text 60 527 To get the FM sound \, set all three of carrier frequency \, modulation frequency \, and modulation index in the hundreds. Note that you get a timbral change as you sweep modulation index \, because this changes the amplitudes of the components of the output sound but not their frequencies., f 71; +#X obj 147 357 output~; +#X text 60 431 This patch shows the classical FM synthesis technique developed by John Chowning. It's nothing but an oscillator with vibrato controlled by another "modulation" oscillator. First \, to understand the patch \, set carrier frequency to 400 or so \, modulation frequency between 5 and 10 \, and try modulation index values between 0 and 400 \, say. You'll hear a sine wave with vibrato., f 71; +#X text 60 606 The component frequencies are equal to the carrier frequency \, plus or minus multiples of the modulator frequency. A more complete discussion of FM occurs in part 5 of this series., f 71; +#X obj 296 385 declare -stdpath ./; +#X obj 195 290 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X text 219 289 <-- click to graph; +#X text 46 208 add modulator to carrier frequency -->, f 13; +#X text 37 286 oscillator -->; +#X obj 49 26 cnv 5 5 25 empty empty Frequency\ Modulation\ ("FM")\ using\ two\ oscillators 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 3 1; -#X connect 1 0 16 0; +#X connect 1 0 15 0; #X connect 2 0 3 0; -#X connect 3 0 12 0; +#X connect 3 0 11 0; #X connect 6 0 0 1; -#X connect 12 0 5 0; -#X connect 12 0 19 0; -#X connect 16 0 0 0; -#X connect 23 0 5 0; +#X connect 11 0 5 0; +#X connect 11 0 18 0; +#X connect 15 0 0 0; +#X connect 22 0 5 0; diff --git a/doc/3.audio.examples/A10.review.pd b/doc/3.audio.examples/A10.review.pd index e077073e..b2ebe0d4 100644 --- a/doc/3.audio.examples/A10.review.pd +++ b/doc/3.audio.examples/A10.review.pd @@ -1,44 +1,44 @@ -#N canvas 467 38 638 672 12; -#X text 157 10 PART 1 REVIEW; -#X obj 77 122 tabwrite~; -#X obj 77 96 line~; -#X obj 83 244 +; -#X obj 77 70 +~; -#X obj 77 148 osc~; -#X obj 84 347 r; -#X obj 84 323 s; -#X obj 83 297 inlet; -#X obj 126 269 mtof; -#X obj 83 268 ftom; -#X obj 134 297 outlet; -#X obj 77 173 dac~; -#X text 22 43 So far we've seen these audio ("tilde") objects:; -#X text 134 95 -- ramp generator; -#X text 123 174 -- audio output ("digital/analog converter" -- a misnomer); -#X text 19 217 ... and these "control" objects:; -#X text 196 298 -- input and output to a subpatch; -#X text 120 324 ("send") -- wireless message sending; -#X text 121 349 ("receive") ... and receiving; -#X text 121 242 (etc.) -- arithmetic; -#X text 122 148 -- sinusoidal oscillator; -#X obj 84 568 tgl 19 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000 0 1; -#X text 111 569 -- toggle switch; -#X floatatom 84 545 0 0 0 0 - - - 0; -#X text 119 544 -- number box; -#X msg 84 522; -#X text 121 522 -- message box; -#X text 26 397 ... and these other (non-object) boxes:; -#X text 117 69 (etc.) -- bynary operation on audio signals; -#X obj 85 596 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X text 112 596 -- bang button; -#X obj 88 625 hsl 162 19 0 127 0 0 empty empty empty -2 -10 0 12 #fcfcfc #000000 #000000 0 1; -#X text 259 624 -- slider; -#X obj 167 269 dbtorms; +#N canvas 571 90 638 701 12; +#X obj 84 141 tabwrite~; +#X obj 84 115 line~; +#X obj 90 263 +; +#X obj 84 89 +~; +#X obj 84 167 osc~; +#X obj 91 366 r; +#X obj 91 342 s; +#X obj 90 316 inlet; +#X obj 133 288 mtof; +#X obj 90 287 ftom; +#X obj 141 316 outlet; +#X obj 84 192 dac~; +#X text 29 62 So far we've seen these audio ("tilde") objects:; +#X text 141 114 -- ramp generator; +#X text 130 193 -- audio output ("digital/analog converter" -- a misnomer); +#X text 26 236 ... and these "control" objects:; +#X text 203 317 -- input and output to a subpatch; +#X text 127 343 ("send") -- wireless message sending; +#X text 128 368 ("receive") ... and receiving; +#X text 128 261 (etc.) -- arithmetic; +#X text 129 167 -- sinusoidal oscillator; +#X obj 91 587 tgl 19 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000 0 1; +#X text 118 588 -- toggle switch; +#X floatatom 91 564 0 0 0 0 - - - 0; +#X text 126 563 -- number box; +#X msg 91 541; +#X text 128 541 -- message box; +#X text 33 416 ... and these other (non-object) boxes:; +#X text 124 88 (etc.) -- bynary operation on audio signals; +#X obj 92 615 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X text 119 615 -- bang button; +#X obj 95 644 hsl 162 19 0 127 0 0 empty empty empty -2 -10 0 12 #fcfcfc #000000 #000000 0 1; +#X text 266 643 -- slider; +#X obj 174 288 dbtorms; #N canvas 0 22 450 278 (subpatch) 0; #X array array 64 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; #X coords 0 1 64 -1 150 70 1 0 0; -#X restore 81 443 graph; -#X text 157 122 -- sampler (which we've only used for graphing audio so far); -#X text 242 468 -- array (for graphing audio so far); -#X text 227 267 -- acoustic conversions; +#X restore 88 462 graph; +#X text 164 141 -- sampler (which we've only used for graphing audio so far); +#X text 249 487 -- array (for graphing audio so far); +#X text 234 286 -- acoustic conversions; +#X obj 68 21 cnv 5 5 25 empty empty Part\ 1\ Review 15 13 0 16 #dfdfdf #202020 0; diff --git a/doc/3.audio.examples/B01.wavetables.pd b/doc/3.audio.examples/B01.wavetables.pd index fbfc4266..d9943a5d 100644 --- a/doc/3.audio.examples/B01.wavetables.pd +++ b/doc/3.audio.examples/B01.wavetables.pd @@ -1,28 +1,28 @@ #N canvas 443 44 725 621 12; #X declare -stdpath ./; -#X floatatom 127 60 6 0 0 0 - - - 0; +#X floatatom 127 72 6 0 0 0 - - - 0; #N canvas 0 0 450 300 (subpatch) 0; #X array table10 259 float 1; #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.612 0.612 0.612 0.612 0.612 0.627692 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.470769 -0.470769 -0.470769 -0.470769 -0.470769 -0.470769 -0.470769 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.627692 0.627692 0.627692 0.643385 0.643385 0.643385 0.659077 0 -0.502154 -0.502154 -0.502154 -0.486462 -0.486462 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.580615 0.596308 0.596308 0.596308 0.596308 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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.02 258 -1.02 258 130 1; -#X restore 279 92 graph; -#X text 78 18 WAVETABLE OSCILLATORS; -#X text 25 123 wavetable; -#X obj 127 87 mtof; -#X floatatom 127 114 7 0 0 0 - - - 0; -#X obj 127 140 tabosc4~ table10; -#X msg 58 544 \; table10 cosinesum 256 0.2 -0.2 0.2 -0.2 0.2 -0.2 0.2; -#X msg 559 144 \; table10 const 0; -#X text 564 121 CLEAR TABLE; -#X obj 127 174 output~; -#X obj 509 33 declare -stdpath ./; -#X text 83 484 If you want a specific sinusoidal composition \, you can send table10 a message \, as below (see 15.arrays in the control examples):, f 73; -#X text 54 59 pitch -->; -#X text 19 140 oscillator -->; -#X text 83 263 Here \, in place of the [osc~] cosine wave oscillator \, we introduce the [tabosc4~] oscillator which uses arbitrary waveforms from arrays. You can draw a waveform in the array with the mouse., f 73; -#X text 83 399 For efficiency's sake [tabosc4~] requires that the table has a power of two plus three points (64+3=67 \, 128+3=131 \, 256+3=259 \, etc.) If you want wraparound to work smoothly \, you should make the last three points copies of the first three. This is done because [tabread4~] does 4-point interpolation., f 73; -#X text 83 319 Note that I selected "save contents" in the properties dialog for table10 (right click on the table to see.) If this isn't set \, the waveform won't be remembered as part of the patch but will be reinitialized to zero when the patch is reopened. If it this is set and you modified the waveform \, the current waveform gets stored with the file when you save the patch., f 73; -#X connect 0 0 4 0; +#X restore 279 104 graph; +#X text 25 135 wavetable; +#X obj 127 99 mtof; +#X floatatom 127 126 7 0 0 0 - - - 0; +#X obj 127 152 tabosc4~ table10; +#X msg 58 556 \; table10 cosinesum 256 0.2 -0.2 0.2 -0.2 0.2 -0.2 0.2; +#X msg 559 156 \; table10 const 0; +#X text 564 133 CLEAR TABLE; +#X obj 127 186 output~; +#X obj 509 45 declare -stdpath ./; +#X text 83 496 If you want a specific sinusoidal composition \, you can send table10 a message \, as below (see 15.arrays in the control examples):, f 73; +#X text 54 71 pitch -->; +#X text 19 152 oscillator -->; +#X text 83 275 Here \, in place of the [osc~] cosine wave oscillator \, we introduce the [tabosc4~] oscillator which uses arbitrary waveforms from arrays. You can draw a waveform in the array with the mouse., f 73; +#X text 83 411 For efficiency's sake [tabosc4~] requires that the table has a power of two plus three points (64+3=67 \, 128+3=131 \, 256+3=259 \, etc.) If you want wraparound to work smoothly \, you should make the last three points copies of the first three. This is done because [tabread4~] does 4-point interpolation., f 73; +#X text 83 331 Note that I selected "save contents" in the properties dialog for table10 (right click on the table to see.) If this isn't set \, the waveform won't be remembered as part of the patch but will be reinitialized to zero when the patch is reopened. If it this is set and you modified the waveform \, the current waveform gets stored with the file when you save the patch., f 73; +#X obj 82 23 cnv 5 5 25 empty empty Wavetable\ Oscillator 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 3 0; +#X connect 3 0 4 0; #X connect 4 0 5 0; -#X connect 5 0 6 0; -#X connect 6 0 10 0; +#X connect 5 0 9 0; diff --git a/doc/3.audio.examples/B02.two-wavetables.pd b/doc/3.audio.examples/B02.two-wavetables.pd index 29924522..241c6355 100644 --- a/doc/3.audio.examples/B02.two-wavetables.pd +++ b/doc/3.audio.examples/B02.two-wavetables.pd @@ -1,26 +1,26 @@ -#N canvas 414 81 629 493 12; +#N canvas 414 81 679 505 12; #X declare -stdpath ./; #N canvas 0 22 450 278 (subpatch) 0; #X array waveform11 259 float 1; #A 0 -0.0896033 0 0.0896033 0.178356 0.265425 0.350007 0.431348 0.508756 0.58161 0.649372 0.711597 0.767935 0.818137 0.862053 0.89963 0.930912 0.956028 0.975187 0.988669 0.996811 1 0.998655 0.993223 0.984158 0.971919 0.956953 0.939691 0.920538 0.899867 0.878018 0.85529 0.831945 0.808204 0.784252 0.760239 0.736284 0.712477 0.688888 0.665568 0.642553 0.619872 0.59755 0.575607 0.554066 0.532953 0.512296 0.49213 0.472491 0.453419 0.434957 0.417147 0.400027 0.383632 0.367992 0.353126 0.339046 0.32575 0.313227 0.301453 0.290394 0.280002 0.270224 0.260995 0.252248 0.24391 0.235908 0.22817 0.220628 0.213219 0.205888 0.198586 0.191278 0.183936 0.176545 0.169098 0.1616 0.154063 0.146505 0.138954 0.131437 0.123987 0.116636 0.109415 0.102354 0.0954784 0.0888083 0.08236 0.0761442 0.0701659 0.0644253 0.0589178 0.0536354 0.0485669 0.0436994 0.0390194 0.0345135 0.0301695 0.0259776 0.0219306 0.0180245 0.0142591 0.0106377 0.00716724 0.00385775 0.000722025 -0.00222511 -0.0049675 -0.00748845 -0.00977153 -0.0118014 -0.0135644 -0.0150493 -0.0162479 -0.0171551 -0.0177693 -0.0180928 -0.0181312 -0.0178936 -0.017392 -0.0166417 -0.0156601 -0.0144666 -0.0130822 -0.0115294 -0.00983114 -0.0080113 -0.00609396 -0.0041034 -0.00206402 -2.23572e-07 0.00206358 0.00410297 0.00609353 0.00801089 0.00983075 0.011529 0.0130819 0.0144663 0.0156599 0.0166416 0.0173919 0.0178935 0.0181312 0.0180929 0.0177695 0.0171552 0.0162481 0.0150496 0.0135647 0.0118018 0.009772 0.00748897 0.00496807 0.00222573 -0.000721367 -0.00385706 -0.00716651 -0.010637 -0.0142583 -0.0180237 -0.0219297 -0.0259767 -0.0301686 -0.0345125 -0.0390184 -0.0436984 -0.0485658 -0.0536343 -0.0589167 -0.0644241 -0.0701647 -0.0761429 -0.0823587 -0.0888069 -0.0954769 -0.102353 -0.109414 -0.116634 -0.123985 -0.131435 -0.138952 -0.146504 -0.154061 -0.161598 -0.169097 -0.176543 -0.183935 -0.191276 -0.198584 -0.205886 -0.213218 -0.220627 -0.228169 -0.235906 -0.243908 -0.252246 -0.260993 -0.270222 -0.28 -0.290392 -0.301451 -0.313224 -0.325747 -0.339043 -0.353123 -0.367989 -0.383629 -0.400023 -0.417143 -0.434954 -0.453415 -0.472486 -0.492125 -0.512292 -0.532948 -0.554062 -0.575602 -0.597545 -0.619868 -0.642548 -0.665563 -0.688883 -0.712472 -0.736279 -0.760234 -0.784247 -0.808199 -0.83194 -0.855285 -0.878013 -0.899863 -0.920533 -0.939687 -0.956949 -0.971916 -0.984156 -0.993221 -0.998655 -1 -0.996813 -0.988671 -0.975191 -0.956033 -0.930918 -0.899638 -0.862061 -0.818147 -0.767947 -0.71161 -0.649386 -0.581625 -0.508772 -0.431366 -0.350025 -0.265443 -0.178375 -0.0896226 -1.94061e-05 0.089584; #X coords 0 1.02 258 -1.02 258 130 1; -#X restore 323 194 graph; +#X restore 348 194 graph; #X text 47 147 wavetable; #N canvas 0 22 450 278 (subpatch) 0; #X array pitch11 259 float 1; #A 0 757.143 757.143 735.714 700 671.429 650 621.429 600 571.429 550 521.429 507.143 485.714 464.286 442.857 428.571 414.286 400 378.571 364.286 342.857 328.571 928.571 921.429 921.429 914.286 907.143 892.857 885.714 878.571 864.286 850 828.571 807.143 792.857 785.714 775 764.286 753.571 742.857 735.714 728.571 721.429 714.286 703.571 692.857 682.143 671.429 650 628.571 617.857 607.143 596.429 585.714 575 564.286 553.571 542.857 532.143 521.429 510.714 500 485.714 478.571 464.286 450 435.714 428.571 400 392.857 385.714 378.571 357.143 350 342.857 335.714 328.571 314.286 292.857 285.714 271.429 264.286 571.429 571.429 571.429 571.429 571.429 564.286 564.286 278.571 271.429 271.429 278.571 278.571 278.571 278.571 571.429 571.429 571.429 575 578.571 578.571 278.571 278.571 285.714 285.714 278.571 278.571 278.571 878.571 878.571 878.571 878.571 878.571 321.429 325 328.571 328.571 328.571 328.571 885.714 885.714 885.714 885.714 207.143 207.143 207.143 200 207.143 207.143 207.143 214.286 214.286 221.429 228.571 228.571 242.857 250 257.143 264.286 278.571 292.857 307.143 321.429 335.714 350 371.429 392.857 421.429 435.714 471.429 500 542.857 571.429 628.571 664.286 700 728.571 757.143 792.857 828.571 885.714 928.571 978.571 1000 1007.14 1007.14 1000 1000 992.857 985.714 885.714 914.286 671.429 671.429 671.429 671.429 671.429 671.429 671.429 671.429 671.429 671.429 678.571 635.714 635.714 678.571 714.286 714.286 678.571 635.714 635.714 635.714 742.857 742.857 685.714 685.714 635.714 621.429 685.714 792.857 792.857 678.571 521.429 521.429 521.429 864.286 857.143 857.143 471.429 471.429 471.429 471.429 921.429 921.429 385.714 385.714 385.714 964.286 964.286 964.286 328.571 328.571 328.571 328.571 885.714 885.714 885.714 685.714 214.286 214.286 207.143 207.143 921.429 921.429 921.429 921.429 207.143 207.143 200 200 957.143 957.143 950 214.286 214.286 207.143 207.143 957.143 957.143 950 200 207.143 207.143 942.857 942.857 942.857 950 950; #X coords 0 1000 258 0 259 140 1; -#X restore 323 31 graph; +#X restore 348 31 graph; #X obj 145 128 tabosc4~ pitch11; #X obj 145 164 tabosc4~ waveform11; #X obj 145 96 sig~ 0.5; #X obj 145 215 output~; #X obj 144 291 declare -stdpath ./; -#X text 67 24 TWO WAVETABLE OSCILLATORS; #X text 69 95 pitch -->; #X text 41 164 oscillator -->; -#X text 63 349 Here's a [tabosc4~] controlling the frequency of another one. If you get properties on the two arrays \, you'll see that the top graph has a vertical scale from 0 to 1000 \, to represent a range in Hz., f 69; -#X text 63 397 We're looping through that at a frequency of 0.5 Hz and the output is used as the frequency input of the second [tabosc4~]. I've detected Klingons \, Captain Kirk..., f 69; +#X text 90 371 Here's a [tabosc4~] controlling the frequency of another one. If you get properties on the two arrays \, you'll see that the top graph has a vertical scale from 0 to 1000 \, to represent a range in Hz., f 69; +#X text 90 419 We're looping through that at a frequency of 0.5 Hz and the output is used as the frequency input of the second [tabosc4~]. I've detected Klingons \, Captain Kirk..., f 69; +#X obj 35 22 cnv 5 5 25 empty empty Two\ Wavetable\ Oscillators 15 13 0 16 #dfdfdf #202020 0; #X connect 3 0 4 0; #X connect 4 0 6 0; #X connect 5 0 3 0; diff --git a/doc/3.audio.examples/B03.tabread4.pd b/doc/3.audio.examples/B03.tabread4.pd index 81074976..c70c7180 100644 --- a/doc/3.audio.examples/B03.tabread4.pd +++ b/doc/3.audio.examples/B03.tabread4.pd @@ -1,45 +1,45 @@ -#N canvas 376 88 740 623 12; +#N canvas 376 88 742 685 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array waveform12 131 float 1; #A 0 -0.172615 -0.172615 -0.172615 -0.172615 -0.172615 -0.141231 -0.109846 -0.0941538 -0.0627692 -0.0470769 0.0156923 0.0784615 0.125538 0.188308 0.235385 0.298154 0.360923 0.392308 0.470769 0.533538 0.596308 0.643385 0.674769 0.721846 0.753231 0.784615 0.816 0.831692 0.847385 0.878769 0.894462 0.910154 0.910154 0.910154 0.910154 0.910154 0.894462 0.894462 0.894462 0.894462 0.878769 0.863077 0.816 0.800308 0.768923 0.737538 0.706154 0.674769 0.643385 0.596308 0.564923 0.533538 0.470769 0.423692 0.376615 0.313846 0.266769 0.204 0.172615 0.109846 0.0627692 0.0156923 0 -0.0313846 -0.0627692 -0.0784615 -0.0941538 -0.109846 -0.141231 -0.156923 -0.172615 -0.204 -0.219692 -0.219692 -0.235385 -0.235385 -0.235385 -0.219692 -0.219692 -0.219692 -0.204 -0.156923 -0.125538 -0.0784615 0 0.172615 0.313846 0.470769 0.564923 0.627692 0.690462 0.721846 0.737538 0.753231 0.768923 0.768923 0.753231 0.737538 0.706154 0.674769 0.612 0.580615 0.549231 0.517846 0.486462 0.423692 0.392308 0.360923 0.282462 0.219692 0.109846 -0.0156923 -0.0941538 -0.109846 -0.141231 -0.156923 -0.172615 -0.188308 -0.204 -0.204 -0.219692 -0.204 -0.204 -0.219692 -0.219692 -0.204 -0.204 -0.204 -0.204 -0.204 -0.188308; #X coords 0 1.02 130 -1.02 258 130 1; -#X restore 400 33 graph; -#X text 67 14 WAVETABLE OSCILLATORS; -#X obj 156 106 phasor~; -#X obj 156 195 tabread4~ waveform12; -#X obj 156 168 +~ 1; -#X floatatom 156 77 6 0 0 0 - - - 0; -#X floatatom 250 67 6 0 1000 0 - - - 0; -#X obj 250 115 line~; -#X obj 156 142 *~; -#X text 49 92 phase; -#X text 49 128 range; -#X text 250 46 squeeze; -#X text 133 51 frequency; +#X restore 396 124 graph; +#X obj 160 160 phasor~; +#X obj 160 249 tabread4~ waveform12; +#X obj 160 222 +~ 1; +#X floatatom 160 131 6 0 0 0 - - - 0; +#X floatatom 254 121 6 0 1000 0 - - - 0; +#X obj 254 169 line~; +#X obj 160 196 *~; +#X text 53 146 phase; +#X text 53 182 range; +#X text 254 100 squeeze; +#X text 137 105 frequency; #N canvas 0 0 450 300 (subpatch) 0; #X array wave-out12 441 float 0; -#X coords 0 1 440 -1 300 140 1; -#X restore 399 193 graph; -#X obj 197 267 tabwrite~ wave-out12; -#X obj 250 139 +~ 128; -#X obj 157 307 output~; -#X obj 522 357 declare -stdpath ./; -#X obj 197 231 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X text 220 230 <-- click to graph; -#X obj 250 91 pack f 50; -#X text 48 107 generation -->; -#X text 48 143 adjustment -->; -#X text 71 408 The [tabread4~] module is available for situations requiring more control than [tabosc4~] offers. The relationship between the two is the same as between [cos~] and [osc~] \, although the units are different between [cos~] and [tabread4~]. The [cos~] objects assumes input is normalized from 0 to 1 (and will wrap around as needed) \, while [tabread4~] takes values from 1 to n-2 where n is the number of points in the table-- for a 131-point table such as we have here with "waveform12" \, it's 1 to 129 (so the "good" segment is 128 samples long.), f 87; -#X text 71 518 You would use [tabread4~] (as opposed to [tabosc4~]) if you need direct control of the phase \, for instance to advance nonlinearly through the table. In the case shown here \, the "squeeze" factor makes the phase grow to a value at least \, and possibly much greater than \, 129 (to which [tabread4~] then limits it). So the resulting waveform is compressed in time., f 87; -#X connect 2 0 8 0; -#X connect 3 0 14 0; -#X connect 3 0 16 0; -#X connect 4 0 3 0; -#X connect 5 0 2 0; -#X connect 6 0 20 0; -#X connect 7 0 15 0; -#X connect 8 0 4 0; -#X connect 15 0 8 1; -#X connect 18 0 14 0; -#X connect 20 0 7 0; +#X coords 0 1 440 -1 259 134 1; +#X restore 395 284 graph; +#X obj 201 321 tabwrite~ wave-out12; +#X obj 254 193 +~ 128; +#X obj 161 361 output~; +#X obj 536 57 declare -stdpath ./; +#X obj 201 285 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X text 224 284 <-- click to graph; +#X obj 254 145 pack f 50; +#X text 52 161 generation -->; +#X text 52 197 adjustment -->; +#X text 79 449 The [tabread4~] module is available for situations requiring more control than [tabosc4~] offers. The relationship between the two is the same as between [cos~] and [osc~] \, although the units are different between [cos~] and [tabread4~]. The [cos~] objects assumes input is normalized from 0 to 1 (and will wrap around as needed) \, while [tabread4~] takes values from 1 to n-2 where n is the number of points in the table-- for a 131-point table such as we have here with "waveform12" \, it's 1 to 129 (so the "good" segment is 128 samples long.), f 87; +#X text 79 559 You would use [tabread4~] (as opposed to [tabosc4~]) if you need direct control of the phase \, for instance to advance nonlinearly through the table. In the case shown here \, the "squeeze" factor makes the phase grow to a value at least \, and possibly much greater than \, 129 (to which [tabread4~] then limits it). So the resulting waveform is compressed in time., f 87; +#X obj 41 36 cnv 5 5 25 empty empty A\ Wavetable\ Oscillator\ with\ [tabread4~] 15 13 0 16 #dfdfdf #202020 0; +#X connect 1 0 7 0; +#X connect 2 0 13 0; +#X connect 2 0 15 0; +#X connect 3 0 2 0; +#X connect 4 0 1 0; +#X connect 5 0 19 0; +#X connect 6 0 14 0; +#X connect 7 0 3 0; +#X connect 14 0 7 1; +#X connect 17 0 13 0; +#X connect 19 0 6 0; diff --git a/doc/3.audio.examples/B04.tabread4.interpolation.pd b/doc/3.audio.examples/B04.tabread4.interpolation.pd index bceb1c1e..5e5fc6f9 100644 --- a/doc/3.audio.examples/B04.tabread4.interpolation.pd +++ b/doc/3.audio.examples/B04.tabread4.interpolation.pd @@ -15,7 +15,6 @@ #X obj 162 186 tabread4~ waveform13; #X obj 162 133 *~ 8; #X obj 162 97 phasor~ 220; -#X text 63 35 4-POINT INTERPOLATION IN DETAIL; #X obj 214 318 sig~ 220; #X obj 214 348 tabosc4~ waveform13; #X text 204 217 <-- click to graph; @@ -33,10 +32,11 @@ #X text 195 52 initialize waveform; #X connect 0 0 1 0; #X restore 564 429 pd init_waveform; +#X obj 34 25 cnv 5 5 25 empty empty 4-Point\ Interpolation\ in\ detail 15 13 0 16 #dfdfdf #202020 0; #X connect 1 0 6 0; #X connect 6 0 5 0; #X connect 7 0 1 0; #X connect 8 0 7 0; -#X connect 10 0 11 0; -#X connect 13 0 5 0; -#X connect 14 0 16 0; +#X connect 9 0 10 0; +#X connect 12 0 5 0; +#X connect 13 0 15 0; diff --git a/doc/3.audio.examples/B05.tabread.FM.pd b/doc/3.audio.examples/B05.tabread.FM.pd index 1a82880d..99a80eda 100644 --- a/doc/3.audio.examples/B05.tabread.FM.pd +++ b/doc/3.audio.examples/B05.tabread.FM.pd @@ -1,10 +1,10 @@ -#N canvas 478 98 692 410 12; +#N canvas 362 78 692 410 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array pitchmod14 131 float 1; #A 0 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.831692 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.863077 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 -0.800308 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308; #X coords 0 1.02 130 -1.02 258 130 1; -#X restore 360 187 graph; +#X restore 341 216 graph; #X floatatom 145 89 4 0 0 0 - - - 0; #X floatatom 101 159 4 0 0 0 - - - 0; #X obj 145 202 *~; @@ -12,17 +12,17 @@ #X obj 127 233 +~; #X obj 127 265 osc~; #X obj 145 130 tabosc4~ pitchmod14; -#X text 65 31 FREQUENCY MODULATION BY WAVETABLE; #X obj 127 307 output~; -#X obj 445 31 declare -stdpath ./; -#X text 357 88 This [tabosc4~] controls the pitch of a sinusoidal oscillator ([osc~]). Try changing the waveform as well as the three familiar parameters., f 37; +#X obj 474 27 declare -stdpath ./; +#X text 338 117 This [tabosc4~] controls the pitch of a sinusoidal oscillator ([osc~]). Try changing the waveform as well as the three familiar parameters., f 37; #X text 199 163 modulation depth, f 10; #X text 38 162 carrier frequency, f 9; #X text 183 82 modulation frequency, f 10; +#X obj 34 25 cnv 5 5 25 empty empty Frequency\ Modulation\ by\ Wavetables 15 13 0 16 #dfdfdf #202020 0; #X connect 1 0 7 0; #X connect 2 0 5 0; #X connect 3 0 5 1; #X connect 4 0 3 1; #X connect 5 0 6 0; -#X connect 6 0 9 0; +#X connect 6 0 8 0; #X connect 7 0 3 0; diff --git a/doc/3.audio.examples/B06.table.switching.pd b/doc/3.audio.examples/B06.table.switching.pd index d7e65ce7..eaad19e5 100644 --- a/doc/3.audio.examples/B06.table.switching.pd +++ b/doc/3.audio.examples/B06.table.switching.pd @@ -1,32 +1,32 @@ -#N canvas 381 52 805 575 12; +#N canvas 397 133 805 575 12; #X declare -stdpath ./; #N canvas 0 22 450 278 (subpatch) 0; #X array waveshape15a 131 float 1; #A 0 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.831692 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.863077 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 -0.800308 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308; #X coords 0 1.02 130 -1.02 258 130 1; -#X restore 509 89 graph; -#X text 82 14 SWITCHING BETWEEN TABLES; +#X restore 509 99 graph; #N canvas 0 22 450 278 (subpatch) 0; #X array waveshape15b 131 float 1; #A 0 -0.659077 -0.643385 -0.643385 -0.627692 -0.612 -0.612 -0.596308 -0.596308 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.596308 -0.596308 -0.596308 -0.596308 -0.596308 -0.596308 -0.596308 -0.596308 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.564923 -0.549231 -0.549231 -0.533538 -0.517846 -0.517846 -0.517846 -0.517846 -0.517846 -0.517846 -0.517846 -0.517846 -0.533538 -0.549231 -0.580615 -0.580615 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.863077 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 -0.800308 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308; #X coords 0 1.02 130 -1.02 258 130 1; -#X restore 509 244 graph; -#X obj 146 272 tabosc4~ waveshape15a; -#X obj 146 164 sig~ 110; -#X msg 171 193 set waveshape15a; -#X msg 179 219 set waveshape15b; -#X obj 146 310 output~; -#X obj 300 336 declare -stdpath ./; -#X obj 79 466 array define -k waveshape15c 131; +#X restore 509 254 graph; +#X obj 146 282 tabosc4~ waveshape15a; +#X obj 146 174 sig~ 110; +#X msg 171 203 set waveshape15a; +#X msg 179 229 set waveshape15b; +#X obj 146 320 output~; +#X obj 300 346 declare -stdpath ./; +#X obj 79 476 array define -k waveshape15c 131; #A 0 0 -0.553343 -0.486675 -0.426674 -0.333339 -0.300005 -0.233338 -0.173337 -0.113336 -0.0600014 -0.0133339 0.0333335 0.0866678 0.133335 0.173336 0.213337 0.24667 0.280004 0.313338 0.333339 0.353339 0.346672 0.300005 -0.240004 -0.306672 -0.306672 -0.306672 -0.306672 -0.313339 -0.326673 -0.333339 -0.35334 -0.360006 -0.37334 -0.453341 -0.460008 -0.460008 -0.460008 -0.453341 -0.426674 -0.400007 -0.340006 -0.253338 -0.18667 -3.57628e-07 0.0533339 0.180003 0.200003 0.280004 0.320005 0.360006 0.392006 0.424007 0.456007 0.488008 0.520008 0.540009 0.563343 0.586676 0.606677 0.62001 0.62001 0.420007 -0.506676 -0.586677 -0.673345 -0.720013 -0.74668 -0.780014 -0.900016 -0.900016 -0.886682 -0.860015 -0.840015 -0.820014 -0.78668 -0.76668 -0.74668 -0.693345 -0.662234 -0.631122 -0.600011 -0.573343 -0.543343 -0.513342 -0.480008 -0.446675 -0.418341 -0.390007 -0.361673 -0.333339 -0.293339 -0.253338 -0.220004 -0.18667 -0.153336 -0.120002 -0.0866685 -0.0533346 -0.0200007 0.00999981 0.0400003 0.0666674 0.0933346 0.123335 0.153336 0.20667 0.233337 0.260004 0.291116 0.322227 0.353339 0.400006 0.440007 0.480008 0.500008 0.533342 0.566676 0.60001 0.626677 0.653344 0.683345 0.740012 0.780013 0.82668 0.853347 0.846681 0.833347 0.773346 0.706678 0.646677; -#X msg 184 244 set waveshape15c; -#X obj 79 505 table; -#X text 48 385 There's also an [array] object so that you can have arrays with parameterizable names and sizes. You can also save the state of the array in this case \, and read it in from a file or calculate it at startup.; -#X text 123 506 <-- see also this older and less powerful object (you can't save contents in this one)., f 46; -#X text 24 45 During a performance you're unlikely to want to draw or recalculate wavetables on the fly \, because you don't want to give Pd computationally intensive atomic tasks that could make Pd miss a DAC deadline. Instead \, use "set" messages to switch [tabosc~] or [tabread4~] between pre-prepared tables. Indeed \, you will eventually want to save screen space by throwing all your wavetables in a subpatch somewhere.; -#X text 316 467 <-- click to open; -#X connect 3 0 7 0; -#X connect 4 0 3 0; -#X connect 5 0 3 0; -#X connect 6 0 3 0; -#X connect 10 0 3 0; +#X msg 184 254 set waveshape15c; +#X obj 79 515 table; +#X text 48 395 There's also an [array] object so that you can have arrays with parameterizable names and sizes. You can also save the state of the array in this case \, and read it in from a file or calculate it at startup.; +#X text 123 516 <-- see also this older and less powerful object (you can't save contents in this one)., f 46; +#X text 24 55 During a performance you're unlikely to want to draw or recalculate wavetables on the fly \, because you don't want to give Pd computationally intensive atomic tasks that could make Pd miss a DAC deadline. Instead \, use "set" messages to switch [tabosc~] or [tabread4~] between pre-prepared tables. Indeed \, you will eventually want to save screen space by throwing all your wavetables in a subpatch somewhere.; +#X text 316 477 <-- click to open; +#X obj 37 14 cnv 5 5 25 empty empty Switching\ between\ tables 15 13 0 16 #dfdfdf #202020 0; +#X connect 2 0 6 0; +#X connect 3 0 2 0; +#X connect 4 0 2 0; +#X connect 5 0 2 0; +#X connect 9 0 2 0; diff --git a/doc/3.audio.examples/B07.sampler.pd b/doc/3.audio.examples/B07.sampler.pd index 93db7df4..52d8ff77 100644 --- a/doc/3.audio.examples/B07.sampler.pd +++ b/doc/3.audio.examples/B07.sampler.pd @@ -1,46 +1,46 @@ #N canvas 418 47 764 678 12; #X declare -stdpath ./; -#X obj 59 305 hip~ 5; +#X obj 59 325 hip~ 5; #N canvas 0 0 450 300 (subpatch) 0; #X array sample-table 44103 float 2; #X coords 0 1.02 44103 -1.02 200 130 1; -#X restore 503 28 graph; -#X obj 59 267 tabread4~ sample-table; -#X obj 59 235 line~; -#X obj 59 106 * 441; -#X floatatom 59 48 5 0 100 0 - - - 0; -#X text 90 14 SCRATCH MACHINE; -#X text 106 106 convert to SAMPLES (441 samples in 0.01 sec); -#X obj 204 335 loadbang; -#X text 45 550 For more on reading and writing soundfiles to tables \, setting their lengths \, etc \, see "arrays" in the "control examples" series., f 96; -#X text 45 511 Fanatics take note: if you want really high-fidelity sampling \, use a high-quality resampling program to up-sample your soundfile to 88200 to drastically reduce interpolation error., f 96; -#X text 101 235 convert smoothly to audio signal; -#X text 107 66 (range is 0-100.) YOU ONLY HEAR OUTPUT; -#X text 108 82 WHEN THIS IS 0-100 AND ACTIVELY CHANGING.; -#X msg 204 359 read ../sound/voice.wav sample-table; -#X obj 204 384 soundfiler; -#X obj 59 348 output~; -#X obj 581 248 declare -stdpath ./; -#X obj 59 133 pack f 100; -#X text 100 48 <-- read point in 100ths of a second, f 39; -#X text 111 305 high pass filter to cut DC; -#X listbox 59 164 10 0 0 0 - - - 0; -#X text 230 259 read from the table (the input is the index in samples), f 30; -#X text 477 340 message to read a soundfile into the table (automatically sent when you load this patch by the [loadbang] object.), f 30; -#X text 45 434 This patch implements a simples scratch machine with [tabread4~] \, which reads audio samples out of a floating-point array \, often called a "sample table." The input is the index of the sample to read \, counting from zero. The output is calculated using 4-point cubic interpolation \, which is adequate for most purposes. Because of the interpolation scheme \, [tabread4~]'s input cannot be less than one or greater than the table length minus two., f 96; -#X text 45 586 Note the highpass filter ([hip~ 5]) that is present to filter a DC component (0 hz frequency). This is not actually needed as the [output~] abstraction already includes [hip~] objects to filter DC \, but it's present in the examples for didactic reasons., f 96; -#X text 508 182 (one second plus three extra; -#X text 510 201 for 4-point interpolation); -#X text 527 160 --- 44103 samples ---; -#X msg 78 198 1 \, 44101 1000; -#X text 182 197 read the whole table (from 1 to n-2); -#X connect 0 0 16 0; +#X restore 503 48 graph; +#X obj 59 287 tabread4~ sample-table; +#X obj 59 255 line~; +#X obj 59 126 * 441; +#X floatatom 59 68 5 0 100 0 - - - 0; +#X text 106 126 convert to SAMPLES (441 samples in 0.01 sec); +#X obj 204 355 loadbang; +#X text 45 570 For more on reading and writing soundfiles to tables \, setting their lengths \, etc \, see "arrays" in the "control examples" series., f 96; +#X text 45 531 Fanatics take note: if you want really high-fidelity sampling \, use a high-quality resampling program to up-sample your soundfile to 88200 to drastically reduce interpolation error., f 96; +#X text 101 255 convert smoothly to audio signal; +#X text 107 86 (range is 0-100.) YOU ONLY HEAR OUTPUT; +#X text 108 102 WHEN THIS IS 0-100 AND ACTIVELY CHANGING.; +#X msg 204 379 read ../sound/voice.wav sample-table; +#X obj 204 404 soundfiler; +#X obj 59 368 output~; +#X obj 581 268 declare -stdpath ./; +#X obj 59 153 pack f 100; +#X text 100 68 <-- read point in 100ths of a second, f 39; +#X text 111 325 high pass filter to cut DC; +#X listbox 59 184 10 0 0 0 - - - 0; +#X text 230 279 read from the table (the input is the index in samples), f 30; +#X text 477 360 message to read a soundfile into the table (automatically sent when you load this patch by the [loadbang] object.), f 30; +#X text 45 454 This patch implements a simples scratch machine with [tabread4~] \, which reads audio samples out of a floating-point array \, often called a "sample table." The input is the index of the sample to read \, counting from zero. The output is calculated using 4-point cubic interpolation \, which is adequate for most purposes. Because of the interpolation scheme \, [tabread4~]'s input cannot be less than one or greater than the table length minus two., f 96; +#X text 45 606 Note the highpass filter ([hip~ 5]) that is present to filter a DC component (0 hz frequency). This is not actually needed as the [output~] abstraction already includes [hip~] objects to filter DC \, but it's present in the examples for didactic reasons., f 96; +#X text 508 202 (one second plus three extra; +#X text 510 221 for 4-point interpolation); +#X text 527 180 --- 44103 samples ---; +#X msg 78 218 1 \, 44101 1000; +#X text 182 217 read the whole table (from 1 to n-2); +#X obj 109 21 cnv 5 5 25 empty empty Scratch\ Machine 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 15 0; #X connect 2 0 0 0; #X connect 3 0 2 0; -#X connect 4 0 18 0; +#X connect 4 0 17 0; #X connect 5 0 4 0; -#X connect 8 0 14 0; -#X connect 14 0 15 0; -#X connect 18 0 21 0; -#X connect 21 0 3 0; -#X connect 29 0 3 0; +#X connect 7 0 13 0; +#X connect 13 0 14 0; +#X connect 17 0 20 0; +#X connect 20 0 3 0; +#X connect 28 0 3 0; diff --git a/doc/3.audio.examples/B08.sampler.loop.pd b/doc/3.audio.examples/B08.sampler.loop.pd index ece108fe..b975ba10 100644 --- a/doc/3.audio.examples/B08.sampler.loop.pd +++ b/doc/3.audio.examples/B08.sampler.loop.pd @@ -13,7 +13,6 @@ #X obj 55 335 hip~ 5; #X floatatom 55 81 5 0 0 0 - - - 0; #X text 181 242 read from the table; -#X text 80 38 LOOPING SAMPLER; #X floatatom 80 134 5 0 0 0 - - - 0; #X obj 80 160 * 441; #X obj 55 187 *~ 0; @@ -39,17 +38,18 @@ #X obj 55 107 phasor~; #X obj 88 272 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X text 482 206 ------ 1 second ------; -#X connect 2 0 20 0; -#X connect 4 0 17 0; -#X connect 5 0 30 0; -#X connect 8 0 9 0; -#X connect 9 0 10 1; -#X connect 10 0 11 0; +#X obj 89 30 cnv 5 5 25 empty empty Looping\ Sampler 15 13 0 16 #dfdfdf #202020 0; +#X connect 2 0 19 0; +#X connect 4 0 16 0; +#X connect 5 0 29 0; +#X connect 7 0 8 0; +#X connect 8 0 9 1; +#X connect 9 0 10 0; +#X connect 10 0 17 0; #X connect 11 0 18 0; -#X connect 12 0 19 0; -#X connect 18 0 4 0; -#X connect 18 0 3 0; -#X connect 20 0 15 0; -#X connect 24 0 19 0; -#X connect 30 0 10 0; -#X connect 31 0 3 0; +#X connect 17 0 4 0; +#X connect 17 0 3 0; +#X connect 19 0 14 0; +#X connect 23 0 18 0; +#X connect 29 0 9 0; +#X connect 30 0 3 0; diff --git a/doc/3.audio.examples/B09.sampler.loop.smooth.pd b/doc/3.audio.examples/B09.sampler.loop.smooth.pd index dcd3cdb6..802d5c52 100644 --- a/doc/3.audio.examples/B09.sampler.loop.smooth.pd +++ b/doc/3.audio.examples/B09.sampler.loop.smooth.pd @@ -9,54 +9,54 @@ #X coords 0 1.02 44103 -1.02 200 130 1; #X restore 507 26 graph; #X obj 509 473 loadbang; -#X obj 82 249 hip~ 5; -#X floatatom 82 50 6 0 0 0 - - - 0; -#X floatatom 165 87 6 0 0 0 - - - 0; -#X obj 165 114 * 441; -#X obj 147 163 +~ 1; +#X obj 82 269 hip~ 5; +#X floatatom 82 70 6 0 0 0 - - - 0; +#X floatatom 165 107 6 0 0 0 - - - 0; +#X obj 165 134 * 441; +#X obj 147 183 +~ 1; #X obj 512 373 adc~ 1; -#X text 43 10 ENVELOPING YOUR LOOPING SAMPLER; -#X obj 82 139 -~ 0.5; -#X obj 82 189 cos~; -#X obj 82 222 *~; +#X obj 82 159 -~ 0.5; +#X obj 82 209 cos~; +#X obj 82 242 *~; #X obj 509 527 soundfiler; #X text 522 158 -- 44103 samples ---; #X text 539 334 ----- 1 second ------; -#X obj 82 77 phasor~; -#X obj 82 164 *~ 0.5; -#X obj 82 283 output~; -#X obj 147 138 *~; -#X obj 204 247 tabwrite~ cos-output; -#X text 26 533 It is possible to get much more control over the shape of the envelope \, but this will be taken up later., f 61; -#X obj 147 189 tabread4~ table18; +#X obj 82 97 phasor~; +#X obj 82 184 *~ 0.5; +#X obj 82 303 output~; +#X obj 147 158 *~; +#X obj 204 267 tabwrite~ cos-output; +#X text 26 549 It is possible to get much more control over the shape of the envelope \, but this will be taken up later., f 61; +#X obj 147 209 tabread4~ table18; #X obj 512 429 tabwrite~ table18; #X msg 509 502 read ../sound/voice.wav table18; #X text 550 403 <-- click here to record to table; #X text 600 481 v-- re-read the original sound; -#X obj 221 313 declare -stdpath ./; -#X text 225 220 <-- click to graph envelope; -#X text 131 49 <-- frequency (Hz.); -#X text 213 86 <-- chunk size (100ths of a second); -#X obj 204 220 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 221 333 declare -stdpath ./; +#X text 225 240 <-- click to graph envelope; +#X text 131 69 <-- frequency (Hz.); +#X text 213 106 <-- chunk size (100ths of a second); +#X obj 204 240 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X obj 527 402 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X text 26 360 Here we apply an amplitude envelope to protect against discontinuities at the loop point. The envelope is just a cosine wave from -90 degrees to +90 degrees \, (-pi/2 to pi/2 radians) \, i.e. \, the part that is zero or positive in sign. The [cos~] object's input is in cycles (units of 2pi radians) so -1/4 to +1/4 addresses the desired part of the waveform., f 61; -#X text 26 460 To see the envelope \, put the [phasor~] on 2 Hz or so \, click the "graph" button \, and look at "cos-output." This is multiplied by the [tabread4~] output so that it doesn't click when the phase wraps around., f 61; -#X connect 2 0 24 0; -#X connect 3 0 18 0; -#X connect 4 0 16 0; +#X text 26 380 Here we apply an amplitude envelope to protect against discontinuities at the loop point. The envelope is just a cosine wave from -90 degrees to +90 degrees \, (-pi/2 to pi/2 radians) \, i.e. \, the part that is zero or positive in sign. The [cos~] object's input is in cycles (units of 2pi radians) so -1/4 to +1/4 addresses the desired part of the waveform., f 61; +#X text 26 480 To see the envelope \, put the [phasor~] on 2 Hz or so \, click the "graph" button \, and look at "cos-output." This is multiplied by the [tabread4~] output so that it doesn't click when the phase wraps around., f 61; +#X obj 53 14 cnv 5 5 25 empty empty Enveloping\ your\ Looping\ Sampler 15 13 0 16 #dfdfdf #202020 0; +#X connect 2 0 23 0; +#X connect 3 0 17 0; +#X connect 4 0 15 0; #X connect 5 0 6 0; -#X connect 6 0 19 1; -#X connect 7 0 22 0; -#X connect 8 0 23 0; -#X connect 10 0 17 0; -#X connect 11 0 12 0; -#X connect 11 0 20 0; -#X connect 12 0 3 0; +#X connect 6 0 18 1; +#X connect 7 0 21 0; +#X connect 8 0 22 0; +#X connect 9 0 16 0; +#X connect 10 0 11 0; +#X connect 10 0 19 0; +#X connect 11 0 3 0; +#X connect 15 0 9 0; +#X connect 15 0 18 0; #X connect 16 0 10 0; -#X connect 16 0 19 0; -#X connect 17 0 11 0; -#X connect 19 0 7 0; -#X connect 22 0 12 1; -#X connect 24 0 13 0; -#X connect 31 0 20 0; -#X connect 32 0 23 0; +#X connect 18 0 7 0; +#X connect 21 0 11 1; +#X connect 23 0 12 0; +#X connect 30 0 19 0; +#X connect 31 0 22 0; diff --git a/doc/3.audio.examples/B10.sampler.scratch.pd b/doc/3.audio.examples/B10.sampler.scratch.pd index a921a252..b278d522 100644 --- a/doc/3.audio.examples/B10.sampler.scratch.pd +++ b/doc/3.audio.examples/B10.sampler.scratch.pd @@ -1,4 +1,4 @@ -#N canvas 386 38 831 688 12; +#N canvas 530 68 831 688 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array table19 44103 float 2; @@ -32,7 +32,6 @@ #X obj 86 201 *~ 0.5; #X obj 86 230 cos~; #X obj 87 407 output~; -#X text 56 23 ENVELOPING THE LOOPING SAMPLER; #X text 74 595 You should hear some doppler shift as you change the read point. To see why \, click on "graph table index" and quickly start changing the read point--- you should see entertaining pictures in "table-index". The next patch shows how to prevent this if you wish to.; #X obj 148 351 tabread4~ table19; #X obj 194 322 tabwrite~ graph19; @@ -46,9 +45,10 @@ #X text 192 66 <-- frequency (Hz.); #X text 208 121 <-- chunk size (100ths of a second); #X text 234 183 <--; -#X text 259 183 read point (100ths of a second), f 19; +#X text 259 183 read point (100ths of a second), f 18; #X text 550 349 ----- 1 second -----; #X msg 534 502 \; graph19 ylabel 46000 0 44100; +#X obj 112 22 cnv 5 5 25 empty empty Sliding\ Loops 15 13 0 16 #dfdfdf #202020 0; #X connect 1 0 22 0; #X connect 2 0 3 0; #X connect 3 0 4 1; @@ -56,13 +56,13 @@ #X connect 5 0 13 0; #X connect 6 0 7 0; #X connect 7 0 19 0; -#X connect 9 0 36 0; +#X connect 9 0 35 0; #X connect 10 0 13 1; -#X connect 11 0 32 0; +#X connect 11 0 31 0; #X connect 12 0 11 0; +#X connect 13 0 27 0; #X connect 13 0 28 0; -#X connect 13 0 29 0; -#X connect 15 0 42 0; +#X connect 15 0 41 0; #X connect 15 0 20 0; #X connect 20 0 17 0; #X connect 21 0 23 0; @@ -70,8 +70,8 @@ #X connect 22 0 21 0; #X connect 23 0 24 0; #X connect 24 0 9 0; -#X connect 28 0 9 1; -#X connect 32 0 10 0; -#X connect 33 0 19 0; -#X connect 34 0 29 0; -#X connect 36 0 25 0; +#X connect 27 0 9 1; +#X connect 31 0 10 0; +#X connect 32 0 19 0; +#X connect 33 0 28 0; +#X connect 35 0 25 0; diff --git a/doc/3.audio.examples/B11.sampler.nodoppler.pd b/doc/3.audio.examples/B11.sampler.nodoppler.pd index f8bf74ba..065fbd7a 100644 --- a/doc/3.audio.examples/B11.sampler.nodoppler.pd +++ b/doc/3.audio.examples/B11.sampler.nodoppler.pd @@ -1,10 +1,10 @@ -#N canvas 374 52 893 649 12; +#N canvas 383 63 893 649 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array table20 44103 float 2; #X coords 0 1.02 44103 -1.02 200 130 1; #X restore 581 37 graph; -#X obj 447 372 loadbang; +#X obj 428 364 loadbang; #X obj 165 475 hip~ 5; #X floatatom 112 65 5 0 0 0 - - - 0; #X floatatom 180 128 4 0 0 0 - - - 0; @@ -13,23 +13,22 @@ #X obj 112 89 phasor~ 0; #X obj 420 228 adc~ 1; #X obj 420 252 hip~ 5; -#X text 498 399 v-- re-read the original sample; +#X text 479 391 v-- re-read the original sample; #N canvas 0 0 450 300 (subpatch) 0; #X array graph20 44100 float 0; #X coords 0 44100 44099 0 200 130 1; #X restore 583 226 graph; #X obj 165 441 *~; -#X obj 200 283 line~; +#X obj 201 283 line~; #X obj 242 194 * 441; #X floatatom 242 170 4 0 0 0 - - - 0; #X obj 242 220 pack 0 100; #X obj 183 334 +~; -#X obj 200 307 samphold~; +#X obj 201 307 samphold~; #X obj 129 245 samphold~; #X obj 112 271 *~; #X text 581 171 ---- 44103 samples ---; -#X obj 459 443 soundfiler; -#X text 44 18 SLIDING STABLE LOOPS WITHOUT DOPPLER SHIFT; +#X obj 440 435 soundfiler; #X obj 165 528 output~; #X obj 49 257 -~ 0.5; #X obj 49 281 *~ 0.5; @@ -37,21 +36,22 @@ #X obj 225 373 tabwrite~ graph20; #X obj 183 409 tabread4~ table20; #X obj 420 307 tabwrite~ table20; -#X msg 459 419 read ../sound/voice.wav table20; +#X msg 440 411 read ../sound/voice.wav table20; #X text 310 525 This example differs from the previous one in having samphold~ objects which allow the chunk size and especially the read point to change only at points where the phase wraps around. This removes signal discontinuities (when the chunk size changes) and doppler shift when the read point is changing., f 67; -#X obj 397 58 declare -stdpath ./; +#X obj 397 77 declare -stdpath ./; #X text 250 343 <-- graph table index; #X text 459 279 <-- record; #X obj 435 280 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X obj 225 343 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X text 155 64 <-- frequency (Hz.); #X text 216 128 <-- chunk size (100ths of a second); -#X text 275 169 <-- read point in 100ths of a second; +#X text 289 169 <-- read point in 100ths of a second, f 18; #X text 601 362 ------ 1 second ------; -#X msg 447 474 \; graph20 ylabel 46000 0 44100; -#X connect 1 0 42 0; -#X connect 1 0 31 0; -#X connect 2 0 24 0; +#X msg 428 466 \; graph20 ylabel 46000 0 44100; +#X obj 47 18 cnv 5 5 25 empty empty Sliding\ Stable\ Loops\ Without\ Doopler\ Shift 15 13 0 16 #dfdfdf #202020 0; +#X connect 1 0 41 0; +#X connect 1 0 30 0; +#X connect 2 0 23 0; #X connect 3 0 7 0; #X connect 4 0 5 0; #X connect 5 0 19 0; @@ -59,23 +59,23 @@ #X connect 7 0 18 1; #X connect 7 0 19 1; #X connect 7 0 20 0; -#X connect 7 0 25 0; +#X connect 7 0 24 0; #X connect 8 0 9 0; -#X connect 9 0 30 0; +#X connect 9 0 29 0; #X connect 12 0 2 0; #X connect 13 0 18 0; #X connect 14 0 16 0; #X connect 15 0 14 0; #X connect 16 0 13 0; +#X connect 17 0 27 0; #X connect 17 0 28 0; -#X connect 17 0 29 0; #X connect 18 0 17 1; #X connect 19 0 20 1; #X connect 20 0 6 0; +#X connect 24 0 25 0; #X connect 25 0 26 0; -#X connect 26 0 27 0; -#X connect 27 0 12 0; -#X connect 29 0 12 1; -#X connect 31 0 22 0; -#X connect 36 0 30 0; -#X connect 37 0 28 0; +#X connect 26 0 12 0; +#X connect 28 0 12 1; +#X connect 30 0 22 0; +#X connect 35 0 29 0; +#X connect 36 0 27 0; diff --git a/doc/3.audio.examples/B12.sampler.transpose.pd b/doc/3.audio.examples/B12.sampler.transpose.pd index 8167a0cc..392cbf78 100644 --- a/doc/3.audio.examples/B12.sampler.transpose.pd +++ b/doc/3.audio.examples/B12.sampler.transpose.pd @@ -1,99 +1,99 @@ -#N canvas 375 38 836 666 12; +#N canvas 375 38 837 700 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array table21 44103 float 2; #X coords 0 1.02 44103 -1.02 200 130 1; -#X restore 559 296 graph; -#X obj 366 533 loadbang; -#X floatatom 47 262 6 0 0 0 - - - 0; -#X obj 47 297 * 441; -#X obj 47 427 +~ 1; -#X obj 364 408 adc~ 1; -#X obj 364 433 hip~ 5; -#X obj 81 515 *~; -#X obj 143 427 line~; -#X obj 143 377 * 441; -#X floatatom 143 352 5 0 0 0 - - - 0; -#X obj 143 402 pack 0 100; -#X obj 81 456 +~; -#X obj 143 452 samphold~; -#X obj 47 352 samphold~; -#X obj 47 322 sig~; -#X obj 47 402 *~; -#X text 28 5 CALCULATING LOOP FREQUENCY AS FUNCTION OF TRANSPOSITION; -#X obj 228 475 r~ phase; -#X obj 29 216 s~ phase; -#X obj 107 323 r~ phase; -#X obj 65 379 r~ phase; -#X obj 203 428 r~ phase; -#X obj 188 322 s chunk-size; -#X floatatom 29 62 5 0 0 0 - - - 0; -#X obj 188 297 * 0.01; -#X text 284 302 chunk size; -#X text 284 324 in seconds; -#X obj 40 117 r chunk-size; -#X obj 40 142 t b f; -#X obj 29 166 /; -#X text 89 143 divide speed change by chunk; -#X text 87 164 size to get loop frequency; -#X text 371 56 The transposition is frequency in Hz. divided by chunk size in seconds. This patch calculates the loop frequency as a function of desired transposition; -#X text 373 107 Notice now that we get Doppler effects when the chunk size changes. You can suppress that if you don't want it \, by converting the chunk size to an audio signal \, sampling and holding it. But then there would be more work to deal with very low frequencies never triggering the sample and hold...; -#X obj 366 587 soundfiler; -#X obj 29 39 loadbang; -#X obj 228 499 -~ 0.5; -#X obj 228 523 *~ 0.5; -#X obj 228 546 cos~; -#X obj 81 576 output~; -#X obj 81 481 tabread4~ table21; -#X text 459 540 v-- re-read original table; -#X text 592 430 --- 44103 samples ---; -#X obj 29 87 expr pow(2 \, $f1/120); -#X text 190 86 speed change; -#X text 376 189 You might also want to have a way to retrigger the loop to sync it with some other process. By the time we had all this built the patch would be fairly involved. For now \, we'll move on to the next topic...; -#X obj 29 190 phasor~; -#X obj 364 488 tabwrite~ table21; -#X msg 366 560 read ../sound/voice.wav table21; -#X text 403 460 <= record; -#X obj 635 17 declare -stdpath ./; -#X obj 379 461 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 81 543 hip~ 5; -#X text 71 62 <-- transposition (10ths of a halftone); -#X text 95 261 <-- chunk size (100ths of a second); -#X text 184 352 <-- read point in 100ths of a second; -#X connect 1 0 49 0; +#X restore 559 325 graph; +#X obj 366 562 loadbang; +#X floatatom 47 291 6 0 0 0 - - - 0; +#X obj 47 326 * 441; +#X obj 47 456 +~ 1; +#X obj 364 437 adc~ 1; +#X obj 364 462 hip~ 5; +#X obj 81 544 *~; +#X obj 143 456 line~; +#X obj 143 406 * 441; +#X floatatom 143 381 5 0 0 0 - - - 0; +#X obj 143 431 pack 0 100; +#X obj 81 485 +~; +#X obj 143 481 samphold~; +#X obj 47 381 samphold~; +#X obj 47 351 sig~; +#X obj 47 431 *~; +#X obj 228 504 r~ phase; +#X obj 29 245 s~ phase; +#X obj 107 352 r~ phase; +#X obj 65 408 r~ phase; +#X obj 203 457 r~ phase; +#X obj 188 351 s chunk-size; +#X floatatom 29 91 5 0 0 0 - - - 0; +#X obj 188 326 * 0.01; +#X text 284 331 chunk size; +#X text 284 353 in seconds; +#X obj 40 146 r chunk-size; +#X obj 40 171 t b f; +#X obj 29 195 /; +#X text 89 172 divide speed change by chunk; +#X text 87 193 size to get loop frequency; +#X text 376 85 The transposition is frequency in Hz. divided by chunk size in seconds. This patch calculates the loop frequency as a function of desired transposition, f 60; +#X text 376 136 Notice now that we get Doppler effects when the chunk size changes. You can suppress that if you don't want it \, by converting the chunk size to an audio signal \, sampling and holding it. But then there would be more work to deal with very low frequencies never triggering the sample and hold...; +#X obj 366 616 soundfiler; +#X obj 29 68 loadbang; +#X obj 228 528 -~ 0.5; +#X obj 228 552 *~ 0.5; +#X obj 228 575 cos~; +#X obj 81 605 output~; +#X obj 81 510 tabread4~ table21; +#X text 459 569 v-- re-read original table; +#X text 588 459 --- 44103 samples ---; +#X obj 29 116 expr pow(2 \, $f1/120); +#X text 190 115 speed change; +#X text 376 218 You might also want to have a way to retrigger the loop to sync it with some other process. By the time we had all this built the patch would be fairly involved. For now \, we'll move on to the next topic...; +#X obj 29 219 phasor~; +#X obj 364 517 tabwrite~ table21; +#X msg 366 589 read ../sound/voice.wav table21; +#X obj 639 25 declare -stdpath ./; +#X obj 379 490 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 81 572 hip~ 5; +#X text 71 91 <-- transposition (10ths of a halftone); +#X text 95 290 <-- chunk size (100ths of a second); +#X text 184 381 <-- read point in 100ths of a second; +#X obj 38 19 cnv 5 5 25 empty empty Calculating\ Loop\ Frequency\ as\ function\ of\ Transposition 15 13 0 16 #dfdfdf #202020 0; +#X text 403 489 <-- record; +#X connect 1 0 48 0; #X connect 2 0 3 0; -#X connect 2 0 25 0; +#X connect 2 0 24 0; #X connect 3 0 15 0; #X connect 4 0 12 0; #X connect 5 0 6 0; -#X connect 6 0 48 0; -#X connect 7 0 53 0; +#X connect 6 0 47 0; +#X connect 7 0 51 0; #X connect 8 0 13 0; #X connect 9 0 11 0; #X connect 10 0 9 0; #X connect 11 0 8 0; -#X connect 12 0 41 0; +#X connect 12 0 40 0; #X connect 13 0 12 1; #X connect 14 0 16 0; #X connect 15 0 14 0; #X connect 16 0 4 0; -#X connect 18 0 37 0; -#X connect 20 0 14 1; -#X connect 21 0 16 1; -#X connect 22 0 13 1; -#X connect 24 0 44 0; -#X connect 25 0 23 0; +#X connect 17 0 36 0; +#X connect 19 0 14 1; +#X connect 20 0 16 1; +#X connect 21 0 13 1; +#X connect 23 0 43 0; +#X connect 24 0 22 0; +#X connect 27 0 28 0; #X connect 28 0 29 0; -#X connect 29 0 30 0; -#X connect 29 1 30 1; -#X connect 30 0 47 0; -#X connect 36 0 24 0; +#X connect 28 1 29 1; +#X connect 29 0 46 0; +#X connect 35 0 23 0; +#X connect 36 0 37 0; #X connect 37 0 38 0; -#X connect 38 0 39 0; -#X connect 39 0 7 1; -#X connect 41 0 7 0; -#X connect 44 0 30 0; -#X connect 47 0 19 0; -#X connect 49 0 35 0; -#X connect 52 0 48 0; -#X connect 53 0 40 0; +#X connect 38 0 7 1; +#X connect 40 0 7 0; +#X connect 43 0 29 0; +#X connect 46 0 18 0; +#X connect 48 0 34 0; +#X connect 50 0 47 0; +#X connect 51 0 39 0; diff --git a/doc/3.audio.examples/B13.sampler.overlap.pd b/doc/3.audio.examples/B13.sampler.overlap.pd index b4ed7958..7c553c2c 100644 --- a/doc/3.audio.examples/B13.sampler.overlap.pd +++ b/doc/3.audio.examples/B13.sampler.overlap.pd @@ -1,39 +1,38 @@ -#N canvas 499 38 685 718 12; +#N canvas 499 38 690 758 12; #X declare -stdpath ./; -#X floatatom 35 48 5 0 100 0 - - - 0; -#X obj 35 93 * 441; -#X obj 30 400 +~ 1; -#X obj 60 491 *~; -#X obj 36 231 line~; -#X obj 36 181 * 441; -#X floatatom 36 156 5 0 100 0 - - - 0; -#X obj 36 206 pack 0 100; -#X obj 30 429 +~; -#X obj 77 427 samphold~; -#X obj 30 328 samphold~; -#X obj 30 375 *~; -#X obj 193 389 r~ phase; -#X obj 380 232 s~ phase; -#X obj 118 328 r~ phase; -#X obj 48 352 r~ phase; -#X obj 112 402 r~ phase; -#X obj 87 102 s chunk-size; -#X floatatom 380 52 5 0 0 0 - - - 0; -#X obj 87 77 * 0.01; -#X text 199 78 chunk size; -#X text 199 100 in seconds; -#X obj 391 107 r chunk-size; -#X obj 391 132 t b f; -#X obj 380 156 /; -#X obj 380 26 loadbang; -#X obj 193 413 -~ 0.5; -#X obj 193 437 *~ 0.5; -#X obj 193 460 cos~; -#X obj 60 600 output~; -#X obj 380 77 expr pow(2 \, $f1/120); -#X text 549 77 speed change; -#X obj 380 181 phasor~; -#X text 33 12 TWO OVERLAPPING SAMPLE READ ELEMENTS; +#X floatatom 35 72 5 0 100 0 - - - 0; +#X obj 35 117 * 441; +#X obj 30 424 +~ 1; +#X obj 60 515 *~; +#X obj 36 255 line~; +#X obj 36 205 * 441; +#X floatatom 36 180 5 0 100 0 - - - 0; +#X obj 36 230 pack 0 100; +#X obj 30 453 +~; +#X obj 77 451 samphold~; +#X obj 30 352 samphold~; +#X obj 30 399 *~; +#X obj 193 413 r~ phase; +#X obj 384 267 s~ phase; +#X obj 118 352 r~ phase; +#X obj 48 376 r~ phase; +#X obj 112 426 r~ phase; +#X obj 87 126 s chunk-size; +#X floatatom 384 87 5 0 0 0 - - - 0; +#X obj 87 101 * 0.01; +#X text 199 102 chunk size; +#X text 199 124 in seconds; +#X obj 395 142 r chunk-size; +#X obj 395 167 t b f; +#X obj 384 191 /; +#X obj 384 61 loadbang; +#X obj 193 437 -~ 0.5; +#X obj 193 461 *~ 0.5; +#X obj 193 484 cos~; +#X obj 60 624 output~; +#X obj 384 112 expr pow(2 \, $f1/120); +#X text 553 112 speed change; +#X obj 384 216 phasor~; #N canvas 457 259 614 280 table 0; #N canvas 0 0 450 300 (subpatch) 0; #X array table22 44103 float 2; @@ -54,57 +53,58 @@ #X connect 4 0 7 0; #X connect 8 0 5 0; #X connect 10 0 7 0; -#X restore 575 404 pd table; -#X obj 35 130 s chunk-size-samples; -#X text 196 129 ... and in samples; -#X obj 36 254 s~ read-pt; -#X obj 77 379 r~ read-pt; -#X obj 456 218 +~ 0.5; -#X obj 456 244 wrap~; -#X obj 456 269 s~ phase2; -#X obj 30 303 r chunk-size-samples; -#X obj 267 399 +~ 1; -#X obj 267 499 *~; -#X obj 267 428 +~; -#X obj 322 427 samphold~; -#X obj 267 327 samphold~; -#X obj 267 374 *~; -#X obj 432 415 -~ 0.5; -#X obj 432 439 *~ 0.5; -#X obj 432 462 cos~; -#X obj 322 377 r~ read-pt; -#X obj 267 302 r chunk-size-samples; -#X obj 356 328 r~ phase2; -#X obj 285 351 r~ phase2; -#X obj 432 391 r~ phase2; -#X obj 344 402 r~ phase2; -#X obj 60 537 +~; -#X text 418 155 loop frequency; -#X text 517 205 second phase signal; -#X text 517 225 out of phase from; -#X text 516 246 first one; -#X text 80 285 copy 1; -#X text 322 282 copy 2; -#X text 233 538 Here is the previous patch modified to use two copies of the sample reader \, 180 degrees out of phase. The second sawtooth signal is derived from the first one by adding a constant (0.5) and wrapping the result to fit again between zero and one. The result is the "phase2" signal.; -#X text 233 614 The computation of "chunk-size-samples" (as a message) and "read-pt" (an audio signal) is the same for both copies and is separated out at top left. At top right is the same loop frequency calculation as before., f 60; -#X text 233 676 Finally \, the two copies' outputs are added and the result sent to the audio output., f 60; -#X obj 30 454 tabread4~ table22; -#X obj 267 453 tabread4~ table22; -#X obj 523 16 declare -stdpath ./; -#X text 77 48 <-- chunk size (100ths of a second); -#X text 425 52 <-- transposition \, halftones/10; -#X text 78 156 <-- read point in 100ths of a second; -#X obj 60 569 hip~ 5; +#X restore 575 428 pd table; +#X obj 35 154 s chunk-size-samples; +#X text 196 153 ... and in samples; +#X obj 36 278 s~ read-pt; +#X obj 77 403 r~ read-pt; +#X obj 460 253 +~ 0.5; +#X obj 460 279 wrap~; +#X obj 460 304 s~ phase2; +#X obj 30 327 r chunk-size-samples; +#X obj 267 423 +~ 1; +#X obj 267 523 *~; +#X obj 267 452 +~; +#X obj 322 451 samphold~; +#X obj 267 351 samphold~; +#X obj 267 398 *~; +#X obj 432 439 -~ 0.5; +#X obj 432 463 *~ 0.5; +#X obj 432 486 cos~; +#X obj 322 401 r~ read-pt; +#X obj 267 326 r chunk-size-samples; +#X obj 356 352 r~ phase2; +#X obj 285 375 r~ phase2; +#X obj 432 415 r~ phase2; +#X obj 344 426 r~ phase2; +#X obj 60 561 +~; +#X text 422 190 loop frequency; +#X text 521 240 second phase signal; +#X text 521 260 out of phase from; +#X text 520 281 first one; +#X text 80 309 copy 1; +#X text 322 306 copy 2; +#X text 233 562 Here is the previous patch modified to use two copies of the sample reader \, 180 degrees out of phase. The second sawtooth signal is derived from the first one by adding a constant (0.5) and wrapping the result to fit again between zero and one. The result is the "phase2" signal.; +#X text 233 638 The computation of "chunk-size-samples" (as a message) and "read-pt" (an audio signal) is the same for both copies and is separated out at top left. At top right is the same loop frequency calculation as before., f 60; +#X text 233 700 Finally \, the two copies' outputs are added and the result sent to the audio output., f 60; +#X obj 30 478 tabread4~ table22; +#X obj 267 477 tabread4~ table22; +#X obj 513 25 declare -stdpath ./; +#X text 77 72 <-- chunk size (100ths of a second); +#X text 429 87 <-- transposition \, halftones/10; +#X text 78 180 <-- read point in 100ths of a second; +#X obj 60 593 hip~ 5; +#X obj 47 18 cnv 5 5 25 empty empty Two\ Overlapping\ Sample\ Read\ Elements 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 1 0; #X connect 0 0 19 0; -#X connect 1 0 35 0; +#X connect 1 0 34 0; #X connect 2 0 8 0; -#X connect 3 0 58 0; -#X connect 4 0 37 0; +#X connect 3 0 57 0; +#X connect 4 0 36 0; #X connect 5 0 7 0; #X connect 6 0 5 0; #X connect 7 0 4 0; -#X connect 8 0 68 0; +#X connect 8 0 67 0; #X connect 9 0 8 1; #X connect 10 0 11 0; #X connect 11 0 2 0; @@ -124,27 +124,27 @@ #X connect 28 0 3 1; #X connect 30 0 24 0; #X connect 32 0 13 0; -#X connect 32 0 39 0; -#X connect 38 0 9 0; +#X connect 32 0 38 0; +#X connect 37 0 9 0; +#X connect 38 0 39 0; #X connect 39 0 40 0; -#X connect 40 0 41 0; -#X connect 42 0 10 0; -#X connect 43 0 45 0; -#X connect 44 0 58 1; -#X connect 45 0 69 0; -#X connect 46 0 45 1; -#X connect 47 0 48 0; -#X connect 48 0 43 0; +#X connect 41 0 10 0; +#X connect 42 0 44 0; +#X connect 43 0 57 1; +#X connect 44 0 68 0; +#X connect 45 0 44 1; +#X connect 46 0 47 0; +#X connect 47 0 42 0; +#X connect 48 0 49 0; #X connect 49 0 50 0; -#X connect 50 0 51 0; -#X connect 51 0 44 1; +#X connect 50 0 43 1; +#X connect 51 0 45 0; #X connect 52 0 46 0; -#X connect 53 0 47 0; +#X connect 53 0 46 1; #X connect 54 0 47 1; -#X connect 55 0 48 1; -#X connect 56 0 49 0; -#X connect 57 0 46 1; -#X connect 58 0 74 0; -#X connect 68 0 3 0; -#X connect 69 0 44 0; -#X connect 74 0 29 0; +#X connect 55 0 48 0; +#X connect 56 0 45 1; +#X connect 57 0 73 0; +#X connect 67 0 3 0; +#X connect 68 0 43 0; +#X connect 73 0 29 0; diff --git a/doc/3.audio.examples/B14.sampler.rockafella.pd b/doc/3.audio.examples/B14.sampler.rockafella.pd index 698f4662..5e668a95 100644 --- a/doc/3.audio.examples/B14.sampler.rockafella.pd +++ b/doc/3.audio.examples/B14.sampler.rockafella.pd @@ -1,41 +1,41 @@ #N canvas 417 38 884 660 12; #X declare -stdpath ./; -#X floatatom 63 143 4 0 100 0 - - - 0; +#X floatatom 63 155 4 0 100 0 - - - 0; #X obj 187 485 *~; -#X floatatom 295 88 6 0 200 0 - - - 0; +#X floatatom 295 110 6 0 200 0 - - - 0; #X obj 61 355 +~; #X obj 61 300 samphold~; #X obj 61 327 *~; -#X obj 550 240 s~ phase; +#X obj 570 240 s~ phase; #X obj 205 330 r~ phase; -#X obj 63 196 s chunk-size; -#X floatatom 550 27 6 0 0 0 - - - 0; -#X text 157 187 chunk size; -#X text 157 201 in seconds; -#X obj 562 74 r chunk-size; -#X obj 562 99 t b f; +#X obj 63 208 s chunk-size; +#X floatatom 570 27 6 0 0 0 - - - 0; +#X text 157 199 chunk size; +#X text 157 213 in seconds; +#X obj 582 74 r chunk-size; +#X obj 582 99 t b f; #X obj 205 378 -~ 0.5; #X obj 205 402 *~ 0.5; #X obj 205 449 cos~; #X obj 187 573 output~; -#X obj 550 180 phasor~; -#X obj 395 235 s~ read-pt; +#X obj 570 180 phasor~; +#X obj 395 257 s~ read-pt; #X obj 95 355 r~ read-pt; -#X obj 621 219 +~ 0.5; -#X obj 621 245 wrap~; -#X obj 621 270 s~ phase2; +#X obj 641 219 +~ 0.5; +#X obj 641 245 wrap~; +#X obj 641 270 s~ phase2; #X obj 187 514 +~; -#X obj 63 169 * 0.001; -#X obj 353 184 phasor~; +#X obj 63 181 * 0.001; +#X obj 353 206 phasor~; #X obj 61 386 *~ 44100; #X obj 61 441 tabread4~ table23; #X obj 61 270 r chunk-size; #X obj 61 412 +~ 1; -#X floatatom 550 156 5 0 0 0 - - - 0; -#X obj 295 222 s precession; -#X obj 675 98 t b f; -#X obj 675 73 r precession; -#X obj 295 129 * 0.01; +#X floatatom 570 156 5 0 0 0 - - - 0; +#X obj 295 244 s precession; +#X obj 695 98 t b f; +#X obj 695 73 r precession; +#X obj 295 151 * 0.01; #X obj 287 506 *~; #X obj 287 367 +~; #X obj 287 318 samphold~; @@ -49,19 +49,18 @@ #X obj 287 293 r chunk-size; #X obj 287 417 +~ 1; #X obj 422 344 r~ phase2; -#X obj 63 93 loadbang; -#X text 28 38 TIME COMPRESSION/EXPANSION BY LOOPED SAMPLING; +#X obj 63 105 loadbang; #X text 524 460 We've changed the control for "chunk size" to milliseconds for added convenience \, and delayed multiplying sample location by the sample rate (44100) until the last moment \, so that calculations using "read-pt" and "chunk size" can be in the same units (seconds.), f 47; -#X msg 63 118 25; -#X floatatom 381 85 4 0 900 0 - - - 0; -#X obj 381 107 * 0.001; -#X msg 381 61 900; -#X obj 550 131 expr (pow(2 \, $f1/120)-$f3)/$f2; -#X obj 381 132 t b f; -#X obj 381 36 loadbang; -#X text 457 99 (msec); -#X obj 395 211 *~; -#X obj 353 160 /; +#X msg 63 130 25; +#X floatatom 381 107 4 0 900 0 - - - 0; +#X obj 381 129 * 0.001; +#X msg 381 83 900; +#X obj 570 131 expr (pow(2 \, $f1/120)-$f3)/$f2; +#X obj 381 154 t b f; +#X obj 381 58 loadbang; +#X text 457 121 (msec); +#X obj 395 233 *~; +#X obj 353 182 /; #N canvas 457 259 614 280 table 0; #N canvas 0 0 450 300 (subpatch) 0; #X array table23 44103 float 2; @@ -82,15 +81,16 @@ #X connect 4 0 7 0; #X connect 8 0 5 0; #X connect 10 0 7 0; -#X restore 748 236 pd table; +#X restore 768 236 pd table; #X obj 403 599 declare -stdpath ./; #X obj 187 543 hip~ 5; -#X text 416 84 <-- loop length; -#X text 187 88 precession --> (percent), f 14; -#X text 101 143 <-- chunk size (msec); +#X text 416 106 <-- loop length; +#X text 187 110 precession --> (percent), f 14; +#X text 101 155 <-- chunk size (msec); #X text 523 347 Here \, rather than ask you to push the read pointer back and forth in the sample \, we use a [phasor~]. This makes it possible to avoid the samphold~ on the read pointer ([r~ read-pt]) \, since \, knowing the precession \, we can correct for it in computing the frequency of the original [phasor~] above at right., f 46; -#X text 603 28 <--; -#X text 630 28 transposition \, halftones/10, f 14; +#X text 623 28 <--; +#X text 650 28 transposition \, halftones/10, f 14; +#X obj 47 18 cnv 5 5 25 empty empty Time\ Compression/Expansion\ by\ Looped\ Sampling 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 25 0; #X connect 1 0 24 0; #X connect 2 0 35 0; @@ -100,10 +100,10 @@ #X connect 7 0 4 1; #X connect 7 0 5 1; #X connect 7 0 14 0; -#X connect 9 0 56 0; +#X connect 9 0 55 0; #X connect 12 0 13 0; -#X connect 13 0 56 0; -#X connect 13 1 56 1; +#X connect 13 0 55 0; +#X connect 13 1 55 1; #X connect 14 0 15 0; #X connect 15 0 16 0; #X connect 16 0 1 1; @@ -112,19 +112,19 @@ #X connect 20 0 3 1; #X connect 21 0 22 0; #X connect 22 0 23 0; -#X connect 24 0 64 0; +#X connect 24 0 63 0; #X connect 25 0 8 0; -#X connect 26 0 60 0; +#X connect 26 0 59 0; #X connect 27 0 30 0; #X connect 28 0 1 0; #X connect 29 0 4 0; #X connect 30 0 28 0; #X connect 31 0 18 0; -#X connect 33 0 56 0; -#X connect 33 1 56 2; +#X connect 33 0 55 0; +#X connect 33 1 55 2; #X connect 34 0 33 0; #X connect 35 0 32 0; -#X connect 35 0 61 0; +#X connect 35 0 60 0; #X connect 36 0 24 1; #X connect 37 0 44 0; #X connect 38 0 39 0; @@ -140,16 +140,16 @@ #X connect 48 0 40 0; #X connect 48 0 39 1; #X connect 48 0 38 1; -#X connect 49 0 52 0; -#X connect 52 0 0 0; -#X connect 53 0 54 0; -#X connect 54 0 57 0; -#X connect 55 0 53 0; -#X connect 56 0 31 0; -#X connect 57 0 61 0; -#X connect 57 1 61 1; -#X connect 57 1 60 1; -#X connect 58 0 55 0; -#X connect 60 0 19 0; -#X connect 61 0 26 0; -#X connect 64 0 17 0; +#X connect 49 0 51 0; +#X connect 51 0 0 0; +#X connect 52 0 53 0; +#X connect 53 0 56 0; +#X connect 54 0 52 0; +#X connect 55 0 31 0; +#X connect 56 0 60 0; +#X connect 56 1 60 1; +#X connect 56 1 59 1; +#X connect 57 0 54 0; +#X connect 59 0 19 0; +#X connect 60 0 26 0; +#X connect 63 0 17 0; diff --git a/doc/3.audio.examples/B15.tabread4~-onset.pd b/doc/3.audio.examples/B15.tabread4~-onset.pd index d865cc56..ce261d58 100644 --- a/doc/3.audio.examples/B15.tabread4~-onset.pd +++ b/doc/3.audio.examples/B15.tabread4~-onset.pd @@ -1,32 +1,32 @@ -#N canvas 433 61 664 621 12; +#N canvas 453 60 682 628 12; #X declare -stdpath ./; -#X obj 60 515 output~; -#X obj 407 431 samplerate~; -#X obj 407 455 / 2; -#X obj 394 508 tabwrite~ \$0-tab; -#X obj 60 481 tabread4~ \$0-tab; -#X obj 407 479 osc~; -#X obj 191 481 tabread4~ \$0-tab; -#X obj 191 515 output~; -#X obj 60 398 *~ 10000; -#X obj 60 451 +~; -#X floatatom 300 360 6 0 0 0 - - - 0; -#X msg 300 330 1; -#X obj 60 369 phasor~ 0.02; -#X msg 245 330 150001; -#X text 20 245 At left below an onset (1 or 150000 samples) is added to the index of a table lookup. If you select the onset of 150001 \, you should hear the truncation error. (The table contains a Nyquist signal and the "correct" output should be a 100 Hz. tone.) At right \, the onset is presented in the separate onset inlet. The worst-case truncation error drops by about 30 dB., f 89; -#X text 93 579 BAD; -#X text 225 579 GOOD; -#X text 124 330 ONSET INTO TABLE; -#X obj 514 19 declare -stdpath ./; -#X text 422 344 First \, generate the table:; -#X obj 394 344 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 398 543 array define \$0-tab 200000; -#X text 18 19 USING ONSETS INTO TABREAD4~ TO IMPROVE ACCURACY IN SINGLE PRECISION, f 67; -#X text 20 55 None of this is needed if you have Pd compiled for double precision \, but in the case you have Pd compiled to work on 32-bit audio samples (a.k.a single precision) you do not have enough precision for use as indices into an array of more than about 32K samples. This is because the mantissa of a 32-bit floating point number has only 24 bits \, out of which you would be using 16 bits or more to address a sample more than 32K into the array \, so there would remain 8 or fewer bits to supply the fraction. In the most extreme situation possible \, the sample could contain a Nyquist frequency sinusoid and the output would then have only about 8 bits of accuracy!, f 89; -#X msg 418 382 \; pd dsp 1 \, fast-forward 4000; -#X text 20 178 You can use the "onset" inlet to [tabread4~] to get good accuracy reading longer arrays. The [tabread4~] object adds the index and the "main" (signal) inlet in double precision. So if \, for example \, the onset inlet could specify an integer exactly up to about 8 million (190 seconds at 44100 Hz) \, and the signal inlet could act as a displacement., f 89; -#X obj 300 383 sig~; +#X obj 68 518 output~; +#X obj 415 434 samplerate~; +#X obj 415 458 / 2; +#X obj 402 511 tabwrite~ \$0-tab; +#X obj 68 484 tabread4~ \$0-tab; +#X obj 415 482 osc~; +#X obj 199 484 tabread4~ \$0-tab; +#X obj 199 518 output~; +#X obj 68 401 *~ 10000; +#X obj 68 454 +~; +#X floatatom 308 363 6 0 0 0 - - - 0; +#X msg 308 333 1; +#X obj 68 372 phasor~ 0.02; +#X msg 253 333 150001; +#X text 28 248 At left below an onset (1 or 150000 samples) is added to the index of a table lookup. If you select the onset of 150001 \, you should hear the truncation error. (The table contains a Nyquist signal and the "correct" output should be a 100 Hz. tone.) At right \, the onset is presented in the separate onset inlet. The worst-case truncation error drops by about 30 dB., f 89; +#X text 101 582 BAD; +#X text 233 582 GOOD; +#X text 132 333 ONSET INTO TABLE; +#X obj 487 472 declare -stdpath ./; +#X text 430 347 First \, generate the table:; +#X obj 402 347 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 406 546 array define \$0-tab 200000; +#X text 28 58 None of this is needed if you have Pd compiled for double precision \, but in the case you have Pd compiled to work on 32-bit audio samples (a.k.a single precision) you do not have enough precision for use as indices into an array of more than about 32K samples. This is because the mantissa of a 32-bit floating point number has only 24 bits \, out of which you would be using 16 bits or more to address a sample more than 32K into the array \, so there would remain 8 or fewer bits to supply the fraction. In the most extreme situation possible \, the sample could contain a Nyquist frequency sinusoid and the output would then have only about 8 bits of accuracy!, f 89; +#X msg 426 385 \; pd dsp 1 \, fast-forward 4000; +#X text 28 181 You can use the "onset" inlet to [tabread4~] to get good accuracy reading longer arrays. The [tabread4~] object adds the index and the "main" (signal) inlet in double precision. So if \, for example \, the onset inlet could specify an integer exactly up to about 8 million (190 seconds at 44100 Hz) \, and the signal inlet could act as a displacement., f 89; +#X obj 308 386 sig~; +#X obj 50 19 cnv 5 5 25 empty empty [tabread4~]\ Onset\ to\ Improve\ Accuracy\ in\ Single\ Precision 15 13 0 16 #dfdfdf #202020 0; #X connect 1 0 2 0; #X connect 2 0 5 0; #X connect 4 0 0 0; @@ -35,12 +35,12 @@ #X connect 8 0 9 0; #X connect 8 0 6 0; #X connect 9 0 4 0; -#X connect 10 0 26 0; +#X connect 10 0 25 0; #X connect 11 0 10 0; #X connect 12 0 8 0; #X connect 13 0 10 0; #X connect 20 0 1 0; #X connect 20 0 3 0; -#X connect 20 0 24 0; -#X connect 26 0 6 1; -#X connect 26 0 9 1; +#X connect 20 0 23 0; +#X connect 25 0 6 1; +#X connect 25 0 9 1; diff --git a/doc/3.audio.examples/B16.long-varispeed.pd b/doc/3.audio.examples/B16.long-varispeed.pd index 84a56119..2953c77e 100644 --- a/doc/3.audio.examples/B16.long-varispeed.pd +++ b/doc/3.audio.examples/B16.long-varispeed.pd @@ -1,79 +1,79 @@ #N canvas 346 38 960 867 12; #X declare -stdpath ./; -#X obj 505 529 metro 100; -#X obj 238 456 phasor~; -#X obj 505 559 snapshot~; -#X obj 37 621 output~; -#X obj 38 445 phasor~; -#X floatatom 38 313 5 -100 1000 0 - - - 0; -#X obj 37 502 tabread4~ \$0-tab; -#X msg 368 313 0.5; -#X msg 404 313 0.01; -#X obj 505 442 loadbang; -#X msg 505 468 1; -#X obj 418 649 +; -#X obj 238 714 tabread4~ \$0-tab; -#X obj 476 649 f; -#X obj 386 626 t f f; -#X obj 238 750 output~; -#X floatatom 487 683 8 0 0 0 - - - 0; -#X obj 418 684 t f b; -#X obj 450 713 f; -#X obj 418 713 -; -#X floatatom 568 618 8 0 0 0 - - - 0; -#X obj 400 740 -; -#X obj 505 504 tgl 18 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1; -#X obj 238 482 -~ 0.5; -#X obj 400 829 + 0.5; -#X obj 37 474 *~ 1e+06; -#X floatatom 400 770 8 0 0 0 - - - 0; -#X obj 618 538 samplerate~; -#X obj 586 537 /; -#X obj 586 512 t f b; -#X obj 568 592 +; -#X obj 400 801 / 10000; -#X obj 238 507 *~ 10000; -#X obj 586 563 * 10000; -#X obj 571 169 samplerate~; -#X obj 571 193 / 2; -#X obj 560 244 tabwrite~ \$0-tab; -#X obj 571 217 osc~; -#X obj 560 124 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 713 238 table \$0-tab 1e+06; -#X obj 38 417 / 1e+06; -#X text 549 682 new onset is phase plus old onset; -#X obj 404 341 * 1e+06; -#X text 631 620 extrapolated phase of next sample; -#X text 482 714 new onset minus old onset; -#X text 470 748 back up phasor output by amount the onset advanced; -#X text 468 761 (approximately zero but not exactly because of; -#X text 470 775 truncation error!); -#X obj 404 367 t b f; -#X text 463 341 convert to samples; -#X text 448 368 set both last-onset and previous-onset; -#X text 448 391 ... and also reset phasor.; -#X text 465 801 convert phase back to range 0-1, f 17; -#X obj 238 419 / 10000; -#X text 45 393 cycles/sec; -#X text 45 381 convert to; -#X text 296 419 cycles/sec; -#X text 240 395 convert to; -#X text 67 685 BAD; -#X text 273 812 GOOD; -#X text 92 13 VARIABLE SPEED PLAYBACK FROM LONG TABLES; -#X msg 386 399 0; -#X text 634 503 extrapolate snapshot of phase by one sample to sync with next block, f 34; -#X obj 737 15 declare -stdpath ./; -#X msg 669 162 \; pd dsp 1 \, fast-forward 22680; -#X text 539 55 *** The table is now 1 million points and takes about 23 seconds to fill \, we also use the 'fast-forward' message to fill it., f 47; -#X text 24 43 Here is how to use the [tabread~]'s "onset" input to allow clean varispeed playback from a long table. At left \, a [phasor~] is naively rescaled to the size of the table. At right \, the [phasor~] gets only a 10000-point range about a moving "onset". Ten times per second \, we poll the [phasor~]'s phase \, sum its value into the onset \, and back up the phase of the [phasor~] correspondingly., f 69; -#X text 24 133 The tricky bits are \, first \, that we need to poll the [phasor~]'s phase one sample into the future (so we add the per-sample increment into the [snapshot~] result). Second \, we can't just reset the [phasor~] to a fixed point - instead \, we measure how much the onset has actually increased (which has truncation error from summing in the phase snapshot) \, and subtract that increase from the phase \, giving a value that differs from zero by the truncation error but reflects the true phase we should reset to for continuity., f 69; -#X text 24 252 The metronome rate is arbitrary but should be fast enough that the [phasor~] never has time to wrap., f 69; -#X text 447 312 <-- reset phase. 0.5 causes trouble for the "bad" way.; -#X text 86 312 <-- playback speed \, samples/sec; -#X text 578 449 Each 100 msec \, poll phase of [phasor~] in order to change onset to reflect it, f 38; -#X text 104 444 naive way: just run a phasor into [tabread4~], f 16; -#X text 105 544 convert phase to range +/- 5000 -->, f 18; +#X obj 505 536 metro 100; +#X obj 238 463 phasor~; +#X obj 505 566 snapshot~; +#X obj 37 628 output~; +#X obj 38 452 phasor~; +#X floatatom 38 320 5 -100 1000 0 - - - 0; +#X obj 37 509 tabread4~ \$0-tab; +#X msg 368 320 0.5; +#X msg 404 320 0.01; +#X obj 505 449 loadbang; +#X msg 505 475 1; +#X obj 418 656 +; +#X obj 238 721 tabread4~ \$0-tab; +#X obj 476 656 f; +#X obj 386 633 t f f; +#X obj 238 757 output~; +#X floatatom 487 690 8 0 0 0 - - - 0; +#X obj 418 691 t f b; +#X obj 450 720 f; +#X obj 418 720 -; +#X floatatom 568 625 8 0 0 0 - - - 0; +#X obj 400 747 -; +#X obj 505 511 tgl 18 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1; +#X obj 238 489 -~ 0.5; +#X obj 400 836 + 0.5; +#X obj 37 481 *~ 1e+06; +#X floatatom 400 777 8 0 0 0 - - - 0; +#X obj 618 545 samplerate~; +#X obj 586 544 /; +#X obj 586 519 t f b; +#X obj 568 599 +; +#X obj 400 808 / 10000; +#X obj 238 514 *~ 10000; +#X obj 586 570 * 10000; +#X obj 571 176 samplerate~; +#X obj 571 200 / 2; +#X obj 560 251 tabwrite~ \$0-tab; +#X obj 571 224 osc~; +#X obj 560 131 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 713 245 table \$0-tab 1e+06; +#X obj 38 424 / 1e+06; +#X text 549 689 new onset is phase plus old onset; +#X obj 404 348 * 1e+06; +#X text 631 627 extrapolated phase of next sample; +#X text 482 721 new onset minus old onset; +#X text 470 755 back up phasor output by amount the onset advanced; +#X text 468 768 (approximately zero but not exactly because of; +#X text 470 782 truncation error!); +#X obj 404 374 t b f; +#X text 463 348 convert to samples; +#X text 448 375 set both last-onset and previous-onset; +#X text 448 398 ... and also reset phasor.; +#X text 465 808 convert phase back to range 0-1, f 17; +#X obj 238 426 / 10000; +#X text 45 400 cycles/sec; +#X text 45 388 convert to; +#X text 296 426 cycles/sec; +#X text 240 402 convert to; +#X text 67 692 BAD; +#X text 273 819 GOOD; +#X msg 386 406 0; +#X text 634 510 extrapolate snapshot of phase by one sample to sync with next block, f 34; +#X obj 737 22 declare -stdpath ./; +#X msg 669 169 \; pd dsp 1 \, fast-forward 22680; +#X text 539 62 *** The table is now 1 million points and takes about 23 seconds to fill \, we also use the 'fast-forward' message to fill it., f 47; +#X text 24 50 Here is how to use the [tabread~]'s "onset" input to allow clean varispeed playback from a long table. At left \, a [phasor~] is naively rescaled to the size of the table. At right \, the [phasor~] gets only a 10000-point range about a moving "onset". Ten times per second \, we poll the [phasor~]'s phase \, sum its value into the onset \, and back up the phase of the [phasor~] correspondingly., f 69; +#X text 24 140 The tricky bits are \, first \, that we need to poll the [phasor~]'s phase one sample into the future (so we add the per-sample increment into the [snapshot~] result). Second \, we can't just reset the [phasor~] to a fixed point - instead \, we measure how much the onset has actually increased (which has truncation error from summing in the phase snapshot) \, and subtract that increase from the phase \, giving a value that differs from zero by the truncation error but reflects the true phase we should reset to for continuity., f 69; +#X text 24 259 The metronome rate is arbitrary but should be fast enough that the [phasor~] never has time to wrap., f 69; +#X text 447 319 <-- reset phase. 0.5 causes trouble for the "bad" way.; +#X text 86 319 <-- playback speed \, samples/sec; +#X text 578 456 Each 100 msec \, poll phase of [phasor~] in order to change onset to reflect it, f 38; +#X text 104 451 naive way: just run a phasor into [tabread4~], f 16; +#X text 105 551 convert phase to range +/- 5000 -->, f 18; +#X obj 34 14 cnv 5 5 25 empty empty Variable\ Speed\ Playback\ from\ Long\ Tables 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 2 0; #X connect 1 0 23 0; #X connect 2 0 30 0; @@ -121,12 +121,12 @@ #X connect 37 0 36 0; #X connect 38 0 34 0; #X connect 38 0 36 0; -#X connect 38 0 64 0; +#X connect 38 0 63 0; #X connect 40 0 4 0; #X connect 42 0 48 0; -#X connect 48 0 61 0; +#X connect 48 0 60 0; #X connect 48 1 18 1; #X connect 48 1 11 1; #X connect 53 0 1 0; #X connect 53 0 29 0; -#X connect 61 0 14 0; +#X connect 60 0 14 0; diff --git a/doc/3.audio.examples/C01.nyquist.pd b/doc/3.audio.examples/C01.nyquist.pd index 20f5e677..a1280dc6 100644 --- a/doc/3.audio.examples/C01.nyquist.pd +++ b/doc/3.audio.examples/C01.nyquist.pd @@ -1,15 +1,15 @@ -#N canvas 604 54 543 646 12; +#N canvas 604 54 499 645 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array table24 259 float 0; #X coords 0 1.02 258 -1.02 258 130 1 0 0; -#X restore 213 398 graph; -#X obj 60 317 line~; -#X msg 60 258 500 \, 1423 4000; -#X floatatom 71 285 5 0 0 0 - - - 0; -#X text 50 553 Synthesis techniques vary in their tendency to make foldover. For higher pitched sounds you'll want to try out relatively foldover-resistant ones., f 61; -#X obj 60 390 output~; -#X obj 325 248 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X restore 196 413 graph; +#X obj 42 333 line~; +#X msg 42 274 500 \, 1423 4000; +#X floatatom 53 301 5 0 0 0 - - - 0; +#X text 26 568 Synthesis techniques vary in their tendency to make foldover. For higher pitched sounds you'll want to try out relatively foldover-resistant ones., f 61; +#X obj 42 406 output~; +#X obj 301 263 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #N canvas 739 154 597 347 make-tab 0; #X obj 40 29 inlet; #X obj 126 29 inlet; @@ -25,25 +25,25 @@ #X connect 2 0 6 0; #X connect 3 0 7 0; #X connect 8 0 4 0; -#X restore 325 357 pd make-tab; -#X text 345 245 sine; -#X text 372 271 complex; -#X text 394 303 rectangle; -#X text 421 330 clear; -#X obj 60 350 tabosc4~ table24; -#X text 101 17 THE NYQUIST THEOREM AND FOLDOVER; -#X text 47 52 WARNING: PLAY THIS QUIETLY TO AVOID UNPLEASANTNESS AND POSSIBLE EAR DAMAGE., f 39; -#X text 46 99 Foldover occurs when you synthesize frequencies greater than the Nyquist frequency (half the sample rate). In this example \, the fundamental only reaches 1423 \, but the tables contain high partials. As the partials sweep upward you hear them reflect off the Nyquist frequency. Also \, partials can come into contact with each other causing beating. The value of 1423 was chosen to make the beating effect especially strong if you're running at a sample rate of 44100 (the usual one.); -#X obj 373 45 declare -stdpath ./; -#X obj 349 272 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 374 302 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 399 330 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 226 288 waveforms -->; +#X restore 301 372 pd make-tab; +#X text 321 260 sine; +#X text 348 286 complex; +#X text 370 318 rectangle; +#X text 397 345 clear; +#X obj 42 366 tabosc4~ table24; +#X text 98 62 WARNING: PLAY THIS QUIETLY TO AVOID UNPLEASANTNESS AND POSSIBLE EAR DAMAGE., f 39; +#X text 22 114 Foldover occurs when you synthesize frequencies greater than the Nyquist frequency (half the sample rate). In this example \, the fundamental only reaches 1423 \, but the tables contain high partials. As the partials sweep upward you hear them reflect off the Nyquist frequency. Also \, partials can come into contact with each other causing beating. The value of 1423 was chosen to make the beating effect especially strong if you're running at a sample rate of 44100 (the usual one.); +#X obj 33 496 declare -stdpath ./; +#X obj 325 287 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 350 317 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 375 345 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 202 303 waveforms -->; +#X obj 53 18 cnv 5 5 25 empty empty The\ Nyquist\ Theorem\ and\ Foldover 15 13 0 16 #dfdfdf #202020 0; #X connect 1 0 12 0; #X connect 2 0 1 0; #X connect 3 0 1 0; #X connect 6 0 7 0; #X connect 12 0 5 0; -#X connect 17 0 7 1; -#X connect 18 0 7 2; -#X connect 19 0 7 3; +#X connect 16 0 7 1; +#X connect 17 0 7 2; +#X connect 18 0 7 3; diff --git a/doc/3.audio.examples/C02.sawtooth-foldover.pd b/doc/3.audio.examples/C02.sawtooth-foldover.pd index 6134762f..c254625f 100644 --- a/doc/3.audio.examples/C02.sawtooth-foldover.pd +++ b/doc/3.audio.examples/C02.sawtooth-foldover.pd @@ -1,16 +1,15 @@ -#N canvas 516 98 521 549 12; +#N canvas 516 98 515 555 12; #X declare -stdpath ./; -#X obj 136 395 output~; -#X text 77 17 FOLDOVER IN SAWTOOTH WAVES; -#X obj 136 358 clip~ 0 1; -#X obj 136 168 mtof; -#X floatatom 136 146 5 0 0 0 - - - 0; -#X obj 136 304 *~ 20; -#X obj 136 330 -~ 19; -#X obj 136 192 phasor~; -#X obj 150 228 output~; -#X text 65 477 We'll explain more about making pulses later on... this example is mostly intended as ear training., f 50; -#X text 37 44 In more ordinary kinds of waveforms \, foldover comes across as a "cheap synth" sound. You can hear the foldover clearly in the pulse train here \, and less clearly (but still audibly) in the straight sawtooth \, especially at high pitches., f 63; +#X obj 139 413 output~; +#X obj 139 376 clip~ 0 1; +#X obj 139 186 mtof; +#X floatatom 139 164 5 0 0 0 - - - 0; +#X obj 139 322 *~ 20; +#X obj 139 348 -~ 19; +#X obj 139 210 phasor~; +#X obj 153 246 output~; +#X text 95 500 We'll explain more about making pulses later on... this example is mostly intended as ear training., f 50; +#X text 40 62 In more ordinary kinds of waveforms \, foldover comes across as a "cheap synth" sound. You can hear the foldover clearly in the pulse train here \, and less clearly (but still audibly) in the straight sawtooth \, especially at high pitches., f 63; #N canvas 698 337 212 167 set 0; #X obj 45 74 loadbang; #X msg 45 99 61; @@ -18,16 +17,17 @@ #X text 7 6 This sets the pitch initially to 61 when the patch is first opened., f 26; #X connect 0 0 1 0; #X connect 1 0 2 0; -#X restore 136 120 pd set; -#X obj 341 151 declare -stdpath ./; -#X text 271 248 <-- sawtooth amplitude; -#X text 259 414 <-- pulse train amplitude; -#X text 179 145 <-- pitch; -#X connect 2 0 0 0; -#X connect 3 0 7 0; -#X connect 4 0 3 0; -#X connect 5 0 6 0; -#X connect 6 0 2 0; -#X connect 7 0 5 0; -#X connect 7 0 8 0; -#X connect 11 0 4 0; +#X restore 139 138 pd set; +#X obj 344 169 declare -stdpath ./; +#X text 274 266 <-- sawtooth amplitude; +#X text 262 432 <-- pulse train amplitude; +#X text 182 163 <-- pitch; +#X obj 91 17 cnv 5 5 25 empty empty Foldvoer\ in\ Sawtooth\ Waves 15 13 0 16 #dfdfdf #202020 0; +#X connect 1 0 0 0; +#X connect 2 0 6 0; +#X connect 3 0 2 0; +#X connect 4 0 5 0; +#X connect 5 0 1 0; +#X connect 6 0 4 0; +#X connect 6 0 7 0; +#X connect 10 0 3 0; diff --git a/doc/3.audio.examples/C03.zipper.noise.pd b/doc/3.audio.examples/C03.zipper.noise.pd index e943646f..8d3cd415 100644 --- a/doc/3.audio.examples/C03.zipper.noise.pd +++ b/doc/3.audio.examples/C03.zipper.noise.pd @@ -1,45 +1,45 @@ -#N canvas 521 48 486 495 12; +#N canvas 521 48 498 529 12; #X declare -stdpath ./; -#X obj 165 378 output~; -#X text 55 16 ZIPPER NOISE; -#X obj 165 338 *~; -#X obj 299 378 output~; -#X obj 299 339 *~; -#X obj 183 279 line; -#X obj 317 279 line~; +#X obj 128 435 output~; +#X obj 128 395 *~; +#X obj 262 435 output~; +#X obj 262 396 *~; +#X obj 146 336 line; +#X obj 280 336 line~; #N canvas 870 186 268 250 metro 0; -#X obj 86 35 loadbang; -#X msg 86 65 1; -#X obj 86 96 metro 500; -#X obj 86 125 tgl 15 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 86 190 outlet; -#X obj 144 192 outlet; -#X obj 86 154 select 0 1, f 17; -#X connect 0 0 1 0; +#X obj 86 43 loadbang; +#X obj 86 106 metro 500; +#X obj 86 135 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 86 200 outlet; +#X obj 144 202 outlet; +#X obj 86 164 select 0 1, f 17; +#X obj 86 73 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X connect 0 0 6 0; #X connect 1 0 2 0; -#X connect 2 0 3 0; -#X connect 3 0 6 0; -#X connect 6 0 4 0; -#X connect 6 1 5 0; -#X restore 183 177 pd metro; -#X msg 183 236 1 300; -#X msg 317 238 0 300; -#X obj 232 292 osc~ 880; -#X obj 309 12 declare -stdpath ./; -#X obj 183 205 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 317 206 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 25 44 Here is a related issue: if we use a (control) [line] object to change an amplitude \, it sends ramping control messages \, once every 20 msec by default. At left we use this to control the amplitude of a sinusoid. In effect we're multiplying the sinusoid by a staircase signal (50 increments per second.) Using the signal version \, [line~] \, fixes the problem \, since [line~] outputs a ramp that is incremented every sample., f 61; -#X connect 2 0 0 0; -#X connect 4 0 3 0; -#X connect 5 0 2 1; -#X connect 6 0 4 1; -#X connect 7 0 12 0; -#X connect 7 1 13 0; +#X connect 2 0 5 0; +#X connect 5 0 3 0; +#X connect 5 1 4 0; +#X connect 6 0 1 0; +#X restore 146 224 pd metro; +#X msg 146 293 1 300; +#X msg 280 295 0 300; +#X obj 195 349 osc~ 880; +#X obj 318 37 declare -stdpath ./; +#X obj 146 262 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 280 263 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 32 84 Here is a related issue: if we use a (control) [line] object to change an amplitude \, it sends ramping control messages \, once every 20 msec by default. At left we use this to control the amplitude of a sinusoid. In effect we're multiplying the sinusoid by a staircase signal (50 increments per second.) Using the signal version \, [line~] \, fixes the problem \, since [line~] outputs a ramp that is incremented every sample., f 61; +#X obj 83 33 cnv 5 5 25 empty empty Zipper\ Noise 15 13 0 16 #dfdfdf #202020 0; +#X connect 1 0 0 0; +#X connect 3 0 2 0; +#X connect 4 0 1 1; +#X connect 5 0 3 1; +#X connect 6 0 11 0; +#X connect 6 1 12 0; +#X connect 7 0 4 0; +#X connect 7 0 5 0; +#X connect 8 0 4 0; #X connect 8 0 5 0; -#X connect 8 0 6 0; -#X connect 9 0 5 0; -#X connect 9 0 6 0; -#X connect 10 0 2 0; -#X connect 10 0 4 0; +#X connect 9 0 1 0; +#X connect 9 0 3 0; +#X connect 11 0 7 0; #X connect 12 0 8 0; -#X connect 13 0 9 0; diff --git a/doc/3.audio.examples/C04.control.to.signal.pd b/doc/3.audio.examples/C04.control.to.signal.pd index c86dcd16..76fd7179 100644 --- a/doc/3.audio.examples/C04.control.to.signal.pd +++ b/doc/3.audio.examples/C04.control.to.signal.pd @@ -1,12 +1,11 @@ -#N canvas 544 38 544 544 12; +#N canvas 544 38 544 582 12; #X declare -stdpath ./; -#X text 47 16 CONVERTING CONTROL TO SIGNALS; -#X obj 214 387 output~; -#X obj 332 387 output~; +#X obj 190 405 output~; +#X obj 308 405 output~; #N canvas 799 288 303 263 metro 0; #X obj 88 38 loadbang; #X msg 88 65 1; -#X obj 88 131 tgl 15 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000 0 1; +#X obj 88 127 tgl 15 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000 0 1; #X obj 88 153 sel 0 1; #X obj 88 190 outlet; #X obj 152 192 outlet; @@ -17,21 +16,22 @@ #X connect 3 0 4 0; #X connect 3 1 5 0; #X connect 6 0 2 0; -#X restore 214 266 pd metro; -#X obj 214 342 line~; -#X obj 332 342 vline~; -#X msg 214 305 1 2.1; -#X msg 332 305 0 2.1; +#X restore 190 284 pd metro; +#X obj 190 360 line~; +#X obj 308 360 vline~; +#X msg 190 323 1 2.1; +#X msg 308 323 0 2.1; #X obj 379 19 declare -stdpath ./; -#X text 46 49 For controlling amplitudes \, [line~] \, with its block-aligned breakpoints \, is accurate enough for most purposes. But certain usages \, such as this patch \, demand more accuracy. The [vline~] object \, somewhat more expensive than [line~] \, can handle breakpoints to sub-sample accuracy., f 60; -#X text 46 129 Here we try out [line~] and [vline~] as triangle wave generators. The subpatch is still sending alternating bangs as in the last patch \, but now at an audible frequency \, every 2 msec.; -#X text 47 195 The effect of [line~] rounding breakpoints to the nearest block (on the order of a millisecond) is that each 4-ms-long cycle has a different shape. Using [vline~] resolves the problem.; -#X text 62 486 Sometimes you will want to use [vline~] in place of [sig~] for the same reason., f 52; -#X connect 3 0 6 0; -#X connect 3 1 7 0; +#X text 60 55 For controlling amplitudes \, [line~] \, with its block-aligned breakpoints \, is accurate enough for most purposes. But certain usages \, such as this patch \, demand more accuracy. The [vline~] object \, somewhat more expensive than [line~] \, can handle breakpoints to sub-sample accuracy., f 60; +#X text 60 135 Here we try out [line~] and [vline~] as triangle wave generators. The subpatch is still sending alternating bangs as in the last patch \, but now at an audible frequency \, every 2 msec.; +#X text 61 201 The effect of [line~] rounding breakpoints to the nearest block (on the order of a millisecond) is that each 4-ms-long cycle has a different shape. Using [vline~] resolves the problem.; +#X text 105 496 Sometimes you will want to use [vline~] in place of [sig~] for the same reason., f 52; +#X obj 42 13 cnv 5 5 25 empty empty Converting\ Control\ to\ Signals 15 13 0 16 #dfdfdf #202020 0; +#X connect 2 0 5 0; +#X connect 2 1 6 0; +#X connect 3 0 0 0; #X connect 4 0 1 0; -#X connect 5 0 2 0; +#X connect 5 0 3 0; +#X connect 5 0 4 0; +#X connect 6 0 3 0; #X connect 6 0 4 0; -#X connect 6 0 5 0; -#X connect 7 0 4 0; -#X connect 7 0 5 0; diff --git a/doc/3.audio.examples/C05.sampler.oneshot.pd b/doc/3.audio.examples/C05.sampler.oneshot.pd index 21f6b472..4acfb08e 100644 --- a/doc/3.audio.examples/C05.sampler.oneshot.pd +++ b/doc/3.audio.examples/C05.sampler.oneshot.pd @@ -5,14 +5,13 @@ #X coords 0 1.02 176403 -1.02 200 130 1; #X restore 599 287 graph; #X obj 547 470 loadbang; -#X obj 405 210 hip~ 5; +#X obj 412 221 hip~ 5; #X obj 583 98 adc~ 1; #X obj 583 128 hip~ 5; #X text 647 476 v-- re-read the original sample; -#X text 78 31 ONE-SHOT SAMPLER USING LINE~ AS PHASE; -#X obj 405 176 *~; -#X obj 445 149 r cutoff; -#X obj 405 59 r phase; +#X obj 412 187 *~; +#X obj 452 160 r cutoff; +#X obj 412 70 r phase; #X obj 149 143 delay 5; #X msg 49 179 \; cutoff 0 5; #X obj 662 178 line~; @@ -22,12 +21,12 @@ #X msg 722 126 0 10; #X text 58 568 We avoid clicking at the end of the table by getting the table's own contents to go smoothly to zero. To do this we added a level control to the recording patch that cuts off just before the recording reaches the end of the table., f 59; #X obj 547 529 soundfiler; -#X obj 445 176 vline~; -#X obj 405 250 output~; -#X obj 405 89 vline~; +#X obj 452 187 vline~; +#X obj 412 261 output~; +#X obj 412 100 vline~; #X obj 651 218 tabwrite~ tab28; #X msg 547 500 read ../sound/bell.aiff tab28; -#X obj 405 119 tabread4~ tab28; +#X obj 412 130 tabread4~ tab28; #X msg 149 178 \; phase 1 \, 4.41e+08 1e+07 \; cutoff 1; #X msg 662 116 0 \, 1 5; #X text 651 532 My apologies to Jonathan Harvey whose bell this is., f 26; @@ -43,25 +42,26 @@ #X text 58 352 Here's how to make a sampler with a [line~] object \, instead of a [phasor~] \, to generate the read location signal.; #X text 58 393 To start a note \, first we have to mute the output in case there's already something playing---otherwise we'll get a click. The "cutoff" [line~] then takes 5 msec to get to zero. After that amount of delay \, we reset the phase to sample number 1 and set it in motion. We want the [line~] output to increase by 1 each sample of output \, so we ask for it to do 4.41e+08 samples in 1e+07 milliseconds., f 59; #X text 58 501 The cutoff mechanism is still safe if we happen to ask for two notes in under 5 msec. The second request would reset the delay \, so that there's no way the delay can possibly fire without the cutoff [line~] at zero., f 59; -#X connect 1 0 23 0; -#X connect 2 0 20 0; +#X obj 42 13 cnv 5 5 25 empty empty One-Shot\ Sampler\ using\ [line~]\ as\ Phase 15 13 0 16 #dfdfdf #202020 0; +#X connect 1 0 22 0; +#X connect 2 0 19 0; #X connect 3 0 4 0; -#X connect 4 0 13 0; -#X connect 7 0 2 0; -#X connect 8 0 19 0; -#X connect 9 0 21 0; -#X connect 10 0 25 0; -#X connect 12 0 13 1; -#X connect 13 0 22 0; -#X connect 15 0 16 0; -#X connect 16 0 12 0; -#X connect 19 0 7 1; -#X connect 21 0 24 0; -#X connect 23 0 18 0; -#X connect 24 0 7 0; -#X connect 26 0 12 0; -#X connect 34 0 11 0; -#X connect 34 0 10 0; -#X connect 35 0 15 0; -#X connect 35 0 26 0; -#X connect 35 0 22 0; +#X connect 4 0 12 0; +#X connect 6 0 2 0; +#X connect 7 0 18 0; +#X connect 8 0 20 0; +#X connect 9 0 24 0; +#X connect 11 0 12 1; +#X connect 12 0 21 0; +#X connect 14 0 15 0; +#X connect 15 0 11 0; +#X connect 18 0 6 1; +#X connect 20 0 23 0; +#X connect 22 0 17 0; +#X connect 23 0 6 0; +#X connect 25 0 11 0; +#X connect 33 0 10 0; +#X connect 33 0 9 0; +#X connect 34 0 14 0; +#X connect 34 0 25 0; +#X connect 34 0 21 0; diff --git a/doc/3.audio.examples/C06.signal.to.control.pd b/doc/3.audio.examples/C06.signal.to.control.pd index 2cb0255a..9f6a1227 100644 --- a/doc/3.audio.examples/C06.signal.to.control.pd +++ b/doc/3.audio.examples/C06.signal.to.control.pd @@ -1,16 +1,18 @@ -#N canvas 649 71 500 361 12; -#X obj 126 267 snapshot~; -#X obj 151 237 phasor~ 1; -#X floatatom 126 298 10 0 0 0 - - - 16; -#X text 25 18 CONVERTING SIGNALS TO CONTROLS; -#X obj 126 201 metro 100; -#X obj 126 168 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1; -#X text 31 51 The [snapshot~] object allows you to convert from signals to control streams (float messages) -- an opposite of [sig~]. The value output is always the end of the most recently computed audio block \, so that even if you bang it metronomically (as here) it need not give you samples that are exactly evenly spaced., f 62; -#X obj 280 165 ../5.reference/set-dsp-tgl; -#X text 311 168 DSP on/off; -#X msg 280 202 \; pd dsp \$1; +#N canvas 649 71 504 416 12; +#X obj 175 311 snapshot~; +#X obj 88 252 phasor~ 1; +#X floatatom 175 342 10 0 0 0 - - - 16; +#X obj 175 245 metro 100; +#X obj 175 212 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1; +#X text 36 90 The [snapshot~] object allows you to convert from signals to control streams (float messages) -- an opposite of [sig~]. The value output is always the end of the most recently computed audio block \, so that even if you bang it metronomically (as here) it need not give you samples that are exactly evenly spaced., f 62; +#X obj 300 209 ../5.reference/set-dsp-tgl; +#X text 331 212 DSP on/off; +#X msg 300 246 \; pd dsp \$1; +#X obj 67 31 cnv 5 5 25 empty empty Converting\ Signals\ to\ Controls 15 13 0 16 #dfdfdf #202020 0; +#X obj 175 274 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X connect 0 0 2 0; #X connect 1 0 0 0; -#X connect 4 0 0 0; -#X connect 5 0 4 0; -#X connect 7 0 9 0; +#X connect 3 0 10 0; +#X connect 4 0 3 0; +#X connect 6 0 8 0; +#X connect 10 0 0 0; diff --git a/doc/3.audio.examples/C07.envelope.follower.pd b/doc/3.audio.examples/C07.envelope.follower.pd index af3324bf..ded3bcb7 100644 --- a/doc/3.audio.examples/C07.envelope.follower.pd +++ b/doc/3.audio.examples/C07.envelope.follower.pd @@ -1,5 +1,4 @@ #N canvas 236 38 1039 698 12; -#X text 86 41 ENVELOPE FOLLOWERS; #X text 48 332 Envelope followers are frequently used to detect attacks and periods of silence. (There are fancier attack detectors out there \, though.) Here is a simple threshold-based attack and rest detector., f 59; #X obj 587 58 dbtorms; #X obj 511 45 osc~ 440; @@ -50,43 +49,44 @@ #X msg 156 146 \; pd dsp \$1; #X text 49 221 The [env~] object reports the RMS signal level over the last 512 samples (by default) or any other power of 2 that's at least twice the block size. The analysis is done in an overlapped fashion so that results appear every N/2 points if N is the analysis window size. So the larger the window \, the stabler the result and the less frequently it appears. Computation time doesn't depend heavily on N., f 59; #X text 48 408 Both detectors are state machines with two states \, "on" and "off". If on \, a test is run to determine whether to turn off \, and vice versa. The tests are run at each output of the [env~] object., f 56; -#X connect 2 0 35 1; -#X connect 3 0 35 0; -#X connect 4 0 5 0; -#X connect 4 0 7 0; -#X connect 5 0 18 0; -#X connect 6 0 2 0; -#X connect 7 0 8 0; -#X connect 7 1 44 1; -#X connect 8 0 17 0; -#X connect 9 0 10 0; -#X connect 9 1 11 0; +#X obj 108 36 cnv 5 5 25 empty empty Envelope\ Followers 15 13 0 16 #dfdfdf #202020 0; +#X connect 1 0 34 1; +#X connect 2 0 34 0; +#X connect 3 0 4 0; +#X connect 3 0 6 0; +#X connect 4 0 17 0; +#X connect 5 0 1 0; +#X connect 6 0 7 0; +#X connect 6 1 43 1; +#X connect 7 0 16 0; +#X connect 8 0 9 0; +#X connect 8 1 10 0; +#X connect 9 0 11 0; #X connect 10 0 12 0; #X connect 11 0 13 0; +#X connect 11 0 15 0; #X connect 12 0 14 0; -#X connect 12 0 16 0; -#X connect 13 0 15 0; -#X connect 14 0 8 0; -#X connect 15 0 8 0; -#X connect 17 0 44 0; -#X connect 18 0 19 0; -#X connect 18 1 25 0; -#X connect 19 0 24 0; -#X connect 20 0 21 0; -#X connect 20 1 28 0; -#X connect 21 0 26 1; -#X connect 22 0 19 0; -#X connect 23 0 19 0; -#X connect 24 0 45 0; -#X connect 25 0 27 0; -#X connect 25 0 45 1; -#X connect 26 0 31 0; -#X connect 27 0 26 0; -#X connect 28 0 23 0; -#X connect 29 0 22 0; -#X connect 29 0 30 0; -#X connect 31 0 29 0; -#X connect 35 0 4 0; -#X connect 44 0 9 0; -#X connect 45 0 20 0; -#X connect 46 0 48 0; +#X connect 13 0 7 0; +#X connect 14 0 7 0; +#X connect 16 0 43 0; +#X connect 17 0 18 0; +#X connect 17 1 24 0; +#X connect 18 0 23 0; +#X connect 19 0 20 0; +#X connect 19 1 27 0; +#X connect 20 0 25 1; +#X connect 21 0 18 0; +#X connect 22 0 18 0; +#X connect 23 0 44 0; +#X connect 24 0 26 0; +#X connect 24 0 44 1; +#X connect 25 0 30 0; +#X connect 26 0 25 0; +#X connect 27 0 22 0; +#X connect 28 0 21 0; +#X connect 28 0 29 0; +#X connect 30 0 28 0; +#X connect 34 0 3 0; +#X connect 43 0 8 0; +#X connect 44 0 19 0; +#X connect 45 0 47 0; diff --git a/doc/3.audio.examples/C08.analog.sequencer.pd b/doc/3.audio.examples/C08.analog.sequencer.pd index 0cec4cd4..f369f254 100644 --- a/doc/3.audio.examples/C08.analog.sequencer.pd +++ b/doc/3.audio.examples/C08.analog.sequencer.pd @@ -4,34 +4,34 @@ #X array 29-sequence 9 float 3; #A 0 55 550 385 495 165 385 495 275 615; #X coords 0 650 9 0 200 100 1 0 0; -#X restore 533 77 graph; -#X obj 95 496 *~; -#X obj 95 524 hip~ 5; +#X restore 533 91 graph; +#X obj 95 510 *~; +#X obj 95 538 hip~ 5; #N canvas 0 0 450 300 (subpatch) 0; #X array 29-envelope 103 float 1; #A 0 -0.0199988 1.0673e-06 0.0500008 0.13 0.16 0.28 0.5 0.6 0.7 0.8 1.01111 1 0.988889 0.977778 0.966667 0.955556 0.944444 0.933333 0.922222 0.911111 0.9 0.888889 0.797778 0.737777 0.677777 0.647777 0.617777 0.557777 0.487777 0.467777 0.447776 0.417776 0.397776 0.387776 0.377776 0.367776 0.347776 0.327776 0.317776 0.297776 0.277776 0.267776 0.257776 0.257776 0.277776 0.297776 0.327776 0.357776 0.377776 0.397776 0.407776 0.427776 0.437776 0.387776 0.367776 0.347776 0.337776 0.287776 0.277776 0.277776 0.277776 0.267776 0.267776 0.267776 0.297776 0.317776 0.347776 0.367776 0.367776 0.357776 0.347776 0.337776 0.307776 0.287776 0.257776 0.227776 0.197776 0.167776 0.167776 0.167776 0.167776 0.167776 0.157776 0.157776 0.157776 0.157776 0.147776 0.147776 0.147776 0.137776 0.137776 0.111111 0.1 0.0888889 0.0777778 0.0666667 0.0555556 0.0444444 0.0333333 0.0222222 0.0111111 0 -0.0111111; #X coords 0 1.01 102 -0.01 200 100 1 0 0; -#X restore 533 197 graph; +#X restore 533 211 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array 29-sample 259 float 1; #A 0 1 0.989177 0.95694 0.903989 0.83147 0.740951 0.634393 0.514103 0.382683 0.24298 0.0980171 -0.0490677 -0.19509 -0.33689 -0.471397 -0.595699 -0.707107 -0.803208 -0.881921 -0.941544 -0.980785 -0.998795 -0.995185 -0.970031 -0.92388 -0.857729 -0.77301 -0.671559 -0.55557 -0.427555 -0.290285 -0.14673 -1.83697e-16 0.14673 0.290285 0.427555 0.55557 0.671559 0.77301 0.857729 0.92388 0.970031 0.995185 0.998795 0.980785 0.941544 0.881921 0.803208 0.707107 0.595699 0.471397 0.33689 0.19509 0.0490677 -0.0980171 -0.24298 -0.382683 -0.514103 -0.634393 -0.740951 -0.83147 -0.903989 -0.95694 -0.989177 -1 -0.989177 -0.95694 -0.903989 -0.83147 -0.740951 -0.634393 -0.514103 -0.382683 -0.24298 -0.0980171 0.0490677 0.19509 0.33689 0.471397 0.595699 0.707107 0.803208 0.881921 0.941544 0.980785 0.998795 0.995185 0.970031 0.92388 0.857729 0.77301 0.671559 0.55557 0.427555 0.290285 0.14673 5.51091e-16 -0.14673 -0.290285 -0.427555 -0.55557 -0.671559 -0.77301 -0.857729 -0.92388 -0.970031 -0.995185 -0.998795 -0.980785 -0.941544 -0.881921 -0.803208 -0.707107 -0.595699 -0.471397 -0.33689 -0.19509 -0.0490677 0.0980171 0.24298 0.382683 0.514103 0.634393 0.740951 0.83147 0.903989 0.95694 0.989177 1 0.989177 0.95694 0.903989 0.83147 0.740951 0.634393 0.514103 0.382683 0.24298 0.0980171 -0.0490677 -0.19509 -0.33689 -0.471397 -0.595699 -0.707107 -0.803208 -0.881921 -0.941544 -0.980785 -0.998795 -0.995185 -0.970031 -0.92388 -0.857729 -0.77301 -0.671559 -0.55557 -0.427555 -0.290285 -0.14673 -2.69484e-15 0.14673 0.290285 0.427555 0.55557 0.671559 0.77301 0.857729 0.92388 0.970031 0.995185 0.998795 0.980785 0.941544 0.881921 0.803208 0.707107 0.595699 0.471397 0.33689 0.19509 0.0490677 -0.0980171 -0.24298 -0.382683 -0.514103 -0.634393 -0.740951 -0.83147 -0.903989 -0.95694 -0.989177 -1 -0.989177 -0.95694 -0.903989 -0.83147 -0.740951 -0.634393 -0.514103 -0.382683 -0.24298 -0.0980171 0.0490677 0.19509 0.33689 0.471397 0.595699 0.707107 0.803208 0.881921 0.941544 0.980785 0.998795 0.995185 0.970031 0.92388 0.857729 0.77301 0.671559 0.55557 0.427555 0.290285 0.14673 -4.90478e-16 -0.14673 -0.290285 -0.427555 -0.55557 -0.671559 -0.77301 -0.857729 -0.92388 -0.970031 -0.995185 -0.998795 -0.980785 -0.941544 -0.881921 -0.803208 -0.707107 -0.595699 -0.471397 -0.33689 -0.19509 -0.0490677 0.0980171 0.24298 0.382683 0.514103 0.634393 0.740951 0.83147 0.903989 0.95694 0.989177 1 0.989177 0.95694; #X coords 0 1 258 -1 200 100 1; -#X restore 533 316 graph; -#X obj 72 257 tabread~ 29-sequence; -#X obj 131 289 wrap~; -#X obj 131 312 *~ 100; -#X obj 131 336 +~ 1; -#X obj 72 289 phasor~; -#X obj 72 320 -~ 0.5; -#X obj 72 414 cos~; -#X obj 113 387 *~; -#X obj 95 564 output~; -#X obj 113 466 tabread4~ 29-sample; -#X obj 131 360 tabread4~ 29-envelope; -#X obj 113 414 *~ 128; -#X obj 113 438 +~ 129; -#X obj 72 438 +~ 1; -#X obj 131 226 *~ 9; +#X restore 533 330 graph; +#X obj 72 271 tabread~ 29-sequence; +#X obj 131 303 wrap~; +#X obj 131 326 *~ 100; +#X obj 131 350 +~ 1; +#X obj 72 303 phasor~; +#X obj 72 334 -~ 0.5; +#X obj 72 428 cos~; +#X obj 113 401 *~; +#X obj 95 578 output~; +#X obj 113 480 tabread4~ 29-sample; +#X obj 131 374 tabread4~ 29-envelope; +#X obj 113 428 *~ 128; +#X obj 113 452 +~ 129; +#X obj 72 452 +~ 1; +#X obj 131 240 *~ 9; #N canvas 875 258 533 565 make-tables 0; #X obj 162 106 t b b; #X obj 205 163 f; @@ -64,19 +64,19 @@ #X connect 13 0 4 1; #X connect 13 1 5 0; #X connect 15 0 0 0; -#X restore 590 473 pd make-tables; -#X text 64 13 ANALOG-SYNTH-STYLE SEQUENCER; -#X obj 131 198 phasor~ 0.6; -#X text 172 226 main loop: sawtooth of amplitude 9; -#X text 221 258 read frequency sequence; -#X text 187 288 9x original frequency sawtooth; -#X text 144 387 multiply envelope by audio-frequency sawtooth; -#X text 170 425 adjust amplitude and center for wavetable; -#X text 128 496 multiply by raised-cosine smoothing function; -#X text 549 451 how to make the tables:; -#X obj 624 19 declare -stdpath ./; -#X text 187 312 adjust for reading envelope sample; -#X text 49 41 Some control operations can be carried out entirely by tilde objects passing audio signals around. Here is an imitation of an analog sequencer and envelope generator. A [phasor~] loops through the "sequence" table at 0.6 Hz \, generating 9 frequencies. Simultaneously \, by multiplying by 9 and wrapping \, we create a sawtooth at 9 * 0.6 = 5.4 Hz \, which reads a second table for an envelope shape. This becomes the grain size for a sampler based on the B08.sampler.loop example earlier., f 57; +#X restore 590 487 pd make-tables; +#X obj 131 212 phasor~ 0.6; +#X text 172 240 main loop: sawtooth of amplitude 9; +#X text 221 272 read frequency sequence; +#X text 187 302 9x original frequency sawtooth; +#X text 144 401 multiply envelope by audio-frequency sawtooth; +#X text 170 439 adjust amplitude and center for wavetable; +#X text 128 510 multiply by raised-cosine smoothing function; +#X text 549 465 how to make the tables:; +#X obj 624 33 declare -stdpath ./; +#X text 187 326 adjust for reading envelope sample; +#X text 49 55 Some control operations can be carried out entirely by tilde objects passing audio signals around. Here is an imitation of an analog sequencer and envelope generator. A [phasor~] loops through the "sequence" table at 0.6 Hz \, generating 9 frequencies. Simultaneously \, by multiplying by 9 and wrapping \, we create a sawtooth at 9 * 0.6 = 5.4 Hz \, which reads a second table for an envelope shape. This becomes the grain size for a sampler based on the B08.sampler.loop example earlier., f 57; +#X obj 73 17 cnv 5 5 25 empty empty Analog\ Synth\ Style\ Sequencer 15 13 0 16 #dfdfdf #202020 0; #X connect 1 0 2 0; #X connect 2 0 13 0; #X connect 5 0 9 0; @@ -95,4 +95,4 @@ #X connect 18 0 1 0; #X connect 19 0 5 0; #X connect 19 0 6 0; -#X connect 22 0 19 0; +#X connect 21 0 19 0; diff --git a/doc/3.audio.examples/C09.sample.hold.pd b/doc/3.audio.examples/C09.sample.hold.pd index 0d02829c..b03989c8 100644 --- a/doc/3.audio.examples/C09.sample.hold.pd +++ b/doc/3.audio.examples/C09.sample.hold.pd @@ -4,7 +4,6 @@ #X array samphold 44100 float 0; #X coords 0 1 44100 0 300 200 1; #X restore 497 87 graph; -#X text 61 29 SAMPLE AND HOLD; #X obj 267 310 phasor~ 5; #X obj 144 285 phasor~ 7; #X obj 144 310 samphold~; @@ -22,31 +21,32 @@ #X msg 179 173 3.7 8.8; #X msg 244 173 3.4 8.9; #X obj 144 471 output~; -#X text 356 280 <= reset phase; #X obj 651 24 declare -stdpath ./; #X obj 144 225 unpack float float; #X obj 236 344 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X text 262 343 <-- graph output; #X obj 144 410 mtof~; #X text 35 57 Another analog favorite \, the sample and hold unit freezes an audio signal on command. In the Pd version \, the second input of [samphold~] triggers it and the first input becomes the output's new value whenever the trigger decreases from one sample to the next. This is ideal for updating values when a [phasor~] wraps around.; -#X connect 2 0 4 1; -#X connect 3 0 4 0; -#X connect 4 0 8 0; -#X connect 4 0 7 0; -#X connect 5 0 3 0; -#X connect 6 0 2 0; -#X connect 8 0 9 0; -#X connect 9 0 24 0; -#X connect 10 0 18 0; -#X connect 11 0 2 1; -#X connect 11 0 3 1; -#X connect 12 0 21 0; -#X connect 13 0 21 0; -#X connect 14 0 21 0; -#X connect 15 0 21 0; -#X connect 16 0 21 0; -#X connect 17 0 21 0; -#X connect 21 0 5 0; -#X connect 21 1 6 0; -#X connect 22 0 7 0; -#X connect 24 0 10 0; +#X obj 105 15 cnv 5 5 25 empty empty Sample\ and\ Hold 15 13 0 16 #dfdfdf #202020 0; +#X text 356 279 <-- reset phase; +#X connect 1 0 3 1; +#X connect 2 0 3 0; +#X connect 3 0 7 0; +#X connect 3 0 6 0; +#X connect 4 0 2 0; +#X connect 5 0 1 0; +#X connect 7 0 8 0; +#X connect 8 0 22 0; +#X connect 9 0 17 0; +#X connect 10 0 1 1; +#X connect 10 0 2 1; +#X connect 11 0 19 0; +#X connect 12 0 19 0; +#X connect 13 0 19 0; +#X connect 14 0 19 0; +#X connect 15 0 19 0; +#X connect 16 0 19 0; +#X connect 19 0 4 0; +#X connect 19 1 5 0; +#X connect 20 0 6 0; +#X connect 22 0 9 0; diff --git a/doc/3.audio.examples/C10.monophonic.synth.pd b/doc/3.audio.examples/C10.monophonic.synth.pd index 743b6fb2..4446c9ad 100644 --- a/doc/3.audio.examples/C10.monophonic.synth.pd +++ b/doc/3.audio.examples/C10.monophonic.synth.pd @@ -1,63 +1,63 @@ #N canvas 502 38 542 797 12; #X declare -stdpath ./; -#X obj 131 474 mtof; -#X text 115 14 MONOPHONIC MIDI SYNTH; -#X obj 139 386 notein; -#X obj 222 532 line~; -#X msg 222 501 \$1 100; -#X obj 131 716 output~; -#X obj 131 680 hip~ 5; -#X obj 131 619 *~; -#X obj 131 501 phasor~; -#X obj 131 525 -~ 0.5; -#X obj 131 567 cos~; -#X obj 204 588 *~; -#X obj 131 591 +~ 1; -#X obj 204 636 cos~; -#X text 90 453 pitch; -#X obj 131 652 *~; -#X obj 222 474 / 127; -#X obj 204 612 *~ 2; -#X obj 222 561 +~ 0.5; -#X text 272 525 envelope generator now controls amplitude as well as grain size, f 31; -#X obj 314 15 declare -stdpath ./; -#X text 71 241 The synthesis technique is the same as in the previous patch \, done in a simpler (but less general) way with a [cos~] object replacing the wavetable lookup., f 58; -#X obj 105 424 poly 1 1; -#X text 208 443 velocity; -#X msg 153 322 55 64; -#X msg 246 322 55 0; -#X msg 105 322 48 64; -#X msg 203 322 48 0; -#X msg 51 322 48 128; -#X listbox 105 358 7 0 0 0 - - - 0; -#X text 71 140 The [poly] object is actually better suited to handle polyphony \, but you can set it to a single voice with the first argument and ignore the left outlet output. The second argument sets the object to "voice stealing" so new pressed notes will replace previous ones that are still pressed (which can then get released without interfering)., f 58; -#X text 293 314 These simulate MIDI messages, f 15; -#X text 71 49 This patch shows how to make a monophonic synthesizer that could be controlled from a MIDI keyboard. First \, at top \, incoming MIDI notes are parsed via the [poly] object and used to set pitch and trigger an attack/release envelope. You can use your MIDI keyboard with [notein] to test it or the messages below.; -#X text 250 596 This replaces the [tabread4~] in the previous patch (the [+~ 0.5] and [*~ 2] are fudge factors)., f 33; -#X connect 0 0 8 0; -#X connect 2 0 22 0; -#X connect 2 1 22 1; -#X connect 3 0 15 1; -#X connect 3 0 18 0; -#X connect 4 0 3 0; -#X connect 6 0 5 0; -#X connect 7 0 15 0; +#X obj 114 478 mtof; +#X obj 122 390 notein; +#X obj 205 536 line~; +#X msg 205 505 \$1 100; +#X obj 114 720 output~; +#X obj 114 684 hip~ 5; +#X obj 114 623 *~; +#X obj 114 505 phasor~; +#X obj 114 529 -~ 0.5; +#X obj 114 571 cos~; +#X obj 187 592 *~; +#X obj 114 595 +~ 1; +#X obj 187 640 cos~; +#X text 73 457 pitch; +#X obj 114 656 *~; +#X obj 205 478 / 127; +#X obj 187 616 *~ 2; +#X obj 205 565 +~ 0.5; +#X text 255 529 envelope generator now controls amplitude as well as grain size, f 31; +#X obj 343 18 declare -stdpath ./; +#X text 54 245 The synthesis technique is the same as in the previous patch \, done in a simpler (but less general) way with a [cos~] object replacing the wavetable lookup., f 58; +#X obj 88 428 poly 1 1; +#X text 191 447 velocity; +#X msg 136 326 55 64; +#X msg 229 326 55 0; +#X msg 88 326 48 64; +#X msg 186 326 48 0; +#X msg 34 326 48 128; +#X listbox 88 362 7 0 0 0 - - - 0; +#X text 54 144 The [poly] object is actually better suited to handle polyphony \, but you can set it to a single voice with the first argument and ignore the left outlet output. The second argument sets the object to "voice stealing" so new pressed notes will replace previous ones that are still pressed (which can then get released without interfering)., f 58; +#X text 276 318 These simulate MIDI messages, f 15; +#X text 54 53 This patch shows how to make a monophonic synthesizer that could be controlled from a MIDI keyboard. First \, at top \, incoming MIDI notes are parsed via the [poly] object and used to set pitch and trigger an attack/release envelope. You can use your MIDI keyboard with [notein] to test it or the messages below.; +#X text 233 600 This replaces the [tabread4~] in the previous patch (the [+~ 0.5] and [*~ 2] are fudge factors)., f 33; +#X obj 69 14 cnv 5 5 25 empty empty Monophonic\ MIDI\ Synth 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 7 0; +#X connect 1 0 21 0; +#X connect 1 1 21 1; +#X connect 2 0 14 1; +#X connect 2 0 17 0; +#X connect 3 0 2 0; +#X connect 5 0 4 0; +#X connect 6 0 14 0; +#X connect 7 0 8 0; +#X connect 8 0 10 0; #X connect 8 0 9 0; #X connect 9 0 11 0; -#X connect 9 0 10 0; -#X connect 10 0 12 0; -#X connect 11 0 17 0; -#X connect 12 0 7 0; -#X connect 13 0 7 1; -#X connect 15 0 6 0; -#X connect 16 0 4 0; -#X connect 17 0 13 0; -#X connect 18 0 11 1; -#X connect 22 1 0 0; -#X connect 22 2 16 0; -#X connect 24 0 29 0; -#X connect 25 0 29 0; -#X connect 26 0 29 0; -#X connect 27 0 29 0; -#X connect 28 0 29 0; -#X connect 29 0 22 0; +#X connect 10 0 16 0; +#X connect 11 0 6 0; +#X connect 12 0 6 1; +#X connect 14 0 5 0; +#X connect 15 0 3 0; +#X connect 16 0 12 0; +#X connect 17 0 10 1; +#X connect 21 1 0 0; +#X connect 21 2 15 0; +#X connect 23 0 28 0; +#X connect 24 0 28 0; +#X connect 25 0 28 0; +#X connect 26 0 28 0; +#X connect 27 0 28 0; +#X connect 28 0 21 0; diff --git a/doc/3.audio.examples/D01.envelope.gen.pd b/doc/3.audio.examples/D01.envelope.gen.pd index 59dde186..a19253a1 100644 --- a/doc/3.audio.examples/D01.envelope.gen.pd +++ b/doc/3.audio.examples/D01.envelope.gen.pd @@ -1,40 +1,40 @@ #N canvas 430 38 561 667 12; #X declare -stdpath ./; -#X text 182 278 attack; -#X text 256 279 release; -#X obj 189 421 line~; -#X msg 259 379 0 500; -#X text 82 18 ENVELOPE GENERATORS; -#X obj 86 409 phasor~ 50; -#X obj 171 473 *~; -#X obj 171 525 wrap~; -#X msg 188 379 1 2500; -#X obj 86 433 -~ 0.5; -#X msg 123 355 10 200; -#X obj 171 586 output~; -#X obj 171 498 +~ 0.5; -#X obj 171 552 hip~ 5; -#X msg 198 330 stop; -#X text 50 226 The synthesis method is a form of waveshaping \, which is the subject of a later chapter.; -#X obj 393 14 declare -stdpath ./; -#X obj 188 298 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 259 299 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 188 355 delay 200; -#X text 48 143 You can hit the "attack" and/or "release" while something is still going on from a previous attack or release \, and the envelope generator does the "right thing". In particular \, the release button sends a "stop" to the [del] object \, in case it is still scheduled to go off from a previous attack.; -#X text 49 46 This patch uses an envelope generator to control a sound. When you hit "attack" two things happen. First \, the [line~] object rises to 10 in 200 milliseconds. Then after a delay of the same 200 msec via the [del] object \, the second message sends the [line~] back down to 1 over another 2500 msec. The "release" just ramps us down to zero at the end.; -#X connect 2 0 6 1; +#X text 222 289 attack; +#X text 296 290 release; +#X obj 229 432 line~; +#X msg 299 390 0 500; +#X obj 126 420 phasor~ 50; +#X obj 211 484 *~; +#X obj 211 536 wrap~; +#X msg 228 390 1 2500; +#X obj 126 444 -~ 0.5; +#X msg 163 366 10 200; +#X obj 211 597 output~; +#X obj 211 509 +~ 0.5; +#X obj 211 563 hip~ 5; +#X msg 238 341 stop; +#X text 52 235 The synthesis method is a form of waveshaping \, which is the subject of a later chapter.; +#X obj 373 14 declare -stdpath ./; +#X obj 228 309 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 299 310 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 228 366 delay 200; +#X text 50 152 You can hit the "attack" and/or "release" while something is still going on from a previous attack or release \, and the envelope generator does the "right thing". In particular \, the release button sends a "stop" to the [del] object \, in case it is still scheduled to go off from a previous attack.; +#X text 51 55 This patch uses an envelope generator to control a sound. When you hit "attack" two things happen. First \, the [line~] object rises to 10 in 200 milliseconds. Then after a delay of the same 200 msec via the [del] object \, the second message sends the [line~] back down to 1 over another 2500 msec. The "release" just ramps us down to zero at the end.; +#X obj 69 14 cnv 5 5 25 empty empty Envelope\ Generators 15 13 0 16 #dfdfdf #202020 0; +#X connect 2 0 5 1; #X connect 3 0 2 0; -#X connect 5 0 9 0; +#X connect 4 0 8 0; +#X connect 5 0 11 0; #X connect 6 0 12 0; -#X connect 7 0 13 0; -#X connect 8 0 2 0; -#X connect 9 0 6 0; -#X connect 10 0 2 0; -#X connect 12 0 7 0; -#X connect 13 0 11 0; -#X connect 14 0 19 0; -#X connect 17 0 10 0; -#X connect 17 0 19 0; -#X connect 18 0 3 0; -#X connect 18 0 14 0; -#X connect 19 0 8 0; +#X connect 7 0 2 0; +#X connect 8 0 5 0; +#X connect 9 0 2 0; +#X connect 11 0 6 0; +#X connect 12 0 10 0; +#X connect 13 0 18 0; +#X connect 16 0 9 0; +#X connect 16 0 18 0; +#X connect 17 0 3 0; +#X connect 17 0 13 0; +#X connect 18 0 7 0; diff --git a/doc/3.audio.examples/D02.adsr.pd b/doc/3.audio.examples/D02.adsr.pd index fda98230..01be1b4e 100644 --- a/doc/3.audio.examples/D02.adsr.pd +++ b/doc/3.audio.examples/D02.adsr.pd @@ -12,7 +12,6 @@ #X msg 283 324 \; pd dsp 1 \; trigger 0 \; graphit bang; #X msg 297 194 \; trigger 0; #X text 463 424 1; -#X text 151 19 ENVELOPE GENERATOR ABSTRACTION; #X obj 45 147 osc~ 440; #X obj 45 393 *~; #X obj 45 428 output~; @@ -27,13 +26,14 @@ #X obj 297 169 del 750; #X obj 63 261 adsr 1 100 200 50 250; #X text 461 549 0; -#X connect 2 0 20 0; +#X obj 69 14 cnv 5 5 25 empty empty Envelope\ Generator\ Abstraction 15 13 0 16 #dfdfdf #202020 0; +#X connect 2 0 19 0; #X connect 4 0 3 0; +#X connect 9 0 10 0; #X connect 10 0 11 0; -#X connect 11 0 12 0; -#X connect 14 0 5 0; -#X connect 14 0 21 0; -#X connect 20 0 22 0; -#X connect 21 0 7 0; -#X connect 22 0 3 0; -#X connect 22 0 11 1; +#X connect 13 0 5 0; +#X connect 13 0 20 0; +#X connect 19 0 21 0; +#X connect 20 0 7 0; +#X connect 21 0 3 0; +#X connect 21 0 10 1; diff --git a/doc/3.audio.examples/D03.envelope.dB.pd b/doc/3.audio.examples/D03.envelope.dB.pd index 03c3566f..ae5c6985 100644 --- a/doc/3.audio.examples/D03.envelope.dB.pd +++ b/doc/3.audio.examples/D03.envelope.dB.pd @@ -1,13 +1,12 @@ -#N canvas 542 38 578 742 12; +#N canvas 542 38 577 751 12; #X declare -stdpath ./; -#X obj 114 121 r trigger; -#X text 124 16 USING ADSR'S OUTPUT AS dB; -#X obj 114 208 tabread4~ dbtorms; +#X obj 114 150 r trigger; +#X obj 114 237 tabread4~ dbtorms; #N canvas 0 0 450 300 (subpatch) 0; #X array dbtorms 123 float 1; #A 0 0 0 1.25893e-05 1.41254e-05 1.58489e-05 1.77828e-05 1.99526e-05 2.23872e-05 2.51189e-05 2.81838e-05 3.16228e-05 3.54813e-05 3.98107e-05 4.46684e-05 5.01187e-05 5.62341e-05 6.30957e-05 7.07946e-05 7.94328e-05 8.91251e-05 0.0001 0.000112202 0.000125893 0.000141254 0.000158489 0.000177828 0.000199526 0.000223872 0.000251189 0.000281838 0.000316228 0.000354813 0.000398107 0.000446684 0.000501187 0.000562341 0.000630957 0.000707946 0.000794328 0.000891251 0.001 0.00112202 0.00125893 0.00141254 0.00158489 0.00177828 0.00199526 0.00223872 0.00251189 0.00281838 0.00316228 0.00354813 0.00398107 0.00446684 0.00501187 0.00562341 0.00630957 0.00707946 0.00794328 0.00891251 0.01 0.0112202 0.0125893 0.0141254 0.0158489 0.0177828 0.0199526 0.0223872 0.0251189 0.0281838 0.0316228 0.0354813 0.0398107 0.0446684 0.0501187 0.0562341 0.0630957 0.0707946 0.0794328 0.0891251 0.1 0.112202 0.125893 0.141254 0.158489 0.177828 0.199526 0.223872 0.251189 0.281838 0.316228 0.354813 0.398107 0.446684 0.501187 0.562341 0.630957 0.707946 0.794328 0.891251 1 1.12202 1.25893 1.41254 1.58489 1.77828 1.99526 2.23872 2.51189 2.81838 3.16228 3.54813 3.98107 4.46684 5.01187 5.62341 6.30957 7.07946 7.94328 8.91251 10 11.2202 12.5893; #X coords 0 10 123 0 200 100 1; -#X restore 284 240 graph; +#X restore 284 269 graph; #N canvas 461 387 594 359 make-table 0; #X obj 101 232 moses 2; #X msg 62 32 bang; @@ -48,28 +47,29 @@ #X connect 15 0 14 0; #X connect 17 0 6 1; #X connect 17 1 9 0; -#X restore 385 396 pd make-table; -#X text 82 395 here's the patch I used to make the table:; -#X obj 37 164 osc~ 440; -#X text 486 333 0; -#X text 487 234 10; -#X text 295 346 ------ 123 samples ------; -#X msg 411 134 \; pd dsp 1 \; trigger 0; -#X obj 96 238 *~; -#X msg 317 134 \; pd dsp 1 \; trigger 1; -#X obj 114 179 adsr 100 100 200 70 300; -#X text 82 437 The table is indexed from 1 to 120 so that 1 gives a true zero out and 120 gives 10 (a 20 dB boost.) The extra 20 dB are for headroom.; -#X text 80 606 Notice how the attack sounds different when you retrigger than when you start from zero. This is because if you go from the steady state you only rise 30 dB instead of 100 \, so it sounds slower... a slur effect. If you don't want this \, you might try increasing the amplitude of retriggered notes in comparison to isolated ones.; -#X obj 96 266 output~; -#X obj 96 344 declare -stdpath ./; -#X text 76 47 For more natural sounding amplitude control \, you can use the ADSR's output as log amplitude. Technically \, this is more efficient if done using a lookup table.; -#X text 78 487 There's also a "real" [dbtorms~] object that you can just use instead if CPU cost is not a concern and the next example will use that instead \, but for didatical reasons it's shown how to implement a lookup table instead in cases where you might be really concerned (as running Pd in a microcontroller) since [dbtorms~] it's almost certainly much more compute-intensive than ptabread4~] \, since it has to call a library "exp" function.); -#X obj 114 147 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; -#X text 324 110 attack:; -#X text 414 110 release:; -#X connect 0 0 20 0; -#X connect 2 0 11 1; -#X connect 6 0 11 0; -#X connect 11 0 16 0; -#X connect 13 0 2 0; -#X connect 20 0 13 0; +#X restore 385 425 pd make-table; +#X text 82 424 here's the patch I used to make the table:; +#X obj 37 193 osc~ 440; +#X text 486 362 0; +#X text 487 263 10; +#X text 295 375 ------ 123 samples ------; +#X msg 418 163 \; pd dsp 1 \; trigger 0; +#X obj 96 267 *~; +#X msg 324 163 \; pd dsp 1 \; trigger 1; +#X obj 114 208 adsr 100 100 200 70 300; +#X text 82 466 The table is indexed from 1 to 120 so that 1 gives a true zero out and 120 gives 10 (a 20 dB boost.) The extra 20 dB are for headroom.; +#X text 80 635 Notice how the attack sounds different when you retrigger than when you start from zero. This is because if you go from the steady state you only rise 30 dB instead of 100 \, so it sounds slower... a slur effect. If you don't want this \, you might try increasing the amplitude of retriggered notes in comparison to isolated ones.; +#X obj 96 295 output~; +#X obj 96 373 declare -stdpath ./; +#X text 78 516 There's also a "real" [dbtorms~] object that you can just use instead if CPU cost is not a concern and the next example will use that instead \, but for didatical reasons it's shown how to implement a lookup table instead in cases where you might be really concerned (as running Pd in a microcontroller) since [dbtorms~] it's almost certainly much more compute-intensive than ptabread4~] \, since it has to call a library "exp" function.); +#X obj 114 176 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 331 139 attack:; +#X text 421 139 release:; +#X obj 118 20 cnv 5 5 25 empty empty Using\ [adsr]'s\ output\ as\ dB 15 13 0 16 #dfdfdf #202020 0; +#X text 69 66 For more natural sounding amplitude control \, you can use an ADSR's output as log amplitude. Technically \, this is more efficient if done using a lookup table., f 61; +#X connect 0 0 18 0; +#X connect 1 0 10 1; +#X connect 5 0 10 0; +#X connect 10 0 15 0; +#X connect 12 0 1 0; +#X connect 18 0 12 0; diff --git a/doc/3.audio.examples/D04.envelope.quartic.pd b/doc/3.audio.examples/D04.envelope.quartic.pd index b8cd2404..b9f87637 100644 --- a/doc/3.audio.examples/D04.envelope.quartic.pd +++ b/doc/3.audio.examples/D04.envelope.quartic.pd @@ -22,7 +22,6 @@ #X obj 107 357 r amp; #X obj 197 295 r freq; #X obj 268 295 r amp; -#X text 79 26 QUARTIC AND LINEAR ENVELOPES COMPARED; #X obj 467 483 loadbang; #X msg 467 511 \; amp 1 \; freq 1760; #X text 56 297 LINEAR; @@ -40,12 +39,13 @@ #X msg 511 364 \; freq 880 1000; #X msg 511 407 \; freq 220 1000; #X msg 377 407 \; freq 110 5000; +#X obj 112 16 cnv 5 5 25 empty empty Quartic\ and\ Linear\ Envelopes\ Compared 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 1 0; -#X connect 1 0 27 0; +#X connect 1 0 26 0; #X connect 2 0 1 1; #X connect 3 0 0 0; #X connect 4 0 5 0; -#X connect 5 0 28 0; +#X connect 5 0 27 0; #X connect 6 0 14 0; #X connect 6 0 14 1; #X connect 7 0 12 0; @@ -68,4 +68,4 @@ #X connect 19 0 2 0; #X connect 20 0 16 0; #X connect 21 0 17 0; -#X connect 23 0 24 0; +#X connect 22 0 23 0; diff --git a/doc/3.audio.examples/D05.envelope.pitch.pd b/doc/3.audio.examples/D05.envelope.pitch.pd index 5f0b6f1e..e65cd65c 100644 --- a/doc/3.audio.examples/D05.envelope.pitch.pd +++ b/doc/3.audio.examples/D05.envelope.pitch.pd @@ -1,21 +1,20 @@ #N canvas 529 38 615 718 12; #X declare -stdpath ./; -#X obj 68 397 *~; -#X text 90 19 PITCH ENVELOPES; -#X obj 260 387 tabread4~ mtof; -#X obj 260 414 osc~; -#X obj 260 356 +~ 69; -#X text 62 515 This is an extreme use of pitch enveloping. In a real situation you might want an envelope controlling vibrato depth or the like instead of straight pitch., f 69; -#X obj 68 319 adsr 100 50 200 90 1000; -#X obj 260 319 adsr 20 200 100 100 1000; -#X obj 68 438 output~; -#X obj 263 466 declare -stdpath ./; -#X text 130 176 <-- attack; -#X text 507 176 <-- release; -#X text 66 50 For pitch envelopes \, unlike amplitude envelopes \, discontinuities are allowed and sometimes you would rather the envelope generator actually jump to zero when it's triggered. The [adsr] abstraction does this for you if you send a negative trigger instead of a positive one:, f 65; -#X text 444 319 <-- click to open and check the inner workings of the abstraction., f 17; -#X obj 68 353 dbtorms~; -#X text 62 576 We have added a new table ("mtof") for converting audio signals from pitch to frequency. Like in the previous example \, there's also a real [mtof~] object you can use instead and that we'll use in the next examples. The table lookup is \, again \, for CPU efficiency concerns and its range is 1-127 \, so you want to add a base pitch in before you start reading from it., f 69; +#X obj 68 409 *~; +#X obj 260 399 tabread4~ mtof; +#X obj 260 426 osc~; +#X obj 260 368 +~ 69; +#X text 62 527 This is an extreme use of pitch enveloping. In a real situation you might want an envelope controlling vibrato depth or the like instead of straight pitch., f 69; +#X obj 68 331 adsr 100 50 200 90 1000; +#X obj 260 331 adsr 20 200 100 100 1000; +#X obj 68 450 output~; +#X obj 263 478 declare -stdpath ./; +#X text 130 188 <-- attack; +#X text 507 188 <-- release; +#X text 66 62 For pitch envelopes \, unlike amplitude envelopes \, discontinuities are allowed and sometimes you would rather the envelope generator actually jump to zero when it's triggered. The [adsr] abstraction does this for you if you send a negative trigger instead of a positive one:, f 65; +#X text 444 331 <-- click to open and check the inner workings of the abstraction., f 17; +#X obj 68 365 dbtorms~; +#X text 62 588 We have added a new table ("mtof") for converting audio signals from pitch to frequency. Like in the previous example \, there's also a real [mtof~] object you can use instead and that we'll use in the next examples. The table lookup is \, again \, for CPU efficiency concerns and its range is 1-127 \, so you want to add a base pitch in before you start reading from it., f 69; #N canvas 453 231 801 286 mtof-table 0; #X msg 67 39 bang; #X obj 67 68 t b b; @@ -59,27 +58,28 @@ #X connect 15 0 5 1; #X connect 15 1 6 0; #X connect 17 0 20 0; -#X restore 402 409 pd mtof-table; -#X obj 68 286 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; -#X obj 260 286 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; -#X obj 68 233 r trigger; -#X obj 260 233 r trigger2; -#X floatatom 68 259 3 0 0 0 - - - 0; -#X floatatom 260 259 3 0 0 0 - - - 0; -#X msg 51 159 \; trigger 1 \; trigger2 1; -#X msg 224 159 \; trigger 1 \; trigger2 -1; -#X msg 427 159 \; trigger 0 \; trigger2 0; -#X text 321 162 <-- attack restarting pitch env, f 10; -#X connect 0 0 8 0; -#X connect 2 0 3 0; -#X connect 3 0 0 1; -#X connect 4 0 2 0; -#X connect 6 0 14 0; -#X connect 7 0 4 0; -#X connect 14 0 0 0; +#X restore 402 421 pd mtof-table; +#X obj 68 298 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 260 298 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 68 245 r trigger; +#X obj 260 245 r trigger2; +#X floatatom 68 271 3 0 0 0 - - - 0; +#X floatatom 260 271 3 0 0 0 - - - 0; +#X msg 51 171 \; trigger 1 \; trigger2 1; +#X msg 224 171 \; trigger 1 \; trigger2 -1; +#X msg 427 171 \; trigger 0 \; trigger2 0; +#X text 321 174 <-- attack restarting pitch env, f 10; +#X obj 100 14 cnv 5 5 25 empty empty Pitch\ Envelopes 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 7 0; +#X connect 1 0 2 0; +#X connect 2 0 0 1; +#X connect 3 0 1 0; +#X connect 5 0 13 0; +#X connect 6 0 3 0; +#X connect 13 0 0 0; +#X connect 16 0 5 0; #X connect 17 0 6 0; -#X connect 18 0 7 0; +#X connect 18 0 20 0; #X connect 19 0 21 0; -#X connect 20 0 22 0; +#X connect 20 0 16 0; #X connect 21 0 17 0; -#X connect 22 0 18 0; diff --git a/doc/3.audio.examples/D06.envelope.portamento.pd b/doc/3.audio.examples/D06.envelope.portamento.pd index 132626af..012a3403 100644 --- a/doc/3.audio.examples/D06.envelope.portamento.pd +++ b/doc/3.audio.examples/D06.envelope.portamento.pd @@ -1,43 +1,43 @@ -#N canvas 481 68 579 381 12; +#N canvas 617 93 531 407 12; #X declare -stdpath ./; -#X obj 50 232 osc~; -#X text 45 18 PORTAMENTO; -#X obj 50 173 line~; -#X obj 50 111 r pitch; -#X msg 178 175 36, f 2; -#X msg 207 175 48, f 2; -#X msg 234 175 60, f 2; -#X msg 291 175 72, f 2; -#X msg 263 175 67, f 2; -#X msg 344 175 76, f 2; -#X msg 319 175 74, f 2; -#X obj 319 240 s pitch; -#X msg 371 175 84, f 2; -#X msg 400 175 96, f 2; -#X floatatom 117 111 4 0 0 0 - - - 0; -#X floatatom 319 214 6 0 0 0 - - - 0; -#X obj 291 149 loadbang; -#X obj 50 274 output~; -#X obj 407 97 declare -stdpath ./; -#X obj 50 142 pack f 100; -#X text 155 110 <-- change speed; -#X obj 50 203 mtof~; -#X text 44 49 Portamento can be done using just [line~] \, but you still might want to sweep in pitch \, not frequency:; -#X text 429 175 <-- set pitch; -#X connect 0 0 17 0; -#X connect 2 0 21 0; -#X connect 3 0 19 0; -#X connect 4 0 15 0; -#X connect 5 0 15 0; -#X connect 6 0 15 0; -#X connect 7 0 15 0; -#X connect 8 0 15 0; -#X connect 9 0 15 0; -#X connect 10 0 15 0; -#X connect 12 0 15 0; -#X connect 13 0 15 0; -#X connect 14 0 19 1; -#X connect 15 0 11 0; -#X connect 16 0 7 0; -#X connect 19 0 2 0; -#X connect 21 0 0 0; +#X obj 55 273 osc~; +#X obj 55 214 line~; +#X obj 55 152 r pitch; +#X msg 143 226 36, f 2; +#X msg 172 226 48, f 2; +#X msg 199 226 60, f 2; +#X msg 256 226 72, f 2; +#X msg 228 226 67, f 2; +#X msg 309 226 76, f 2; +#X msg 284 226 74, f 2; +#X obj 284 291 s pitch; +#X msg 336 226 84, f 2; +#X msg 365 226 96, f 2; +#X floatatom 122 152 4 0 0 0 - - - 0; +#X floatatom 284 265 6 0 0 0 - - - 0; +#X obj 256 200 loadbang; +#X obj 55 315 output~; +#X obj 284 341 declare -stdpath ./; +#X obj 55 183 pack f 100; +#X text 160 151 <-- change speed; +#X obj 55 244 mtof~; +#X text 63 70 Portamento can be done using just [line~] \, but you still might want to sweep in pitch \, not frequency:; +#X text 394 226 <-- set pitch; +#X obj 174 19 cnv 5 5 25 empty empty Portamento 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 16 0; +#X connect 1 0 20 0; +#X connect 2 0 18 0; +#X connect 3 0 14 0; +#X connect 4 0 14 0; +#X connect 5 0 14 0; +#X connect 6 0 14 0; +#X connect 7 0 14 0; +#X connect 8 0 14 0; +#X connect 9 0 14 0; +#X connect 11 0 14 0; +#X connect 12 0 14 0; +#X connect 13 0 18 1; +#X connect 14 0 10 0; +#X connect 15 0 6 0; +#X connect 18 0 1 0; +#X connect 20 0 0 0; diff --git a/doc/3.audio.examples/D07.additive.pd b/doc/3.audio.examples/D07.additive.pd index b89f504d..3dcf693b 100644 --- a/doc/3.audio.examples/D07.additive.pd +++ b/doc/3.audio.examples/D07.additive.pd @@ -1,35 +1,35 @@ -#N canvas 500 48 610 549 12; +#N canvas 500 48 614 583 12; #X declare -stdpath ./; -#X floatatom 297 351 5 0 0 0 - dur - 0; -#X floatatom 242 351 5 0 0 0 - pitch - 0; -#X text 53 12 ADDITIVE SYNTHESIS; -#X text 199 352 pitch; -#X obj 188 463 output~; -#X obj 109 262 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 21 480 declare -stdpath ./; -#X msg 109 294 all bang; -#X obj 188 418 clone 11 partial; -#X msg 242 386 all \$1; -#X msg 297 386 all \$1; -#X obj 413 286 text define -k partials; +#X floatatom 306 381 5 0 0 0 - dur - 0; +#X floatatom 251 381 5 0 0 0 - pitch - 0; +#X text 208 382 pitch; +#X obj 197 493 output~; +#X obj 118 292 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 410 495 declare -stdpath ./; +#X msg 118 324 all bang; +#X obj 197 448 clone 11 partial; +#X msg 251 416 all \$1; +#X msg 306 416 all \$1; +#X obj 422 316 text define -k partials; #A set 0 1 1 0.56 0 \; 1 0.67 0.9 0.56 1 \; 2 1 0.65 0.92 0 \; 3 1.8 0.55 0.92 1.7 \; 4 2.67 0.32 1.19 0 \; 5 1.67 0.35 1.7 0 \; 6 1.46 0.25 2 0 \; 7 1.33 0.2 2.74 0 \; 8 1.33 0.15 3 0 \; 9 1 0.1 3.76 0 \; 10 1.33 0.075 4.07 0; -#X obj 188 304 text sequence partials; -#X msg 188 270 line 0 \, bang; -#X text 44 262 play -->; -#X obj 297 206 loadbang; -#X msg 297 242 \; pitch 72 \; dur 40; -#X text 342 344 duration (tenths of seconds), f 17; -#X text 27 41 This patch demonstrates using an abstraction \, [partial] \, to make a simple additive synthesis instrument originally from Jean-Claude Risset., f 78; -#X text 27 81 We use [clone] to create 11 copies of the abstraction and send list messages from a [text] object whose arguments are: instance number \, amplitude \, relative duration \, relative frequency and detuning frequency - click [text define] to see this. The usage of [text] is merely cosmetical as it's less polluted than using many messages in a message box. All the messages in [text define] are "dumped" with [text sequence]. You set absolute duration and pitch using the number box controls below. Click the bang to make sound., f 78; -#X text 437 262 click to open:; -#X connect 0 0 10 0; -#X connect 1 0 9 0; -#X connect 5 0 7 0; -#X connect 7 0 8 0; -#X connect 8 0 4 0; -#X connect 9 0 8 1; -#X connect 10 0 8 2; -#X connect 12 0 8 0; -#X connect 13 0 12 0; -#X connect 15 0 13 0; -#X connect 15 0 16 0; +#X obj 197 334 text sequence partials; +#X msg 197 300 line 0 \, bang; +#X text 53 292 play -->; +#X obj 306 236 loadbang; +#X msg 306 272 \; pitch 72 \; dur 40; +#X text 351 374 duration (tenths of seconds), f 17; +#X text 36 71 This patch demonstrates using an abstraction \, [partial] \, to make a simple additive synthesis instrument originally from Jean-Claude Risset., f 78; +#X text 36 111 We use [clone] to create 11 copies of the abstraction and send list messages from a [text] object whose arguments are: instance number \, amplitude \, relative duration \, relative frequency and detuning frequency - click [text define] to see this. The usage of [text] is merely cosmetical as it's less polluted than using many messages in a message box. All the messages in [text define] are "dumped" with [text sequence]. You set absolute duration and pitch using the number box controls below. Click the bang to make sound., f 78; +#X text 446 292 click to open:; +#X obj 139 23 cnv 5 5 25 empty empty Additive\ Synthesis 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 9 0; +#X connect 1 0 8 0; +#X connect 4 0 6 0; +#X connect 6 0 7 0; +#X connect 7 0 3 0; +#X connect 8 0 7 1; +#X connect 9 0 7 2; +#X connect 11 0 7 0; +#X connect 12 0 11 0; +#X connect 14 0 12 0; +#X connect 14 0 15 0; diff --git a/doc/3.audio.examples/D08.table.spectrum.pd b/doc/3.audio.examples/D08.table.spectrum.pd index 6c522c6f..b56a41a8 100644 --- a/doc/3.audio.examples/D08.table.spectrum.pd +++ b/doc/3.audio.examples/D08.table.spectrum.pd @@ -1,36 +1,36 @@ -#N canvas 462 91 741 542 12; +#N canvas 462 91 741 557 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array spectrum-tab 127 float 1; #A 0 48.5713 48.5713 48.5713 48.2142 48.2142 48.2142 48.2142 48.2142 48.2142 48.2142 48.2142 48.2142 48.2142 48.5713 48.5713 48.9284 48.9284 48.9284 48.9284 48.9284 48.9284 48.9284 48.5713 48.5713 48.5713 48.2142 48.2142 47.4999 47.1427 46.4285 46.4285 46.0713 46.0713 46.0713 45.7142 44.9999 44.6428 43.5713 43.2142 42.8571 42.4999 41.7856 38.2143 36.7857 34.6429 31.7857 30.3572 29.6429 28.5715 27.8572 26.7858 25.3572 25.7144 23.9287 23.9287 23.5715 23.5715 23.5715 23.5715 23.2144 23.2144 23.2144 22.8573 22.8573 23.5715 23.9287 23.5715 26.0715 26.0715 48.5713 48.5713 48.5713 48.2142 47.4999 46.7856 46.7856 17.143 16.4287 16.0716 16.4287 14.643 13.5716 13.5716 40.7142 40.7142 40.7142 14.643 13.2145 12.8573 12.5002 12.5002 24.2858 29.6429 30.7143 16.4287 10.7145 11.7859 10.7145 24.2858 23.5715 17.143 13.9288 9.64309 6.78597 5.71455 5.71455 4.28599 3.92885 3.92885 3.92885 1.42887 1.42887 1.42887 1.07174 1.07174 1.07174 0.714596 0.714596 0.714596 0.714596 0.714596 1.07174 1.07174 1.07174 1.07174 0.714286 0.357143; #X coords 0 50 126 0 300 140 1; -#X restore 374 152 graph; -#X obj 110 155 s pitch; -#X floatatom 110 127 4 0 0 0 - - - 0; -#X text 130 17 DRAWABLE SPECTRA; -#X floatatom 110 196 4 0 0 0 - - - 0; -#X obj 110 243 s whammybar; +#X restore 374 164 graph; +#X obj 110 167 s pitch; +#X floatatom 110 139 4 0 0 0 - - - 0; +#X floatatom 110 208 4 0 0 0 - - - 0; +#X obj 110 255 s whammybar; #N canvas 411 321 482 150 table-setup 0; #X obj 41 37 loadbang; #X msg 41 71 \; spectrum-tab xlabel -2.5 0 12 24 36 48 60 72 84 96 108 120; #X connect 0 0 1 0; -#X restore 486 402 pd table-setup; -#X msg 471 342 \; spectrum-tab const 0; -#X text 33 47 In this array \, you can draw a spectral envelope that will be synthesized by an oscillator bank. Each oscillator in the bank computes its own frequency and uses it to look up amplitude from the array., f 65; -#X text 622 350 CLEAR; -#X obj 67 437 output~; -#X obj 534 66 declare -stdpath ./; -#X obj 377 424 loadbang; -#X obj 377 449 metro 30; -#X obj 377 475 s poll-table; -#X text 205 437 And here we send bangs to "poll-table" needed by the abstraction., f 23; -#X text 54 290 The [clone] object carries the bank of oscillators \, which is 30 copies of the [spectrum-partial] abstraction - click to open and see it:, f 39; -#X obj 67 390 clone -s 1 spectrum-partial 30; -#X text 144 126 <-- pitch; -#X text 148 196 <-- left or right shift (normally 0), f 19; -#X text 598 402 <-- make the number labels, f 14; +#X restore 486 414 pd table-setup; +#X msg 471 354 \; spectrum-tab const 0; +#X text 33 59 In this array \, you can draw a spectral envelope that will be synthesized by an oscillator bank. Each oscillator in the bank computes its own frequency and uses it to look up amplitude from the array., f 65; +#X text 622 362 CLEAR; +#X obj 67 449 output~; +#X obj 534 78 declare -stdpath ./; +#X obj 377 436 loadbang; +#X obj 377 461 metro 30; +#X obj 377 487 s poll-table; +#X text 205 449 And here we send bangs to "poll-table" needed by the abstraction., f 23; +#X text 54 302 The [clone] object carries the bank of oscillators \, which is 30 copies of the [spectrum-partial] abstraction - click to open and see it:, f 39; +#X obj 67 402 clone -s 1 spectrum-partial 30; +#X text 144 138 <-- pitch; +#X text 148 208 <-- left or right shift (normally 0), f 19; +#X text 598 414 <-- make the number labels, f 14; +#X obj 151 15 cnv 5 5 25 empty empty Drawable\ Spectra 15 13 0 16 #dfdfdf #202020 0; #X connect 2 0 1 0; -#X connect 4 0 5 0; +#X connect 3 0 4 0; +#X connect 11 0 12 0; #X connect 12 0 13 0; -#X connect 13 0 14 0; -#X connect 17 0 10 0; +#X connect 16 0 9 0; diff --git a/doc/3.audio.examples/D09.shepard.tone.pd b/doc/3.audio.examples/D09.shepard.tone.pd index 5865017d..69a275ff 100644 --- a/doc/3.audio.examples/D09.shepard.tone.pd +++ b/doc/3.audio.examples/D09.shepard.tone.pd @@ -27,11 +27,11 @@ #X obj 324 478 rev2~, f 13; #X obj 250 521 output~; #X obj 109 242 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 46 23 SHEPARD TONE; #X obj 371 24 declare -stdpath ./; #X obj 324 386 clone 20 shepvoice; #X text 26 53 This patch has a bank of 20 sinusoids (the [shepvoice] abstraction with 20 copies in [clone]) \, arranged so that their frequencies sweep upward or downward in parallel \, and their amplitudes fade in and out so that each one is quiet when it wraps around from one end to the other. The overall "phase" computed here is added to each voice's relative phase (its creation argument). The "incr" parameter controls how fast the phase changes \, "dropoff" the slope at which the amplitudes fall off at the ends \, "pitch" the center pitch of the cluster \, "interval" the number of (tenths of halftones) between successive voices \, and "rev" and "revtime" the reverberator at bottom., f 71; #X msg 322 238 \; dropoff 10 \; pitch 60 \; interval 120 \; metro 1 \; rev 84 \; revtime 87 \; incr -2; +#X obj 84 16 cnv 5 5 25 empty empty Shepard\ Tone 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 12 0; #X connect 1 0 9 0; #X connect 3 0 23 1; @@ -55,4 +55,4 @@ #X connect 24 0 25 0; #X connect 24 1 25 1; #X connect 26 0 5 0; -#X connect 29 0 24 0; +#X connect 28 0 24 0; diff --git a/doc/3.audio.examples/D10.sampler.notes.pd b/doc/3.audio.examples/D10.sampler.notes.pd index 2fcb1f28..dcf3762f 100644 --- a/doc/3.audio.examples/D10.sampler.notes.pd +++ b/doc/3.audio.examples/D10.sampler.notes.pd @@ -115,7 +115,6 @@ #X text 81 362 start location (msec); #X text 81 379 rise time (msec), f 21; #X text 81 397 decay time (msec), f 21; -#X text 27 16 CHOCOLATE SAMPLER; #X obj 491 188 f; #X obj 442 162 f; #X obj 373 162 f; @@ -184,58 +183,59 @@ #X obj 372 25 r note; #X listbox 372 54 23 0 0 0 - - - 0; #X text 289 693 microtones OK too; -#X connect 0 0 26 0; +#X obj 30 16 cnv 5 5 25 empty empty Chocolate\ Sampler 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 25 0; #X connect 3 0 2 0; #X connect 4 0 2 0; -#X connect 5 0 54 0; +#X connect 5 0 53 0; #X connect 6 0 2 0; -#X connect 16 0 30 0; -#X connect 17 0 56 1; -#X connect 18 0 39 0; -#X connect 19 0 56 4; -#X connect 20 0 56 0; +#X connect 15 0 29 0; +#X connect 16 0 55 1; +#X connect 17 0 38 0; +#X connect 18 0 55 4; +#X connect 19 0 55 0; +#X connect 20 0 21 0; #X connect 21 0 22 0; #X connect 22 0 23 0; #X connect 23 0 24 0; -#X connect 24 0 25 0; -#X connect 25 0 56 3; -#X connect 26 0 20 0; -#X connect 26 1 21 0; -#X connect 26 2 17 0; -#X connect 26 2 18 0; -#X connect 26 2 19 0; -#X connect 26 2 59 0; -#X connect 27 0 25 1; -#X connect 27 0 56 2; -#X connect 28 0 29 0; -#X connect 31 0 29 0; -#X connect 32 0 29 0; -#X connect 33 0 29 0; -#X connect 34 0 29 0; -#X connect 35 0 29 0; -#X connect 36 0 29 0; -#X connect 37 0 29 0; -#X connect 38 0 29 0; -#X connect 39 0 27 0; -#X connect 40 0 29 0; -#X connect 41 0 29 0; -#X connect 42 0 29 0; +#X connect 24 0 55 3; +#X connect 25 0 19 0; +#X connect 25 1 20 0; +#X connect 25 2 16 0; +#X connect 25 2 17 0; +#X connect 25 2 18 0; +#X connect 25 2 58 0; +#X connect 26 0 24 1; +#X connect 26 0 55 2; +#X connect 27 0 28 0; +#X connect 30 0 28 0; +#X connect 31 0 28 0; +#X connect 32 0 28 0; +#X connect 33 0 28 0; +#X connect 34 0 28 0; +#X connect 35 0 28 0; +#X connect 36 0 28 0; +#X connect 37 0 28 0; +#X connect 38 0 26 0; +#X connect 39 0 28 0; +#X connect 40 0 28 0; +#X connect 41 0 28 0; +#X connect 42 0 2 0; #X connect 43 0 2 0; -#X connect 44 0 2 0; -#X connect 55 0 21 1; -#X connect 55 0 65 0; -#X connect 55 1 20 1; -#X connect 55 2 59 1; -#X connect 55 3 19 1; -#X connect 55 4 18 1; -#X connect 55 5 17 1; -#X connect 55 6 16 1; -#X connect 56 0 71 0; -#X connect 59 0 16 0; -#X connect 60 0 29 0; -#X connect 61 0 29 0; -#X connect 65 0 0 0; -#X connect 65 0 62 0; -#X connect 71 0 68 0; -#X connect 72 0 73 0; -#X connect 73 0 55 0; +#X connect 54 0 20 1; +#X connect 54 0 64 0; +#X connect 54 1 19 1; +#X connect 54 2 58 1; +#X connect 54 3 18 1; +#X connect 54 4 17 1; +#X connect 54 5 16 1; +#X connect 54 6 15 1; +#X connect 55 0 70 0; +#X connect 58 0 15 0; +#X connect 59 0 28 0; +#X connect 60 0 28 0; +#X connect 64 0 0 0; +#X connect 64 0 61 0; +#X connect 70 0 67 0; +#X connect 71 0 72 0; +#X connect 72 0 54 0; diff --git a/doc/3.audio.examples/D11.sampler.poly.pd b/doc/3.audio.examples/D11.sampler.poly.pd index 067ade36..207a1a08 100644 --- a/doc/3.audio.examples/D11.sampler.poly.pd +++ b/doc/3.audio.examples/D11.sampler.poly.pd @@ -18,7 +18,6 @@ #X text 55 189 start location (msec); #X text 55 208 rise time (msec), f 21; #X text 55 228 decay time (msec), f 21; -#X text 52 29 POLYPHONIC SAMPLER; #X obj 561 17 r note; #X obj 534 76 t b f; #X obj 474 109 f; @@ -107,33 +106,34 @@ #X text 245 110 increment with [mod 1e+06] to make a note tag (acts like a MIDI pitch to identify the note to [poly]), f 29; #X text 18 276 Here we take the previous patch and make it polyphonic \, with 8 voices. The single voice which we had before has been made into an abstraction \, [sampvoice] \, which we instantiate in 8 copies with the [clone] object. Earlier we used sends and receives to pass messages to "cutoff" \, etc \, but here if we did that the copies of [sampvoice] would be sending messages to each other \, so we combine the control and the audio computation in the [sampvoice] abstraction without using send and receive. Click on [clone] one to see how., f 61; #X text 18 502 There's some bother because [poly] expects to track note on and note off messages separately as they would come from a MIDI keyboard. So we assign each note a unique fake "pitch" \, use [makenote] to generate the note-off messages \, and run [poly] on the resulting stream. We then discard both pitch and velocity for the note offs with [stripnoe] (using the velocity only to strip note-offs) and rebuild the original message adding the voice number we just scored., f 61; -#X connect 10 0 33 0; +#X obj 74 24 cnv 5 5 25 empty empty Polyphonic\ Sampler 15 13 0 16 #dfdfdf #202020 0; +#X connect 9 0 32 0; +#X connect 10 0 11 0; +#X connect 10 1 31 1; #X connect 11 0 12 0; -#X connect 11 1 32 1; +#X connect 11 0 14 0; #X connect 12 0 13 0; -#X connect 12 0 15 0; -#X connect 13 0 14 0; -#X connect 14 0 12 1; +#X connect 13 0 11 1; +#X connect 14 0 15 0; +#X connect 14 1 15 1; #X connect 15 0 16 0; -#X connect 15 1 16 1; -#X connect 16 0 17 0; -#X connect 16 2 17 1; -#X connect 17 0 32 0; -#X connect 22 0 37 0; -#X connect 26 0 25 0; -#X connect 27 0 25 0; -#X connect 28 0 25 0; -#X connect 29 0 25 0; -#X connect 30 0 25 0; -#X connect 32 0 34 0; -#X connect 33 0 11 0; -#X connect 33 1 32 2; -#X connect 33 2 15 2; -#X connect 33 2 32 3; -#X connect 33 3 32 4; -#X connect 33 4 32 5; -#X connect 33 5 32 6; -#X connect 33 6 32 7; -#X connect 34 0 23 0; -#X connect 36 0 21 0; -#X connect 38 0 41 0; +#X connect 15 2 16 1; +#X connect 16 0 31 0; +#X connect 21 0 36 0; +#X connect 25 0 24 0; +#X connect 26 0 24 0; +#X connect 27 0 24 0; +#X connect 28 0 24 0; +#X connect 29 0 24 0; +#X connect 31 0 33 0; +#X connect 32 0 10 0; +#X connect 32 1 31 2; +#X connect 32 2 14 2; +#X connect 32 2 31 3; +#X connect 32 3 31 4; +#X connect 32 4 31 5; +#X connect 32 5 31 6; +#X connect 32 6 31 7; +#X connect 33 0 22 0; +#X connect 35 0 20 0; +#X connect 37 0 40 0; diff --git a/doc/3.audio.examples/D12.sampler.bis.pd b/doc/3.audio.examples/D12.sampler.bis.pd index d4b1fe5a..8e2f489d 100644 --- a/doc/3.audio.examples/D12.sampler.bis.pd +++ b/doc/3.audio.examples/D12.sampler.bis.pd @@ -1,4 +1,4 @@ -#N canvas 206 66 1094 665 12; +#N canvas 266 156 1091 715 12; #X declare -stdpath ./; #N canvas 642 163 417 426 samples 0; #N canvas 0 0 450 300 (subpatch) 0; @@ -9,44 +9,43 @@ #X array sample6 39075 float 2; #X coords 0 1.02 39075 -1.02 200 130 1; #X restore 116 210 graph; -#X restore 481 531 pd samples; -#X text 780 462 sample number; -#X obj 542 118 poly 8 1; -#X obj 611 341 output~; -#X obj 542 143 swap; -#X obj 542 190 route 0; -#X obj 542 167 pack; -#X text 931 415 amplitude; -#X text 930 439 pitch; -#X text 849 348 ARGUMENTS FOR:; -#X text 782 390 pitch; -#X text 782 414 amplitude; -#X text 782 438 duration; -#X text 41 9 POLY SAMPLER \, VERSION 2 FOR SEPARATE NOTE-ON/OFF MESSAGES; -#X obj 597 56 r onoff; -#X text 930 372 ON/OFF TRANSITIONS:; -#X text 783 371 ENTIRE NOTES:; -#X text 930 394 tag; -#X text 780 489 sample onset; -#X text 780 515 rise time; -#X text 781 539 decay time; -#X text 927 464 (same other 4); -#X obj 773 154 f; -#X obj 809 154 + 1; -#X obj 783 180 mod 1e+06; -#X obj 854 60 r note; -#X obj 827 123 t b f; -#X obj 868 291 s onoff; -#X obj 822 236 pipe; -#X obj 822 259 pack; -#X msg 293 513 \; onoff 1 0; -#X msg 294 555 \; onoff 2 0; -#X text 29 146 Messages to "onoff" require a tag \, which is a number shared between the note-on and note-off message so that we can track down the voice to turn it off. If you're using MIDI input \, you can just re-use the pitch as a tag., f 67; -#X text 86 608 single messages to do both as before:, f 18; -#X obj 597 81 unpack f f f f f f f; -#X obj 611 250 pack f f f f f f f; -#X obj 854 86 unpack f f f f f f f; -#X obj 868 236 pack f f f f f f f; +#X restore 487 556 pd samples; +#X text 786 487 sample number; +#X obj 548 143 poly 8 1; +#X obj 617 366 output~; +#X obj 548 168 swap; +#X obj 548 215 route 0; +#X obj 548 192 pack; +#X text 937 440 amplitude; +#X text 936 464 pitch; +#X text 855 373 ARGUMENTS FOR:; +#X text 788 415 pitch; +#X text 788 439 amplitude; +#X text 788 463 duration; +#X obj 603 81 r onoff; +#X text 936 397 ON/OFF TRANSITIONS:; +#X text 789 396 ENTIRE NOTES:; +#X text 936 419 tag; +#X text 786 514 sample onset; +#X text 786 540 rise time; +#X text 787 564 decay time; +#X text 933 489 (same other 4); +#X obj 779 179 f; +#X obj 815 179 + 1; +#X obj 789 205 mod 1e+06; +#X obj 860 85 r note; +#X obj 833 148 t b f; +#X obj 874 316 s onoff; +#X obj 828 261 pipe; +#X obj 828 284 pack; +#X msg 299 538 \; onoff 1 0; +#X msg 300 580 \; onoff 2 0; +#X text 35 171 Messages to "onoff" require a tag \, which is a number shared between the note-on and note-off message so that we can track down the voice to turn it off. If you're using MIDI input \, you can just re-use the pitch as a tag., f 67; +#X text 92 633 single messages to do both as before:, f 18; +#X obj 603 106 unpack f f f f f f f; +#X obj 617 275 pack f f f f f f f; +#X obj 860 111 unpack f f f f f f f; +#X obj 874 261 pack f f f f f f f; #N canvas 333 157 708 551 recorder 0; #X obj 152 363 adc~ 1; #X obj 152 391 hip~ 5; @@ -104,54 +103,55 @@ #X connect 24 0 15 0; #X connect 25 0 16 0; #X connect 26 0 13 0; -#X restore 481 555 pd recorder; -#X obj 586 422 declare -stdpath ./; -#X obj 611 296 clone -s 1 sampvoice2 8; -#X msg 542 217 \$1 0; -#X msg 588 218 \$2; -#X msg 93 513 \; onoff 1 90 60 5 0 0 100; -#X msg 94 555 \; onoff 2 90 48 5 0 0 100; -#X msg 224 608 \; note 51 90 1000 5 0 0 100; -#X text 100 488 separate messages for note on and off:; -#X text 30 39 Here is a variation on the polyphonic sampler \, which can take separate messages to start and stop notes (so that you can attach it to a MIDI keyboard \, for example.) "Note" messages act as before \, but in an intermediate step they are split onto note-on and note-off messages \, sent to "onoff". You can alternatively send messages straight to "onoff" if you don't know the duration in advance., f 67; -#X text 29 215 Messages to "onoff" whose amplitude is zero are note-off messages (the other parameters of note-off messages are ignored). The [sampvoice2] abstraction is a modification of [sampvoice] which looks at the amplitude field to decide whether to begin or end a note., f 67; -#X text 29 295 To convert "note" messages to pairs of "onoff" messages \, first a counter generates a tag. The [pipe] object delays a copy of the tag \, which the following [pack] object converts into a note-off message (a pair of numbers \, the tag and a zero.), f 67; -#X text 29 361 Under [r onoff] \, the [poly] object allocates a voice number \, putting it out paired with velocity. After swapping the two and packing them into a single message \, the amplitude is checked against zero by the [route 0] object. If zero \, the "\$1 0" message outputs a list with "voice number" and "0". Otherwise \, the "\$2" retrieves the voice number from [poly] which gets packed in with the note data and routed to the appropriate [sampvoice2] copy inside [clone]., f 67; +#X restore 487 580 pd recorder; +#X obj 592 447 declare -stdpath ./; +#X obj 617 321 clone -s 1 sampvoice2 8; +#X msg 548 242 \$1 0; +#X msg 594 243 \$2; +#X msg 99 538 \; onoff 1 90 60 5 0 0 100; +#X msg 100 580 \; onoff 2 90 48 5 0 0 100; +#X msg 230 633 \; note 51 90 1000 5 0 0 100; +#X text 106 513 separate messages for note on and off:; +#X text 36 64 Here is a variation on the polyphonic sampler \, which can take separate messages to start and stop notes (so that you can attach it to a MIDI keyboard \, for example.) "Note" messages act as before \, but in an intermediate step they are split onto note-on and note-off messages \, sent to "onoff". You can alternatively send messages straight to "onoff" if you don't know the duration in advance., f 67; +#X text 35 240 Messages to "onoff" whose amplitude is zero are note-off messages (the other parameters of note-off messages are ignored). The [sampvoice2] abstraction is a modification of [sampvoice] which looks at the amplitude field to decide whether to begin or end a note., f 67; +#X text 35 320 To convert "note" messages to pairs of "onoff" messages \, first a counter generates a tag. The [pipe] object delays a copy of the tag \, which the following [pack] object converts into a note-off message (a pair of numbers \, the tag and a zero.), f 67; +#X text 35 386 Under [r onoff] \, the [poly] object allocates a voice number \, putting it out paired with velocity. After swapping the two and packing them into a single message \, the amplitude is checked against zero by the [route 0] object. If zero \, the "\$1 0" message outputs a list with "voice number" and "0". Otherwise \, the "\$2" retrieves the voice number from [poly] which gets packed in with the note data and routed to the appropriate [sampvoice2] copy inside [clone]., f 67; +#X obj 242 13 cnv 5 5 25 empty empty Polyphonic\ Sampler\ with\ Separate\ Note-On/Off\ Messages 15 13 0 16 #dfdfdf #202020 0; #X connect 2 0 4 0; #X connect 2 2 4 1; #X connect 4 0 6 0; #X connect 4 1 6 1; -#X connect 5 0 41 0; -#X connect 5 1 42 0; +#X connect 5 0 40 0; +#X connect 5 1 41 0; #X connect 6 0 5 0; -#X connect 14 0 34 0; +#X connect 13 0 33 0; +#X connect 21 0 22 0; #X connect 22 0 23 0; -#X connect 23 0 24 0; -#X connect 24 0 22 1; -#X connect 24 0 28 0; -#X connect 24 0 37 0; -#X connect 25 0 36 0; -#X connect 26 0 22 0; -#X connect 26 1 37 2; -#X connect 28 0 29 0; -#X connect 29 0 27 0; -#X connect 34 0 2 0; -#X connect 34 1 2 1; -#X connect 34 1 35 1; -#X connect 34 2 35 2; -#X connect 34 3 35 3; -#X connect 34 4 35 4; -#X connect 34 5 35 5; -#X connect 34 6 35 6; -#X connect 35 0 40 0; +#X connect 23 0 21 1; +#X connect 23 0 27 0; +#X connect 23 0 36 0; +#X connect 24 0 35 0; +#X connect 25 0 21 0; +#X connect 25 1 36 2; +#X connect 27 0 28 0; +#X connect 28 0 26 0; +#X connect 33 0 2 0; +#X connect 33 1 2 1; +#X connect 33 1 34 1; +#X connect 33 2 34 2; +#X connect 33 3 34 3; +#X connect 33 4 34 4; +#X connect 33 5 34 5; +#X connect 33 6 34 6; +#X connect 34 0 39 0; +#X connect 35 0 25 0; +#X connect 35 1 36 1; +#X connect 35 2 27 1; +#X connect 35 3 36 3; +#X connect 35 4 36 4; +#X connect 35 5 36 5; +#X connect 35 6 36 6; #X connect 36 0 26 0; -#X connect 36 1 37 1; -#X connect 36 2 28 1; -#X connect 36 3 37 3; -#X connect 36 4 37 4; -#X connect 36 5 37 5; -#X connect 36 6 37 6; -#X connect 37 0 27 0; -#X connect 40 0 3 0; -#X connect 41 0 40 0; -#X connect 42 0 35 0; +#X connect 39 0 3 0; +#X connect 40 0 39 0; +#X connect 41 0 34 0; diff --git a/doc/3.audio.examples/D13.additive.qlist.pd b/doc/3.audio.examples/D13.additive.qlist.pd index 7cef7d66..90cc2303 100644 --- a/doc/3.audio.examples/D13.additive.qlist.pd +++ b/doc/3.audio.examples/D13.additive.qlist.pd @@ -1,18 +1,17 @@ #N canvas 421 53 665 605 12; #X declare -stdpath ./; -#X obj 422 354 qlist; -#X msg 506 302 read qlist.txt; -#X obj 506 257 loadbang; -#X text 279 140 start; -#X text 516 281 reread file; -#X msg 422 212 rewind; -#X msg 490 212 next; -#X msg 271 164 tempo 1 \, bang; -#X text 48 20 USING QLIST TO SEQUENCE AN OSCILLATOR BANK; -#X text 434 191 single step; +#X obj 392 354 qlist; +#X msg 476 302 read qlist.txt; +#X obj 476 257 loadbang; +#X text 249 140 start; +#X text 486 281 reread file; +#X msg 392 212 rewind; +#X msg 460 212 next; +#X msg 241 164 tempo 1 \, bang; +#X text 404 191 single step; #X obj 203 316 r #; #X obj 49 227 output~; -#X obj 489 21 declare -stdpath ./; +#X obj 511 161 declare -stdpath ./; #X obj 49 178 clone -s 1 osc-voice 8; #X text 436 490 click to open:; #X obj 421 516 text define -k additive; @@ -25,7 +24,7 @@ #X text 145 446 <-- rewind; #X text 141 476 <-- step through; #X text 87 318 this is where comments go to:, f 15; -#X msg 377 164 tempo 5 \, bang; +#X msg 347 164 tempo 5 \, bang; #X msg 126 531 stop; #X text 167 531 <-- stop; #X msg 103 391 5; @@ -34,19 +33,20 @@ #X text 216 500 <-- rewind and play; #X text 244 517 automatically, f 15; #X text 356 405 You can also use the more modern [text sequence] object instead which is more powerful. It can also save contents of the sequence with the patch., f 39; -#X text 23 61 Here is an eight voice additive synthesis patch controlled by a [qlist]. Open a text editor on the file \, "qlist.txt" \, to see how the oscillators' amplitudes and frequencies are specified. The abstraction \, [osc-voice] is loaded 8 times inside [clone] and shows an effective way to make patches react to [qlist] objects but also to mousing., f 81; +#X text 54 56 Here is an eight voice additive synthesis patch controlled by a [qlist]. Open a text editor on the file \, "qlist.txt" \, to see how the oscillators' amplitudes and frequencies are specified. The abstraction \, [osc-voice] is loaded 8 times inside [clone] and shows an effective way to make patches react to [qlist] objects but also to mousing., f 81; +#X obj 91 16 cnv 5 5 25 empty empty Using\ [qlist]\ to\ Sequence\ an\ Oscillator\ Bank 15 13 0 16 #dfdfdf #202020 0; #X connect 1 0 0 0; #X connect 2 0 1 0; #X connect 5 0 0 0; #X connect 6 0 0 0; #X connect 7 0 0 0; -#X connect 10 0 17 0; -#X connect 13 0 11 0; -#X connect 18 0 28 0; -#X connect 19 0 16 0; -#X connect 20 0 16 0; -#X connect 24 0 0 0; -#X connect 25 0 16 0; -#X connect 27 0 28 0; -#X connect 28 0 16 0; -#X connect 29 0 16 0; +#X connect 9 0 16 0; +#X connect 12 0 10 0; +#X connect 17 0 27 0; +#X connect 18 0 15 0; +#X connect 19 0 15 0; +#X connect 23 0 0 0; +#X connect 24 0 15 0; +#X connect 26 0 27 0; +#X connect 27 0 15 0; +#X connect 28 0 15 0; diff --git a/doc/3.audio.examples/D14.vibrato.pd b/doc/3.audio.examples/D14.vibrato.pd index eb33184d..1e09027c 100644 --- a/doc/3.audio.examples/D14.vibrato.pd +++ b/doc/3.audio.examples/D14.vibrato.pd @@ -1,4 +1,4 @@ -#N canvas 423 68 717 685 12; +#N canvas 389 74 717 685 12; #X declare -stdpath ./; #X obj 55 235 r trigger; #X obj 55 453 *~; @@ -45,13 +45,13 @@ #X text 215 255 in Hertz; #X obj 55 376 adsr 0 100 200 100 300; #X obj 55 592 output~; -#X text 75 14 USING ADSRS FOR PORTAMENTO AND ADDING VIBRATO TOO; #X text 25 56 Portamento can be treated as a special case of an ADSR envelope \, with 100 percent sustain. Vibrato is properly computed in units of pitch \, but it's also possible to do the job without having to convert from pitch to frequency units at the audio rate. To do this we just raise the "pitch" to the fourth power \, so that it acts pseudo-exponentially. Rather than add vibrato to the ADSR output \, we multiply a signal which controls relative frequency. The relative frequency change is one plus an oscillator., f 94; #X text 25 152 The table below holds 6 cycles of vibrato with small variations to get a not-exactly-repeating vibrato. We thus have to divide vibrato frequency by six. You can just use a sine or triangle wave if you prefer., f 94; #X obj 238 622 declare -stdpath ./; #X text 576 414 <-- middle C; #X text 576 452 <-- octave up; #X text 550 493 <-- release is optional, f 11; +#X obj 54 15 cnv 5 5 25 empty empty Using\ ADSR\ Envelopes\ for\ Portamento\ and\ Vibrato 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 5 0; #X connect 1 0 2 0; #X connect 1 0 2 1; diff --git a/doc/3.audio.examples/E01.spectrum.pd b/doc/3.audio.examples/E01.spectrum.pd index e11f7489..b38a176f 100644 --- a/doc/3.audio.examples/E01.spectrum.pd +++ b/doc/3.audio.examples/E01.spectrum.pd @@ -85,7 +85,6 @@ #X text 25 643 The upper graph is just the (time domain) waveform \, about four periods long. The lower graph is the magnitude spectrum. Its peaks are the magnitudes of the partials. Note that a DC signal of amplitude one is considered a partial of magnitude 1 \, but the other partials \, which have peak amplitudes of 1 (and RMS 0.707) \, have peak magnitudes of only 0.5 in the spectrum., f 95; #X obj 119 242 *~ 1; #X text 85 242 sum; -#X text 50 22 GRAPHING SPECTRA OF AUDIO SIGNALS; #X obj 112 450 declare -stdpath ./; #X text 214 267 <-- click to graph; #X text 25 708 Here we're introducing a new feature: multiple signals connected to a signal inlet (as in the [*~ 1]) are added. This is the most convenient way to sum the six partials., f 95; @@ -109,15 +108,16 @@ #X text 316 160 On/Off for each partial, f 8; #X text 538 262 SPECTRAL ANALYSIS; #X text 449 452 ------ partial number ------; +#X obj 26 17 cnv 5 5 25 empty empty Graphing\ Spectra\ of\ Audio\ Signals 15 13 0 16 #dfdfdf #202020 0; #X connect 1 0 6 0; #X connect 5 0 3 1; #X connect 5 0 7 0; +#X connect 15 0 47 0; #X connect 15 0 48 0; #X connect 15 0 49 0; #X connect 15 0 50 0; #X connect 15 0 51 0; #X connect 15 0 52 0; -#X connect 15 0 53 0; #X connect 16 0 17 0; #X connect 17 0 33 0; #X connect 18 0 19 0; @@ -133,15 +133,15 @@ #X connect 33 0 3 0; #X connect 33 0 1 0; #X connect 33 0 7 0; -#X connect 39 0 17 1; -#X connect 40 0 19 1; -#X connect 41 0 21 1; -#X connect 42 0 23 1; -#X connect 43 0 25 1; -#X connect 44 0 27 1; -#X connect 48 0 16 0; -#X connect 49 0 18 0; -#X connect 50 0 20 0; -#X connect 51 0 22 0; -#X connect 52 0 24 0; -#X connect 53 0 26 0; +#X connect 38 0 17 1; +#X connect 39 0 19 1; +#X connect 40 0 21 1; +#X connect 41 0 23 1; +#X connect 42 0 25 1; +#X connect 43 0 27 1; +#X connect 47 0 16 0; +#X connect 48 0 18 0; +#X connect 49 0 20 0; +#X connect 50 0 22 0; +#X connect 51 0 24 0; +#X connect 52 0 26 0; diff --git a/doc/3.audio.examples/E02.ring.modulation.pd b/doc/3.audio.examples/E02.ring.modulation.pd index 60341ca8..6bf5692f 100644 --- a/doc/3.audio.examples/E02.ring.modulation.pd +++ b/doc/3.audio.examples/E02.ring.modulation.pd @@ -1,61 +1,58 @@ -#N canvas 425 38 741 685 12; +#N canvas 425 38 743 743 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array E02-signal 882 float 0; #X coords 0 6 882 -6 257 131 1 0 0; -#X restore 424 84 graph; -#X obj 115 370 hip~ 5; +#X restore 404 206 graph; +#X obj 115 490 hip~ 5; #N canvas 0 0 450 300 (subpatch) 0; #X array E02-spectrum 128 float 0; #X coords 0 4300 127 -40 257 130 1; -#X restore 404 291 graph; -#X obj 189 349 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 115 411 output~; -#X text 435 424 1; -#X text 469 424 2; -#X text 501 424 3; -#X text 533 424 4; -#X text 566 424 5; -#X text 596 424 6; -#X text 627 424 7; -#X text 403 424 0; -#X text 686 141 0; -#X obj 116 54 r fundamental; -#X obj 29 112 osc~; -#X obj 29 162 *~; -#X obj 73 112 osc~; -#X obj 73 162 *~; -#X obj 116 112 osc~; -#X obj 116 162 *~; -#X obj 116 89 * 2; -#X obj 159 112 osc~; -#X obj 159 162 *~; -#X obj 202 112 osc~; -#X obj 202 162 *~; -#X obj 245 112 osc~; -#X obj 245 162 *~; -#X obj 29 89 * 0; -#X obj 73 89 * 1; -#X obj 159 89 * 3; -#X obj 202 89 * 4; -#X obj 245 89 * 5; -#X text 582 54 WAVEFORM; -#X text 552 268 SPECTRUM; -#X text 664 407 0; -#X text 662 286 1; -#X text 663 345 0.5; -#X obj 116 239 *~; -#X text 307 120 partials; -#X obj 234 270 osc~; -#X floatatom 234 210 4 0 200 0 - - - 0; -#X obj 234 239 *; -#X obj 267 239 r freq-step; -#X text 306 177 modulation; -#X text 302 192 frequency in; -#X text 42 14 RING MODULATION: multiplying a complex tone by a sinusoid; -#X obj 189 301 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 189 325 metro 500; -#X text 63 568 If you choose a multiple of the fundamental as a modulation frequency (16 \, 32 \, 48 \, 64 \, ... "steps") the result is again periodic at the original frequency. If you select a half-integer times the fundamental (8 \, 24 \, 40 \, ... steps) the pitch drops by an octave and you get only odd partials. For most other settings you'll get an inharmonic complex of tones. These are sometimes heard as separate pitches and other times they seem to fuse into a single timbre with indeterminate pitch., f 89; +#X restore 402 415 graph; +#X obj 189 469 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 115 531 output~; +#X text 433 548 1; +#X text 467 548 2; +#X text 499 548 3; +#X text 531 548 4; +#X text 564 548 5; +#X text 594 548 6; +#X text 625 548 7; +#X text 401 548 0; +#X text 666 263 0; +#X obj 116 174 r fundamental; +#X obj 29 232 osc~; +#X obj 29 282 *~; +#X obj 73 232 osc~; +#X obj 73 282 *~; +#X obj 116 232 osc~; +#X obj 116 282 *~; +#X obj 116 209 * 2; +#X obj 159 232 osc~; +#X obj 159 282 *~; +#X obj 202 232 osc~; +#X obj 202 282 *~; +#X obj 245 232 osc~; +#X obj 245 282 *~; +#X obj 29 209 * 0; +#X obj 73 209 * 1; +#X obj 159 209 * 3; +#X obj 202 209 * 4; +#X obj 245 209 * 5; +#X text 562 176 WAVEFORM; +#X text 550 392 SPECTRUM; +#X text 662 531 0; +#X text 660 410 1; +#X text 661 469 0.5; +#X obj 116 359 *~; +#X text 307 240 partials; +#X obj 234 390 osc~; +#X floatatom 234 330 4 0 200 0 - - - 0; +#X obj 234 359 *; +#X obj 267 359 r freq-step; +#X obj 189 421 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 189 445 metro 500; +#X text 63 628 If you choose a multiple of the fundamental as a modulation frequency (16 \, 32 \, 48 \, 64 \, ... "steps") the result is again periodic at the original frequency. If you select a half-integer times the fundamental (8 \, 24 \, 40 \, ... steps) the pitch drops by an octave and you get only odd partials. For most other settings you'll get an inharmonic complex of tones. These are sometimes heard as separate pitches and other times they seem to fuse into a single timbre with indeterminate pitch., f 89; #N canvas 436 82 601 665 fft 0; #X obj 86 90 inlet~; #X obj 162 243 inlet; @@ -111,25 +108,27 @@ #X connect 19 0 17 0; #X connect 22 0 25 0; #X connect 23 0 22 0; -#X restore 128 337 pd fft; -#X obj 569 17 declare -stdpath ./; -#X text 212 300 <-- graph repeatedly; -#X text 212 348 <-- graph once; -#X text 268 209 <-- "steps" of f/16; -#X text 289 136 <-- On/Off; -#X obj 47 137 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 91 137 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 134 137 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 177 137 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 220 137 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 263 137 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 686 78 6; -#X text 687 203 -6; -#X text 435 455 ------ partial number --------; -#X text 452 221 ------ 0.02 seconds ------; -#X text 63 489 Now we ring modulate the signal by multiplying it by another sinusoid. The modulation frequency is controlled in steps of f/16 where "f" is the fundamental frequency \, giving roughly 11 Hz per step. Note that if the modulation frequency is set to zero we can't predict the overall amplitude because it depends on what phase the modulation oscillator happened to have at that moment., f 89; +#X restore 128 457 pd fft; +#X obj 490 27 declare -stdpath ./; +#X text 212 420 <-- graph repeatedly; +#X text 212 468 <-- graph once; +#X text 289 256 <-- On/Off; +#X obj 47 257 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 91 257 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 134 257 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 177 257 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 220 257 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 263 257 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X text 666 200 6; +#X text 667 325 -6; +#X text 433 579 ------ partial number --------; +#X text 432 343 ------ 0.02 seconds ------; +#X text 43 66 Now we ring modulate the signal by multiplying it by another sinusoid. The modulation frequency is controlled in steps of f/16 where "f" is the fundamental frequency \, giving roughly 11 Hz per step. Note that if the modulation frequency is set to zero we can't predict the overall amplitude because it depends on what phase the modulation oscillator happened to have at that moment., f 88; +#X obj 85 21 cnv 5 5 25 empty empty Ring\ Modulation 15 13 0 16 #dfdfdf #202020 0; +#X text 294 286 modulation frequency in "steps" of f/16, f 10; +#X text 268 329 <--; #X connect 1 0 4 0; -#X connect 3 0 50 1; +#X connect 3 0 47 1; #X connect 14 0 28 0; #X connect 14 0 29 0; #X connect 14 0 21 0; @@ -155,16 +154,16 @@ #X connect 31 0 24 0; #X connect 32 0 26 0; #X connect 38 0 1 0; -#X connect 38 0 50 0; +#X connect 38 0 47 0; #X connect 40 0 38 1; #X connect 41 0 42 0; #X connect 42 0 40 0; #X connect 43 0 42 1; -#X connect 47 0 48 0; -#X connect 48 0 3 0; -#X connect 56 0 16 1; -#X connect 57 0 18 1; -#X connect 58 0 20 1; -#X connect 59 0 23 1; -#X connect 60 0 25 1; -#X connect 61 0 27 1; +#X connect 44 0 45 0; +#X connect 45 0 3 0; +#X connect 52 0 16 1; +#X connect 53 0 18 1; +#X connect 54 0 20 1; +#X connect 55 0 23 1; +#X connect 56 0 25 1; +#X connect 57 0 27 1; diff --git a/doc/3.audio.examples/E03.octave.divider.pd b/doc/3.audio.examples/E03.octave.divider.pd index 3ddc50b2..fbb88e0f 100644 --- a/doc/3.audio.examples/E03.octave.divider.pd +++ b/doc/3.audio.examples/E03.octave.divider.pd @@ -60,7 +60,6 @@ #X obj 111 99 sigmund~ -npts 2048; #X text 255 99 track pitch; #X text 173 125 reject low numbers indicating no pitch found; -#X text 89 16 OCTAVE DIVIDING BY RING MODULATION; #X obj 118 288 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X obj 100 317 *~; #X obj 71 288 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; @@ -72,6 +71,7 @@ #X text 192 334 This patch demonstrates using ring modulation to alias a sound down one octave. The ring modulation itself ([osc~] and multiplier) is easy. (We step it up by a factor of 2 to balance the original better.), f 70; #X text 192 386 Harder is getting the fundamental frequency of the original sound. We do this with the complicated [sigmund~] object \, which puts out a stream of analysis data for an incoming signal. The "-npts 2048" argument specifies the analysis window size. The analysis is most closely aligned with what the sound was doing at the middle of the window \, i.e. \, 1024 samples ago. The [pd delay] window delays the signal itself 1024 samples so it will be as tightly synchronized with the analysis data as possible. (If you're doing this on a real-time input \, you might drop the delay and settle for less perfect synchronization.), f 70; #X text 193 538 About [sigmund~] \, suffice it to say that the left outlet \, by default \, outputs pitch of the analyzed sound. When it fails to find a pitch \, [sigmund~] outputs -1500 \, so we use [moses] to filter these values. The pitch is converted from MIDI to Hertz \, and multiplied by 1/2 to control the modulation oscillator. (You can also try large-ish integers which leave the pitch intact but introduce funny formants.), f 70; +#X obj 81 19 cnv 5 5 25 empty empty Octave\ Dividing\ by\ Ring\ Modulation 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 6 0; #X connect 1 0 4 0; #X connect 2 0 5 0; @@ -83,16 +83,16 @@ #X connect 11 0 12 0; #X connect 12 0 10 1; #X connect 13 0 12 0; -#X connect 14 0 27 0; +#X connect 14 0 26 0; #X connect 15 0 11 0; #X connect 16 0 18 0; #X connect 16 0 22 0; #X connect 17 0 5 0; #X connect 18 0 8 0; -#X connect 18 0 29 0; +#X connect 18 0 28 0; #X connect 21 1 9 0; #X connect 22 0 21 0; -#X connect 26 0 27 1; -#X connect 27 0 1 0; -#X connect 28 0 29 1; -#X connect 29 0 1 0; +#X connect 25 0 26 1; +#X connect 26 0 1 0; +#X connect 27 0 28 1; +#X connect 28 0 1 0; diff --git a/doc/3.audio.examples/E04.difference.tone.pd b/doc/3.audio.examples/E04.difference.tone.pd index dee9c7c4..8b3e2f7d 100644 --- a/doc/3.audio.examples/E04.difference.tone.pd +++ b/doc/3.audio.examples/E04.difference.tone.pd @@ -2,7 +2,6 @@ #X declare -stdpath ./; #X obj 59 170 +~; #X obj 59 350 output~; -#X text 232 51 NONLINEAR DISTORTION AND DIFFERENCE TONES; #X obj 145 213 / 100; #X floatatom 145 188 5 0 500 0 - - - 0; #X obj 59 303 clip~ -1 1; @@ -20,15 +19,16 @@ #X text 222 188 amplitude of sum before clipping, f 16; #X text 197 240 This patch demonstrates how nonlinear distortion (also known as "waveshaping") can create difference tones from a pair of sinusoids. The sinusoids are initially tuned to 225 and 300 Hz \, a musical fourth \, and have amplitude of 50 percent (0.5) so that the sum is always less than 1 in absolute value. At these settings the [clip~] object passes its input through unchanged., f 55; #X text 198 350 If the amplitude rises above 50 percent \, the [clip~] object starts altering the signal nonlinearly \, and the result is no longer as if the two sinusoids had been processed separately. Instead \, they "intermodulate" \, finding a common subharmonic if one exists. At 300 and 225 Hz \, the subharmonic is at 75 \, two octaves below the upper tone and a twelfth below the lower one. Change the frequency of the second tone and you will hear a variety of effects., f 55; -#X connect 0 0 7 0; -#X connect 3 0 7 1; -#X connect 4 0 3 0; -#X connect 5 0 1 0; -#X connect 6 0 13 0; -#X connect 7 0 5 0; -#X connect 8 0 12 0; -#X connect 9 0 4 0; -#X connect 10 0 9 0; -#X connect 11 0 0 0; -#X connect 12 0 6 0; -#X connect 13 0 0 1; +#X obj 166 43 cnv 5 5 25 empty empty Nonlinear\ Distortion\ and\ Difference\ Tones 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 6 0; +#X connect 2 0 6 1; +#X connect 3 0 2 0; +#X connect 4 0 1 0; +#X connect 5 0 12 0; +#X connect 6 0 4 0; +#X connect 7 0 11 0; +#X connect 8 0 3 0; +#X connect 9 0 8 0; +#X connect 10 0 0 0; +#X connect 11 0 5 0; +#X connect 12 0 0 1; diff --git a/doc/3.audio.examples/E05.chebychev.pd b/doc/3.audio.examples/E05.chebychev.pd index 9aaaafef..4af80e5b 100644 --- a/doc/3.audio.examples/E05.chebychev.pd +++ b/doc/3.audio.examples/E05.chebychev.pd @@ -1,20 +1,20 @@ -#N canvas 426 112 664 542 12; +#N canvas 334 99 663 561 12; #X declare -stdpath ./; -#X obj 34 337 output~; -#X obj 52 101 / 100; -#X floatatom 52 77 5 0 100 0 - - - 0; -#X obj 34 182 *~; -#X obj 34 50 osc~ 220; -#X obj 52 127 pack 0 50; -#X obj 52 154 line~; -#X text 119 91 hundredths; -#X obj 34 212 *~ 128; -#X obj 34 270 tabread4~ E05-tab; +#X obj 34 360 output~; +#X obj 52 124 / 100; +#X floatatom 52 100 5 0 100 0 - - - 0; +#X obj 34 205 *~; +#X obj 34 73 osc~ 220; +#X obj 52 150 pack 0 50; +#X obj 52 177 line~; +#X text 119 114 hundredths; +#X obj 34 235 *~ 128; +#X obj 34 293 tabread4~ E05-tab; #N canvas 0 0 450 300 (subpatch) 0; #X array E05-tab 259 float 1; -#A 0 -1.20148 -1 -0.810724 -0.63326 -0.467216 -0.31221 -0.167866 -0.0338144 0.0903053 0.204849 0.310166 0.406597 0.494477 0.574137 0.645895 0.71007 0.766969 0.816895 0.860145 0.897008 0.927771 0.952708 0.972093 0.98619 0.995261 0.999557 0.999329 0.994816 0.986257 0.97388 0.957912 0.938572 0.916074 0.890625 0.86243 0.831684 0.798582 0.76331 0.726049 0.686977 0.646266 0.60408 0.560583 0.515931 0.470276 0.423765 0.37654 0.328738 0.280493 0.231934 0.183183 0.13436 0.0855808 0.0369554 -0.01141 -0.0594134 -0.106956 -0.153946 -0.200292 -0.245909 -0.290715 -0.334633 -0.377589 -0.419512 -0.460337 -0.5 -0.538443 -0.57561 -0.611449 -0.645912 -0.678953 -0.710532 -0.740609 -0.76915 -0.796122 -0.821497 -0.845248 -0.867354 -0.887794 -0.906551 -0.923612 -0.938965 -0.952601 -0.964516 -0.974704 -0.983167 -0.989906 -0.994925 -0.99823 -0.999832 -0.999741 -0.997972 -0.994539 -0.98946 -0.982757 -0.97445 -0.964564 -0.953125 -0.94016 -0.925699 -0.909772 -0.892414 -0.873658 -0.85354 -0.832098 -0.809372 -0.785401 -0.760228 -0.733895 -0.706446 -0.677928 -0.648387 -0.61787 -0.586426 -0.554105 -0.520957 -0.487033 -0.452386 -0.417069 -0.381135 -0.344638 -0.307632 -0.270174 -0.232319 -0.194122 -0.15564 -0.11693 -0.0780487 -0.039053 0 0.039053 0.0780487 0.11693 0.15564 0.194122 0.232319 0.270174 0.307632 0.344638 0.381135 0.417069 0.452386 0.487033 0.520957 0.554105 0.586426 0.61787 0.648387 0.677928 0.706446 0.733895 0.760228 0.785401 0.809372 0.832098 0.85354 0.873658 0.892414 0.909772 0.925699 0.94016 0.953125 0.964564 0.97445 0.982757 0.98946 0.994539 0.997972 0.999741 0.999832 0.99823 0.994925 0.989906 0.983167 0.974704 0.964516 0.952601 0.938965 0.923612 0.906551 0.887794 0.867354 0.845248 0.821497 0.796122 0.76915 0.740609 0.710532 0.678953 0.645912 0.611449 0.57561 0.538443 0.5 0.460337 0.419512 0.377589 0.334633 0.290715 0.245909 0.200292 0.153946 0.106956 0.0594134 0.01141 -0.0369554 -0.0855808 -0.13436 -0.183183 -0.231934 -0.280493 -0.328738 -0.37654 -0.423765 -0.470276 -0.515931 -0.560583 -0.60408 -0.646266 -0.686977 -0.726049 -0.76331 -0.798582 -0.831684 -0.86243 -0.890625 -0.916074 -0.938572 -0.957912 -0.97388 -0.986257 -0.994816 -0.999329 -0.999557 -0.995261 -0.98619 -0.972093 -0.952708 -0.927771 -0.897008 -0.860145 -0.816895 -0.766969 -0.71007 -0.645895 -0.574137 -0.494477 -0.406597 -0.310166 -0.204849 -0.0903053 0.0338144 0.167866 0.31221 0.467216 0.63326 0.810724 1 1.20148; +#A 0 1.29428 1 0.731356 0.487085 0.265966 0.0668144 -0.111528 -0.270176 -0.410202 -0.532652 -0.638542 -0.728844 -0.804502 -0.866436 -0.915518 -0.952603 -0.978506 -0.994019 -0.999902 -0.996889 -0.985682 -0.966955 -0.941362 -0.909525 -0.87204 -0.829481 -0.782396 -0.731311 -0.676722 -0.619108 -0.558926 -0.496607 -0.432564 -0.367188 -0.300848 -0.233896 -0.166664 -0.0994625 -0.0325871 0.0336857 0.0990982 0.163408 0.22639 0.287834 0.347547 0.405349 0.461077 0.51458 0.565722 0.61438 0.660444 0.703817 0.744413 0.782158 0.816989 0.848855 0.877715 0.903536 0.926298 0.945987 0.962602 0.976146 0.986633 0.994084 0.998528 1 0.998543 0.994206 0.987043 0.977117 0.964492 0.94924 0.931437 0.911165 0.888508 0.863555 0.836398 0.807134 0.775862 0.742682 0.707699 0.671021 0.632754 0.59301 0.5519 0.509538 0.466037 0.421512 0.376078 0.329851 0.282947 0.235482 0.18757 0.139328 0.0908676 0.0423039 -0.00625139 -0.0546875 -0.102895 -0.150766 -0.198194 -0.245075 -0.291307 -0.33679 -0.381427 -0.425123 -0.467786 -0.509325 -0.549655 -0.588691 -0.626354 -0.662567 -0.697254 -0.730347 -0.761777 -0.791483 -0.819403 -0.845483 -0.869671 -0.891918 -0.91218 -0.930418 -0.946595 -0.960681 -0.972646 -0.982468 -0.990127 -0.995608 -0.998902 -1 -0.998902 -0.995608 -0.990127 -0.982468 -0.972646 -0.960681 -0.946595 -0.930418 -0.91218 -0.891918 -0.869671 -0.845483 -0.819403 -0.791483 -0.761777 -0.730347 -0.697254 -0.662567 -0.626354 -0.588691 -0.549655 -0.509325 -0.467786 -0.425123 -0.381427 -0.33679 -0.291307 -0.245075 -0.198194 -0.150766 -0.102895 -0.0546875 -0.00625139 0.0423039 0.0908676 0.139328 0.18757 0.235482 0.282947 0.329851 0.376078 0.421512 0.466037 0.509538 0.5519 0.59301 0.632754 0.671021 0.707699 0.742682 0.775862 0.807134 0.836398 0.863555 0.888508 0.911165 0.931437 0.94924 0.964492 0.977117 0.987043 0.994206 0.998543 1 0.998528 0.994084 0.986633 0.976146 0.962602 0.945987 0.926298 0.903536 0.877715 0.848855 0.816989 0.782158 0.744413 0.703817 0.660444 0.61438 0.565722 0.51458 0.461077 0.405349 0.347547 0.287834 0.22639 0.163408 0.0990982 0.0336857 -0.0325871 -0.0994625 -0.166664 -0.233896 -0.300848 -0.367188 -0.432564 -0.496607 -0.558926 -0.619108 -0.676722 -0.731311 -0.782396 -0.829481 -0.87204 -0.909525 -0.941362 -0.966955 -0.985682 -0.996889 -0.999902 -0.994019 -0.978506 -0.952603 -0.915518 -0.866436 -0.804502 -0.728844 -0.638542 -0.532652 -0.410202 -0.270176 -0.111528 0.0668144 0.265966 0.487085 0.731356 1 1.29428; #X coords 0 1 258 -1 200 140 1; -#X restore 230 82 graph; +#X restore 230 105 graph; #N canvas 352 38 835 723 make-table 0; #X obj 157 304 t b b; #X obj 229 329 f; @@ -77,12 +77,12 @@ #X text 295 410 3rd C.P.; #X text 349 674 4th C.P.; #X text 591 368 5th C.P.; -#X text 270 55 This patch computes Chebychev polynomials and stores them in a wavetable for use later., f 30; #X obj 77 55 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 157 285 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 460 202 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 520 450 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 197 515 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 270 55 This patch computes Chebyshev polynomials and stores them in a wavetable for use later., f 30; #X connect 0 0 4 0; #X connect 0 1 3 0; #X connect 1 0 2 0; @@ -95,7 +95,7 @@ #X connect 5 1 6 1; #X connect 7 0 4 1; #X connect 9 0 42 0; -#X connect 10 0 63 0; +#X connect 10 0 62 0; #X connect 11 0 15 0; #X connect 11 1 14 0; #X connect 12 0 13 0; @@ -108,7 +108,7 @@ #X connect 16 1 17 1; #X connect 18 0 15 1; #X connect 19 0 43 0; -#X connect 20 0 66 0; +#X connect 20 0 65 0; #X connect 21 0 25 0; #X connect 21 1 24 0; #X connect 22 0 23 0; @@ -122,7 +122,7 @@ #X connect 28 0 25 1; #X connect 29 0 27 0; #X connect 30 0 29 0; -#X connect 31 0 64 0; +#X connect 31 0 63 0; #X connect 32 0 36 0; #X connect 32 1 35 0; #X connect 33 0 34 0; @@ -135,7 +135,7 @@ #X connect 37 1 38 1; #X connect 39 0 36 1; #X connect 40 0 44 0; -#X connect 41 0 65 0; +#X connect 41 0 64 0; #X connect 42 0 6 0; #X connect 43 0 17 0; #X connect 44 0 38 0; @@ -151,35 +151,35 @@ #X connect 51 1 52 1; #X connect 53 0 50 1; #X connect 54 0 56 0; -#X connect 55 0 62 0; +#X connect 55 0 61 0; #X connect 56 0 52 0; -#X connect 62 0 46 0; -#X connect 63 0 0 0; -#X connect 64 0 21 0; -#X connect 65 0 32 0; -#X connect 66 0 11 0; -#X restore 470 182 pd make-table; +#X connect 61 0 46 0; +#X connect 62 0 0 0; +#X connect 63 0 21 0; +#X connect 64 0 32 0; +#X connect 65 0 11 0; +#X restore 470 205 pd make-table; #X f 17; -#X obj 470 146 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 471 127 2; -#X text 501 127 3; -#X text 531 127 4; -#X text 560 128 5; -#X text 589 127 6; -#X obj 34 239 +~ 129; -#X obj 34 300 hip~ 5; -#X text 188 260 This patch demonstrates using Chebychev polynomials (of the first kind) to generate pure harmonics using waveshaping. The pure harmonic only comes out when the index is one (top of the scale). Smaller indices will give various mixes of harmonics. The table initially holds the fifth Chebychev polynomial \, so you can get the fifth harmonic., f 62; -#X text 188 351 There is an audible "rolling" sound as the index changes for the higher degree polynomials \, because the amplitudes of the lower partials can rise and fall several times apiece as the index rises from zero to one., f 62; -#X text 188 414 Indices greater than one will try to read values outside the table (which would be clipped appropriately). Anyway \, the polynomials increase rapidly in value outside the interval from -1 to 1 that we are using here., f 62; -#X text 188 477 When you get tired of Chebychev polynomials you can draw your own functions by hand and/or try other formulas., f 62; -#X text 42 5 WAVESHAPING WITH CHEBYCHEV POLYNOMIALS; -#X text 458 86 subpatch to calculate Chebychev polynomials, f 21; -#X obj 478 25 declare -stdpath ./; -#X obj 499 146 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 528 146 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 557 146 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 586 146 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 99 77 <-- index in; +#X obj 470 169 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 471 150 2; +#X text 501 150 3; +#X text 531 150 4; +#X text 560 151 5; +#X text 589 150 6; +#X obj 34 262 +~ 129; +#X obj 34 323 hip~ 5; +#X text 188 374 There is an audible "rolling" sound as the index changes for the higher degree polynomials \, because the amplitudes of the lower partials can rise and fall several times apiece as the index rises from zero to one., f 62; +#X text 188 437 Indices greater than one will try to read values outside the table (which would be clipped appropriately). Anyway \, the polynomials increase rapidly in value outside the interval from -1 to 1 that we are using here., f 62; +#X text 458 109 subpatch to calculate Chebychev polynomials, f 21; +#X obj 478 48 declare -stdpath ./; +#X obj 499 169 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 528 169 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 557 169 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 586 169 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 99 100 <-- index in; +#X obj 41 18 cnv 5 5 25 empty empty Waveshaphing\ with\ Chebyshev\ Polynomials 15 13 0 16 #dfdfdf #202020 0; +#X text 188 283 This patch demonstrates using Chebyshev polynomials (of the first kind) to generate pure harmonics using waveshaping. The pure harmonic only comes out when the index is one (top of the scale). Smaller indices will give various mixes of harmonics. The table initially holds the fifth Chebychev polynomial \, so you can get the fifth harmonic., f 62; +#X text 188 500 When you get tired of Chebyshev polynomials you can draw your own functions by hand and/or try other formulas., f 62; #X connect 1 0 5 0; #X connect 2 0 1 0; #X connect 3 0 8 0; @@ -191,7 +191,7 @@ #X connect 12 0 11 0; #X connect 18 0 9 0; #X connect 19 0 0 0; -#X connect 27 0 11 1; -#X connect 28 0 11 2; -#X connect 29 0 11 3; -#X connect 30 0 11 4; +#X connect 24 0 11 1; +#X connect 25 0 11 2; +#X connect 26 0 11 3; +#X connect 27 0 11 4; diff --git a/doc/3.audio.examples/E06.exponential.pd b/doc/3.audio.examples/E06.exponential.pd index f5c8d151..f71b3776 100644 --- a/doc/3.audio.examples/E06.exponential.pd +++ b/doc/3.audio.examples/E06.exponential.pd @@ -144,12 +144,12 @@ #X text 701 177 10; #X text 25 641 When the index of modulation exceeds 5 we scan past the right hand border of the table (the thousandth point \, corresponding to exp(-10). This isn't a problem because the values are all close to zero there., f 61; #X text 25 401 Here we use an exponential function as a waveshaping transfer function. The theory is shown in detail in the accompanying book \, but in short \, we adjust the sinusoid so that \, as the index increases \, we scan starting from the left of the transfer function (previously the reading location grew from the center). The table contains exp(-x) with x varying from 0 to 10 When the index is zero \, the output is the constant 1 and the spectrum holds only DC. As the index grows \, the output is a sequence of steadily narrower pulses \, whose spectrum gets progressively fatter., f 61; -#X text 48 10 WAVESHAPING USING AN EXPONENTIAL FUNCTION; #X obj 686 21 declare -stdpath ./; #X text 264 286 <-- repeatedly; #X text 230 258 <-- graph once; #X text 237 87 <-- index in; #X text 25 549 Table lookup is prepared as follows. First add one to the sinusoid and adjust its amplitude according to index so it ranges from 0 to 2*index. Then adjust for the table's input scale (100 points per unit \, so multiply by 100) and add one to skip the interpolation point at the beginning of the table., f 61; +#X obj 42 14 cnv 5 5 25 empty empty Waveshaphing\ using\ Exponential\ Function 15 13 0 16 #dfdfdf #202020 0; #X connect 1 0 6 0; #X connect 5 0 3 1; #X connect 17 0 18 0; diff --git a/doc/3.audio.examples/E07.evenodd.pd b/doc/3.audio.examples/E07.evenodd.pd index 30298ef9..1ac88d1b 100644 --- a/doc/3.audio.examples/E07.evenodd.pd +++ b/doc/3.audio.examples/E07.evenodd.pd @@ -6,7 +6,7 @@ #N canvas 0 0 450 300 (subpatch) 0; #X array E07 11 float 2; #X coords 0 96 11 36 200 160 1 0 0; -#X restore 514 87 graph; +#X restore 549 94 graph; #X floatatom 348 98 5 10 999 0 - - - 0; #X obj 288 288 mtof; #X msg 85 208 1; @@ -37,7 +37,7 @@ #X text 70 21 This patch loads a sequence of pitches into E07. The values are floating-point \, so we could use microtones (60.5 \, for example) if we wish.; #X msg 111 114 \; E07 0 54 55 57 63 61 67 71 57 70 61 63 \; E07 yticks 36 12 1 \; E07 ylabel 11.4 36 48 60 72 84 96; #X connect 0 0 2 0; -#X restore 574 267 pd make-table; +#X restore 609 274 pd make-table; #X obj 49 180 sel 0; #X msg 49 208 0; #X text 106 230 level; @@ -48,7 +48,6 @@ #X text 311 374 mixed; #X obj 288 241 tabread E07; #X text 393 419 The metronome also triggers an ADSR envelope \, whose parameters may also be changed using the "level" \, "A" \, "D" \, and "S" controls., f 62; -#X text 89 29 SEQUENCED WAVESHAPING SYNTHESIZER; #X obj 145 647 declare -stdpath ./; #X text 209 95 ON/OFF -->; #X text 390 98 <-- msec; @@ -57,11 +56,12 @@ #X text 393 472 The synthesis ([osc~] \, [*~] \, [+~ 0.1] and [cos~]) is a very simple application of the waveshaping technique. The [osc~] oscillator (whose amplitude depends on the ADSR generator) is used as an index into the [cos~] wavetable. An additional offset ("symmetry") controls how the oscillator's waveform is centered on the wavetable. If the offset is zero \, the oscillator reads into the (even) cosine function (producing only even harmonics). If the offset is 0.25 \, we read 1/4 wave into the cosine function: the result is an odd function and we get odd harmonics. Between the two we get mixtures of even and odd., f 62; #X obj 288 128 metro 150; #X text 393 324 This patch uses a stepping sequencer to control a waveshaping instrument. A metronome ([metro 150]) drives a counter ([f] \, [+ 1] \, and [mod 11]) which counts repeatedly through the 11 values which are read from the stored table ([tabread E07]). The values may be read in sequence \, by twos or threes \, etc. \, according to the "increment" parameter., f 62; +#X obj 72 31 cnv 5 5 25 empty empty Sequenced\ Waveshaphing\ Synthesizer 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 1 0; #X connect 0 0 38 0; #X connect 1 0 2 0; #X connect 2 0 0 1; -#X connect 4 0 47 1; +#X connect 4 0 46 1; #X connect 5 0 33 0; #X connect 6 0 26 0; #X connect 7 0 10 0; @@ -78,7 +78,7 @@ #X connect 22 0 1 1; #X connect 23 0 7 0; #X connect 24 0 30 0; -#X connect 24 0 47 0; +#X connect 24 0 46 0; #X connect 26 0 23 0; #X connect 27 0 5 0; #X connect 28 0 27 1; @@ -86,5 +86,5 @@ #X connect 31 0 26 0; #X connect 33 0 7 1; #X connect 38 0 27 0; -#X connect 47 0 0 0; -#X connect 47 0 6 0; +#X connect 46 0 0 0; +#X connect 46 0 6 0; diff --git a/doc/3.audio.examples/E08.phase.mod.pd b/doc/3.audio.examples/E08.phase.mod.pd index d524d37e..4c693b07 100644 --- a/doc/3.audio.examples/E08.phase.mod.pd +++ b/doc/3.audio.examples/E08.phase.mod.pd @@ -1,4 +1,4 @@ -#N canvas 275 43 920 617 12; +#N canvas 300 188 920 617 12; #X declare -stdpath ./; #X obj 231 164 *~; #X floatatom 231 107 4 0 0 0 - - - 0; @@ -18,7 +18,6 @@ #X text 217 66 modulation; #X text 61 132 carrier; #X text 42 230 output; -#X text 68 30 PHASE MODULATION; #X text 56 397 Most implementations of "FM" actually use phase \, not frequency \, modulation \, because it extends in a more natural way to "multi-operator FM" with three or more oscillators., f 60; #X obj 135 148 phasor~; #X obj 167 574 cos~; @@ -53,20 +52,21 @@ #X text 56 453 To do phase modulation \, we split the "carrier oscillator" into its phase calculation ([phasor~]) and its waveform lookup ([cos~]). These together would be equivalent to an [osc~] object \, but the [+~] between them adds the modulating oscillator's output to the phase.; #X text 530 476 We also have to use a [line~] object to smooth changes in the modulation index \, which wasn't necessary in the previous patch., f 46; #X text 51 189 phase ---> modulation, f 10; +#X obj 46 20 cnv 5 5 25 empty empty Phase\ Modulation 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 5 1; #X connect 1 0 6 0; #X connect 2 0 0 1; -#X connect 3 0 20 0; +#X connect 3 0 19 0; +#X connect 4 0 28 0; #X connect 4 0 29 0; -#X connect 4 0 30 0; #X connect 5 0 4 0; -#X connect 5 0 35 0; +#X connect 5 0 34 0; #X connect 6 0 0 0; #X connect 7 0 2 0; #X connect 8 0 9 0; #X connect 9 0 7 0; -#X connect 20 0 5 0; -#X connect 22 0 21 0; -#X connect 33 0 28 0; -#X connect 33 0 29 0; -#X connect 35 0 28 0; +#X connect 19 0 5 0; +#X connect 21 0 20 0; +#X connect 32 0 27 0; +#X connect 32 0 28 0; +#X connect 34 0 27 0; diff --git a/doc/3.audio.examples/E09.FM.spectrum.pd b/doc/3.audio.examples/E09.FM.spectrum.pd index a6887471..d9fba0a3 100644 --- a/doc/3.audio.examples/E09.FM.spectrum.pd +++ b/doc/3.audio.examples/E09.FM.spectrum.pd @@ -1,14 +1,14 @@ -#N canvas 427 113 697 549 12; +#N canvas 427 113 697 571 12; #X declare -stdpath ./; -#X obj 146 209 *~; -#X obj 189 209 line~; -#X obj 71 210 cos~; -#X obj 71 185 +~; -#X obj 189 186 pack 0 50; -#X floatatom 189 138 4 0 0 0 - - - 0; -#X obj 189 162 / 100; -#X obj 71 160 phasor~; -#X obj 71 321 output~; +#X obj 146 239 *~; +#X obj 189 239 line~; +#X obj 71 240 cos~; +#X obj 71 215 +~; +#X obj 189 216 pack 0 50; +#X floatatom 189 168 4 0 0 0 - - - 0; +#X obj 189 192 / 100; +#X obj 71 190 phasor~; +#X obj 71 351 output~; #N canvas 665 146 599 711 fft 0; #X obj 97 106 inlet~; #X obj 286 257 inlet; @@ -69,48 +69,48 @@ #X connect 27 0 28 0; #X connect 27 1 19 0; #X connect 30 0 26 0; -#X restore 115 264 pd fft; -#X obj 134 240 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 175 264 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X restore 115 294 pd fft; +#X obj 134 270 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 175 294 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #N canvas 0 0 450 300 (subpatch) 0; #X array E09-signal 882 float 0; #X coords 0 1.02 882 -1.02 200 80 1; -#X restore 411 59 graph; +#X restore 411 89 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array E09-spectrum 259 float 0; #X coords 0 0.51 258 -0.008 259 130 1; -#X restore 361 208 graph; -#X text 429 145 ---- 0.02 seconds ----; -#X text 391 339 2; -#X text 422 339 4; -#X text 360 339 0; -#X text 332 88 WAVEFORM; -#X text 511 183 SPECTRUM; -#X text 621 324 0; -#X text 622 206 0.5; -#X obj 146 138 osc~; -#X obj 146 107 r fundamental; -#X text 224 138 index (x100); -#X text 454 339 6; -#X text 487 339 8; -#X text 515 339 10; -#X text 547 339 12; -#X text 579 339 14; -#X text 45 17 SPECTRUM OF TWO-OPERATOR PHASE MODULATION; -#X floatatom 71 79 3 0 15 0 - - - 0; -#X obj 71 136 *; -#X obj 71 54 r cm; -#X text 105 78 carrier harmonic #; -#X text 119 407 This patch measures the spectrum of two-operator phase modulation. The carrier frequency is initially six times the modulation frequency \, but you can change it with the "carrier harmonic #" control. Changing the index changes the relative strengths of the harmonics. Past a certain index (which depends on the carrier frequency) the lower sidebands begin to reflect about the left edge of the spectrum \, causing complicated interference effects., f 71; -#X obj 529 17 declare -stdpath ./; -#X text 196 263 <-- repeatedly; -#X text 156 240 <-- graph once; -#X obj 71 293 hip~ 5; -#X text 393 364 ------ partial number ------; +#X restore 361 238 graph; +#X text 429 175 ---- 0.02 seconds ----; +#X text 391 369 2; +#X text 422 369 4; +#X text 360 369 0; +#X text 332 117 WAVEFORM; +#X text 511 213 SPECTRUM; +#X text 621 354 0; +#X text 622 236 0.5; +#X obj 146 168 osc~; +#X obj 146 137 r fundamental; +#X text 224 168 index (x100); +#X text 454 369 6; +#X text 487 369 8; +#X text 515 369 10; +#X text 547 369 12; +#X text 579 369 14; +#X floatatom 71 109 3 0 15 0 - - - 0; +#X obj 71 166 *; +#X obj 71 80 r cm; +#X text 100 109 carrier harmonic #; +#X text 98 448 This patch measures the spectrum of two-operator phase modulation. The carrier frequency is initially six times the modulation frequency \, but you can change it with the "carrier harmonic #" control. Changing the index changes the relative strengths of the harmonics. Past a certain index (which depends on the carrier frequency) the lower sidebands begin to reflect about the left edge of the spectrum \, causing complicated interference effects., f 71; +#X obj 517 29 declare -stdpath ./; +#X text 196 293 <-- repeatedly; +#X text 156 270 <-- graph once; +#X obj 71 323 hip~ 5; +#X text 393 394 ------ partial number ------; +#X obj 46 26 cnv 5 5 25 empty empty Spectrum\ of\ Two-Operator\ Phase\ Modulation 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 3 1; #X connect 1 0 0 1; #X connect 2 0 9 0; -#X connect 2 0 39 0; +#X connect 2 0 38 0; #X connect 3 0 2 0; #X connect 4 0 1 0; #X connect 5 0 6 0; @@ -120,8 +120,8 @@ #X connect 11 0 9 2; #X connect 22 0 0 0; #X connect 23 0 22 0; -#X connect 23 0 32 1; -#X connect 31 0 32 0; -#X connect 32 0 7 0; -#X connect 33 0 31 0; -#X connect 39 0 8 0; +#X connect 23 0 31 1; +#X connect 30 0 31 0; +#X connect 31 0 7 0; +#X connect 32 0 30 0; +#X connect 38 0 8 0; diff --git a/doc/3.audio.examples/E10.complex.FM.pd b/doc/3.audio.examples/E10.complex.FM.pd index 9e65197e..865e6659 100644 --- a/doc/3.audio.examples/E10.complex.FM.pd +++ b/doc/3.audio.examples/E10.complex.FM.pd @@ -87,7 +87,6 @@ #X floatatom 71 93 4 0 15 0 - - - 0; #X obj 71 180 *; #X obj 71 66 r cm; -#X text 55 18 SPECTRUM OF COMPLEX PHASE MODULATION; #X text 74 115 carrier; #X obj 147 182 *; #X floatatom 147 93 4 0 15 0 - - - 0; @@ -111,10 +110,11 @@ #X text 237 394 <-- graph once; #X obj 129 452 hip~ 5; #X text 472 275 -------- partial number --------; +#X obj 50 12 cnv 5 5 25 empty empty Spectrum\ of\ Complex\ Phase\ Modulation 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 3 1; #X connect 1 0 0 1; #X connect 2 0 9 0; -#X connect 2 0 51 0; +#X connect 2 0 50 0; #X connect 3 0 2 0; #X connect 4 0 1 0; #X connect 5 0 6 0; @@ -124,21 +124,21 @@ #X connect 11 0 9 2; #X connect 19 0 0 0; #X connect 20 0 27 1; -#X connect 20 0 31 1; -#X connect 20 0 42 1; +#X connect 20 0 30 1; +#X connect 20 0 41 1; #X connect 26 0 27 0; #X connect 27 0 7 0; #X connect 28 0 26 0; -#X connect 31 0 19 0; -#X connect 32 0 31 0; -#X connect 34 0 32 0; -#X connect 36 0 3 1; -#X connect 37 0 36 1; -#X connect 38 0 37 0; -#X connect 39 0 40 0; -#X connect 40 0 38 0; -#X connect 41 0 36 0; +#X connect 30 0 19 0; +#X connect 31 0 30 0; +#X connect 33 0 31 0; +#X connect 35 0 3 1; +#X connect 36 0 35 1; +#X connect 37 0 36 0; +#X connect 38 0 39 0; +#X connect 39 0 37 0; +#X connect 40 0 35 0; +#X connect 41 0 40 0; #X connect 42 0 41 0; -#X connect 43 0 42 0; -#X connect 46 0 43 0; -#X connect 51 0 8 0; +#X connect 45 0 42 0; +#X connect 50 0 8 0; diff --git a/doc/3.audio.examples/F01.pulse.pd b/doc/3.audio.examples/F01.pulse.pd index fdbfa3aa..9e823fe6 100644 --- a/doc/3.audio.examples/F01.pulse.pd +++ b/doc/3.audio.examples/F01.pulse.pd @@ -1,4 +1,4 @@ -#N canvas 367 49 897 731 12; +#N canvas 438 149 897 731 12; #X declare -stdpath ./; #X obj 264 158 line~; #X floatatom 170 105 4 0 0 0 - - - 0; @@ -25,7 +25,6 @@ #X restore 604 290 graph; #X text 43 156 phase -1/2 to 1/2; #X text 78 131 phase 0 to 1; -#X text 364 36 PULSE GENERATOR; #X obj 390 317 tabwrite~ phase-output; #X obj 366 500 tabwrite~ pulse-output; #X text 55 506 high pass filter to cut DC; @@ -56,25 +55,26 @@ #X text 302 110 fix range (1 to 10); #X msg 170 78 220; #X obj 264 189 +~ 1; -#X connect 0 0 46 0; -#X connect 1 0 39 0; -#X connect 2 0 27 0; +#X obj 345 29 cnv 5 5 25 empty empty Pulse\ Generator 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 45 0; +#X connect 1 0 38 0; +#X connect 2 0 26 0; #X connect 4 0 0 0; #X connect 5 0 9 0; #X connect 7 0 8 0; #X connect 8 0 10 0; -#X connect 8 0 17 0; +#X connect 8 0 16 0; #X connect 9 0 4 0; #X connect 10 0 2 0; -#X connect 10 0 23 0; -#X connect 11 0 26 0; -#X connect 25 0 17 0; -#X connect 25 0 23 0; -#X connect 25 0 18 0; -#X connect 27 0 28 0; -#X connect 28 0 11 0; -#X connect 28 0 18 0; -#X connect 39 0 7 0; -#X connect 40 0 45 0; -#X connect 45 0 1 0; -#X connect 46 0 8 1; +#X connect 10 0 22 0; +#X connect 11 0 25 0; +#X connect 24 0 16 0; +#X connect 24 0 22 0; +#X connect 24 0 17 0; +#X connect 26 0 27 0; +#X connect 27 0 11 0; +#X connect 27 0 17 0; +#X connect 38 0 7 0; +#X connect 39 0 44 0; +#X connect 44 0 1 0; +#X connect 45 0 8 1; diff --git a/doc/3.audio.examples/F02.just.say.pd b/doc/3.audio.examples/F02.just.say.pd index fe97ad2c..4027c69e 100644 --- a/doc/3.audio.examples/F02.just.say.pd +++ b/doc/3.audio.examples/F02.just.say.pd @@ -1,23 +1,23 @@ -#N canvas 455 76 709 572 12; +#N canvas 455 76 710 648 12; #X declare -stdpath ./; -#X obj 127 338 cos~; +#X obj 128 402 cos~; #N canvas 0 22 450 278 (subpatch) 0; #X array env-output 44100 float 0; #X coords 0 1.02 44100 -1.02 200 130 1; -#X restore 415 117 graph; -#X obj 70 232 -~ 0.5; -#X obj 127 280 *~; -#X obj 127 307 clip~ -0.5 0.5; -#X obj 127 440 hip~ 5; -#X obj 145 79 *~; -#X floatatom 224 184 4 1 1000 0 - - - 0; -#X floatatom 224 210 4 0 0 0 - - - 0; -#X obj 145 41 phasor~ -4; -#X obj 145 237 +~ 0.5; -#X obj 181 140 tabwrite~ env-output; -#X text 414 252 --------- 1 second ---------; -#X floatatom 224 236 4 0 0 0 - - - 0; -#X obj 145 181 lop~ 130; +#X restore 416 181 graph; +#X obj 71 296 -~ 0.5; +#X obj 128 344 *~; +#X obj 128 371 clip~ -0.5 0.5; +#X obj 128 504 hip~ 5; +#X obj 146 143 *~; +#X floatatom 225 248 4 1 1000 0 - - - 0; +#X floatatom 225 274 4 0 0 0 - - - 0; +#X obj 146 105 phasor~ -4; +#X obj 146 301 +~ 0.5; +#X obj 182 204 tabwrite~ env-output; +#X text 415 316 --------- 1 second ---------; +#X floatatom 225 300 4 0 0 0 - - - 0; +#X obj 146 245 lop~ 130; #N canvas 704 266 342 431 freq 0; #X obj 198 156 t f f; #X obj 199 182 *; @@ -53,23 +53,24 @@ #X connect 13 0 0 0; #X connect 14 0 4 0; #X connect 15 0 2 0; -#X restore 70 152 pd freq; -#X obj 70 180 line~; -#X obj 70 205 phasor~; -#X text 174 78 square it to make a curve; -#X text 264 194 you can; -#X text 262 212 adjust these; -#X text 264 232 values; -#X text 345 309 We interrupt this series of patches to bring you an important message from Nancy Reagan. If \, anywhere \, at any time \, someone offers you an illicit drug \, just say one word in reply..., f 40; -#X text 345 407 Now that I'm sure you've heard this important message \, we can return to the essentially frivolous occupation of making turn-of-the-millennium western art music., f 40; -#X obj 145 208 *~ 6; -#X obj 127 482 output~; -#X obj 483 49 declare -stdpath ./; -#X obj 181 109 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 205 109 <-- click to graph; -#X text 230 33 negative frequency generates downwards ramps, f 25; -#X obj 127 369 +~ 1; -#X obj 127 401 *~ 0.5; +#X restore 71 216 pd freq; +#X obj 71 244 line~; +#X obj 71 269 phasor~; +#X text 175 142 square it to make a curve; +#X text 265 258 you can; +#X text 263 276 adjust these; +#X text 265 296 values; +#X text 346 373 We interrupt this series of patches to bring you an important message from Nancy Reagan. If \, anywhere \, at any time \, someone offers you an illicit drug \, just say one word in reply..., f 40; +#X text 346 471 Now that I'm sure you've heard this important message \, we can return to the essentially frivolous occupation of making turn-of-the-millennium western art music., f 40; +#X obj 146 272 *~ 6; +#X obj 128 546 output~; +#X obj 484 113 declare -stdpath ./; +#X obj 182 173 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 206 173 <-- click to graph; +#X text 231 97 negative frequency generates downwards ramps, f 25; +#X obj 128 433 +~ 1; +#X obj 128 465 *~ 0.5; +#X obj 81 34 cnv 5 5 25 empty empty Just\ Say\ One\ Word... 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 30 0; #X connect 2 0 3 0; #X connect 3 0 4 0; diff --git a/doc/3.audio.examples/F03.pulse.spectrum.pd b/doc/3.audio.examples/F03.pulse.spectrum.pd index 161ffe4a..d15263bf 100644 --- a/doc/3.audio.examples/F03.pulse.spectrum.pd +++ b/doc/3.audio.examples/F03.pulse.spectrum.pd @@ -13,7 +13,6 @@ #X text 192 59 bandwidth; #X obj 193 209 +~ 1; #X obj 71 279 +~ 1; -#X text 52 16 PULSE SPECTRUM MEASUREMENT; #X text 82 469 Here is a measured amplitude spectrum for the pulse train. Notice that \, other than a smallish spillover \, the energy sits in one "lobe" whose changing width justifies our calling the squeeze factor the "bandwidth.", f 68; #X text 82 530 The spectrum is in units of amplitude. The sidelobes \, although they look small \, are actually only about 34 dB down. You can design more complicated pulse trains \, little Blackman window functions \, which control the sidelobes much better., f 68; #X obj 71 375 output~; @@ -95,6 +94,7 @@ #X text 214 331 <-- repeatedly; #X text 175 301 <-- graph once; #X obj 71 336 hip~ 5; +#X obj 44 14 cnv 5 5 25 empty empty Pulse\ Spectrum\ Measurement 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 11 0; #X connect 1 0 12 0; #X connect 2 0 0 0; @@ -107,11 +107,11 @@ #X connect 8 0 2 0; #X connect 9 0 1 0; #X connect 11 0 5 1; -#X connect 12 0 20 0; -#X connect 18 0 17 1; -#X connect 19 0 17 2; -#X connect 20 0 17 0; -#X connect 20 0 38 0; -#X connect 21 0 4 0; -#X connect 34 0 21 0; -#X connect 38 0 16 0; +#X connect 12 0 19 0; +#X connect 17 0 16 1; +#X connect 18 0 16 2; +#X connect 19 0 16 0; +#X connect 19 0 37 0; +#X connect 20 0 4 0; +#X connect 33 0 20 0; +#X connect 37 0 15 0; diff --git a/doc/3.audio.examples/F04.waveshaping.pulse.pd b/doc/3.audio.examples/F04.waveshaping.pulse.pd index 6376e51e..332277fa 100644 --- a/doc/3.audio.examples/F04.waveshaping.pulse.pd +++ b/doc/3.audio.examples/F04.waveshaping.pulse.pd @@ -1,39 +1,38 @@ -#N canvas 429 79 782 576 12; +#N canvas 429 79 782 607 12; #X declare -stdpath ./; -#X obj 266 179 line~; -#X obj 266 155 pack 0 50; -#X floatatom 220 54 4 0 100 0 - - - 0; -#X obj 142 116 *~; -#X obj 220 80 / 10; -#X obj 220 104 moses 0; -#X msg 220 128 0; -#X text 258 54 bandwidth; -#X obj 124 149 *~; -#X obj 88 102 sig~ 1; -#X obj 88 203 /~; -#X obj 106 177 +~; -#X text 157 149 X^2; -#X text 136 180 1+X^2; -#X text 123 205 1/(1+X^2); -#X text 34 11 ANOTHER PULSE WIDTH MOD ALGORITHM; +#X obj 266 211 line~; +#X obj 266 187 pack 0 50; +#X floatatom 220 86 4 0 100 0 - - - 0; +#X obj 142 148 *~; +#X obj 220 112 / 10; +#X obj 220 136 moses 0; +#X msg 220 160 0; +#X text 258 86 bandwidth; +#X obj 124 181 *~; +#X obj 88 134 sig~ 1; +#X obj 88 235 /~; +#X obj 106 209 +~; +#X text 157 181 X^2; +#X text 136 212 1+X^2; +#X text 123 237 1/(1+X^2); #N canvas 0 0 450 300 (subpatch) 0; #X array F04-signal 882 float 0; #X coords 0 1.02 882 -1.02 200 130 1; -#X restore 536 320 graph; +#X restore 537 372 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array F04-spectrum 259 float 0; #X coords 0 1.01 258 -0.008 256 200 1; -#X restore 479 37 graph; -#X text 555 457 ---- 0.02 seconds ----; -#X text 506 236 2; -#X text 537 236 4; -#X text 476 236 0; -#X text 569 236 6; -#X text 602 236 8; -#X text 630 236 10; -#X text 662 236 12; -#X text 694 236 14; -#X obj 88 293 output~; +#X restore 479 69 graph; +#X text 556 509 ---- 0.02 seconds ----; +#X text 506 268 2; +#X text 537 268 4; +#X text 476 268 0; +#X text 569 268 6; +#X text 602 268 8; +#X text 630 268 10; +#X text 662 268 12; +#X text 694 268 14; +#X obj 88 325 output~; #N canvas 745 198 546 520 fft 0; #X text 60 23 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later.; #X obj 389 294 samplerate~; @@ -84,20 +83,21 @@ #X connect 25 0 26 0; #X connect 25 0 27 0; #X connect 28 0 1 0; -#X restore 145 257 pd fft; -#X obj 164 232 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 205 257 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 142 89 osc~; -#X text 20 386 Here we use waveshaping to make another form of pulse train. This one has a neat spectrum: the partials drop off exponentially (with the "bandwidth" controlling the rate of dropoff.) In later patches we'll use a wavetable to do the waveshaping but for simplicity \, it's done algebraically here. The oscillator runs at half the fundamental frequency. The symmetry of the waveshaping doubles the frequency of the output., f 66; -#X text 741 221 0; -#X text 738 34 1; -#X obj 142 64 r freq/2; -#X obj 230 317 declare -stdpath ./; -#X text 186 232 <-- graph once; -#X text 226 256 <-- repeatedly; -#X obj 88 257 hip~ 5; -#X text 503 264 ------ partial number ------; -#X text 20 495 This is the form of pulse train used in the original Phase Aligned Formant (PAF) algorithm \, which was protected by patents belonging to IRCAM from 1993 to 2011, f 66; +#X restore 145 289 pd fft; +#X obj 164 264 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 205 289 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 142 121 osc~; +#X text 32 418 Here we use waveshaping to make another form of pulse train. This one has a neat spectrum: the partials drop off exponentially (with the "bandwidth" controlling the rate of dropoff.) In later patches we'll use a wavetable to do the waveshaping but for simplicity \, it's done algebraically here. The oscillator runs at half the fundamental frequency. The symmetry of the waveshaping doubles the frequency of the output., f 66; +#X text 741 253 0; +#X text 738 66 1; +#X obj 142 96 r freq/2; +#X obj 230 349 declare -stdpath ./; +#X text 186 264 <-- graph once; +#X text 226 288 <-- repeatedly; +#X obj 88 289 hip~ 5; +#X text 513 301 ------ partial number ------; +#X text 32 527 This is the form of pulse train used in the original Phase Aligned Formant (PAF) algorithm \, which was protected by patents belonging to IRCAM from 1993 to 2011, f 66; +#X obj 25 36 cnv 5 5 25 empty empty Another\ Pulse\ Width\ Modulator\ Algorithm 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 3 1; #X connect 1 0 0 0; #X connect 2 0 4 0; @@ -110,11 +110,11 @@ #X connect 8 0 11 1; #X connect 9 0 10 0; #X connect 9 0 11 0; -#X connect 10 0 39 0; -#X connect 10 0 28 0; +#X connect 10 0 38 0; +#X connect 10 0 27 0; #X connect 11 0 10 1; -#X connect 29 0 28 1; -#X connect 30 0 28 2; -#X connect 31 0 3 0; -#X connect 35 0 31 0; -#X connect 39 0 27 0; +#X connect 28 0 27 1; +#X connect 29 0 27 2; +#X connect 30 0 3 0; +#X connect 34 0 30 0; +#X connect 38 0 26 0; diff --git a/doc/3.audio.examples/F05.ring.modulation.pd b/doc/3.audio.examples/F05.ring.modulation.pd index 9acc41c0..a3d49300 100644 --- a/doc/3.audio.examples/F05.ring.modulation.pd +++ b/doc/3.audio.examples/F05.ring.modulation.pd @@ -65,7 +65,6 @@ #X text 712 295 1; #X text 712 419 -1; #X text 156 196 modulating oscillator; -#X text 64 16 RING MODULATED PULSE TRAINS; #X text 69 371 Now we take a pulse train and ring modulate it \, which effectively aliases the spectrum so that it is centered at any desired partial number. The "bandwidth" control still affects the shape of the peak \, independently of where it is centered. This generates a formant centered at the given partial., f 55; #X floatatom 107 127 6 0 100 0 - - - 0; #X obj 107 193 osc~; @@ -132,14 +131,15 @@ #X connect 26 0 28 0; #X restore 147 254 pd fft; #X text 481 211 ------ partial number ------; +#X obj 35 20 cnv 5 5 25 empty empty Ring\ Modulated\ Pulse\ Trains 15 13 0 16 #dfdfdf #202020 0; #X connect 6 0 7 0; #X connect 7 0 8 0; +#X connect 8 0 36 0; #X connect 8 0 37 0; -#X connect 8 0 38 0; -#X connect 11 0 38 1; -#X connect 12 0 38 2; -#X connect 25 0 27 0; -#X connect 26 0 8 1; -#X connect 27 0 26 0; -#X connect 28 0 27 1; -#X connect 37 0 10 0; +#X connect 11 0 37 1; +#X connect 12 0 37 2; +#X connect 24 0 26 0; +#X connect 25 0 8 1; +#X connect 26 0 25 0; +#X connect 27 0 26 1; +#X connect 36 0 10 0; diff --git a/doc/3.audio.examples/F06.packets.pd b/doc/3.audio.examples/F06.packets.pd index ad43a440..9b933850 100644 --- a/doc/3.audio.examples/F06.packets.pd +++ b/doc/3.audio.examples/F06.packets.pd @@ -50,10 +50,9 @@ #X restore 564 64 graph; #X floatatom 166 281 4 0 0 0 - - - 0; #X obj 166 307 phasor~ 100; -#X text 51 16 WINDOWED PACKETS; #X text 54 470 window; #X text 282 440 magnified phase; -#X text 37 47 The simpler of two techniques for making slidable center frequencies is to synthesize enveloped sinusoidal wave packets. The packets should repeat at the fundamental frequency \, but the frequency of the packet itself controls the center frequency of the formant. The length of the packet varies inversely with bandwidth., f 68; +#X text 35 51 The simpler of two techniques for making slidable center frequencies is to synthesize enveloped sinusoidal wave packets. The packets should repeat at the fundamental frequency \, but the frequency of the packet itself controls the center frequency of the formant. The length of the packet varies inversely with bandwidth., f 68; #X obj 106 596 output~; #X obj 265 529 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 106 479 *~ 0.5; @@ -72,7 +71,8 @@ #X text 287 527 <-- graph; #X text 286 463 <-- this cosine goes at the; #X obj 106 556 hip~ 5; -#X text 38 135 In the patch below \, the [clip~] followed by [cos~] and [+~ 1] is the enveloping ("windowing") function \, which appears in the top graph. The carrier \, on the other hand \, is a broken sinusoid made by amplifying the [phasor~] (the [*~] controlled by "center freq.") and taking the [cos~] of the result. The "breaks" in the sinusoid only occur when the enveloping signal is zero., f 68; +#X text 36 139 In the patch below \, the [clip~] followed by [cos~] and [+~ 1] is the enveloping ("windowing") function \, which appears in the top graph. The carrier \, on the other hand \, is a broken sinusoid made by amplifying the [phasor~] (the [*~] controlled by "center freq.") and taking the [cos~] of the result. The "breaks" in the sinusoid only occur when the enveloping signal is zero., f 68; +#X obj 61 10 cnv 5 5 25 empty empty Windowed\ Packets 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 10 0; #X connect 1 0 11 0; #X connect 3 0 0 0; @@ -83,11 +83,11 @@ #X connect 7 0 3 0; #X connect 8 0 1 0; #X connect 10 0 6 1; -#X connect 11 0 31 0; +#X connect 11 0 30 0; #X connect 12 0 13 1; #X connect 12 0 18 2; #X connect 13 0 18 0; -#X connect 13 0 46 0; +#X connect 13 0 45 0; #X connect 14 0 15 0; #X connect 15 0 20 0; #X connect 17 0 12 0; @@ -95,7 +95,7 @@ #X connect 20 0 19 0; #X connect 23 0 24 0; #X connect 24 0 5 0; -#X connect 30 0 18 3; -#X connect 31 0 13 0; -#X connect 31 0 18 1; -#X connect 46 0 29 0; +#X connect 29 0 18 3; +#X connect 30 0 13 0; +#X connect 30 0 18 1; +#X connect 45 0 28 0; diff --git a/doc/3.audio.examples/F07.packet.spectrum.pd b/doc/3.audio.examples/F07.packet.spectrum.pd index 14862eef..bd3b63ff 100644 --- a/doc/3.audio.examples/F07.packet.spectrum.pd +++ b/doc/3.audio.examples/F07.packet.spectrum.pd @@ -47,7 +47,6 @@ #X restore 84 589 pd fft; #X text 323 594 0; #X text 571 594 5512; -#X text 122 23 WINDOWED PACKET SPECTRUM; #X text 57 69 Here's the spectrum you get. Note that even if you put the center frequency right on a partial \, there is significant energy in neighboring partials (try fundamental 440 \, "center freq" 30 \, bandwidth 0.), f 63; #X text 56 136 The center frequency is in units of ten per partial \, or in other words a value of "30" means "centered on the third partial"., f 63; #X text 55 192 This technique only works if you're doing Hanning-window shaped PWM--you can't combine this naturally with FM or with the waveshaping technique we'll see later., f 63; @@ -57,6 +56,7 @@ #X text 145 560 <-- graph; #X text 279 323 center freq.; #X text 35 296 fundamental frequency, f 11; +#X obj 78 24 cnv 5 5 25 empty empty Windowed\ Packet\ Spectrum 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 9 0; #X connect 1 0 10 0; #X connect 2 0 0 0; @@ -70,7 +70,7 @@ #X connect 10 0 12 0; #X connect 11 0 12 1; #X connect 12 0 23 0; -#X connect 12 0 30 0; +#X connect 12 0 29 0; #X connect 13 0 14 0; #X connect 14 0 19 0; #X connect 15 0 11 0; @@ -80,4 +80,4 @@ #X connect 19 0 18 0; #X connect 20 0 21 0; #X connect 21 0 4 0; -#X connect 32 0 23 1; +#X connect 31 0 23 1; diff --git a/doc/3.audio.examples/F08.two.cosines.pd b/doc/3.audio.examples/F08.two.cosines.pd index ee0a05c9..41613556 100644 --- a/doc/3.audio.examples/F08.two.cosines.pd +++ b/doc/3.audio.examples/F08.two.cosines.pd @@ -1,43 +1,43 @@ -#N canvas 504 51 726 656 12; +#N canvas 504 51 756 667 12; #X declare -stdpath ./; -#X obj 114 329 cos~; -#X floatatom 161 118 4 0 100 0 - - - 0; -#X obj 161 142 / 10; -#X text 486 507 --- 0.02 seconds ---; -#X obj 114 299 *~; -#X obj 161 214 line~; -#X obj 161 166 max 0; +#X obj 147 328 cos~; +#X floatatom 194 117 4 0 100 0 - - - 0; +#X obj 194 141 / 10; +#X text 519 506 --- 0.02 seconds ---; +#X obj 147 298 *~; +#X obj 194 213 line~; +#X obj 194 165 max 0; #N canvas 0 0 450 300 (subpatch) 0; #X array F08-carrier 882 float 0; #X coords 0 2 881 -2 200 140 1; -#X restore 455 356 graph; -#X floatatom 64 221 5 0 0 0 - - - 0; -#X obj 156 329 cos~; -#X obj 197 242 wrap~; -#X obj 161 269 -~; -#X obj 156 299 +~; -#X obj 156 374 -~; -#X obj 179 424 *~; -#X obj 161 464 +~; -#X obj 161 190 pack 0 50; -#X text 210 329 synthesize the two partials; -#X obj 161 567 output~; -#X text 282 125 The other \, spiffier way is to make a sum of cosines to interpolate between adjacent harmonics. Suppose for example we want a center frequency of 5.3 (in units of the fundamental.) We just take partial 5 with amplitude 0.7 and partial 6 with amplitude 0.3:, f 52; -#X obj 246 519 tabwrite~ F08-carrier; -#X obj 246 488 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 64 245 phasor~ 100; -#X text 38 24 MOVABLE CENTER FREQUENCY BY ADDING TWO COSINES; -#X text 249 241 the fractional part "q"; -#X text 210 269 subtract to get the integer part "k"; -#X text 210 299 multiply phase by k and k+1; -#X text 204 375 c2 - c1; -#X text 217 422 q * (c2 - c1); -#X text 196 459 q * c2 + (1-q) * c1; -#X obj 524 27 declare -stdpath ./; -#X text 269 487 <-- graph; -#X obj 161 518 hip~ 5; -#X text 48 181 fundamental frequency, f 11; -#X text 83 76 center frequency (in tenths of fundamental), f 22; +#X restore 488 355 graph; +#X floatatom 97 220 5 0 0 0 - - - 0; +#X obj 189 328 cos~; +#X obj 230 241 wrap~; +#X obj 194 268 -~; +#X obj 189 298 +~; +#X obj 189 373 -~; +#X obj 212 423 *~; +#X obj 194 463 +~; +#X obj 194 189 pack 0 50; +#X text 243 328 synthesize the two partials; +#X obj 194 566 output~; +#X text 297 116 The other \, spiffier way is to make a sum of cosines to interpolate between adjacent harmonics. Suppose for example we want a center frequency of 5.3 (in units of the fundamental.) We just take partial 5 with amplitude 0.7 and partial 6 with amplitude 0.3:, f 52; +#X obj 279 518 tabwrite~ F08-carrier; +#X obj 279 487 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 97 244 phasor~ 100; +#X text 282 240 the fractional part "q"; +#X text 243 268 subtract to get the integer part "k"; +#X text 243 298 multiply phase by k and k+1; +#X text 237 374 c2 - c1; +#X text 250 421 q * (c2 - c1); +#X text 229 458 q * c2 + (1-q) * c1; +#X obj 371 591 declare -stdpath ./; +#X text 302 486 <-- graph; +#X obj 194 517 hip~ 5; +#X text 81 180 fundamental frequency, f 11; +#X text 26 113 center frequency (in tenths of fundamental), f 22; +#X obj 103 37 cnv 5 5 25 empty empty Movable\ Center\ Frequency\ by\ Adding\ Two\ Cosines 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 13 1; #X connect 0 0 15 0; #X connect 1 0 2 0; @@ -56,9 +56,9 @@ #X connect 13 0 14 0; #X connect 14 0 15 1; #X connect 15 0 20 0; -#X connect 15 0 32 0; +#X connect 15 0 31 0; #X connect 16 0 5 0; #X connect 21 0 20 0; #X connect 22 0 4 0; #X connect 22 0 12 1; -#X connect 32 0 18 0; +#X connect 31 0 18 0; diff --git a/doc/3.audio.examples/F09.declickit.pd b/doc/3.audio.examples/F09.declickit.pd index 88145367..0bc4fdad 100644 --- a/doc/3.audio.examples/F09.declickit.pd +++ b/doc/3.audio.examples/F09.declickit.pd @@ -13,7 +13,6 @@ #X obj 175 100 metro 400; #X obj 175 129 del 200; #X obj 175 267 samphold~; -#X text 138 21 CHANGING THE CENTER FREQUENCY QUICKLY; #X obj 139 614 output~; #X floatatom 228 156 4 0 50 0 - - - 0; #X obj 175 209 line~; @@ -23,7 +22,6 @@ #X obj 175 183 pack f f; #X obj 427 110 declare -stdpath ./; #X text 264 156 <-- gliss time; -#X obj 175 343 *~; #X obj 267 254 hradio 19 1 0 2 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0; #X obj 229 298 == 0; #X obj 267 299 == 1; @@ -31,6 +29,8 @@ #X text 313 252 <-- select which one is actually used, f 20; #X text 260 371 Since in the previous patch the amplitudes of the two cosines depend on "center frequency" we can't change that discontinuously without clicking \, as you hear in this patch., f 45; #X text 260 439 The fix is to use a [samphold~] object to keep the center frequency frozen except at phase crossings. At the phase crossings the two weighted cosines add to one \, so we can discontinuously change the frequencies and weights there., f 45; +#X obj 68 25 cnv 5 5 25 empty empty Changing\ The\ Center\ Frequency\ Quickly 15 13 0 16 #dfdfdf #202020 0; +#X obj 175 343 *~ 0; #X connect 0 0 6 1; #X connect 0 0 8 0; #X connect 1 0 0 0; @@ -42,26 +42,26 @@ #X connect 5 0 2 0; #X connect 6 0 7 0; #X connect 7 0 8 1; -#X connect 8 0 14 0; +#X connect 8 0 13 0; #X connect 9 0 10 0; -#X connect 10 0 18 0; +#X connect 10 0 17 0; #X connect 10 0 11 0; -#X connect 11 0 17 0; -#X connect 12 0 23 0; -#X connect 15 0 20 1; -#X connect 16 0 12 0; -#X connect 16 0 27 0; -#X connect 17 0 20 0; -#X connect 18 0 20 0; -#X connect 19 0 1 0; -#X connect 19 0 5 1; -#X connect 19 0 12 1; -#X connect 20 0 16 0; -#X connect 23 0 4 0; -#X connect 23 0 3 0; -#X connect 24 0 25 0; -#X connect 24 0 26 0; -#X connect 25 0 27 1; -#X connect 26 0 23 1; -#X connect 27 0 4 0; -#X connect 27 0 3 0; +#X connect 11 0 16 0; +#X connect 12 0 30 0; +#X connect 14 0 19 1; +#X connect 15 0 12 0; +#X connect 15 0 25 0; +#X connect 16 0 19 0; +#X connect 17 0 19 0; +#X connect 18 0 1 0; +#X connect 18 0 5 1; +#X connect 18 0 12 1; +#X connect 19 0 15 0; +#X connect 22 0 23 0; +#X connect 22 0 24 0; +#X connect 23 0 25 1; +#X connect 24 0 30 1; +#X connect 25 0 4 0; +#X connect 25 0 3 0; +#X connect 30 0 4 0; +#X connect 30 0 3 0; diff --git a/doc/3.audio.examples/F10.sweepable.FM.pd b/doc/3.audio.examples/F10.sweepable.FM.pd index e37b1be8..5d5cc4b5 100644 --- a/doc/3.audio.examples/F10.sweepable.FM.pd +++ b/doc/3.audio.examples/F10.sweepable.FM.pd @@ -1,35 +1,34 @@ -#N canvas 358 63 816 600 12; +#N canvas 358 63 824 688 12; #X declare -stdpath ./; -#X obj 151 313 cos~; -#X obj 151 233 *~; -#X obj 194 313 cos~; -#X obj 235 211 wrap~; -#X obj 198 211 -~; -#X obj 194 288 +~; -#X obj 194 346 -~; -#X obj 217 372 *~; -#X obj 198 181 samphold~; -#X text 479 66 APPLYING TWO-COSINE CARRIER TO FM; -#X floatatom 198 49 4 0 200 0 - - - 0; -#X obj 198 72 / 10; -#X obj 198 124 line~; -#X obj 198 98 pack 0 50; -#X obj 130 116 phasor~; -#X floatatom 130 93 4 0 0 0 - - - 0; -#X text 329 74 index; -#X text 327 91 (percent); -#X floatatom 335 117 4 0 500 0 - - - 0; -#X obj 285 170 cos~; -#X obj 335 186 line~; -#X obj 285 221 *~; -#X obj 335 140 / 100; -#X obj 335 163 pack 0 50; -#X obj 151 259 +~; -#X text 320 218 modulating; -#X text 320 233 oscillator; -#X text 38 274 both phases-->; -#X text 24 259 add modulator to; -#X obj 199 507 output~; +#X obj 152 348 cos~; +#X obj 152 268 *~; +#X obj 195 348 cos~; +#X obj 236 246 wrap~; +#X obj 199 246 -~; +#X obj 195 323 +~; +#X obj 195 381 -~; +#X obj 218 407 *~; +#X obj 199 216 samphold~; +#X floatatom 199 84 4 0 200 0 - - - 0; +#X obj 199 107 / 10; +#X obj 199 159 line~; +#X obj 199 133 pack 0 50; +#X obj 131 151 phasor~; +#X floatatom 131 128 4 0 0 0 - - - 0; +#X text 330 109 index; +#X text 328 126 (percent); +#X floatatom 336 152 4 0 500 0 - - - 0; +#X obj 286 205 cos~; +#X obj 336 221 line~; +#X obj 286 256 *~; +#X obj 336 175 / 100; +#X obj 336 198 pack 0 50; +#X obj 152 294 +~; +#X text 321 253 modulating; +#X text 321 268 oscillator; +#X text 39 309 both phases-->; +#X text 25 294 add modulator to; +#X obj 200 542 output~; #N canvas 605 126 529 576 fft 0; #X obj 83 140 inlet~; #X obj 197 410 inlet; @@ -84,55 +83,56 @@ #X connect 28 0 30 0; #X connect 29 0 24 1; #X connect 30 0 22 1; -#X restore 240 432 pd fft; -#X obj 259 380 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 279 405 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X restore 241 467 pd fft; +#X obj 260 415 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 280 440 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #N canvas 0 0 450 300 (subpatch) 0; #X array F10-spectrum 259 float 0; #X coords 0 0.51 258 -0.008 256 130 1; -#X restore 484 309 graph; -#X text 476 440 0; -#X obj 199 400 +~; -#X text 471 99 We can apply the two-cosine method to FM synthesis to get FM spectra which slide up and down: we just treat the cosines like carrier signals in an FM instrument. This doesn't work as well as you'd wish \, because the phases of the partials of the two FM instruments don't line up \, so that \, for indices of modulation above about 20% \, you get beating effects as the center frequency goes up and down., f 43; -#X text 716 441 2700; -#X text 97 34 center freq. (in tenths of fundamental), f 13; -#X text 39 93 fundamental (= mod freq), f 12; -#X obj 622 25 declare -stdpath ./; -#X text 281 380 <-- graph once; -#X text 300 404 <-- repeatedly; -#X obj 199 466 hip~ 5; -#X text 534 449 ---- frequency ----; +#X restore 446 441 graph; +#X text 438 572 0; +#X obj 200 435 +~; +#X text 472 134 We can apply the two-cosine method to FM synthesis to get FM spectra which slide up and down: we just treat the cosines like carrier signals in an FM instrument. This doesn't work as well as you'd wish \, because the phases of the partials of the two FM instruments don't line up \, so that \, for indices of modulation above about 20% \, you get beating effects as the center frequency goes up and down., f 43; +#X text 678 573 2700; +#X text 98 69 center freq. (in tenths of fundamental), f 13; +#X text 40 128 fundamental (= mod freq), f 12; +#X obj 623 60 declare -stdpath ./; +#X text 282 415 <-- graph once; +#X text 301 439 <-- repeatedly; +#X obj 200 501 hip~ 5; +#X text 496 581 ---- frequency ----; +#X obj 59 26 cnv 5 5 25 empty empty Applying\ Two-Cosine\ Carrier\ to\ FM 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 6 1; -#X connect 0 0 35 0; -#X connect 1 0 24 0; +#X connect 0 0 34 0; +#X connect 1 0 23 0; #X connect 2 0 6 0; #X connect 3 0 4 1; #X connect 3 0 7 1; #X connect 4 0 1 1; #X connect 5 0 2 0; #X connect 6 0 7 0; -#X connect 7 0 35 1; +#X connect 7 0 34 1; #X connect 8 0 4 0; #X connect 8 0 3 0; -#X connect 10 0 11 0; -#X connect 11 0 13 0; -#X connect 12 0 8 0; -#X connect 13 0 12 0; -#X connect 14 0 8 1; -#X connect 14 0 19 0; -#X connect 14 0 1 0; -#X connect 14 0 5 1; -#X connect 15 0 14 0; -#X connect 18 0 22 0; -#X connect 19 0 21 0; -#X connect 20 0 21 1; -#X connect 21 0 24 1; -#X connect 22 0 23 0; -#X connect 23 0 20 0; -#X connect 24 0 5 0; -#X connect 24 0 0 0; -#X connect 31 0 30 1; -#X connect 32 0 30 2; -#X connect 35 0 30 0; -#X connect 35 0 43 0; -#X connect 43 0 29 0; +#X connect 9 0 10 0; +#X connect 10 0 12 0; +#X connect 11 0 8 0; +#X connect 12 0 11 0; +#X connect 13 0 8 1; +#X connect 13 0 18 0; +#X connect 13 0 1 0; +#X connect 13 0 5 1; +#X connect 14 0 13 0; +#X connect 17 0 21 0; +#X connect 18 0 20 0; +#X connect 19 0 20 1; +#X connect 20 0 23 1; +#X connect 21 0 22 0; +#X connect 22 0 19 0; +#X connect 23 0 5 0; +#X connect 23 0 0 0; +#X connect 30 0 29 1; +#X connect 31 0 29 2; +#X connect 34 0 29 0; +#X connect 34 0 42 0; +#X connect 42 0 28 0; diff --git a/doc/3.audio.examples/F11.anharmonic.FM.pd b/doc/3.audio.examples/F11.anharmonic.FM.pd index 814fc7b3..637ab257 100644 --- a/doc/3.audio.examples/F11.anharmonic.FM.pd +++ b/doc/3.audio.examples/F11.anharmonic.FM.pd @@ -1,44 +1,43 @@ -#N canvas 434 57 698 565 12; +#N canvas 434 57 705 620 12; #X declare -stdpath ./; -#X obj 186 394 cos~; -#X floatatom 176 182 4 0 200 0 - - - 0; -#X obj 176 205 / 10; -#X floatatom 120 224 4 0 0 0 - - - 0; -#X text 72 186 fundamental; -#X text 65 201 (= mod freq); -#X text 252 192 index; -#X text 252 212 (percent); -#X floatatom 252 233 4 0 500 0 - - - 0; -#X obj 252 302 line~; -#X obj 204 336 *~; -#X obj 252 256 / 100; -#X obj 252 279 pack 0 50; -#X obj 186 371 +~; -#X text 240 328 modulating; -#X text 240 343 oscillator; -#X obj 186 482 output~; -#X obj 259 388 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 279 415 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 175 416 cos~; +#X floatatom 165 204 4 0 200 0 - - - 0; +#X obj 165 227 / 10; +#X floatatom 109 246 4 0 0 0 - - - 0; +#X text 61 208 fundamental; +#X text 54 223 (= mod freq); +#X text 241 214 index; +#X text 241 234 (percent); +#X floatatom 241 255 4 0 500 0 - - - 0; +#X obj 241 324 line~; +#X obj 193 358 *~; +#X obj 241 278 / 100; +#X obj 241 301 pack 0 50; +#X obj 175 393 +~; +#X text 229 350 modulating; +#X text 229 365 oscillator; +#X obj 175 504 output~; +#X obj 248 410 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 268 437 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #N canvas 0 0 450 300 (subpatch) 0; #X array F11-spectrum 259 float 0; #X coords 0 0.51 258 -0.008 256 130 1; -#X restore 384 181 graph; -#X text 376 312 0; -#X text 438 322 -- frequency --; -#X text 613 317 2700; -#X obj 176 254 *; -#X obj 176 231 t b f; -#X obj 204 307 osc~; -#X obj 141 328 phasor~; -#X text 53 61 Here's what happens if you just slide the carrier frequency around. The spectrum moves up and down all right \, but is only periodic at the original period when the center frequency roosts on a harmonic., f 67; -#X text 83 321 carrier; -#X text 62 336 oscillator; -#X text 60 24 HOW NOT TO APPLY TWO-COSINE CARRIER TO FM; -#X text 170 130 center freq. (in tenths of fundamental), f 13; -#X obj 522 22 declare -stdpath ./; -#X text 281 388 <-- graph once; -#X text 300 414 <-- repeatedly; -#X obj 186 444 hip~ 5; +#X restore 373 203 graph; +#X text 365 334 0; +#X text 427 344 -- frequency --; +#X text 602 339 2700; +#X obj 165 276 *; +#X obj 165 253 t b f; +#X obj 193 329 osc~; +#X obj 130 350 phasor~; +#X text 122 74 Here's what happens if you just slide the carrier frequency around. The spectrum moves up and down all right \, but is only periodic at the original period when the center frequency roosts on a harmonic., f 67; +#X text 72 343 carrier; +#X text 51 358 oscillator; +#X text 159 152 center freq. (in tenths of fundamental), f 13; +#X obj 346 502 declare -stdpath ./; +#X text 270 410 <-- graph once; +#X text 289 436 <-- repeatedly; +#X obj 175 466 hip~ 5; #N canvas 605 126 529 576 fft 0; #X obj 83 140 inlet~; #X obj 197 410 inlet; @@ -93,9 +92,10 @@ #X connect 27 0 29 0; #X connect 28 0 23 1; #X connect 29 0 21 1; -#X restore 240 441 pd fft; +#X restore 229 463 pd fft; +#X obj 80 31 cnv 5 5 25 empty empty How\ Not\ to\ Apply\ Two-Cosine\ Carrier\ to\ FM 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 34 0; #X connect 0 0 35 0; -#X connect 0 0 36 0; #X connect 1 0 2 0; #X connect 2 0 24 0; #X connect 3 0 23 0; @@ -106,11 +106,11 @@ #X connect 11 0 12 0; #X connect 12 0 9 0; #X connect 13 0 0 0; -#X connect 17 0 36 1; -#X connect 18 0 36 2; +#X connect 17 0 35 1; +#X connect 18 0 35 2; #X connect 23 0 26 0; #X connect 24 0 23 0; #X connect 24 1 23 1; #X connect 25 0 10 0; #X connect 26 0 13 0; -#X connect 35 0 16 0; +#X connect 34 0 16 0; diff --git a/doc/3.audio.examples/F12.paf.pd b/doc/3.audio.examples/F12.paf.pd index 94283ea4..92e0d6fc 100644 --- a/doc/3.audio.examples/F12.paf.pd +++ b/doc/3.audio.examples/F12.paf.pd @@ -1,33 +1,33 @@ -#N canvas 493 38 679 793 12; +#N canvas 493 38 679 805 12; #X declare -stdpath ./; -#X obj 45 484 cos~; -#X obj 45 431 *~; -#X obj 88 494 cos~; -#X obj 141 433 wrap~; -#X obj 105 436 -~; -#X obj 88 471 +~; -#X obj 88 532 -~; -#X obj 123 568 *~; -#X obj 105 598 +~; -#X obj 105 406 samphold~; -#X floatatom 143 270 4 0 500 0 - - - 0; -#X obj 143 293 / 10; -#X obj 143 340 line~; -#X obj 143 317 pack 0 50; -#X obj 45 337 phasor~; -#X floatatom 45 314 4 0 0 0 - - - 0; -#X text 28 292 fundamental; -#X text 264 369 index; -#X text 264 386 (percent); -#X floatatom 267 409 4 0 500 0 - - - 0; -#X obj 267 455 line~; -#X obj 201 455 *~; -#X obj 267 432 pack 0 50; +#X obj 50 487 cos~; +#X obj 50 434 *~; +#X obj 93 497 cos~; +#X obj 146 436 wrap~; +#X obj 110 439 -~; +#X obj 93 474 +~; +#X obj 93 535 -~; +#X obj 128 571 *~; +#X obj 110 601 +~; +#X obj 110 409 samphold~; +#X floatatom 148 273 4 0 500 0 - - - 0; +#X obj 148 296 / 10; +#X obj 148 343 line~; +#X obj 148 320 pack 0 50; +#X obj 50 340 phasor~; +#X floatatom 50 317 4 0 0 0 - - - 0; +#X text 33 295 fundamental; +#X text 269 372 index; +#X text 269 389 (percent); +#X floatatom 272 412 4 0 500 0 - - - 0; +#X obj 272 458 line~; +#X obj 206 458 *~; +#X obj 272 435 pack 0 50; #N canvas 0 0 450 300 (subpatch) 0; #X array bell-curve 200 float 1; #A 0 1.12535e-07 1.54727e-07 2.12059e-07 2.89706e-07 3.94519e-07 5.35535e-07 7.24633e-07 9.77371e-07 1.31404e-06 1.76105e-06 2.35258e-06 3.13275e-06 4.15832e-06 5.50199e-06 7.25659e-06 9.54016e-06 1.25023e-05 1.63317e-05 2.1266e-05 2.76026e-05 3.57128e-05 4.60584e-05 5.92113e-05 7.58768e-05 9.69224e-05 0.00012341 0.000156634 0.000198167 0.000249912 0.000314163 0.000393669 0.000491721 0.000612231 0.000759842 0.000940028 0.00115923 0.00142498 0.00174605 0.00213263 0.00259648 0.00315111 0.00381201 0.00459678 0.0055254 0.0066204 0.00790705 0.0094136 0.0111714 0.013215 0.0155826 0.0183156 0.0214592 0.0250621 0.0291763 0.0338573 0.0391639 0.0451575 0.0519019 0.0594631 0.0679081 0.0773047 0.0877205 0.0992216 0.111872 0.125732 0.140858 0.1573 0.1751 0.194291 0.214896 0.236928 0.260383 0.285247 0.311486 0.339053 0.367879 0.397882 0.428956 0.46098 0.493812 0.527292 0.561244 0.595473 0.62977 0.663916 0.697676 0.730811 0.763074 0.794216 0.823987 0.852144 0.878447 0.902668 0.924595 0.944027 0.960789 0.974725 0.985703 0.99362 0.998401 1 0.998401 0.99362 0.985703 0.974725 0.960789 0.944027 0.924595 0.902668 0.878447 0.852144 0.823987 0.794216 0.763074 0.730811 0.697676 0.663916 0.62977 0.595473 0.561244 0.527292 0.493812 0.46098 0.428956 0.397882 0.367879 0.339053 0.311486 0.285247 0.260383 0.236928 0.214896 0.194291 0.1751 0.1573 0.140858 0.125732 0.111872 0.0992216 0.0877205 0.0773047 0.0679081 0.0594631 0.0519019 0.0451575 0.0391639 0.0338573 0.0291763 0.0250621 0.0214592 0.0183156 0.0155826 0.013215 0.0111714 0.0094136 0.00790705 0.0066204 0.0055254 0.00459678 0.00381201 0.00315111 0.00259648 0.00213263 0.00174605 0.00142498 0.00115923 0.000940028 0.000759842 0.000612231 0.000491721 0.000393669 0.000314163 0.000249912 0.000198167 0.000156634 0.00012341 9.69224e-05 7.58768e-05 5.92113e-05 4.60584e-05 3.57128e-05 2.76026e-05 2.1266e-05 1.63317e-05 1.25023e-05 9.54016e-06 7.25659e-06 5.50199e-06 4.15832e-06 3.13275e-06 2.35258e-06 1.76105e-06 1.31404e-06 9.77371e-07 7.24633e-07 5.35535e-07 3.94519e-07 2.89706e-07 2.12059e-07 1.54727e-07; #X coords 0 1 199 0 200 140 1; -#X restore 423 545 graph; +#X restore 428 548 graph; #N canvas 94 264 319 348 make-table 0; #X msg 75 31 bang; #X obj 75 60 t b b; @@ -54,35 +54,34 @@ #X connect 8 0 7 0; #X connect 9 0 5 1; #X connect 10 0 8 0; -#X restore 251 730 pd make-table; -#X obj 201 432 cos~; -#X obj 201 409 -~ 0.25; -#X obj 201 478 +~ 100; -#X obj 201 501 tabread4~ bell-curve; -#X obj 105 637 *~; -#X text 233 526 waveshaper; -#X text 421 688 0; -#X text 612 687 200; +#X restore 256 733 pd make-table; +#X obj 206 435 cos~; +#X obj 206 412 -~ 0.25; +#X obj 206 481 +~ 100; +#X obj 206 504 tabread4~ bell-curve; +#X obj 110 640 *~; +#X text 238 529 waveshaper; +#X text 426 691 0; +#X text 617 690 200; #N canvas 0 0 450 300 (subpatch) 0; #X array F12-spectrum 259 float 0; #X coords 0 0.51 258 -0.008 256 130 1; -#X restore 393 350 graph; -#X text 390 482 0; -#X text 455 486 -- frequency --; -#X text 616 483 2700; -#X obj 105 718 output~; -#X obj 182 621 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 202 646 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 28 42 Instead of using the two cosines as FM carrier oscillators \, we can use them as ring modulators for a natural or synthetic tone. Here we use waveshaping - to wit \, a sinusoid looking up a Gaussian bell curve. This has the nice properties that the partials are always positive cosines in phase \, and the spectrum spreads out smoothly as the index changes., f 87; -#X text 63 12 PAF: TWO-COSINE RING MODULATOR FOR WAVESHAPER; -#X obj 201 383 *~ 0.5; -#X text 181 271 center frequency (tenths of fundamental), f 23; -#X obj 506 275 declare -stdpath ./; -#X obj 105 681 hip~ 5; -#X text 28 120 For phase coherency \, the waveshaper and the cosine pair are driven from the same [phasor~] object. Since the waveshaping is done using a symmetric curve \, its output is at double the frequency of the input. So for each cycle of the phasor we compute a half-cycle of the sine function (by multiplying by 0.5 and subtracting 0.25 before the cosine lookup). We center the cosine output for lookup in a 200-point table containing a bell curve., f 87; -#X text 43 622 ring mod step -->, f 8; -#X text 203 620 <-- graph once; -#X text 223 647 <-- repeatedly; +#X restore 398 353 graph; +#X text 395 485 0; +#X text 460 489 -- frequency --; +#X text 621 486 2700; +#X obj 110 721 output~; +#X obj 187 624 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 207 649 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X text 33 45 Instead of using the two cosines as FM carrier oscillators \, we can use them as ring modulators for a natural or synthetic tone. Here we use waveshaping - to wit \, a sinusoid looking up a Gaussian bell curve. This has the nice properties that the partials are always positive cosines in phase \, and the spectrum spreads out smoothly as the index changes., f 87; +#X obj 206 386 *~ 0.5; +#X text 186 274 center frequency (tenths of fundamental), f 23; +#X obj 511 278 declare -stdpath ./; +#X obj 110 684 hip~ 5; +#X text 33 123 For phase coherency \, the waveshaper and the cosine pair are driven from the same [phasor~] object. Since the waveshaping is done using a symmetric curve \, its output is at double the frequency of the input. So for each cycle of the phasor we compute a half-cycle of the sine function (by multiplying by 0.5 and subtracting 0.25 before the cosine lookup). We center the cosine output for lookup in a 200-point table containing a bell curve., f 87; +#X text 48 625 ring mod step -->, f 8; +#X text 208 623 <-- graph once; +#X text 228 650 <-- repeatedly; #N canvas 605 126 529 576 fft 0; #X obj 83 140 inlet~; #X obj 197 410 inlet; @@ -137,8 +136,9 @@ #X connect 27 0 29 0; #X connect 28 0 23 1; #X connect 29 0 21 1; -#X restore 163 672 pd fft; -#X text 28 214 Then with [*~] we do the ring modulation and we're done. This is the PAF (phase-aligned formant) synthesis algorithm (patented 1993 by IRCAM \, the patent ran out in 2011)., f 87; +#X restore 168 675 pd fft; +#X text 33 217 Then with [*~] we do the ring modulation and we're done. This is the PAF (phase-aligned formant) synthesis algorithm (patented 1993 by IRCAM \, the patent ran out in 2011)., f 87; +#X obj 77 8 cnv 5 5 25 empty empty PAF:\ Two-Cosine\ Ring\ Modulator\ for\ Waveshaper 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 6 1; #X connect 0 0 8 0; #X connect 1 0 5 0; @@ -160,7 +160,7 @@ #X connect 14 0 9 1; #X connect 14 0 5 1; #X connect 14 0 1 0; -#X connect 14 0 42 0; +#X connect 14 0 41 0; #X connect 15 0 14 0; #X connect 19 0 22 0; #X connect 20 0 21 1; @@ -170,9 +170,9 @@ #X connect 26 0 25 0; #X connect 27 0 28 0; #X connect 28 0 29 1; -#X connect 29 0 45 0; -#X connect 29 0 50 0; -#X connect 38 0 50 1; -#X connect 39 0 50 2; -#X connect 42 0 26 0; -#X connect 45 0 37 0; +#X connect 29 0 44 0; +#X connect 29 0 49 0; +#X connect 38 0 49 1; +#X connect 39 0 49 2; +#X connect 41 0 26 0; +#X connect 44 0 37 0; diff --git a/doc/3.audio.examples/F13.paf.control.pd b/doc/3.audio.examples/F13.paf.control.pd index 59f745bc..1c01c897 100644 --- a/doc/3.audio.examples/F13.paf.control.pd +++ b/doc/3.audio.examples/F13.paf.control.pd @@ -1,24 +1,24 @@ -#N canvas 484 38 626 746 12; +#N canvas 484 38 626 757 12; #X declare -stdpath ./; -#X obj 116 507 cos~; -#X obj 116 448 *~; -#X obj 156 507 cos~; -#X obj 229 458 wrap~; -#X obj 193 458 -~; -#X obj 156 484 +~; -#X obj 156 549 -~; -#X obj 186 580 *~; -#X obj 150 585 +~; -#X obj 193 426 samphold~; -#X floatatom 193 223 4 0 127 0 - - - 0; -#X obj 193 293 line~; -#X obj 193 270 pack 0 50; -#X obj 116 369 phasor~; -#X floatatom 116 265 4 0 127 0 - - - 0; -#X floatatom 354 287 4 0 127 0 - - - 0; -#X obj 354 358 line~; -#X obj 336 494 *~; -#X obj 354 335 pack 0 50; +#X obj 116 522 cos~; +#X obj 116 463 *~; +#X obj 156 522 cos~; +#X obj 229 473 wrap~; +#X obj 193 473 -~; +#X obj 156 499 +~; +#X obj 156 564 -~; +#X obj 186 595 *~; +#X obj 150 600 +~; +#X obj 193 441 samphold~; +#X floatatom 193 234 4 0 127 0 - - - 0; +#X obj 193 308 line~; +#X obj 193 284 pack 0 50; +#X obj 116 384 phasor~; +#X floatatom 116 280 4 0 127 0 - - - 0; +#X floatatom 354 302 4 0 127 0 - - - 0; +#X obj 354 373 line~; +#X obj 336 509 *~; +#X obj 354 350 pack 0 50; #N canvas 270 258 499 360 make-table 0; #X obj 74 62 t b b; #X obj 152 131 f; @@ -50,35 +50,35 @@ #X connect 8 0 4 1; #X connect 9 0 7 0; #X connect 11 0 0 0; -#X restore 446 614 pd make-table; -#X obj 291 463 cos~; -#X obj 291 438 -~ 0.25; -#X obj 336 520 +~ 100; -#X obj 336 543 tabread4~ bell-curve; -#X obj 181 618 *~; -#X text 345 570 waveshaper; -#X text 27 15 CHANGING PAF CONTROLS TO NATURAL UNITS; -#X obj 116 289 mtof; -#X obj 211 321 expr 1/$f1; -#X obj 193 246 mtof; -#X obj 193 345 *~; -#X text 352 262 bandwidth; -#X obj 354 309 mtof; -#X obj 354 394 *~; -#X obj 354 418 *~ 25; -#X text 394 393 divide by fundamental; -#X text 412 417 range for table; -#X text 391 518 offset to middle of table; -#X text 199 365 C.F. relative; -#X text 200 381 to fundamental; -#X text 217 616 ring mod; -#X obj 181 655 output~; -#X obj 291 413 *~ 0.5; -#X obj 457 239 declare -stdpath ./; -#X text 23 41 The more "natural" units for describing a formant might be center frequency and bandwidth \, so that you can change the fundamental without having the formant shift up and down in parallel. Here all three frequencies are expressed in MIDI units. The bandwidth and center frequency have to be divided by the fundamental (the expr 1/$f1 takes its reciprocal and two [*~] objects finish the division.), f 81; -#X text 23 119 Here we take a somewhat lax approach to sampholding the center frequency control. The frequency itself changes instantly \, but the center/fundamental frequency ratio waits for the next period. This gives a slight "chirp" if the fundamental is abruptly raised a couple of octaves. There's no easy way using Pd's built-in primitives to avoid this. Note however that there's a [paf~] extern available which solves this problem better and \, moreover \, runs much faster., f 81; -#X text 227 223 center freq.; -#X text 78 227 fundamental (MIDI units), f 12; +#X restore 446 629 pd make-table; +#X obj 291 478 cos~; +#X obj 291 453 -~ 0.25; +#X obj 336 535 +~ 100; +#X obj 336 558 tabread4~ bell-curve; +#X obj 181 633 *~; +#X text 345 585 waveshaper; +#X obj 116 304 mtof; +#X obj 211 336 expr 1/$f1; +#X obj 193 260 mtof; +#X obj 193 360 *~; +#X text 352 277 bandwidth; +#X obj 354 324 mtof; +#X obj 354 409 *~; +#X obj 354 433 *~ 25; +#X text 394 408 divide by fundamental; +#X text 412 432 range for table; +#X text 391 533 offset to middle of table; +#X text 199 380 C.F. relative; +#X text 200 396 to fundamental; +#X text 217 631 ring mod; +#X obj 181 670 output~; +#X obj 291 428 *~ 0.5; +#X obj 457 254 declare -stdpath ./; +#X text 23 46 The more "natural" units for describing a formant might be center frequency and bandwidth \, so that you can change the fundamental without having the formant shift up and down in parallel. Here all three frequencies are expressed in MIDI units. The bandwidth and center frequency have to be divided by the fundamental (the expr 1/$f1 takes its reciprocal and two [*~] objects finish the division.), f 81; +#X text 23 124 Here we take a somewhat lax approach to sampholding the center frequency control. The frequency itself changes instantly \, but the center/fundamental frequency ratio waits for the next period. This gives a slight "chirp" if the fundamental is abruptly raised a couple of octaves. There's no easy way using Pd's built-in primitives to avoid this. Note however that there's a [paf~] extern available which solves this problem better and \, moreover \, runs much faster., f 81; +#X text 227 234 center freq.; +#X text 78 242 fundamental (MIDI units), f 12; +#X obj 77 11 cnv 5 5 25 empty empty Changing\ PAF\ Controls\ to\ Natural\ Units 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 6 1; #X connect 0 0 8 0; #X connect 1 0 5 0; @@ -93,30 +93,30 @@ #X connect 8 0 24 0; #X connect 9 0 4 0; #X connect 9 0 3 0; -#X connect 10 0 29 0; -#X connect 11 0 30 0; +#X connect 10 0 28 0; +#X connect 11 0 29 0; #X connect 12 0 11 0; #X connect 13 0 9 1; #X connect 13 0 1 0; #X connect 13 0 5 1; -#X connect 13 0 42 0; -#X connect 14 0 27 0; -#X connect 15 0 32 0; -#X connect 16 0 33 0; +#X connect 13 0 41 0; +#X connect 14 0 26 0; +#X connect 15 0 31 0; +#X connect 16 0 32 0; #X connect 17 0 22 0; #X connect 18 0 16 0; #X connect 20 0 17 0; #X connect 21 0 20 0; #X connect 22 0 23 0; #X connect 23 0 24 1; -#X connect 24 0 41 0; -#X connect 27 0 28 0; -#X connect 27 0 13 0; -#X connect 28 0 30 1; -#X connect 28 0 33 1; -#X connect 29 0 12 0; -#X connect 30 0 9 0; -#X connect 32 0 18 0; -#X connect 33 0 34 0; -#X connect 34 0 17 1; -#X connect 42 0 21 0; +#X connect 24 0 40 0; +#X connect 26 0 27 0; +#X connect 26 0 13 0; +#X connect 27 0 29 1; +#X connect 27 0 32 1; +#X connect 28 0 12 0; +#X connect 29 0 9 0; +#X connect 31 0 18 0; +#X connect 32 0 33 0; +#X connect 33 0 17 1; +#X connect 41 0 21 0; diff --git a/doc/3.audio.examples/F14.wave.packet.pd b/doc/3.audio.examples/F14.wave.packet.pd index 38137d78..03b7c9e2 100644 --- a/doc/3.audio.examples/F14.wave.packet.pd +++ b/doc/3.audio.examples/F14.wave.packet.pd @@ -1,102 +1,102 @@ #N canvas 453 38 640 725 12; #X declare -stdpath ./; -#X floatatom 301 210 4 0 127 0 - - - 0; -#X obj 301 286 line~; -#X obj 301 263 pack 0 50; -#X floatatom 164 227 4 0 127 0 - - - 0; -#X text 71 221 fundamental; -#X floatatom 400 226 4 0 127 0 - - - 0; -#X obj 400 300 line~; -#X obj 106 502 *~; -#X obj 400 274 pack 0 50; -#X obj 106 551 cos~; -#X obj 164 287 mtof; -#X obj 319 318 expr 1/$f1; -#X obj 301 237 mtof; -#X obj 301 349 *~; -#X text 396 202 bandwidth; -#X obj 400 248 mtof; -#X obj 400 361 *~; -#X text 433 360 divide by fundamental; -#X text 64 237 (MIDI units); -#X obj 109 639 output~; -#X text 78 14 WAVE PACKETS AS ALTERNATIVE TO PAF; -#X obj 41 325 phasor~; -#X obj 460 428 +~ 0.5; -#X obj 460 453 wrap~; -#X obj 106 574 +~ 1; -#X obj 42 458 -~ 0.5; -#X obj 109 608 +~; -#X obj 42 522 *~; -#X obj 42 545 cos~; -#X obj 179 476 samphold~; -#X obj 100 471 samphold~; -#X obj 42 572 *~; -#X obj 106 526 clip~ -0.5 0.5; -#X obj 307 557 *~; -#X obj 307 606 cos~; -#X obj 307 629 +~ 1; -#X obj 252 501 -~ 0.5; -#X obj 252 557 *~; -#X obj 252 585 cos~; -#X obj 400 527 samphold~; -#X obj 301 526 samphold~; -#X obj 252 614 *~; -#X obj 307 581 clip~ -0.5 0.5; -#X obj 400 385 max~ 1; -#X obj 164 262 - 12; -#X text 512 418 second phase signal out of phase from first one, f 13; -#X obj 459 578 declare -stdpath ./; -#X text 67 47 The stretched wavetable method is an alternative to the PAF generator \, slightly more expensive in processing time but with the advantage it can be generalized to use samples instead of sinusoids to make complex spectral shapes., f 71; -#X text 67 115 The patch is almost exactly like B13 (the overlapping sample) except that \, instead of using [tabread~] we just use [cos~] \, and that we control pulse width (for bandwidth) as well as wavetable transposition (for center frequency)., f 71; -#X text 257 195 center freq., f 6; +#X floatatom 303 225 4 0 127 0 - - - 0; +#X obj 303 301 line~; +#X obj 303 278 pack 0 50; +#X floatatom 166 242 4 0 127 0 - - - 0; +#X text 73 236 fundamental; +#X floatatom 402 241 4 0 127 0 - - - 0; +#X obj 402 315 line~; +#X obj 108 517 *~; +#X obj 402 289 pack 0 50; +#X obj 108 566 cos~; +#X obj 166 302 mtof; +#X obj 321 333 expr 1/$f1; +#X obj 303 252 mtof; +#X obj 303 364 *~; +#X text 398 217 bandwidth; +#X obj 402 263 mtof; +#X obj 402 376 *~; +#X text 435 375 divide by fundamental; +#X text 66 252 (MIDI units); +#X obj 111 654 output~; +#X obj 43 340 phasor~; +#X obj 462 443 +~ 0.5; +#X obj 462 468 wrap~; +#X obj 108 589 +~ 1; +#X obj 44 473 -~ 0.5; +#X obj 111 623 +~; +#X obj 44 537 *~; +#X obj 44 560 cos~; +#X obj 181 491 samphold~; +#X obj 102 486 samphold~; +#X obj 44 587 *~; +#X obj 108 541 clip~ -0.5 0.5; +#X obj 309 572 *~; +#X obj 309 621 cos~; +#X obj 309 644 +~ 1; +#X obj 254 516 -~ 0.5; +#X obj 254 572 *~; +#X obj 254 600 cos~; +#X obj 402 542 samphold~; +#X obj 303 541 samphold~; +#X obj 254 629 *~; +#X obj 309 596 clip~ -0.5 0.5; +#X obj 402 400 max~ 1; +#X obj 166 277 - 12; +#X text 514 433 second phase signal out of phase from first one, f 13; +#X obj 461 593 declare -stdpath ./; +#X text 69 62 The stretched wavetable method is an alternative to the PAF generator \, slightly more expensive in processing time but with the advantage it can be generalized to use samples instead of sinusoids to make complex spectral shapes., f 71; +#X text 69 130 The patch is almost exactly like B13 (the overlapping sample) except that \, instead of using [tabread~] we just use [cos~] \, and that we control pulse width (for bandwidth) as well as wavetable transposition (for center frequency)., f 71; +#X text 259 210 center freq., f 6; +#X obj 98 22 cnv 5 5 25 empty empty Wave\ Packets\ as\ Alternative\ to\ PAF 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 12 0; #X connect 1 0 13 0; #X connect 2 0 1 0; -#X connect 3 0 44 0; +#X connect 3 0 43 0; #X connect 5 0 15 0; #X connect 6 0 16 0; -#X connect 7 0 32 0; +#X connect 7 0 31 0; #X connect 8 0 6 0; -#X connect 9 0 24 0; +#X connect 9 0 23 0; #X connect 10 0 11 0; -#X connect 10 0 21 0; +#X connect 10 0 20 0; #X connect 11 0 13 1; #X connect 11 0 16 1; #X connect 12 0 2 0; -#X connect 13 0 30 0; -#X connect 13 0 40 0; +#X connect 13 0 29 0; +#X connect 13 0 39 0; #X connect 15 0 8 0; -#X connect 16 0 43 0; +#X connect 16 0 42 0; +#X connect 20 0 21 0; +#X connect 20 0 24 0; +#X connect 20 0 29 1; +#X connect 20 0 28 1; #X connect 21 0 22 0; -#X connect 21 0 25 0; -#X connect 21 0 30 1; -#X connect 21 0 29 1; -#X connect 22 0 23 0; -#X connect 23 0 36 0; -#X connect 23 0 40 1; -#X connect 23 0 39 1; -#X connect 24 0 31 1; -#X connect 25 0 7 0; -#X connect 25 0 27 0; -#X connect 26 0 19 0; -#X connect 27 0 28 0; -#X connect 28 0 31 0; -#X connect 29 0 7 1; -#X connect 30 0 27 1; -#X connect 31 0 26 0; -#X connect 32 0 9 0; -#X connect 33 0 42 0; -#X connect 34 0 35 0; -#X connect 35 0 41 1; -#X connect 36 0 33 0; +#X connect 22 0 35 0; +#X connect 22 0 39 1; +#X connect 22 0 38 1; +#X connect 23 0 30 1; +#X connect 24 0 7 0; +#X connect 24 0 26 0; +#X connect 25 0 19 0; +#X connect 26 0 27 0; +#X connect 27 0 30 0; +#X connect 28 0 7 1; +#X connect 29 0 26 1; +#X connect 30 0 25 0; +#X connect 31 0 9 0; +#X connect 32 0 41 0; +#X connect 33 0 34 0; +#X connect 34 0 40 1; +#X connect 35 0 32 0; +#X connect 35 0 36 0; #X connect 36 0 37 0; -#X connect 37 0 38 0; -#X connect 38 0 41 0; -#X connect 39 0 33 1; -#X connect 40 0 37 1; -#X connect 41 0 26 1; -#X connect 42 0 34 0; -#X connect 43 0 29 0; -#X connect 43 0 39 0; -#X connect 44 0 10 0; +#X connect 37 0 40 0; +#X connect 38 0 32 1; +#X connect 39 0 36 1; +#X connect 40 0 25 1; +#X connect 41 0 33 0; +#X connect 42 0 28 0; +#X connect 42 0 38 0; +#X connect 43 0 10 0; diff --git a/doc/3.audio.examples/G01.delay.pd b/doc/3.audio.examples/G01.delay.pd index 1775e9ce..c92ded36 100644 --- a/doc/3.audio.examples/G01.delay.pd +++ b/doc/3.audio.examples/G01.delay.pd @@ -1,6 +1,5 @@ #N canvas 538 93 688 503 12; #X declare -stdpath ./; -#X text 97 22 DELAYS; #N canvas 293 125 428 350 sample 0; #N canvas 0 0 450 300 (subpatch) 0; #X array G01-tab 62079 float 2; @@ -22,7 +21,7 @@ #X obj 45 387 +~; #X obj 59 242 delwrite~ delay1 1000; #X text 61 198 test signal to delay; -#X obj 440 62 declare -stdpath ./; +#X obj 454 72 declare -stdpath ./; #X text 269 126 You can delay a signal using the [delwrite~] and [delread~] objects. In this example \, a sample loops continuously and is added to a delayed copy of itself., f 55; #X text 269 181 The [delwrite~] object creates the delay line. You give it a name and a size in milliseconds. Each [delwrite~] should have a different name., f 55; #X text 269 232 The arguments of [delread~] are the name of a delwrite (of which there should be exactly one) and an optional delay time in milliseconds between 0 and the length of the delay line. The [delread~] object delays the signal at integer number of samples and does no interpolation., f 55; @@ -32,11 +31,12 @@ #X obj 44 134 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X text 69 73 <-- play repeatedly; #X text 71 135 <-- play; -#X connect 2 0 4 0; -#X connect 4 0 9 1; -#X connect 5 0 9 0; -#X connect 5 0 10 0; -#X connect 6 0 19 0; -#X connect 9 0 8 0; -#X connect 18 0 6 0; -#X connect 19 0 5 0; +#X obj 282 67 cnv 5 5 25 empty empty Delays 15 13 0 16 #dfdfdf #202020 0; +#X connect 1 0 3 0; +#X connect 3 0 8 1; +#X connect 4 0 8 0; +#X connect 4 0 9 0; +#X connect 5 0 18 0; +#X connect 8 0 7 0; +#X connect 17 0 5 0; +#X connect 18 0 4 0; diff --git a/doc/3.audio.examples/G02.delay.loop.pd b/doc/3.audio.examples/G02.delay.loop.pd index bd7c82c8..e316823c 100644 --- a/doc/3.audio.examples/G02.delay.loop.pd +++ b/doc/3.audio.examples/G02.delay.loop.pd @@ -10,12 +10,11 @@ #X obj 134 319 *~; #X obj 134 442 +~; #X obj 152 413 *~ 0.7; -#X text 55 24 DELAYS WITH FEEDBACK; #X obj 208 319 *~; #X obj 134 521 output~; #X obj 134 290 phasor~; #X obj 162 482 delwrite~ G02-del 2000; -#X obj 351 25 declare -stdpath ./; +#X obj 355 30 declare -stdpath ./; #X text 33 69 You can feed the result of a [delread~] module back into its own [delwrite~] \, as long as you're careful about stability. For delays below 30 msec \, you can frequently hear the resonant pitch. For longer delay times you get the famous old delay loop effect., f 66; #X text 209 356 <-- set delay time; #X text 207 415 feedback gain (less than 1 for stability); @@ -25,18 +24,19 @@ #X text 33 138 We've added an amplitude control here so that the test oscillator only speaks while you're dragging the pitch up and down or when hitting 'bang'. Be sure to try shift-dragging on the pitch control., f 66; #X text 189 229 <-- set pitch; #X text 356 284 ADSR only uses attack and decay stages, f 22; +#X obj 54 24 cnv 5 5 25 empty empty Delays\ With\ Feedback 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 5 0; #X connect 0 0 6 0; -#X connect 1 0 20 0; -#X connect 5 0 13 0; -#X connect 6 0 19 0; +#X connect 1 0 19 0; +#X connect 5 0 12 0; +#X connect 6 0 18 0; #X connect 7 0 8 0; -#X connect 8 0 12 0; -#X connect 8 0 14 0; +#X connect 8 0 11 0; +#X connect 8 0 13 0; #X connect 9 0 8 1; -#X connect 11 0 7 1; -#X connect 13 0 7 0; -#X connect 19 0 11 0; -#X connect 19 0 11 1; -#X connect 20 0 9 0; -#X connect 21 0 0 0; +#X connect 10 0 7 1; +#X connect 12 0 7 0; +#X connect 18 0 10 0; +#X connect 18 0 10 1; +#X connect 19 0 9 0; +#X connect 20 0 0 0; diff --git a/doc/3.audio.examples/G03.delay.variable.pd b/doc/3.audio.examples/G03.delay.variable.pd index 9d401cdb..7e449911 100644 --- a/doc/3.audio.examples/G03.delay.variable.pd +++ b/doc/3.audio.examples/G03.delay.variable.pd @@ -1,73 +1,73 @@ -#N canvas 561 38 600 666 12; +#N canvas 561 38 603 649 12; #X declare -stdpath ./; -#X obj 99 319 hip~ 10; -#X floatatom 325 288 5 0 0 0 - - - 0; -#X obj 325 338 line~; -#X floatatom 254 236 5 0 0 0 - - - 0; -#X floatatom 254 435 5 0 0 0 - - - 0; -#X obj 254 508 line~; -#X obj 254 460 * 0.01; -#X floatatom 155 189 5 0 0 0 - - - 0; -#X obj 155 266 line~; -#X obj 99 265 *~; -#X obj 99 292 cos~; -#X floatatom 99 153 6 0 0 0 - - - 0; -#X obj 99 180 mtof; -#X obj 99 208 * 0.5; -#X obj 99 347 clip~ -0.2 0.2; -#X obj 155 217 * 0.01; -#X obj 99 384 +~; -#X obj 236 536 *~; -#X obj 254 339 *~; -#X obj 99 418 hip~ 5; -#X obj 254 310 +~ 1; -#X obj 254 366 +~ 1.46; -#X text 53 23 VARIABLE DELAYS; -#X obj 99 536 output~; -#X obj 236 584 delwrite~ G03-del 1000; -#X obj 236 560 clip~ -1 1; -#X obj 405 21 declare -stdpath ./; -#X obj 325 314 pack f 100; -#X obj 155 241 pack f 100; -#X obj 99 237 osc~; -#X obj 254 397 delread4~ G03-del; -#X text 30 58 This is a fuzzed FM generator going into a delay loop \, this time using a variable delay object ([delread4~]) that also performs interpolation for non integer indexes. You can get several interesting effects this way. We have taken the precaution of clipping inside the loop to avoid instabilities. You can push the loop gain past 1 if you want \, it will just oscillate., f 76; -#X obj 254 484 pack f 100; -#X text 148 152 <-- pitch; -#X text 196 190 <-- timbre; -#X text 296 235 <-- cycle frequency (hundredths); -#X text 366 288 <-- cycle depth (msec); -#X text 299 435 <-- feedback (hundredths); -#X obj 254 286 osc~; -#X obj 254 262 * 0.01; +#X obj 100 331 hip~ 10; +#X floatatom 326 300 5 0 0 0 - - - 0; +#X obj 326 350 line~; +#X floatatom 255 248 5 0 0 0 - - - 0; +#X floatatom 255 447 5 0 0 0 - - - 0; +#X obj 255 520 line~; +#X obj 255 472 * 0.01; +#X floatatom 156 201 5 0 0 0 - - - 0; +#X obj 156 278 line~; +#X obj 100 277 *~; +#X obj 100 304 cos~; +#X floatatom 100 165 6 0 0 0 - - - 0; +#X obj 100 192 mtof; +#X obj 100 220 * 0.5; +#X obj 100 359 clip~ -0.2 0.2; +#X obj 156 229 * 0.01; +#X obj 100 396 +~; +#X obj 237 548 *~; +#X obj 255 351 *~; +#X obj 100 430 hip~ 5; +#X obj 255 322 +~ 1; +#X obj 255 378 +~ 1.46; +#X obj 100 548 output~; +#X obj 237 596 delwrite~ G03-del 1000; +#X obj 237 572 clip~ -1 1; +#X obj 406 21 declare -stdpath ./; +#X obj 326 326 pack f 100; +#X obj 156 253 pack f 100; +#X obj 100 249 osc~; +#X obj 255 409 delread4~ G03-del; +#X text 31 67 This is a fuzzed FM generator going into a delay loop \, this time using a variable delay object ([delread4~]) that also performs interpolation for non integer indexes. You can get several interesting effects this way. We have taken the precaution of clipping inside the loop to avoid instabilities. You can push the loop gain past 1 if you want \, it will just oscillate., f 76; +#X obj 255 496 pack f 100; +#X text 149 164 <-- pitch; +#X text 197 202 <-- timbre; +#X text 297 247 <-- cycle frequency (hundredths); +#X text 367 300 <-- cycle depth (msec); +#X text 300 447 <-- feedback (hundredths); +#X obj 255 298 osc~; +#X obj 255 274 * 0.01; +#X obj 76 20 cnv 5 5 25 empty empty Variable\ Time\ Delays 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 14 0; -#X connect 1 0 27 0; +#X connect 1 0 26 0; #X connect 2 0 18 1; -#X connect 3 0 39 0; +#X connect 3 0 38 0; #X connect 4 0 6 0; #X connect 5 0 17 1; -#X connect 6 0 32 0; +#X connect 6 0 31 0; #X connect 7 0 15 0; #X connect 8 0 9 1; #X connect 9 0 10 0; #X connect 10 0 0 0; #X connect 11 0 12 0; #X connect 12 0 13 0; -#X connect 13 0 29 0; +#X connect 13 0 28 0; #X connect 14 0 16 0; -#X connect 15 0 28 0; +#X connect 15 0 27 0; #X connect 16 0 19 0; -#X connect 17 0 25 0; +#X connect 17 0 24 0; #X connect 18 0 21 0; #X connect 19 0 17 0; -#X connect 19 0 23 0; +#X connect 19 0 22 0; #X connect 20 0 18 0; -#X connect 21 0 30 0; -#X connect 25 0 24 0; -#X connect 27 0 2 0; -#X connect 28 0 8 0; -#X connect 29 0 9 0; -#X connect 30 0 16 1; -#X connect 32 0 5 0; -#X connect 38 0 20 0; -#X connect 39 0 38 0; +#X connect 21 0 29 0; +#X connect 24 0 23 0; +#X connect 26 0 2 0; +#X connect 27 0 8 0; +#X connect 28 0 9 0; +#X connect 29 0 16 1; +#X connect 31 0 5 0; +#X connect 37 0 20 0; +#X connect 38 0 37 0; diff --git a/doc/3.audio.examples/G04.control.blocksize.pd b/doc/3.audio.examples/G04.control.blocksize.pd index 32c5777e..2c63750d 100644 --- a/doc/3.audio.examples/G04.control.blocksize.pd +++ b/doc/3.audio.examples/G04.control.blocksize.pd @@ -1,4 +1,4 @@ -#N canvas 565 58 549 578 12; +#N canvas 565 58 558 628 12; #X declare -stdpath ./; #N canvas 634 149 562 441 delay-writer 0; #X obj 91 244 inlet~; @@ -22,38 +22,38 @@ #X connect 4 0 7 0; #X connect 5 0 6 0; #X connect 6 0 3 0; -#X restore 128 460 pd delay-writer; -#X obj 230 422 expr 1000/$f1; -#X obj 230 396 mtof; -#X obj 230 279 metro 500; -#X obj 230 342 random 60; -#X obj 230 225 loadbang; -#X obj 230 368 + 30; -#X text 74 9 CONTROLLING DELAY WITH BLOCK~; -#X text 51 43 In situations where a delay read feeds back to a delay write \, the minimum possible delay you can achieve is one block \, which by default is 64 samples \, or 1.45 msec at 44100 Hz. You can shorten the minimum delay by changing the block size. Do this in a subpatch (open it to see how)., f 62; -#X obj 128 504 output~; -#X obj 128 422 vline~; -#X text 51 124 Here we use this principle to make a harpsichord-like sound by sending pulses into a recirculating delay line (which imitates the travel of the wave up and down the harpsichord string.) This is related to Karplus-Strong synthesis \, but the idea is probably much older than their paper., f 62; -#X text 34 426 long., f 12; -#X text 333 411 length of delay line is; -#X text 334 429 1000/(frequency); -#X text 34 411 pulse 1 msec; -#X text 34 396 rectangular, f 12; -#X text 34 382 this makes a; -#X msg 128 380 1 \, 0 0 1; -#X obj 378 222 declare -stdpath ./; -#X obj 230 252 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; -#X text 247 460 <-- here is the delay feedback loop; -#X obj 230 309 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X connect 0 0 9 0; +#X restore 148 495 pd delay-writer; +#X obj 250 457 expr 1000/$f1; +#X obj 250 431 mtof; +#X obj 250 314 metro 500; +#X obj 250 377 random 60; +#X obj 250 260 loadbang; +#X obj 250 403 + 30; +#X text 58 78 In situations where a delay read feeds back to a delay write \, the minimum possible delay you can achieve is one block \, which by default is 64 samples \, or 1.45 msec at 44100 Hz. You can shorten the minimum delay by changing the block size. Do this in a subpatch (open it to see how)., f 62; +#X obj 148 539 output~; +#X obj 148 457 vline~; +#X text 58 159 Here we use this principle to make a harpsichord-like sound by sending pulses into a recirculating delay line (which imitates the travel of the wave up and down the harpsichord string.) This is related to Karplus-Strong synthesis \, but the idea is probably much older than their paper., f 62; +#X text 54 461 long., f 12; +#X text 353 446 length of delay line is; +#X text 354 464 1000/(frequency); +#X text 54 446 pulse 1 msec; +#X text 54 431 rectangular, f 12; +#X text 54 417 this makes a; +#X msg 148 415 1 \, 0 0 1; +#X obj 323 558 declare -stdpath ./; +#X obj 250 287 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 267 495 <-- here is the delay feedback loop; +#X obj 250 344 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 93 28 cnv 5 5 25 empty empty Controlling\ Delays\ with\ [block~] 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 8 0; #X connect 1 0 0 1; #X connect 2 0 1 0; -#X connect 3 0 22 0; +#X connect 3 0 21 0; #X connect 4 0 6 0; -#X connect 5 0 20 0; +#X connect 5 0 19 0; #X connect 6 0 2 0; -#X connect 10 0 0 0; -#X connect 18 0 10 0; -#X connect 20 0 3 0; -#X connect 22 0 18 0; -#X connect 22 0 4 0; +#X connect 9 0 0 0; +#X connect 17 0 9 0; +#X connect 19 0 3 0; +#X connect 21 0 17 0; +#X connect 21 0 4 0; diff --git a/doc/3.audio.examples/G05.execution.order.pd b/doc/3.audio.examples/G05.execution.order.pd index f82f483d..6ddd6aed 100644 --- a/doc/3.audio.examples/G05.execution.order.pd +++ b/doc/3.audio.examples/G05.execution.order.pd @@ -1,7 +1,7 @@ -#N canvas 469 38 503 684 12; +#N canvas 469 38 688 638 12; #X declare -stdpath ./; -#X floatatom 325 330 4 0 100 0 - - - 0; -#X obj 307 475 +~; +#X floatatom 373 316 4 0 100 0 - - - 0; +#X obj 355 461 +~; #N canvas 402 205 350 365 delay-writer 0; #X obj 71 108 inlet~; #X obj 71 231 outlet~; @@ -12,7 +12,7 @@ #X text 126 146 writting to the delay.; #X connect 0 0 1 0; #X connect 0 0 2 0; -#X restore 113 464 pd delay-writer; +#X restore 161 450 pd delay-writer; #N canvas 319 197 561 348 delay-reader 0; #X obj 97 77 inlet~; #X obj 163 195 outlet~; @@ -24,10 +24,10 @@ #X text 79 247 The dummy inlet is just needed to connect to the previous subpatch to force the correct order., f 33; #X connect 2 0 3 0; #X connect 3 0 1 0; -#X restore 113 495 pd delay-reader; -#X obj 95 525 +~; -#X obj 325 357 / 44.1; -#X obj 95 559 output~; +#X restore 161 481 pd delay-reader; +#X obj 143 511 +~; +#X obj 373 343 / 44.1; +#X obj 143 545 output~; #N canvas 521 164 217 214 pulse 0; #X obj 51 148 outlet~; #X obj 51 44 phasor~ 50; @@ -38,32 +38,32 @@ #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 4 0 0 0; -#X restore 113 334 pd pulse; -#X obj 127 419 delwrite~ G05-d1 1000, f 11; -#X obj 325 409 line~; -#X obj 328 280 declare -stdpath ./; -#X text 52 7 ORDER OF EXECUTION OF DELWRITE~ AND DELREAD~/DELREAD4~; -#X obj 325 446 delread4~ G05-d1; -#X text 18 229 You can use the same strategy to avoid an unwanted delay of one block in pairs of [send~]/[receive~] \, [tabsend~]/[tabreceive~] or [throw~]/[catch~] objects., f 65; -#X text 18 99 To get them to go off in the correct order \, put the [delwrite~] into a subpatch \, then the [delread4~] and/or [delread4~] objects into another subpatch. The audio connections between these subpatches force the "reader" to be sorted after the "writer". DSP sorting in Pd follows the hierarchy of subpatches., f 65; -#X obj 325 383 pack f 30; -#X obj 307 559 output~; -#X text 244 330 delay ----> in samples, f 11; -#X text 18 37 If you're writing to and reading from a delay line \, you have to get the write sorted before the read or else you may not get less than a block's delay. This patch compares a "wrong" flanger with a "right" one:, f 65; -#X text 18 178 To hear the difference scroll the delay time between 0 and 100 samples. The patch at right doesn't let you get below 64 samples \, but the patch at left can go all the way down to one sample., f 65; -#X text 25 567 "Right flanger", f 8; -#X text 247 569 "Wrong flanger", f 8; +#X restore 161 320 pd pulse; +#X obj 175 405 delwrite~ G05-d1 1000, f 11; +#X obj 373 395 line~; +#X obj 480 331 declare -stdpath ./; +#X obj 373 432 delread4~ G05-d1; +#X text 59 252 You can use the same strategy to avoid an unwanted delay of one block in pairs of [send~]/[receive~] \, [tabsend~]/[tabreceive~] or [throw~]/[catch~] objects., f 80; +#X text 59 124 To get them to go off in the correct order \, put the [delwrite~] into a subpatch \, then the [delread4~] and/or [delread4~] objects into another subpatch. The audio connections between these subpatches force the "reader" to be sorted after the "writer". DSP sorting in Pd follows the hierarchy of subpatches., f 80; +#X obj 373 369 pack f 30; +#X obj 355 545 output~; +#X text 292 316 delay ----> in samples, f 11; +#X text 59 72 If you're writing to and reading from a delay line \, you have to get the write sorted before the read or else you may not get less than a block's delay. This patch compares a "wrong" flanger with a "right" one:, f 80; +#X text 59 193 To hear the difference scroll the delay time between 0 and 100 samples. The patch at right doesn't let you get below 64 samples \, but the patch at left can go all the way down to one sample., f 80; +#X text 64 561 "Right flanger", f 8; +#X text 486 557 "Wrong flanger", f 8; +#X obj 28 25 cnv 5 5 25 empty empty Order\ of\ Execution\ of\ [delwrite~]\ and\ [delread~]/[delread4~] 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 5 0; -#X connect 1 0 16 0; +#X connect 1 0 15 0; #X connect 2 0 3 0; #X connect 3 0 4 1; #X connect 4 0 6 0; -#X connect 5 0 15 0; +#X connect 5 0 14 0; #X connect 7 0 1 0; #X connect 7 0 2 0; #X connect 7 0 8 0; #X connect 7 0 4 0; #X connect 9 0 3 1; -#X connect 9 0 12 0; -#X connect 12 0 1 1; -#X connect 15 0 9 0; +#X connect 9 0 11 0; +#X connect 11 0 1 1; +#X connect 14 0 9 0; diff --git a/doc/3.audio.examples/G06.octave.doubler.pd b/doc/3.audio.examples/G06.octave.doubler.pd index c212961f..a2c4eb99 100644 --- a/doc/3.audio.examples/G06.octave.doubler.pd +++ b/doc/3.audio.examples/G06.octave.doubler.pd @@ -1,56 +1,56 @@ -#N canvas 441 38 709 658 12; +#N canvas 441 38 709 702 12; #X declare -stdpath ./; -#X obj 53 527 output~; -#X obj 95 120 moses 1; -#X obj 141 152 mtof; -#X text 172 396 on/off for original; -#X text 160 23 OCTAVE DOUBLING VIA VARIABLE COMB FILTER; -#X obj 53 479 +~; -#X obj 194 204 samplerate~; -#X obj 141 200 t f b; -#X obj 114 62 delwrite~ G06-del 100; -#X obj 96 270 delread~ G06-del, f 8; -#X obj 96 382 +~; -#X obj 176 258 +; -#X obj 141 175 expr 500/$f1; -#X obj 176 312 line~; -#X obj 176 287 pack 0 20; -#X text 180 152 fundamental frequency; -#X text 239 174 1/2 period \, in msec; -#X obj 194 230 expr 2048000/$f1; -#X obj 490 64 declare -stdpath ./; -#X obj 53 17 adc~ 1; -#X obj 95 96 sigmund~ -npts 2048; -#X text 240 96 track pitch; -#X text 157 120 reject low numbers indicating no pitch found; -#X text 187 450 We already saw how to use ring modulation to alias a pitched sound down one octave. Here we do the reverse: filter out all odd harmonics using a variable-delay comb filter tuned one octave above the incoming sound. We use two taps into the delay line. The fixed one (delread~) adjusts for the delayed output of sigmund~. The variable one (vd~) adds to this an additional delay equal to 1/2 the measured period of the incoming sound. These two are added. Odd harmonics are 180 degrees out of phase at the two taps and cancel. Even harmonics get through - so the sound goes up an octave \, without denaturing the timbre as a speed-up would., f 67; -#X obj 114 412 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 96 439 *~; -#X obj 71 412 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 53 439 *~; -#X text 322 223 estimate [sigmund~] delay as one window (in msec), f 25; -#X text 140 412 <-- and processed sounds; -#X obj 114 356 delread4~ G06-del; +#X obj 54 558 output~; +#X obj 96 151 moses 1; +#X obj 142 183 mtof; +#X text 173 427 on/off for original; +#X obj 54 510 +~; +#X obj 195 235 samplerate~; +#X obj 142 231 t f b; +#X obj 115 93 delwrite~ G06-del 100; +#X obj 97 301 delread~ G06-del, f 8; +#X obj 97 413 +~; +#X obj 177 289 +; +#X obj 142 206 expr 500/$f1; +#X obj 177 343 line~; +#X obj 177 318 pack 0 20; +#X text 181 183 fundamental frequency; +#X text 240 205 1/2 period \, in msec; +#X obj 195 261 expr 2048000/$f1; +#X obj 438 96 declare -stdpath ./; +#X obj 54 48 adc~ 1; +#X obj 96 127 sigmund~ -npts 2048; +#X text 241 127 track pitch; +#X text 158 151 reject low numbers indicating no pitch found; +#X text 188 481 We already saw how to use ring modulation to alias a pitched sound down one octave. Here we do the reverse: filter out all odd harmonics using a variable-delay comb filter tuned one octave above the incoming sound. We use two taps into the delay line. The fixed one (delread~) adjusts for the delayed output of sigmund~. The variable one (vd~) adds to this an additional delay equal to 1/2 the measured period of the incoming sound. These two are added. Odd harmonics are 180 degrees out of phase at the two taps and cancel. Even harmonics get through - so the sound goes up an octave \, without denaturing the timbre as a speed-up would., f 67; +#X obj 115 443 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 97 470 *~; +#X obj 72 443 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 54 470 *~; +#X text 323 254 estimate [sigmund~] delay as one window (in msec), f 25; +#X text 141 443 <-- and processed sounds; +#X obj 115 387 delread4~ G06-del; +#X obj 146 29 cnv 5 5 25 empty empty Octave\ Doubling\ via\ Variable\ Comb\ Filter 15 13 0 16 #dfdfdf #202020 0; #X connect 1 1 2 0; -#X connect 2 0 12 0; -#X connect 5 0 0 0; -#X connect 6 0 17 0; -#X connect 7 0 11 0; -#X connect 7 1 6 0; -#X connect 9 0 10 0; -#X connect 10 0 25 0; -#X connect 11 0 14 0; -#X connect 12 0 7 0; -#X connect 13 0 30 0; -#X connect 14 0 13 0; -#X connect 17 0 11 1; -#X connect 17 0 9 0; -#X connect 19 0 8 0; -#X connect 19 0 20 0; -#X connect 19 0 27 0; -#X connect 20 0 1 0; -#X connect 24 0 25 1; -#X connect 25 0 5 1; -#X connect 26 0 27 1; -#X connect 27 0 5 0; -#X connect 30 0 10 1; +#X connect 2 0 11 0; +#X connect 4 0 0 0; +#X connect 5 0 16 0; +#X connect 6 0 10 0; +#X connect 6 1 5 0; +#X connect 8 0 9 0; +#X connect 9 0 24 0; +#X connect 10 0 13 0; +#X connect 11 0 6 0; +#X connect 12 0 29 0; +#X connect 13 0 12 0; +#X connect 16 0 10 1; +#X connect 16 0 8 0; +#X connect 18 0 7 0; +#X connect 18 0 19 0; +#X connect 18 0 26 0; +#X connect 19 0 1 0; +#X connect 23 0 24 1; +#X connect 24 0 4 1; +#X connect 25 0 26 1; +#X connect 26 0 4 0; +#X connect 29 0 9 1; diff --git a/doc/3.audio.examples/G07.shaker.pd b/doc/3.audio.examples/G07.shaker.pd index 67ebd9b2..8b30cdab 100644 --- a/doc/3.audio.examples/G07.shaker.pd +++ b/doc/3.audio.examples/G07.shaker.pd @@ -11,7 +11,6 @@ #X obj 72 295 *~; #X obj 90 215 line~; #X obj 54 215 *~; -#X text 73 51 THE "SHAKER"; #X obj 316 80 + 1; #X obj 316 103 mod 4; #X obj 281 91 f; @@ -35,6 +34,7 @@ #X obj 546 84 declare -stdpath ./; #X obj 281 209 pack f f 200, f 13; #X text 422 224 This is a time-varying comb filter \, combining four delayed copies of the input signal. The amplitude of each delayed copy varies randomly between -0.7 and +1.3. Each time the metronome goes off \, one of the four delay's gains is changed in sequence. The change occurs over the next four ticks of the metronome (so \, if the metronome ticks every 50 msec \, each message to a [line~] has a second argument of 200.), f 45; +#X obj 47 35 cnv 5 5 25 empty empty The\ "Shaker" 15 13 0 16 #dfdfdf #202020 0; #X connect 1 0 0 0; #X connect 3 0 4 1; #X connect 4 0 1 1; @@ -44,27 +44,27 @@ #X connect 8 0 1 1; #X connect 9 0 10 1; #X connect 10 0 1 0; -#X connect 12 0 13 0; -#X connect 13 0 14 1; -#X connect 14 0 12 0; -#X connect 14 0 16 0; -#X connect 15 0 25 0; -#X connect 16 0 33 0; -#X connect 16 1 15 0; -#X connect 17 0 27 0; -#X connect 18 0 24 0; -#X connect 18 0 27 1; -#X connect 19 0 9 0; -#X connect 19 1 7 0; -#X connect 19 2 5 0; -#X connect 19 3 3 0; -#X connect 20 0 8 0; -#X connect 21 0 2 0; -#X connect 21 0 10 0; -#X connect 22 0 6 0; -#X connect 23 0 4 0; -#X connect 24 0 33 2; -#X connect 25 0 33 1; -#X connect 26 0 21 0; -#X connect 27 0 14 0; -#X connect 33 0 19 0; +#X connect 11 0 12 0; +#X connect 12 0 13 1; +#X connect 13 0 11 0; +#X connect 13 0 15 0; +#X connect 14 0 24 0; +#X connect 15 0 32 0; +#X connect 15 1 14 0; +#X connect 16 0 26 0; +#X connect 17 0 23 0; +#X connect 17 0 26 1; +#X connect 18 0 9 0; +#X connect 18 1 7 0; +#X connect 18 2 5 0; +#X connect 18 3 3 0; +#X connect 19 0 8 0; +#X connect 20 0 2 0; +#X connect 20 0 10 0; +#X connect 21 0 6 0; +#X connect 22 0 4 0; +#X connect 23 0 32 2; +#X connect 24 0 32 1; +#X connect 25 0 20 0; +#X connect 26 0 13 0; +#X connect 32 0 18 0; diff --git a/doc/3.audio.examples/G08.reverb.pd b/doc/3.audio.examples/G08.reverb.pd index 286524df..f88c2533 100644 --- a/doc/3.audio.examples/G08.reverb.pd +++ b/doc/3.audio.examples/G08.reverb.pd @@ -1,4 +1,4 @@ -#N canvas 514 73 468 523 12; +#N canvas 514 73 467 484 12; #X declare -stdpath ./; #N canvas 647 153 495 454 test-input 0; #X obj 240 392 outlet~; @@ -30,7 +30,6 @@ #X connect 11 0 5 0; #X connect 13 0 8 1; #X restore 87 185 pd test-input; -#X text 60 21 REVERBERATOR; #X floatatom 87 155 6 10 130 0 - - - 0; #X floatatom 147 221 6 0 100 0 - - - 0; #X obj 87 294 output~; @@ -140,9 +139,10 @@ #X obj 311 428 rev3~, f 8; #X text 119 129 <-- pitch in MIDI (triggers envelope).; #X text 140 155 <-- you can also click and drag.; -#X connect 0 0 6 0; -#X connect 2 0 0 0; -#X connect 3 0 6 1; -#X connect 6 0 4 0; -#X connect 6 1 4 1; -#X connect 10 0 2 0; +#X obj 66 15 cnv 5 5 25 empty empty Reverberator 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 5 0; +#X connect 1 0 0 0; +#X connect 2 0 5 1; +#X connect 5 0 3 0; +#X connect 5 1 3 1; +#X connect 9 0 1 0; diff --git a/doc/3.audio.examples/G09.pitchshift.pd b/doc/3.audio.examples/G09.pitchshift.pd index 7c1b35fa..3c7ac7cc 100644 --- a/doc/3.audio.examples/G09.pitchshift.pd +++ b/doc/3.audio.examples/G09.pitchshift.pd @@ -1,43 +1,42 @@ #N canvas 407 47 769 686 12; #X declare -stdpath ./; -#X floatatom 101 72 6 0 0 0 - - - 0; -#X obj 101 443 *~; -#X obj 224 369 line~; -#X floatatom 224 124 6 0 0 0 - - - 0; -#X text 358 19 PITCH SHIFTER; -#X obj 224 98 r window; -#X obj 101 46 r transpose; -#X obj 101 128 exp; -#X floatatom 101 154 6 0 0 0 - - - 0; -#X obj 101 244 /; -#X obj 149 181 * 0.001; -#X obj 287 433 line~; -#X floatatom 287 357 8 0 0 0 - - - 0; -#X obj 287 331 r delay; -#X obj 101 480 +~; -#X obj 45 495 cos~; -#X obj 45 522 *~; -#X obj 165 566 +~; -#X obj 165 369 wrap~; -#X obj 241 428 *~; -#X obj 269 488 +~; -#X obj 183 505 cos~; -#X obj 183 532 *~; -#X msg 617 177 \; transpose 0 \; window 100 \; delay 0; -#X obj 617 151 loadbang; -#X obj 149 207 t b f; -#X floatatom 101 270 6 0 0 0 - - - 0; -#X obj 165 342 +~ 0.5; -#X obj 45 443 -~ 0.5; -#X obj 45 469 *~ 0.5; -#X obj 183 428 -~ 0.5; -#X obj 183 477 *~ 0.5; -#X obj 101 181 - 1; -#X obj 101 102 * 0.05776; -#X obj 101 207 * -1; -#X text 54 148 speed; -#X text 47 162 change; -#X text 29 261 tape head; +#X floatatom 101 79 6 0 0 0 - - - 0; +#X obj 101 450 *~; +#X obj 224 376 line~; +#X floatatom 224 131 6 0 0 0 - - - 0; +#X obj 224 105 r window; +#X obj 101 53 r transpose; +#X obj 101 135 exp; +#X floatatom 101 161 6 0 0 0 - - - 0; +#X obj 101 251 /; +#X obj 149 188 * 0.001; +#X obj 287 440 line~; +#X floatatom 287 364 8 0 0 0 - - - 0; +#X obj 287 338 r delay; +#X obj 101 487 +~; +#X obj 45 502 cos~; +#X obj 45 529 *~; +#X obj 165 573 +~; +#X obj 165 376 wrap~; +#X obj 241 435 *~; +#X obj 269 495 +~; +#X obj 183 512 cos~; +#X obj 183 539 *~; +#X msg 617 184 \; transpose 0 \; window 100 \; delay 0; +#X obj 617 158 loadbang; +#X obj 149 214 t b f; +#X floatatom 101 277 6 0 0 0 - - - 0; +#X obj 165 349 +~ 0.5; +#X obj 45 450 -~ 0.5; +#X obj 45 476 *~ 0.5; +#X obj 183 435 -~ 0.5; +#X obj 183 484 *~ 0.5; +#X obj 101 188 - 1; +#X obj 101 109 * 0.05776; +#X obj 101 214 * -1; +#X text 54 155 speed; +#X text 47 169 change; +#X text 29 268 tape head; #N canvas 627 195 565 379 test-input 0; #N canvas 0 0 450 300 (subpatch) 0; #X array array1 155944 float 2; @@ -71,70 +70,71 @@ #X connect 12 0 4 0; #X connect 13 0 10 0; #X connect 14 0 13 0; -#X restore 392 179 pd test-input; -#X obj 165 594 output~; -#X obj 101 301 phasor~; -#X obj 287 384 max 1.5; -#X text 290 290 delay; -#X text 287 308 (msec); -#X obj 224 151 max 1; -#X text 29 274 rotation freq, f 9; -#X obj 392 210 delwrite~ G09-del 5000; -#X obj 536 79 declare -stdpath ./; -#X obj 269 517 delread4~ G09-del, f 9; -#X obj 101 506 delread4~ G09-del, f 9; -#X text 275 124 <-- window (msec); -#X msg 224 342 \$1 200; -#X msg 287 408 \$1 200; -#X text 151 72 <-- transposition in halftones; -#X text 372 282 This is a classic rotating-tape-head style pitch shifter using the [delread4~] variable delay object. There are two moving tape heads \, each of which is loudest at the middle of its trajectory \, and enveloped out at the moment it has to jump back (or forward) to start another scratch. Most of the brain work is in computing how fast the tape heads have to move to get the desired transposition., f 52; -#X text 371 512 The [cos~] objects compute the fadein and fadeout of the two delay line outputs. They each traverse the positive half of the cosine waveform (phase -0.25 to +0.25) over the time the phase goes from one end to the other., f 52; -#X text 371 416 The "window size" is the total trajectory of the read points in the delay line \, in milliseconds. The delay times are controlled by a [phasor~] object. The second delay time \, 180 degrees out of phase from the first one \, is computed using the [wrap~] object., f 52; -#X connect 0 0 33 0; -#X connect 1 0 14 0; +#X restore 392 186 pd test-input; +#X obj 165 601 output~; +#X obj 101 308 phasor~; +#X obj 287 391 max 1.5; +#X text 290 297 delay; +#X text 287 315 (msec); +#X obj 224 158 max 1; +#X text 29 281 rotation freq, f 9; +#X obj 392 217 delwrite~ G09-del 5000; +#X obj 536 86 declare -stdpath ./; +#X obj 269 524 delread4~ G09-del, f 9; +#X obj 101 513 delread4~ G09-del, f 9; +#X text 275 131 <-- window (msec); +#X msg 224 349 \$1 200; +#X msg 287 415 \$1 200; +#X text 151 79 <-- transposition in halftones; +#X text 372 289 This is a classic rotating-tape-head style pitch shifter using the [delread4~] variable delay object. There are two moving tape heads \, each of which is loudest at the middle of its trajectory \, and enveloped out at the moment it has to jump back (or forward) to start another scratch. Most of the brain work is in computing how fast the tape heads have to move to get the desired transposition., f 52; +#X text 371 519 The [cos~] objects compute the fadein and fadeout of the two delay line outputs. They each traverse the positive half of the cosine waveform (phase -0.25 to +0.25) over the time the phase goes from one end to the other., f 52; +#X text 371 423 The "window size" is the total trajectory of the read points in the delay line \, in milliseconds. The delay times are controlled by a [phasor~] object. The second delay time \, 180 degrees out of phase from the first one \, is computed using the [wrap~] object., f 52; +#X obj 311 26 cnv 5 5 25 empty empty Pitch\ Shifter 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 32 0; +#X connect 1 0 13 0; #X connect 2 0 1 1; -#X connect 2 0 19 1; -#X connect 3 0 44 0; -#X connect 5 0 3 0; -#X connect 6 0 0 0; -#X connect 7 0 8 0; -#X connect 8 0 32 0; -#X connect 9 0 26 0; -#X connect 10 0 25 0; -#X connect 11 0 14 1; -#X connect 11 0 20 1; -#X connect 12 0 41 0; -#X connect 13 0 12 0; -#X connect 14 0 49 0; +#X connect 2 0 18 1; +#X connect 3 0 43 0; +#X connect 4 0 3 0; +#X connect 5 0 0 0; +#X connect 6 0 7 0; +#X connect 7 0 31 0; +#X connect 8 0 25 0; +#X connect 9 0 24 0; +#X connect 10 0 13 1; +#X connect 10 0 19 1; +#X connect 11 0 40 0; +#X connect 12 0 11 0; +#X connect 13 0 48 0; +#X connect 14 0 15 0; #X connect 15 0 16 0; -#X connect 16 0 17 0; -#X connect 17 0 39 0; +#X connect 16 0 38 0; +#X connect 17 0 18 0; +#X connect 17 0 29 0; #X connect 18 0 19 0; -#X connect 18 0 30 0; -#X connect 19 0 20 0; -#X connect 20 0 48 0; -#X connect 21 0 22 0; -#X connect 22 0 17 1; -#X connect 24 0 23 0; -#X connect 25 0 9 0; -#X connect 25 1 9 1; -#X connect 26 0 40 0; -#X connect 27 0 18 0; -#X connect 28 0 29 0; -#X connect 29 0 15 0; -#X connect 30 0 31 0; -#X connect 31 0 21 0; -#X connect 32 0 34 0; -#X connect 33 0 7 0; -#X connect 34 0 9 0; -#X connect 38 0 46 0; -#X connect 40 0 1 0; -#X connect 40 0 28 0; -#X connect 40 0 27 0; -#X connect 41 0 52 0; -#X connect 44 0 10 0; -#X connect 44 0 51 0; -#X connect 48 0 22 1; -#X connect 49 0 16 1; -#X connect 51 0 2 0; -#X connect 52 0 11 0; +#X connect 19 0 47 0; +#X connect 20 0 21 0; +#X connect 21 0 16 1; +#X connect 23 0 22 0; +#X connect 24 0 8 0; +#X connect 24 1 8 1; +#X connect 25 0 39 0; +#X connect 26 0 17 0; +#X connect 27 0 28 0; +#X connect 28 0 14 0; +#X connect 29 0 30 0; +#X connect 30 0 20 0; +#X connect 31 0 33 0; +#X connect 32 0 6 0; +#X connect 33 0 8 0; +#X connect 37 0 45 0; +#X connect 39 0 1 0; +#X connect 39 0 27 0; +#X connect 39 0 26 0; +#X connect 40 0 51 0; +#X connect 43 0 9 0; +#X connect 43 0 50 0; +#X connect 47 0 21 1; +#X connect 48 0 15 1; +#X connect 50 0 2 0; +#X connect 51 0 10 0; diff --git a/doc/3.audio.examples/H01.low-pass.pd b/doc/3.audio.examples/H01.low-pass.pd index 38b89b8d..a01dc7da 100644 --- a/doc/3.audio.examples/H01.low-pass.pd +++ b/doc/3.audio.examples/H01.low-pass.pd @@ -1,27 +1,26 @@ #N canvas 506 38 613 631 12; #X declare -stdpath ./; -#X obj 96 367 mtof; -#X floatatom 96 344 5 0 0 0 - \$0-pit - 0; -#X obj 72 540 output~; -#X obj 71 417 lop~; -#X obj 71 314 noise~; -#X floatatom 96 392 7 0 0 0 - - - 0; -#X text 107 416 low-pass filter; -#X obj 145 504 tabwrite~ H01-graph; -#X obj 145 472 metro 250; -#X obj 145 447 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 170 446 graphing on/off; -#X text 399 518 --- 0.02 sec ---; -#X text 33 133 The lop~ object is normalized to pass DC (the lowest frequency) with a gain of one. Higher frequencies are progressively more and more attenuated. The lower the cutoff frequency \, the lower the total power of the filtered noise. If you graph the output you'll see that the waveform gets smoother (and smaller overall) as the cutoff frequency is lowered., f 75; -#X text 40 212 At the cutoff frequency the gain is about -3 dB \, and above that the gain drops a further 6 dB per octave. (Sometimes one uses the word "rolloff" instead of "cutoff" to emphasize the gradual way the gain drops off with frequency.), f 74; -#X text 125 313 white noise \, test signal; -#X text 80 22 ONE-POLE LOW-PASS FILTER; +#X obj 96 373 mtof; +#X floatatom 96 350 5 0 0 0 - \$0-pit - 0; +#X obj 72 546 output~; +#X obj 71 423 lop~; +#X obj 71 320 noise~; +#X floatatom 96 398 7 0 0 0 - - - 0; +#X text 107 422 low-pass filter; +#X obj 145 510 tabwrite~ H01-graph; +#X obj 145 478 metro 250; +#X obj 145 453 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X text 170 452 graphing on/off; +#X text 399 524 --- 0.02 sec ---; +#X text 33 139 The lop~ object is normalized to pass DC (the lowest frequency) with a gain of one. Higher frequencies are progressively more and more attenuated. The lower the cutoff frequency \, the lower the total power of the filtered noise. If you graph the output you'll see that the waveform gets smoother (and smaller overall) as the cutoff frequency is lowered., f 75; +#X text 40 218 At the cutoff frequency the gain is about -3 dB \, and above that the gain drops a further 6 dB per octave. (Sometimes one uses the word "rolloff" instead of "cutoff" to emphasize the gradual way the gain drops off with frequency.), f 74; +#X text 125 319 white noise \, test signal; #N canvas 0 0 450 300 (subpatch) 0; #X array H01-graph 882 float 0; #X coords 0 1 881 -1 200 140 1 0 0; -#X restore 357 372 graph; -#X text 140 343 <-- cutoff (pitch units); -#X text 155 391 <-- cutoff (Hertz); +#X restore 357 378 graph; +#X text 140 349 <-- cutoff (pitch units); +#X text 155 397 <-- cutoff (Hertz); #N canvas 774 414 291 271 init 0; #X obj 107 103 loadbang; #X obj 107 168 s \$0-pit; @@ -30,8 +29,9 @@ #X text 42 27 This subpatch initializes the patch and loads a value in the pitch number box., f 30; #X connect 0 0 2 0; #X connect 2 0 1 0; -#X restore 227 558 pd init; -#X text 33 54 This and the following patches show how to use filters in Pd \, starting with the simplest one: the one-pole low-pass filter. Here we test it with an input of white noise. The [lop~] object does the filtering. Its left inlet takes an audio signal to be filtered \, and its right inlet takes messages or signals to set its cutoff frequency in Hertz., f 75; +#X restore 227 564 pd init; +#X text 33 60 This and the following patches show how to use filters in Pd \, starting with the simplest one: the one-pole low-pass filter. Here we test it with an input of white noise. The [lop~] object does the filtering. Its left inlet takes an audio signal to be filtered \, and its right inlet takes messages or signals to set its cutoff frequency in Hertz., f 75; +#X obj 136 15 cnv 5 5 25 empty empty One-Pole\ Low-Pass\ Filter 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 5 0; #X connect 1 0 0 0; #X connect 3 0 2 0; diff --git a/doc/3.audio.examples/H02.high-pass.pd b/doc/3.audio.examples/H02.high-pass.pd index cd1b49a8..8519ce97 100644 --- a/doc/3.audio.examples/H02.high-pass.pd +++ b/doc/3.audio.examples/H02.high-pass.pd @@ -1,40 +1,40 @@ -#N canvas 486 38 568 698 12; +#N canvas 486 38 568 688 12; #X declare -stdpath ./; -#X obj 41 579 output~; -#X obj 102 490 metro 250; -#X obj 102 463 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 125 462 graphing on/off; +#X obj 41 592 output~; +#X obj 102 503 metro 250; +#X obj 102 476 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X text 125 475 graphing on/off; #N canvas 0 0 450 300 (subpatch) 0; #X array H02-graph 882 float 0; #X coords 0 1 881 -1 200 140 1 0 0; -#X restore 328 306 graph; -#X text 372 452 --- 0.02 sec ---; -#X text 53 48 Many synthesis algorithms and transformations can have outputs with a zero-frequency component (commonly called DC for "direct current"). These are inaudible and sometimes cause distortion in audio output devices \, or when converting to fixed-point soundfile formats. It is often desirable to filter an audio signal to remove its DC component., f 65; -#X obj 40 269 +~ 1; -#X text 95 417 high-pass filter; -#X floatatom 79 380 5 0 0 0 - - - 0; -#X msg 79 305 0; -#X text 107 242 sinusoidal test signal; -#X text 86 269 add "DC"; -#X text 117 305 zero for no filtering; -#X msg 89 328 3; -#X text 124 329 3 (or so) to remove DC; -#X obj 40 244 osc~ 220; -#X msg 97 353 220; -#X text 102 12 ONE-POLE \, ONE-ZERO HIGH-PASS FILTER; -#X obj 102 529 tabwrite~ H02-graph; -#X obj 365 510 declare -stdpath ./; -#X text 53 144 The simplest way to do this is to use a one-pole low-pass filter \, tuned to a low frequency such as 3 Hertz \, and to subtract its output from the original. This difference is called a one-pole \, one-zero high-pass filter \, and it is used so often that Pd provides one in the [hip~] object., f 65; -#X text 161 578 The [output~] abstraction includes [hip~] objects for this reason., f 34; -#X text 129 353 higher frequencies affect the audible part of the signal as well., f 23; -#X obj 40 416 hip~ 3; -#X connect 1 0 19 0; +#X restore 328 319 graph; +#X text 372 465 --- 0.02 sec ---; +#X text 53 61 Many synthesis algorithms and transformations can have outputs with a zero-frequency component (commonly called DC for "direct current"). These are inaudible and sometimes cause distortion in audio output devices \, or when converting to fixed-point soundfile formats. It is often desirable to filter an audio signal to remove its DC component., f 65; +#X obj 40 282 +~ 1; +#X text 95 430 high-pass filter; +#X floatatom 79 393 5 0 0 0 - - - 0; +#X msg 79 318 0; +#X text 107 255 sinusoidal test signal; +#X text 86 282 add "DC"; +#X text 117 318 zero for no filtering; +#X msg 89 341 3; +#X text 124 342 3 (or so) to remove DC; +#X obj 40 257 osc~ 220; +#X msg 97 366 220; +#X obj 102 542 tabwrite~ H02-graph; +#X obj 365 523 declare -stdpath ./; +#X text 53 157 The simplest way to do this is to use a one-pole low-pass filter \, tuned to a low frequency such as 3 Hertz \, and to subtract its output from the original. This difference is called a one-pole \, one-zero high-pass filter \, and it is used so often that Pd provides one in the [hip~] object., f 65; +#X text 169 608 The [output~] abstraction includes [hip~] objects for this reason., f 34; +#X text 129 366 higher frequencies affect the audible part of the signal as well., f 23; +#X obj 40 429 hip~ 3; +#X obj 93 19 cnv 5 5 25 empty empty One-Pole/One-Zero\ High-Pass\ Filter 15 13 0 16 #dfdfdf #202020 0; +#X connect 1 0 18 0; #X connect 2 0 1 0; -#X connect 7 0 24 0; -#X connect 9 0 24 1; +#X connect 7 0 23 0; +#X connect 9 0 23 1; #X connect 10 0 9 0; #X connect 14 0 9 0; #X connect 16 0 7 0; #X connect 17 0 9 0; -#X connect 24 0 0 0; -#X connect 24 0 19 0; +#X connect 23 0 0 0; +#X connect 23 0 18 0; diff --git a/doc/3.audio.examples/H03.band-pass.pd b/doc/3.audio.examples/H03.band-pass.pd index 185364c3..2643ad19 100644 --- a/doc/3.audio.examples/H03.band-pass.pd +++ b/doc/3.audio.examples/H03.band-pass.pd @@ -13,7 +13,6 @@ #X text 105 384 band-pass filter; #X obj 156 462 tabwrite~ H03-graph; #X floatatom 85 356 5 0 1000 0 - \$0-q - 0; -#X text 93 25 RESONANT (BAND-PASS) FILTER; #X text 59 141 The two controls specify \, first \, the center frequency \, and second \, the sharpness of the filter \, commonly called "q". If you increase q to 10 or 20 \, you will see a drop in total signal power \, and moreover \, you'll see and hear the resonant frequency more clearly in the result., f 69; #N canvas 0 0 450 300 (subpatch) 0; #X array H03-graph 882 float 0; @@ -35,6 +34,7 @@ #X connect 1 0 2 0; #X connect 2 0 3 0; #X restore 210 516 pd init; +#X obj 120 13 cnv 5 5 25 empty empty Resonant\ (Band-Pass)\ Filter 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 4 0; #X connect 1 0 0 0; #X connect 3 0 9 0; @@ -43,4 +43,4 @@ #X connect 9 0 2 0; #X connect 9 0 11 0; #X connect 12 0 9 2; -#X connect 16 0 5 0; +#X connect 15 0 5 0; diff --git a/doc/3.audio.examples/H04.filter.sweep.pd b/doc/3.audio.examples/H04.filter.sweep.pd index eb8532da..99fe40ff 100644 --- a/doc/3.audio.examples/H04.filter.sweep.pd +++ b/doc/3.audio.examples/H04.filter.sweep.pd @@ -1,7 +1,6 @@ #N canvas 553 38 513 624 12; #X declare -stdpath ./; #X floatatom 111 203 5 0 150 0 - \$0-pitch - 0; -#X text 87 27 SWEEPING FILTERS; #X obj 111 250 phasor~; #X obj 123 408 +~; #X floatatom 141 383 5 0 100 0 - \$0-offset - 0; @@ -36,15 +35,16 @@ #X text 166 278 <-- sweep speed; #X text 157 203 <-- pitch; #X text 171 251 [phasor~] as a sawtooth like oscillator; -#X connect 0 0 13 0; -#X connect 2 0 8 0; -#X connect 3 0 17 0; -#X connect 4 0 3 1; -#X connect 5 0 14 0; -#X connect 6 0 15 1; -#X connect 7 0 8 2; -#X connect 8 0 12 0; -#X connect 13 0 2 0; -#X connect 14 0 15 0; -#X connect 15 0 3 0; -#X connect 17 0 8 1; +#X obj 146 18 cnv 5 5 25 empty empty Sweeping\ Filters 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 12 0; +#X connect 1 0 7 0; +#X connect 2 0 16 0; +#X connect 3 0 2 1; +#X connect 4 0 13 0; +#X connect 5 0 14 1; +#X connect 6 0 7 2; +#X connect 7 0 11 0; +#X connect 12 0 1 0; +#X connect 13 0 14 0; +#X connect 14 0 2 0; +#X connect 16 0 7 1; diff --git a/doc/3.audio.examples/H05.filter.floyd.pd b/doc/3.audio.examples/H05.filter.floyd.pd index 7b5136bc..0c5ebca4 100644 --- a/doc/3.audio.examples/H05.filter.floyd.pd +++ b/doc/3.audio.examples/H05.filter.floyd.pd @@ -1,30 +1,29 @@ -#N canvas 600 38 590 730 12; +#N canvas 600 38 589 749 12; #X declare -stdpath ./; -#X obj 167 461 line~; -#X obj 167 433 pack 0 100; -#X floatatom 167 384 4 61 110 0 - \$0-cf - 0; -#X floatatom 179 514 5 3 100 0 - \$0-q - 0; -#X obj 122 567 vcf~; -#X text 66 17 ANOTHER SWEEPING FILTER EXAMPLE; -#X obj 150 328 clip~ 0 0.5; -#X obj 150 350 *~ 2; -#X obj 122 395 -~; -#X obj 140 204 f; -#X obj 179 194 + 1; -#X obj 140 271 mtof; -#X obj 179 218 mod 8; +#X obj 167 472 line~; +#X obj 167 444 pack 0 100; +#X floatatom 167 395 4 61 110 0 - \$0-cf - 0; +#X floatatom 179 525 5 3 100 0 - \$0-q - 0; +#X obj 122 578 vcf~; +#X obj 150 339 clip~ 0 0.5; +#X obj 150 361 *~ 2; +#X obj 122 406 -~; +#X obj 140 215 f; +#X obj 179 205 + 1; +#X obj 140 282 mtof; +#X obj 179 229 mod 8; #N canvas 0 22 450 300 (subpatch) 0; #X array \$0-sequence 8 float 2; #X coords 0 72 8 48 183 122 1 0 0; -#X restore 345 184 graph; -#X obj 154 653 output~; -#X obj 140 140 tgl 19 0 empty \$0-metro empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 220 407 at least 61; -#X obj 140 295 phasor~; -#X obj 154 606 vcf~; -#X obj 167 408 max 61; -#X text 212 471 smooth & convert to Hz.; -#X obj 167 484 mtof~; +#X restore 345 195 graph; +#X obj 154 664 output~; +#X obj 140 151 tgl 19 0 empty \$0-metro empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X text 220 418 at least 61; +#X obj 140 306 phasor~; +#X obj 154 617 vcf~; +#X obj 167 419 max 61; +#X text 212 482 smooth & convert to Hz.; +#X obj 167 495 mtof~; #N canvas 876 177 379 325 init 0; #X obj 51 23 loadbang; #X obj 51 47 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; @@ -35,46 +34,47 @@ #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 2 0 5 0; -#X restore 475 338 pd init; -#X text 219 513 <-- Q (selectivity); -#X text 202 384 <-- center frequency; -#X text 38 324 trick to make a symmetric triangle wave, f 13; -#X text 225 199 sequencer for 8 note loop, f 13; -#X obj 122 435 *~ 4; -#X obj 122 459 -~ 1; -#X text 28 440 make it go from -1 to 1, f 12; -#X obj 179 537 max 3; -#X text 196 572 Put two [vcf~] objects in series for better rejection of the stop bands without having to make the passband excessively narrow., f 43; -#X text 224 538 at least 3; -#X obj 140 167 metro 85; -#X obj 140 245 tabread \$0-sequence; -#X text 532 294 48; -#X text 531 175 72; -#X text 67 49 Here's an approximate reconstruction of an old riff by Pink Floyd. Because we're filtering a triangular waveform with odd partials \, it's easier to pick out the partials in the filtered sound than if we had had both even and odd ones., f 66; -#X text 459 159 Picthes; -#X connect 0 0 21 0; +#X restore 475 349 pd init; +#X text 219 524 <-- Q (selectivity); +#X text 202 395 <-- center frequency; +#X text 38 335 trick to make a symmetric triangle wave, f 13; +#X text 225 210 sequencer for 8 note loop, f 13; +#X obj 122 446 *~ 4; +#X obj 122 470 -~ 1; +#X text 28 451 make it go from -1 to 1, f 12; +#X obj 179 548 max 3; +#X text 196 583 Put two [vcf~] objects in series for better rejection of the stop bands without having to make the passband excessively narrow., f 43; +#X text 224 549 at least 3; +#X obj 140 178 metro 85; +#X obj 140 256 tabread \$0-sequence; +#X text 532 305 48; +#X text 531 186 72; +#X text 67 65 Here's an approximate reconstruction of an old riff by Pink Floyd. Because we're filtering a triangular waveform with odd partials \, it's easier to pick out the partials in the filtered sound than if we had had both even and odd ones.; +#X text 459 170 Picthes; +#X obj 112 24 cnv 5 5 25 empty empty Another\ Filter\ Sweeping\ Example 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 20 0; #X connect 1 0 0 0; -#X connect 2 0 19 0; -#X connect 3 0 30 0; -#X connect 4 0 18 0; +#X connect 2 0 18 0; +#X connect 3 0 29 0; +#X connect 4 0 17 0; +#X connect 5 0 6 0; #X connect 6 0 7 0; -#X connect 7 0 8 0; -#X connect 8 0 27 0; -#X connect 9 0 10 0; -#X connect 9 0 34 0; -#X connect 10 0 12 0; -#X connect 11 0 17 0; -#X connect 12 0 9 1; -#X connect 15 0 33 0; -#X connect 17 0 6 0; -#X connect 17 0 8 1; -#X connect 18 0 14 0; -#X connect 19 0 1 0; -#X connect 21 0 4 1; -#X connect 21 0 18 1; -#X connect 27 0 28 0; -#X connect 28 0 4 0; -#X connect 30 0 18 2; -#X connect 30 0 4 2; -#X connect 33 0 9 0; -#X connect 34 0 11 0; +#X connect 7 0 26 0; +#X connect 8 0 9 0; +#X connect 8 0 33 0; +#X connect 9 0 11 0; +#X connect 10 0 16 0; +#X connect 11 0 8 1; +#X connect 14 0 32 0; +#X connect 16 0 5 0; +#X connect 16 0 7 1; +#X connect 17 0 13 0; +#X connect 18 0 1 0; +#X connect 20 0 4 1; +#X connect 20 0 17 1; +#X connect 26 0 27 0; +#X connect 27 0 4 0; +#X connect 29 0 17 2; +#X connect 29 0 4 2; +#X connect 32 0 8 0; +#X connect 33 0 10 0; diff --git a/doc/3.audio.examples/H06.envelope.follower.pd b/doc/3.audio.examples/H06.envelope.follower.pd index fc9f1058..2be79bca 100644 --- a/doc/3.audio.examples/H06.envelope.follower.pd +++ b/doc/3.audio.examples/H06.envelope.follower.pd @@ -1,34 +1,33 @@ #N canvas 569 38 549 725 12; -#X floatatom 68 577 8 0 0 0 - - - 0; -#X floatatom 322 300 5 0 999 0 - \$0-osc2 - 12; -#X obj 322 334 osc~; -#X text 39 14 ENVELOPE FOLLOWER; -#X obj 248 511 lop~; -#X floatatom 273 482 4 0 100 0 - \$0-lop - 0; -#X obj 247 386 +~; -#X obj 247 355 osc~ 500; -#X obj 248 448 *~; -#X obj 248 574 snapshot~; -#X floatatom 248 635 9 0 999 0 - - - 0; -#X obj 248 604 sqrt; -#X obj 68 604 dbtorms; -#X text 301 449 square the signal; -#X text 285 603 convert to RMS; -#X text 293 511 low-pass filter; -#X text 317 634 output; -#X obj 259 546 r \$0-tick; -#X obj 68 441 r \$0-tick; -#X obj 68 552 f; -#X obj 86 510 env~; -#X obj 322 388 *~; -#X obj 340 363 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 32 122 Here we're adding two oscillators so the result should be an RMS of one if the second oscillator is on \, 0.707 otherwise. Note two effects: first \, the more responsive the envelope follower \, the less accurate the result (but the faster it responds). Second \, if the two oscillators are tuned close to each other their beating affects the numbers coming out., f 70; -#X obj 68 342 ../5.reference/set-dsp-tgl; -#X text 99 345 DSP on/off; -#X msg 68 379 \; pd dsp \$1; -#X text 32 41 An envelope follower measures the mean square power of an signal as it changes over time. (You can convert mean square power to RMS amplitude or to decibels if you wish.) The term "mean square" means simply that the signal should be squared \, and then averaged. The averaging is done using a low-pass filter such as [lop~]., f 70; -#X text 33 216 The [env~] object at right \, which is a built-in envelope follower using a higher-quality low-pass filter than [lop~] \, is shown for comparison. Its output is artificially slowed down to match the homemade one at left., f 70; -#X text 308 482 <-- responsiveness; +#X floatatom 68 587 8 0 0 0 - - - 0; +#X floatatom 322 310 5 0 999 0 - \$0-osc2 - 12; +#X obj 322 344 osc~; +#X obj 248 521 lop~; +#X floatatom 273 492 4 0 100 0 - \$0-lop - 0; +#X obj 247 396 +~; +#X obj 247 365 osc~ 500; +#X obj 248 458 *~; +#X obj 248 584 snapshot~; +#X floatatom 248 645 9 0 999 0 - - - 0; +#X obj 248 614 sqrt; +#X obj 68 614 dbtorms; +#X text 301 459 square the signal; +#X text 285 613 convert to RMS; +#X text 293 521 low-pass filter; +#X text 317 644 output; +#X obj 259 556 r \$0-tick; +#X obj 68 451 r \$0-tick; +#X obj 68 562 f; +#X obj 86 520 env~; +#X obj 322 398 *~; +#X obj 340 373 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X text 32 132 Here we're adding two oscillators so the result should be an RMS of one if the second oscillator is on \, 0.707 otherwise. Note two effects: first \, the more responsive the envelope follower \, the less accurate the result (but the faster it responds). Second \, if the two oscillators are tuned close to each other their beating affects the numbers coming out., f 70; +#X obj 68 352 ../5.reference/set-dsp-tgl; +#X text 99 355 DSP on/off; +#X msg 68 389 \; pd dsp \$1; +#X text 32 51 An envelope follower measures the mean square power of an signal as it changes over time. (You can convert mean square power to RMS amplitude or to decibels if you wish.) The term "mean square" means simply that the signal should be squared \, and then averaged. The averaging is done using a low-pass filter such as [lop~]., f 70; +#X text 33 226 The [env~] object at right \, which is a built-in envelope follower using a higher-quality low-pass filter than [lop~] \, is shown for comparison. Its output is artificially slowed down to match the homemade one at left., f 70; +#X text 308 492 <-- responsiveness; #N canvas 536 459 382 265 init 0; #X obj 85 14 loadbang; #X obj 85 38 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; @@ -43,29 +42,30 @@ #X connect 2 0 6 0; #X connect 3 0 5 0; #X connect 4 0 3 0; -#X restore 444 611 pd init; -#X text 78 300 frequency of second oscillator -->; -#X text 365 363 <-- on/off; -#X floatatom 68 635 9 0 999 0 - - - 0; -#X text 331 542 take snapshot every 1/4 second, f 16; -#X text 122 509 <-- built-in envelope follower for comparison, f 12; -#X connect 0 0 12 0; +#X restore 444 621 pd init; +#X text 78 310 frequency of second oscillator -->; +#X text 365 373 <-- on/off; +#X floatatom 68 645 9 0 999 0 - - - 0; +#X text 331 552 take snapshot every 1/4 second, f 16; +#X text 122 519 <-- built-in envelope follower for comparison, f 12; +#X obj 109 14 cnv 5 5 25 empty empty Envelope\ Follower 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 11 0; #X connect 1 0 2 0; -#X connect 2 0 21 0; -#X connect 4 0 9 0; -#X connect 5 0 4 1; -#X connect 6 0 8 0; -#X connect 6 0 8 1; -#X connect 6 0 20 0; -#X connect 7 0 6 0; -#X connect 8 0 4 0; -#X connect 9 0 11 0; -#X connect 11 0 10 0; -#X connect 12 0 33 0; -#X connect 17 0 9 0; -#X connect 18 0 19 0; -#X connect 19 0 0 0; -#X connect 20 0 19 1; -#X connect 21 0 6 1; -#X connect 22 0 21 1; -#X connect 24 0 26 0; +#X connect 2 0 20 0; +#X connect 3 0 8 0; +#X connect 4 0 3 1; +#X connect 5 0 7 0; +#X connect 5 0 7 1; +#X connect 5 0 19 0; +#X connect 6 0 5 0; +#X connect 7 0 3 0; +#X connect 8 0 10 0; +#X connect 10 0 9 0; +#X connect 11 0 32 0; +#X connect 16 0 8 0; +#X connect 17 0 18 0; +#X connect 18 0 0 0; +#X connect 19 0 18 1; +#X connect 20 0 5 1; +#X connect 21 0 20 1; +#X connect 23 0 25 0; diff --git a/doc/3.audio.examples/H07.measure.spectrum.pd b/doc/3.audio.examples/H07.measure.spectrum.pd index e6257169..8288e43e 100644 --- a/doc/3.audio.examples/H07.measure.spectrum.pd +++ b/doc/3.audio.examples/H07.measure.spectrum.pd @@ -1,27 +1,26 @@ -#N canvas 453 38 655 862 12; +#N canvas 453 38 655 869 12; #X declare -stdpath ./; -#X obj 145 571 bp~; -#X obj 122 532 bp~; -#X obj 154 443 mtof; -#X floatatom 154 470 7 0 0 0 - - - 0; -#X floatatom 163 496 4 0 999 0 - \$0-q - 0; -#X floatatom 154 421 7 0 150 0 - \$0-pitch - 0; -#X obj 61 614 env~ 4096; -#X obj 122 334 *~ 0; -#X obj 122 359 +~ 1; -#X text 35 51 In this example we use two cascaded band-pass filters to troll for partials in Jonathan Harvey's famous bell sample., f 82; -#X text 35 198 You can hear partials around 48 \, 51.3 \, 55 (faint!) \, 57 (fainter!) \, 60 \, two beating partials around 65 \, 67 \, 69 \, 70.9 \, 71.75 \, 72.6 \, 74 \, 74.65 \, 75.6 \, 77 \, 81.2 \, 84.6 \, 86.5 \, and probably many more. There's also one down at 36 \, but it's easier to see it on the meter than hear it., f 82; -#X text 189 445 (shift-drag to fine tune); -#X obj 145 711 output~; +#X obj 145 580 bp~; +#X obj 122 541 bp~; +#X obj 154 452 mtof; +#X floatatom 154 479 7 0 0 0 - - - 0; +#X floatatom 163 505 4 0 999 0 - \$0-q - 0; +#X floatatom 154 430 7 0 150 0 - \$0-pitch - 0; +#X obj 61 623 env~ 4096; +#X obj 122 343 *~ 0; +#X obj 122 368 +~ 1; +#X text 35 60 In this example we use two cascaded band-pass filters to troll for partials in Jonathan Harvey's famous bell sample., f 82; +#X text 35 207 You can hear partials around 48 \, 51.3 \, 55 (faint!) \, 57 (fainter!) \, 60 \, two beating partials around 65 \, 67 \, 69 \, 70.9 \, 71.75 \, 72.6 \, 74 \, 74.65 \, 75.6 \, 77 \, 81.2 \, 84.6 \, 86.5 \, and probably many more. There's also one down at 36 \, but it's easier to see it on the meter than hear it., f 82; +#X text 189 454 (shift-drag to fine tune); +#X obj 145 720 output~; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-array 155944 float 2; #X coords 0 1 155944 -1 274 101 1; -#X restore 315 283 graph; -#X obj 122 286 r \$0-loopf; -#X obj 122 310 phasor~; -#X obj 122 383 tabread4~ \$0-array; -#X obj 166 334 r \$0-totsamps; -#X text 38 19 MEASURING SPECTRA USING BAND-PASS FILTERS; +#X restore 315 292 graph; +#X obj 122 295 r \$0-loopf; +#X obj 122 319 phasor~; +#X obj 122 392 tabread4~ \$0-array; +#X obj 166 343 r \$0-totsamps; #N canvas 717 163 409 449 init 0; #X obj 81 239 soundfiler; #X obj 81 33 loadbang; @@ -49,24 +48,25 @@ #X connect 6 1 4 1; #X connect 8 0 0 0; #X connect 11 0 8 0; -#X restore 535 401 pd init; -#X text 198 496 <-- Q (filter selectivity); -#X text 210 471 <-- center frequency; -#X text 210 420 <-- center pitch; -#X floatatom 193 533 5 0 20 0 - - - 0; -#X text 234 532 <-- add up to 20 dB; -#X text 35 89 Note that filters can give unexpected level changes. The [bp~] object is designed to have roughly unit gain at the pass band \, so the higher you set "Q" the more amplitude is lost. You can correct for this by pushing the output amplitude \, but be sure to remember to reset the output amplitude before you reduce Q again. I set the Q to 100 and add an amplitude gain of 10 or 20 (with the [output~] volume way down!) Then holding the shift key \, slowly drag the center pitch upward listening for modes., f 82; -#X obj 193 631 dbtorms~; -#X obj 193 556 pack f 20; -#X obj 193 580 line~; -#X obj 193 605 +~ 100; -#X obj 145 670 *~; -#X obj 62 679 vu 21 160 empty empty -1 -10 0 12 #404040 #000000 1 0; -#X obj 61 645 - 100; -#X text 130 799 <-- the [vu] object is used to display values in dBFS, f 27; -#X text 263 627 convert to amplitude values (up to 10), f 21; +#X restore 535 410 pd init; +#X text 198 505 <-- Q (filter selectivity); +#X text 210 480 <-- center frequency; +#X text 210 429 <-- center pitch; +#X floatatom 193 542 5 0 20 0 - - - 0; +#X text 234 541 <-- add up to 20 dB; +#X text 35 98 Note that filters can give unexpected level changes. The [bp~] object is designed to have roughly unit gain at the pass band \, so the higher you set "Q" the more amplitude is lost. You can correct for this by pushing the output amplitude \, but be sure to remember to reset the output amplitude before you reduce Q again. I set the Q to 100 and add an amplitude gain of 10 or 20 (with the [output~] volume way down!) Then holding the shift key \, slowly drag the center pitch upward listening for modes., f 82; +#X obj 193 640 dbtorms~; +#X obj 193 565 pack f 20; +#X obj 193 589 line~; +#X obj 193 614 +~ 100; +#X obj 145 679 *~; +#X obj 62 688 vu 21 160 empty empty -1 -10 0 12 #404040 #000000 1 0; +#X obj 61 654 - 100; +#X text 130 808 <-- the [vu] object is used to display values in dBFS, f 27; +#X text 263 636 convert to amplitude values (up to 10), f 21; +#X obj 89 15 cnv 5 5 25 empty empty Measuring\ Spectra\ Using\ Band-Pass\ Filters 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 6 0; -#X connect 0 0 30 0; +#X connect 0 0 29 0; #X connect 1 0 0 0; #X connect 2 0 3 0; #X connect 3 0 1 1; @@ -74,17 +74,17 @@ #X connect 4 0 1 2; #X connect 4 0 0 2; #X connect 5 0 2 0; -#X connect 6 0 32 0; +#X connect 6 0 31 0; #X connect 7 0 8 0; #X connect 8 0 16 0; #X connect 14 0 15 0; #X connect 15 0 7 0; #X connect 16 0 1 0; #X connect 17 0 7 1; -#X connect 23 0 27 0; -#X connect 26 0 30 1; +#X connect 22 0 26 0; +#X connect 25 0 29 1; +#X connect 26 0 27 0; #X connect 27 0 28 0; -#X connect 28 0 29 0; -#X connect 29 0 26 0; -#X connect 30 0 12 0; -#X connect 32 0 31 0; +#X connect 28 0 25 0; +#X connect 29 0 12 0; +#X connect 31 0 30 0; diff --git a/doc/3.audio.examples/H08.heterodyning.pd b/doc/3.audio.examples/H08.heterodyning.pd index b90fbe55..d9487d7b 100644 --- a/doc/3.audio.examples/H08.heterodyning.pd +++ b/doc/3.audio.examples/H08.heterodyning.pd @@ -1,37 +1,36 @@ -#N canvas 558 38 528 732 12; -#X text 94 15 MORE ON MEASURING SPECTRA: HETERODYNING; -#X obj 105 251 phasor~ 100; -#X obj 158 321 phasor~; -#X floatatom 158 283 5 0 999 0 - \$0-freq - 0; -#X obj 158 359 cos~; -#X obj 201 375 cos~; -#X obj 201 350 +~ 0.25; -#X obj 106 574 snapshot~; -#X obj 106 419 *~; -#X obj 150 419 *~; -#X obj 106 477 lop~; -#X obj 150 477 lop~; -#X floatatom 175 446 3 0 100 0 - \$0-lop - 0; -#X obj 285 574 snapshot~; -#X floatatom 106 605 5 0 0 0 - - - 0; -#X floatatom 285 605 5 0 0 0 - - - 0; -#X obj 253 494 r \$0-tick; -#X obj 253 518 t b b; -#X obj 106 640 expr sqrt($f1*$f1+$f2*$f2); -#X floatatom 106 667 5 0 0 0 - - - 0; -#X text 38 50 Another method for picking out the strengths of partials in a sound is heterodyning. We guess the frequency of a partial (as in the previous patch) but this time we multiply by a complex exponential to frequency-shift the partial down to zero (DC)., f 62; -#X text 38 114 Then a low-pass filter (applied separately on the real and imaginary parts) removes all but the DC component thus obtained. The result is two audio signals (which we take snapshots of) holding the real and imaginary parts of the complex amplitude of the partial we want. Compared to the previous method \, this had the advantage of reporting the phase of the partial as well as its frequency., f 62; -#X text 67 598 real; -#X text 67 612 part; -#X text 248 612 part; -#X text 213 599 imaginary; -#X text 96 691 magnitude; -#X obj 347 240 ../5.reference/set-dsp-tgl; -#X text 378 243 DSP on/off; -#X msg 347 277 \; pd dsp \$1; -#X text 201 282 <-- test frequency, f 9; -#X text 261 348 modulate test frequency to DC, f 15; -#X text 204 446 <-- responsiveness; +#N canvas 386 39 528 713 12; +#X obj 105 258 phasor~ 100; +#X obj 158 328 phasor~; +#X floatatom 158 290 5 0 999 0 - \$0-freq - 0; +#X obj 158 366 cos~; +#X obj 201 382 cos~; +#X obj 201 357 +~ 0.25; +#X obj 106 581 snapshot~; +#X obj 106 426 *~; +#X obj 150 426 *~; +#X obj 106 484 lop~; +#X obj 150 484 lop~; +#X floatatom 175 453 3 0 100 0 - \$0-lop - 0; +#X obj 285 581 snapshot~; +#X floatatom 106 612 5 0 0 0 - - - 0; +#X floatatom 285 612 5 0 0 0 - - - 0; +#X obj 253 501 r \$0-tick; +#X obj 253 525 t b b; +#X obj 106 647 expr sqrt($f1*$f1+$f2*$f2); +#X floatatom 106 674 5 0 0 0 - - - 0; +#X text 38 57 Another method for picking out the strengths of partials in a sound is heterodyning. We guess the frequency of a partial (as in the previous patch) but this time we multiply by a complex exponential to frequency-shift the partial down to zero (DC)., f 62; +#X text 38 121 Then a low-pass filter (applied separately on the real and imaginary parts) removes all but the DC component thus obtained. The result is two audio signals (which we take snapshots of) holding the real and imaginary parts of the complex amplitude of the partial we want. Compared to the previous method \, this had the advantage of reporting the phase of the partial as well as its frequency., f 62; +#X text 67 605 real; +#X text 67 619 part; +#X text 248 619 part; +#X text 213 606 imaginary; +#X text 153 673 magnitude; +#X obj 347 247 ../5.reference/set-dsp-tgl; +#X text 378 250 DSP on/off; +#X msg 347 284 \; pd dsp \$1; +#X text 201 289 <-- test frequency, f 9; +#X text 261 355 modulate test frequency to DC, f 15; +#X text 204 453 <-- responsiveness; #N canvas 536 459 361 258 init 0; #X obj 68 22 loadbang; #X obj 68 46 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; @@ -46,29 +45,30 @@ #X connect 2 0 6 0; #X connect 3 0 5 0; #X connect 4 0 3 0; -#X restore 423 349 pd init; -#X text 40 470 low-pass filters, f 8; -#X text 33 245 signal to analyze, f 9; -#X connect 1 0 8 0; -#X connect 1 0 9 0; -#X connect 2 0 4 0; -#X connect 2 0 6 0; -#X connect 3 0 2 0; +#X restore 423 356 pd init; +#X text 40 477 low-pass filters, f 8; +#X text 33 252 signal to analyze, f 9; +#X obj 77 18 cnv 5 5 25 empty empty Measuring\ Spectra\ With\ Heterodyning 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 7 0; +#X connect 0 0 8 0; +#X connect 1 0 3 0; +#X connect 1 0 5 0; +#X connect 2 0 1 0; +#X connect 3 0 7 1; #X connect 4 0 8 1; -#X connect 5 0 9 1; -#X connect 6 0 5 0; -#X connect 7 0 14 0; +#X connect 5 0 4 0; +#X connect 6 0 13 0; +#X connect 7 0 9 0; #X connect 8 0 10 0; -#X connect 9 0 11 0; -#X connect 10 0 7 0; -#X connect 11 0 13 0; -#X connect 12 0 11 1; -#X connect 12 0 10 1; -#X connect 13 0 15 0; -#X connect 14 0 18 0; -#X connect 15 0 18 1; -#X connect 16 0 17 0; -#X connect 17 0 7 0; -#X connect 17 1 13 0; -#X connect 18 0 19 0; -#X connect 27 0 29 0; +#X connect 9 0 6 0; +#X connect 10 0 12 0; +#X connect 11 0 10 1; +#X connect 11 0 9 1; +#X connect 12 0 14 0; +#X connect 13 0 17 0; +#X connect 14 0 17 1; +#X connect 15 0 16 0; +#X connect 16 0 6 0; +#X connect 16 1 12 0; +#X connect 17 0 18 0; +#X connect 26 0 28 0; diff --git a/doc/3.audio.examples/H09.ssb.modulation.pd b/doc/3.audio.examples/H09.ssb.modulation.pd index e4b896e8..52459bdd 100644 --- a/doc/3.audio.examples/H09.ssb.modulation.pd +++ b/doc/3.audio.examples/H09.ssb.modulation.pd @@ -1,17 +1,17 @@ -#N canvas 504 51 545 610 12; +#N canvas 504 51 544 632 12; #X declare -stdpath ./; -#X obj 226 408 cos~; -#X obj 269 390 +~ -0.25; -#X obj 269 413 cos~; -#X obj 151 464 *~; -#X obj 204 464 *~; -#X obj 151 490 -~; -#X floatatom 226 337 5 0 0 0 - - - 0; -#X text 33 374 pair of allpass; -#X text 33 390 filters to make; -#X text 33 406 90 degree phase; -#X text 26 421 shifted versions; -#X text 338 373 cosine and sine waves; +#X obj 245 421 cos~; +#X obj 288 403 +~ -0.25; +#X obj 288 426 cos~; +#X obj 170 477 *~; +#X obj 223 477 *~; +#X obj 170 503 -~; +#X floatatom 245 350 5 0 0 0 - - - 0; +#X text 52 387 pair of allpass; +#X text 52 403 filters to make; +#X text 52 419 90 degree phase; +#X text 45 434 shifted versions; +#X text 357 386 cosine and sine waves; #N canvas 555 154 582 391 bell-loop 0; #X obj 51 150 /; #X obj 51 262 +~ 1; @@ -37,16 +37,16 @@ #X connect 8 0 1 0; #X connect 9 0 8 0; #X connect 10 0 4 0; -#X restore 151 299 pd bell-loop; -#X obj 151 531 output~; -#X obj 226 362 phasor~; -#X text 337 388 to form the real and; -#X text 337 404 imaginary part of a; -#X text 337 421 complex sinusoid; -#X text 41 50 The signal sideband modulator gives you only one sideband for each frequency in the input signal (whereas ring modulation gave both a positive and negative sideband). You can set the shift frequency positive to shift all frequencies upward \, or negative to shift them downwards., f 64; -#X text 41 130 The technique is to filter the input into two versions \, 90 degrees out of phase \, which can be interpreted as the real and imaginary part of a complex signal with positive frequencies only. You can then form the (complex) product of this with a (complex) sinusoid to modulate upward or downward in frequency., f 64; -#X obj 151 399 hilbert~; -#X text 235 465 <-- complex multiplier (calculates real part), f 22; +#X restore 170 312 pd bell-loop; +#X obj 170 544 output~; +#X obj 245 375 phasor~; +#X text 356 401 to form the real and; +#X text 356 417 imaginary part of a; +#X text 356 434 complex sinusoid; +#X text 43 59 The signal sideband modulator gives you only one sideband for each frequency in the input signal (whereas ring modulation gave both a positive and negative sideband). You can set the shift frequency positive to shift all frequencies upward \, or negative to shift them downwards., f 64; +#X text 43 139 The technique is to filter the input into two versions \, 90 degrees out of phase \, which can be interpreted as the real and imaginary part of a complex signal with positive frequencies only. You can then form the (complex) product of this with a (complex) sinusoid to modulate upward or downward in frequency., f 64; +#X obj 170 412 hilbert~; +#X text 254 478 <-- complex multiplier (calculates real part), f 22; #N canvas 711 110 382 287 init 0; #X obj 55 140 soundfiler; #X obj 55 15 loadbang; @@ -61,11 +61,11 @@ #X connect 2 0 5 0; #X connect 3 0 0 0; #X connect 5 0 3 0; -#X restore 416 282 pd init; -#X text 270 337 <-- shift frequency; -#X text 68 19 SINGLE SIDEBAND MODULATION (AKA FREQUENCY SHIFTING); -#X text 41 213 The [hilbert~] object is an abstraction in the 'extra' library. It takes a signal and creates two copies that are 90 degrees out of phase., f 64; -#X text 64 282 sample loop for test signal, f 15; +#X restore 412 294 pd init; +#X text 289 350 <-- shift frequency; +#X text 43 222 The [hilbert~] object is an abstraction in the 'extra' library. It takes a signal and creates two copies that are 90 degrees out of phase., f 64; +#X text 83 295 sample loop for test signal, f 15; +#X obj 36 18 cnv 5 5 25 empty empty Single\ Sideband\ Modulation\ (AKA\ Freq.\ Shifter) 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 3 1; #X connect 1 0 2 0; #X connect 2 0 4 1; diff --git a/doc/3.audio.examples/H10.measurement.pd b/doc/3.audio.examples/H10.measurement.pd index b1efea3c..f640e279 100644 --- a/doc/3.audio.examples/H10.measurement.pd +++ b/doc/3.audio.examples/H10.measurement.pd @@ -1,27 +1,26 @@ -#N canvas 432 96 776 485 12; +#N canvas 432 96 786 474 12; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-amp 100 float 0; #X coords 0 2 99 0 200 140 1 0 0; -#X restore 498 27 graph; +#X restore 520 70 graph; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-phase 100 float 2; #X coords 0 6.283 100 0 200 140 1 0 0; -#X restore 503 228 graph; -#X text 480 84 1; -#X text 479 293 pi; -#X text 472 223 2pi; -#X obj 52 308 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X floatatom 52 372 4 0 0 0 - - - 0; -#X text 480 20 2; -#X text 77 27 MEASURING FILTER FREQUENCY AND PHASE RESPONSE; -#X floatatom 274 318 5 0 10000 0 - \$0-freq - 0; -#X floatatom 283 361 4 0 999 0 - \$0-q - 0; -#X obj 52 337 filter-graph1 100 44100; -#X obj 265 391 bp~; -#X text 83 374 index; -#X text 76 308 <-- compute; -#X text 316 317 <-- center frequency, f 10; -#X text 318 360 <-- "Q"; +#X restore 525 271 graph; +#X text 502 127 1; +#X text 501 336 pi; +#X text 494 266 2pi; +#X obj 69 298 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X floatatom 69 362 4 0 0 0 - - - 0; +#X text 502 63 2; +#X floatatom 291 308 5 0 10000 0 - \$0-freq - 0; +#X floatatom 300 351 4 0 999 0 - \$0-q - 0; +#X obj 69 327 filter-graph1 100 44100; +#X obj 282 381 bp~; +#X text 100 364 index; +#X text 93 298 <-- compute; +#X text 333 307 <-- center frequency, f 10; +#X text 335 350 <-- "Q"; #N canvas 704 433 298 247 init 0; #X obj 47 27 loadbang; #X obj 47 51 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; @@ -32,23 +31,24 @@ #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 2 0 5 0; -#X restore 333 420 pd init; +#X restore 350 410 pd init; #X text 55 71 You can use the [filter-graph1] and [filter-graph2] abstractions as shown to test filters. Connect them as shown with a filter between them. Try varying the parameters and/or substituting other filters., f 51; #X text 55 139 [filter-graph1] takes as arguments the number of points to graph and the frequency range \, while [filter-graph2] takes as arguments the name of a table to hold the (frequency dependent) gain \, and another \, if specified \, for the phase., f 51; #X text 55 225 You can edit this patch to replace [bp~] with any other filter you're curious about., f 51; -#X text 483 355 0; -#X text 495 169 0 Hz; -#X text 678 169 44100 Hz; -#X text 481 156 0; -#X obj 65 429 filter-graph2 \$0-amp \$0-phase; -#X text 495 374 0 Hz; -#X text 678 374 44100 Hz; -#X connect 5 0 11 0; -#X connect 6 0 25 0; -#X connect 9 0 12 1; -#X connect 10 0 12 2; -#X connect 11 0 6 0; -#X connect 11 1 12 0; -#X connect 11 1 25 1; -#X connect 11 2 25 2; -#X connect 12 0 25 3; +#X text 505 398 0; +#X text 517 212 0 Hz; +#X text 700 212 44100 Hz; +#X text 503 199 0; +#X obj 82 419 filter-graph2 \$0-amp \$0-phase; +#X text 517 417 0 Hz; +#X text 700 417 44100 Hz; +#X obj 29 25 cnv 5 5 25 empty empty Measuring\ Filter\ Frequency/Phase\ Response 15 13 0 16 #dfdfdf #202020 0; +#X connect 5 0 10 0; +#X connect 6 0 24 0; +#X connect 8 0 11 1; +#X connect 9 0 11 2; +#X connect 10 0 6 0; +#X connect 10 1 11 0; +#X connect 10 1 24 1; +#X connect 10 2 24 2; +#X connect 11 0 24 3; diff --git a/doc/3.audio.examples/H11.shelving.pd b/doc/3.audio.examples/H11.shelving.pd index f686d202..414006e8 100644 --- a/doc/3.audio.examples/H11.shelving.pd +++ b/doc/3.audio.examples/H11.shelving.pd @@ -8,7 +8,6 @@ #X text 583 343 frequency; #X floatatom 321 300 3 -99 99 0 - \$0-pole - 0; #X text 466 325 gain=0; -#X text 198 21 SHELVING FILTER; #X obj 90 407 filter-graph2 \$0-tab1; #X obj 59 295 filter-graph1 100 22050; #X text 703 339 22050; @@ -37,15 +36,16 @@ #X connect 2 0 5 0; #X restore 328 393 pd init; #X text 106 58 This patch demonstrates using the raw filters \, [rpole~] and [rzero~] (raw \, real-valued one-pole and one-zero filters) \, to make a shelving filter., f 50; -#X connect 1 0 8 0; -#X connect 2 0 7 0; -#X connect 4 0 11 0; -#X connect 8 0 2 0; -#X connect 8 1 7 1; -#X connect 8 1 14 0; -#X connect 8 2 7 2; -#X connect 10 0 7 3; -#X connect 11 0 10 1; -#X connect 12 0 13 0; -#X connect 13 0 14 1; -#X connect 14 0 10 0; +#X obj 77 18 cnv 5 5 25 empty empty Shelving\ Filter 15 13 0 16 #dfdfdf #202020 0; +#X connect 1 0 7 0; +#X connect 2 0 6 0; +#X connect 4 0 10 0; +#X connect 7 0 2 0; +#X connect 7 1 6 1; +#X connect 7 1 13 0; +#X connect 7 2 6 2; +#X connect 9 0 6 3; +#X connect 10 0 9 1; +#X connect 11 0 12 0; +#X connect 12 0 13 1; +#X connect 13 0 9 0; diff --git a/doc/3.audio.examples/H12.peaking.pd b/doc/3.audio.examples/H12.peaking.pd index f0e3b62b..9ff85ed2 100644 --- a/doc/3.audio.examples/H12.peaking.pd +++ b/doc/3.audio.examples/H12.peaking.pd @@ -16,7 +16,6 @@ #X text 591 79 5; #X text 608 389 0; #X text 596 320 1; -#X text 45 9 PEAKING FILTER; #X floatatom 386 303 3 0 180 0 - \$0-pole - 0; #X text 385 281 angle; #X text 420 301 (degrees); @@ -49,36 +48,37 @@ #X restore 352 523 pd init; #X text 28 39 To get a peaking filter \, start with a shelving filter but rotate the pole and zero to the point on the unit circle you want to amplify or attenuate. The [rpole~] and [rzero~] filters are replaced with their complex-valued siblings \, [cpole~] and [czero~]. These filters take a (real \, imaginary) pair to filter and another (real-imaginary) pair to specify the pole or zero. As for [rpole~] and [rzero~] \, the coefficients may change at audio rate., f 75; #X text 28 148 The outputs of [cpole~] and [czero~] are also in the form of a (real and imaginary) pair. Both outlets of [cpole~] are connected to [czero~] in this example \, but then since we want a real-valued filter \, we only take the real part of the (complex) output of [czero~]., f 75; +#X obj 91 8 cnv 5 5 25 empty empty Peaking\ Filter 15 13 0 16 #dfdfdf #202020 0; #X connect 1 0 5 0; #X connect 3 0 8 0; #X connect 6 0 1 0; #X connect 6 1 5 1; -#X connect 6 1 25 0; +#X connect 6 1 24 0; #X connect 6 2 5 2; -#X connect 8 0 22 0; -#X connect 8 0 29 0; +#X connect 8 0 21 0; +#X connect 8 0 28 0; #X connect 9 0 10 0; +#X connect 10 0 29 0; #X connect 10 0 30 0; -#X connect 10 0 31 0; -#X connect 15 0 20 0; -#X connect 18 0 24 0; -#X connect 19 0 23 0; -#X connect 20 0 21 0; -#X connect 21 0 19 0; -#X connect 21 0 18 0; -#X connect 22 0 25 2; -#X connect 23 0 22 0; +#X connect 14 0 19 0; +#X connect 17 0 23 0; +#X connect 18 0 22 0; +#X connect 19 0 20 0; +#X connect 20 0 18 0; +#X connect 20 0 17 0; +#X connect 21 0 24 2; +#X connect 22 0 21 0; +#X connect 22 0 29 0; +#X connect 22 1 21 1; +#X connect 22 1 29 1; +#X connect 23 0 28 0; #X connect 23 0 30 0; -#X connect 23 1 22 1; #X connect 23 1 30 1; -#X connect 24 0 29 0; -#X connect 24 0 31 0; -#X connect 24 1 31 1; -#X connect 24 1 29 1; -#X connect 25 0 26 0; -#X connect 25 1 26 1; -#X connect 26 0 5 3; -#X connect 29 0 25 3; -#X connect 30 0 26 2; -#X connect 31 0 26 3; -#X connect 33 0 6 0; +#X connect 23 1 28 1; +#X connect 24 0 25 0; +#X connect 24 1 25 1; +#X connect 25 0 5 3; +#X connect 28 0 24 3; +#X connect 29 0 25 2; +#X connect 30 0 25 3; +#X connect 32 0 6 0; diff --git a/doc/3.audio.examples/H13.butterworth.pd b/doc/3.audio.examples/H13.butterworth.pd index 586f7dcf..51731fe3 100644 --- a/doc/3.audio.examples/H13.butterworth.pd +++ b/doc/3.audio.examples/H13.butterworth.pd @@ -10,7 +10,6 @@ #X text 487 61 5; #X text 504 371 0; #X text 492 302 1; -#X text 59 22 BUTTERWORTH FILTER; #X obj 241 409 butterworth3~; #X floatatom 263 351 4 0 100 0 - \$0-lf - 0; #X floatatom 310 350 4 85 150 0 - \$0-hf - 0; @@ -34,14 +33,15 @@ #X restore 340 452 pd init; #X text 28 57 The butterworth filter can be configured for low-pass \, high-pass \, and shelving \, depending on the placement of the poles and zeros. For low-pass \, the poles are placed to set the cutoff frequency and the zeros are at -1 (the Nyquist). Leaving the poles fixed and moving the zeros then gives shelving filters. In this example \, the actual filtering is relegated to an abstraction ([butterworth3~]) which takes frequencies corresponding to the pole and zero placement., f 60; #X text 28 184 The [butterworth3~] abstraction computes filter coefficients using control messages \, and so it is not suitable for continuously time-varying Butterworth filters. For that \, it is often appropriate to use time-saving approximations \, but precisely which approximations to use will depend on the way the filter is to be used.; +#X obj 71 19 cnv 5 5 25 empty empty Butterworth\ Filter 15 13 0 16 #dfdfdf #202020 0; #X connect 1 0 4 0; -#X connect 9 0 4 3; +#X connect 8 0 4 3; +#X connect 9 0 11 0; #X connect 10 0 12 0; -#X connect 11 0 13 0; -#X connect 12 0 9 1; -#X connect 13 0 9 2; -#X connect 15 0 1 0; -#X connect 15 1 4 1; -#X connect 15 1 9 0; -#X connect 15 2 4 2; -#X connect 18 0 15 0; +#X connect 11 0 8 1; +#X connect 12 0 8 2; +#X connect 14 0 1 0; +#X connect 14 1 4 1; +#X connect 14 1 8 0; +#X connect 14 2 4 2; +#X connect 17 0 14 0; diff --git a/doc/3.audio.examples/H14.all.pass.pd b/doc/3.audio.examples/H14.all.pass.pd index 15b894ba..876f4fc0 100644 --- a/doc/3.audio.examples/H14.all.pass.pd +++ b/doc/3.audio.examples/H14.all.pass.pd @@ -1,13 +1,12 @@ -#N canvas 296 142 779 445 12; -#X floatatom 63 242 5 0 0 0 - - - 0; -#X obj 63 210 filter-graph1 100 44100; -#X text 50 21 ALL-PASS FILTERS; -#X floatatom 371 261 3 -99 99 0 - \$0-pole - 0; -#X obj 276 281 rpole~; -#X obj 371 284 / 100; -#X obj 276 256 rzero_rev~; -#X text 366 237 pole (%); -#X obj 63 184 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#N canvas 347 132 779 445 12; +#X floatatom 63 262 5 0 0 0 - - - 0; +#X obj 63 230 filter-graph1 100 44100; +#X floatatom 371 281 3 -99 99 0 - \$0-pole - 0; +#X obj 276 301 rpole~; +#X obj 371 304 / 100; +#X obj 276 276 rzero_rev~; +#X text 366 257 pole (%); +#X obj 63 204 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #N canvas 876 177 288 255 init 0; #X obj 71 28 loadbang; #X obj 71 57 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; @@ -18,8 +17,8 @@ #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 2 0 5 0; -#X restore 326 326 pd init; -#X text 40 55 The all-pass filter has a phase response that depends on its coefficient \, and a flat frequency response. The coefficient (p) gives the location of the pole. There is a zero at 1/p \, unless p=0. If p=0 the filter is effectively a one-sample delay. Negative values of p are allowed (as long as p is between -1 and 1)., f 48; +#X restore 326 346 pd init; +#X text 40 75 The all-pass filter has a phase response that depends on its coefficient \, and a flat frequency response. The coefficient (p) gives the location of the pole. There is a zero at 1/p \, unless p=0. If p=0 the filter is effectively a one-sample delay. Negative values of p are allowed (as long as p is between -1 and 1)., f 48; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-amp 100 float 0; #X coords 0 2 99 0 200 140 1 0 0; @@ -38,15 +37,16 @@ #X text 472 167 0; #X text 486 385 0 Hz; #X text 669 385 44100 Hz; -#X obj 76 309 filter-graph2 \$0-amp \$0-phase; -#X connect 0 0 23 0; +#X obj 76 329 filter-graph2 \$0-amp \$0-phase; +#X obj 98 33 cnv 5 5 25 empty empty All-Pass\ Filters 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 22 0; #X connect 1 0 0 0; -#X connect 1 1 6 0; -#X connect 1 1 23 1; -#X connect 1 2 23 2; -#X connect 3 0 5 0; -#X connect 4 0 23 3; -#X connect 5 0 6 1; -#X connect 5 0 4 1; -#X connect 6 0 4 0; -#X connect 8 0 1 0; +#X connect 1 1 5 0; +#X connect 1 1 22 1; +#X connect 1 2 22 2; +#X connect 2 0 4 0; +#X connect 3 0 22 3; +#X connect 4 0 5 1; +#X connect 4 0 3 1; +#X connect 5 0 3 0; +#X connect 7 0 1 0; diff --git a/doc/3.audio.examples/H15.phaser.pd b/doc/3.audio.examples/H15.phaser.pd index 6444170a..2ff0c8d3 100644 --- a/doc/3.audio.examples/H15.phaser.pd +++ b/doc/3.audio.examples/H15.phaser.pd @@ -1,6 +1,5 @@ -#N canvas 567 38 602 647 12; +#N canvas 567 38 601 669 12; #X declare -stdpath ./; -#X text 37 20 PHASER; #N canvas 411 147 659 385 chord 0; #X obj 82 99 -~ 0.5; #X obj 82 153 clip~ -0.5 0.5; @@ -48,39 +47,40 @@ #X connect 20 0 11 0; #X connect 21 0 15 0; #X connect 23 0 4 0; -#X restore 67 288 pd chord; -#X obj 66 560 output~; -#X obj 84 352 rpole~; -#X obj 84 327 rzero_rev~; -#X obj 84 401 rpole~; -#X obj 84 376 rzero_rev~; -#X obj 84 449 rpole~; -#X obj 84 424 rzero_rev~; -#X obj 84 498 rpole~; -#X obj 84 473 rzero_rev~; -#X obj 66 528 +~; -#X obj 238 444 phasor~ 0.3; -#X obj 238 476 expr~ 1 - 0.03 - 0.6*abs($v1-0.5)*abs($v1-0.5); -#X text 31 172 Many variations of this have been used. A more pronounced effect can be got by using 12 all-pass filters and adding the outputs of the 4th \, 8th \, and 12th one to the original. Various stereo configurations are possible. Some designers have used 6 instead of the 4 stages used here. Controls are often added to set the frequency of sweeping and the range of the all-pass coefficients., f 66; -#X obj 382 301 declare -stdpath ./; -#X text 31 47 The phaser ranks \, along with fuzz and wah-wah \, as one of the great guitar pedals. A phaser adds an all-pass filtered copy of a signal to the original \, causing phase reinforcement and cancellation at frequencies that depend on the all-pass coefficients. In this example the coefficients range from 0.88 to 0.98 \, controlled by a [phasor~] object (no relation). The [phasor~] is converted to a triangle wave (abs($v1-0.5)) and then nonlinearly mapped into a suitable range., f 66; -#X connect 1 0 4 0; -#X connect 1 0 11 0; -#X connect 3 0 6 0; -#X connect 4 0 3 0; -#X connect 5 0 8 0; -#X connect 6 0 5 0; -#X connect 7 0 10 0; -#X connect 8 0 7 0; -#X connect 9 0 11 1; -#X connect 10 0 9 0; -#X connect 11 0 2 0; -#X connect 12 0 13 0; -#X connect 13 0 4 1; -#X connect 13 0 3 1; -#X connect 13 0 6 1; -#X connect 13 0 5 1; -#X connect 13 0 8 1; -#X connect 13 0 7 1; -#X connect 13 0 10 1; -#X connect 13 0 9 1; +#X restore 80 304 pd chord; +#X obj 79 576 output~; +#X obj 97 368 rpole~; +#X obj 97 343 rzero_rev~; +#X obj 97 417 rpole~; +#X obj 97 392 rzero_rev~; +#X obj 97 465 rpole~; +#X obj 97 440 rzero_rev~; +#X obj 97 514 rpole~; +#X obj 97 489 rzero_rev~; +#X obj 79 544 +~; +#X obj 251 460 phasor~ 0.3; +#X obj 251 492 expr~ 1 - 0.03 - 0.6*abs($v1-0.5)*abs($v1-0.5); +#X text 44 188 Many variations of this have been used. A more pronounced effect can be got by using 12 all-pass filters and adding the outputs of the 4th \, 8th \, and 12th one to the original. Various stereo configurations are possible. Some designers have used 6 instead of the 4 stages used here. Controls are often added to set the frequency of sweeping and the range of the all-pass coefficients., f 66; +#X obj 395 317 declare -stdpath ./; +#X text 44 63 The phaser ranks \, along with fuzz and wah-wah \, as one of the great guitar pedals. A phaser adds an all-pass filtered copy of a signal to the original \, causing phase reinforcement and cancellation at frequencies that depend on the all-pass coefficients. In this example the coefficients range from 0.88 to 0.98 \, controlled by a [phasor~] object (no relation). The [phasor~] is converted to a triangle wave (abs($v1-0.5)) and then nonlinearly mapped into a suitable range., f 66; +#X obj 91 16 cnv 5 5 25 empty empty Phaser 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 3 0; +#X connect 0 0 10 0; +#X connect 2 0 5 0; +#X connect 3 0 2 0; +#X connect 4 0 7 0; +#X connect 5 0 4 0; +#X connect 6 0 9 0; +#X connect 7 0 6 0; +#X connect 8 0 10 1; +#X connect 9 0 8 0; +#X connect 10 0 1 0; +#X connect 11 0 12 0; +#X connect 12 0 3 1; +#X connect 12 0 2 1; +#X connect 12 0 5 1; +#X connect 12 0 4 1; +#X connect 12 0 7 1; +#X connect 12 0 6 1; +#X connect 12 0 9 1; +#X connect 12 0 8 1; diff --git a/doc/3.audio.examples/H16.adsr.filter.qlist.pd b/doc/3.audio.examples/H16.adsr.filter.qlist.pd index e60b7575..afa4b337 100644 --- a/doc/3.audio.examples/H16.adsr.filter.qlist.pd +++ b/doc/3.audio.examples/H16.adsr.filter.qlist.pd @@ -96,9 +96,9 @@ #X connect 1 0 3 0; #X restore 95 614 pd init; #X obj 30 338 adsr, f 16; -#X text 323 17 ANALOG STYLE SYNTH USING QLIST; #X obj 398 532 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X text 425 533 start; +#X obj 263 13 cnv 5 5 25 empty empty Analog\ Style\ Using\ [qlist] 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 82 0; #X connect 1 0 45 0; #X connect 2 0 3 0; @@ -160,7 +160,7 @@ #X connect 56 0 53 1; #X connect 62 0 20 0; #X connect 64 0 68 0; -#X connect 66 0 84 0; +#X connect 66 0 83 0; #X connect 69 0 68 0; #X connect 70 0 68 0; #X connect 71 0 72 0; @@ -168,4 +168,4 @@ #X connect 74 0 21 0; #X connect 80 0 55 0; #X connect 82 0 2 0; -#X connect 84 0 64 0; +#X connect 83 0 64 0; diff --git a/doc/3.audio.examples/I01.Fourier.analysis.pd b/doc/3.audio.examples/I01.Fourier.analysis.pd index 1d2c85c4..39f4780b 100644 --- a/doc/3.audio.examples/I01.Fourier.analysis.pd +++ b/doc/3.audio.examples/I01.Fourier.analysis.pd @@ -1,48 +1,47 @@ -#N canvas 492 38 714 719 12; -#X floatatom 60 295 7 0 0 0 - - - 0; +#N canvas 492 38 722 748 12; +#X floatatom 57 315 7 0 0 0 - - - 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-real 64 float 2; #X coords 0 64 64 -64 256 200 1; -#X restore 422 216 graph; -#X floatatom 60 195 5 0 32 0 - - - 0; -#X obj 92 267 samplerate~; -#X obj 60 242 t f b; -#X obj 60 267 *; -#X obj 97 616 metro 250; -#X obj 59 685 tabwrite~ \$0-real; -#X obj 84 662 tabwrite~ \$0-imaginary; -#X obj 59 424 osc~; +#X restore 419 236 graph; +#X floatatom 57 215 5 0 32 0 - - - 0; +#X obj 89 287 samplerate~; +#X obj 57 262 t f b; +#X obj 57 287 *; +#X obj 94 636 metro 250; +#X obj 56 705 tabwrite~ \$0-real; +#X obj 81 682 tabwrite~ \$0-imaginary; +#X obj 56 444 osc~; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-imaginary 64 float 2; #X coords 0 64 64 -64 256 200 1; -#X restore 422 449 graph; -#X obj 84 400 f; -#X floatatom 102 351 5 0 100 0 - - - 0; -#X obj 102 375 / 100; -#X obj 60 218 / 64; -#X text 603 197 real part; -#X text 569 430 imaginary part; -#X obj 97 583 loadbang; -#X obj 103 639 s \$0-snap; -#X obj 84 322 r \$0-snap; -#X text 49 54 ANALYSIS; -#X text 50 36 FOURIER; -#X msg 60 106 0; -#X msg 68 131 10; -#X msg 75 154 10.5; -#X text 115 403 sync phase with snapshots; -#X obj 59 456 fft~; -#X text 163 12 The [fft~] object has separate inlets for the real and imaginary parts of a complex-valued signal and outputs its Fourier transform \, again using separate outlets for the real and imaginary part. The transform is done on one block of samples (here the block size is 64 \, Pd's default.) The outputs give the complex amplitudes of the harmonics of the input signal \, from DC up. The harmonics are tuned to the fundamental frequency of the analysis \, 1/64th of the sample rate. If the frequency (in harmonics) is an integer \, the result is two harmonics symmetric about the Nyquist frequency. Fractional frequencies spill across harmonics. Changing the initial phase rotates energy from real to imaginary and back., f 67; -#X obj 238 572 ../5.reference/set-dsp-tgl; -#X text 269 575 DSP on/off; -#X msg 238 607 \; pd dsp \$1; -#X text 103 195 <-- frequency (as multiple of SR/64 \, the fundamental), f 26; -#X text 117 295 <-- frequency \, Hz.; -#X text 147 350 <--; -#X text 174 349 phase in hundredths of a cycle, f 10; -#X text 156 322 bang-on-snapshot from below; -#X text 100 457 [fft~] computes the Fourier transform \, given the real and imaginary part of a complex-valued signal. Here the imaginary part is zero (the input is real-valued). The output is a (real \, imaginary) pair for each frequency from 0 to 63 (in units of SR/64)., f 41; -#X text 249 668 real and imaginary outputs are graphed separately., f 27; +#X restore 419 469 graph; +#X obj 81 420 f; +#X floatatom 99 371 5 0 100 0 - - - 0; +#X obj 99 395 / 100; +#X obj 57 238 / 64; +#X text 600 217 real part; +#X text 566 450 imaginary part; +#X obj 94 603 loadbang; +#X obj 100 659 s \$0-snap; +#X obj 81 342 r \$0-snap; +#X msg 57 126 0; +#X msg 65 151 10; +#X msg 72 174 10.5; +#X text 112 423 sync phase with snapshots; +#X obj 56 476 fft~; +#X text 140 60 The [fft~] object has separate inlets for the real and imaginary parts of a complex-valued signal and outputs its Fourier transform \, again using separate outlets for the real and imaginary part. The transform is done on one block of samples (here the block size is 64 \, Pd's default.) The outputs give the complex amplitudes of the harmonics of the input signal \, from DC up. The harmonics are tuned to the fundamental frequency of the analysis \, 1/64th of the sample rate. If the frequency (in harmonics) is an integer \, the result is two harmonics symmetric about the Nyquist frequency. Fractional frequencies spill across harmonics. Changing the initial phase rotates energy from real to imaginary and back., f 81; +#X obj 235 592 ../5.reference/set-dsp-tgl; +#X text 266 595 DSP on/off; +#X msg 235 627 \; pd dsp \$1; +#X text 100 215 <-- frequency (as multiple of SR/64 \, the fundamental), f 26; +#X text 114 315 <-- frequency \, Hz.; +#X text 144 370 <--; +#X text 171 369 phase in hundredths of a cycle, f 10; +#X text 153 342 bang-on-snapshot from below; +#X text 97 477 [fft~] computes the Fourier transform \, given the real and imaginary part of a complex-valued signal. Here the imaginary part is zero (the input is real-valued). The output is a (real \, imaginary) pair for each frequency from 0 to 63 (in units of SR/64)., f 41; +#X text 246 688 real and imaginary outputs are graphed separately., f 27; +#X obj 85 21 cnv 5 5 25 empty empty Fourier\ Analysis 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 9 0; #X connect 2 0 14 0; #X connect 3 0 5 1; @@ -52,16 +51,16 @@ #X connect 6 0 7 0; #X connect 6 0 8 0; #X connect 6 0 18 0; -#X connect 9 0 26 0; +#X connect 9 0 24 0; #X connect 11 0 9 1; #X connect 12 0 13 0; #X connect 13 0 11 1; #X connect 14 0 4 0; #X connect 17 0 6 0; #X connect 19 0 11 0; +#X connect 20 0 2 0; +#X connect 21 0 2 0; #X connect 22 0 2 0; -#X connect 23 0 2 0; -#X connect 24 0 2 0; -#X connect 26 0 7 0; -#X connect 26 1 8 0; -#X connect 28 0 30 0; +#X connect 24 0 7 0; +#X connect 24 1 8 0; +#X connect 26 0 28 0; diff --git a/doc/3.audio.examples/I02.Hann.window.pd b/doc/3.audio.examples/I02.Hann.window.pd index 456c3cb9..6d0502d1 100644 --- a/doc/3.audio.examples/I02.Hann.window.pd +++ b/doc/3.audio.examples/I02.Hann.window.pd @@ -33,58 +33,58 @@ #X connect 9 0 17 0; #X connect 11 0 6 0; #X connect 17 0 7 0; -#X restore 33 298 pd fft-analysis; +#X restore 33 303 pd fft-analysis; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-magnitude 256 float 0; #X coords 0 256 255 0 256 100 1; -#X restore 279 208 graph; -#X text 118 15 WINDOWING AND BLOCKING FOURIER TRANSFORMS; -#X obj 33 266 osc~; -#X floatatom 33 237 9 0 0 0 - - - 0; -#X text 437 186 magnitude; -#X text 276 311 0; -#X text 514 311 255; -#X text 265 297 0; -#X text 247 253 128; -#X text 246 203 256; +#X restore 279 213 graph; +#X obj 33 271 osc~; +#X floatatom 33 242 9 0 0 0 - - - 0; +#X text 437 191 magnitude; +#X text 276 316 0; +#X text 514 316 255; +#X text 265 302 0; +#X text 247 258 128; +#X text 246 208 256; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 512 float 1; #A 0 0 3.76403e-05 0.000150591 0.000338793 0.000602275 0.000940949 0.00135478 0.00184369 0.00240764 0.00304651 0.00376022 0.00454867 0.00541174 0.0063493 0.00736117 0.00844723 0.00960734 0.0108413 0.0121489 0.01353 0.0149843 0.0165117 0.0181119 0.0197847 0.0215298 0.0233469 0.0252359 0.0271963 0.0292279 0.0313304 0.0335035 0.0357469 0.0380601 0.040443 0.042895 0.0454159 0.0480052 0.0506626 0.0533877 0.05618 0.0590392 0.0619648 0.0649563 0.0680134 0.0711355 0.0743222 0.077573 0.0808874 0.0842649 0.0877051 0.0912073 0.0947711 0.0983959 0.102081 0.105826 0.109631 0.113494 0.117416 0.121395 0.125431 0.129524 0.133672 0.137876 0.142134 0.146446 0.150811 0.155229 0.159699 0.16422 0.168792 0.173413 0.178084 0.182803 0.18757 0.192384 0.197244 0.20215 0.2071 0.212095 0.217133 0.222214 0.227337 0.2325 0.237704 0.242948 0.24823 0.25355 0.258907 0.264301 0.26973 0.275194 0.280691 0.286222 0.291785 0.297379 0.303003 0.308658 0.314341 0.320052 0.32579 0.331555 0.337344 0.343159 0.348997 0.354857 0.36074 0.366643 0.372567 0.37851 0.384471 0.390449 0.396444 0.402454 0.40848 0.414519 0.420571 0.426634 0.432709 0.438794 0.444889 0.450991 0.457101 0.463218 0.469339 0.475466 0.481596 0.487729 0.493864 0.5 0.506136 0.512271 0.518404 0.524534 0.53066 0.536782 0.542899 0.549009 0.555111 0.561205 0.56729 0.573365 0.579429 0.585481 0.59152 0.597545 0.603556 0.609551 0.615529 0.62149 0.627433 0.633357 0.63926 0.645143 0.651003 0.656841 0.662656 0.668445 0.67421 0.679948 0.685659 0.691342 0.696997 0.702621 0.708215 0.713778 0.719309 0.724806 0.73027 0.735699 0.741092 0.74645 0.75177 0.757052 0.762295 0.767499 0.772663 0.777786 0.782867 0.787905 0.7929 0.79785 0.802756 0.807616 0.81243 0.817197 0.821916 0.826587 0.831209 0.83578 0.840301 0.844771 0.849189 0.853554 0.857866 0.862124 0.866328 0.870476 0.874569 0.878605 0.882584 0.886506 0.890369 0.894174 0.897919 0.901605 0.905229 0.908793 0.912295 0.915736 0.919113 0.922428 0.925678 0.928865 0.931987 0.935044 0.938036 0.940961 0.94382 0.946613 0.949338 0.951995 0.954585 0.957106 0.959558 0.96194 0.964254 0.966497 0.96867 0.970773 0.972804 0.974765 0.976654 0.978471 0.980216 0.981889 0.983489 0.985016 0.98647 0.987852 0.989159 0.990393 0.991553 0.992639 0.993651 0.994589 0.995452 0.99624 0.996954 0.997593 0.998156 0.998645 0.999059 0.999398 0.999661 0.999849 0.999962 1 0.999962 0.999849 0.999661 0.999398 0.999059 0.998645 0.998156 0.997592 0.996953 0.996239 0.995451 0.994588 0.99365 0.992638 0.991552 0.990392 0.989158 0.987851 0.986469 0.985015 0.983488 0.981887 0.980215 0.978469 0.976652 0.974763 0.972803 0.970771 0.968669 0.966495 0.964252 0.961939 0.959556 0.957104 0.954583 0.951993 0.949336 0.946611 0.943819 0.940959 0.938034 0.935042 0.931985 0.928863 0.925676 0.922425 0.919111 0.915733 0.912293 0.908791 0.905227 0.901602 0.897917 0.894171 0.890367 0.886503 0.882582 0.878602 0.874566 0.870473 0.866325 0.862121 0.857863 0.853551 0.849186 0.844768 0.840298 0.835777 0.831205 0.826584 0.821913 0.817194 0.812427 0.807613 0.802753 0.797847 0.792896 0.787901 0.782863 0.777782 0.77266 0.767496 0.762292 0.757048 0.751766 0.746446 0.741089 0.735695 0.730266 0.724802 0.719305 0.713774 0.708211 0.702617 0.696993 0.691338 0.685655 0.679944 0.674206 0.668441 0.662652 0.656837 0.650999 0.645139 0.639256 0.633353 0.627429 0.621486 0.615525 0.609547 0.603552 0.597541 0.591516 0.585477 0.579425 0.573361 0.567286 0.561201 0.555107 0.549004 0.542895 0.536778 0.530656 0.52453 0.518399 0.512266 0.506132 0.499996 0.49386 0.487725 0.481592 0.475462 0.469335 0.463213 0.457097 0.450987 0.444885 0.43879 0.432705 0.42663 0.420566 0.414515 0.408476 0.40245 0.39644 0.390445 0.384466 0.378505 0.372563 0.366639 0.360736 0.354853 0.348993 0.343155 0.33734 0.331551 0.325786 0.320048 0.314337 0.308654 0.303 0.297375 0.291781 0.286218 0.280687 0.27519 0.269726 0.264297 0.258904 0.253547 0.248226 0.242944 0.237701 0.232497 0.227333 0.222211 0.21713 0.212092 0.207097 0.202146 0.19724 0.19238 0.187566 0.182799 0.17808 0.17341 0.168788 0.164217 0.159696 0.155226 0.150808 0.146443 0.142131 0.137873 0.133669 0.129521 0.125428 0.121392 0.117413 0.113491 0.109628 0.105823 0.102078 0.0983929 0.0947681 0.0912044 0.0877022 0.0842621 0.0808846 0.0775702 0.0743194 0.0711327 0.0680107 0.0649537 0.0619622 0.0590366 0.0561775 0.0533853 0.0506602 0.0480029 0.0454136 0.0428928 0.0404408 0.038058 0.0357448 0.0335015 0.0313284 0.029226 0.0271944 0.025234 0.0233452 0.0215281 0.019783 0.0181104 0.0165102 0.0149829 0.0135286 0.0121476 0.01084 0.00960615 0.0084461 0.0073601 0.00634828 0.00541082 0.00454783 0.00375944 0.00304583 0.00240701 0.00184315 0.00135431 0.000940561 0.000601947 0.000338584 0.000150442 3.75807e-05; #X coords 0 1 511 0 200 120 1; -#X restore 323 380 graph; -#X msg 150 428 0; -#X obj 44 477 osc~; -#X obj 44 429 samplerate~; -#X obj 44 500 *~ -0.5; -#X obj 44 523 +~ 0.5; -#X obj 36 551 tabwrite~ \$0-hann; -#X text 309 372 1; -#X text 302 490 0; -#X text 318 503 0; -#X obj 44 453 / 512; -#X text 428 357 Hann window; -#X text 36 379 recalculate Hann; -#X text 64 394 window table; -#X text 101 278 click here and; -#X text 504 506 511; -#X obj 36 401 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 196 478 ../5.reference/set-dsp-tgl; -#X text 117 482 DSP on/off; -#X msg 196 515 \; pd dsp \$1; -#X text 150 296 <-- see; -#X text 41 50 In this example we use the sub-patch [pd fft-analysis] to re-block the Fourier transform to 512 points. The signal is multiplied by the Hann window function (which is just a raised cosine.) The magnitude \, which is computed in the sub-patch \, is graphed below in this window. The point at 255 corresponds to just below the Nyquist frequency. Phase isn't shown \, and unlike the previous patch we don't control the initial phase of the oscillator. (For fun \, try drawing other window functions with the mouse...), f 68; -#X obj 36 208 hsl 162 19 0 22050 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; -#X text 104 236 Hz.; -#X connect 3 0 0 0; -#X connect 4 0 3 0; -#X connect 12 0 13 1; -#X connect 13 0 15 0; -#X connect 14 0 21 0; +#X restore 323 385 graph; +#X msg 150 433 0; +#X obj 44 482 osc~; +#X obj 44 434 samplerate~; +#X obj 44 505 *~ -0.5; +#X obj 44 528 +~ 0.5; +#X obj 36 556 tabwrite~ \$0-hann; +#X text 309 377 1; +#X text 302 495 0; +#X text 318 508 0; +#X obj 44 458 / 512; +#X text 428 362 Hann window; +#X text 36 384 recalculate Hann; +#X text 64 399 window table; +#X text 101 283 click here and; +#X text 504 511 511; +#X obj 36 406 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 196 483 ../5.reference/set-dsp-tgl; +#X text 117 487 DSP on/off; +#X msg 196 520 \; pd dsp \$1; +#X text 150 301 <-- see; +#X text 41 55 In this example we use the sub-patch [pd fft-analysis] to re-block the Fourier transform to 512 points. The signal is multiplied by the Hann window function (which is just a raised cosine.) The magnitude \, which is computed in the sub-patch \, is graphed below in this window. The point at 255 corresponds to just below the Nyquist frequency. Phase isn't shown \, and unlike the previous patch we don't control the initial phase of the oscillator. (For fun \, try drawing other window functions with the mouse...), f 68; +#X obj 36 213 hsl 162 19 0 22050 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 104 241 Hz.; +#X obj 95 16 cnv 5 5 25 empty empty Windowed\ Fourier\ Transforms 15 13 0 16 #dfdfdf #202020 0; +#X connect 2 0 0 0; +#X connect 3 0 2 0; +#X connect 11 0 12 1; +#X connect 12 0 14 0; +#X connect 13 0 20 0; +#X connect 14 0 15 0; #X connect 15 0 16 0; -#X connect 16 0 17 0; -#X connect 21 0 13 0; -#X connect 27 0 14 0; -#X connect 27 0 12 0; -#X connect 27 0 17 0; -#X connect 28 0 30 0; -#X connect 33 0 4 0; +#X connect 20 0 12 0; +#X connect 26 0 13 0; +#X connect 26 0 11 0; +#X connect 26 0 16 0; +#X connect 27 0 29 0; +#X connect 32 0 3 0; diff --git a/doc/3.audio.examples/I03.resynthesis.pd b/doc/3.audio.examples/I03.resynthesis.pd index 33028e56..18c21179 100644 --- a/doc/3.audio.examples/I03.resynthesis.pd +++ b/doc/3.audio.examples/I03.resynthesis.pd @@ -84,19 +84,19 @@ #X coords 0 1.025 255 -0.025 512 100 1 0 0; #X restore 54 205 graph; #X obj 233 420 s \$0-gain; -#X text 70 32 FOURIER RESYNTHESIS; #X text 38 294 0; #X text 38 195 1; #X text 51 304 0; #X text 548 307 22K; #X text 267 180 GAIN; -#X obj 441 20 declare -stdpath ./; +#X obj 403 27 declare -stdpath ./; #X text 53 68 Using Fourier resynthesis you can take an incoming sound \, operate on its spectrum \, and hear the result. Here we start with white noise and apply a frequency-dependent gain \, which works as a graphic equalizer. There are N/2 = 256 points \, each spaced SR/512 Hz. apart (although their frequency ranges overlap). Open the [pd fft-analysis] subpatch to see the workings., f 73; #X text 291 390 <-- reset gain; #X msg 233 391 const 1; #X text 173 323 Click on the array to draw and change the gains.; #X obj 233 364 loadbang; +#X obj 81 24 cnv 5 5 25 empty empty Fourier\ Resynthesis 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 2 0; #X connect 3 0 0 0; -#X connect 15 0 5 0; -#X connect 17 0 15 0; +#X connect 14 0 5 0; +#X connect 16 0 14 0; diff --git a/doc/3.audio.examples/I04.noisegate.pd b/doc/3.audio.examples/I04.noisegate.pd index 191522b8..bbf570b3 100644 --- a/doc/3.audio.examples/I04.noisegate.pd +++ b/doc/3.audio.examples/I04.noisegate.pd @@ -1,7 +1,7 @@ -#N canvas 496 38 564 552 12; +#N canvas 496 38 564 566 12; #X declare -stdpath ./; -#X floatatom 274 372 4 0 1000 0 - - - 0; -#X floatatom 82 358 6 0 100 0 - - - 0; +#X floatatom 271 388 4 0 1000 0 - - - 0; +#X floatatom 79 374 6 0 100 0 - - - 0; #N canvas 453 53 560 665 fft-analysis 0; #X obj 35 589 *~; #X obj 142 287 *~; @@ -137,7 +137,7 @@ #X connect 31 0 35 0; #X connect 32 0 33 0; #X connect 35 0 32 0; -#X restore 82 422 pd fft-analysis; +#X restore 79 438 pd fft-analysis; #N canvas 580 123 509 564 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 1024 float 0; @@ -190,8 +190,8 @@ #X connect 18 0 19 0; #X connect 18 0 11 0; #X connect 21 0 15 0; -#X restore 354 467 pd hann-window; -#X text 172 334 noise; +#X restore 351 483 pd hann-window; +#X text 169 350 noise; #N canvas 636 235 719 406 insample 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-sample 155944 float 2; @@ -220,14 +220,13 @@ #X connect 12 0 2 0; #X connect 13 0 8 0; #X connect 13 1 7 0; -#X restore 354 445 pd insample; -#X obj 274 397 s mask-level; -#X floatatom 177 358 6 0 100 0 - - - 0; -#X text 275 311 on; -#X text 320 312 off; -#X text 275 295 masking; -#X text 107 12 DENOISER; -#X msg 319 335 0; +#X restore 351 461 pd insample; +#X obj 271 413 s mask-level; +#X floatatom 174 374 6 0 100 0 - - - 0; +#X text 272 327 on; +#X text 317 328 off; +#X text 272 311 masking; +#X msg 316 351 0; #N canvas 228 38 431 582 test-signal 0; #X obj 89 316 line~; #X obj 213 152 r insamprate; @@ -283,27 +282,28 @@ #X connect 23 0 3 0; #X connect 26 0 12 0; #X connect 27 0 26 0; -#X restore 82 387 pd test-signal; -#X text 76 332 sampler; -#X text 416 320 calculate noise mask, f 10; -#X obj 82 459 output~; -#X msg 405 358 \; make-mask 2000; -#X msg 274 334 15; +#X restore 79 403 pd test-signal; +#X text 73 348 sampler; +#X text 413 336 calculate noise mask, f 10; +#X obj 79 475 output~; +#X msg 402 374 \; make-mask 2000; +#X msg 271 350 15; #N canvas 647 275 498 424 mask-table 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-mask 512 float 0; #X coords 0 500 511 0 400 300 1; #X restore 49 96 graph; #X text 108 22 This table is the average power measured in each channel of the spectrum \, presumed to represent the noise floor., f 41; -#X restore 354 489 pd mask-table; -#X text 99 301 amplitudes (dB); -#X obj 396 13 declare -stdpath ./; -#X text 50 47 This patch attempts to scrub the noise floor from a sample in two steps. First using the "make-mask" message (which is caught in the [pd fft-analysis] subpatch) \, you estimate the background spectrum. You would normally do this at a moment when only the background noise is audible. Then \, turn on "masking" (to 15 by default \, but try other values) and the patch will try to clean the background noise out of a signal., f 65; -#X text 50 153 For this demonstration \, you control the amplitudes of a looping sample and a filtered noise source. Normally you'd hit "calculate noise mask" with only the noise turned on \, then turn both the noise and the sampler on \, and also "masking" \, to see if the patch can clean the noise out of the signal. Open the [pd fft-analysis] window to see the algorithm \, or the "insample" window to change samples \, or "mask-table" to see the current mask (the average signal power of the noise to clean out of the signal)., f 65; +#X restore 351 505 pd mask-table; +#X text 96 317 amplitudes (dB); +#X obj 382 23 declare -stdpath ./; +#X text 47 63 This patch attempts to scrub the noise floor from a sample in two steps. First using the "make-mask" message (which is caught in the [pd fft-analysis] subpatch) \, you estimate the background spectrum. You would normally do this at a moment when only the background noise is audible. Then \, turn on "masking" (to 15 by default \, but try other values) and the patch will try to clean the background noise out of a signal., f 65; +#X text 47 169 For this demonstration \, you control the amplitudes of a looping sample and a filtered noise source. Normally you'd hit "calculate noise mask" with only the noise turned on \, then turn both the noise and the sampler on \, and also "masking" \, to see if the patch can clean the noise out of the signal. Open the [pd fft-analysis] window to see the algorithm \, or the "insample" window to change samples \, or "mask-table" to see the current mask (the average signal power of the noise to clean out of the signal)., f 65; +#X obj 65 18 cnv 5 5 25 empty empty Denoiser 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 6 0; -#X connect 1 0 13 0; -#X connect 2 0 16 0; -#X connect 7 0 13 1; -#X connect 12 0 0 0; -#X connect 13 0 2 0; -#X connect 18 0 0 0; +#X connect 1 0 12 0; +#X connect 2 0 15 0; +#X connect 7 0 12 1; +#X connect 11 0 0 0; +#X connect 12 0 2 0; +#X connect 17 0 0 0; diff --git a/doc/3.audio.examples/I05.compressor.pd b/doc/3.audio.examples/I05.compressor.pd index 1dfa9209..65724067 100644 --- a/doc/3.audio.examples/I05.compressor.pd +++ b/doc/3.audio.examples/I05.compressor.pd @@ -1,4 +1,4 @@ -#N canvas 500 65 576 508 12; +#N canvas 678 85 560 493 12; #X declare -stdpath ./; #N canvas 394 108 652 570 fft-analysis 0; #X obj 101 425 *~; @@ -57,8 +57,8 @@ #X connect 25 0 11 0; #X connect 27 0 28 0; #X connect 28 0 29 0; -#X restore 114 294 pd fft-analysis; -#X floatatom 161 196 5 1 200 0 squelch squelch-set squelch 16; +#X restore 89 310 pd fft-analysis; +#X floatatom 136 212 5 1 200 0 squelch squelch-set squelch 16; #N canvas 406 293 420 439 test-signal 0; #X obj 126 276 line~; #X obj 126 369 outlet~; @@ -97,8 +97,8 @@ #X connect 14 0 9 0; #X connect 15 0 2 0; #X connect 16 0 15 0; -#X restore 114 263 pd test-signal; -#X obj 114 327 output~; +#X restore 89 279 pd test-signal; +#X obj 89 343 output~; #N canvas 444 61 780 500 insample 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-sample 155944 float 2; @@ -150,17 +150,16 @@ #X connect 20 0 19 0; #X connect 21 0 20 0; #X connect 23 0 9 0; -#X restore 299 323 pd insample; -#X text 63 61 Here we divide each complex channel in the Fourier analysis by its own magnitude to "flatten" the spectrum. The "squelch" control limits the amplitude boost the algorithm will apply. If infinite \, you'll get a white spectrum. If less \, the louder parts of the spectrum will be flattened but the quieter ones will only be boosted by the squelch value., f 61; -#X text 84 24 DYNAMIC RANGE COMPRESSION BY FOURIER ANALYSIS CHANNEL; -#X floatatom 299 359 8 0 0 0 - - - 0; -#X obj 373 293 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 364 360 sample length \, msec; -#X msg 290 207 ../sound/bell.aiff; -#X msg 299 230 ../sound/voice.wav; -#X msg 307 254 ../sound/voice2.wav; -#X text 448 205 change input sound, f 7; -#X obj 290 179 loadbang; +#X restore 274 339 pd insample; +#X text 58 68 Here we divide each complex channel in the Fourier analysis by its own magnitude to "flatten" the spectrum. The "squelch" control limits the amplitude boost the algorithm will apply. If infinite \, you'll get a white spectrum. If less \, the louder parts of the spectrum will be flattened but the quieter ones will only be boosted by the squelch value., f 61; +#X floatatom 274 375 8 0 0 0 - - - 0; +#X obj 348 309 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 339 376 sample length \, msec; +#X msg 265 223 ../sound/bell.aiff; +#X msg 274 246 ../sound/voice.wav; +#X msg 282 270 ../sound/voice2.wav; +#X text 423 221 change input sound, f 7; +#X obj 265 195 loadbang; #N canvas 580 123 518 506 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 1024 float 0; @@ -206,19 +205,20 @@ #X connect 20 0 5 0; #X connect 20 1 19 0; #X connect 20 2 7 0; -#X restore 322 434 pd hann-window; -#X text 401 296 <-- record 2 seconds, f 10; +#X restore 232 441 pd hann-window; +#X text 376 312 <-- record 2 seconds, f 10; #N canvas 208 188 323 266 init 0; #X obj 60 146 declare -stdpath ./; #X obj 64 61 loadbang; #X msg 64 87 \; squelch-set 10; #X connect 1 0 2 0; -#X restore 457 434 pd init; +#X restore 367 441 pd init; +#X obj 44 22 cnv 5 5 25 empty empty Dynamic\ Range\ Compression\ by\ Fourier\ Analysis 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 3 0; #X connect 2 0 0 0; -#X connect 4 0 7 0; -#X connect 8 0 4 1; +#X connect 4 0 6 0; +#X connect 7 0 4 1; +#X connect 9 0 4 0; #X connect 10 0 4 0; #X connect 11 0 4 0; -#X connect 12 0 4 0; -#X connect 14 0 10 0; +#X connect 13 0 9 0; diff --git a/doc/3.audio.examples/I06.timbre.stamp.pd b/doc/3.audio.examples/I06.timbre.stamp.pd index 9940ed3f..e45fa7b6 100644 --- a/doc/3.audio.examples/I06.timbre.stamp.pd +++ b/doc/3.audio.examples/I06.timbre.stamp.pd @@ -1,4 +1,4 @@ -#N canvas 441 38 631 544 12; +#N canvas 441 38 626 557 12; #X declare -stdpath ./; #N canvas 352 38 545 673 fft-analysis 0; #X obj 92 534 *~; @@ -76,26 +76,26 @@ #X connect 27 0 25 1; #X connect 33 0 17 0; #X connect 34 0 15 1; -#X restore 103 421 pd fft-analysis; -#X text 41 399 filter; -#X text 43 414 input; -#X text 223 415 source; -#X text 224 396 control; -#X floatatom 54 252 4 0 500 0 - squelch-set - 16; -#X obj 54 286 s squelch; -#X obj 103 457 output~; -#X msg 158 240 ../sound/bell.aiff; -#X msg 164 262 ../sound/voice.wav; -#X msg 169 285 ../sound/voice2.wav; -#X obj 158 316 s read-sound1; -#X msg 334 242 ../sound/bell.aiff; -#X msg 341 264 ../sound/voice.wav; -#X msg 347 287 ../sound/voice2.wav; -#X obj 334 317 s read-sound2; -#X text 347 218 control source; -#X text 170 217 filter input; -#X text 246 193 change input sounds; -#X floatatom 433 383 8 0 0 0 - \$0-samp-msec - 0; +#X restore 108 428 pd fft-analysis; +#X text 46 406 filter; +#X text 48 421 input; +#X text 228 422 source; +#X text 229 403 control; +#X floatatom 59 259 4 0 500 0 - squelch-set - 16; +#X obj 59 293 s squelch; +#X obj 108 464 output~; +#X msg 163 247 ../sound/bell.aiff; +#X msg 169 269 ../sound/voice.wav; +#X msg 174 292 ../sound/voice2.wav; +#X obj 163 323 s read-sound1; +#X msg 339 249 ../sound/bell.aiff; +#X msg 346 271 ../sound/voice.wav; +#X msg 352 294 ../sound/voice2.wav; +#X obj 339 324 s read-sound2; +#X text 352 225 control source; +#X text 175 224 filter input; +#X text 251 200 change input sounds; +#X floatatom 438 390 8 0 0 0 - \$0-samp-msec - 0; #N canvas 386 50 626 626 test-signals 0; #X obj 80 481 line~; #X obj 80 561 outlet~; @@ -192,7 +192,7 @@ #X connect 42 0 28 0; #X connect 43 0 3 0; #X connect 44 0 25 0; -#X restore 101 392 pd test-signals; +#X restore 106 399 pd test-signals; #X f 16; #N canvas 388 86 710 358 insample2 0; #N canvas 0 50 450 300 (subpatch) 0; @@ -234,7 +234,7 @@ #X connect 13 0 6 1; #X connect 15 0 9 1; #X connect 18 0 12 0; -#X restore 313 404 pd insample2; +#X restore 318 411 pd insample2; #N canvas 498 195 722 350 insample1 0; #N canvas 0 50 450 300 (subpatch) 0; #X array \$0-sample 155944 float 2; @@ -275,8 +275,8 @@ #X connect 15 0 12 1; #X connect 16 0 9 0; #X connect 18 0 11 0; -#X restore 313 382 pd insample1; -#X floatatom 432 406 8 0 0 0 - \$0-samp2-msec - 0; +#X restore 318 389 pd insample1; +#X floatatom 437 413 8 0 0 0 - \$0-samp2-msec - 0; #N canvas 163 152 567 523 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 1024 float 0; @@ -324,15 +324,15 @@ #X connect 19 0 1 0; #X connect 19 1 4 0; #X connect 19 1 18 0; -#X restore 313 427 pd hann-window; -#X text 495 383 sample lengths \,; -#X text 499 406 msec; -#X text 61 54 This is a Fourier-based "vocoder" (perhaps better called a "timbre stamp") like the one the Convolution brothers use. The "control source" is analyzed to get its spectral envelope \, which is then stamped onto the "filter input" by adjusting the amplitudes of its Fourier transform. The "filter input" is first whitened by the compression algorithm from the previous patch in this series. The best value of "squelch" to use depends critically on what kind of sounds are used for the filter input and the control source., f 67; -#X obj 451 20 declare -stdpath ./; -#X obj 210 365 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 121 365 <- record ->; -#X text 88 17 CORT&ZACK's SECRET; -#X obj 101 366 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X restore 318 434 pd hann-window; +#X text 500 390 sample lengths \,; +#X text 504 413 msec; +#X text 46 71 This is a Fourier-based "vocoder" (perhaps better called a "timbre stamp") like the one the Convolution brothers use. The "control source" is analyzed to get its spectral envelope \, which is then stamped onto the "filter input" by adjusting the amplitudes of its Fourier transform. The "filter input" is first whitened by the compression algorithm from the previous patch in this series. The best value of "squelch" to use depends critically on what kind of sounds are used for the filter input and the control source., f 76; +#X obj 411 28 declare -stdpath ./; +#X obj 215 372 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 126 372 <- record ->; +#X obj 106 373 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 73 23 cnv 5 5 25 empty empty Cort\ &\ Zack's\ Secret 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 7 0; #X connect 5 0 6 0; #X connect 8 0 11 0; @@ -344,4 +344,4 @@ #X connect 20 0 0 0; #X connect 20 1 0 1; #X connect 29 0 20 1; -#X connect 32 0 20 0; +#X connect 31 0 20 0; diff --git a/doc/3.audio.examples/I07.phase.vocoder.pd b/doc/3.audio.examples/I07.phase.vocoder.pd index 28da4420..5ec402cf 100644 --- a/doc/3.audio.examples/I07.phase.vocoder.pd +++ b/doc/3.audio.examples/I07.phase.vocoder.pd @@ -1,8 +1,8 @@ #N canvas 388 38 674 590 12; #X declare -stdpath ./; -#X floatatom 404 307 5 0 0 0 - transpo-set - 0; -#X floatatom 123 347 5 0 0 0 - speed-set - 0; -#X floatatom 30 349 7 0 0 0 - location-set - 0; +#X floatatom 404 317 5 0 0 0 - transpo-set - 0; +#X floatatom 123 357 5 0 0 0 - speed-set - 0; +#X floatatom 30 359 7 0 0 0 - location-set - 0; #N canvas 457 38 740 709 fft-analysis 0; #X obj 54 483 *~; #X obj 21 483 *~; @@ -314,11 +314,11 @@ #X connect 59 0 38 1; #X connect 61 0 20 1; #X connect 61 0 21 1; -#X restore 28 461 pd fft-analysis; -#X obj 404 338 s transpo; -#X text 120 328 hundredths; -#X text 323 322 normal; -#X obj 28 499 output~; +#X restore 28 471 pd fft-analysis; +#X obj 404 348 s transpo; +#X text 120 338 hundredths; +#X text 323 332 normal; +#X obj 28 509 output~; #N canvas 385 188 595 536 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 2048 float 0; @@ -366,7 +366,7 @@ #X connect 19 0 1 0; #X connect 19 1 4 0; #X connect 19 1 18 0; -#X restore 364 532 pd hann-window; +#X restore 364 542 pd hann-window; #N canvas 409 112 743 468 insample 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-sample 62079 float 2; @@ -422,53 +422,53 @@ #X connect 23 0 24 0; #X connect 24 0 9 0; #X connect 25 0 11 0; -#X restore 364 497 pd insample; +#X restore 364 507 pd insample; #X f 12; -#X floatatom 519 491 9 0 0 0 - \$0-samp-msec - 0; -#X msg 172 458 ../sound/bell.aiff; -#X msg 181 481 ../sound/voice.wav; -#X msg 188 505 ../sound/voice2.wav; -#X obj 172 534 s read-sample; -#X obj 405 367 tgl 22 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 30 371 s location; -#X obj 123 371 s speed; -#X obj 208 374 s rewind; -#X msg 286 298 200; -#X msg 294 322 100; -#X msg 301 346 20; -#X text 315 297 contract; -#X text 331 346 expand; -#X obj 405 397 s lock; -#X text 30 294 location; -#X text 27 310 (stops; -#X text 32 325 motion); -#X text 121 312 motion in; -#X text 175 436 read input sound; -#X floatatom 522 440 7 0 0 0 - window-size - 0; -#X msg 533 309 512; -#X msg 539 332 1024; -#X msg 544 355 2048; -#X msg 549 378 4096; -#X obj 533 404 s window-size; -#X text 530 267 window size \,; -#X text 530 282 samples; -#X text 72 270 ------- location controls -------; -#X obj 286 374 s auto; -#X obj 402 273 bng 22 250 50 0 no-detune empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 41 20 PHASE VOCODER FOR TIME STRETCHING AND CONTRACTION; -#X obj 471 18 declare -stdpath ./; -#X obj 208 345 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 364 443 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 445 468 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 444 300 detune in cents, f 8; -#X text 425 275 no detune; -#X text 568 308 <-- set; -#X text 388 443 <-- load file; -#X text 371 469 record -->; -#X text 517 514 sample length in msec, f 13; -#X text 521 460 window size; +#X floatatom 519 501 9 0 0 0 - \$0-samp-msec - 0; +#X msg 172 468 ../sound/bell.aiff; +#X msg 181 491 ../sound/voice.wav; +#X msg 188 515 ../sound/voice2.wav; +#X obj 172 544 s read-sample; +#X obj 405 377 tgl 22 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 30 381 s location; +#X obj 123 381 s speed; +#X obj 208 384 s rewind; +#X msg 286 308 200; +#X msg 294 332 100; +#X msg 301 356 20; +#X text 315 307 contract; +#X text 331 356 expand; +#X obj 405 407 s lock; +#X text 30 304 location; +#X text 27 320 (stops; +#X text 32 335 motion); +#X text 121 322 motion in; +#X text 175 446 read input sound; +#X floatatom 522 450 7 0 0 0 - window-size - 0; +#X msg 533 319 512; +#X msg 539 342 1024; +#X msg 544 365 2048; +#X msg 549 388 4096; +#X obj 533 414 s window-size; +#X text 530 277 window size \,; +#X text 530 292 samples; +#X text 72 280 ------- location controls -------; +#X obj 286 384 s auto; +#X obj 402 283 bng 22 250 50 0 no-detune empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 462 243 declare -stdpath ./; +#X obj 208 355 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 364 453 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 445 478 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 444 310 detune in cents, f 8; +#X text 425 285 no detune; +#X text 568 318 <-- set; +#X text 388 453 <-- load file; +#X text 371 479 record -->; +#X text 517 524 sample length in msec, f 13; +#X text 521 470 window size; #X text 38 54 This patch takes a sound \, analyzes windows in it both for channel magnitude and for phase precession in each channel (compared to another overlapping window). The real-time output recreates the same magnitudes and phase precession \, although the phases themselves are in general different. You can control either the location or its motion (setting location stops motion \, while setting a non-zero motion causes the location to change automatically). "Rewind" goes back to the beginning. You can use different window sizes (use the message boxes - the number box is for readout). The "lock" feature forces phase coherency between neighboring channels \, which makes a more present sound but can add artifacts to the sound. Look into the [pd fft-analysis] subppatch to see the workings., f 82; #X text 38 202 Note: The algorithm was altered and updated in Pd version 0.44 in a way that affected the result., f 82; +#X obj 74 16 cnv 5 5 25 empty empty Phase\ Vocoder\ for\ Time\ Stretching\ and\ Contraction 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 4 0; #X connect 1 0 17 0; #X connect 2 0 16 0; @@ -484,6 +484,6 @@ #X connect 32 0 35 0; #X connect 33 0 35 0; #X connect 34 0 35 0; -#X connect 43 0 18 0; -#X connect 44 0 9 0; -#X connect 45 0 9 1; +#X connect 42 0 18 0; +#X connect 43 0 9 0; +#X connect 44 0 9 1; diff --git a/doc/3.audio.examples/I08.pvoc.reverb.pd b/doc/3.audio.examples/I08.pvoc.reverb.pd index e8a14fbd..4bd2ae48 100644 --- a/doc/3.audio.examples/I08.pvoc.reverb.pd +++ b/doc/3.audio.examples/I08.pvoc.reverb.pd @@ -1,4 +1,4 @@ -#N canvas 514 91 551 460 12; +#N canvas 514 91 550 473 12; #X declare -stdpath ./; #N canvas 359 38 837 719 fft 0; #X obj 63 584 *~; @@ -272,15 +272,14 @@ #X connect 50 0 40 0; #X connect 51 0 46 4; #X connect 56 0 15 0; -#X restore 184 326 pd fft; -#X floatatom 368 255 4 0 1000 0 - revtime-set - 0; -#X floatatom 59 262 6 0 0 0 - - - 0; -#X text 38 11 PIANO REVERB; -#X text 406 255 reverb time; -#X obj 184 361 output~; -#X obj 59 361 output~; -#X text 25 45 This is a phase vocoder acting as a reverberator. The sound is more coherent (less "whispered") than a real room or a standard delay-based reverberator., f 70; -#X text 25 99 The technique is to "punch" the incoming sound into channels where (1) there's a peak \, and (2) the incoming sound drowns out whatever might already be there. If the sound already in any channel is louder than the input the input for that channel is ignored., f 70; +#X restore 184 337 pd fft; +#X floatatom 368 266 4 0 1000 0 - revtime-set - 0; +#X floatatom 59 273 6 0 0 0 - - - 0; +#X text 406 266 reverb time; +#X obj 184 372 output~; +#X obj 59 372 output~; +#X text 25 56 This is a phase vocoder acting as a reverberator. The sound is more coherent (less "whispered") than a real room or a standard delay-based reverberator., f 70; +#X text 25 110 The technique is to "punch" the incoming sound into channels where (1) there's a peak \, and (2) the incoming sound drowns out whatever might already be there. If the sound already in any channel is louder than the input the input for that channel is ignored., f 70; #N canvas 464 229 262 333 test-sound 0; #X obj 46 25 inlet; #X obj 46 145 osc~; @@ -311,13 +310,13 @@ #X connect 10 0 9 0; #X connect 11 0 2 0; #X connect 12 0 13 0; -#X restore 59 289 pd test-sound; -#X obj 368 287 s revtime; -#X text 25 170 For each window \, the amplitude in each channel is propagated by a constant phase increment and multiplied downward by a gain that determines the "reverb time"., f 70; +#X restore 59 300 pd test-sound; +#X obj 368 298 s revtime; +#X text 25 181 For each window \, the amplitude in each channel is propagated by a constant phase increment and multiplied downward by a gain that determines the "reverb time"., f 70; #N canvas 635 123 602 538 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; -#X array \$0-hann 1024 float 0; -#X coords 0 1 1023 0 300 100 1; +#X array \$0-hann 4096 float 0; +#X coords 0 1 4095 0 300 100 1; #X restore 148 395 graph; #X obj 365 185 osc~; #X obj 365 210 *~ -0.5; @@ -361,15 +360,16 @@ #X connect 19 0 1 0; #X connect 19 1 4 0; #X connect 19 1 18 0; -#X restore 366 317 pd hann-window; -#X text 76 425 reverb in; -#X text 184 425 reverb out; -#X obj 336 14 declare -stdpath ./; -#X obj 59 230 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X text 109 261 short tone pitch; -#X connect 0 0 5 0; -#X connect 1 0 10 0; -#X connect 2 0 9 0; -#X connect 9 0 6 0; -#X connect 9 0 0 0; -#X connect 16 0 2 0; +#X restore 366 328 pd hann-window; +#X text 76 436 reverb in; +#X text 184 436 reverb out; +#X obj 369 401 declare -stdpath ./; +#X obj 59 241 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 109 272 short tone pitch; +#X obj 174 14 cnv 5 5 25 empty empty Piano\ Reverb 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 4 0; +#X connect 1 0 9 0; +#X connect 2 0 8 0; +#X connect 8 0 5 0; +#X connect 8 0 0 0; +#X connect 15 0 2 0; diff --git a/doc/3.audio.examples/I09.sheep.from.goats.pd b/doc/3.audio.examples/I09.sheep.from.goats.pd index 1867b5a9..2e3d3967 100644 --- a/doc/3.audio.examples/I09.sheep.from.goats.pd +++ b/doc/3.audio.examples/I09.sheep.from.goats.pd @@ -1,4 +1,4 @@ -#N canvas 495 50 618 619 12; +#N canvas 495 50 618 576 12; #X declare -stdpath ./; #N canvas 447 38 690 818 fft-analysis 0; #X obj 71 702 *~; @@ -160,7 +160,6 @@ #X connect 61 0 59 0; #X restore 59 408 pd fft-analysis; #X floatatom 358 276 6 0 100 0 - - - 0; -#X text 60 12 PITCHED/UNPITCHED SEPARATION; #X obj 59 443 output~; #X floatatom 59 348 5 0 100 0 - - - 0; #X text 103 326 noise; @@ -236,8 +235,8 @@ #X text 64 295 amplitudes (dB); #N canvas 388 86 722 350 insample 0; #N canvas 0 0 450 300 (subpatch) 0; -#X array \$0-sample 62079 float 2; -#X coords 0 1 62079 -1 400 150 1; +#X array \$0-sample 155944 float 2; +#X coords 0 1 155944 -1 400 150 1; #X restore 259 38 graph; #X obj 19 23 r read-sample; #X obj 19 74 unpack s f; @@ -280,8 +279,8 @@ #X msg 250 441 ../sound/voice2.wav; #X text 239 375 change input sound; #X obj 236 468 s read-sample; -#X floatatom 236 523 5 0 0 0 - \$0-samp-msec - 0; -#X text 289 522 sample length \, msec; +#X floatatom 236 523 8 0 0 0 - \$0-samp-msec - 0; +#X text 302 523 sample length \, msec; #X floatatom 236 274 6 0 100 0 - - - 0; #X floatatom 154 348 6 0 100 0 - - - 0; #X text 162 326 osc; @@ -372,18 +371,19 @@ #X connect 19 1 4 0; #X connect 19 1 18 0; #X restore 455 440 pd hann-window; -#X obj 449 13 declare -stdpath ./; -#X connect 0 0 3 0; -#X connect 1 0 29 0; -#X connect 4 0 7 0; -#X connect 6 0 7 1; -#X connect 7 0 0 0; -#X connect 11 0 15 0; -#X connect 12 0 15 0; -#X connect 13 0 15 0; -#X connect 18 0 26 0; -#X connect 19 0 7 2; -#X connect 21 0 24 0; -#X connect 22 0 24 0; -#X connect 23 0 24 0; -#X connect 25 0 24 0; +#X obj 430 17 declare -stdpath ./; +#X obj 74 15 cnv 5 5 25 empty empty Pitch/Unpitched\ Separation 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 2 0; +#X connect 1 0 28 0; +#X connect 3 0 6 0; +#X connect 5 0 6 1; +#X connect 6 0 0 0; +#X connect 10 0 14 0; +#X connect 11 0 14 0; +#X connect 12 0 14 0; +#X connect 17 0 25 0; +#X connect 18 0 6 2; +#X connect 20 0 23 0; +#X connect 21 0 23 0; +#X connect 22 0 23 0; +#X connect 24 0 23 0; diff --git a/doc/3.audio.examples/I10.phase.bash.pd b/doc/3.audio.examples/I10.phase.bash.pd index bdd4a4db..8ebb2ac7 100644 --- a/doc/3.audio.examples/I10.phase.bash.pd +++ b/doc/3.audio.examples/I10.phase.bash.pd @@ -1,6 +1,6 @@ #N canvas 479 38 802 610 12; #X declare -stdpath ./; -#X floatatom 468 293 4 0 0 0 - - - 0; +#X floatatom 468 299 4 0 0 0 - - - 0; #N canvas 293 108 791 659 fft 0; #X obj 98 224 *~; #X obj 66 224 *~; @@ -87,21 +87,20 @@ #X connect 33 0 34 0; #X connect 34 0 28 0; #X connect 42 0 5 0; -#X restore 99 461 pd fft; -#X floatatom 641 353 3 0 120 0 - pitch-set - 0; -#X floatatom 638 296 4 0 0 0 - specshift-set - 0; -#X obj 638 319 s specshift; -#X obj 468 400 s loco; -#X obj 641 376 s pitch; -#X obj 397 489 output~; -#X text 61 22 PHASE BASHING; -#X floatatom 260 347 8 0 0 0 - \$0-samp-msec - 0; -#X text 258 365 sample length \, msec; -#X msg 259 249 ../sound/bell.aiff; -#X msg 265 271 ../sound/voice.wav; -#X msg 271 293 ../sound/voice2.wav; -#X text 262 227 change input sound; -#X obj 259 322 s read-sample; +#X restore 99 467 pd fft; +#X floatatom 641 359 3 0 120 0 - pitch-set - 0; +#X floatatom 638 302 4 0 0 0 - specshift-set - 0; +#X obj 638 325 s specshift; +#X obj 468 406 s loco; +#X obj 641 382 s pitch; +#X obj 397 495 output~; +#X floatatom 260 353 8 0 0 0 - \$0-samp-msec - 0; +#X text 258 371 sample length \, msec; +#X msg 259 255 ../sound/bell.aiff; +#X msg 265 277 ../sound/voice.wav; +#X msg 271 299 ../sound/voice2.wav; +#X text 262 233 change input sound; +#X obj 259 328 s read-sample; #N canvas 331 87 488 425 test-signal 0; #X obj 50 247 line~; #X obj 50 167 f; @@ -156,7 +155,7 @@ #X connect 21 0 20 0; #X connect 24 0 5 0; #X connect 24 1 6 0; -#X restore 99 433 pd test-signal; +#X restore 99 439 pd test-signal; #N canvas 248 155 565 454 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 1024 float 0; @@ -204,12 +203,12 @@ #X connect 19 0 1 0; #X connect 19 1 4 0; #X connect 19 1 18 0; -#X restore 272 413 pd hann-window; -#X msg 79 235 512; -#X msg 85 256 1024; -#X msg 91 278 2048; -#X obj 79 325 s window-size; -#X msg 96 300 4096; +#X restore 272 419 pd hann-window; +#X msg 79 241 512; +#X msg 85 262 1024; +#X msg 91 284 2048; +#X obj 79 331 s window-size; +#X msg 96 306 4096; #N canvas 649 60 717 500 insample 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-sample 62079 float 2; @@ -259,17 +258,17 @@ #X connect 19 0 21 0; #X connect 20 0 19 0; #X connect 22 0 12 0; -#X restore 272 436 pd insample; -#X text 108 366 ---analyze---; -#X text 92 385 sample; -#X obj 138 493 tabwrite~ \$0-nophase; -#X obj 99 525 output~; -#X msg 476 341 0 \, 400 4000; -#X msg 481 368 0 \, 400 10000; -#X text 55 55 This patch takes an incoming sound \, does an overlap-2 FFT analysis of it \, and bashes the phases of the spectra so that when regenerated the components will all have zero phase at the middle of each window. You can use the windows as waveforms and cross-fade them at will without getting phase modulation. This might be useful for making synthetic instruments that mimic the spectral variation of recorded sounds., f 46; -#X text 564 333 normal speed, f 6; -#X text 574 367 slow; -#X text 509 228 ------ playback -------; +#X restore 272 442 pd insample; +#X text 108 372 ---analyze---; +#X text 92 391 sample; +#X obj 138 499 tabwrite~ \$0-nophase; +#X obj 99 531 output~; +#X msg 476 347 0 \, 400 4000; +#X msg 481 374 0 \, 400 10000; +#X text 55 61 This patch takes an incoming sound \, does an overlap-2 FFT analysis of it \, and bashes the phases of the spectra so that when regenerated the components will all have zero phase at the middle of each window. You can use the windows as waveforms and cross-fade them at will without getting phase modulation. This might be useful for making synthetic instruments that mimic the spectral variation of recorded sounds., f 46; +#X text 564 339 normal speed, f 6; +#X text 574 373 slow; +#X text 509 234 ------ playback -------; #N canvas 226 38 923 890 playback 0; #X obj 170 619 r invblk; #X obj 71 646 *~; @@ -490,39 +489,40 @@ #X connect 102 0 86 0; #X connect 102 1 23 1; #X connect 109 0 28 0; -#X restore 397 451 pd playback; -#X text 681 289 octave); -#X text 181 384 live; -#X text 400 58 You can save the analyses and needn't be running the FFT patch to do the resynthesis. You can read a sample \, select window size \, and press "sample" to analyze it \, or else analyze a "live" input. You'll hear the phase-bashed sample as the analysis runs. You can regenerate the sound with specified pitch \, sample location \, and spectral shift \, using the "playback" controls., f 44; -#X text 137 242 analysis; -#X text 134 228 (redo; -#X text 137 258 after; -#X text 138 273 changing; -#X text 138 289 window; -#X text 139 303 size); -#X obj 578 17 declare -stdpath ./; -#X obj 468 316 pack f 100; -#X obj 194 404 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 99 403 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 632 259 spectral shift (hundredths of, f 14; -#X text 462 255 location in sample (hundredths of sec), f 19; -#X connect 0 0 45 0; +#X restore 397 457 pd playback; +#X text 681 295 octave); +#X text 181 390 live; +#X text 400 64 You can save the analyses and needn't be running the FFT patch to do the resynthesis. You can read a sample \, select window size \, and press "sample" to analyze it \, or else analyze a "live" input. You'll hear the phase-bashed sample as the analysis runs. You can regenerate the sound with specified pitch \, sample location \, and spectral shift \, using the "playback" controls., f 44; +#X text 137 248 analysis; +#X text 134 234 (redo; +#X text 137 264 after; +#X text 138 279 changing; +#X text 138 295 window; +#X text 139 309 size); +#X obj 579 512 declare -stdpath ./; +#X obj 468 322 pack f 100; +#X obj 194 410 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 99 409 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 632 265 spectral shift (hundredths of, f 14; +#X text 462 261 location in sample (hundredths of sec), f 19; +#X obj 131 20 cnv 5 5 25 empty empty Phase\ Bashing 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 44 0; +#X connect 1 0 25 0; #X connect 1 0 26 0; -#X connect 1 0 27 0; -#X connect 1 1 26 0; +#X connect 1 1 25 0; #X connect 2 0 6 0; #X connect 3 0 4 0; -#X connect 11 0 15 0; -#X connect 12 0 15 0; -#X connect 13 0 15 0; -#X connect 16 0 1 0; -#X connect 18 0 21 0; -#X connect 19 0 21 0; -#X connect 20 0 21 0; -#X connect 22 0 21 0; +#X connect 10 0 14 0; +#X connect 11 0 14 0; +#X connect 12 0 14 0; +#X connect 15 0 1 0; +#X connect 17 0 20 0; +#X connect 18 0 20 0; +#X connect 19 0 20 0; +#X connect 21 0 20 0; +#X connect 27 0 5 0; #X connect 28 0 5 0; -#X connect 29 0 5 0; -#X connect 34 0 7 0; -#X connect 45 0 5 0; -#X connect 46 0 16 1; -#X connect 47 0 16 0; +#X connect 33 0 7 0; +#X connect 44 0 5 0; +#X connect 45 0 15 1; +#X connect 46 0 15 0; diff --git a/doc/3.audio.examples/J01.even.odd.pd b/doc/3.audio.examples/J01.even.odd.pd index 21fd1dfa..440e3431 100644 --- a/doc/3.audio.examples/J01.even.odd.pd +++ b/doc/3.audio.examples/J01.even.odd.pd @@ -29,13 +29,13 @@ #X obj 381 215 tabwrite~ \$0-phasor; #X text 38 550 This is a classic technique for gaining separate control over the even and odd harmonics in a synthetic sound. It can also be used conceptually to understand the harmonic content of a square wave in terms of that of a sawtooth \, or vice versa., f 66; #X text 27 198 180 degree out of phase sawtooth form the sum and difference, f 13; -#X text 32 22 SPLITTING A SAWTOOTH WAVE INTO EVEN AND ODD HARMONICS; #X obj 664 35 declare -stdpath ./; #X obj 345 139 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X text 368 138 <-- click to graph; #X text 257 410 output level for sum, f 12; #X text 272 331 output level for difference, f 14; #X text 38 484 This patch splits a sawtooth wave into its even and odd harmonics. The [wrap~] object is used to make the phased copy. Adding and subtracting this to and from the original gives the results shown and heard. (Listen to the two outputs separately \, then together.), f 66; +#X obj 48 17 cnv 5 5 25 empty empty Splitting\ a\ Sawtooth\ Wave\ into\ Even\ &\ Odd\ Harmonics 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 3 0; #X connect 2 0 0 0; #X connect 2 0 12 0; @@ -48,7 +48,7 @@ #X connect 12 0 16 0; #X connect 13 0 8 1; #X connect 13 0 15 0; -#X connect 22 0 14 0; -#X connect 22 0 15 0; -#X connect 22 0 16 0; -#X connect 22 0 17 0; +#X connect 21 0 14 0; +#X connect 21 0 15 0; +#X connect 21 0 16 0; +#X connect 21 0 17 0; diff --git a/doc/3.audio.examples/J02.trapezoids.pd b/doc/3.audio.examples/J02.trapezoids.pd index 01c5de6b..1603b690 100644 --- a/doc/3.audio.examples/J02.trapezoids.pd +++ b/doc/3.audio.examples/J02.trapezoids.pd @@ -1,47 +1,47 @@ -#N canvas 553 38 751 702 12; +#N canvas 553 38 697 713 12; #X declare -stdpath ./; -#X obj 132 178 wrap~; -#X obj 132 207 -~ 0.5; +#X obj 125 195 wrap~; +#X obj 125 224 -~ 0.5; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-sum 882 float 0; #X coords 0 1.02 881 -1.02 200 130 1; -#X restore 414 304 graph; -#X text 429 444 ---- 0.02 seconds ----; -#X obj 188 454 output~; -#X obj 238 417 tabwrite~ \$0-sum; -#X obj 132 150 -~; -#X obj 150 101 / 100; -#X floatatom 150 75 4 -100 100 0 - - - 0; -#X obj 150 264 / 100; -#X floatatom 150 238 4 -100 100 0 - - - 0; -#X obj 132 291 *~; -#X obj 204 178 wrap~; -#X obj 204 207 -~ 0.5; -#X obj 204 150 -~; -#X obj 222 102 / 100; -#X floatatom 222 76 4 -100 100 0 - - - 0; -#X obj 222 264 / 100; -#X floatatom 222 238 4 -100 100 0 - - - 0; -#X obj 204 292 *~; -#X obj 275 178 wrap~; -#X obj 275 207 -~ 0.5; -#X obj 275 150 -~; -#X obj 293 103 / 100; -#X floatatom 293 77 4 -100 100 0 - - - 0; -#X obj 293 264 / 100; -#X floatatom 293 238 4 -100 100 0 - - - 0; -#X obj 275 293 *~; -#X text 155 49 -- PHASES (percent) --; -#X text 330 238 AMPLITUDES (percent); -#X obj 186 328 +~; -#X obj 187 354 +~; -#X obj 238 354 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 44 96 phasor~ 88.2; -#X obj 238 381 metro 193; -#X text 37 606 If the amplitudes sum to zero (with negative ones to balance positive ones) \, the slope of each linear segment becomes zero. Otherwise \, the segments have just enough slope to make up for the three jumps and get to the same starting value after each cycle.; -#X text 37 538 Here we combine three sawtooth waves with controllable relative phases and amplitudes (in percent \, between -100 and 100.) Each sawtooth wave gives rise to one jump (upward or downward) per cycle.; -#X text 38 13 MAKING TRAPEZOIDAL WAVES FROM SAWTOOTH WAVES; -#X obj 514 31 declare -stdpath ./; +#X restore 407 321 graph; +#X text 422 461 ---- 0.02 seconds ----; +#X obj 181 471 output~; +#X obj 231 434 tabwrite~ \$0-sum; +#X obj 125 167 -~; +#X obj 143 118 / 100; +#X floatatom 143 92 4 -100 100 0 - - - 0; +#X obj 143 281 / 100; +#X floatatom 143 255 4 -100 100 0 - - - 0; +#X obj 125 308 *~; +#X obj 197 195 wrap~; +#X obj 197 224 -~ 0.5; +#X obj 197 167 -~; +#X obj 215 119 / 100; +#X floatatom 215 93 4 -100 100 0 - - - 0; +#X obj 215 281 / 100; +#X floatatom 215 255 4 -100 100 0 - - - 0; +#X obj 197 309 *~; +#X obj 268 195 wrap~; +#X obj 268 224 -~ 0.5; +#X obj 268 167 -~; +#X obj 286 120 / 100; +#X floatatom 286 94 4 -100 100 0 - - - 0; +#X obj 286 281 / 100; +#X floatatom 286 255 4 -100 100 0 - - - 0; +#X obj 268 310 *~; +#X text 148 66 -- PHASES (percent) --; +#X text 323 255 AMPLITUDES (percent); +#X obj 179 345 +~; +#X obj 180 371 +~; +#X obj 231 371 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 37 113 phasor~ 88.2; +#X obj 231 398 metro 193; +#X text 84 621 If the amplitudes sum to zero (with negative ones to balance positive ones) \, the slope of each linear segment becomes zero. Otherwise \, the segments have just enough slope to make up for the three jumps and get to the same starting value after each cycle., f 70; +#X text 84 569 Here we combine three sawtooth waves with controllable relative phases and amplitudes (in percent \, between -100 and 100.) Each sawtooth wave gives rise to one jump (upward or downward) per cycle., f 70; +#X obj 426 163 declare -stdpath ./; +#X obj 43 19 cnv 5 5 25 empty empty Making\ Trapezoidal\ Waves\ from\ Sawtooth\ Waves 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 1 0; #X connect 1 0 11 0; #X connect 6 0 0 0; diff --git a/doc/3.audio.examples/J03.pulse.width.mod.pd b/doc/3.audio.examples/J03.pulse.width.mod.pd index 4b3acf99..1271ed84 100644 --- a/doc/3.audio.examples/J03.pulse.width.mod.pd +++ b/doc/3.audio.examples/J03.pulse.width.mod.pd @@ -1,23 +1,22 @@ -#N canvas 371 70 668 554 12; +#N canvas 371 70 676 543 12; #X declare -stdpath ./; #X floatatom 129 87 5 0 0 0 - - - 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-difference 882 float 0; #X coords 0 1.02 881 -1.02 200 130 1; -#X restore 430 378 graph; +#X restore 448 351 graph; #X text 51 87 frequency; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-phasor1 882 float 0; #X coords 0 1.02 882 -1.02 200 130 1; -#X restore 429 59 graph; -#X text 36 27 CLASSICAL PULSE WIDTH MODULATION; +#X restore 447 32 graph; #X obj 129 117 + 0.2; #X obj 111 200 -~; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-phasor2 882 float 0; #X coords 0 1.02 882 -1.02 200 130 1; -#X restore 430 218 graph; -#X text 450 519 ---- 0.02 seconds ----; +#X restore 448 191 graph; +#X text 468 492 ---- 0.02 seconds ----; #X obj 111 283 output~; #X obj 208 187 tabwrite~ \$0-phasor1; #X obj 196 221 tabwrite~ \$0-phasor2; @@ -25,20 +24,21 @@ #X obj 55 141 phasor~; #X obj 196 120 metro 193; #X obj 196 93 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 506 9 declare -stdpath ./; +#X obj 253 310 declare -stdpath ./; #X obj 129 141 phasor~; #X text 220 92 <-- start/stop graphing; -#X text 43 357 This patch demonstrates pulse width modulation \, which is accomplished simply by subtracting two sawtooth waves at a varying phase difference. Here their frequencies are set to differ by 1/5 Hz so that the relative phase wanders continuously., f 47; -#X connect 0 0 5 0; -#X connect 0 0 13 0; -#X connect 5 0 17 0; -#X connect 6 0 9 0; -#X connect 6 0 12 0; -#X connect 13 0 6 0; +#X text 65 391 This patch demonstrates pulse width modulation \, which is accomplished simply by subtracting two sawtooth waves at a varying phase difference. Here their frequencies are set to differ by 1/5 Hz so that the relative phase wanders continuously., f 47; +#X obj 46 26 cnv 5 5 25 empty empty Classical\ Pulse\ Width\ Modulation 15 13 0 16 #dfdfdf #202020 0; +#X connect 0 0 4 0; +#X connect 0 0 12 0; +#X connect 4 0 16 0; +#X connect 5 0 8 0; +#X connect 5 0 11 0; +#X connect 12 0 5 0; +#X connect 12 0 9 0; +#X connect 13 0 9 0; #X connect 13 0 10 0; -#X connect 14 0 10 0; -#X connect 14 0 11 0; -#X connect 14 0 12 0; -#X connect 15 0 14 0; -#X connect 17 0 6 1; -#X connect 17 0 11 0; +#X connect 13 0 11 0; +#X connect 14 0 13 0; +#X connect 16 0 5 1; +#X connect 16 0 10 0; diff --git a/doc/3.audio.examples/J04.corners.pd b/doc/3.audio.examples/J04.corners.pd index dc69d64d..eb60f33a 100644 --- a/doc/3.audio.examples/J04.corners.pd +++ b/doc/3.audio.examples/J04.corners.pd @@ -1,102 +1,102 @@ -#N canvas 486 38 684 723 12; +#N canvas 586 41 692 737 12; #X declare -stdpath ./; -#X obj 136 177 wrap~; -#X obj 136 204 -~ 0.5; +#X obj 136 187 wrap~; +#X obj 136 214 -~ 0.5; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-sum 882 float 0; #X coords 0 0.25 881 -0.25 200 130 1; -#X restore 447 121 graph; -#X text 446 259 ---- 0.02 seconds ----; -#X obj 293 500 output~; -#X obj 339 470 tabwrite~ \$0-sum; -#X obj 136 151 -~; -#X obj 154 107 / 100; -#X floatatom 154 86 4 -100 100 0 - - - 0; -#X obj 154 338 / 100; -#X floatatom 154 311 4 -100 100 0 - - - 0; -#X obj 136 367 *~; -#X obj 223 177 wrap~; -#X obj 223 204 -~ 0.5; -#X obj 223 152 -~; -#X obj 241 108 / 100; -#X floatatom 241 87 4 -100 100 0 - - - 0; -#X obj 241 338 / 100; -#X floatatom 241 311 4 -100 100 0 - - - 0; -#X obj 223 367 *~; -#X obj 311 177 wrap~; -#X obj 311 204 -~ 0.5; -#X obj 311 153 -~; -#X obj 329 109 / 100; -#X floatatom 329 88 4 -100 100 0 - - - 0; -#X obj 329 338 / 100; -#X floatatom 329 311 4 -100 100 0 - - - 0; -#X obj 311 367 *~; -#X text 149 64 -- PHASES (percent) --; -#X text 364 310 AMPLITUDES (percent); -#X obj 136 396 +~; -#X obj 293 434 +~; -#X obj 339 405 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 339 438 metro 193; -#X obj 81 109 phasor~; -#X floatatom 81 88 5 0 0 0 - - - 0; -#X text 61 65 frequency; -#X obj 136 229 *~; -#X obj 223 229 *~; -#X obj 311 229 *~; -#X obj 136 254 *~ 0.5; -#X obj 136 279 -~ 0.0833; -#X obj 223 254 *~ 0.5; -#X obj 311 254 *~ 0.5; -#X obj 223 279 -~ 0.0833; -#X obj 311 279 -~ 0.0833; -#X text 46 569 Here we combine three parabolic waves (in the same way as \, two patches ago \, we combined sawtooth waves). The parabolic wave is obtained from the sawtooth wave (assuming it runs from -0.5 to 0.5) by the formula: y=x*x/2 - 1/12. This is normalized so that the corner has a slope change of minus one unit per cycle \, and adjusted to remove any DC component., f 87; -#X text 407 118 0.25; -#X text 398 235 -0.25; -#X text 50 22 MAKING WAVEFORMS WITH CORNERS USING PARABOLIC WAVES; -#X obj 491 25 declare -stdpath ./; -#X text 46 645 In general \, the segments of the result will be curved \, but if the three magnitudes sum algebraically to zero \, the segments will be linear. Note the reduced scale of the graph (from -0.25 to 0.25) compared to the previous examples., f 87; +#X restore 447 131 graph; +#X text 446 269 ---- 0.02 seconds ----; +#X obj 293 510 output~; +#X obj 339 480 tabwrite~ \$0-sum; +#X obj 136 161 -~; +#X obj 154 117 / 100; +#X floatatom 154 96 4 -100 100 0 - - - 0; +#X obj 154 348 / 100; +#X obj 136 377 *~; +#X obj 223 187 wrap~; +#X obj 223 214 -~ 0.5; +#X obj 223 162 -~; +#X obj 241 118 / 100; +#X floatatom 241 97 4 -100 100 0 - - - 0; +#X obj 241 348 / 100; +#X obj 223 377 *~; +#X obj 311 187 wrap~; +#X obj 311 214 -~ 0.5; +#X obj 311 163 -~; +#X obj 329 119 / 100; +#X floatatom 329 98 4 -100 100 0 - - - 0; +#X obj 329 348 / 100; +#X floatatom 329 321 5 -100 100 0 - - - 0; +#X obj 311 377 *~; +#X text 149 74 -- PHASES (percent) --; +#X text 380 320 AMPLITUDES (percent); +#X obj 136 406 +~; +#X obj 293 444 +~; +#X obj 339 415 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 339 448 metro 193; +#X obj 81 119 phasor~; +#X floatatom 81 98 5 0 0 0 - - - 0; +#X text 61 75 frequency; +#X obj 136 239 *~; +#X obj 223 239 *~; +#X obj 311 239 *~; +#X obj 136 264 *~ 0.5; +#X obj 136 289 -~ 0.0833; +#X obj 223 264 *~ 0.5; +#X obj 311 264 *~ 0.5; +#X obj 223 289 -~ 0.0833; +#X obj 311 289 -~ 0.0833; +#X text 46 579 Here we combine three parabolic waves (in the same way as \, two patches ago \, we combined sawtooth waves). The parabolic wave is obtained from the sawtooth wave (assuming it runs from -0.5 to 0.5) by the formula: y=x*x/2 - 1/12. This is normalized so that the corner has a slope change of minus one unit per cycle \, and adjusted to remove any DC component., f 87; +#X text 407 128 0.25; +#X text 398 245 -0.25; +#X obj 500 70 declare -stdpath ./; +#X text 46 655 In general \, the segments of the result will be curved \, but if the three magnitudes sum algebraically to zero \, the segments will be linear. Note the reduced scale of the graph (from -0.25 to 0.25) compared to the previous examples., f 87; +#X floatatom 154 321 5 -100 100 0 - - - 0; +#X floatatom 241 321 5 -100 100 0 - - - 0; +#X obj 40 17 cnv 5 5 25 empty empty Making\ Waveforms\ With\ Corners\ Using\ Parabloic\ Waveforms 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 1 0; -#X connect 1 0 37 0; -#X connect 1 0 37 1; +#X connect 1 0 35 0; +#X connect 1 0 35 1; #X connect 6 0 0 0; #X connect 7 0 6 1; #X connect 8 0 7 0; -#X connect 9 0 11 1; -#X connect 10 0 9 0; -#X connect 11 0 30 0; -#X connect 12 0 13 0; -#X connect 13 0 38 0; -#X connect 13 0 38 1; -#X connect 14 0 12 0; -#X connect 15 0 14 1; -#X connect 16 0 15 0; -#X connect 17 0 19 1; -#X connect 18 0 17 0; -#X connect 19 0 30 1; -#X connect 20 0 21 0; -#X connect 21 0 39 0; -#X connect 21 0 39 1; -#X connect 22 0 20 0; -#X connect 23 0 22 1; +#X connect 9 0 10 1; +#X connect 10 0 28 0; +#X connect 11 0 12 0; +#X connect 12 0 36 0; +#X connect 12 0 36 1; +#X connect 13 0 11 0; +#X connect 14 0 13 1; +#X connect 15 0 14 0; +#X connect 16 0 17 1; +#X connect 17 0 28 1; +#X connect 18 0 19 0; +#X connect 19 0 37 0; +#X connect 19 0 37 1; +#X connect 20 0 18 0; +#X connect 21 0 20 1; +#X connect 22 0 21 0; +#X connect 23 0 25 1; #X connect 24 0 23 0; -#X connect 25 0 27 1; -#X connect 26 0 25 0; -#X connect 27 0 31 1; +#X connect 25 0 29 1; +#X connect 28 0 29 0; +#X connect 29 0 5 0; +#X connect 29 0 4 0; #X connect 30 0 31 0; #X connect 31 0 5 0; -#X connect 31 0 4 0; -#X connect 32 0 33 0; -#X connect 33 0 5 0; -#X connect 34 0 6 0; -#X connect 34 0 14 0; -#X connect 34 0 22 0; -#X connect 35 0 34 0; -#X connect 37 0 40 0; -#X connect 38 0 42 0; -#X connect 39 0 43 0; -#X connect 40 0 41 0; -#X connect 41 0 11 0; -#X connect 42 0 44 0; -#X connect 43 0 45 0; -#X connect 44 0 19 0; -#X connect 45 0 27 0; +#X connect 32 0 6 0; +#X connect 32 0 13 0; +#X connect 32 0 20 0; +#X connect 33 0 32 0; +#X connect 35 0 38 0; +#X connect 36 0 40 0; +#X connect 37 0 41 0; +#X connect 38 0 39 0; +#X connect 39 0 10 0; +#X connect 40 0 42 0; +#X connect 41 0 43 0; +#X connect 42 0 17 0; +#X connect 43 0 25 0; +#X connect 49 0 9 0; +#X connect 50 0 16 0; diff --git a/doc/3.audio.examples/J05.triangle.pd b/doc/3.audio.examples/J05.triangle.pd index 558da6e8..f5f5e7f2 100644 --- a/doc/3.audio.examples/J05.triangle.pd +++ b/doc/3.audio.examples/J05.triangle.pd @@ -1,34 +1,34 @@ -#N canvas 507 44 606 633 12; +#N canvas 507 44 636 663 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-sum 882 float 0; #X coords 0 0.5 881 -0.5 200 130 1; -#X restore 336 128 graph; -#X text 357 266 ---- 0.02 seconds ----; -#X obj 179 366 output~; -#X obj 233 337 tabwrite~ \$0-sum; -#X obj 172 137 / 100; -#X floatatom 172 112 4 0 100 0 - - - 0; -#X obj 222 137 / 100; -#X floatatom 222 112 4 0 100 0 - - - 0; -#X obj 233 276 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 233 302 metro 193; -#X obj 95 131 phasor~; -#X floatatom 95 104 5 0 0 0 - - - 0; -#X text 66 79 frequency; -#X text 159 71 SLOPES (percent); -#X obj 154 167 *~; -#X obj 95 169 *~ -1; -#X obj 95 194 +~ 1; -#X obj 204 242 *~; -#X obj 179 269 min~; -#X text 305 122 0.5; -#X text 299 246 -0.5; -#X text 175 92 up; -#X text 222 92 down; -#X text 37 24 MAKING WAVEFORMS WITH CORNERS BY SPECIFYING LINE SEGMENT SLOPES, f 63; -#X obj 430 69 declare -stdpath ./; -#X text 51 441 Occasionally a second method for making corners is more convenient. Here we specify the slopes of the rising and falling segments (as always \, in units per cycle). We then make a triangle wave with a corner at (0 \, 0) and another one \, placed somewhere within the cycle. The slopes of the two lines determine the second point \, which will have an x value of t/(s+t) (if we let 's' denote the rising slope and 't' the falling one \, both as positive numbers). The y value is st/(s+t). If we wish instead to specify the corner location (x \, y) (with x in cycles \, 0 Date: Tue, 16 Jul 2024 16:30:37 -0300 Subject: [PATCH 44/89] rename some audio examples closes https://github.com/pure-data/pddp/issues/237 --- .../{B07.sampler.pd => B07.sampler.scratch.pd} | 0 .../{B10.sampler.scratch.pd => B10.sampler.sliding.loop.pd} | 0 doc/3.audio.examples/{E05.chebychev.pd => E05.chebyshev.pd} | 0 doc/3.audio.examples/H16.adsr.filter.qlist.pd | 2 +- doc/Makefile.am | 6 +++--- 5 files changed, 4 insertions(+), 4 deletions(-) rename doc/3.audio.examples/{B07.sampler.pd => B07.sampler.scratch.pd} (100%) rename doc/3.audio.examples/{B10.sampler.scratch.pd => B10.sampler.sliding.loop.pd} (100%) rename doc/3.audio.examples/{E05.chebychev.pd => E05.chebyshev.pd} (100%) diff --git a/doc/3.audio.examples/B07.sampler.pd b/doc/3.audio.examples/B07.sampler.scratch.pd similarity index 100% rename from doc/3.audio.examples/B07.sampler.pd rename to doc/3.audio.examples/B07.sampler.scratch.pd diff --git a/doc/3.audio.examples/B10.sampler.scratch.pd b/doc/3.audio.examples/B10.sampler.sliding.loop.pd similarity index 100% rename from doc/3.audio.examples/B10.sampler.scratch.pd rename to doc/3.audio.examples/B10.sampler.sliding.loop.pd diff --git a/doc/3.audio.examples/E05.chebychev.pd b/doc/3.audio.examples/E05.chebyshev.pd similarity index 100% rename from doc/3.audio.examples/E05.chebychev.pd rename to doc/3.audio.examples/E05.chebyshev.pd diff --git a/doc/3.audio.examples/H16.adsr.filter.qlist.pd b/doc/3.audio.examples/H16.adsr.filter.qlist.pd index afa4b337..c25d1c1b 100644 --- a/doc/3.audio.examples/H16.adsr.filter.qlist.pd +++ b/doc/3.audio.examples/H16.adsr.filter.qlist.pd @@ -98,7 +98,7 @@ #X obj 30 338 adsr, f 16; #X obj 398 532 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X text 425 533 start; -#X obj 263 13 cnv 5 5 25 empty empty Analog\ Style\ Using\ [qlist] 15 13 0 16 #dfdfdf #202020 0; +#X obj 223 13 cnv 5 5 25 empty empty Analog\ Synth\ Style\ Using\ [qlist] 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 82 0; #X connect 1 0 45 0; #X connect 2 0 3 0; diff --git a/doc/Makefile.am b/doc/Makefile.am index 1c6d443b..323c9287 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -220,10 +220,10 @@ nobase_dist_libpd_DATA = \ ./3.audio.examples/B04.tabread4.interpolation.pd \ ./3.audio.examples/B05.tabread.FM.pd \ ./3.audio.examples/B06.table.switching.pd \ - ./3.audio.examples/B07.sampler.pd \ + ./3.audio.examples/B07.sampler.scratch.pd \ ./3.audio.examples/B08.sampler.loop.pd \ ./3.audio.examples/B09.sampler.loop.smooth.pd \ - ./3.audio.examples/B10.sampler.scratch.pd \ + ./3.audio.examples/B10.sampler.sliding.loop.pd \ ./3.audio.examples/B11.sampler.nodoppler.pd \ ./3.audio.examples/B12.sampler.transpose.pd \ ./3.audio.examples/B13.sampler.overlap.pd \ @@ -258,7 +258,7 @@ nobase_dist_libpd_DATA = \ ./3.audio.examples/E02.ring.modulation.pd \ ./3.audio.examples/E03.octave.divider.pd \ ./3.audio.examples/E04.difference.tone.pd \ - ./3.audio.examples/E05.chebychev.pd \ + ./3.audio.examples/E05.chebyshev.pd \ ./3.audio.examples/E06.exponential.pd \ ./3.audio.examples/E07.evenodd.pd \ ./3.audio.examples/E08.phase.mod.pd \ From 4b7284513d41edef108310dc09d3a116eac84079 Mon Sep 17 00:00:00 2001 From: porres Date: Wed, 17 Jul 2024 03:12:15 -0300 Subject: [PATCH 45/89] add examples on [tabread4~]'s help file to use it as a flexible sampler added an example with [phasor~] and another with [line~] closes https://github.com/pure-data/pddp/issues/233 --- doc/5.reference/tabread4~-help.pd | 146 +++++++++++++++++++++++++----- 1 file changed, 123 insertions(+), 23 deletions(-) diff --git a/doc/5.reference/tabread4~-help.pd b/doc/5.reference/tabread4~-help.pd index 4ddb8869..734922c4 100644 --- a/doc/5.reference/tabread4~-help.pd +++ b/doc/5.reference/tabread4~-help.pd @@ -1,24 +1,22 @@ -#N canvas 312 52 843 544 12; +#N canvas 352 75 847 546 12; #X obj 36 411 snapshot~; #X obj 36 175 sig~; #X floatatom 36 149 6 1 8 0 - - - 0; #X floatatom 36 437 6 0 0 0 - - - 0; #X obj 44 17 tabread4~; #X obj 94 487 tabwrite~; -#X obj 229 487 tabread; -#X obj 288 487 tabwrite; -#X obj 353 487 tabsend~; +#X obj 298 487 tabsend~; #X obj 94 513 tabreceive~; #X obj 165 487 tabplay~; #X floatatom 166 260 5 0 10 0 - - - 0; -#X obj 231 391 ../3.audio.examples/B15.tabread4~-onset; +#X obj 220 379 ../3.audio.examples/B15.tabread4~-onset; #X obj 181 513 tabosc4~; #X obj 249 513 soundfiler; #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 7 4 2; #X connect 0 0 1 0; -#X restore 720 108 pd init-table; +#X restore 727 78 pd init-table; #X obj 36 323 tabread4~ table2-ex; #X msg 52 217 set table2-ex; #X text 124 16 - 4-point-interpolating table lookup for signals; @@ -51,7 +49,7 @@ #X connect 12 0 14 0; #X connect 13 0 12 0; #X connect 15 0 13 0; -#X restore 580 430 pd Dealing_with_"\$0"; +#X restore 363 422 pd Dealing_with_"\$0"; #X obj 39 121 hsl 162 19 1 8 0 0 empty empty empty -2 -8 0 10 #dfdfdf #000000 #000000 0 1; #N canvas 722 96 575 293 reference 0; #X obj 11 52 cnv 5 550 5 empty empty INLET: 8 18 0 13 #202020 #000000 0; @@ -74,8 +72,7 @@ #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 352 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 text 234 340 Open this example for more details on setting onset:, f 35; #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; @@ -142,8 +139,8 @@ #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 restore 697 364 pd multichannel; +#X text 546 349 mutichannel signal support ----------->, f 20; #X obj 128 402 metro 200; #X obj 128 375 loadbang; #X obj 128 430 s bang; @@ -152,23 +149,126 @@ #X text 212 255 set table onset to improve the accuracy of indexing (useful if you have Pd compiled for single precision), f 31; #X text 157 210 "set" message lets you switch between arrays, f 22; #X text 102 260 onset ->; -#X obj 566 133 cnv 19 248 198 empty empty empty 20 12 0 12 #e0e0e0 #404040 0; +#X obj 573 103 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 restore 572 102 graph; #X obj 166 291 sig~; #X text 625 507 updated for Pd version 0.55; #X text 30 63 [tabread4~] is used to build samplers with more flexibility than [tabplay~] and other table lookup algorithms. The interpolation scheme is 4-point polynomial as used in [delread4~] and [tabosc4~]., f 67; +#N canvas 426 196 912 548 player-examples 0; +#X obj 59 355 soundfiler; +#X floatatom 59 384 7 0 0 0 - - - 12; +#X listbox 126 384 16 0 0 0 - - - 0; +#X obj 45 164 cnv 19 248 98 empty empty empty 20 12 0 12 #e0e0e0 #404040 0; +#N canvas 0 22 450 300 (subpatch) 0; +#X array tabread4 155944 float 2; +#X coords 0 1 155944 -1 250 100 1 0 0; +#X restore 44 163 graph; +#X msg 59 322 read -resize ../sound/bell.aiff tabread4; +#X obj 59 293 loadbang; +#X msg 126 410 \$1; +#X obj 59 437 s size; +#X obj 126 437 s fileSR; +#X obj 439 146 r size; +#X obj 464 174 r fileSR; +#X obj 439 203 swap; +#X floatatom 439 260 9 0 0 0 - - - 0; +#X obj 439 231 /; +#X obj 439 334 phasor~; +#X obj 439 398 tabread4~ tabread4; +#X obj 439 439 output~; +#X obj 439 293 *~ 1; +#X obj 439 364 *~; +#X obj 475 364 r size; +#X msg 485 308 0; +#X floatatom 524 239 7 -200 200 0 - - - 0; +#X obj 524 265 / 100; +#X text 340 245 Reading frequency -->, f 13; +#X obj 703 89 r size; +#X obj 763 89 r fileSR; +#X obj 735 151 /; +#X obj 735 182 * 1000; +#X obj 703 122 t f f; +#X listbox 682 308 16 0 0 0 - - - 0; +#X obj 647 188 metro; +#X obj 647 154 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X msg 682 334 0 \, \$1 \$2; +#X obj 682 364 line~; +#X obj 682 398 tabread4~ tabread4; +#X obj 682 439 output~; +#X obj 647 220 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X floatatom 795 138 5 50 200 0 - - - 0; +#X obj 795 162 / 100; +#X obj 795 186 t b f; +#X obj 735 226 / 1; +#X obj 682 250 f; +#X obj 682 275 pack f f; +#X text 801 279 size and duration <-- in ms, f 9; +#X text 36 19 To build a playing sampler with [tabread4~] we need to load a file into an array with [soundfiler] and get its size in samples and sample rate. Two looping samplers are provided here implemented with [phasor~] and [line~] \, both of which can play the sample with different speeds., f 43; +#X text 512 212 speed (%); +#X text 789 118 speed (%); +#X text 516 308 restart; +#X text 387 20 The [phasor~] method is always looping and can easily switch to play backwards with negative speeds. Resetting the phase to '0' restartsl, f 31; +#X text 655 18 The [line~] can be triggered with bangs to play once or keep looping with a [metro]., f 29; +#X text 96 488 Check the 3.audio.examples series for more advanced sampler algorithms., f 37; +#X connect 0 0 1 0; +#X connect 0 1 2 0; +#X connect 1 0 8 0; +#X connect 2 0 7 0; +#X connect 5 0 0 0; +#X connect 6 0 5 0; +#X connect 7 0 9 0; +#X connect 10 0 12 0; +#X connect 11 0 12 1; +#X connect 12 0 14 0; +#X connect 12 1 14 1; +#X connect 13 0 18 0; +#X connect 14 0 13 0; +#X connect 15 0 19 0; +#X connect 16 0 17 0; +#X connect 18 0 15 0; +#X connect 19 0 16 0; +#X connect 20 0 19 1; +#X connect 21 0 15 1; +#X connect 22 0 23 0; +#X connect 23 0 18 1; +#X connect 25 0 29 0; +#X connect 26 0 27 1; +#X connect 27 0 28 0; +#X connect 28 0 41 0; +#X connect 29 0 42 1; +#X connect 29 1 27 0; +#X connect 30 0 33 0; +#X connect 31 0 37 0; +#X connect 32 0 31 0; +#X connect 33 0 34 0; +#X connect 34 0 35 0; +#X connect 35 0 36 0; +#X connect 37 0 42 0; +#X connect 38 0 39 0; +#X connect 39 0 40 0; +#X connect 40 0 41 0; +#X connect 40 1 41 1; +#X connect 41 0 31 1; +#X connect 41 0 43 1; +#X connect 42 0 43 0; +#X connect 43 0 30 0; +#X restore 649 424 pd player-examples; +#X text 220 418 open to see how to deal with '\$0', f 17; +#X text 335 423 -->; +#X text 572 409 open for player --> examples, f 10; +#X obj 229 487 tabread4; #X connect 0 0 3 0; -#X connect 1 0 16 0; +#X connect 1 0 14 0; #X connect 2 0 1 0; -#X connect 11 0 44 0; -#X connect 16 0 0 0; -#X connect 17 0 16 0; -#X connect 20 0 2 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 44 0 16 1; +#X connect 9 0 41 0; +#X connect 14 0 0 0; +#X connect 15 0 14 0; +#X connect 18 0 2 0; +#X connect 27 0 26 0; +#X connect 31 0 33 0; +#X connect 32 0 31 0; +#X connect 34 0 0 0; +#X connect 41 0 14 1; From 9b2ae6a73b85f47d490aaa888891f75053d48e3f Mon Sep 17 00:00:00 2001 From: porres Date: Tue, 23 Jul 2024 16:55:50 -0300 Subject: [PATCH 46/89] big revision of audio examples that closes different issues Given the announce that a 0.55-1 update was coming soon, I made a big revision that gathered different issues into a single commit, all at once. So... this: closes https://github.com/pure-data/pddp/issues/232 closes https://github.com/pure-data/pddp/issues/235 closes https://github.com/pure-data/pddp/issues/237 closes https://github.com/pure-data/pddp/issues/238 I also renamed H16 and simplified just to use [text] instead of [qlist], there's a previous example that is still named and mainly uses [qlist]. I think this is good because [text] is a more modern solution. --- doc/3.audio.examples/A00.intro.pd | 4 +- doc/3.audio.examples/A01.sinewave.pd | 54 +- doc/3.audio.examples/A02.amplitude.pd | 41 +- doc/3.audio.examples/A03.line.pd | 90 +-- doc/3.audio.examples/A04.line2.pd | 83 +-- doc/3.audio.examples/A05.output.subpatch.pd | 31 +- doc/3.audio.examples/A06.frequency.pd | 97 +-- doc/3.audio.examples/A07.fusion.pd | 86 +-- doc/3.audio.examples/A08.beating.pd | 36 +- doc/3.audio.examples/A09.frequency.mod.pd | 72 +-- doc/3.audio.examples/A10.review.pd | 80 +-- doc/3.audio.examples/B01.wavetables.pd | 49 +- doc/3.audio.examples/B02.two-wavetables.pd | 26 +- doc/3.audio.examples/B03.tabread4.pd | 45 -- doc/3.audio.examples/B03.tabread4~.pd | 77 +++ .../B04.tabread4.interpolation.pd | 30 +- doc/3.audio.examples/B05.tabread.FM.pd | 46 +- doc/3.audio.examples/B06.table.switching.pd | 34 +- doc/3.audio.examples/B07.sampler.scratch.pd | 89 +-- doc/3.audio.examples/B08.sampler.loop.pd | 129 ++-- .../B09.sampler.loop.smooth.pd | 135 +++-- .../B10.sampler.sliding.loop.pd | 161 ++--- doc/3.audio.examples/B11.sampler.nodoppler.pd | 145 +++-- doc/3.audio.examples/B12.sampler.transpose.pd | 186 +++--- doc/3.audio.examples/B13.sampler.overlap.pd | 287 +++++---- .../B14.sampler.rockafella.pd | 335 ++++++----- doc/3.audio.examples/B15.tabread4~-onset.pd | 4 +- doc/3.audio.examples/B16.long-varispeed.pd | 28 +- doc/3.audio.examples/C01.nyquist.pd | 7 +- doc/3.audio.examples/C02.sawtooth-foldover.pd | 61 +- doc/3.audio.examples/C03.zipper.noise.pd | 2 +- doc/3.audio.examples/C04.control.to.signal.pd | 75 ++- doc/3.audio.examples/C05.sampler.oneshot.pd | 159 +++-- doc/3.audio.examples/C06.signal.to.control.pd | 2 +- doc/3.audio.examples/C07.envelope.follower.pd | 104 ++-- doc/3.audio.examples/C08.analog.sequencer.pd | 168 +++--- doc/3.audio.examples/C09.sample.hold.pd | 116 ++-- doc/3.audio.examples/C10.monophonic.synth.pd | 108 ++-- doc/3.audio.examples/D01.envelope.gen.pd | 88 +-- doc/3.audio.examples/D02.adsr.pd | 51 +- doc/3.audio.examples/D03.envelope.dB.pd | 76 +-- doc/3.audio.examples/D04.envelope.quartic.pd | 104 ++-- doc/3.audio.examples/D05.envelope.pitch.pd | 44 +- .../D06.envelope.portamento.pd | 81 ++- doc/3.audio.examples/D07.additive.pd | 44 +- doc/3.audio.examples/D08.table.spectrum.pd | 26 +- doc/3.audio.examples/D09.shepard.tone.pd | 121 ++-- doc/3.audio.examples/D10.sampler.notes.pd | 409 ++++++------- doc/3.audio.examples/D11.sampler.poly.pd | 145 +++-- doc/3.audio.examples/D12.sampler.bis.pd | 270 ++++----- doc/3.audio.examples/D13.additive.qlist.pd | 90 ++- doc/3.audio.examples/D14.vibrato.pd | 46 +- doc/3.audio.examples/E01.spectrum.pd | 227 +++---- doc/3.audio.examples/E02.ring.modulation.pd | 220 +++---- doc/3.audio.examples/E04.difference.tone.pd | 12 +- doc/3.audio.examples/E05.chebyshev.pd | 122 ++-- doc/3.audio.examples/E06.exponential.pd | 200 +++---- doc/3.audio.examples/E07.evenodd.pd | 137 ++--- doc/3.audio.examples/E08.phase.mod.pd | 123 ++-- doc/3.audio.examples/E09.FM.spectrum.pd | 150 +++-- doc/3.audio.examples/E10.complex.FM.pd | 99 ++-- doc/3.audio.examples/F01.pulse.pd | 100 ++-- doc/3.audio.examples/F02.just.say.pd | 74 ++- doc/3.audio.examples/F03.pulse.spectrum.pd | 126 ++-- doc/3.audio.examples/F04.waveshaping.pulse.pd | 81 +-- doc/3.audio.examples/F05.ring.modulation.pd | 132 +++-- doc/3.audio.examples/F06.packets.pd | 91 +-- doc/3.audio.examples/F07.packet.spectrum.pd | 105 ++-- doc/3.audio.examples/F08.two.cosines.pd | 93 +-- doc/3.audio.examples/F09.declickit.pd | 2 +- doc/3.audio.examples/F10.sweepable.FM.pd | 78 +-- doc/3.audio.examples/F11.anharmonic.FM.pd | 125 ++-- doc/3.audio.examples/F12.paf.pd | 125 ++-- doc/3.audio.examples/F13.paf.control.pd | 157 ++--- doc/3.audio.examples/F14.wave.packet.pd | 121 ++-- doc/3.audio.examples/G01.delay.pd | 50 +- doc/3.audio.examples/G02.delay.loop.pd | 45 +- doc/3.audio.examples/G03.delay.variable.pd | 125 ++-- doc/3.audio.examples/G06.octave.doubler.pd | 22 +- doc/3.audio.examples/G07.shaker.pd | 108 ++-- doc/3.audio.examples/G08.reverb.pd | 26 +- doc/3.audio.examples/G09.pitchshift.pd | 287 ++++----- doc/3.audio.examples/H01.low-pass.pd | 12 +- doc/3.audio.examples/H02.high-pass.pd | 68 +-- doc/3.audio.examples/H04.filter.sweep.pd | 60 +- doc/3.audio.examples/H05.filter.floyd.pd | 6 +- doc/3.audio.examples/H06.envelope.follower.pd | 76 +-- doc/3.audio.examples/H07.measure.spectrum.pd | 66 +-- doc/3.audio.examples/H08.heterodyning.pd | 4 +- doc/3.audio.examples/H09.ssb.modulation.pd | 117 ++-- doc/3.audio.examples/H16.adsr.filter.qlist.pd | 171 ------ doc/3.audio.examples/H16.adsr.filter.text.pd | 155 +++++ doc/3.audio.examples/I01.Fourier.analysis.pd | 2 +- doc/3.audio.examples/I02.Hann.window.pd | 2 +- doc/3.audio.examples/I03.resynthesis.pd | 26 +- doc/3.audio.examples/I04.noisegate.pd | 283 +++++---- doc/3.audio.examples/I05.compressor.pd | 310 +++++----- doc/3.audio.examples/I06.timbre.stamp.pd | 555 +++++++++--------- doc/3.audio.examples/I07.phase.vocoder.pd | 253 ++++---- doc/3.audio.examples/I08.pvoc.reverb.pd | 157 +++-- doc/3.audio.examples/I09.sheep.from.goats.pd | 488 +++++++-------- doc/3.audio.examples/I10.phase.bash.pd | 276 ++++----- doc/3.audio.examples/J02.trapezoids.pd | 134 +++-- doc/3.audio.examples/J03.pulse.width.mod.pd | 36 +- doc/3.audio.examples/J04.corners.pd | 108 ++-- doc/3.audio.examples/J05.triangle.pd | 46 +- doc/3.audio.examples/J06.enveloping.pd | 154 +++-- doc/3.audio.examples/J07.oversampling.pd | 36 +- doc/3.audio.examples/J08.classicsynth.pd | 4 +- doc/3.audio.examples/J09.bandlimited.pd | 115 ++-- doc/3.audio.examples/adsr.pd | 27 +- doc/3.audio.examples/partial.pd | 53 +- doc/3.audio.examples/qlist2.txt | 5 - doc/3.audio.examples/shepvoice.pd | 85 +-- doc/5.reference/line~-help.pd | 18 +- doc/5.reference/qlist-help.pd | 2 +- doc/Makefile.am | 5 +- 117 files changed, 6399 insertions(+), 5756 deletions(-) delete mode 100644 doc/3.audio.examples/B03.tabread4.pd create mode 100644 doc/3.audio.examples/B03.tabread4~.pd delete mode 100644 doc/3.audio.examples/H16.adsr.filter.qlist.pd create mode 100644 doc/3.audio.examples/H16.adsr.filter.text.pd delete mode 100644 doc/3.audio.examples/qlist2.txt diff --git a/doc/3.audio.examples/A00.intro.pd b/doc/3.audio.examples/A00.intro.pd index b7bd2c8c..0f463c6f 100644 --- a/doc/3.audio.examples/A00.intro.pd +++ b/doc/3.audio.examples/A00.intro.pd @@ -1,8 +1,8 @@ -#N canvas 614 38 568 450 12; +#N canvas 494 80 568 497 12; #X msg 152 217 browse http://msp.ucsd.edu/techniques.htm; #X obj 152 251 pdcontrol; #X text 48 66 This is the second of three tutorial series on Pd. This one shows the time and frequency domain audio processing features. (The first one showed how to use Pd to do "control" computations \, and the third is about data structures.), f 67; #X text 47 135 These patches are accompanied by an ONLINE BOOK \, which develops the underlying theory at . Click on the message below to open it., f 67; -#X text 57 303 Note \, however \, that the book was designed for an older version of Pd. The examples here part of this version of Pd are more up to date and include more recent features and functionalities \, so they are somewhat different from the book's examples. Nonetheless \, the link above carries a download for the exact example files that were used on the book. One way or another \, these more up to date examples should correspond to the theory presented in the book without significant conflicts., f 66; #X obj 49 17 cnv 5 5 25 empty empty Introduction\ to\ the\ Pd\ Audio\ Example\ Patches 15 13 0 16 #dfdfdf #202020 0; +#X text 82 318 Note \, however \, that the book was designed for an older version of Pd. The examples here part of this version of Pd are more up to date and include more recent features and functionalities \, so they are somewhat different from the book's examples. Nonetheless \, the link above carries a download for the exact example files that were used on the book. One way or another \, these more up to date examples should correspond to the theory presented in the book without significant conflicts.; #X connect 0 0 1 0; diff --git a/doc/3.audio.examples/A01.sinewave.pd b/doc/3.audio.examples/A01.sinewave.pd index d340d3c2..758d7ba5 100644 --- a/doc/3.audio.examples/A01.sinewave.pd +++ b/doc/3.audio.examples/A01.sinewave.pd @@ -1,30 +1,30 @@ -#N canvas 619 38 546 788 12; -#X obj 129 148 osc~ 440; -#X obj 129 207 dac~; -#X obj 129 177 *~ 0.05; -#X msg 163 344 \; pd dsp 1; -#X msg 163 385 \; pd dsp 0; -#X text 229 351 ON; -#X text 233 392 OFF; -#X text 55 452 You should see the Pd window change to reflect whether audio is on or off. You can also turn audio on and off using the "audio" menu \, but the buttons are provided as a shortcut.; -#X text 56 570 In general when you start a work session with Pd \, you will want to choose "test audio and MIDI" from the help window \, which opens a more comprehensive test patch than this one., f 60; -#X text 44 63 Audio computation in Pd is done using "tilde objects" such as the three below. They use continuous audio streams to intercommunicate \, as well as communicating with other ("control") Pd objects using messages.; -#X obj 257 659 ../5.reference/set-dsp-tgl; -#X text 258 638 DSP on/off; -#X msg 257 718 \; pd dsp \$1; -#X text 80 356 click these -->, f 9; -#X obj 298 398 send pd; -#X text 71 266 Audio computation can be turned on and off by sending messages to the global "pd" object either via a message box or a [send] object as follows:, f 55; -#X msg 298 339 dsp 1; -#X msg 311 368 dsp 0; -#X text 361 356 <-- or these; -#X text 56 504 When DSP is on \, you should hear a tone whose pitch is middle A (440 Hz) and whose amplitude is 0.05. If instead you are greeted with silence \, you might want to read the HTML documentation on setting up audio.; -#X text 199 147 <-- 440 Hz. sine wave at full blast; -#X text 199 176 <-- reduce amplitude to 0.05; -#X text 171 207 <-- send to the audio output device (left channel only), f 28; -#X text 34 642 These examples also use a helper abstraction with a toggle switch control from the documentation help files of Pd. Check it to the right and see how the toggle shows the DSP state., f 28; -#X obj 138 17 cnv 5 5 25 empty empty Making\ a\ Sine\ Wave 15 13 0 16 #dfdfdf #202020 0; -#X text 293 663 <-- click to turn DSP on/off. Right click to open and check abstraction, f 30; +#N canvas 412 100 806 586 12; +#X obj 59 197 osc~ 440; +#X obj 59 256 dac~; +#X obj 59 226 *~ 0.05; +#X msg 129 402 \; pd dsp 1; +#X msg 239 402 \; pd dsp 0; +#X text 195 409 ON; +#X text 309 409 OFF; +#X text 424 80 You should see the Pd window change to reflect whether audio is on or off. You can also turn audio on and off using the "audio" menu \, but the buttons are provided as a shortcut., f 46; +#X text 424 230 In general when you start a work session with Pd \, you will want to choose "test audio and MIDI" from the help window \, which opens a more comprehensive test patch than this one., f 46; +#X text 44 77 Audio computation in Pd is done using "tilde objects" such as the three below. They use continuous audio streams to intercommunicate \, as well as communicating with other ("control") Pd objects using messages., f 47; +#X obj 482 429 ../5.reference/set-dsp-tgl; +#X text 483 408 DSP on/off; +#X msg 482 488 \; pd dsp \$1; +#X text 52 398 click these -->, f 9; +#X obj 169 527 send pd; +#X text 62 308 Audio computation can be turned on and off by sending messages to the global "pd" object either via a message box or a [send] object as follows:, f 38; +#X msg 169 468 dsp 1; +#X msg 182 497 dsp 0; +#X text 240 481 <-- or these; +#X text 424 149 When DSP is on \, you should hear a tone whose pitch is middle A (440 Hz) and whose amplitude is 0.05. If instead you are greeted with silence \, you might want to read the HTML documentation on setting up audio., f 46; +#X text 129 196 <-- 440 Hz. sine wave at full blast; +#X text 129 225 <-- reduce amplitude to 0.05; +#X text 101 256 <-- send to the audio output device (left channel only), f 28; +#X text 423 302 These examples also use a helper abstraction with a toggle switch control from the documentation help files of Pd. Check it to the right and see how the toggle shows the DSP state., f 46; +#X obj 72 24 cnv 5 5 25 empty empty Making\ a\ Sine\ Wave 15 13 0 16 #dfdfdf #202020 0; +#X text 518 433 <-- click to turn DSP on/off. Right click to open and check abstraction, f 30; #X connect 0 0 2 0; #X connect 2 0 1 0; #X connect 10 0 12 0; diff --git a/doc/3.audio.examples/A02.amplitude.pd b/doc/3.audio.examples/A02.amplitude.pd index fbe2574e..635bfa6e 100644 --- a/doc/3.audio.examples/A02.amplitude.pd +++ b/doc/3.audio.examples/A02.amplitude.pd @@ -1,23 +1,24 @@ -#N canvas 614 76 546 634 12; -#X obj 83 141 osc~ 440; -#X obj 71 360 dac~; -#X obj 83 278 *~ 0; -#X floatatom 108 241 8 0 0 0 - - - 0; -#X obj 108 208 dbtorms; -#X floatatom 108 176 8 0 80 0 - - - 0; -#X obj 372 35 ../5.reference/set-dsp-tgl; -#X text 403 38 DSP on/off; -#X msg 372 72 \; pd dsp \$1; -#X text 150 140 <-- 440 Hz sine wave at full blast; -#X text 174 175 <-- set amplitude here in dB; -#X text 174 207 <-- this converts dB to linear units; -#X text 174 240 <-- this shows the linear gain; -#X text 125 277 <-- multiply the sine wave by the gain \, reducing its amplitude. You can also use the [*~] object to multiply two signals. The "0" argument here instructs it that we'll just send it messages (not audio) to set the multiplier., f 48; -#X text 110 361 <-- and out (we're sending to both channels now).; -#X text 46 405 Amplitudes of audio signals can have any reasonable range \, but when you output a signal via the [dac~] object \, the samples should range between -1 and +1. Values out of that range will be "clipped"., f 67; -#X text 46 556 Pd assumes you have a two channel audio system unless you tell it otherwise. The [dac~] object \, by default \, connects to these two channels., f 67; -#X text 46 463 Here we calculate a gain for the multiplier [*~] using a [dbtorms] object (acronym for "dB to RMS"). 100 dB is normalized to one \, and zero dB artificially outputs a true 0 amplitude. Hence \, decibels in Pd are basically dBFS with an offset of 100! The dBFS is usually considered in digital systems and 0 dB corresponds to one \, whereas a true zero amplitude value consists of minus infinity dB., f 67; -#X obj 54 52 cnv 5 5 25 empty empty Controlling\ Amplitude 15 13 0 16 #dfdfdf #202020 0; +#N canvas 547 63 576 630 12; +#X obj 85 174 osc~ 440; +#X obj 73 403 dac~; +#X obj 85 321 *~ 0; +#X floatatom 110 284 8 0 0 0 - - - 0; +#X obj 110 251 dbtorms; +#X floatatom 110 219 8 0 80 0 - - - 0; +#X obj 381 193 ../5.reference/set-dsp-tgl; +#X text 412 196 DSP on/off; +#X msg 381 230 \; pd dsp \$1; +#X text 112 404 <-- and out (we're sending to both channels now).; +#X text 74 78 Amplitudes of audio signals can have any reasonable range \, but when you output a signal via the [dac~] object \, the samples should range between -1 and +1. Values out of that range will be "clipped".; +#X text 59 547 Pd assumes you have a two channel audio system unless you tell it otherwise. The [dac~] object \, by default \, connects to these two channels., f 68; +#X text 59 450 Here we calculate a gain for the multiplier [*~] using a [dbtorms] object (acronym for "dB to RMS"). 100 dB is normalized to one \, and zero dB artificially outputs a true 0 amplitude. Hence \, decibels in Pd are basically dBFS with an offset of 100! The dBFS is usually considered in digital systems and 0 dB corresponds to one \, whereas a true zero amplitude value consists of minus infinity dB., f 68; +#X obj 113 25 cnv 5 5 25 empty empty Controlling\ Amplitude 15 13 0 16 #dfdfdf #202020 0; +#X text 176 218 <-- set amplitude in dB; +#X text 176 250 <-- convert dB to linear; +#X text 176 283 <-- linear gain; +#X text 127 320 <-- multiply the sine wave by the gain \, reducing its amplitude. You can use the [*~] object to multiply two signals \, but the "0" argument here instructs it that we'll just send it messages (not audio) to set the multiplier., f 48; +#X text 152 173 <--, f 3; +#X text 179 174 440 Hz sine wave at full blast, f 16; #X connect 0 0 2 0; #X connect 2 0 1 0; #X connect 2 0 1 1; diff --git a/doc/3.audio.examples/A03.line.pd b/doc/3.audio.examples/A03.line.pd index fd22ab7b..e1901cbb 100644 --- a/doc/3.audio.examples/A03.line.pd +++ b/doc/3.audio.examples/A03.line.pd @@ -1,48 +1,48 @@ -#N canvas 376 68 862 639 12; -#X obj 84 132 osc~ 440; -#X obj 84 405 dac~; -#X obj 84 363 *~; -#X obj 132 326 line~; -#X msg 109 166 0.1 2000; -#X msg 144 251 0 2000; -#X msg 121 188 0.1 50; -#X msg 151 273 0 50; -#X msg 132 210 0.1; -#X msg 156 295 0; -#X text 273 187 ON; -#X text 302 276 OFF; -#X text 25 445 The left inlet of [line~] is a target value. It reaches that target in the time specified (in milliseconds) to its right inlet., f 67; -#X text 25 481 (In this example \, message boxes with two numbers each are connected to [line~]'s left inlet. Except in some special cases \, Pd objects with more than one inlet will automatically distribute lists of numbers across their inlets. In this case \, "0 50" becomes \, "50 at right and 0 at left."), f 67; -#X text 25 558 The [line~] object (and its control brother \, [line]) treat their right inlet specially. The inlets don't retain values the way other inlets do but revert to zero whenever a target is received., f 67; -#X obj 362 127 ../5.reference/set-dsp-tgl; -#X text 393 130 DSP on/off; -#X msg 362 164 \; pd dsp \$1; -#X obj 628 304 hsl 162 19 0 1 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; -#X obj 625 363 pow 4; -#X obj 607 244 osc~ 440; -#X msg 625 425 \$1 10; -#X obj 625 457 line~; -#X obj 607 506 *~; -#X obj 607 560 dac~; -#X floatatom 625 332 10 0 0 0 - - - 0; -#X floatatom 625 395 11 0 0 0 - - - 0; -#X text 150 132 <-- sine wave; -#X text 176 165 <-- slow; -#X text 173 189 <-- fast; -#X text 162 210 <-- instantly; -#X text 197 251 <-- slow; -#X text 189 273 <-- fast; -#X text 186 295 <-- instantly; -#X text 104 231 ---------------------------------------; -#X text 179 326 <-- ramp generator; -#X text 157 352 multiply the sine wave by the ramp. There's no longer a "0" argument \, which tells Pd to expect a signal here., f 44; -#X text 113 361 <----; -#X text 123 405 <-- out; -#X text 32 57 In this patch \, the multiplier is configured to multiply two signals. The amplitude is now a signal computed by the [line~] object \, which provides a smoothened ramp., f 62; -#X text 507 51 Below use a slider that generates values from 0 to 1 \, which passes through a quartic function (by going through [pow 4]). This non linear function is better suited for the way we perceive amplitudes. The value is then combined in a message by assuming the value of the '\$1' variable into a list followed by 10 \, which means that changes to the slider are smoothened by a 10 ms audio ramp! This mechanism is used in an [output~] abstraction presented later., f 43; -#X text 703 333 <-- linear; -#X text 709 395 <-- quartic; -#X obj 48 15 cnv 5 5 25 empty empty Controlling\ Amplitude\ using\ [line~] 15 13 0 16 #dfdfdf #202020 0; +#N canvas 376 68 888 646 12; +#X obj 89 140 osc~ 440; +#X obj 89 413 dac~; +#X obj 89 371 *~; +#X obj 137 334 line~; +#X msg 114 174 0.1 2000; +#X msg 149 259 0 2000; +#X msg 126 196 0.1 50; +#X msg 156 281 0 50; +#X msg 137 218 0.1; +#X msg 161 303 0; +#X text 278 195 ON; +#X text 307 284 OFF; +#X text 30 453 The left inlet of [line~] is a target value. It reaches that target in the time specified (in milliseconds) to its right inlet., f 67; +#X text 30 489 (In this example \, message boxes with two numbers each are connected to [line~]'s left inlet. Except in some special cases \, Pd objects with more than one inlet will automatically distribute lists of numbers across their inlets. In this case \, "0 50" becomes \, "50 at right and 0 at left."), f 67; +#X text 30 566 The [line~] object (and its control brother \, [line]) treat their right inlet specially. The inlets don't retain values the way other inlets do but revert to zero whenever a target is received., f 67; +#X obj 367 135 ../5.reference/set-dsp-tgl; +#X text 398 138 DSP on/off; +#X msg 367 172 \; pd dsp \$1; +#X obj 622 310 hsl 162 19 0 1 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 619 369 pow 4; +#X obj 601 250 osc~ 440; +#X msg 619 431 \$1 10; +#X obj 619 463 line~; +#X obj 601 512 *~; +#X obj 601 566 dac~; +#X floatatom 619 338 10 0 0 0 - - - 0; +#X floatatom 619 401 11 0 0 0 - - - 0; +#X text 155 140 <-- sine wave; +#X text 181 173 <-- slow; +#X text 178 197 <-- fast; +#X text 167 218 <-- instantly; +#X text 202 259 <-- slow; +#X text 194 281 <-- fast; +#X text 191 303 <-- instantly; +#X text 109 239 ---------------------------------------; +#X text 184 334 <-- ramp generator; +#X text 162 360 multiply the sine wave by the ramp. There's no longer a "0" argument \, which tells Pd to expect a signal here., f 44; +#X text 118 369 <----; +#X text 128 413 <-- out; +#X text 37 65 In this patch \, the multiplier is configured to multiply two signals. The amplitude is now a signal computed by the [line~] object \, which provides a smoothened ramp., f 62; +#X text 524 50 Below use a slider that generates values from 0 to 1 \, which passes through a quartic function (by going through [pow 4]). This non linear function is better suited for the way we perceive amplitudes. The value is then combined in a message by assuming the value of the '\$1' variable into a list followed by 10 \, which means that changes to the slider are smoothened by a 10 ms audio ramp! This mechanism is used in an [output~] abstraction presented later., f 43; +#X text 697 339 <-- linear; +#X text 703 401 <-- quartic; +#X obj 57 20 cnv 5 5 25 empty empty Controlling\ Amplitude\ using\ [line~] 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 2 0; #X connect 2 0 1 0; #X connect 2 0 1 1; diff --git a/doc/3.audio.examples/A04.line2.pd b/doc/3.audio.examples/A04.line2.pd index bf6df909..9a00a03a 100644 --- a/doc/3.audio.examples/A04.line2.pd +++ b/doc/3.audio.examples/A04.line2.pd @@ -1,51 +1,54 @@ -#N canvas 429 73 825 757 12; -#X obj 110 117 osc~ 440; -#X obj 110 367 dac~; -#X obj 110 285 *~; -#X obj 128 232 line~; -#X obj 202 132 r graphit; -#X obj 128 201 r to-line; +#N canvas 414 57 797 672 12; +#X obj 229 261 osc~ 440; +#X obj 229 511 dac~; +#X obj 229 429 *~; +#X obj 247 382 line~; +#X obj 247 351 r to-line; #N canvas 0 22 450 278 (subpatch) 0; #X array product 44100 float 0; #X coords 0 1.02 44100 -1.02 200 130 1; -#X restore 573 416 graph; +#X restore 543 368 graph; #N canvas 0 22 450 278 (subpatch) 0; #X array oscillator 44100 float 0; #X coords 0 1.02 44100 -1.02 200 130 1 0 0; -#X restore 573 86 graph; +#X restore 543 38 graph; #N canvas 0 22 450 278 (subpatch) 0; #X array line-output 44100 float 0; #X coords 0 1.02 44100 -1.02 200 130 1; -#X restore 573 251 graph; -#X obj 110 332 *~ 0.1; -#X obj 214 270 tabwrite~ line-output; -#X obj 202 330 tabwrite~ product; -#X text 74 419 ramp up; -#X text 227 419 ramp down; -#X text 398 419 to 1/2; -#X text 597 558 ------ 1 second ------; -#X obj 222 177 tabwrite~ oscillator; -#X text 31 73 Here again is a [line~] controlling the amplitude of an [osc~] \, but with the outputs graphed:, f 63; -#X text 33 518 Click the message boxes above to try it. Note that in the first two boxes \, the [line~] objects get two messages. The first one \, with no time value \, causes the [line~] to jump immediately to the value. The third box takes [line~]'s previous value as a point of departure. What you see will depend on which box you last clicked and how long you waited between the two., f 68; -#X obj 413 309 ../5.reference/set-dsp-tgl; -#X text 444 312 DSP on/off; -#X msg 413 346 \; pd dsp \$1; -#X msg 42 443 \; to-line 0 \, 1 500 \; graphit bang; -#X msg 202 443 \; to-line 1 \, 0 500 \; graphit bang; -#X msg 367 443 \; to-line 0.5 1000 \; graphit bang; -#X text 153 368 <-- out; -#X text 31 611 On very old machines you may hear an interruption in the sound one second after you click on the first or third box. This is because the graphical updates are likely to eat more CPU time than your audio buffer has pre-buffered for. You can avoid this if you keep your graphs in sub-windows and open them only when you need them. In some future version of Pd this behavior will be improved. Until then \, you'll have to avoid having arrays getting re-drawn during music performances., f 68; -#X obj 78 28 cnv 5 5 25 empty empty [line~]\ objects\ graphed 15 13 0 16 #dfdfdf #202020 0; +#X restore 543 203 graph; +#X obj 229 476 *~ 0.1; +#X obj 337 434 tabwrite~ line-output; +#X obj 321 474 tabwrite~ product; +#X text 78 235 ramp up; +#X text 77 338 ramp down; +#X text 85 446 to 1/2; +#X text 567 510 ------ 1 second ------; +#X obj 341 351 tabwrite~ oscillator; +#X obj 430 199 ../5.reference/set-dsp-tgl; +#X text 343 203 DSP on/off; +#X msg 430 236 \; pd dsp \$1; +#X msg 46 257 \; to-line 0 \, 1 500 \; graphit bang; +#X msg 46 362 \; to-line 1 \, 0 500 \; graphit bang; +#X msg 46 467 \; to-line 0.5 1000 \; graphit bang; +#X text 272 512 <-- out; +#X obj 75 26 cnv 5 5 25 empty empty [line~]\ objects\ graphed 15 13 0 16 #dfdfdf #202020 0; +#X text 42 75 Here again is a [line~] controlling the amplitude of an [osc~] \, but with the outputs graphed. Click the message boxes above to try it. Note that in the first two boxes \, the [line~] objects get two messages. The first one \, with no time value \, causes the [line~] to jump immediately to the value. The third box takes [line~]'s previous value as a point of departure. What you see will depend on which box you last clicked and how long you waited between the two., f 63; +#X text 37 566 On very old machines you may hear an interruption in the sound one second after you click on the first or third box. This is because the graphical updates are likely to eat more CPU time than your audio buffer has pre-buffered for., f 49; +#X text 407 566 You can avoid this if you keep your graphs in sub-windows and open them only when you need them. In some future version of Pd this behavior will be improved. Until then \, you'll have to avoid having arrays getting re-drawn during music performances., f 50; +#X obj 321 298 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 321 270 r graphit; +#X text 348 299 <-- bang button \, bang to graph, f 16; #X connect 0 0 2 0; -#X connect 0 0 16 0; -#X connect 2 0 9 0; -#X connect 2 0 11 0; +#X connect 0 0 15 0; +#X connect 2 0 8 0; +#X connect 2 0 10 0; #X connect 3 0 2 1; -#X connect 3 0 10 0; -#X connect 4 0 16 0; -#X connect 4 0 10 0; -#X connect 4 0 11 0; -#X connect 5 0 3 0; -#X connect 9 0 1 0; -#X connect 9 0 1 1; -#X connect 19 0 21 0; +#X connect 3 0 9 0; +#X connect 4 0 3 0; +#X connect 8 0 1 0; +#X connect 8 0 1 1; +#X connect 16 0 18 0; +#X connect 27 0 15 0; +#X connect 27 0 9 0; +#X connect 27 0 10 0; +#X connect 28 0 27 0; diff --git a/doc/3.audio.examples/A05.output.subpatch.pd b/doc/3.audio.examples/A05.output.subpatch.pd index 7711269c..06c9f3a8 100644 --- a/doc/3.audio.examples/A05.output.subpatch.pd +++ b/doc/3.audio.examples/A05.output.subpatch.pd @@ -1,19 +1,20 @@ -#N canvas 452 47 568 532 12; +#N canvas 493 60 602 705 12; #X declare -stdpath ./; -#X obj 66 54 osc~ 440; -#X obj 84 85 osc~ 550; -#X obj 102 117 osc~ 660; -#X obj 66 115 +~; -#X obj 84 143 +~; -#X obj 84 179 output~; -#X obj 60 482 declare -stdpath ./; -#X text 27 423 The [output~] abstraction is in the 'extra' folder (aka 'standard path') \, so we use [declare -stdpath ./] to make sure Pd finds it., f 73; -#X text 27 267 In this and subsequent patches \, we'll use the [output~] abstraction to control overall amplitude. Use the slider to control horizontally from 0 (silence) to 1 (full blast). Note \, however \, that a quartic function is applied. In this example \, you can't actually push the output amplitude all the way up without clipping. You'll know you're clipping if \, instead of an A major chord \, you hear a single \, distorted tone two octaves down. The clipping happens at Pd's last stage of audio output. Audio signals internal to Pd have essentially no level limit., f 73; -#X text 27 388 The output control automatically starts DSP whenever you touch the sider. You can use the "mute" toggle to turn mute on or off., f 73; -#X text 180 86 <-- Here we make an A major triad as a test signal., f 28; -#X text 200 183 <--; -#X text 230 184 this is an abstraction - right click on it and select "open" to see inside. Also select 'help' for more information, f 39; -#X obj 196 24 cnv 5 5 25 empty empty Controlling\ output\ amplitude 15 13 0 16 #dfdfdf #202020 0; +#X obj 66 224 osc~ 440; +#X obj 84 255 osc~ 550; +#X obj 102 287 osc~ 660; +#X obj 66 285 +~; +#X obj 84 313 +~; +#X obj 84 349 output~; +#X obj 384 539 declare -stdpath ./; +#X text 26 67 In this and subsequent patches \, we'll use the [output~] abstraction to control overall amplitude. Use the slider to control horizontally from 0 (silence) to 1 (full blast). Note \, however \, that a quartic function is applied. In this example \, you can't actually push the output amplitude all the way up without clipping. You'll know you're clipping if \, instead of an A major chord \, you hear a single \, distorted tone two octaves down. The clipping happens at Pd's last stage of audio output. Audio signals internal to Pd have essentially no level limit., f 73; +#X text 27 441 The output control automatically starts DSP whenever you touch the sider. You can use the "mute" toggle to turn mute on or off., f 73; +#X text 180 256 <-- Here we make an A major triad as a test signal., f 28; +#X text 200 353 <--; +#X text 230 354 this is an abstraction - right click on it and select "open" to see inside. Also select 'help' for more information, f 39; +#X obj 44 19 cnv 5 5 25 empty empty Controlling\ output\ amplitude\ with\ [output~] 15 13 0 16 #dfdfdf #202020 0; +#X text 27 476 The [output~] abstraction is in the 'extra' folder (aka 'standard path') \, so we use [declare -stdpath ./] to make sure Pd finds it:, f 73; +#X text 38 585 Note that the [output~] abstraction includes a highpass filter object with a low cutoff frequency of 3 Hz: [hip~ 3]. This is present to filter a DC component (0 hz frequency). We'll see more about High Pass filtering and DC component later \, but take note for now that it is just a cautious practice to remove unwanted distortion \, though it may not actually be needed depending on the patch., f 73; #X connect 0 0 3 0; #X connect 1 0 3 1; #X connect 2 0 4 1; diff --git a/doc/3.audio.examples/A06.frequency.pd b/doc/3.audio.examples/A06.frequency.pd index 3b17f5ac..3443f570 100644 --- a/doc/3.audio.examples/A06.frequency.pd +++ b/doc/3.audio.examples/A06.frequency.pd @@ -1,51 +1,54 @@ -#N canvas 441 38 712 706 12; +#N canvas 441 38 781 699 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array osc-output 4410 float 0; -#X coords 0 1.02 4409 -1.02 200 130 1; -#X restore 449 248 graph; -#X obj 165 316 tabwrite~ osc-output; -#X floatatom 326 117 5 0 0 0 - - - 0; -#X obj 106 251 r frequency; -#X msg 326 88 set \$1; -#X floatatom 52 127 6 0 0 0 - - - 0; -#X obj 52 69 r frequency; -#X msg 52 98 set \$1; -#X obj 65 151 s frequency; -#X obj 326 59 r pitch; -#X obj 335 149 s pitch; -#X obj 326 180 mtof; -#X obj 326 209 s frequency; -#X obj 52 206 s pitch; -#X obj 52 177 ftom; -#X text 472 389 ---- 0.1 seconds ----; -#X text 85 588 Note also the "set" messages going to the number boxes so that they can each update the other without bringing on an infinite loop. (get help on number boxes for details.), f 70; -#X text 152 195 to "MIDI" pitch; -#X obj 106 354 output~; -#X obj 106 287 osc~; -#X obj 512 25 declare -stdpath ./; -#X text 100 127 <-- set frequency; -#X text 370 116 <-- set MIDI pitch; -#X text 367 180 <-- convert "MIDI" pitch to frequency; -#X text 97 177 <-- convert frequency; -#X obj 165 286 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X text 226 374 <-- output level; -#X text 85 444 The [osc~] object expects floating-point messages or signals to set its frequency., f 70; -#X text 85 485 Frequency and pitch are converted using the [ftom] and [mtof] objects. Frequency refers to the number of cycles per second. Pitch is "60" for Middle C \, 61 for C sharp \, 72 for the next C up \, and so on., f 70; -#X text 85 537 [mtof] and [ftom] work fine for microtones (non-integral "MIDI pitch") and don't have MIDI's range restriction - for example \, MIDI -36 is about 1 Hz., f 70; -#X text 190 286 <-- bang button \, click to graph; -#X obj 79 18 cnv 5 5 25 empty empty Frequency\ and\ Pitch 15 13 0 16 #dfdfdf #202020 0; -#X connect 2 0 10 0; -#X connect 2 0 11 0; -#X connect 3 0 19 0; -#X connect 4 0 2 0; -#X connect 5 0 8 0; -#X connect 5 0 14 0; -#X connect 6 0 7 0; -#X connect 7 0 5 0; -#X connect 9 0 4 0; -#X connect 11 0 12 0; +#X coords 0 1.02 4409 -1.02 241 178 1; +#X restore 485 195 graph; +#X obj 187 556 tabwrite~ osc-output; +#X floatatom 87 287 8 0 0 0 - - - 0; +#X obj 128 419 r frequency; +#X floatatom 292 287 8 0 0 0 - - - 0; +#X obj 292 229 r frequency; +#X msg 292 258 set \$1; +#X obj 87 254 r pitch; +#X obj 87 333 mtof; +#X obj 87 372 s frequency; +#X obj 292 372 s pitch; +#X obj 292 333 ftom; +#X text 531 397 ---- 0.1 seconds ----; +#X obj 128 596 output~; +#X obj 128 478 osc~; +#X obj 584 93 declare -stdpath ./; +#X text 353 286 <-- set frequency, f 9; +#X text 155 286 <-- set MIDI pitch, f 11; +#X obj 187 515 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 49 17 cnv 5 5 25 empty empty Frequency\ and\ "MIDI"\ Pitch 15 13 0 16 #dfdfdf #202020 0; +#X text 332 332 <--; +#X text 123 331 <-- convert "MIDI" pitch to frequency, f 19; +#X obj 187 481 metro 500; +#X obj 187 453 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 210 452 <-- graph repeatedly; +#X text 425 471 Note the "set" messages going to the number boxes so that they can each update the other without bringing on an infinite loop. (get help on number boxes for details.), f 43; +#X text 428 570 Note also that [mtof] and [ftom] work fine for microtones (non-integral "MIDI pitch") and don't have MIDI's range restriction - for example \, MIDI -36 is about 1 Hz., f 42; +#X obj 43 180 loadbang; +#X msg 43 213 60; +#X text 358 333 convert to "MIDI" pitch, f 12; +#X text 28 64 Frequency refers to the number of cycles per second (Hz). Pitch is "MIDI" Pitch \, where "60" correspond to Middle C \, 61 for C sharp \, 72 for the next C up \, and so on. The [osc~] object expects signals or floating-point messages to set its frequency in Hz. You can \, however \, set a "MIDI" Pitch value and convert to Frequency. Frequency and pitch are converted using the [ftom] and [mtof] objects., f 70; +#X text 212 515 <-- graph once; +#X text 76 214 <- reset to default; +#X text 109 175 Default message automatically sent when you load this patch by the [loadbang] object., f 45; +#X connect 2 0 8 0; +#X connect 3 0 14 0; +#X connect 4 0 11 0; +#X connect 5 0 6 0; +#X connect 6 0 4 0; +#X connect 7 0 2 0; +#X connect 8 0 9 0; +#X connect 11 0 10 0; +#X connect 14 0 1 0; #X connect 14 0 13 0; -#X connect 19 0 1 0; -#X connect 19 0 18 0; -#X connect 25 0 1 0; +#X connect 18 0 1 0; +#X connect 22 0 18 0; +#X connect 23 0 22 0; +#X connect 27 0 28 0; +#X connect 28 0 2 0; diff --git a/doc/3.audio.examples/A07.fusion.pd b/doc/3.audio.examples/A07.fusion.pd index 69e684d5..22fbfcf2 100644 --- a/doc/3.audio.examples/A07.fusion.pd +++ b/doc/3.audio.examples/A07.fusion.pd @@ -1,44 +1,48 @@ -#N canvas 468 38 676 735 12; +#N canvas 468 38 654 755 12; #X declare -stdpath ./; -#X floatatom 133 134 5 0 0 0 - - - 0; -#X obj 133 160 mtof; -#X obj 92 432 output~; -#X msg 133 108 60; -#X obj 91 226 osc~; -#X obj 133 202 * 2; -#X obj 133 226 osc~; -#X obj 197 226 osc~; -#X obj 197 202 * 3; -#X obj 261 226 osc~; -#X obj 261 202 * 4; -#X obj 197 251 *~ 0.2; -#X obj 92 361 +~; -#X obj 133 331 *~; -#X obj 168 332 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 133 282 +~; -#X obj 133 306 +~; +#X floatatom 102 134 5 0 0 0 - - - 0; +#X obj 102 160 mtof; +#X obj 61 457 output~; +#X msg 102 108 60; +#X obj 60 226 osc~; +#X obj 102 202 * 2; +#X obj 102 226 osc~; +#X obj 166 226 osc~; +#X obj 166 202 * 3; +#X obj 230 226 osc~; +#X obj 230 202 * 4; +#X obj 166 251 *~ 0.2; +#X obj 61 391 +~; +#X obj 102 371 *~; +#X obj 120 340 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 102 282 +~; +#X obj 102 309 +~; #N canvas 0 0 450 300 (subpatch) 0; #X array fusion 882 float 0; #X coords 0 1.02 881 -1.02 200 130 1 0 0; -#X restore 417 297 graph; -#X text 320 201 frequencies of harmonics; -#X text 320 225 four oscillators; -#X text 324 250 adjust amplitudes; -#X text 168 305 add the three overtones together; -#X text 439 435 ---- 0.02 seconds ----; -#X obj 133 251 *~ 0.1; -#X obj 261 251 *~ 0.5; -#X obj 489 92 declare -stdpath ./; -#X obj 138 366 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X text 163 366 <-- click to graph; -#X text 188 331 <-- overtones ON/OFF; -#X text 169 108 <-- reset to middle C; -#X obj 133 80 loadbang; -#X text 176 135 <-- choose a different pitch; -#X text 70 523 A simple way to build non-sinusoidal \, periodic musical tones is to sum a series of harmonically tuned sinusoids. Here the four oscillators have frequencies in a 1:2:3:4 ratio (the three [*] objects compute the second \, third \, and fourth one). The amplitudes are adjusted by the [*~ 0.1] \, etc. \, objects. Note that \, since the frequency (from [mtof]) is a message \, a [*] box suffices to operate on it \, but the oscillator's output \, being an audio signal \, needs [*~] instead. The control marked "overtones ON/OFF" is a toggle switch. Click to turn it on and off. Of the overtones are "off" you hear only a sinusoid from the first oscillator. If on \, you hear all four., f 74; -#X text 70 659 To hear the output \, choose a pitch (at top) \, optionally click the "overtones" control \, and mouse up the output volume. Click the "bang" button to graph it., f 74; -#X obj 138 396 tabwrite~ fusion; -#X obj 79 18 cnv 5 5 25 empty empty Adding\ Sinusoids\ to\ make\ a\ Complex\ Tone 15 13 0 16 #dfdfdf #202020 0; +#X restore 398 331 graph; +#X text 289 201 frequencies of harmonics; +#X text 289 225 four oscillators; +#X text 293 250 adjust amplitudes; +#X text 137 308 add the three overtones together; +#X text 421 482 ---- 0.02 seconds ----; +#X obj 102 251 *~ 0.1; +#X obj 230 251 *~ 0.5; +#X obj 451 128 declare -stdpath ./; +#X obj 201 425 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X text 145 339 <-- overtones ON/OFF; +#X text 138 108 <-- reset to middle C; +#X obj 102 80 loadbang; +#X text 145 135 <-- choose a different pitch; +#X text 78 687 To hear the output \, choose a pitch (at top) \, optionally click the "overtones" control \, and mouse up the output volume. Click the "bang" button to graph it., f 74; +#X obj 201 457 tabwrite~ fusion; +#X obj 47 25 cnv 5 5 25 empty empty Adding\ Sinusoids\ to\ make\ a\ Complex\ Tone 15 13 0 16 #dfdfdf #202020 0; +#X text 78 540 A simple way to build non-sinusoidal \, periodic musical tones is to sum a series of harmonically tuned sinusoids. Here the four oscillators have frequencies in a 1:2:3:4 ratio (the three [*] objects compute the second \, third \, and fourth one). The amplitudes are adjusted by the [*~ 0.1] \, etc. \, objects. Note that \, since the frequency (from [mtof]) is a control message \, a [*] box suffices to operate on it \, but the oscillator's output \, being an audio signal \, needs [*~] instead. The control marked "overtones ON/OFF" is a toggle switch. Click to turn it on and off. Of the overtones are "off" you hear only a sinusoid from the first oscillator. If on \, you hear all four., f 74; +#X obj 201 396 metro 500; +#X obj 201 370 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 226 369 <-- graph repeatedly; +#X text 231 424 <-- graph once; +#X text 173 80 <-- send a bang when loading the patch; #X connect 0 0 1 0; #X connect 1 0 4 0; #X connect 1 0 5 0; @@ -54,12 +58,14 @@ #X connect 10 0 9 0; #X connect 11 0 15 1; #X connect 12 0 2 0; -#X connect 12 0 34 0; +#X connect 12 0 32 0; #X connect 13 0 12 1; #X connect 14 0 13 1; #X connect 15 0 16 0; #X connect 16 0 13 0; #X connect 23 0 15 0; #X connect 24 0 16 1; -#X connect 26 0 34 0; -#X connect 30 0 3 0; +#X connect 26 0 32 0; +#X connect 29 0 3 0; +#X connect 35 0 26 0; +#X connect 36 0 35 0; diff --git a/doc/3.audio.examples/A08.beating.pd b/doc/3.audio.examples/A08.beating.pd index 280a8b9c..cf6ed79d 100644 --- a/doc/3.audio.examples/A08.beating.pd +++ b/doc/3.audio.examples/A08.beating.pd @@ -1,22 +1,22 @@ -#N canvas 473 38 540 617 12; +#N canvas 473 38 542 639 12; #X declare -stdpath ./; -#X obj 68 248 output~; -#X obj 68 212 +~; -#X obj 68 144 +~; -#X obj 193 139 +~; -#X obj 193 81 osc~ 440; -#X obj 68 81 osc~ 330; -#X obj 86 112 osc~ 330.2; -#X obj 211 112 osc~ 440.33; -#X obj 328 136 +~; -#X obj 328 81 osc~ 587; -#X obj 346 112 osc~ 587.25; -#X obj 68 181 +~; -#X text 50 326 In each of the three pairs of oscillators above \, the two frequencies are within 1/3 Hz or closer (for example \, the leftmost ones are close to 330 Hz but separated by 1/5 Hz.) The result is a gradual change in amplitude as the phases of the two slip against each other. This is called beating. More complex beating patterns may be made by using three or more oscillators. Also their amplitudes need not be equal (as they are here).; -#X text 47 520 In contrast to the previous example \, the oscillators are not tuned to the overtone series (ratios 1:2:3:4...) and so the frequencies 330 \, 440 \, and 587 are heard separately.; -#X obj 236 265 declare -stdpath ./; -#X text 48 453 They are all summed using [+~] objects. They could have been summed in any order ([+~] is commutative for practical purposes) but here they are added in pairs to emphasize the relationships between them.; -#X obj 56 14 cnv 5 5 25 empty empty Beating\ between\ closely\ tuned\ sinusoids 15 13 0 16 #dfdfdf #202020 0; +#X obj 76 257 output~; +#X obj 76 221 +~; +#X obj 76 153 +~; +#X obj 201 148 +~; +#X obj 201 90 osc~ 440; +#X obj 76 90 osc~ 330; +#X obj 94 121 osc~ 330.2; +#X obj 219 121 osc~ 440.33; +#X obj 336 145 +~; +#X obj 336 90 osc~ 587; +#X obj 354 121 osc~ 587.25; +#X obj 76 190 +~; +#X text 55 539 In contrast to the previous example \, the oscillators are not tuned to the overtone series (ratios 1:2:3:4...) and so the frequencies 330 \, 440 \, and 587 are heard separately.; +#X obj 244 274 declare -stdpath ./; +#X text 56 472 They are all summed using [+~] objects. They could have been summed in any order ([+~] is commutative for practical purposes) but here they are added in pairs to emphasize the relationships between them.; +#X obj 64 23 cnv 5 5 25 empty empty Beating\ between\ closely\ tuned\ sinusoids 15 13 0 16 #dfdfdf #202020 0; +#X text 58 345 In each of the three pairs of oscillators above \, the two frequencies are within 1/3 Hz or closer (for example \, the leftmost ones are close to 330 Hz but separated by 1/5 Hz). The result is a gradual change in amplitude as the phases of the two slip against each other. This is called beating. More complex beating patterns may be made by using three or more oscillators. Also their amplitudes need not be equal (as they are here).; #X connect 1 0 0 0; #X connect 2 0 11 0; #X connect 3 0 11 1; diff --git a/doc/3.audio.examples/A09.frequency.mod.pd b/doc/3.audio.examples/A09.frequency.mod.pd index 9736726a..31477d48 100644 --- a/doc/3.audio.examples/A09.frequency.mod.pd +++ b/doc/3.audio.examples/A09.frequency.mod.pd @@ -1,41 +1,43 @@ -#N canvas 495 38 650 659 12; +#N canvas 452 38 663 756 12; #X declare -stdpath ./; -#X obj 217 210 *~; -#X floatatom 217 125 5 0 0 0 - - - 0; -#X floatatom 147 170 5 0 0 0 - - - 0; -#X obj 147 240 +~; +#X obj 233 277 *~; +#X floatatom 233 192 5 0 0 0 - - - 0; +#X floatatom 163 247 5 0 0 0 - - - 0; +#X obj 163 317 +~; #N canvas 0 0 450 300 (subpatch) 0; #X array fm-output 441 float 0; -#X coords 0 1.02 440 -1.02 200 130 1; -#X restore 400 135 graph; -#X obj 195 324 tabwrite~ fm-output; -#X floatatom 235 180 4 0 0 0 - - - 0; -#X text 122 127 carrier; -#X text 121 145 frequency; -#X text 202 101 frequency; -#X text 203 84 modulation; -#X obj 147 286 osc~; -#X text 55 268 "carrier"; -#X text 274 192 index; -#X text 276 173 modulation; -#X obj 217 150 osc~; -#X text 425 271 --- 0.01 seconds ----; -#X text 60 527 To get the FM sound \, set all three of carrier frequency \, modulation frequency \, and modulation index in the hundreds. Note that you get a timbral change as you sweep modulation index \, because this changes the amplitudes of the components of the output sound but not their frequencies., f 71; -#X obj 147 357 output~; -#X text 60 431 This patch shows the classical FM synthesis technique developed by John Chowning. It's nothing but an oscillator with vibrato controlled by another "modulation" oscillator. First \, to understand the patch \, set carrier frequency to 400 or so \, modulation frequency between 5 and 10 \, and try modulation index values between 0 and 400 \, say. You'll hear a sine wave with vibrato., f 71; -#X text 60 606 The component frequencies are equal to the carrier frequency \, plus or minus multiples of the modulator frequency. A more complete discussion of FM occurs in part 5 of this series., f 71; -#X obj 296 385 declare -stdpath ./; -#X obj 195 290 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X text 219 289 <-- click to graph; -#X text 46 208 add modulator to carrier frequency -->, f 13; -#X text 37 286 oscillator -->; -#X obj 49 26 cnv 5 5 25 empty empty Frequency\ Modulation\ ("FM")\ using\ two\ oscillators 15 13 0 16 #dfdfdf #202020 0; +#X coords 0 1.02 440 -1.02 218 164 1; +#X restore 385 287 graph; +#X obj 223 458 tabwrite~ fm-output; +#X floatatom 251 247 5 0 0 0 - - - 0; +#X obj 163 363 osc~; +#X text 71 345 "carrier"; +#X obj 233 217 osc~; +#X text 410 469 --- 0.01 seconds ----; +#X text 83 591 To get the FM sound \, set all three of carrier frequency \, modulation frequency \, and modulation index in the hundreds. Note that you get a timbral change as you sweep modulation index \, because this changes the amplitudes of the components of the output sound but not their frequencies., f 70; +#X obj 163 498 output~; +#X text 76 78 This patch shows the classical FM synthesis technique developed by John Chowning. It's nothing but an oscillator with vibrato controlled by another "modulation" oscillator. First \, to understand the patch \, set carrier frequency to 400 or so \, modulation frequency between 5 and 10 \, and try modulation index values between 0 and 400 \, say. You'll hear a sine wave with vibrato., f 71; +#X obj 316 523 declare -stdpath ./; +#X obj 223 416 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X text 62 285 add modulator to carrier frequency -->, f 13; +#X text 53 363 oscillator -->; +#X obj 68 27 cnv 5 5 25 empty empty Frequency\ Modulation\ ("FM")\ using\ two\ oscillators 15 13 0 16 #dfdfdf #202020 0; +#X text 277 188 modulation frequency, f 10; +#X text 295 239 modulation index, f 10; +#X text 137 207 carrier frequency, f 9; +#X obj 223 383 metro 250; +#X obj 223 334 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 247 415 <-- graph once; +#X text 247 333 <-- graph repeatedly, f 11; +#X text 83 678 The component frequencies are equal to the carrier frequency \, plus or minus multiples of the modulator frequency. A more complete discussion of FM occurs in part "E" of this series., f 70; #X connect 0 0 3 1; -#X connect 1 0 15 0; +#X connect 1 0 9 0; #X connect 2 0 3 0; -#X connect 3 0 11 0; +#X connect 3 0 7 0; #X connect 6 0 0 1; -#X connect 11 0 5 0; -#X connect 11 0 18 0; -#X connect 15 0 0 0; -#X connect 22 0 5 0; +#X connect 7 0 5 0; +#X connect 7 0 12 0; +#X connect 9 0 0 0; +#X connect 15 0 5 0; +#X connect 22 0 15 0; +#X connect 23 0 22 0; diff --git a/doc/3.audio.examples/A10.review.pd b/doc/3.audio.examples/A10.review.pd index b2ebe0d4..3709b567 100644 --- a/doc/3.audio.examples/A10.review.pd +++ b/doc/3.audio.examples/A10.review.pd @@ -1,44 +1,44 @@ -#N canvas 571 90 638 701 12; -#X obj 84 141 tabwrite~; -#X obj 84 115 line~; -#X obj 90 263 +; -#X obj 84 89 +~; -#X obj 84 167 osc~; -#X obj 91 366 r; -#X obj 91 342 s; -#X obj 90 316 inlet; -#X obj 133 288 mtof; -#X obj 90 287 ftom; -#X obj 141 316 outlet; -#X obj 84 192 dac~; -#X text 29 62 So far we've seen these audio ("tilde") objects:; -#X text 141 114 -- ramp generator; -#X text 130 193 -- audio output ("digital/analog converter" -- a misnomer); -#X text 26 236 ... and these "control" objects:; -#X text 203 317 -- input and output to a subpatch; -#X text 127 343 ("send") -- wireless message sending; -#X text 128 368 ("receive") ... and receiving; -#X text 128 261 (etc.) -- arithmetic; -#X text 129 167 -- sinusoidal oscillator; -#X obj 91 587 tgl 19 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000 0 1; -#X text 118 588 -- toggle switch; -#X floatatom 91 564 0 0 0 0 - - - 0; -#X text 126 563 -- number box; -#X msg 91 541; -#X text 128 541 -- message box; -#X text 33 416 ... and these other (non-object) boxes:; -#X text 124 88 (etc.) -- bynary operation on audio signals; -#X obj 92 615 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X text 119 615 -- bang button; -#X obj 95 644 hsl 162 19 0 127 0 0 empty empty empty -2 -10 0 12 #fcfcfc #000000 #000000 0 1; -#X text 266 643 -- slider; -#X obj 174 288 dbtorms; +#N canvas 447 51 644 743 12; +#X obj 85 168 tabwrite~; +#X obj 85 142 line~; +#X obj 91 290 +; +#X obj 85 116 +~; +#X obj 85 194 osc~; +#X obj 92 393 r; +#X obj 92 369 s; +#X obj 91 343 inlet; +#X obj 134 315 mtof; +#X obj 91 314 ftom; +#X obj 142 343 outlet; +#X obj 85 219 dac~; +#X text 50 89 So far we've seen these audio ("tilde") objects:; +#X text 142 141 -- ramp generator; +#X text 131 220 -- audio output ("digital/analog converter" -- a misnomer); +#X text 47 263 ... and these "control" objects:; +#X text 204 344 -- input and output to a subpatch; +#X text 128 370 ("send") -- wireless message sending; +#X text 129 395 ("receive") ... and receiving; +#X text 129 288 (etc.) -- arithmetic; +#X text 130 194 -- sinusoidal oscillator; +#X obj 92 614 tgl 19 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000 0 1; +#X text 119 615 -- toggle switch; +#X floatatom 92 591 0 0 0 0 - - - 0; +#X text 127 590 -- number box; +#X msg 92 568; +#X text 129 568 -- message box; +#X text 54 443 ... and these other (non-object) boxes:; +#X text 125 115 (etc.) -- bynary operation on audio signals; +#X obj 93 642 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X text 120 642 -- bang button; +#X obj 96 671 hsl 162 19 0 127 0 0 empty empty empty -2 -10 0 12 #fcfcfc #000000 #000000 0 1; +#X text 267 670 -- slider; +#X obj 175 315 dbtorms; #N canvas 0 22 450 278 (subpatch) 0; #X array array 64 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; #X coords 0 1 64 -1 150 70 1 0 0; -#X restore 88 462 graph; -#X text 164 141 -- sampler (which we've only used for graphing audio so far); -#X text 249 487 -- array (for graphing audio so far); -#X text 234 286 -- acoustic conversions; -#X obj 68 21 cnv 5 5 25 empty empty Part\ 1\ Review 15 13 0 16 #dfdfdf #202020 0; +#X restore 89 489 graph; +#X text 165 168 -- sampler (which we've only used for graphing audio so far); +#X text 250 514 -- array (for graphing audio so far); +#X text 235 313 -- acoustic conversions; +#X obj 169 25 cnv 5 5 25 empty empty Part\ 1\ Review 15 13 0 16 #dfdfdf #202020 0; diff --git a/doc/3.audio.examples/B01.wavetables.pd b/doc/3.audio.examples/B01.wavetables.pd index d9943a5d..9d177a5a 100644 --- a/doc/3.audio.examples/B01.wavetables.pd +++ b/doc/3.audio.examples/B01.wavetables.pd @@ -1,28 +1,31 @@ -#N canvas 443 44 725 621 12; +#N canvas 467 43 654 772 12; #X declare -stdpath ./; -#X floatatom 127 72 6 0 0 0 - - - 0; +#X floatatom 364 201 6 20 100 0 - - - 0; +#X obj 364 230 mtof; +#X floatatom 364 257 8 0 0 0 - - - 0; +#X obj 364 286 tabosc4~ table10; +#X msg 189 349 \; table10 const 0; +#X obj 364 324 output~; +#X obj 397 35 declare -stdpath ./; +#X text 67 414 If you want a specific sinusoidal composition \, you can send table10 a message \, as below (see 15.arrays in the control examples):; +#X obj 82 22 cnv 5 5 25 empty empty Wavetable\ Oscillator 15 13 0 16 #dfdfdf #202020 0; +#X text 72 357 Clear table -->; +#X text 53 543 Note that I selected "save contents" in the properties dialog for table10 (right click on the table to see.) If this isn't set \, the waveform won't be remembered as part of the patch but will be reinitialized to zero when the patch is reopened. If this is set and you modified the waveform \, the current waveform gets stored with the file when you save the patch., f 74; +#X text 414 201 <-- pitch; +#X text 488 286 <-- wavetable oscillator, f 13; +#X text 61 73 Here \, in place of the [osc~] cosine wave oscillator \, we introduce the [tabosc4~] oscillator which uses arbitrary waveforms from arrays. You can draw a waveform in the array with the mouse., f 66; +#X msg 154 455 \; table10 cosinesum 256 0.2 -0.2 0.2 -0.2 0.2 -0.2 0.2 \, normalize; +#X obj 364 147 loadbang; +#X msg 364 174 60; #N canvas 0 0 450 300 (subpatch) 0; #X array table10 259 float 1; #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.612 0.612 0.612 0.612 0.612 0.627692 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.470769 -0.470769 -0.470769 -0.470769 -0.470769 -0.470769 -0.470769 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.627692 0.627692 0.627692 0.643385 0.643385 0.643385 0.659077 0 -0.502154 -0.502154 -0.502154 -0.486462 -0.486462 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.580615 0.596308 0.596308 0.596308 0.596308 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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.02 258 -1.02 258 130 1; -#X restore 279 104 graph; -#X text 25 135 wavetable; -#X obj 127 99 mtof; -#X floatatom 127 126 7 0 0 0 - - - 0; -#X obj 127 152 tabosc4~ table10; -#X msg 58 556 \; table10 cosinesum 256 0.2 -0.2 0.2 -0.2 0.2 -0.2 0.2; -#X msg 559 156 \; table10 const 0; -#X text 564 133 CLEAR TABLE; -#X obj 127 186 output~; -#X obj 509 45 declare -stdpath ./; -#X text 83 496 If you want a specific sinusoidal composition \, you can send table10 a message \, as below (see 15.arrays in the control examples):, f 73; -#X text 54 71 pitch -->; -#X text 19 152 oscillator -->; -#X text 83 275 Here \, in place of the [osc~] cosine wave oscillator \, we introduce the [tabosc4~] oscillator which uses arbitrary waveforms from arrays. You can draw a waveform in the array with the mouse., f 73; -#X text 83 411 For efficiency's sake [tabosc4~] requires that the table has a power of two plus three points (64+3=67 \, 128+3=131 \, 256+3=259 \, etc.) If you want wraparound to work smoothly \, you should make the last three points copies of the first three. This is done because [tabread4~] does 4-point interpolation., f 73; -#X text 83 331 Note that I selected "save contents" in the properties dialog for table10 (right click on the table to see.) If this isn't set \, the waveform won't be remembered as part of the patch but will be reinitialized to zero when the patch is reopened. If it this is set and you modified the waveform \, the current waveform gets stored with the file when you save the patch., f 73; -#X obj 82 23 cnv 5 5 25 empty empty Wavetable\ Oscillator 15 13 0 16 #dfdfdf #202020 0; -#X connect 0 0 3 0; -#X connect 3 0 4 0; -#X connect 4 0 5 0; -#X connect 5 0 9 0; +#X restore 61 173 graph; +#X text 53 627 For efficiency's sake [tabosc4~] requires that the table has a power of two plus three points (64+3=67 \, 128+3=131 \, 256+3=259 \, etc.) The three extra points are for copies of the first and last two points (more details later). The extra points are needed if you want wraparound to work smoothly and this is done because [tabosc4~] does 4-point interpolation. The sinesum and cosinesum commands already create table with these extra points worked out., f 74; +#X connect 0 0 1 0; +#X connect 1 0 2 0; +#X connect 2 0 3 0; +#X connect 3 0 5 0; +#X connect 15 0 16 0; +#X connect 16 0 0 0; diff --git a/doc/3.audio.examples/B02.two-wavetables.pd b/doc/3.audio.examples/B02.two-wavetables.pd index 241c6355..f852647e 100644 --- a/doc/3.audio.examples/B02.two-wavetables.pd +++ b/doc/3.audio.examples/B02.two-wavetables.pd @@ -4,23 +4,23 @@ #X array waveform11 259 float 1; #A 0 -0.0896033 0 0.0896033 0.178356 0.265425 0.350007 0.431348 0.508756 0.58161 0.649372 0.711597 0.767935 0.818137 0.862053 0.89963 0.930912 0.956028 0.975187 0.988669 0.996811 1 0.998655 0.993223 0.984158 0.971919 0.956953 0.939691 0.920538 0.899867 0.878018 0.85529 0.831945 0.808204 0.784252 0.760239 0.736284 0.712477 0.688888 0.665568 0.642553 0.619872 0.59755 0.575607 0.554066 0.532953 0.512296 0.49213 0.472491 0.453419 0.434957 0.417147 0.400027 0.383632 0.367992 0.353126 0.339046 0.32575 0.313227 0.301453 0.290394 0.280002 0.270224 0.260995 0.252248 0.24391 0.235908 0.22817 0.220628 0.213219 0.205888 0.198586 0.191278 0.183936 0.176545 0.169098 0.1616 0.154063 0.146505 0.138954 0.131437 0.123987 0.116636 0.109415 0.102354 0.0954784 0.0888083 0.08236 0.0761442 0.0701659 0.0644253 0.0589178 0.0536354 0.0485669 0.0436994 0.0390194 0.0345135 0.0301695 0.0259776 0.0219306 0.0180245 0.0142591 0.0106377 0.00716724 0.00385775 0.000722025 -0.00222511 -0.0049675 -0.00748845 -0.00977153 -0.0118014 -0.0135644 -0.0150493 -0.0162479 -0.0171551 -0.0177693 -0.0180928 -0.0181312 -0.0178936 -0.017392 -0.0166417 -0.0156601 -0.0144666 -0.0130822 -0.0115294 -0.00983114 -0.0080113 -0.00609396 -0.0041034 -0.00206402 -2.23572e-07 0.00206358 0.00410297 0.00609353 0.00801089 0.00983075 0.011529 0.0130819 0.0144663 0.0156599 0.0166416 0.0173919 0.0178935 0.0181312 0.0180929 0.0177695 0.0171552 0.0162481 0.0150496 0.0135647 0.0118018 0.009772 0.00748897 0.00496807 0.00222573 -0.000721367 -0.00385706 -0.00716651 -0.010637 -0.0142583 -0.0180237 -0.0219297 -0.0259767 -0.0301686 -0.0345125 -0.0390184 -0.0436984 -0.0485658 -0.0536343 -0.0589167 -0.0644241 -0.0701647 -0.0761429 -0.0823587 -0.0888069 -0.0954769 -0.102353 -0.109414 -0.116634 -0.123985 -0.131435 -0.138952 -0.146504 -0.154061 -0.161598 -0.169097 -0.176543 -0.183935 -0.191276 -0.198584 -0.205886 -0.213218 -0.220627 -0.228169 -0.235906 -0.243908 -0.252246 -0.260993 -0.270222 -0.28 -0.290392 -0.301451 -0.313224 -0.325747 -0.339043 -0.353123 -0.367989 -0.383629 -0.400023 -0.417143 -0.434954 -0.453415 -0.472486 -0.492125 -0.512292 -0.532948 -0.554062 -0.575602 -0.597545 -0.619868 -0.642548 -0.665563 -0.688883 -0.712472 -0.736279 -0.760234 -0.784247 -0.808199 -0.83194 -0.855285 -0.878013 -0.899863 -0.920533 -0.939687 -0.956949 -0.971916 -0.984156 -0.993221 -0.998655 -1 -0.996813 -0.988671 -0.975191 -0.956033 -0.930918 -0.899638 -0.862061 -0.818147 -0.767947 -0.71161 -0.649386 -0.581625 -0.508772 -0.431366 -0.350025 -0.265443 -0.178375 -0.0896226 -1.94061e-05 0.089584; #X coords 0 1.02 258 -1.02 258 130 1; -#X restore 348 194 graph; -#X text 47 147 wavetable; +#X restore 349 201 graph; +#X text 48 154 wavetable; #N canvas 0 22 450 278 (subpatch) 0; #X array pitch11 259 float 1; #A 0 757.143 757.143 735.714 700 671.429 650 621.429 600 571.429 550 521.429 507.143 485.714 464.286 442.857 428.571 414.286 400 378.571 364.286 342.857 328.571 928.571 921.429 921.429 914.286 907.143 892.857 885.714 878.571 864.286 850 828.571 807.143 792.857 785.714 775 764.286 753.571 742.857 735.714 728.571 721.429 714.286 703.571 692.857 682.143 671.429 650 628.571 617.857 607.143 596.429 585.714 575 564.286 553.571 542.857 532.143 521.429 510.714 500 485.714 478.571 464.286 450 435.714 428.571 400 392.857 385.714 378.571 357.143 350 342.857 335.714 328.571 314.286 292.857 285.714 271.429 264.286 571.429 571.429 571.429 571.429 571.429 564.286 564.286 278.571 271.429 271.429 278.571 278.571 278.571 278.571 571.429 571.429 571.429 575 578.571 578.571 278.571 278.571 285.714 285.714 278.571 278.571 278.571 878.571 878.571 878.571 878.571 878.571 321.429 325 328.571 328.571 328.571 328.571 885.714 885.714 885.714 885.714 207.143 207.143 207.143 200 207.143 207.143 207.143 214.286 214.286 221.429 228.571 228.571 242.857 250 257.143 264.286 278.571 292.857 307.143 321.429 335.714 350 371.429 392.857 421.429 435.714 471.429 500 542.857 571.429 628.571 664.286 700 728.571 757.143 792.857 828.571 885.714 928.571 978.571 1000 1007.14 1007.14 1000 1000 992.857 985.714 885.714 914.286 671.429 671.429 671.429 671.429 671.429 671.429 671.429 671.429 671.429 671.429 678.571 635.714 635.714 678.571 714.286 714.286 678.571 635.714 635.714 635.714 742.857 742.857 685.714 685.714 635.714 621.429 685.714 792.857 792.857 678.571 521.429 521.429 521.429 864.286 857.143 857.143 471.429 471.429 471.429 471.429 921.429 921.429 385.714 385.714 385.714 964.286 964.286 964.286 328.571 328.571 328.571 328.571 885.714 885.714 885.714 685.714 214.286 214.286 207.143 207.143 921.429 921.429 921.429 921.429 207.143 207.143 200 200 957.143 957.143 950 214.286 214.286 207.143 207.143 957.143 957.143 950 200 207.143 207.143 942.857 942.857 942.857 950 950; #X coords 0 1000 258 0 259 140 1; -#X restore 348 31 graph; -#X obj 145 128 tabosc4~ pitch11; -#X obj 145 164 tabosc4~ waveform11; -#X obj 145 96 sig~ 0.5; -#X obj 145 215 output~; -#X obj 144 291 declare -stdpath ./; -#X text 69 95 pitch -->; -#X text 41 164 oscillator -->; -#X text 90 371 Here's a [tabosc4~] controlling the frequency of another one. If you get properties on the two arrays \, you'll see that the top graph has a vertical scale from 0 to 1000 \, to represent a range in Hz., f 69; -#X text 90 419 We're looping through that at a frequency of 0.5 Hz and the output is used as the frequency input of the second [tabosc4~]. I've detected Klingons \, Captain Kirk..., f 69; -#X obj 35 22 cnv 5 5 25 empty empty Two\ Wavetable\ Oscillators 15 13 0 16 #dfdfdf #202020 0; +#X restore 349 38 graph; +#X obj 146 135 tabosc4~ pitch11; +#X obj 146 171 tabosc4~ waveform11; +#X obj 146 103 sig~ 0.5; +#X obj 146 222 output~; +#X obj 145 298 declare -stdpath ./; +#X text 70 102 pitch -->; +#X text 42 171 oscillator -->; +#X text 101 363 Here's a [tabosc4~] controlling the frequency of another one. If you get properties on the two arrays \, you'll see that the top graph has a vertical scale from 0 to 1000 \, to represent a range in Hz., f 69; +#X text 101 411 We're looping through that at a frequency of 0.5 Hz and the output is used as the frequency input of the second [tabosc4~]. I've detected Klingons \, Captain Kirk..., f 69; +#X obj 36 29 cnv 5 5 25 empty empty Two\ Wavetable\ Oscillators 15 13 0 16 #dfdfdf #202020 0; #X connect 3 0 4 0; #X connect 4 0 6 0; #X connect 5 0 3 0; diff --git a/doc/3.audio.examples/B03.tabread4.pd b/doc/3.audio.examples/B03.tabread4.pd deleted file mode 100644 index c70c7180..00000000 --- a/doc/3.audio.examples/B03.tabread4.pd +++ /dev/null @@ -1,45 +0,0 @@ -#N canvas 376 88 742 685 12; -#X declare -stdpath ./; -#N canvas 0 0 450 300 (subpatch) 0; -#X array waveform12 131 float 1; -#A 0 -0.172615 -0.172615 -0.172615 -0.172615 -0.172615 -0.141231 -0.109846 -0.0941538 -0.0627692 -0.0470769 0.0156923 0.0784615 0.125538 0.188308 0.235385 0.298154 0.360923 0.392308 0.470769 0.533538 0.596308 0.643385 0.674769 0.721846 0.753231 0.784615 0.816 0.831692 0.847385 0.878769 0.894462 0.910154 0.910154 0.910154 0.910154 0.910154 0.894462 0.894462 0.894462 0.894462 0.878769 0.863077 0.816 0.800308 0.768923 0.737538 0.706154 0.674769 0.643385 0.596308 0.564923 0.533538 0.470769 0.423692 0.376615 0.313846 0.266769 0.204 0.172615 0.109846 0.0627692 0.0156923 0 -0.0313846 -0.0627692 -0.0784615 -0.0941538 -0.109846 -0.141231 -0.156923 -0.172615 -0.204 -0.219692 -0.219692 -0.235385 -0.235385 -0.235385 -0.219692 -0.219692 -0.219692 -0.204 -0.156923 -0.125538 -0.0784615 0 0.172615 0.313846 0.470769 0.564923 0.627692 0.690462 0.721846 0.737538 0.753231 0.768923 0.768923 0.753231 0.737538 0.706154 0.674769 0.612 0.580615 0.549231 0.517846 0.486462 0.423692 0.392308 0.360923 0.282462 0.219692 0.109846 -0.0156923 -0.0941538 -0.109846 -0.141231 -0.156923 -0.172615 -0.188308 -0.204 -0.204 -0.219692 -0.204 -0.204 -0.219692 -0.219692 -0.204 -0.204 -0.204 -0.204 -0.204 -0.188308; -#X coords 0 1.02 130 -1.02 258 130 1; -#X restore 396 124 graph; -#X obj 160 160 phasor~; -#X obj 160 249 tabread4~ waveform12; -#X obj 160 222 +~ 1; -#X floatatom 160 131 6 0 0 0 - - - 0; -#X floatatom 254 121 6 0 1000 0 - - - 0; -#X obj 254 169 line~; -#X obj 160 196 *~; -#X text 53 146 phase; -#X text 53 182 range; -#X text 254 100 squeeze; -#X text 137 105 frequency; -#N canvas 0 0 450 300 (subpatch) 0; -#X array wave-out12 441 float 0; -#X coords 0 1 440 -1 259 134 1; -#X restore 395 284 graph; -#X obj 201 321 tabwrite~ wave-out12; -#X obj 254 193 +~ 128; -#X obj 161 361 output~; -#X obj 536 57 declare -stdpath ./; -#X obj 201 285 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X text 224 284 <-- click to graph; -#X obj 254 145 pack f 50; -#X text 52 161 generation -->; -#X text 52 197 adjustment -->; -#X text 79 449 The [tabread4~] module is available for situations requiring more control than [tabosc4~] offers. The relationship between the two is the same as between [cos~] and [osc~] \, although the units are different between [cos~] and [tabread4~]. The [cos~] objects assumes input is normalized from 0 to 1 (and will wrap around as needed) \, while [tabread4~] takes values from 1 to n-2 where n is the number of points in the table-- for a 131-point table such as we have here with "waveform12" \, it's 1 to 129 (so the "good" segment is 128 samples long.), f 87; -#X text 79 559 You would use [tabread4~] (as opposed to [tabosc4~]) if you need direct control of the phase \, for instance to advance nonlinearly through the table. In the case shown here \, the "squeeze" factor makes the phase grow to a value at least \, and possibly much greater than \, 129 (to which [tabread4~] then limits it). So the resulting waveform is compressed in time., f 87; -#X obj 41 36 cnv 5 5 25 empty empty A\ Wavetable\ Oscillator\ with\ [tabread4~] 15 13 0 16 #dfdfdf #202020 0; -#X connect 1 0 7 0; -#X connect 2 0 13 0; -#X connect 2 0 15 0; -#X connect 3 0 2 0; -#X connect 4 0 1 0; -#X connect 5 0 19 0; -#X connect 6 0 14 0; -#X connect 7 0 3 0; -#X connect 14 0 7 1; -#X connect 17 0 13 0; -#X connect 19 0 6 0; diff --git a/doc/3.audio.examples/B03.tabread4~.pd b/doc/3.audio.examples/B03.tabread4~.pd new file mode 100644 index 00000000..4462da0e --- /dev/null +++ b/doc/3.audio.examples/B03.tabread4~.pd @@ -0,0 +1,77 @@ +#N canvas 401 82 748 768 12; +#X declare -stdpath ./; +#N canvas 0 0 450 300 (subpatch) 0; +#X array waveform12 131 float 1; +#A 0 -0.172615 -0.172615 -0.172615 -0.172615 -0.172615 -0.141231 -0.109846 -0.0941538 -0.0627692 -0.0470769 0.0156923 0.0784615 0.125538 0.188308 0.235385 0.298154 0.360923 0.392308 0.470769 0.533538 0.596308 0.643385 0.674769 0.721846 0.753231 0.784615 0.816 0.831692 0.847385 0.878769 0.894462 0.910154 0.910154 0.910154 0.910154 0.910154 0.894462 0.894462 0.894462 0.894462 0.878769 0.863077 0.816 0.800308 0.768923 0.737538 0.706154 0.674769 0.643385 0.596308 0.564923 0.533538 0.470769 0.423692 0.376615 0.313846 0.266769 0.204 0.172615 0.109846 0.0627692 0.0156923 0 -0.0313846 -0.0627692 -0.0784615 -0.0941538 -0.109846 -0.141231 -0.156923 -0.172615 -0.204 -0.219692 -0.219692 -0.235385 -0.235385 -0.235385 -0.219692 -0.219692 -0.219692 -0.204 -0.156923 -0.125538 -0.0784615 0 0.172615 0.313846 0.470769 0.564923 0.627692 0.690462 0.721846 0.737538 0.753231 0.768923 0.768923 0.753231 0.737538 0.706154 0.674769 0.612 0.580615 0.549231 0.517846 0.486462 0.423692 0.392308 0.360923 0.282462 0.219692 0.109846 -0.0156923 -0.0941538 -0.109846 -0.141231 -0.156923 -0.172615 -0.188308 -0.204 -0.204 -0.219692 -0.204 -0.204 -0.219692 -0.219692 -0.204 -0.204 -0.204 -0.204 -0.204 -0.188308; +#X coords 0 1.02 130 -1.02 258 130 1; +#X restore 424 120 graph; +#X obj 156 142 phasor~; +#X obj 156 231 tabread4~ waveform12; +#X obj 156 204 +~ 1; +#X floatatom 156 113 6 0 0 0 - \$0-frequency - 0; +#X floatatom 250 103 6 0 500 0 - \$0-squeeze - 0; +#X obj 250 151 line~; +#X obj 156 178 *~; +#X text 49 128 phase; +#X text 49 164 range; +#X text 250 82 squeeze; +#X text 133 87 frequency; +#N canvas 0 0 450 300 (subpatch) 0; +#X array wave-out12 441 float 0; +#X coords 0 1 440 -1 259 134 1; +#X restore 423 280 graph; +#X obj 250 175 +~ 128; +#X obj 157 363 output~; +#X obj 207 269 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 250 127 pack f 50; +#X text 48 143 generation -->; +#X text 48 179 adjustment -->; +#X obj 63 27 cnv 5 5 25 empty empty A\ Wavetable\ Oscillator\ with\ [tabread4~]\ and\ [phasor~] 15 13 0 16 #dfdfdf #202020 0; +#X text 230 268 <-- graph once; +#X obj 234 296 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 258 295 <-- graph repeatedly, f 10; +#N canvas 146 130 450 300 graph 0; +#X obj 256 73 inlet; +#X obj 192 73 inlet; +#X obj 192 203 tabwrite~ wave-out12; +#X obj 256 137 metro 250; +#X obj 122 73 inlet~; +#X connect 0 0 3 0; +#X connect 1 0 2 0; +#X connect 3 0 2 0; +#X connect 4 0 2 0; +#X restore 181 326 pd graph; +#X text 66 656 You would use [tabread4~] (as opposed to [tabosc4~]) if you need direct control of the phase \, for instance to advance nonlinearly through the table. In the case shown here \, the "squeeze" factor makes the phase grow to a value at least \, and possibly much greater than \, 129 (to which [tabread4~] then limits it). So the resulting waveform is compressed in time. The graphing is now performed in the [pd graph] subpatch., f 86; +#N canvas 1002 256 319 305 init 0; +#X obj 93 90 loadbang; +#X obj 93 191 s \$0-frequency; +#X msg 93 143 220; +#X obj 140 159 s \$0-squeeze; +#X msg 140 131 50; +#X text 58 22 This subpatch initializes the patch and loads values into the number boxes, f 26; +#X obj 91 250 declare -stdpath ./; +#X connect 0 0 2 0; +#X connect 0 0 4 0; +#X connect 2 0 1 0; +#X connect 4 0 3 0; +#X restore 310 396 pd init; +#X obj 48 286 phasor~; +#X obj 48 310 cos~; +#X obj 65 371 osc~; +#X text 37 258 this...; +#X text 33 345 is the same as, f 12; +#X text 66 519 The [tabread4~] module is suited for situations requiring more control than [tabosc4~] offers. The relationship between the two is the same as between [cos~] and [osc~] \, although the units are different between [cos~] and [tabread4~]. The [cos~] object is a cosine table and assumes an input normalized from 0 to 1 as given by [phasor~] (although it will wrap around over this range as needed) \, while [tabread4~] takes values from 1 to n-2 where n is the number of points in the table -- for a 131-point table such as we have here with "waveform12" \, it's 1 to 129 \, but 129 is supposedly a copy of 1 (more details in the next example). This means it wraps at 129 to 1 (hence \, the "good" segment is actually just 128 samples long.), f 86; +#X text 67 453 The [phasor~] object generates phase ramps from 0 to 1 and repeats it at a frequency in Hz. This is a sawtooth like signal but not a proper sawtooth waveform for synthesis (which is in the range of -1 to 1). You can use [phasor~] to drive [cos~] and [tabread4~] to implement oscillators \, for instance., f 86; +#X connect 1 0 7 0; +#X connect 2 0 14 0; +#X connect 2 0 23 0; +#X connect 3 0 2 0; +#X connect 4 0 1 0; +#X connect 5 0 16 0; +#X connect 6 0 13 0; +#X connect 7 0 3 0; +#X connect 13 0 7 1; +#X connect 15 0 23 1; +#X connect 16 0 6 0; +#X connect 21 0 23 2; +#X connect 26 0 27 0; diff --git a/doc/3.audio.examples/B04.tabread4.interpolation.pd b/doc/3.audio.examples/B04.tabread4.interpolation.pd index 5e5fc6f9..11e4a225 100644 --- a/doc/3.audio.examples/B04.tabread4.interpolation.pd +++ b/doc/3.audio.examples/B04.tabread4.interpolation.pd @@ -1,16 +1,15 @@ -#N canvas 456 108 739 519 12; +#N canvas 447 89 789 683 12; #N canvas 0 22 450 278 (subpatch) 0; -#X array waveform13 11 float 1; -#A 0 1 1 1 1 1 1 1 -1 -1 -1 -1; -#X coords 0 1.02 10 -1.02 180 130 1; -#X restore 404 24 graph; +#X array waveform13 11 float 2; +#X coords 0 1.02 11 -1.02 300 140 1 0 0; +#X restore 405 39 graph; #X obj 162 159 +~ 1; #X text 52 82 phase; #X text 52 131 range; #N canvas 0 22 450 278 (subpatch) 0; #X array wave-out13 441 float 0; -#X coords 0 1.02 440 -1.02 300 140 1; -#X restore 405 217 graph; +#X coords 0 1.02 440 -1.02 300 140 1 0 0; +#X restore 405 237 graph; #X obj 162 249 tabwrite~ wave-out13; #X obj 162 186 tabread4~ waveform13; #X obj 162 133 *~ 8; @@ -18,21 +17,21 @@ #X obj 214 318 sig~ 220; #X obj 214 348 tabosc4~ waveform13; #X text 204 217 <-- click to graph; -#X obj 179 218 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 179 218 bng 19 250 50 0 empty graphit empty 17 7 0 10 #dfdfdf #000000 #000000; #X obj 41 198 ../5.reference/set-dsp-tgl; #X text 72 201 DSP on/off; #X msg 41 235 \; pd dsp \$1; #X text 51 97 generation -->; #X text 51 146 adjustment -->; #X text 86 297 this would be equivalent to the above -->, f 25; -#X text 46 398 This patch demonstrates 4-point interpolation in [tabread4~]. The 11-point table \, "waveform13" \, contains a transition from from 1 to -1 \, which is "smoothed" as seen in wave-out13. There's no such transition at the wrap around point--the interpolation always happens between 4 consecutive samples of the table \, disregarding wraparound., f 65; -#N canvas 801 456 474 197 init_waveform 0; -#X obj 73 42 loadbang; -#X msg 73 99 \; waveform13 0 1 1 1 1 1 1 1 -1 -1 -1 -1 \; waveform13 xlabel -1.2 0 1 2 3 4 5 6 7 8 9 10; -#X text 195 52 initialize waveform; -#X connect 0 0 1 0; -#X restore 564 429 pd init_waveform; #X obj 34 25 cnv 5 5 25 empty empty 4-Point\ Interpolation\ in\ detail 15 13 0 16 #dfdfdf #202020 0; +#X text 545 580 no copies; +#X text 242 580 with copies; +#X text 93 491 The table contains a transition from 1 to -1 at index 7 to 8 and \, which is "smoothed" as seen in wave-out13. Since index 9 is a copy of 1 there's a transition back. You can try below a table without copies for the extra points and see how in this case there's not a smooth transition at the wrap around point., f 86; +#X text 93 405 This patch demonstrates 4-point interpolation in [tabread4~]. The 11-point table \, "waveform13" \, is actually an 8-point table (from index 1 to 8) with extra copied points (0 \, 9 and 10). The 0 index point is a copy of point 8 and points 9 and 10 are copies of points 1 and 2 \, which is needed for the 4-point interpolation (which means the interpolation always happens between 4 consecutive samples of the table)., f 86; +#X msg 425 603 \; waveform13 0 1 1 1 1 1 1 1 -1 -1 -1 -1 \; graphit bang; +#X msg 122 603 \; waveform13 0 -1 1 1 1 1 1 1 -1 -1 1 1 \; graphit bang; +#X obj 122 577 loadbang; #X connect 1 0 6 0; #X connect 6 0 5 0; #X connect 7 0 1 0; @@ -40,3 +39,4 @@ #X connect 9 0 10 0; #X connect 12 0 5 0; #X connect 13 0 15 0; +#X connect 26 0 25 0; diff --git a/doc/3.audio.examples/B05.tabread.FM.pd b/doc/3.audio.examples/B05.tabread.FM.pd index 99a80eda..16c51188 100644 --- a/doc/3.audio.examples/B05.tabread.FM.pd +++ b/doc/3.audio.examples/B05.tabread.FM.pd @@ -1,24 +1,34 @@ -#N canvas 362 78 692 410 12; +#N canvas 455 83 718 413 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array pitchmod14 131 float 1; -#A 0 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.831692 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.863077 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 -0.800308 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308; -#X coords 0 1.02 130 -1.02 258 130 1; -#X restore 341 216 graph; -#X floatatom 145 89 4 0 0 0 - - - 0; -#X floatatom 101 159 4 0 0 0 - - - 0; -#X obj 145 202 *~; -#X floatatom 163 170 4 0 0 0 - - - 0; -#X obj 127 233 +~; -#X obj 127 265 osc~; -#X obj 145 130 tabosc4~ pitchmod14; -#X obj 127 307 output~; -#X obj 474 27 declare -stdpath ./; -#X text 338 117 This [tabosc4~] controls the pitch of a sinusoidal oscillator ([osc~]). Try changing the waveform as well as the three familiar parameters., f 37; -#X text 199 163 modulation depth, f 10; -#X text 38 162 carrier frequency, f 9; -#X text 183 82 modulation frequency, f 10; -#X obj 34 25 cnv 5 5 25 empty empty Frequency\ Modulation\ by\ Wavetables 15 13 0 16 #dfdfdf #202020 0; +#A 0 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 -0.784616 -0.784616 -0.784616 -0.784616 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784616 -0.784616 -0.784616 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784616 -0.784616 -0.784616 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615; +#X coords 0 1.02 130 -1.02 258 130 1 0 0; +#X restore 374 232 graph; +#X floatatom 169 86 6 0 0 0 - \$0-mod - 0; +#X floatatom 115 156 5 0 0 0 - \$0-carrier - 0; +#X obj 169 199 *~; +#X floatatom 187 167 6 0 0 0 - \$0-index - 0; +#X obj 151 230 +~; +#X obj 151 262 osc~; +#X obj 169 127 tabosc4~ pitchmod14; +#X obj 151 304 output~; +#X text 365 101 This [tabosc4~] controls the pitch of a sinusoidal oscillator ([osc~]). Try changing the waveform as well as the three familiar parameters., f 37; +#X text 52 159 carrier frequency, f 9; +#X text 220 79 modulation frequency, f 10; +#X obj 58 22 cnv 5 5 25 empty empty Frequency\ Modulation\ by\ Wavetables 15 13 0 16 #dfdfdf #202020 0; +#N canvas 1002 256 344 383 init 0; +#X obj 104 112 loadbang; +#X text 62 37 This subpatch initializes the patch and loads values into the number boxes, f 26; +#X msg 104 220 \; \$1-carrier 220 \; \$1-mod 5 \; \$1-index 50; +#X obj 104 182 f \$0; +#X obj 104 146 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 102 318 declare -stdpath ./; +#X connect 0 0 4 0; +#X connect 3 0 2 0; +#X connect 4 0 3 0; +#X restore 59 321 pd init; +#X text 238 161 modulation index, f 10; #X connect 1 0 7 0; #X connect 2 0 5 0; #X connect 3 0 5 1; diff --git a/doc/3.audio.examples/B06.table.switching.pd b/doc/3.audio.examples/B06.table.switching.pd index eaad19e5..6adb5f48 100644 --- a/doc/3.audio.examples/B06.table.switching.pd +++ b/doc/3.audio.examples/B06.table.switching.pd @@ -1,30 +1,30 @@ -#N canvas 397 133 805 575 12; +#N canvas 346 38 898 557 12; #X declare -stdpath ./; #N canvas 0 22 450 278 (subpatch) 0; #X array waveshape15a 131 float 1; #A 0 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.863077 0.831692 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.863077 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 -0.800308 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308; #X coords 0 1.02 130 -1.02 258 130 1; -#X restore 509 99 graph; +#X restore 58 223 graph; #N canvas 0 22 450 278 (subpatch) 0; #X array waveshape15b 131 float 1; #A 0 -0.659077 -0.643385 -0.643385 -0.627692 -0.612 -0.612 -0.596308 -0.596308 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.596308 -0.596308 -0.596308 -0.596308 -0.596308 -0.596308 -0.596308 -0.596308 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.580615 -0.564923 -0.549231 -0.549231 -0.533538 -0.517846 -0.517846 -0.517846 -0.517846 -0.517846 -0.517846 -0.517846 -0.517846 -0.533538 -0.549231 -0.580615 -0.580615 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 0.863077 0.847385 0.847385 0.847385 0.847385 0.847385 0.847385 -0.800308 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.768923 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.784615 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308 -0.800308; #X coords 0 1.02 130 -1.02 258 130 1; -#X restore 509 254 graph; -#X obj 146 282 tabosc4~ waveshape15a; -#X obj 146 174 sig~ 110; -#X msg 171 203 set waveshape15a; -#X msg 179 229 set waveshape15b; -#X obj 146 320 output~; -#X obj 300 346 declare -stdpath ./; -#X obj 79 476 array define -k waveshape15c 131; +#X restore 58 379 graph; +#X obj 373 379 tabosc4~ waveshape15a; +#X obj 373 231 sig~ 110; +#X msg 398 280 set waveshape15a; +#X msg 406 306 set waveshape15b; +#X obj 373 422 output~; +#X obj 638 41 declare -stdpath ./; +#X obj 592 308 array define -k waveshape15c 131; #A 0 0 -0.553343 -0.486675 -0.426674 -0.333339 -0.300005 -0.233338 -0.173337 -0.113336 -0.0600014 -0.0133339 0.0333335 0.0866678 0.133335 0.173336 0.213337 0.24667 0.280004 0.313338 0.333339 0.353339 0.346672 0.300005 -0.240004 -0.306672 -0.306672 -0.306672 -0.306672 -0.313339 -0.326673 -0.333339 -0.35334 -0.360006 -0.37334 -0.453341 -0.460008 -0.460008 -0.460008 -0.453341 -0.426674 -0.400007 -0.340006 -0.253338 -0.18667 -3.57628e-07 0.0533339 0.180003 0.200003 0.280004 0.320005 0.360006 0.392006 0.424007 0.456007 0.488008 0.520008 0.540009 0.563343 0.586676 0.606677 0.62001 0.62001 0.420007 -0.506676 -0.586677 -0.673345 -0.720013 -0.74668 -0.780014 -0.900016 -0.900016 -0.886682 -0.860015 -0.840015 -0.820014 -0.78668 -0.76668 -0.74668 -0.693345 -0.662234 -0.631122 -0.600011 -0.573343 -0.543343 -0.513342 -0.480008 -0.446675 -0.418341 -0.390007 -0.361673 -0.333339 -0.293339 -0.253338 -0.220004 -0.18667 -0.153336 -0.120002 -0.0866685 -0.0533346 -0.0200007 0.00999981 0.0400003 0.0666674 0.0933346 0.123335 0.153336 0.20667 0.233337 0.260004 0.291116 0.322227 0.353339 0.400006 0.440007 0.480008 0.500008 0.533342 0.566676 0.60001 0.626677 0.653344 0.683345 0.740012 0.780013 0.82668 0.853347 0.846681 0.833347 0.773346 0.706678 0.646677; -#X msg 184 254 set waveshape15c; -#X obj 79 515 table; -#X text 48 395 There's also an [array] object so that you can have arrays with parameterizable names and sizes. You can also save the state of the array in this case \, and read it in from a file or calculate it at startup.; -#X text 123 516 <-- see also this older and less powerful object (you can't save contents in this one)., f 46; -#X text 24 55 During a performance you're unlikely to want to draw or recalculate wavetables on the fly \, because you don't want to give Pd computationally intensive atomic tasks that could make Pd miss a DAC deadline. Instead \, use "set" messages to switch [tabosc~] or [tabread4~] between pre-prepared tables. Indeed \, you will eventually want to save screen space by throwing all your wavetables in a subpatch somewhere.; -#X text 316 477 <-- click to open; -#X obj 37 14 cnv 5 5 25 empty empty Switching\ between\ tables 15 13 0 16 #dfdfdf #202020 0; +#X msg 411 331 set waveshape15c; +#X obj 590 369 table; +#X text 638 368 <-- see also this older and less powerful object (you can't save contents in this one)., f 28; +#X obj 64 32 cnv 5 5 25 empty empty Switching\ between\ tables 15 13 0 16 #dfdfdf #202020 0; +#X text 36 89 During a performance you're unlikely to want to draw or recalculate wavetables on the fly \, because you don't want to give Pd computationally intensive atomic tasks that could make Pd miss a DAC deadline. Instead \, use "set" messages to switch [tabosc4~] or [tabread4~] between pre-prepared tables., f 62; +#X text 505 89 Indeed \, you will eventually want to save screen space by throwing all your wavetables in a subpatch somewhere or use the [array] object instead. The [array] object can have arrays with parameterizable names and sizes. You can also save the state of the array in this case \, and read it in from a file or calculate it at startup., f 47; +#X text 591 281 click on the object to open it:; #X connect 2 0 6 0; #X connect 3 0 2 0; #X connect 4 0 2 0; diff --git a/doc/3.audio.examples/B07.sampler.scratch.pd b/doc/3.audio.examples/B07.sampler.scratch.pd index 52d8ff77..d7603880 100644 --- a/doc/3.audio.examples/B07.sampler.scratch.pd +++ b/doc/3.audio.examples/B07.sampler.scratch.pd @@ -1,46 +1,49 @@ -#N canvas 418 47 764 678 12; +#N canvas 370 60 747 726 12; #X declare -stdpath ./; -#X obj 59 325 hip~ 5; #N canvas 0 0 450 300 (subpatch) 0; #X array sample-table 44103 float 2; -#X coords 0 1.02 44103 -1.02 200 130 1; -#X restore 503 48 graph; -#X obj 59 287 tabread4~ sample-table; -#X obj 59 255 line~; -#X obj 59 126 * 441; -#X floatatom 59 68 5 0 100 0 - - - 0; -#X text 106 126 convert to SAMPLES (441 samples in 0.01 sec); -#X obj 204 355 loadbang; -#X text 45 570 For more on reading and writing soundfiles to tables \, setting their lengths \, etc \, see "arrays" in the "control examples" series., f 96; -#X text 45 531 Fanatics take note: if you want really high-fidelity sampling \, use a high-quality resampling program to up-sample your soundfile to 88200 to drastically reduce interpolation error., f 96; -#X text 101 255 convert smoothly to audio signal; -#X text 107 86 (range is 0-100.) YOU ONLY HEAR OUTPUT; -#X text 108 102 WHEN THIS IS 0-100 AND ACTIVELY CHANGING.; -#X msg 204 379 read ../sound/voice.wav sample-table; -#X obj 204 404 soundfiler; -#X obj 59 368 output~; -#X obj 581 268 declare -stdpath ./; -#X obj 59 153 pack f 100; -#X text 100 68 <-- read point in 100ths of a second, f 39; -#X text 111 325 high pass filter to cut DC; -#X listbox 59 184 10 0 0 0 - - - 0; -#X text 230 279 read from the table (the input is the index in samples), f 30; -#X text 477 360 message to read a soundfile into the table (automatically sent when you load this patch by the [loadbang] object.), f 30; -#X text 45 454 This patch implements a simples scratch machine with [tabread4~] \, which reads audio samples out of a floating-point array \, often called a "sample table." The input is the index of the sample to read \, counting from zero. The output is calculated using 4-point cubic interpolation \, which is adequate for most purposes. Because of the interpolation scheme \, [tabread4~]'s input cannot be less than one or greater than the table length minus two., f 96; -#X text 45 606 Note the highpass filter ([hip~ 5]) that is present to filter a DC component (0 hz frequency). This is not actually needed as the [output~] abstraction already includes [hip~] objects to filter DC \, but it's present in the examples for didactic reasons., f 96; -#X text 508 202 (one second plus three extra; -#X text 510 221 for 4-point interpolation); -#X text 527 180 --- 44103 samples ---; -#X msg 78 218 1 \, 44101 1000; -#X text 182 217 read the whole table (from 1 to n-2); -#X obj 109 21 cnv 5 5 25 empty empty Scratch\ Machine 15 13 0 16 #dfdfdf #202020 0; -#X connect 0 0 15 0; -#X connect 2 0 0 0; -#X connect 3 0 2 0; -#X connect 4 0 17 0; -#X connect 5 0 4 0; -#X connect 7 0 13 0; -#X connect 13 0 14 0; -#X connect 17 0 20 0; -#X connect 20 0 3 0; -#X connect 28 0 3 0; +#X coords 0 1.02 44103 -1.02 259 147 1; +#X restore 460 213 graph; +#X obj 72 450 tabread4~ sample-table; +#X obj 72 392 line~; +#X obj 72 263 * 441; +#X floatatom 72 205 7 0 100 0 - - - 0; +#X text 119 263 convert to SAMPLES (441 samples in 0.01 sec); +#X obj 220 498 loadbang; +#X text 77 672 For more on reading and writing soundfiles to tables \, setting their lengths \, etc \, see "arrays" in the "control examples" series., f 85; +#X text 77 624 Fanatics take note: if you want really high-fidelity sampling \, use a high-quality resampling program to up-sample your soundfile to 88200 to drastically reduce interpolation error., f 85; +#X text 121 392 convert smoothly to audio signal; +#X text 136 223 (range is 0-100.) YOU ONLY HEAR OUTPUT; +#X text 135 241 WHEN THIS IS 0-100 AND ACTIVELY CHANGING.; +#X msg 220 524 read ../sound/voice.wav sample-table; +#X obj 220 552 soundfiler; +#X obj 72 508 output~; +#X obj 554 27 declare -stdpath ./; +#X obj 72 291 pack f 100; +#X text 129 205 <-- read point in 100ths of a second, f 39; +#X listbox 72 321 15 0 0 0 - - - 0; +#X text 243 442 read from the table (the input is the index in samples), f 30; +#X text 515 368 --- 44103 samples ---; +#X obj 66 23 cnv 5 5 25 empty empty Scratch\ Machine 15 13 0 16 #dfdfdf #202020 0; +#X text 490 517 message to read a soundfile into the table., f 27; +#X msg 91 357 0 \, 44100 1000; +#X obj 72 419 +~ 1; +#X text 39 70 This patch implements a simples scratch machine with [tabread4~] \, which reads audio samples out of a floating-point array \, often called a "sample table." The input is the index of the sample to read. The output is calculated using 4-point cubic interpolation \, which is adequate for most purposes. Because of the interpolation scheme \, [tabread4~]'s input cannot be less than one or greater than the table length minus two., f 96; +#X text 490 397 (one second plus three extra for 4-point interpolation), f 28; +#X text 195 356 read the whole one second; +#X obj 75 172 hsl 162 19 0 100 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 252 172 <-- move for scratching; +#X text 315 552 Note this doesn't make copies for extra points \, so we effectively loose 3 samples and fail to perform a perfect wrapping loop. Nonetheless \, this is not a significant issue for playing samples., f 52; +#X text 188 314 sample destination and line duration, f 18; +#X text 113 418 add one to avoid beginning of table; +#X connect 1 0 14 0; +#X connect 2 0 24 0; +#X connect 3 0 16 0; +#X connect 4 0 3 0; +#X connect 6 0 12 0; +#X connect 12 0 13 0; +#X connect 16 0 18 0; +#X connect 18 0 2 0; +#X connect 23 0 2 0; +#X connect 24 0 1 0; +#X connect 28 0 4 0; diff --git a/doc/3.audio.examples/B08.sampler.loop.pd b/doc/3.audio.examples/B08.sampler.loop.pd index b975ba10..c4721ce8 100644 --- a/doc/3.audio.examples/B08.sampler.loop.pd +++ b/doc/3.audio.examples/B08.sampler.loop.pd @@ -1,55 +1,82 @@ -#N canvas 303 79 965 595 12; +#N canvas 458 66 780 791 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; -#X array tabread4-out 44100 float 2; -#X coords 0 1.02 44100 -1.02 200 130 1; -#X restore 466 68 graph; +#X array tabread4-out 22050 float 2; +#X coords 0 1.02 22050 -1.02 253 129 1 0 0; +#X restore 425 616 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array table17 44103 float 2; -#X coords 0 1.02 44103 -1.02 200 130 1; -#X restore 683 68 graph; -#X obj 625 390 loadbang; -#X obj 88 306 tabwrite~ tabread4-out; -#X obj 55 335 hip~ 5; -#X floatatom 55 81 5 0 0 0 - - - 0; -#X text 181 242 read from the table; -#X floatatom 80 134 5 0 0 0 - - - 0; -#X obj 80 160 * 441; -#X obj 55 187 *~ 0; -#X obj 55 214 +~ 1; -#X obj 616 264 adc~ 1; -#X text 715 395 v-- re-read the original sample; -#X text 199 491 In this patch you will frequently hear discontinuities at the looping point. If you're working in a studio \, you can sometimes find "good" loop points for samples. Another approach \, better for live situations \, is shown in the next patch., f 55; -#X obj 625 443 soundfiler; -#X text 699 206 ---- 44103 samples ----; -#X obj 55 375 output~; -#X obj 55 243 tabread4~ table17; -#X obj 616 331 tabwrite~ table17; -#X msg 625 418 read ../sound/voice.wav table17; -#X text 200 352 This is a looping sampler in which you specify the number of loops per second (the frequency) and the size of the chunk to loop. If the frequency is less than about 20 \, you will hear repetition and the chunk size will sound like transposition. For frequencies above 50 or so \, you hear a tone whose timbre is controlled by the chunk size (best kept below 10 or so.) Remember you can use the "shift" key on number boxes to make fine adjustments., f 55; -#X obj 760 15 declare -stdpath ./; -#X text 113 271 <-- click to display output; -#X obj 629 298 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X text 655 298 <-- click here to record your own sample; -#X text 104 81 <-- frequency (Hz.); -#X text 125 135 <-- chunk size (100ths of a second); -#X text 101 186 <-- readjust phase for range 0 - (chunk size); -#X text 100 214 <-- add one to avoid beginning of table; -#X obj 55 107 phasor~; -#X obj 88 272 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X text 482 206 ------ 1 second ------; -#X obj 89 30 cnv 5 5 25 empty empty Looping\ Sampler 15 13 0 16 #dfdfdf #202020 0; -#X connect 2 0 19 0; -#X connect 4 0 16 0; -#X connect 5 0 29 0; -#X connect 7 0 8 0; -#X connect 8 0 9 1; -#X connect 9 0 10 0; -#X connect 10 0 17 0; -#X connect 11 0 18 0; -#X connect 17 0 4 0; -#X connect 17 0 3 0; -#X connect 19 0 14 0; -#X connect 23 0 18 0; -#X connect 29 0 9 0; -#X connect 30 0 3 0; +#X coords 0 1.02 44103 -1.02 253 130 1; +#X restore 425 429 graph; +#X obj 411 315 loadbang; +#X floatatom 105 180 5 0 0 0 - \$0-freq - 0; +#X text 233 391 read from the table; +#X floatatom 130 243 8 0 1000 0 - \$0-size - 0; +#X obj 105 299 *~ 0; +#X obj 105 343 +~ 1; +#X obj 425 162 adc~ 1; +#X text 493 319 v-- re-read the original sample; +#X text 82 622 In this patch you will frequently hear discontinuities at the looping point. If you're working in a studio \, you can sometimes find "good" loop points for samples. Another approach \, better for live situations \, is shown in the next patch., f 40; +#X obj 411 372 soundfiler; +#X text 467 567 ---- 44103 samples ----; +#X obj 105 524 output~; +#X obj 105 392 tabread4~ table17; +#X obj 425 272 tabwrite~ table17; +#X msg 411 344 read ../sound/voice.wav table17; +#X text 40 63 This is a looping sampler in which you specify the number of loops per second (the frequency) and the size of the chunk to loop. If the frequency is less than about 20 \, you will hear repetition and the chunk size will sound like transposition. For frequencies above 50 or so \, you hear a tone whose timbre is controlled by the chunk size (best kept below 10 or so.) Remember you can use the "shift" key on number boxes to make fine adjustments., f 93; +#X obj 444 230 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X text 470 230 <-- click here to record your own sample, f 24; +#X text 154 180 <-- frequency (Hz.); +#X text 151 298 <-- readjust phase for range 0 - (chunk size), f 23; +#X text 150 343 <-- add one to avoid beginning of table, f 20; +#X obj 105 206 phasor~; +#X obj 66 22 cnv 5 5 25 empty empty Looping\ Sampler 15 13 0 16 #dfdfdf #202020 0; +#X obj 156 426 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X text 179 425 <-- graph once; +#X obj 183 453 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 207 452 <-- graph repeatedly, f 10; +#N canvas 146 130 450 300 graph 0; +#X obj 256 73 inlet; +#X obj 192 73 inlet; +#X obj 122 73 inlet~; +#X obj 192 203 tabwrite~ tabread4-out; +#X obj 256 137 metro 550; +#X connect 0 0 4 0; +#X connect 1 0 3 0; +#X connect 2 0 3 0; +#X connect 4 0 3 0; +#X restore 130 484 pd graph; +#X text 463 751 ------ 0.5 second ------; +#X obj 130 269 * 44.1; +#X text 195 244 <-- chunk size (in milliseconds now), f 18; +#N canvas 972 249 334 329 init 0; +#X obj 94 100 loadbang; +#X obj 94 188 s \$0-freq; +#X obj 176 186 s \$0-size; +#X msg 176 150 250; +#X msg 94 144 5; +#X text 71 29 This subpatch initializes the patch and loads values in number boxes., f 29; +#X obj 112 253 declare -stdpath ./; +#X connect 0 0 4 0; +#X connect 0 0 3 0; +#X connect 3 0 2 0; +#X connect 4 0 1 0; +#X restore 261 529 pd init; +#X text 174 200 (negative frequencies play backwards), f 21; +#X obj 425 192 hip~ 3; +#X text 483 154 Sound card input (You can also be careful and include a [hip~] object to filter DC if you think you need it), f 32; +#X connect 2 0 16 0; +#X connect 3 0 23 0; +#X connect 5 0 31 0; +#X connect 6 0 7 0; +#X connect 7 0 14 0; +#X connect 8 0 35 0; +#X connect 14 0 29 0; +#X connect 14 0 13 0; +#X connect 16 0 11 0; +#X connect 18 0 15 0; +#X connect 23 0 6 0; +#X connect 25 0 29 1; +#X connect 27 0 29 2; +#X connect 31 0 6 1; +#X connect 35 0 15 0; diff --git a/doc/3.audio.examples/B09.sampler.loop.smooth.pd b/doc/3.audio.examples/B09.sampler.loop.smooth.pd index 802d5c52..4b8eb6de 100644 --- a/doc/3.audio.examples/B09.sampler.loop.smooth.pd +++ b/doc/3.audio.examples/B09.sampler.loop.smooth.pd @@ -1,62 +1,89 @@ -#N canvas 401 67 842 605 12; +#N canvas 401 67 816 663 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; -#X array cos-output 44100 float 0; -#X coords 0 1.02 44099 -1.02 200 130 1; +#X array cos-output 22050 float 2; +#X coords 0 1.02 22050 -1.02 200 130 1; #X restore 510 201 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array table18 44103 float 2; #X coords 0 1.02 44103 -1.02 200 130 1; #X restore 507 26 graph; -#X obj 509 473 loadbang; -#X obj 82 269 hip~ 5; -#X floatatom 82 70 6 0 0 0 - - - 0; -#X floatatom 165 107 6 0 0 0 - - - 0; -#X obj 165 134 * 441; -#X obj 147 183 +~ 1; -#X obj 512 373 adc~ 1; -#X obj 82 159 -~ 0.5; -#X obj 82 209 cos~; -#X obj 82 242 *~; -#X obj 509 527 soundfiler; -#X text 522 158 -- 44103 samples ---; -#X text 539 334 ----- 1 second ------; -#X obj 82 97 phasor~; -#X obj 82 184 *~ 0.5; -#X obj 82 303 output~; -#X obj 147 158 *~; -#X obj 204 267 tabwrite~ cos-output; -#X text 26 549 It is possible to get much more control over the shape of the envelope \, but this will be taken up later., f 61; -#X obj 147 209 tabread4~ table18; -#X obj 512 429 tabwrite~ table18; -#X msg 509 502 read ../sound/voice.wav table18; -#X text 550 403 <-- click here to record to table; -#X text 600 481 v-- re-read the original sound; -#X obj 221 333 declare -stdpath ./; -#X text 225 240 <-- click to graph envelope; -#X text 131 69 <-- frequency (Hz.); -#X text 213 106 <-- chunk size (100ths of a second); -#X obj 204 240 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 527 402 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X text 26 380 Here we apply an amplitude envelope to protect against discontinuities at the loop point. The envelope is just a cosine wave from -90 degrees to +90 degrees \, (-pi/2 to pi/2 radians) \, i.e. \, the part that is zero or positive in sign. The [cos~] object's input is in cycles (units of 2pi radians) so -1/4 to +1/4 addresses the desired part of the waveform., f 61; -#X text 26 480 To see the envelope \, put the [phasor~] on 2 Hz or so \, click the "graph" button \, and look at "cos-output." This is multiplied by the [tabread4~] output so that it doesn't click when the phase wraps around., f 61; +#X obj 509 530 loadbang; +#X floatatom 142 70 6 0 0 0 - \$0-freq - 0; +#X floatatom 225 127 7 0 1000 0 - - - 0; +#X obj 207 203 +~ 1; +#X obj 529 373 adc~ 1; +#X obj 142 179 -~ 0.5; +#X obj 142 239 cos~; +#X obj 142 272 *~; +#X obj 509 584 soundfiler; +#X text 538 158 -- 44103 samples ---; +#X obj 142 97 phasor~; +#X obj 142 204 *~ 0.5; +#X obj 142 363 output~; +#X obj 207 178 *~; +#X text 35 611 It is possible to get much more control over the shape of the envelope \, but this will be taken up later., f 61; +#X obj 207 229 tabread4~ table18; +#X obj 529 478 tabwrite~ table18; +#X msg 509 559 read ../sound/voice.wav table18; +#X text 567 423 <-- click here to record to table, f 17; +#X text 575 538 v-- re-read the original sound; +#X text 191 69 <-- frequency (Hz.); +#X obj 544 422 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X text 35 452 Here we apply an amplitude envelope to protect against discontinuities at the loop point. The envelope is just a cosine wave from -90 degrees to +90 degrees \, (-pi/2 to pi/2 radians) \, i.e. \, the part that is zero or positive in sign. The [cos~] object's input is in cycles (units of 2pi radians) so -1/4 to +1/4 addresses the desired part of the waveform., f 61; #X obj 53 14 cnv 5 5 25 empty empty Enveloping\ your\ Looping\ Sampler 15 13 0 16 #dfdfdf #202020 0; -#X connect 2 0 23 0; -#X connect 3 0 17 0; -#X connect 4 0 15 0; -#X connect 5 0 6 0; -#X connect 6 0 18 1; -#X connect 7 0 21 0; -#X connect 8 0 22 0; -#X connect 9 0 16 0; -#X connect 10 0 11 0; -#X connect 10 0 19 0; -#X connect 11 0 3 0; -#X connect 15 0 9 0; -#X connect 15 0 18 0; -#X connect 16 0 10 0; -#X connect 18 0 7 0; -#X connect 21 0 11 1; -#X connect 23 0 12 0; -#X connect 30 0 19 0; -#X connect 31 0 22 0; +#X text 281 126 <-- chunk size (ms); +#X obj 225 154 * 44.1; +#X obj 206 265 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X text 229 264 <-- graph once; +#X obj 233 292 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 257 291 <-- graph repeatedly, f 10; +#N canvas 146 130 450 300 graph 0; +#X obj 256 73 inlet; +#X obj 192 73 inlet; +#X obj 122 73 inlet~; +#X obj 256 137 metro 550; +#X obj 192 203 tabwrite~ cos-output; +#X connect 0 0 3 0; +#X connect 1 0 4 0; +#X connect 2 0 4 0; +#X connect 3 0 4 0; +#X restore 180 325 pd graph; +#X text 529 335 ----- 0.5 second ------; +#N canvas 817 451 319 293 init 0; +#X obj 80 94 loadbang; +#X obj 80 182 s \$0-freq; +#X obj 162 182 s \$0-size; +#X msg 162 144 250; +#X msg 80 138 5; +#X text 57 23 This subpatch initializes the patch and loads values in number boxes., f 29; +#X obj 93 230 declare -stdpath ./; +#X connect 0 0 4 0; +#X connect 0 0 3 0; +#X connect 3 0 2 0; +#X connect 4 0 1 0; +#X restore 367 179 pd init; +#X text 35 542 To see the envelope \, put the [phasor~] on 5 Hz or so \, click the "graph" button \, and look at "cos-output." This is multiplied by the [tabread4~] output so that it doesn't click when the phase wraps around., f 61; +#X text 37 179 -1/2 to +1/2; +#X text 37 204 -1/4 to +1/4; +#X obj 228 100 hsl 162 19 0 1000 0 0 empty \$0-size empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X connect 2 0 19 0; +#X connect 3 0 12 0; +#X connect 4 0 27 0; +#X connect 5 0 17 0; +#X connect 6 0 18 0; +#X connect 7 0 13 0; +#X connect 8 0 9 0; +#X connect 9 0 32 0; +#X connect 9 0 14 0; +#X connect 12 0 15 0; +#X connect 12 0 7 0; +#X connect 13 0 8 0; +#X connect 15 0 5 0; +#X connect 17 0 9 1; +#X connect 19 0 10 0; +#X connect 23 0 18 0; +#X connect 27 0 15 1; +#X connect 28 0 32 1; +#X connect 30 0 32 2; +#X connect 38 0 4 0; diff --git a/doc/3.audio.examples/B10.sampler.sliding.loop.pd b/doc/3.audio.examples/B10.sampler.sliding.loop.pd index b278d522..8d31e29e 100644 --- a/doc/3.audio.examples/B10.sampler.sliding.loop.pd +++ b/doc/3.audio.examples/B10.sampler.sliding.loop.pd @@ -1,77 +1,96 @@ -#N canvas 530 68 831 688 12; +#N canvas 370 56 804 767 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array table19 44103 float 2; #X coords 0 1.02 44103 -1.02 200 130 1; -#X restore 513 25 graph; -#X floatatom 147 66 5 0 0 0 - - - 0; -#X floatatom 172 121 4 0 100 0 - - - 0; -#X obj 172 150 * 441; -#X obj 147 179 *~ 0; -#X obj 147 207 +~ 1; -#X obj 355 355 adc~ 1; -#X obj 355 381 hip~ 5; +#X restore 536 252 graph; +#X obj 435 399 adc~ 1; #N canvas 0 0 450 300 (subpatch) 0; -#X array graph19 44100 float 0; -#X coords 0 44100 44099 0 200 130 1 0 0; -#X restore 522 209 graph; -#X obj 87 341 *~; -#X obj 200 258 line~; -#X obj 200 208 * 441; -#X floatatom 200 182 4 0 0 0 - - - 0; -#X obj 147 290 +~; -#X text 71 495 In this patch we can loop in any "window" of the input sample. The "read point" (0-100) gives the starting point of the window and "chunk" is its size (both in 100ths of a second.) Try \, for example \, frequency 4 \, sharpness 10 \, chunk size 25 \, and vary the read point from -25 to 100 \, listening to the result.; -#X obj 534 393 loadbang; -#X text 570 423 v-- re-read the original sample; -#X obj 544 468 soundfiler; -#X text 527 164 ---- 44103 samples ---; -#X obj 355 441 tabwrite~ table19; -#X msg 544 444 read ../sound/voice.wav table19; -#X obj 86 173 -~ 0.5; -#X obj 147 91 phasor~; -#X obj 86 201 *~ 0.5; -#X obj 86 230 cos~; -#X obj 87 407 output~; -#X text 74 595 You should hear some doppler shift as you change the read point. To see why \, click on "graph table index" and quickly start changing the read point--- you should see entertaining pictures in "table-index". The next patch shows how to prevent this if you wish to.; -#X obj 148 351 tabread4~ table19; -#X obj 194 322 tabwrite~ graph19; -#X obj 623 578 declare -stdpath ./; -#X text 396 409 <-- record; -#X obj 200 232 pack f 100; -#X obj 373 410 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 194 293 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X text 217 293 <-- graph table index; -#X obj 87 375 hip~ 5; -#X text 192 66 <-- frequency (Hz.); -#X text 208 121 <-- chunk size (100ths of a second); -#X text 234 183 <--; -#X text 259 183 read point (100ths of a second), f 18; -#X text 550 349 ----- 1 second -----; -#X msg 534 502 \; graph19 ylabel 46000 0 44100; -#X obj 112 22 cnv 5 5 25 empty empty Sliding\ Loops 15 13 0 16 #dfdfdf #202020 0; -#X connect 1 0 22 0; +#X array graph19 22050 float 0; +#X coords 0 44100 22049 0 200 130 1 0 0; +#X restore 536 65 graph; +#X obj 270 367 line~; +#X floatatom 270 291 8 0 0 0 - - - 0; +#X obj 437 527 loadbang; +#X text 516 531 v-- re-read the original sample; +#X obj 437 582 soundfiler; +#X text 550 392 ---- 44103 samples ---; +#X obj 435 479 tabwrite~ table19; +#X msg 437 558 read ../sound/voice.wav table19; +#X text 184 648 You should hear some doppler shift as you change the read point. To see why \, click on "graph table index" and quickly start changing the read point--- you should see entertaining pictures in "table-index". The next patch shows how to prevent this if you wish to.; +#X text 480 434 <-- record; +#X obj 270 341 pack f 100; +#X obj 457 435 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 71 17 cnv 5 5 25 empty empty Sliding\ Loops 15 13 0 16 #dfdfdf #202020 0; +#X floatatom 115 187 6 0 0 2 Hz \$0-freq - 0; +#X obj 180 320 +~ 1; +#X obj 115 296 -~ 0.5; +#X obj 115 429 cos~; +#X obj 115 462 *~; +#X obj 115 214 phasor~; +#X obj 115 321 *~ 0.5; +#X obj 115 551 output~; +#X obj 180 295 *~; +#X obj 198 268 * 44.1; +#X obj 239 404 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X text 262 403 <-- graph once; +#X obj 266 431 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 290 430 <-- graph repeatedly, f 10; +#N canvas 146 130 450 300 graph 0; +#X obj 256 73 inlet; +#X obj 192 73 inlet; +#X obj 122 73 inlet~; +#X obj 256 137 metro 550; +#X obj 192 203 tabwrite~ graph19; +#X connect 0 0 3 0; +#X connect 1 0 4 0; +#X connect 2 0 4 0; +#X connect 3 0 4 0; +#X restore 213 464 pd graph; +#X obj 201 214 hsl 162 19 0 1000 0 0 empty \$0-size chunk\ size\ (ms) -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 180 357 +~; +#X obj 180 500 tabread4~ table19; +#X obj 273 263 hsl 162 19 -250 1000 0 0 empty \$0-read-point read\ point\ (ms) -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 270 317 * 44.1; +#N canvas 611 300 300 325 init 0; +#X text 57 23 This subpatch initializes the patch and loads values in number boxes., f 26; +#X obj 79 94 loadbang; +#X obj 79 149 f \$0; +#X msg 79 173 \; \$1-freq 5 \; \$1-read-point 0 \; \$1-size 250; +#X obj 79 121 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 79 264 declare -stdpath ./; +#X connect 1 0 4 0; #X connect 2 0 3 0; -#X connect 3 0 4 1; -#X connect 4 0 5 0; -#X connect 5 0 13 0; -#X connect 6 0 7 0; -#X connect 7 0 19 0; -#X connect 9 0 35 0; -#X connect 10 0 13 1; -#X connect 11 0 31 0; -#X connect 12 0 11 0; -#X connect 13 0 27 0; -#X connect 13 0 28 0; -#X connect 15 0 41 0; -#X connect 15 0 20 0; -#X connect 20 0 17 0; -#X connect 21 0 23 0; -#X connect 22 0 4 0; -#X connect 22 0 21 0; -#X connect 23 0 24 0; -#X connect 24 0 9 0; -#X connect 27 0 9 1; -#X connect 31 0 10 0; -#X connect 32 0 19 0; -#X connect 33 0 28 0; -#X connect 35 0 25 0; +#X connect 4 0 2 0; +#X restore 389 312 pd init; +#X text 560 198 ----- 0.5 second -----; +#X text 742 184 0; +#X text 742 56 44100; +#X text 42 69 In this patch we can loop in any "window" of the input sample. The "read point" gives the starting point of the window and "chunk" is its size (both in milliseconds). Try \, for example \, frequency 4 \, chunk size 250 \, and vary the read point from -250 to 1000 \, listening to the result.; +#X floatatom 198 241 8 0 0 0 - - - 0; +#X connect 1 0 9 0; +#X connect 3 0 32 1; +#X connect 4 0 35 0; +#X connect 5 0 10 0; +#X connect 10 0 7 0; +#X connect 13 0 3 0; +#X connect 14 0 9 0; +#X connect 16 0 21 0; +#X connect 17 0 32 0; +#X connect 18 0 22 0; +#X connect 19 0 20 0; +#X connect 20 0 23 0; +#X connect 21 0 24 0; +#X connect 21 0 18 0; +#X connect 22 0 19 0; +#X connect 24 0 17 0; +#X connect 25 0 24 1; +#X connect 26 0 30 1; +#X connect 28 0 30 2; +#X connect 31 0 41 0; +#X connect 32 0 33 0; +#X connect 32 0 30 0; +#X connect 33 0 20 1; +#X connect 34 0 4 0; +#X connect 35 0 13 0; +#X connect 41 0 25 0; diff --git a/doc/3.audio.examples/B11.sampler.nodoppler.pd b/doc/3.audio.examples/B11.sampler.nodoppler.pd index 065fbd7a..23b786f2 100644 --- a/doc/3.audio.examples/B11.sampler.nodoppler.pd +++ b/doc/3.audio.examples/B11.sampler.nodoppler.pd @@ -1,81 +1,72 @@ -#N canvas 383 63 893 649 12; +#N canvas 440 63 820 641 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array table20 44103 float 2; #X coords 0 1.02 44103 -1.02 200 130 1; -#X restore 581 37 graph; -#X obj 428 364 loadbang; -#X obj 165 475 hip~ 5; -#X floatatom 112 65 5 0 0 0 - - - 0; -#X floatatom 180 128 4 0 0 0 - - - 0; -#X obj 180 153 * 441; -#X obj 112 298 +~ 1; -#X obj 112 89 phasor~ 0; -#X obj 420 228 adc~ 1; -#X obj 420 252 hip~ 5; -#X text 479 391 v-- re-read the original sample; -#N canvas 0 0 450 300 (subpatch) 0; -#X array graph20 44100 float 0; -#X coords 0 44100 44099 0 200 130 1; -#X restore 583 226 graph; -#X obj 165 441 *~; -#X obj 201 283 line~; -#X obj 242 194 * 441; -#X floatatom 242 170 4 0 0 0 - - - 0; -#X obj 242 220 pack 0 100; -#X obj 183 334 +~; -#X obj 201 307 samphold~; -#X obj 129 245 samphold~; -#X obj 112 271 *~; -#X text 581 171 ---- 44103 samples ---; -#X obj 440 435 soundfiler; -#X obj 165 528 output~; -#X obj 49 257 -~ 0.5; -#X obj 49 281 *~ 0.5; -#X obj 49 304 cos~; -#X obj 225 373 tabwrite~ graph20; -#X obj 183 409 tabread4~ table20; -#X obj 420 307 tabwrite~ table20; -#X msg 440 411 read ../sound/voice.wav table20; -#X text 310 525 This example differs from the previous one in having samphold~ objects which allow the chunk size and especially the read point to change only at points where the phase wraps around. This removes signal discontinuities (when the chunk size changes) and doppler shift when the read point is changing., f 67; -#X obj 397 77 declare -stdpath ./; -#X text 250 343 <-- graph table index; -#X text 459 279 <-- record; -#X obj 435 280 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 225 343 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X text 155 64 <-- frequency (Hz.); -#X text 216 128 <-- chunk size (100ths of a second); -#X text 289 169 <-- read point in 100ths of a second, f 18; -#X text 601 362 ------ 1 second ------; -#X msg 428 466 \; graph20 ylabel 46000 0 44100; -#X obj 47 18 cnv 5 5 25 empty empty Sliding\ Stable\ Loops\ Without\ Doopler\ Shift 15 13 0 16 #dfdfdf #202020 0; -#X connect 1 0 41 0; -#X connect 1 0 30 0; -#X connect 2 0 23 0; -#X connect 3 0 7 0; -#X connect 4 0 5 0; -#X connect 5 0 19 0; -#X connect 6 0 17 0; -#X connect 7 0 18 1; -#X connect 7 0 19 1; -#X connect 7 0 20 0; -#X connect 7 0 24 0; -#X connect 8 0 9 0; -#X connect 9 0 29 0; -#X connect 12 0 2 0; -#X connect 13 0 18 0; -#X connect 14 0 16 0; -#X connect 15 0 14 0; -#X connect 16 0 13 0; -#X connect 17 0 27 0; -#X connect 17 0 28 0; -#X connect 18 0 17 1; -#X connect 19 0 20 1; -#X connect 20 0 6 0; -#X connect 24 0 25 0; -#X connect 25 0 26 0; -#X connect 26 0 12 0; -#X connect 28 0 12 1; -#X connect 30 0 22 0; -#X connect 35 0 29 0; -#X connect 36 0 27 0; +#X restore 507 116 graph; +#X obj 501 439 loadbang; +#X floatatom 119 101 5 0 0 2 Hz \$0-freq - 0; +#X floatatom 187 174 6 0 0 0 - - - 0; +#X obj 119 334 +~ 1; +#X obj 354 434 adc~ 1; +#X text 540 464 v-- re-read the original sample; +#X obj 172 447 *~; +#X floatatom 249 216 6 0 0 0 - - - 0; +#X obj 190 370 +~; +#X obj 208 343 samphold~; +#X obj 137 281 samphold~; +#X obj 119 307 *~; +#X text 527 250 ---- 44103 samples ---; +#X obj 501 508 soundfiler; +#X obj 172 514 output~; +#X obj 56 293 -~ 0.5; +#X obj 56 317 *~ 0.5; +#X obj 56 340 cos~; +#X obj 190 405 tabread4~ table20; +#X obj 354 513 tabwrite~ table20; +#X msg 501 484 read ../sound/voice.wav table20; +#X text 396 475 <-- record; +#X obj 372 476 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 59 29 cnv 5 5 25 empty empty Sliding\ Stable\ Loops\ Without\ Doopler\ Shift 15 13 0 16 #dfdfdf #202020 0; +#X obj 249 240 * 44.1; +#X obj 187 199 * 44.1; +#X obj 119 135 phasor~; +#X obj 190 129 hsl 162 19 0 1000 0 0 empty \$0-size chunk\ size\ (ms) -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 252 185 hsl 162 19 -250 1000 0 0 empty \$0-read-point read\ point\ (ms) -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#N canvas 623 232 323 359 init 0; +#X text 57 23 This subpatch initializes the patch and loads values in number boxes., f 29; +#X obj 79 94 loadbang; +#X obj 79 149 f \$0; +#X msg 79 173 \; \$1-freq 5 \; \$1-read-point 0 \; \$1-size 250; +#X obj 79 121 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 79 266 declare -stdpath ./; +#X connect 1 0 4 0; +#X connect 2 0 3 0; +#X connect 4 0 2 0; +#X restore 381 233 pd init; +#X text 390 298 This example includes [samphold~] objects which allow the chunk size and especially the read point to change only at points where the phase wraps around. This removes signal discontinuities (when the chunk size changes) and doppler shift when the read point is changing., f 49; +#X connect 1 0 21 0; +#X connect 2 0 27 0; +#X connect 3 0 26 0; +#X connect 4 0 9 0; +#X connect 5 0 20 0; +#X connect 7 0 15 0; +#X connect 8 0 25 0; +#X connect 9 0 19 0; +#X connect 10 0 9 1; +#X connect 11 0 12 1; +#X connect 12 0 4 0; +#X connect 16 0 17 0; +#X connect 17 0 18 0; +#X connect 18 0 7 0; +#X connect 19 0 7 1; +#X connect 21 0 14 0; +#X connect 23 0 20 0; +#X connect 25 0 10 0; +#X connect 26 0 11 0; +#X connect 27 0 10 1; +#X connect 27 0 11 1; +#X connect 27 0 12 0; +#X connect 27 0 16 0; +#X connect 28 0 3 0; +#X connect 29 0 8 0; diff --git a/doc/3.audio.examples/B12.sampler.transpose.pd b/doc/3.audio.examples/B12.sampler.transpose.pd index 392cbf78..41081ac3 100644 --- a/doc/3.audio.examples/B12.sampler.transpose.pd +++ b/doc/3.audio.examples/B12.sampler.transpose.pd @@ -1,99 +1,93 @@ -#N canvas 375 38 837 700 12; +#N canvas 374 38 902 800 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array table21 44103 float 2; -#X coords 0 1.02 44103 -1.02 200 130 1; -#X restore 559 325 graph; -#X obj 366 562 loadbang; -#X floatatom 47 291 6 0 0 0 - - - 0; -#X obj 47 326 * 441; -#X obj 47 456 +~ 1; -#X obj 364 437 adc~ 1; -#X obj 364 462 hip~ 5; -#X obj 81 544 *~; -#X obj 143 456 line~; -#X obj 143 406 * 441; -#X floatatom 143 381 5 0 0 0 - - - 0; -#X obj 143 431 pack 0 100; -#X obj 81 485 +~; -#X obj 143 481 samphold~; -#X obj 47 381 samphold~; -#X obj 47 351 sig~; -#X obj 47 431 *~; -#X obj 228 504 r~ phase; -#X obj 29 245 s~ phase; -#X obj 107 352 r~ phase; -#X obj 65 408 r~ phase; -#X obj 203 457 r~ phase; -#X obj 188 351 s chunk-size; -#X floatatom 29 91 5 0 0 0 - - - 0; -#X obj 188 326 * 0.01; -#X text 284 331 chunk size; -#X text 284 353 in seconds; -#X obj 40 146 r chunk-size; -#X obj 40 171 t b f; -#X obj 29 195 /; -#X text 89 172 divide speed change by chunk; -#X text 87 193 size to get loop frequency; -#X text 376 85 The transposition is frequency in Hz. divided by chunk size in seconds. This patch calculates the loop frequency as a function of desired transposition, f 60; -#X text 376 136 Notice now that we get Doppler effects when the chunk size changes. You can suppress that if you don't want it \, by converting the chunk size to an audio signal \, sampling and holding it. But then there would be more work to deal with very low frequencies never triggering the sample and hold...; -#X obj 366 616 soundfiler; -#X obj 29 68 loadbang; -#X obj 228 528 -~ 0.5; -#X obj 228 552 *~ 0.5; -#X obj 228 575 cos~; -#X obj 81 605 output~; -#X obj 81 510 tabread4~ table21; -#X text 459 569 v-- re-read original table; -#X text 588 459 --- 44103 samples ---; -#X obj 29 116 expr pow(2 \, $f1/120); -#X text 190 115 speed change; -#X text 376 218 You might also want to have a way to retrigger the loop to sync it with some other process. By the time we had all this built the patch would be fairly involved. For now \, we'll move on to the next topic...; -#X obj 29 219 phasor~; -#X obj 364 517 tabwrite~ table21; -#X msg 366 589 read ../sound/voice.wav table21; -#X obj 639 25 declare -stdpath ./; -#X obj 379 490 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 81 572 hip~ 5; -#X text 71 91 <-- transposition (10ths of a halftone); -#X text 95 290 <-- chunk size (100ths of a second); -#X text 184 381 <-- read point in 100ths of a second; -#X obj 38 19 cnv 5 5 25 empty empty Calculating\ Loop\ Frequency\ as\ function\ of\ Transposition 15 13 0 16 #dfdfdf #202020 0; -#X text 403 489 <-- record; -#X connect 1 0 48 0; -#X connect 2 0 3 0; -#X connect 2 0 24 0; -#X connect 3 0 15 0; -#X connect 4 0 12 0; -#X connect 5 0 6 0; -#X connect 6 0 47 0; -#X connect 7 0 51 0; -#X connect 8 0 13 0; -#X connect 9 0 11 0; -#X connect 10 0 9 0; -#X connect 11 0 8 0; -#X connect 12 0 40 0; -#X connect 13 0 12 1; -#X connect 14 0 16 0; -#X connect 15 0 14 0; -#X connect 16 0 4 0; -#X connect 17 0 36 0; -#X connect 19 0 14 1; -#X connect 20 0 16 1; -#X connect 21 0 13 1; -#X connect 23 0 43 0; -#X connect 24 0 22 0; -#X connect 27 0 28 0; -#X connect 28 0 29 0; -#X connect 28 1 29 1; -#X connect 29 0 46 0; -#X connect 35 0 23 0; -#X connect 36 0 37 0; -#X connect 37 0 38 0; -#X connect 38 0 7 1; -#X connect 40 0 7 0; -#X connect 43 0 29 0; -#X connect 46 0 18 0; -#X connect 48 0 34 0; -#X connect 50 0 47 0; -#X connect 51 0 39 0; +#X coords 0 1.02 44103 -1.02 264 165 1; +#X restore 575 321 graph; +#X obj 421 581 loadbang; +#X floatatom 79 211 6 0 0 0 - - - 0; +#X obj 79 536 +~ 1; +#X obj 419 436 adc~ 1; +#X obj 250 663 *~; +#X floatatom 167 261 6 0 0 0 - - - 0; +#X obj 109 575 +~; +#X obj 167 571 samphold~; +#X obj 79 448 samphold~; +#X obj 79 511 *~; +#X floatatom 227 261 7 0 0 0 - \$0-cents - 0; +#X obj 175 330 t b f; +#X obj 227 365 /; +#X obj 421 635 soundfiler; +#X obj 268 566 -~ 0.5; +#X obj 268 592 *~ 0.5; +#X obj 268 625 cos~; +#X obj 250 701 output~; +#X obj 109 610 tabread4~ table21; +#X text 514 588 v-- re-read original table; +#X text 626 500 --- 44103 samples ---; +#X obj 227 415 phasor~; +#X obj 419 516 tabwrite~ table21; +#X msg 421 608 read ../sound/voice.wav table21; +#X obj 438 473 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 37 18 cnv 5 5 25 empty empty Calculating\ Loop\ Frequency\ as\ function\ of\ Transposition 15 13 0 16 #dfdfdf #202020 0; +#X text 462 472 <-- record; +#X floatatom 227 391 8 0 0 0 - - - 0; +#X obj 82 183 hsl 162 19 0 1000 0 0 empty \$0-size chunk\ size\ (ms) -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 170 229 hsl 162 19 -250 1000 0 0 empty \$0-read-point read\ point\ (ms) -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#N canvas 623 232 323 359 init 0; +#X text 57 23 This subpatch initializes the patch and loads values in number boxes., f 29; +#X obj 79 94 loadbang; +#X obj 79 149 f \$0; +#X obj 79 121 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 79 266 declare -stdpath ./; +#X msg 79 173 \; \$1-cents 0 \; \$1-read-point 0 \; \$1-size 250; +#X connect 1 0 3 0; +#X connect 2 0 5 0; +#X connect 3 0 2 0; +#X restore 412 171 pd init; +#X obj 79 415 * 44.1; +#X obj 167 536 * 44.1; +#X text 88 312 chunk size in seconds, f 10; +#X obj 227 300 expr pow(2 \, $f1/1200); +#X text 280 261 <-- transposition in cents (100ths of a halftone), f 26; +#X text 262 354 divide speed change by chunk size to get loop frequency, f 28; +#X obj 175 300 / 1000; +#X text 314 625 envelope; +#X floatatom 227 328 9 0 0 0 - - - 0; +#X text 298 328 speed change ratio; +#X text 64 67 This patch calculates the loop frequency as a function of desired transposition. We get the inverse of the chunk size in seconds \, which corresponds to its frequency in Hz andmultiply it by a transposition ratio. A transposition in cents is also provided and converted to ration., f 65; +#X text 567 71 Notice now in order to avoid Doppler effects when the chunk size changes we have a sample and hold unit \, which can be an issue if you're dealing with very low frequencies that never end up triggering the sample and hold..., f 39; +#X text 569 177 You might also want to have a way to retrigger the loop to sync it with some other process. By the time we had all this built the patch would be fairly involved. For now \, we'll move on to the next example..., f 39; +#X connect 1 0 24 0; +#X connect 2 0 32 0; +#X connect 2 0 38 0; +#X connect 3 0 7 0; +#X connect 4 0 23 0; +#X connect 5 0 18 0; +#X connect 6 0 33 0; +#X connect 7 0 19 0; +#X connect 8 0 7 1; +#X connect 9 0 10 0; +#X connect 10 0 3 0; +#X connect 11 0 35 0; +#X connect 12 0 13 0; +#X connect 12 1 13 1; +#X connect 13 0 28 0; +#X connect 15 0 16 0; +#X connect 16 0 17 0; +#X connect 17 0 5 1; +#X connect 19 0 5 0; +#X connect 22 0 8 1; +#X connect 22 0 15 0; +#X connect 22 0 9 1; +#X connect 22 0 10 1; +#X connect 24 0 14 0; +#X connect 25 0 23 0; +#X connect 28 0 22 0; +#X connect 29 0 2 0; +#X connect 30 0 6 0; +#X connect 32 0 9 0; +#X connect 33 0 8 0; +#X connect 35 0 40 0; +#X connect 38 0 12 0; +#X connect 40 0 13 0; diff --git a/doc/3.audio.examples/B13.sampler.overlap.pd b/doc/3.audio.examples/B13.sampler.overlap.pd index 7c553c2c..a8820ec3 100644 --- a/doc/3.audio.examples/B13.sampler.overlap.pd +++ b/doc/3.audio.examples/B13.sampler.overlap.pd @@ -1,150 +1,147 @@ -#N canvas 499 38 690 758 12; +#N canvas 499 38 737 882 12; #X declare -stdpath ./; -#X floatatom 35 72 5 0 100 0 - - - 0; -#X obj 35 117 * 441; -#X obj 30 424 +~ 1; -#X obj 60 515 *~; -#X obj 36 255 line~; -#X obj 36 205 * 441; -#X floatatom 36 180 5 0 100 0 - - - 0; -#X obj 36 230 pack 0 100; -#X obj 30 453 +~; -#X obj 77 451 samphold~; -#X obj 30 352 samphold~; -#X obj 30 399 *~; -#X obj 193 413 r~ phase; -#X obj 384 267 s~ phase; -#X obj 118 352 r~ phase; -#X obj 48 376 r~ phase; -#X obj 112 426 r~ phase; -#X obj 87 126 s chunk-size; -#X floatatom 384 87 5 0 0 0 - - - 0; -#X obj 87 101 * 0.01; -#X text 199 102 chunk size; -#X text 199 124 in seconds; -#X obj 395 142 r chunk-size; -#X obj 395 167 t b f; -#X obj 384 191 /; -#X obj 384 61 loadbang; -#X obj 193 437 -~ 0.5; -#X obj 193 461 *~ 0.5; -#X obj 193 484 cos~; -#X obj 60 624 output~; -#X obj 384 112 expr pow(2 \, $f1/120); -#X text 553 112 speed change; -#X obj 384 216 phasor~; -#N canvas 457 259 614 280 table 0; +#X floatatom 96 213 5 0 100 0 - - - 0; +#X obj 42 590 +~ 1; +#X obj 72 686 *~; +#X floatatom 102 384 5 0 100 0 - - - 0; +#X obj 42 619 +~; +#X obj 89 617 samphold~; +#X obj 42 518 samphold~; +#X obj 42 565 *~; +#X obj 201 579 r~ phase; +#X obj 374 378 s~ phase; +#X obj 130 518 r~ phase; +#X obj 60 542 r~ phase; +#X obj 124 592 r~ phase; +#X obj 96 268 s chunk-size; +#X floatatom 374 171 5 0 0 0 - \$0-cents - 0; +#X obj 385 229 r chunk-size; +#X obj 385 254 t b f; +#X obj 374 278 /; +#X obj 201 603 -~ 0.5; +#X obj 201 627 *~ 0.5; +#X obj 201 650 cos~; +#X obj 72 800 output~; +#X obj 374 327 phasor~; +#X obj 35 295 s chunk-size-samples; +#X text 184 294 ... and in samples; +#X obj 450 364 +~ 0.5; +#X obj 450 390 wrap~; +#X obj 450 415 s~ phase2; +#X obj 42 493 r chunk-size-samples; +#X obj 282 589 +~ 1; +#X obj 282 699 *~; +#X obj 282 618 +~; +#X obj 337 617 samphold~; +#X obj 282 517 samphold~; +#X obj 282 564 *~; +#X obj 443 605 -~ 0.5; +#X obj 443 629 *~ 0.5; +#X obj 443 652 cos~; +#X obj 282 492 r chunk-size-samples; +#X obj 371 518 r~ phase2; +#X obj 300 541 r~ phase2; +#X obj 443 581 r~ phase2; +#X obj 359 592 r~ phase2; +#X obj 72 757 +~; +#X text 433 303 loop frequency; +#X text 92 475 copy 1; +#X text 337 472 copy 2; +#X obj 42 644 tabread4~ table22; +#X obj 282 643 tabread4~ table22; +#X obj 53 16 cnv 5 5 25 empty empty Two\ Overlapping\ Sample\ Read\ Elements 15 13 0 16 #dfdfdf #202020 0; +#X obj 374 199 expr pow(2 \, $f1/1200); +#X text 419 171 <-- transposition in cents; +#X obj 35 258 * 44.1; +#X obj 102 409 * 44.1; +#X obj 102 439 s read-pt; +#X obj 89 569 r read-pt; +#X obj 337 567 r read-pt; +#X obj 96 243 / 1000; +#X text 194 269 chunk size in seconds; +#X text 511 348 second phase signal out of phase from first one, f 13; +#X floatatom 374 302 7 0 0 0 - - - 0; +#N canvas 1007 202 323 359 init 0; +#X text 57 23 This subpatch initializes the patch and loads values in number boxes., f 29; +#X obj 79 94 loadbang; +#X obj 79 149 f \$0; +#X obj 79 121 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 79 266 declare -stdpath ./; +#X msg 79 173 \; \$1-cents 0 \; \$1-read-point 0 \; \$1-size 250; +#X connect 1 0 3 0; +#X connect 2 0 5 0; +#X connect 3 0 2 0; +#X restore 622 223 pd init; +#X text 77 57 Here is the previous patch modified to use two copies of the sample reader \, 180 degrees out of phase. The computation of "chunk-size-samples" and "read-pt" is the same for both copies. We have the same loop frequency calculation as before for the first phase and the second phase signal (named "phase2") is derived from the first one by adding a constant (0.5) and wrapping the result to fit again between zero and one., f 79; +#X text 103 759 sum the two copies; +#X obj 99 184 hsl 162 19 0 1000 0 0 empty \$0-size chunk\ size\ (ms) -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 105 359 hsl 162 19 -250 1000 0 0 empty \$0-read-point read\ point\ (ms) -2 -10 0 12 #dfdfdf #000000 #000000 0 1; #N canvas 0 0 450 300 (subpatch) 0; #X array table22 44103 float 2; #X coords 0 1.02 44103 -1.02 200 130 1; -#X restore 363 64 graph; -#X text 384 198 --- 44103 samples ---; -#X obj 48 148 loadbang; -#X obj 52 37 adc~ 1; -#X obj 52 62 hip~ 5; -#X obj 48 202 soundfiler; -#X text 141 155 v-- re-read original table; -#X obj 52 118 tabwrite~ table22; -#X msg 48 175 read ../sound/voice.wav table22; -#X text 92 90 <= record; -#X obj 67 91 bng 17 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X connect 2 0 8 0; -#X connect 3 0 4 0; -#X connect 4 0 7 0; -#X connect 8 0 5 0; -#X connect 10 0 7 0; -#X restore 575 428 pd table; -#X obj 35 154 s chunk-size-samples; -#X text 196 153 ... and in samples; -#X obj 36 278 s~ read-pt; -#X obj 77 403 r~ read-pt; -#X obj 460 253 +~ 0.5; -#X obj 460 279 wrap~; -#X obj 460 304 s~ phase2; -#X obj 30 327 r chunk-size-samples; -#X obj 267 423 +~ 1; -#X obj 267 523 *~; -#X obj 267 452 +~; -#X obj 322 451 samphold~; -#X obj 267 351 samphold~; -#X obj 267 398 *~; -#X obj 432 439 -~ 0.5; -#X obj 432 463 *~ 0.5; -#X obj 432 486 cos~; -#X obj 322 401 r~ read-pt; -#X obj 267 326 r chunk-size-samples; -#X obj 356 352 r~ phase2; -#X obj 285 375 r~ phase2; -#X obj 432 415 r~ phase2; -#X obj 344 426 r~ phase2; -#X obj 60 561 +~; -#X text 422 190 loop frequency; -#X text 521 240 second phase signal; -#X text 521 260 out of phase from; -#X text 520 281 first one; -#X text 80 309 copy 1; -#X text 322 306 copy 2; -#X text 233 562 Here is the previous patch modified to use two copies of the sample reader \, 180 degrees out of phase. The second sawtooth signal is derived from the first one by adding a constant (0.5) and wrapping the result to fit again between zero and one. The result is the "phase2" signal.; -#X text 233 638 The computation of "chunk-size-samples" (as a message) and "read-pt" (an audio signal) is the same for both copies and is separated out at top left. At top right is the same loop frequency calculation as before., f 60; -#X text 233 700 Finally \, the two copies' outputs are added and the result sent to the audio output., f 60; -#X obj 30 478 tabread4~ table22; -#X obj 267 477 tabread4~ table22; -#X obj 513 25 declare -stdpath ./; -#X text 77 72 <-- chunk size (100ths of a second); -#X text 429 87 <-- transposition \, halftones/10; -#X text 78 180 <-- read point in 100ths of a second; -#X obj 60 593 hip~ 5; -#X obj 47 18 cnv 5 5 25 empty empty Two\ Overlapping\ Sample\ Read\ Elements 15 13 0 16 #dfdfdf #202020 0; -#X connect 0 0 1 0; -#X connect 0 0 19 0; -#X connect 1 0 34 0; -#X connect 2 0 8 0; -#X connect 3 0 57 0; -#X connect 4 0 36 0; -#X connect 5 0 7 0; -#X connect 6 0 5 0; -#X connect 7 0 4 0; -#X connect 8 0 67 0; -#X connect 9 0 8 1; -#X connect 10 0 11 0; -#X connect 11 0 2 0; -#X connect 12 0 26 0; -#X connect 14 0 10 1; -#X connect 15 0 11 1; -#X connect 16 0 9 1; -#X connect 18 0 30 0; -#X connect 19 0 17 0; -#X connect 22 0 23 0; -#X connect 23 0 24 0; -#X connect 23 1 24 1; -#X connect 24 0 32 0; -#X connect 25 0 18 0; +#X restore 462 714 graph; +#X text 483 848 --- 44103 samples ---; +#X obj 564 579 adc~ 1; +#X obj 564 653 tabwrite~ table22; +#X obj 584 612 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X text 609 611 <-- record; +#X obj 473 461 loadbang; +#X obj 473 531 soundfiler; +#X text 519 483 v-- re-read original table; +#X msg 473 504 read ../sound/voice.wav table22; +#X connect 0 0 52 0; +#X connect 0 0 57 0; +#X connect 1 0 4 0; +#X connect 2 0 43 0; +#X connect 3 0 53 0; +#X connect 4 0 47 0; +#X connect 5 0 4 1; +#X connect 6 0 7 0; +#X connect 7 0 1 0; +#X connect 8 0 18 0; +#X connect 10 0 6 1; +#X connect 11 0 7 1; +#X connect 12 0 5 1; +#X connect 14 0 50 0; +#X connect 15 0 16 0; +#X connect 16 0 17 0; +#X connect 16 1 17 1; +#X connect 17 0 60 0; +#X connect 18 0 19 0; +#X connect 19 0 20 0; +#X connect 20 0 2 1; +#X connect 22 0 9 0; +#X connect 22 0 25 0; +#X connect 25 0 26 0; #X connect 26 0 27 0; -#X connect 27 0 28 0; -#X connect 28 0 3 1; -#X connect 30 0 24 0; -#X connect 32 0 13 0; -#X connect 32 0 38 0; -#X connect 37 0 9 0; -#X connect 38 0 39 0; -#X connect 39 0 40 0; -#X connect 41 0 10 0; -#X connect 42 0 44 0; -#X connect 43 0 57 1; -#X connect 44 0 68 0; -#X connect 45 0 44 1; -#X connect 46 0 47 0; -#X connect 47 0 42 0; -#X connect 48 0 49 0; -#X connect 49 0 50 0; -#X connect 50 0 43 1; -#X connect 51 0 45 0; -#X connect 52 0 46 0; -#X connect 53 0 46 1; -#X connect 54 0 47 1; -#X connect 55 0 48 0; -#X connect 56 0 45 1; -#X connect 57 0 73 0; -#X connect 67 0 3 0; -#X connect 68 0 43 0; -#X connect 73 0 29 0; +#X connect 28 0 6 0; +#X connect 29 0 31 0; +#X connect 30 0 43 1; +#X connect 31 0 48 0; +#X connect 32 0 31 1; +#X connect 33 0 34 0; +#X connect 34 0 29 0; +#X connect 35 0 36 0; +#X connect 36 0 37 0; +#X connect 37 0 30 1; +#X connect 38 0 33 0; +#X connect 39 0 33 1; +#X connect 40 0 34 1; +#X connect 41 0 35 0; +#X connect 42 0 32 1; +#X connect 43 0 21 0; +#X connect 47 0 2 0; +#X connect 48 0 30 0; +#X connect 50 0 17 0; +#X connect 52 0 23 0; +#X connect 53 0 54 0; +#X connect 55 0 5 0; +#X connect 56 0 32 0; +#X connect 57 0 13 0; +#X connect 60 0 22 0; +#X connect 64 0 0 0; +#X connect 65 0 3 0; +#X connect 68 0 69 0; +#X connect 70 0 69 0; +#X connect 72 0 75 0; +#X connect 75 0 73 0; diff --git a/doc/3.audio.examples/B14.sampler.rockafella.pd b/doc/3.audio.examples/B14.sampler.rockafella.pd index 5e668a95..058b8b9f 100644 --- a/doc/3.audio.examples/B14.sampler.rockafella.pd +++ b/doc/3.audio.examples/B14.sampler.rockafella.pd @@ -1,100 +1,166 @@ -#N canvas 417 38 884 660 12; +#N canvas 426 38 906 742 12; #X declare -stdpath ./; -#X floatatom 63 155 4 0 100 0 - - - 0; -#X obj 187 485 *~; -#X floatatom 295 110 6 0 200 0 - - - 0; -#X obj 61 355 +~; -#X obj 61 300 samphold~; -#X obj 61 327 *~; -#X obj 570 240 s~ phase; -#X obj 205 330 r~ phase; -#X obj 63 208 s chunk-size; -#X floatatom 570 27 6 0 0 0 - - - 0; -#X text 157 199 chunk size; -#X text 157 213 in seconds; -#X obj 582 74 r chunk-size; -#X obj 582 99 t b f; -#X obj 205 378 -~ 0.5; -#X obj 205 402 *~ 0.5; -#X obj 205 449 cos~; -#X obj 187 573 output~; -#X obj 570 180 phasor~; -#X obj 395 257 s~ read-pt; -#X obj 95 355 r~ read-pt; -#X obj 641 219 +~ 0.5; -#X obj 641 245 wrap~; -#X obj 641 270 s~ phase2; -#X obj 187 514 +~; -#X obj 63 181 * 0.001; -#X obj 353 206 phasor~; -#X obj 61 386 *~ 44100; -#X obj 61 441 tabread4~ table23; -#X obj 61 270 r chunk-size; -#X obj 61 412 +~ 1; -#X floatatom 570 156 5 0 0 0 - - - 0; -#X obj 295 244 s precession; -#X obj 695 98 t b f; -#X obj 695 73 r precession; -#X obj 295 151 * 0.01; -#X obj 287 506 *~; -#X obj 287 367 +~; -#X obj 287 318 samphold~; -#X obj 287 343 *~; -#X obj 422 378 -~ 0.5; -#X obj 422 402 *~ 0.5; -#X obj 422 449 cos~; -#X obj 321 365 r~ read-pt; -#X obj 287 391 *~ 44100; -#X obj 287 441 tabread4~ table23; -#X obj 287 293 r chunk-size; -#X obj 287 417 +~ 1; -#X obj 422 344 r~ phase2; -#X obj 63 105 loadbang; -#X text 524 460 We've changed the control for "chunk size" to milliseconds for added convenience \, and delayed multiplying sample location by the sample rate (44100) until the last moment \, so that calculations using "read-pt" and "chunk size" can be in the same units (seconds.), f 47; -#X msg 63 130 25; -#X floatatom 381 107 4 0 900 0 - - - 0; -#X obj 381 129 * 0.001; -#X msg 381 83 900; -#X obj 570 131 expr (pow(2 \, $f1/120)-$f3)/$f2; -#X obj 381 154 t b f; -#X obj 381 58 loadbang; -#X text 457 121 (msec); -#X obj 395 233 *~; -#X obj 353 182 /; -#N canvas 457 259 614 280 table 0; +#X floatatom 41 141 6 0 1000 0 - \$0-size - 0; +#X obj 173 495 *~; +#X floatatom 263 77 6 -200 200 0 - \$0-precession - 0; +#X obj 47 345 +~; +#X obj 47 290 samphold~; +#X obj 47 317 *~; +#X obj 556 277 s~ phase; +#X obj 191 330 r~ phase; +#X obj 41 196 s chunk-size; +#X floatatom 556 66 6 0 0 0 - \$0-cents - 0; +#X text 135 187 chunk size; +#X text 135 201 in seconds; +#X obj 568 98 r chunk-size; +#X obj 568 123 t b f; +#X obj 191 378 -~ 0.5; +#X obj 191 402 *~ 0.5; +#X obj 191 449 cos~; +#X obj 173 619 output~; +#X obj 556 217 phasor~; +#X obj 365 244 s~ read-pt; +#X obj 82 349 r~ read-pt; +#X obj 627 256 +~ 0.5; +#X obj 627 282 wrap~; +#X obj 627 307 s~ phase2; +#X obj 173 574 +~; +#X obj 41 169 * 0.001; +#X obj 323 193 phasor~; +#X obj 47 260 r chunk-size; +#X obj 47 413 +~ 1; +#X floatatom 556 187 9 0 0 0 - - - 0; +#X obj 263 231 s precession; +#X obj 766 122 t b f; +#X obj 766 97 r precession; +#X obj 263 108 * 0.01; +#X obj 273 495 *~; +#X obj 273 367 +~; +#X obj 273 314 samphold~; +#X obj 273 343 *~; +#X obj 420 383 -~ 0.5; +#X obj 420 407 *~ 0.5; +#X obj 420 452 cos~; +#X obj 307 365 r~ read-pt; +#X obj 273 395 *~ 44100; +#X obj 273 287 r chunk-size; +#X obj 273 421 +~ 1; +#X obj 420 344 r~ phase2; +#X floatatom 351 67 10 0 900 0 - \$0-loop-length - 0; +#X obj 351 92 * 0.001; +#X obj 351 116 t b f; +#X obj 365 220 *~; +#X obj 323 144 /; +#X obj 37 21 cnv 5 5 25 empty empty Time\ Compression/Expansion\ by\ Looped\ Sampling 15 13 0 16 #dfdfdf #202020 0; +#X text 609 66 <-- cents; +#N canvas 1070 307 323 359 init 0; +#X text 57 23 This subpatch initializes the patch and loads values in number boxes., f 29; +#X obj 79 94 loadbang; +#X obj 79 149 f \$0; +#X obj 79 121 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 79 277 declare -stdpath ./; +#X msg 79 176 \; \$1-cents 0 \; \$1-precession 20 \; \$1-size 250; +#X connect 1 0 3 0; +#X connect 2 0 5 0; +#X connect 3 0 2 0; +#X restore 67 580 pd init; +#X text 539 474 We've delayed multiplying sample location by the sample rate (44100) until the last moment \, so that calculations using "read-pt" and "chunk size" can be in the same units (seconds.), f 46; +#X obj 556 155 expr (pow(2 \, $f1/1200) - $f3) / $f2; +#X text 623 187 (ratio - precession) / size; +#X floatatom 263 176 5 0 0 0 - - - 0; +#X text 538 353 Here \, rather than ask you to push the read pointer back and forth in the sample \, we use a [phasor~]. This makes it possible to avoid the [samphold~] on the read pointer [r~ read-pt] \, since \, knowing the precession \, we can correct for it in computing the frequency of the original [phasor~] above., f 46; +#X text 76 77 precession in percent --> (can be negative), f 25; +#X obj 324 517 loadbang; +#X msg 324 544 ../sound/voice.wav; +#X obj 118 386 r \$0-SR; +#X obj 47 386 *~ 44100; +#X obj 342 395 r \$0-SR; +#X obj 273 445 tabread4~ \$0-sample; +#X obj 47 442 tabread4~ \$0-sample; +#X msg 346 597 ../sound/bell.aiff; +#X msg 335 570 ../sound/voice2.wav; +#X obj 385 630 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 413 630 choose a sample; +#X obj 437 660 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 462 654 record 3 seconds, f 8; +#X text 428 67 <-- loop length (ms), f 11; +#X text 87 141 <-- chunk size (ms); +#X floatatom 323 169 7 0 0 0 - - - 0; +#N canvas 406 326 961 523 smaple-table 1; #N canvas 0 0 450 300 (subpatch) 0; -#X array table23 44103 float 2; -#X coords 0 1.02 44103 -1.02 200 130 1; -#X restore 363 64 graph; -#X text 386 198 --- 44103 samples ---; -#X obj 48 148 loadbang; -#X obj 52 37 adc~ 1; -#X obj 52 62 hip~ 5; -#X obj 48 202 soundfiler; -#X text 141 155 v-- re-read original table; -#X obj 52 118 tabwrite~ table23; -#X msg 48 175 read ../sound/voice.wav table23; -#X text 90 91 <= record; -#X obj 67 91 bng 17 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X connect 2 0 8 0; -#X connect 3 0 4 0; -#X connect 4 0 7 0; -#X connect 8 0 5 0; -#X connect 10 0 7 0; -#X restore 768 236 pd table; -#X obj 403 599 declare -stdpath ./; -#X obj 187 543 hip~ 5; -#X text 416 106 <-- loop length; -#X text 187 110 precession --> (percent), f 14; -#X text 101 155 <-- chunk size (msec); -#X text 523 347 Here \, rather than ask you to push the read pointer back and forth in the sample \, we use a [phasor~]. This makes it possible to avoid the samphold~ on the read pointer ([r~ read-pt]) \, since \, knowing the precession \, we can correct for it in computing the frequency of the original [phasor~] above at right., f 46; -#X text 623 28 <--; -#X text 650 28 transposition \, halftones/10, f 14; -#X obj 47 18 cnv 5 5 25 empty empty Time\ Compression/Expansion\ by\ Looped\ Sampling 15 13 0 16 #dfdfdf #202020 0; +#X array \$0-sample 62079 float 2; +#X coords 0 1.02 62079 -1.02 273 194 1 0 0; +#X restore 619 227 graph; +#X obj 453 362 adc~ 1; +#X obj 108 251 soundfiler; +#X obj 415 110 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X text 438 110 <-- record; +#X floatatom 108 310 7 0 0 0 - - - 0; +#X obj 175 280 t f; +#X floatatom 175 310 6 0 0 0 - - - 0; +#X obj 108 359 /; +#X floatatom 108 405 10 0 0 0 - - - 0; +#X obj 175 371 * 0.001; +#X obj 185 339 s \$0-SR; +#X obj 108 439 s \$0-loop-length; +#X text 224 309 <-- file's Sample Rate; +#X text 28 295 sample length -->, f 10; +#X obj 110 66 inlet; +#X obj 163 167 symbol \$0-sample; +#X obj 110 200 pack s s; +#X obj 110 163 t a b; +#X msg 108 224 read -resize \$1 \$2; +#X obj 415 407 tabwrite~ \$0-sample; +#X obj 415 66 inlet; +#X text 185 406 <-- sample length (msec); +#X obj 457 164 samplerate~; +#X obj 457 195 s \$0-SR; +#X obj 452 322 s \$0-sample; +#X obj 452 232 f 3000; +#X msg 452 293 resize \$1; +#X obj 467 264 s \$0-loop-length; +#X obj 216 101 openpanel; +#X obj 216 66 inlet; +#X msg 634 59 0 \, 426375 4834.18; +#X obj 634 83 line~; +#X obj 634 107 tabread4~ \$0-sample; +#X obj 634 131 out~; +#X connect 1 0 20 0; +#X connect 2 0 5 0; +#X connect 2 1 6 0; +#X connect 3 0 20 0; +#X connect 3 0 26 0; +#X connect 3 0 23 0; +#X connect 5 0 8 0; +#X connect 6 0 7 0; +#X connect 7 0 10 0; +#X connect 7 0 11 0; +#X connect 8 0 9 0; +#X connect 9 0 12 0; +#X connect 10 0 8 1; +#X connect 15 0 18 0; +#X connect 16 0 17 1; +#X connect 17 0 19 0; +#X connect 18 0 17 0; +#X connect 18 1 16 0; +#X connect 19 0 2 0; +#X connect 21 0 3 0; +#X connect 23 0 24 0; +#X connect 26 0 27 0; +#X connect 26 0 28 0; +#X connect 27 0 25 0; +#X connect 29 0 18 0; +#X connect 30 0 29 0; +#X connect 31 0 32 0; +#X connect 32 0 33 0; +#X connect 33 0 34 0; +#X restore 335 693 pd smaple-table; +#X text 556 559 The sample now is loaded in the subpatch [pd sample-table]. As for the loaded samples \, we offer more options and also allow you to choose a sample from your hard drive. Also note that now we query the sample rate from the file and used it instead of hard code it., f 41; +#X text 454 694 <------ Open the [pd sample-table] for more details.; #X connect 0 0 25 0; #X connect 1 0 24 0; -#X connect 2 0 35 0; -#X connect 3 0 27 0; +#X connect 2 0 33 0; +#X connect 3 0 63 0; #X connect 4 0 5 0; #X connect 5 0 3 0; #X connect 7 0 4 1; @@ -112,44 +178,49 @@ #X connect 20 0 3 1; #X connect 21 0 22 0; #X connect 22 0 23 0; -#X connect 24 0 63 0; +#X connect 24 0 17 0; #X connect 25 0 8 0; -#X connect 26 0 59 0; -#X connect 27 0 30 0; -#X connect 28 0 1 0; -#X connect 29 0 4 0; -#X connect 30 0 28 0; -#X connect 31 0 18 0; -#X connect 33 0 55 0; -#X connect 33 1 55 2; -#X connect 34 0 33 0; -#X connect 35 0 32 0; -#X connect 35 0 60 0; -#X connect 36 0 24 1; -#X connect 37 0 44 0; +#X connect 26 0 49 0; +#X connect 27 0 4 0; +#X connect 28 0 66 0; +#X connect 29 0 18 0; +#X connect 31 0 55 0; +#X connect 31 1 55 2; +#X connect 32 0 31 0; +#X connect 33 0 50 0; +#X connect 33 0 57 0; +#X connect 34 0 24 1; +#X connect 35 0 42 0; +#X connect 36 0 37 0; +#X connect 37 0 35 0; #X connect 38 0 39 0; -#X connect 39 0 37 0; -#X connect 40 0 41 0; -#X connect 41 0 42 0; -#X connect 42 0 36 1; -#X connect 43 0 37 1; -#X connect 44 0 47 0; -#X connect 45 0 36 0; -#X connect 46 0 38 0; -#X connect 47 0 45 0; -#X connect 48 0 40 0; -#X connect 48 0 39 1; -#X connect 48 0 38 1; -#X connect 49 0 51 0; -#X connect 51 0 0 0; -#X connect 52 0 53 0; -#X connect 53 0 56 0; -#X connect 54 0 52 0; -#X connect 55 0 31 0; -#X connect 56 0 60 0; -#X connect 56 1 60 1; -#X connect 56 1 59 1; -#X connect 57 0 54 0; -#X connect 59 0 19 0; -#X connect 60 0 26 0; -#X connect 63 0 17 0; +#X connect 39 0 40 0; +#X connect 40 0 34 1; +#X connect 41 0 35 1; +#X connect 42 0 44 0; +#X connect 43 0 36 0; +#X connect 44 0 65 0; +#X connect 45 0 38 0; +#X connect 45 0 37 1; +#X connect 45 0 36 1; +#X connect 46 0 47 0; +#X connect 47 0 48 0; +#X connect 48 0 50 0; +#X connect 48 1 50 1; +#X connect 48 1 49 1; +#X connect 49 0 19 0; +#X connect 50 0 75 0; +#X connect 55 0 29 0; +#X connect 57 0 30 0; +#X connect 60 0 61 0; +#X connect 61 0 76 0; +#X connect 62 0 63 1; +#X connect 63 0 28 0; +#X connect 64 0 42 1; +#X connect 65 0 34 0; +#X connect 66 0 1 0; +#X connect 67 0 76 0; +#X connect 68 0 76 0; +#X connect 69 0 76 1; +#X connect 71 0 76 2; +#X connect 75 0 26 0; diff --git a/doc/3.audio.examples/B15.tabread4~-onset.pd b/doc/3.audio.examples/B15.tabread4~-onset.pd index ce261d58..e4ba32a8 100644 --- a/doc/3.audio.examples/B15.tabread4~-onset.pd +++ b/doc/3.audio.examples/B15.tabread4~-onset.pd @@ -21,12 +21,12 @@ #X obj 487 472 declare -stdpath ./; #X text 430 347 First \, generate the table:; #X obj 402 347 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 406 546 array define \$0-tab 200000; +#X obj 421 557 array define \$0-tab 200000; #X text 28 58 None of this is needed if you have Pd compiled for double precision \, but in the case you have Pd compiled to work on 32-bit audio samples (a.k.a single precision) you do not have enough precision for use as indices into an array of more than about 32K samples. This is because the mantissa of a 32-bit floating point number has only 24 bits \, out of which you would be using 16 bits or more to address a sample more than 32K into the array \, so there would remain 8 or fewer bits to supply the fraction. In the most extreme situation possible \, the sample could contain a Nyquist frequency sinusoid and the output would then have only about 8 bits of accuracy!, f 89; #X msg 426 385 \; pd dsp 1 \, fast-forward 4000; #X text 28 181 You can use the "onset" inlet to [tabread4~] to get good accuracy reading longer arrays. The [tabread4~] object adds the index and the "main" (signal) inlet in double precision. So if \, for example \, the onset inlet could specify an integer exactly up to about 8 million (190 seconds at 44100 Hz) \, and the signal inlet could act as a displacement., f 89; #X obj 308 386 sig~; -#X obj 50 19 cnv 5 5 25 empty empty [tabread4~]\ Onset\ to\ Improve\ Accuracy\ in\ Single\ Precision 15 13 0 16 #dfdfdf #202020 0; +#X obj 46 19 cnv 5 5 25 empty empty [tabread4~]\ Onset\ to\ Improve\ Accuracy\ in\ Single\ Precision 15 13 0 16 #dfdfdf #202020 0; #X connect 1 0 2 0; #X connect 2 0 5 0; #X connect 4 0 0 0; diff --git a/doc/3.audio.examples/B16.long-varispeed.pd b/doc/3.audio.examples/B16.long-varispeed.pd index 2953c77e..7d3b683d 100644 --- a/doc/3.audio.examples/B16.long-varispeed.pd +++ b/doc/3.audio.examples/B16.long-varispeed.pd @@ -39,7 +39,6 @@ #X obj 560 251 tabwrite~ \$0-tab; #X obj 571 224 osc~; #X obj 560 131 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 713 245 table \$0-tab 1e+06; #X obj 38 424 / 1e+06; #X text 549 689 new onset is phase plus old onset; #X obj 404 348 * 1e+06; @@ -74,17 +73,18 @@ #X text 104 451 naive way: just run a phasor into [tabread4~], f 16; #X text 105 551 convert phase to range +/- 5000 -->, f 18; #X obj 34 14 cnv 5 5 25 empty empty Variable\ Speed\ Playback\ from\ Long\ Tables 15 13 0 16 #dfdfdf #202020 0; +#X obj 702 251 array define \$0-tab 1e+06; #X connect 0 0 2 0; #X connect 1 0 23 0; #X connect 2 0 30 0; #X connect 4 0 25 0; -#X connect 5 0 40 0; -#X connect 5 0 53 0; +#X connect 5 0 39 0; +#X connect 5 0 52 0; #X connect 6 0 3 0; #X connect 7 0 4 1; -#X connect 7 0 42 0; +#X connect 7 0 41 0; #X connect 8 0 4 1; -#X connect 8 0 42 0; +#X connect 8 0 41 0; #X connect 9 0 10 0; #X connect 10 0 22 0; #X connect 11 0 13 0; @@ -121,12 +121,12 @@ #X connect 37 0 36 0; #X connect 38 0 34 0; #X connect 38 0 36 0; -#X connect 38 0 63 0; -#X connect 40 0 4 0; -#X connect 42 0 48 0; -#X connect 48 0 60 0; -#X connect 48 1 18 1; -#X connect 48 1 11 1; -#X connect 53 0 1 0; -#X connect 53 0 29 0; -#X connect 60 0 14 0; +#X connect 38 0 62 0; +#X connect 39 0 4 0; +#X connect 41 0 47 0; +#X connect 47 0 59 0; +#X connect 47 1 18 1; +#X connect 47 1 11 1; +#X connect 52 0 1 0; +#X connect 52 0 29 0; +#X connect 59 0 14 0; diff --git a/doc/3.audio.examples/C01.nyquist.pd b/doc/3.audio.examples/C01.nyquist.pd index a1280dc6..4d9f1a9c 100644 --- a/doc/3.audio.examples/C01.nyquist.pd +++ b/doc/3.audio.examples/C01.nyquist.pd @@ -3,7 +3,7 @@ #N canvas 0 0 450 300 (subpatch) 0; #X array table24 259 float 0; #X coords 0 1.02 258 -1.02 258 130 1 0 0; -#X restore 196 413 graph; +#X restore 201 413 graph; #X obj 42 333 line~; #X msg 42 274 500 \, 1423 4000; #X floatatom 53 301 5 0 0 0 - - - 0; @@ -32,13 +32,14 @@ #X text 397 345 clear; #X obj 42 366 tabosc4~ table24; #X text 98 62 WARNING: PLAY THIS QUIETLY TO AVOID UNPLEASANTNESS AND POSSIBLE EAR DAMAGE., f 39; -#X text 22 114 Foldover occurs when you synthesize frequencies greater than the Nyquist frequency (half the sample rate). In this example \, the fundamental only reaches 1423 \, but the tables contain high partials. As the partials sweep upward you hear them reflect off the Nyquist frequency. Also \, partials can come into contact with each other causing beating. The value of 1423 was chosen to make the beating effect especially strong if you're running at a sample rate of 44100 (the usual one.); +#X text 36 113 Foldover occurs when you synthesize frequencies greater than the Nyquist frequency (half the sample rate). In this example \, the fundamental only reaches 1423 \, but the tables contain high partials. As the partials sweep upward you hear them reflect off the Nyquist frequency. Also \, partials can come into contact with each other causing beating. The value of 1423 was chosen to make the beating effect especially strong if you're running at a sample rate of 44100 (the usual one.); #X obj 33 496 declare -stdpath ./; #X obj 325 287 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 350 317 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 375 345 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 202 303 waveforms -->; +#X text 194 264 waveforms -->; #X obj 53 18 cnv 5 5 25 empty empty The\ Nyquist\ Theorem\ and\ Foldover 15 13 0 16 #dfdfdf #202020 0; +#X text 95 300 <-- try other frequencies, f 13; #X connect 1 0 12 0; #X connect 2 0 1 0; #X connect 3 0 1 0; diff --git a/doc/3.audio.examples/C02.sawtooth-foldover.pd b/doc/3.audio.examples/C02.sawtooth-foldover.pd index c254625f..4c941168 100644 --- a/doc/3.audio.examples/C02.sawtooth-foldover.pd +++ b/doc/3.audio.examples/C02.sawtooth-foldover.pd @@ -1,33 +1,40 @@ -#N canvas 516 98 515 555 12; +#N canvas 529 75 521 679 12; #X declare -stdpath ./; -#X obj 139 413 output~; -#X obj 139 376 clip~ 0 1; -#X obj 139 186 mtof; -#X floatatom 139 164 5 0 0 0 - - - 0; -#X obj 139 322 *~ 20; -#X obj 139 348 -~ 19; -#X obj 139 210 phasor~; -#X obj 153 246 output~; -#X text 95 500 We'll explain more about making pulses later on... this example is mostly intended as ear training., f 50; -#X text 40 62 In more ordinary kinds of waveforms \, foldover comes across as a "cheap synth" sound. You can hear the foldover clearly in the pulse train here \, and less clearly (but still audibly) in the straight sawtooth \, especially at high pitches., f 63; -#N canvas 698 337 212 167 set 0; -#X obj 45 74 loadbang; -#X msg 45 99 61; -#X obj 45 124 outlet; -#X text 7 6 This sets the pitch initially to 61 when the patch is first opened., f 26; -#X connect 0 0 1 0; -#X connect 1 0 2 0; -#X restore 139 138 pd set; -#X obj 344 169 declare -stdpath ./; -#X text 274 266 <-- sawtooth amplitude; -#X text 262 432 <-- pulse train amplitude; -#X text 182 163 <-- pitch; -#X obj 91 17 cnv 5 5 25 empty empty Foldvoer\ in\ Sawtooth\ Waves 15 13 0 16 #dfdfdf #202020 0; +#X obj 125 493 output~; +#X obj 125 456 clip~ 0 1; +#X obj 125 210 mtof; +#X floatatom 125 184 5 20 100 0 - \$0-pitch - 0; +#X obj 125 402 *~ 20; +#X obj 125 428 -~ 19; +#X obj 125 270 phasor~; +#X obj 186 360 output~; +#X text 168 183 <-- pitch; +#X obj 86 17 cnv 5 5 25 empty empty Foldvoer\ in\ Sawtooth\ Waves 15 13 0 16 #dfdfdf #202020 0; +#N canvas 698 337 346 274 init 0; +#X obj 125 81 loadbang; +#X obj 92 204 declare -stdpath ./; +#X obj 125 144 s \$0-pitch; +#X text 57 23 This subpatch initializes the patch (and sets the pitch to 61)., f 29; +#X msg 125 113 72; +#X connect 0 0 4 0; +#X connect 4 0 2 0; +#X restore 338 200 pd init; +#X text 248 512 <-- pulse train; +#X text 85 590 * We'll explain more about making pulses later on... this example is mostly intended as ear training., f 52; +#X floatatom 125 240 9 20 100 0 - - - 0; +#X text 39 64 In more ordinary kinds of waveforms \, foldover comes across as a "cheap synth" sound. You can hear the foldover clearly in the pulse train here \, and less clearly (but still audibly) in the [phasor~] output (which has a sawtooth like shape). The foldover is more proeminent at higher pitches (set pitch to other values and try it)., f 61; +#X obj 186 309 *~ 2; +#X obj 186 333 -~ 1; +#X text 302 381 <-- sawtooth; +#X text 207 432 turn [phasor~] into a pulse train *, f 20; +#X text 238 302 turn [phasor~] into a more proper sawtooth like waveform (from -1 to 1), f 25; #X connect 1 0 0 0; -#X connect 2 0 6 0; +#X connect 2 0 13 0; #X connect 3 0 2 0; #X connect 4 0 5 0; #X connect 5 0 1 0; #X connect 6 0 4 0; -#X connect 6 0 7 0; -#X connect 10 0 3 0; +#X connect 6 0 15 0; +#X connect 13 0 6 0; +#X connect 15 0 16 0; +#X connect 16 0 7 0; diff --git a/doc/3.audio.examples/C03.zipper.noise.pd b/doc/3.audio.examples/C03.zipper.noise.pd index 8d3cd415..09484402 100644 --- a/doc/3.audio.examples/C03.zipper.noise.pd +++ b/doc/3.audio.examples/C03.zipper.noise.pd @@ -1,4 +1,4 @@ -#N canvas 521 48 498 529 12; +#N canvas 521 48 499 541 12; #X declare -stdpath ./; #X obj 128 435 output~; #X obj 128 395 *~; diff --git a/doc/3.audio.examples/C04.control.to.signal.pd b/doc/3.audio.examples/C04.control.to.signal.pd index 76fd7179..9437bd24 100644 --- a/doc/3.audio.examples/C04.control.to.signal.pd +++ b/doc/3.audio.examples/C04.control.to.signal.pd @@ -1,7 +1,7 @@ -#N canvas 544 38 544 582 12; +#N canvas 320 93 1042 664 12; #X declare -stdpath ./; -#X obj 190 405 output~; -#X obj 308 405 output~; +#X obj 154 474 output~; +#X obj 272 474 output~; #N canvas 799 288 303 263 metro 0; #X obj 88 38 loadbang; #X msg 88 65 1; @@ -9,29 +9,64 @@ #X obj 88 153 sel 0 1; #X obj 88 190 outlet; #X obj 152 192 outlet; -#X obj 88 96 metro 2.1; +#X obj 88 96 metro 2; #X connect 0 0 1 0; #X connect 1 0 6 0; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 3 1 5 0; #X connect 6 0 2 0; -#X restore 190 284 pd metro; -#X obj 190 360 line~; -#X obj 308 360 vline~; -#X msg 190 323 1 2.1; -#X msg 308 323 0 2.1; -#X obj 379 19 declare -stdpath ./; -#X text 60 55 For controlling amplitudes \, [line~] \, with its block-aligned breakpoints \, is accurate enough for most purposes. But certain usages \, such as this patch \, demand more accuracy. The [vline~] object \, somewhat more expensive than [line~] \, can handle breakpoints to sub-sample accuracy., f 60; -#X text 60 135 Here we try out [line~] and [vline~] as triangle wave generators. The subpatch is still sending alternating bangs as in the last patch \, but now at an audible frequency \, every 2 msec.; -#X text 61 201 The effect of [line~] rounding breakpoints to the nearest block (on the order of a millisecond) is that each 4-ms-long cycle has a different shape. Using [vline~] resolves the problem.; -#X text 105 496 Sometimes you will want to use [vline~] in place of [sig~] for the same reason., f 52; -#X obj 42 13 cnv 5 5 25 empty empty Converting\ Control\ to\ Signals 15 13 0 16 #dfdfdf #202020 0; +#X restore 219 313 pd metro; +#X obj 154 389 line~; +#X obj 272 389 vline~; +#X obj 750 62 declare -stdpath ./; +#X obj 84 18 cnv 5 5 25 empty empty Converting\ Control\ to\ Signals 15 13 0 16 #dfdfdf #202020 0; +#X msg 154 352 1 2; +#X msg 272 352 -1 2; +#X text 63 69 For controlling amplitudes \, [line~] \, with its block-aligned breakpoints \, is accurate enough for most purposes. But some usages \, such as this patch \, demand more accuracy. We then use the [vline~] object \, somewhat more expensive than [line~] \, because it can handle breakpoints to sub-sample accuracy., f 61; +#N canvas 0 0 450 300 (subpatch) 0; +#X array vline~ 882 float 0; +#X coords 0 1.02 881 -1.02 356 169 1; +#X restore 573 366 graph; +#N canvas 0 0 450 300 (subpatch) 0; +#X array line~ 882 float 0; +#X coords 0 1.02 881 -1.02 357 169 1 0 0; +#X restore 573 135 graph; +#X obj 349 386 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X text 372 385 <-- graph once; +#X obj 378 412 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 402 411 <-- graph repeatedly, f 10; +#N canvas 146 130 660 350 graph 0; +#X obj 440 87 inlet; +#X obj 376 87 inlet; +#X obj 306 87 inlet~; +#X obj 195 87 inlet~; +#X obj 195 201 tabwrite~ line~; +#X obj 376 202 tabwrite~ vline~; +#X obj 440 136 metro 150; +#X connect 0 0 6 0; +#X connect 1 0 4 0; +#X connect 1 0 5 0; #X connect 2 0 5 0; -#X connect 2 1 6 0; +#X connect 3 0 4 0; +#X connect 6 0 4 0; +#X connect 6 0 5 0; +#X restore 290 439 pd graph; +#X f 13; +#X text 674 561 ----- 0.2 second ------; +#X text 667 317 ----- 0.2 second ------; +#X text 63 149 Here we try out [line~] and [vline~] to generate triangle waves (with ramps going up to 1 and down to -1). The subpatch is still sending alternating bangs as in the last patch \, but now at every 2 ms \, which creates a 250 Hz triangular waveform., f 61; +#X text 63 225 The effect of [line~] rounding breakpoints to the nearest block (on the order of a millisecond) is that each 4-ms-long cycle has a different shape. Using [vline~] resolves the problem. You can hear and check the graphs to the right., f 61; +#X text 70 563 Sometimes you will want to use [vline~] in place of [sig~] for the same need to convert to signals with sample accuracy (since [sig~] can only convert and set a single value per block).; +#X connect 2 0 7 0; +#X connect 2 1 8 0; #X connect 3 0 0 0; +#X connect 3 0 16 0; #X connect 4 0 1 0; -#X connect 5 0 3 0; -#X connect 5 0 4 0; -#X connect 6 0 3 0; -#X connect 6 0 4 0; +#X connect 4 0 16 1; +#X connect 7 0 3 0; +#X connect 7 0 4 0; +#X connect 8 0 3 0; +#X connect 8 0 4 0; +#X connect 12 0 16 2; +#X connect 14 0 16 3; diff --git a/doc/3.audio.examples/C05.sampler.oneshot.pd b/doc/3.audio.examples/C05.sampler.oneshot.pd index 4acfb08e..1b929520 100644 --- a/doc/3.audio.examples/C05.sampler.oneshot.pd +++ b/doc/3.audio.examples/C05.sampler.oneshot.pd @@ -1,67 +1,96 @@ -#N canvas 338 38 914 661 12; +#N canvas 380 38 1051 823 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; -#X array tab28 176403 float 2; -#X coords 0 1.02 176403 -1.02 200 130 1; -#X restore 599 287 graph; -#X obj 547 470 loadbang; -#X obj 412 221 hip~ 5; -#X obj 583 98 adc~ 1; -#X obj 583 128 hip~ 5; -#X text 647 476 v-- re-read the original sample; -#X obj 412 187 *~; -#X obj 452 160 r cutoff; -#X obj 412 70 r phase; -#X obj 149 143 delay 5; -#X msg 49 179 \; cutoff 0 5; -#X obj 662 178 line~; -#X obj 583 173 *~; -#X text 618 428 ------ 4 seconds ------; -#X obj 722 98 del 3990; -#X msg 722 126 0 10; -#X text 58 568 We avoid clicking at the end of the table by getting the table's own contents to go smoothly to zero. To do this we added a level control to the recording patch that cuts off just before the recording reaches the end of the table., f 59; -#X obj 547 529 soundfiler; -#X obj 452 187 vline~; -#X obj 412 261 output~; -#X obj 412 100 vline~; -#X obj 651 218 tabwrite~ tab28; -#X msg 547 500 read ../sound/bell.aiff tab28; -#X obj 412 130 tabread4~ tab28; -#X msg 149 178 \; phase 1 \, 4.41e+08 1e+07 \; cutoff 1; -#X msg 662 116 0 \, 1 5; -#X text 651 532 My apologies to Jonathan Harvey whose bell this is., f 26; -#X text 132 236 set the upper line~ to start at the first sample and go forever (until the next trigger), f 31; -#X text 54 140 cut the sound off, f 9; -#X text 208 135 Wait for the cutoff to finish, f 16; -#X obj 741 14 declare -stdpath ./; -#X text 73 87 <-- play the sample; -#X text 675 57 <-- record; -#X obj 49 88 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 651 58 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 761 126 <-- stop recording, f 9; -#X text 58 352 Here's how to make a sampler with a [line~] object \, instead of a [phasor~] \, to generate the read location signal.; -#X text 58 393 To start a note \, first we have to mute the output in case there's already something playing---otherwise we'll get a click. The "cutoff" [line~] then takes 5 msec to get to zero. After that amount of delay \, we reset the phase to sample number 1 and set it in motion. We want the [line~] output to increase by 1 each sample of output \, so we ask for it to do 4.41e+08 samples in 1e+07 milliseconds., f 59; -#X text 58 501 The cutoff mechanism is still safe if we happen to ask for two notes in under 5 msec. The second request would reset the delay \, so that there's no way the delay can possibly fire without the cutoff [line~] at zero., f 59; -#X obj 42 13 cnv 5 5 25 empty empty One-Shot\ Sampler\ using\ [line~]\ as\ Phase 15 13 0 16 #dfdfdf #202020 0; -#X connect 1 0 22 0; -#X connect 2 0 19 0; -#X connect 3 0 4 0; -#X connect 4 0 12 0; -#X connect 6 0 2 0; -#X connect 7 0 18 0; -#X connect 8 0 20 0; -#X connect 9 0 24 0; -#X connect 11 0 12 1; -#X connect 12 0 21 0; -#X connect 14 0 15 0; -#X connect 15 0 11 0; -#X connect 18 0 6 1; -#X connect 20 0 23 0; -#X connect 22 0 17 0; -#X connect 23 0 6 0; -#X connect 25 0 11 0; -#X connect 33 0 10 0; -#X connect 33 0 9 0; -#X connect 34 0 14 0; -#X connect 34 0 25 0; -#X connect 34 0 21 0; +#X array tab28 155944 float 2; +#X coords 0 1.02 155944 -1.02 347 161 1; +#X restore 105 612 graph; +#X obj 585 232 adc~ 1; +#X obj 86 192 *~; +#X obj 126 165 r cutoff; +#X obj 86 75 r phase; +#X obj 325 154 delay 5; +#X msg 225 190 \; cutoff 0 5; +#X obj 664 291 line~; +#X obj 585 286 *~; +#X obj 720 211 del 3990; +#X msg 720 239 0 10; +#X obj 86 244 output~; +#X obj 653 331 tabwrite~ tab28; +#X obj 86 135 tabread4~ tab28; +#X msg 325 189 \; phase 1 \, 4.41e+08 1e+07 \; cutoff 1; +#X msg 664 229 0 \, 1 5; +#X text 230 151 cut the sound off, f 9; +#X text 384 146 Wait for the cutoff to finish, f 16; +#X obj 685 21 declare -stdpath ./; +#X text 249 98 <-- play the sample; +#X obj 225 99 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 653 171 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 52 352 Here's how to make a sampler with a [line~] object \, instead of a [phasor~] \, to generate the read location signal.; +#X text 52 514 The cutoff mechanism is still safe if we happen to ask for two notes in under 5 msec. The second request would reset the delay \, so that there's no way the delay can possibly fire without the cutoff [line~] at zero., f 59; +#X obj 42 23 cnv 5 5 25 empty empty One-Shot\ Sampler\ using\ [line~]\ as\ Phase 15 13 0 16 #dfdfdf #202020 0; +#X text 292 248 set the upper [line~] to start at the first sample and go "forever" (until the next trigger), f 33; +#X obj 86 105 line~; +#X obj 126 192 line~; +#X obj 653 474 vline~; +#X msg 653 417 0 \, 1 5 0 \, 0 10 3990; +#X obj 594 430 adc~ 1; +#X obj 594 484 *~; +#X obj 594 523 tabwrite~ tab28; +#X text 544 75 For recording \, we have a fade in and fade out mechanism to avoid clicks. To do this we added a level control to the recording patch that cuts off just before the recording reaches the end of the table., f 55; +#X text 677 170 <-- record and stop; +#X obj 806 236 s tab28; +#X msg 806 206 resize 176400; +#X text 757 233 fade out, f 4; +#X text 865 233 resize to 4 seconds, f 9; +#X text 736 265 at 3.99 seconds, f 7; +#X text 666 438 record and stop; +#X obj 653 378 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 677 377 <-- record and stop; +#X obj 812 439 s tab28; +#X msg 812 409 resize 176400; +#X text 871 436 resize to 4 seconds, f 9; +#X obj 600 767 soundfiler; +#X obj 822 684 openpanel; +#X msg 600 733 read -resize \$1 tab28; +#X obj 600 638 symbol ../sound/bell.aiff; +#X obj 600 609 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 600 579 loadbang; +#X text 610 661 My apologies to Jonathan Harvey whose bell this is., f 26; +#X obj 822 637 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 846 629 read another sample, f 7; +#X text 630 610 (re) read original sample; +#X text 733 475 Same mechanism with [vline~] \, which can schedule more than one line. Check its help file for more details., f 29; +#X text 52 393 To start a note \, first we have to mute the output in case there's already something playing---otherwise we'll get a click. The "cutoff" [line~] then takes 5 msec to get to zero. After that amount of delay \, we reset the phase to sample number 1 and set it in motion. We want the [line~] output to increase by 1 each sample of output \, so we ask for it to do 4.41e+08 samples in 1e+07 milliseconds (assuming a sample rate of 44.1 KHz)., f 59; +#X connect 1 0 8 0; +#X connect 2 0 11 0; +#X connect 3 0 27 0; +#X connect 4 0 26 0; +#X connect 5 0 14 0; +#X connect 7 0 8 1; +#X connect 8 0 12 0; +#X connect 9 0 10 0; +#X connect 10 0 7 0; +#X connect 13 0 2 0; +#X connect 15 0 7 0; +#X connect 20 0 6 0; +#X connect 20 0 5 0; +#X connect 21 0 9 0; +#X connect 21 0 12 0; +#X connect 21 0 15 0; +#X connect 21 0 36 0; +#X connect 26 0 13 0; +#X connect 27 0 2 1; +#X connect 28 0 31 1; +#X connect 29 0 28 0; +#X connect 30 0 31 0; +#X connect 31 0 32 0; +#X connect 36 0 35 0; +#X connect 41 0 44 0; +#X connect 41 0 29 0; +#X connect 44 0 43 0; +#X connect 47 0 48 0; +#X connect 48 0 46 0; +#X connect 49 0 48 0; +#X connect 50 0 49 0; +#X connect 51 0 50 0; +#X connect 53 0 47 0; diff --git a/doc/3.audio.examples/C06.signal.to.control.pd b/doc/3.audio.examples/C06.signal.to.control.pd index 9f6a1227..28ce60a7 100644 --- a/doc/3.audio.examples/C06.signal.to.control.pd +++ b/doc/3.audio.examples/C06.signal.to.control.pd @@ -1,4 +1,4 @@ -#N canvas 649 71 504 416 12; +#N canvas 626 71 504 416 12; #X obj 175 311 snapshot~; #X obj 88 252 phasor~ 1; #X floatatom 175 342 10 0 0 0 - - - 16; diff --git a/doc/3.audio.examples/C07.envelope.follower.pd b/doc/3.audio.examples/C07.envelope.follower.pd index ded3bcb7..9ee2d356 100644 --- a/doc/3.audio.examples/C07.envelope.follower.pd +++ b/doc/3.audio.examples/C07.envelope.follower.pd @@ -1,55 +1,55 @@ -#N canvas 236 38 1039 698 12; -#X text 48 332 Envelope followers are frequently used to detect attacks and periods of silence. (There are fancier attack detectors out there \, though.) Here is a simple threshold-based attack and rest detector., f 59; -#X obj 587 58 dbtorms; -#X obj 511 45 osc~ 440; -#X obj 511 101 env~; -#X floatatom 511 144 6 0 0 0 - - - 0; -#X floatatom 587 35 6 0 0 0 - - - 0; -#X obj 627 128 t b f; -#X floatatom 627 155 4 0 0 0 - - - 0; -#X obj 627 229 route 0 1; -#X obj 607 254 > 55; -#X obj 657 254 < 45; -#X obj 607 277 sel 1; -#X obj 657 277 sel 1; -#X msg 534 310 1; -#X msg 571 311 0; -#X obj 607 312 print attack; -#X obj 627 181 != 0; -#X obj 511 350 t b f; -#X floatatom 510 384 3 0 0 0 - - - 0; -#X obj 510 468 route 0 1; -#X obj 499 496 sel 1; -#X msg 389 639 1; -#X msg 427 639 0; -#X obj 510 412 != 0; -#X obj 563 385 < 45; -#X obj 467 560 timer; -#X obj 590 468 sel 0; -#X obj 540 609 sel 0; -#X obj 480 609 sel 1; -#X obj 480 650 print rest; -#X obj 467 583 > 1000; -#X text 699 228 route the RMS value according to state; -#X text 672 127 ATTACK DETECTION; -#X text 579 350 REST DETECTION; -#X obj 511 78 *~; -#X text 385 111 note 3.01 dB difference between peak and RMS amplitudes., f 16; -#X text 639 462 regardless of state \, when RMS isn't low reset the timer, f 29; -#X text 566 502 If we're not in rest \, and the RMS is low \, check elapsed time since RMS last wasn't low., f 45; -#X text 605 374 Here we always will test RMS against a low value but as before we route the result according to our state \, 1 if "resting" \, 0 if not., f 50; -#X text 690 155 state -- 1 if waiting for low threshold \, 0 if we've attained it and now want the high one., f 30; -#X text 705 259 if off \, 55 dB means attack. If on \, 45 dB or less means state changes to off., f 40; -#X text 555 573 If more than 1 second \, report a rest.; -#X text 591 602 If we're at rest \, pop out of it when RMS isn't low enough., f 29; -#X obj 627 206 pack f f; -#X obj 510 438 pack f f; -#X obj 156 109 ../5.reference/set-dsp-tgl; -#X text 187 112 DSP on/off; -#X msg 156 146 \; pd dsp \$1; -#X text 49 221 The [env~] object reports the RMS signal level over the last 512 samples (by default) or any other power of 2 that's at least twice the block size. The analysis is done in an overlapped fashion so that results appear every N/2 points if N is the analysis window size. So the larger the window \, the stabler the result and the less frequently it appears. Computation time doesn't depend heavily on N., f 59; -#X text 48 408 Both detectors are state machines with two states \, "on" and "off". If on \, a test is run to determine whether to turn off \, and vice versa. The tests are run at each output of the [env~] object., f 56; -#X obj 108 36 cnv 5 5 25 empty empty Envelope\ Followers 15 13 0 16 #dfdfdf #202020 0; +#N canvas 361 49 865 703 12; +#X text 38 382 Envelope followers are frequently used to detect attacks and periods of silence. (There are fancier attack detectors out there \, though.) Here is a simple threshold-based attack and rest detector., f 48; +#X obj 507 58 dbtorms; +#X obj 431 45 osc~ 440; +#X obj 431 101 env~; +#X floatatom 431 144 6 0 0 0 - - - 0; +#X floatatom 507 35 6 0 0 0 - - - 0; +#X obj 547 128 t b f; +#X floatatom 547 155 4 0 0 0 - - - 0; +#X obj 547 229 route 0 1; +#X obj 527 254 > 55; +#X obj 577 254 < 45; +#X obj 527 277 sel 1; +#X obj 577 277 sel 1; +#X msg 454 310 1; +#X msg 491 311 0; +#X obj 527 312 print attack; +#X obj 547 181 != 0; +#X obj 431 350 t b f; +#X floatatom 430 384 3 0 0 0 - - - 0; +#X obj 430 468 route 0 1; +#X obj 419 496 sel 1; +#X msg 309 639 1; +#X msg 347 639 0; +#X obj 430 412 != 0; +#X obj 483 385 < 45; +#X obj 387 560 timer; +#X obj 510 468 sel 0; +#X obj 460 609 sel 0; +#X obj 400 609 sel 1; +#X obj 400 650 print rest; +#X obj 387 583 > 1000; +#X text 621 222 route the RMS value according to state, f 20; +#X text 592 127 ATTACK DETECTION; +#X text 499 350 REST DETECTION; +#X obj 431 78 *~; +#X text 305 111 note 3.01 dB difference between peak and RMS amplitudes., f 16; +#X text 559 462 regardless of state \, when RMS isn't low reset the timer, f 29; +#X text 486 502 If we're not in rest \, and the RMS is low \, check elapsed time since RMS last wasn't low., f 33; +#X text 525 374 Here we always will test RMS against a low value but as before we route the result according to our state \, 1 if "resting" \, 0 if not., f 36; +#X text 610 155 state -- 1 if waiting for low threshold \, 0 if we've attained it and now want the high one., f 30; +#X text 621 262 if off \, 55 dB means attack. If on \, 45 dB or less means state changes to off., f 27; +#X text 475 573 If more than 1 second \, report a rest.; +#X text 511 602 If we're at rest \, pop out of it when RMS isn't low enough., f 29; +#X obj 547 206 pack f f; +#X obj 430 438 pack f f; +#X obj 136 109 ../5.reference/set-dsp-tgl; +#X text 167 112 DSP on/off; +#X msg 136 146 \; pd dsp \$1; +#X text 38 480 Both detectors are state machines with two states \, "on" and "off". If on \, a test is run to determine whether to turn off \, and vice versa. The tests are run at each output of the [env~] object., f 42; +#X obj 88 36 cnv 5 5 25 empty empty Envelope\ Followers 15 13 0 16 #dfdfdf #202020 0; +#X text 38 221 The [env~] object reports the RMS signal level over the last 1024 samples (by default) or any other power of 2 that's at least twice the block size. The analysis is done in an overlapped fashion so that results appear every N/2 points if N is the analysis window size (hence \, by default \, at every 512 samples). So the larger the window \, the stabler the result and the less frequently it appears. Computation time doesn't depend heavily on N., f 48; #X connect 1 0 34 1; #X connect 2 0 34 0; #X connect 3 0 4 0; diff --git a/doc/3.audio.examples/C08.analog.sequencer.pd b/doc/3.audio.examples/C08.analog.sequencer.pd index f369f254..a539ca52 100644 --- a/doc/3.audio.examples/C08.analog.sequencer.pd +++ b/doc/3.audio.examples/C08.analog.sequencer.pd @@ -1,98 +1,102 @@ -#N canvas 498 39 807 659 12; +#N canvas 398 47 785 680 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; -#X array 29-sequence 9 float 3; -#A 0 55 550 385 495 165 385 495 275 615; -#X coords 0 650 9 0 200 100 1 0 0; +#X array \$0-seq 9 float 2; +#X coords 0 650 9 110 200 100 1 0 0; #X restore 533 91 graph; -#X obj 95 510 *~; -#X obj 95 538 hip~ 5; +#X obj 123 554 *~; #N canvas 0 0 450 300 (subpatch) 0; -#X array 29-envelope 103 float 1; +#X array \$0-envelope 103 float 1; #A 0 -0.0199988 1.0673e-06 0.0500008 0.13 0.16 0.28 0.5 0.6 0.7 0.8 1.01111 1 0.988889 0.977778 0.966667 0.955556 0.944444 0.933333 0.922222 0.911111 0.9 0.888889 0.797778 0.737777 0.677777 0.647777 0.617777 0.557777 0.487777 0.467777 0.447776 0.417776 0.397776 0.387776 0.377776 0.367776 0.347776 0.327776 0.317776 0.297776 0.277776 0.267776 0.257776 0.257776 0.277776 0.297776 0.327776 0.357776 0.377776 0.397776 0.407776 0.427776 0.437776 0.387776 0.367776 0.347776 0.337776 0.287776 0.277776 0.277776 0.277776 0.267776 0.267776 0.267776 0.297776 0.317776 0.347776 0.367776 0.367776 0.357776 0.347776 0.337776 0.307776 0.287776 0.257776 0.227776 0.197776 0.167776 0.167776 0.167776 0.167776 0.167776 0.157776 0.157776 0.157776 0.157776 0.147776 0.147776 0.147776 0.137776 0.137776 0.111111 0.1 0.0888889 0.0777778 0.0666667 0.0555556 0.0444444 0.0333333 0.0222222 0.0111111 0 -0.0111111; #X coords 0 1.01 102 -0.01 200 100 1 0 0; -#X restore 533 211 graph; +#X restore 533 231 graph; #N canvas 0 0 450 300 (subpatch) 0; -#X array 29-sample 259 float 1; -#A 0 1 0.989177 0.95694 0.903989 0.83147 0.740951 0.634393 0.514103 0.382683 0.24298 0.0980171 -0.0490677 -0.19509 -0.33689 -0.471397 -0.595699 -0.707107 -0.803208 -0.881921 -0.941544 -0.980785 -0.998795 -0.995185 -0.970031 -0.92388 -0.857729 -0.77301 -0.671559 -0.55557 -0.427555 -0.290285 -0.14673 -1.83697e-16 0.14673 0.290285 0.427555 0.55557 0.671559 0.77301 0.857729 0.92388 0.970031 0.995185 0.998795 0.980785 0.941544 0.881921 0.803208 0.707107 0.595699 0.471397 0.33689 0.19509 0.0490677 -0.0980171 -0.24298 -0.382683 -0.514103 -0.634393 -0.740951 -0.83147 -0.903989 -0.95694 -0.989177 -1 -0.989177 -0.95694 -0.903989 -0.83147 -0.740951 -0.634393 -0.514103 -0.382683 -0.24298 -0.0980171 0.0490677 0.19509 0.33689 0.471397 0.595699 0.707107 0.803208 0.881921 0.941544 0.980785 0.998795 0.995185 0.970031 0.92388 0.857729 0.77301 0.671559 0.55557 0.427555 0.290285 0.14673 5.51091e-16 -0.14673 -0.290285 -0.427555 -0.55557 -0.671559 -0.77301 -0.857729 -0.92388 -0.970031 -0.995185 -0.998795 -0.980785 -0.941544 -0.881921 -0.803208 -0.707107 -0.595699 -0.471397 -0.33689 -0.19509 -0.0490677 0.0980171 0.24298 0.382683 0.514103 0.634393 0.740951 0.83147 0.903989 0.95694 0.989177 1 0.989177 0.95694 0.903989 0.83147 0.740951 0.634393 0.514103 0.382683 0.24298 0.0980171 -0.0490677 -0.19509 -0.33689 -0.471397 -0.595699 -0.707107 -0.803208 -0.881921 -0.941544 -0.980785 -0.998795 -0.995185 -0.970031 -0.92388 -0.857729 -0.77301 -0.671559 -0.55557 -0.427555 -0.290285 -0.14673 -2.69484e-15 0.14673 0.290285 0.427555 0.55557 0.671559 0.77301 0.857729 0.92388 0.970031 0.995185 0.998795 0.980785 0.941544 0.881921 0.803208 0.707107 0.595699 0.471397 0.33689 0.19509 0.0490677 -0.0980171 -0.24298 -0.382683 -0.514103 -0.634393 -0.740951 -0.83147 -0.903989 -0.95694 -0.989177 -1 -0.989177 -0.95694 -0.903989 -0.83147 -0.740951 -0.634393 -0.514103 -0.382683 -0.24298 -0.0980171 0.0490677 0.19509 0.33689 0.471397 0.595699 0.707107 0.803208 0.881921 0.941544 0.980785 0.998795 0.995185 0.970031 0.92388 0.857729 0.77301 0.671559 0.55557 0.427555 0.290285 0.14673 -4.90478e-16 -0.14673 -0.290285 -0.427555 -0.55557 -0.671559 -0.77301 -0.857729 -0.92388 -0.970031 -0.995185 -0.998795 -0.980785 -0.941544 -0.881921 -0.803208 -0.707107 -0.595699 -0.471397 -0.33689 -0.19509 -0.0490677 0.0980171 0.24298 0.382683 0.514103 0.634393 0.740951 0.83147 0.903989 0.95694 0.989177 1 0.989177 0.95694; -#X coords 0 1 258 -1 200 100 1; -#X restore 533 330 graph; -#X obj 72 271 tabread~ 29-sequence; -#X obj 131 303 wrap~; -#X obj 131 326 *~ 100; -#X obj 131 350 +~ 1; -#X obj 72 303 phasor~; -#X obj 72 334 -~ 0.5; -#X obj 72 428 cos~; -#X obj 113 401 *~; -#X obj 95 578 output~; -#X obj 113 480 tabread4~ 29-sample; -#X obj 131 374 tabread4~ 29-envelope; -#X obj 113 428 *~ 128; -#X obj 113 452 +~ 129; -#X obj 72 452 +~ 1; -#X obj 131 240 *~ 9; -#N canvas 875 258 533 565 make-tables 0; -#X obj 162 106 t b b; -#X obj 205 163 f; -#X obj 243 163 + 1; -#X msg 223 134 0; -#X obj 162 132 until; -#X obj 206 221 t f f; -#X obj 101 259 moses 10; -#X obj 101 341 tabwrite 29-envelope; -#X obj 101 287 expr ($f1-1)/10; -#X obj 112 312 expr (101-$f1)/90; -#X msg 116 487 \; 29-sample cosinesum 256 0 0 0 0 0 0 1; -#X msg 116 445 \; 29-sequence 0 55 550 385 495 165 385 495 275 615; -#X text 74 22 bang to recalculate the envelope table (I did this but then went in and changed it with the mouse afterwards.), f 55; -#X obj 160 197 sel 103; -#X text 84 388 The sequence is just a list of specified frequencies. the wavetable is a cosine.; -#X obj 162 77 bng 17 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X array \$0-waveform 259 float 0; +#X coords 0 1 258 -1 200 100 1 0 0; +#X restore 533 370 graph; +#X obj 159 323 wrap~; +#X obj 159 346 *~ 100; +#X obj 159 370 +~ 1; +#X obj 79 333 phasor~; +#X obj 79 364 -~ 0.5; +#X obj 79 448 cos~; +#X obj 141 431 *~; +#X obj 123 598 output~; +#X obj 141 468 *~ 128; +#X obj 141 492 +~ 129; +#X obj 79 472 +~ 1; +#X obj 159 260 *~ 9; +#X text 200 260 main loop: sawtooth of amplitude 9; +#X text 215 322 9x original frequency sawtooth; +#X text 198 479 adjust amplitude and center for wavetable; +#X text 156 554 multiply by raised-cosine smoothing function; +#X text 543 511 how to make the tables:, f 16; +#X obj 624 33 declare -stdpath ./; +#X obj 68 15 cnv 5 5 25 empty empty Analog\ Synth\ Style\ Sequencer 15 13 0 16 #dfdfdf #202020 0; +#X obj 79 291 tabread~ \$0-seq, f 8; +#X obj 159 394 tabread4~ \$0-envelope; +#X obj 141 520 tabread4~ \$0-waveform; +#N canvas 847 113 535 586 init-tables 0; +#X obj 273 118 t b b; +#X obj 316 175 f; +#X obj 354 175 + 1; +#X msg 334 146 0; +#X obj 273 144 until; +#X obj 317 233 t f f; +#X obj 212 271 moses 10; +#X obj 212 299 expr ($f1-1)/10; +#X obj 223 324 expr (101-$f1)/90; +#X text 158 25 bang to recalculate the envelope table (I did this but then went in and changed it with the mouse afterwards.), f 33; +#X obj 271 209 sel 103; +#X obj 273 89 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 212 353 tabwrite \$0-envelope; +#X obj 87 437 f \$0; +#X obj 87 407 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 87 372 loadbang; +#X msg 87 467 \; \$1-seq 0 220 550 385 495 165 385 495 275 615 \; \$1-waveform cosinesum 256 0 0 0 0 0 0 1; +#X text 139 412 The sequence is just a list of specified frequencies. The wavetable is a cosine., f 40; #X connect 0 0 4 0; #X connect 0 1 3 0; -#X connect 1 0 13 0; +#X connect 1 0 10 0; +#X connect 1 0 2 0; #X connect 2 0 1 1; #X connect 3 0 1 1; #X connect 4 0 1 0; #X connect 5 0 6 0; -#X connect 5 1 7 1; -#X connect 6 0 8 0; -#X connect 6 1 9 0; -#X connect 8 0 7 0; -#X connect 9 0 7 0; -#X connect 13 0 4 1; -#X connect 13 1 5 0; -#X connect 15 0 0 0; -#X restore 590 487 pd make-tables; -#X obj 131 212 phasor~ 0.6; -#X text 172 240 main loop: sawtooth of amplitude 9; -#X text 221 272 read frequency sequence; -#X text 187 302 9x original frequency sawtooth; -#X text 144 401 multiply envelope by audio-frequency sawtooth; -#X text 170 439 adjust amplitude and center for wavetable; -#X text 128 510 multiply by raised-cosine smoothing function; -#X text 549 465 how to make the tables:; -#X obj 624 33 declare -stdpath ./; -#X text 187 326 adjust for reading envelope sample; -#X text 49 55 Some control operations can be carried out entirely by tilde objects passing audio signals around. Here is an imitation of an analog sequencer and envelope generator. A [phasor~] loops through the "sequence" table at 0.6 Hz \, generating 9 frequencies. Simultaneously \, by multiplying by 9 and wrapping \, we create a sawtooth at 9 * 0.6 = 5.4 Hz \, which reads a second table for an envelope shape. This becomes the grain size for a sampler based on the B08.sampler.loop example earlier., f 57; -#X obj 73 17 cnv 5 5 25 empty empty Analog\ Synth\ Style\ Sequencer 15 13 0 16 #dfdfdf #202020 0; -#X connect 1 0 2 0; -#X connect 2 0 13 0; -#X connect 5 0 9 0; +#X connect 5 1 12 1; #X connect 6 0 7 0; +#X connect 6 1 8 0; +#X connect 7 0 12 0; +#X connect 8 0 12 0; +#X connect 10 0 4 1; +#X connect 10 1 5 0; +#X connect 11 0 0 0; +#X connect 13 0 16 0; +#X connect 14 0 13 0; +#X connect 15 0 14 0; +#X restore 601 533 pd init-tables; +#X text 141 296 <- read frequency sequence; +#X obj 79 496 *~ 0.5; +#X obj 159 232 phasor~ 0.6; +#X text 39 63 Some control operations can be carried out entirely by tilde objects passing audio signals around. Here is an imitation of an analog sequencer and envelope generator. A [phasor~] is multiplying by 9 to loop through the sequence table ("\$0-seq") at 0.6 Hz \, generating 9 frequencies. Simultaneously \, by wrapping the same signal that reads the first table \, we multiply the [phasor~] frequency by 9 (9 * 0.6 = 5.4 Hz) and read a second table for an envelope shape. This becomes the grain size for a sampler based on the B08.sampler.loop example earlier., f 62; +#X text 176 425 multiply envelope by audio-frequency sawtooth (from -0.5 to 0.5), f 37; +#X text 215 346 adjust for reading envelope table; +#X connect 1 0 11 0; +#X connect 4 0 5 0; +#X connect 5 0 6 0; +#X connect 6 0 24 0; #X connect 7 0 8 0; -#X connect 8 0 15 0; -#X connect 9 0 10 0; +#X connect 8 0 9 0; +#X connect 8 0 10 0; +#X connect 9 0 14 0; #X connect 10 0 12 0; -#X connect 10 0 11 0; -#X connect 11 0 18 0; -#X connect 12 0 16 0; -#X connect 14 0 1 1; -#X connect 15 0 12 1; -#X connect 16 0 17 0; -#X connect 17 0 14 0; -#X connect 18 0 1 0; -#X connect 19 0 5 0; -#X connect 19 0 6 0; -#X connect 21 0 19 0; +#X connect 12 0 13 0; +#X connect 13 0 25 0; +#X connect 14 0 28 0; +#X connect 15 0 4 0; +#X connect 15 0 23 0; +#X connect 23 0 7 0; +#X connect 24 0 10 1; +#X connect 25 0 1 1; +#X connect 28 0 1 0; +#X connect 29 0 15 0; diff --git a/doc/3.audio.examples/C09.sample.hold.pd b/doc/3.audio.examples/C09.sample.hold.pd index b03989c8..91d7f723 100644 --- a/doc/3.audio.examples/C09.sample.hold.pd +++ b/doc/3.audio.examples/C09.sample.hold.pd @@ -1,52 +1,70 @@ -#N canvas 407 40 832 553 12; +#N canvas 369 83 783 601 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; -#X array samphold 44100 float 0; -#X coords 0 1 44100 0 300 200 1; -#X restore 497 87 graph; -#X obj 267 310 phasor~ 5; -#X obj 144 285 phasor~ 7; -#X obj 144 310 samphold~; -#X floatatom 144 255 5 0 0 0 - - - 0; -#X floatatom 267 255 5 0 0 0 - - - 0; -#X obj 236 373 tabwrite~ samphold; -#X obj 144 355 *~ 48; -#X obj 144 380 +~ 36; -#X obj 144 438 osc~; -#X msg 327 280 0; -#X msg 310 173 32 96.33; -#X msg 144 173 5 7; -#X msg 69 173 1 5; -#X msg 103 173 2 11; -#X msg 179 173 3.7 8.8; -#X msg 244 173 3.4 8.9; -#X obj 144 471 output~; -#X obj 651 24 declare -stdpath ./; -#X obj 144 225 unpack float float; -#X obj 236 344 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X text 262 343 <-- graph output; -#X obj 144 410 mtof~; -#X text 35 57 Another analog favorite \, the sample and hold unit freezes an audio signal on command. In the Pd version \, the second input of [samphold~] triggers it and the first input becomes the output's new value whenever the trigger decreases from one sample to the next. This is ideal for updating values when a [phasor~] wraps around.; -#X obj 105 15 cnv 5 5 25 empty empty Sample\ and\ Hold 15 13 0 16 #dfdfdf #202020 0; -#X text 356 279 <-- reset phase; -#X connect 1 0 3 1; +#X array samphold 22050 float 0; +#X coords 0 1.025 22049 -0.025 300 200 1 0 0; +#X restore 397 344 graph; +#X obj 112 265 samphold~; +#X floatatom 112 190 5 0 0 0 - - - 0; +#X floatatom 235 190 5 0 0 0 - - - 0; +#X obj 112 360 *~ 48; +#X obj 112 385 +~ 36; +#X obj 112 483 osc~; +#X msg 281 233 0; +#X msg 278 108 32 96.33; +#X msg 112 108 5 7; +#X msg 37 108 1 5; +#X msg 71 108 2 11; +#X msg 147 108 3.7 8.8; +#X msg 212 108 3.4 8.9; +#X obj 112 516 output~; +#X obj 517 92 declare -stdpath ./; +#X obj 112 160 unpack float float; +#X obj 112 442 mtof~; +#X text 406 154 Another analog favorite \, the sample and hold unit freezes an audio signal on command. In the Pd version \, the second input of [samphold~] triggers it and the first input becomes the output's new value whenever the trigger decreases from one sample to the next. This is ideal for updating values when a [phasor~] wraps around., f 40; +#X obj 61 28 cnv 5 5 25 empty empty Sample\ and\ Hold 15 13 0 16 #dfdfdf #202020 0; +#X obj 228 306 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X text 251 305 <-- graph once; +#X obj 255 333 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 279 332 <-- graph repeatedly, f 10; +#N canvas 146 130 450 300 graph 0; +#X obj 256 73 inlet; +#X obj 192 73 inlet; +#X obj 122 73 inlet~; +#X obj 192 203 tabwrite~ samphold; +#X obj 256 137 metro 510; +#X connect 0 0 4 0; +#X connect 1 0 3 0; #X connect 2 0 3 0; -#X connect 3 0 7 0; -#X connect 3 0 6 0; -#X connect 4 0 2 0; -#X connect 5 0 1 0; -#X connect 7 0 8 0; -#X connect 8 0 22 0; -#X connect 9 0 17 0; -#X connect 10 0 1 1; -#X connect 10 0 2 1; -#X connect 11 0 19 0; -#X connect 12 0 19 0; -#X connect 13 0 19 0; -#X connect 14 0 19 0; -#X connect 15 0 19 0; -#X connect 16 0 19 0; -#X connect 19 0 4 0; -#X connect 19 1 5 0; -#X connect 20 0 6 0; -#X connect 22 0 9 0; +#X connect 4 0 3 0; +#X restore 202 366 pd graph; +#X text 314 227 reset phase, f 5; +#X text 701 530 0; +#X text 701 343 1; +#X text 122 412 pitch from 36 to 84; +#X obj 112 220 phasor~; +#X obj 235 265 phasor~; +#X obj 112 80 loadbang; +#X connect 1 0 4 0; +#X connect 1 0 24 0; +#X connect 2 0 29 0; +#X connect 3 0 30 0; +#X connect 4 0 5 0; +#X connect 5 0 17 0; +#X connect 6 0 14 0; +#X connect 7 0 29 1; +#X connect 7 0 30 1; +#X connect 8 0 16 0; +#X connect 9 0 16 0; +#X connect 10 0 16 0; +#X connect 11 0 16 0; +#X connect 12 0 16 0; +#X connect 13 0 16 0; +#X connect 16 0 2 0; +#X connect 16 1 3 0; +#X connect 17 0 6 0; +#X connect 20 0 24 1; +#X connect 22 0 24 2; +#X connect 29 0 1 0; +#X connect 30 0 1 1; +#X connect 31 0 9 0; diff --git a/doc/3.audio.examples/C10.monophonic.synth.pd b/doc/3.audio.examples/C10.monophonic.synth.pd index 4446c9ad..5eb0f175 100644 --- a/doc/3.audio.examples/C10.monophonic.synth.pd +++ b/doc/3.audio.examples/C10.monophonic.synth.pd @@ -1,63 +1,61 @@ -#N canvas 502 38 542 797 12; +#N canvas 502 38 525 784 12; #X declare -stdpath ./; -#X obj 114 478 mtof; -#X obj 122 390 notein; -#X obj 205 536 line~; -#X msg 205 505 \$1 100; -#X obj 114 720 output~; -#X obj 114 684 hip~ 5; -#X obj 114 623 *~; -#X obj 114 505 phasor~; -#X obj 114 529 -~ 0.5; -#X obj 114 571 cos~; -#X obj 187 592 *~; -#X obj 114 595 +~ 1; -#X obj 187 640 cos~; -#X text 73 457 pitch; -#X obj 114 656 *~; -#X obj 205 478 / 127; -#X obj 187 616 *~ 2; -#X obj 205 565 +~ 0.5; -#X text 255 529 envelope generator now controls amplitude as well as grain size, f 31; -#X obj 343 18 declare -stdpath ./; +#X obj 133 478 mtof; +#X obj 141 390 notein; +#X obj 224 536 line~; +#X msg 224 505 \$1 100; +#X obj 133 700 output~; +#X obj 133 623 *~; +#X obj 133 505 phasor~; +#X obj 133 529 -~ 0.5; +#X obj 133 571 cos~; +#X obj 206 592 *~; +#X obj 133 595 +~ 1; +#X obj 206 640 cos~; +#X text 92 457 pitch; +#X obj 133 656 *~; +#X obj 224 478 / 127; +#X obj 206 616 *~ 2; +#X obj 224 565 +~ 0.5; +#X text 279 529 envelope generator now controls amplitude as well as grain size, f 22; +#X obj 305 721 declare -stdpath ./; #X text 54 245 The synthesis technique is the same as in the previous patch \, done in a simpler (but less general) way with a [cos~] object replacing the wavetable lookup., f 58; -#X obj 88 428 poly 1 1; -#X text 191 447 velocity; -#X msg 136 326 55 64; -#X msg 229 326 55 0; -#X msg 88 326 48 64; -#X msg 186 326 48 0; -#X msg 34 326 48 128; -#X listbox 88 362 7 0 0 0 - - - 0; +#X obj 107 428 poly 1 1; +#X text 210 447 velocity; +#X msg 155 326 55 64; +#X msg 248 326 55 0; +#X msg 107 326 48 64; +#X msg 205 326 48 0; +#X msg 53 326 48 128; +#X listbox 107 362 7 0 0 0 - - - 0; #X text 54 144 The [poly] object is actually better suited to handle polyphony \, but you can set it to a single voice with the first argument and ignore the left outlet output. The second argument sets the object to "voice stealing" so new pressed notes will replace previous ones that are still pressed (which can then get released without interfering)., f 58; -#X text 276 318 These simulate MIDI messages, f 15; +#X text 295 318 These simulate MIDI messages, f 15; #X text 54 53 This patch shows how to make a monophonic synthesizer that could be controlled from a MIDI keyboard. First \, at top \, incoming MIDI notes are parsed via the [poly] object and used to set pitch and trigger an attack/release envelope. You can use your MIDI keyboard with [notein] to test it or the messages below.; -#X text 233 600 This replaces the [tabread4~] in the previous patch (the [+~ 0.5] and [*~ 2] are fudge factors)., f 33; +#X text 250 601 This replaces the [tabread4~] in the previous patch (the [+~ 0.5] and [*~ 2] are fudge factors)., f 33; #X obj 69 14 cnv 5 5 25 empty empty Monophonic\ MIDI\ Synth 15 13 0 16 #dfdfdf #202020 0; -#X connect 0 0 7 0; -#X connect 1 0 21 0; -#X connect 1 1 21 1; -#X connect 2 0 14 1; -#X connect 2 0 17 0; +#X connect 0 0 6 0; +#X connect 1 0 20 0; +#X connect 1 1 20 1; +#X connect 2 0 13 1; +#X connect 2 0 16 0; #X connect 3 0 2 0; -#X connect 5 0 4 0; -#X connect 6 0 14 0; +#X connect 5 0 13 0; +#X connect 6 0 7 0; +#X connect 7 0 9 0; #X connect 7 0 8 0; #X connect 8 0 10 0; -#X connect 8 0 9 0; -#X connect 9 0 11 0; -#X connect 10 0 16 0; -#X connect 11 0 6 0; -#X connect 12 0 6 1; -#X connect 14 0 5 0; -#X connect 15 0 3 0; -#X connect 16 0 12 0; -#X connect 17 0 10 1; -#X connect 21 1 0 0; -#X connect 21 2 15 0; -#X connect 23 0 28 0; -#X connect 24 0 28 0; -#X connect 25 0 28 0; -#X connect 26 0 28 0; -#X connect 27 0 28 0; -#X connect 28 0 21 0; +#X connect 9 0 15 0; +#X connect 10 0 5 0; +#X connect 11 0 5 1; +#X connect 13 0 4 0; +#X connect 14 0 3 0; +#X connect 15 0 11 0; +#X connect 16 0 9 1; +#X connect 20 1 0 0; +#X connect 20 2 14 0; +#X connect 22 0 27 0; +#X connect 23 0 27 0; +#X connect 24 0 27 0; +#X connect 25 0 27 0; +#X connect 26 0 27 0; +#X connect 27 0 20 0; diff --git a/doc/3.audio.examples/D01.envelope.gen.pd b/doc/3.audio.examples/D01.envelope.gen.pd index a19253a1..8e73f52c 100644 --- a/doc/3.audio.examples/D01.envelope.gen.pd +++ b/doc/3.audio.examples/D01.envelope.gen.pd @@ -1,40 +1,52 @@ -#N canvas 430 38 561 667 12; +#N canvas 488 38 648 696 12; #X declare -stdpath ./; -#X text 222 289 attack; -#X text 296 290 release; -#X obj 229 432 line~; -#X msg 299 390 0 500; -#X obj 126 420 phasor~ 50; -#X obj 211 484 *~; -#X obj 211 536 wrap~; -#X msg 228 390 1 2500; -#X obj 126 444 -~ 0.5; -#X msg 163 366 10 200; -#X obj 211 597 output~; -#X obj 211 509 +~ 0.5; -#X obj 211 563 hip~ 5; -#X msg 238 341 stop; -#X text 52 235 The synthesis method is a form of waveshaping \, which is the subject of a later chapter.; -#X obj 373 14 declare -stdpath ./; -#X obj 228 309 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 299 310 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 228 366 delay 200; -#X text 50 152 You can hit the "attack" and/or "release" while something is still going on from a previous attack or release \, and the envelope generator does the "right thing". In particular \, the release button sends a "stop" to the [del] object \, in case it is still scheduled to go off from a previous attack.; -#X text 51 55 This patch uses an envelope generator to control a sound. When you hit "attack" two things happen. First \, the [line~] object rises to 10 in 200 milliseconds. Then after a delay of the same 200 msec via the [del] object \, the second message sends the [line~] back down to 1 over another 2500 msec. The "release" just ramps us down to zero at the end.; -#X obj 69 14 cnv 5 5 25 empty empty Envelope\ Generators 15 13 0 16 #dfdfdf #202020 0; -#X connect 2 0 5 1; -#X connect 3 0 2 0; -#X connect 4 0 8 0; +#X text 231 269 release; +#X obj 164 411 line~; +#X msg 234 369 0 500; +#X obj 61 399 phasor~ 50; +#X obj 146 463 *~; +#X obj 146 524 wrap~; +#X msg 163 369 1 2500; +#X obj 61 423 -~ 0.5; +#X msg 98 345 10 200; +#X obj 146 594 output~; +#X obj 146 492 +~ 0.5; +#X obj 146 556 hip~ 5; +#X msg 173 320 stop; +#X obj 332 618 declare -stdpath ./; +#X obj 163 288 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 234 289 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 163 345 delay 200; +#X text 41 173 You can hit the "attack" and/or "release" while something is still going on from a previous attack or release \, and the envelope generator does the "right thing". In particular \, the release button sends a "stop" to the [del] object \, in case it is still scheduled to go off from a previous attack., f 73; +#X obj 64 22 cnv 5 5 25 empty empty Envelope\ Generators 15 13 0 16 #dfdfdf #202020 0; +#X text 364 340 release; +#X msg 341 370 0 500; +#X obj 318 281 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 341 340 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 319 404 vline~; +#X text 100 266 attack/decay; +#X msg 318 312 10 200 \, 1 2500 200; +#X text 343 281 attack/decay; +#X text 41 67 This patch uses an envelope generator to control a sound. When you hit "attack/decay" two things happen. First \, the [line~] object rises to 10 in 200 milliseconds. Then after a delay of the same 200 ms via the [del] object \, the second message sends the [line~] to decay back down to 1 over another 2500 ms. The "release" just ramps us down to zero at the end. Another simpler version makes use of [vline~] and its feature of scheduling lines., f 73; +#X text 248 473 The synthesis method is a form of waveshaping \, which is the subject of a later chapter. This technique is producing DC so we have [hip~ 5] to filter it (this is for didactical reasons \, since the [output~] abstraction already includes [hip~] objects., f 49; +#X connect 1 0 4 1; +#X connect 2 0 1 0; +#X connect 3 0 7 0; +#X connect 4 0 10 0; #X connect 5 0 11 0; -#X connect 6 0 12 0; -#X connect 7 0 2 0; -#X connect 8 0 5 0; -#X connect 9 0 2 0; -#X connect 11 0 6 0; -#X connect 12 0 10 0; -#X connect 13 0 18 0; -#X connect 16 0 9 0; -#X connect 16 0 18 0; -#X connect 17 0 3 0; -#X connect 17 0 13 0; -#X connect 18 0 7 0; +#X connect 6 0 1 0; +#X connect 7 0 4 0; +#X connect 8 0 1 0; +#X connect 10 0 5 0; +#X connect 11 0 9 0; +#X connect 12 0 16 0; +#X connect 14 0 8 0; +#X connect 14 0 16 0; +#X connect 15 0 2 0; +#X connect 15 0 12 0; +#X connect 16 0 6 0; +#X connect 20 0 23 0; +#X connect 21 0 25 0; +#X connect 22 0 20 0; +#X connect 23 0 4 1; +#X connect 25 0 23 0; diff --git a/doc/3.audio.examples/D02.adsr.pd b/doc/3.audio.examples/D02.adsr.pd index 01be1b4e..76746e61 100644 --- a/doc/3.audio.examples/D02.adsr.pd +++ b/doc/3.audio.examples/D02.adsr.pd @@ -1,32 +1,33 @@ -#N canvas 616 48 533 728 12; +#N canvas 616 48 576 708 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array adsr-output 44100 float 0; #X coords 0 1.02 44100 -0.02 200 130 1 0 0; -#X restore 258 429 graph; -#X text 278 565 ------ 1 second ------; -#X obj 63 199 r trigger; -#X obj 90 334 tabwrite~ adsr-output; -#X obj 104 306 r graphit; -#X msg 283 243 \; pd dsp 1 \; trigger 1 \; graphit bang; -#X msg 283 324 \; pd dsp 1 \; trigger 0 \; graphit bang; -#X msg 297 194 \; trigger 0; -#X text 463 424 1; -#X obj 45 147 osc~ 440; -#X obj 45 393 *~; -#X obj 45 428 output~; -#X obj 45 526 declare -stdpath ./; -#X obj 283 125 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 306 124 <-- attack and delayed release, f 15; -#X text 55 57 This patch introduces a simple [adsr] abstraction we'll use frequently. You can click on the [adsr] object to see what's inside.; -#X text 56 606 The active ingredient of the ADSR envelope generator is a single [line~] which gets passed messages to make the attack and release behavior. You can retrigger the ADSR envelope generator all you wish without having to wait for attacks or releases to finish; -#X text 386 348 <-- release only; -#X text 382 262 <-- attack only; -#X obj 63 228 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; -#X obj 297 169 del 750; -#X obj 63 261 adsr 1 100 200 50 250; -#X text 461 549 0; -#X obj 69 14 cnv 5 5 25 empty empty Envelope\ Generator\ Abstraction 15 13 0 16 #dfdfdf #202020 0; +#X restore 269 429 graph; +#X text 289 565 ------ 1 second ------; +#X obj 64 199 r trigger; +#X obj 91 334 tabwrite~ adsr-output; +#X obj 97 302 r graphit; +#X msg 314 243 \; pd dsp 1 \; trigger 1 \; graphit bang; +#X msg 314 324 \; pd dsp 1 \; trigger 0 \; graphit bang; +#X msg 328 194 \; trigger 0; +#X text 474 424 1; +#X obj 46 147 osc~ 440; +#X obj 46 393 *~; +#X obj 46 428 output~; +#X obj 46 526 declare -stdpath ./; +#X obj 314 125 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 337 124 <-- attack and delayed release, f 15; +#X text 99 58 This patch introduces a simple [adsr] abstraction we'll use frequently. You can click on the [adsr] object to see what's inside., f 50; +#X text 67 606 The active ingredient of the ADSR envelope generator is a single [line~] which gets passed messages to make the attack and release behavior. You can retrigger the ADSR envelope generator all you wish without having to wait for attacks or releases to finish; +#X text 409 348 <-- release only; +#X text 405 262 <-- attack only; +#X obj 64 228 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 328 169 del 750; +#X obj 64 261 adsr 1 100 200 50 250; +#X text 472 549 0; +#X obj 56 15 cnv 5 5 25 empty empty Envelope\ Generator\ Abstraction 15 13 0 16 #dfdfdf #202020 0; +#X text 219 261 <-- click; #X connect 2 0 19 0; #X connect 4 0 3 0; #X connect 9 0 10 0; diff --git a/doc/3.audio.examples/D03.envelope.dB.pd b/doc/3.audio.examples/D03.envelope.dB.pd index ae5c6985..ac08cc5d 100644 --- a/doc/3.audio.examples/D03.envelope.dB.pd +++ b/doc/3.audio.examples/D03.envelope.dB.pd @@ -9,46 +9,45 @@ #X restore 284 269 graph; #N canvas 461 387 594 359 make-table 0; #X obj 101 232 moses 2; -#X msg 62 32 bang; -#X obj 62 61 t b b; -#X obj 133 122 f; -#X obj 171 122 + 1; -#X msg 151 94 0; -#X obj 62 90 until; +#X obj 71 61 t b b; +#X obj 132 122 f; +#X obj 170 122 + 1; +#X msg 150 94 0; +#X obj 71 90 until; #X msg 101 263 0; #X obj 147 264 dbtorms; #X obj 178 180 t f f; #X obj 101 296 tabwrite dbtorms; -#X floatatom 399 140 4 0 0 0 - - - 0; +#X floatatom 399 140 6 0 0 0 - - - 0; #X floatatom 399 210 12 0 0 0 - - - 0; #X obj 399 181 tabread4 dbtorms; #X floatatom 295 210 12 0 0 0 - - - 0; #X obj 295 181 dbtorms; -#X text 103 33 bang to recalculate the table; -#X obj 133 150 sel 123; +#X text 95 29 bang to recalculate the table; +#X obj 132 150 sel 123; #X text 267 91 check accuracy of reading table against the "real" [dbtorms] object., f 39; -#X connect 0 0 7 0; -#X connect 0 1 8 0; -#X connect 1 0 2 0; -#X connect 2 0 6 0; -#X connect 2 1 5 0; -#X connect 3 0 4 0; -#X connect 3 0 17 0; -#X connect 4 0 3 1; -#X connect 5 0 3 1; -#X connect 6 0 3 0; -#X connect 7 0 10 0; -#X connect 8 0 10 0; -#X connect 9 0 0 0; -#X connect 9 1 10 1; -#X connect 11 0 13 0; -#X connect 11 0 15 0; -#X connect 13 0 12 0; -#X connect 15 0 14 0; -#X connect 17 0 6 1; -#X connect 17 1 9 0; +#X obj 71 28 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X connect 0 0 6 0; +#X connect 0 1 7 0; +#X connect 1 0 5 0; +#X connect 1 1 4 0; +#X connect 2 0 3 0; +#X connect 2 0 16 0; +#X connect 3 0 2 1; +#X connect 4 0 2 1; +#X connect 5 0 2 0; +#X connect 6 0 9 0; +#X connect 7 0 9 0; +#X connect 8 0 0 0; +#X connect 8 1 9 1; +#X connect 10 0 12 0; +#X connect 10 0 14 0; +#X connect 12 0 11 0; +#X connect 14 0 13 0; +#X connect 16 0 5 1; +#X connect 16 1 8 0; +#X connect 18 0 1 0; #X restore 385 425 pd make-table; -#X text 82 424 here's the patch I used to make the table:; #X obj 37 193 osc~ 440; #X text 486 362 0; #X text 487 263 10; @@ -57,19 +56,20 @@ #X obj 96 267 *~; #X msg 324 163 \; pd dsp 1 \; trigger 1; #X obj 114 208 adsr 100 100 200 70 300; -#X text 82 466 The table is indexed from 1 to 120 so that 1 gives a true zero out and 120 gives 10 (a 20 dB boost.) The extra 20 dB are for headroom.; +#X text 78 466 The table is indexed from 1 to 120 so that 1 gives a true zero out and 120 gives 10 (a 20 dB boost.) The extra 20 dB are for headroom., f 60; #X text 80 635 Notice how the attack sounds different when you retrigger than when you start from zero. This is because if you go from the steady state you only rise 30 dB instead of 100 \, so it sounds slower... a slur effect. If you don't want this \, you might try increasing the amplitude of retriggered notes in comparison to isolated ones.; #X obj 96 295 output~; #X obj 96 373 declare -stdpath ./; -#X text 78 516 There's also a "real" [dbtorms~] object that you can just use instead if CPU cost is not a concern and the next example will use that instead \, but for didatical reasons it's shown how to implement a lookup table instead in cases where you might be really concerned (as running Pd in a microcontroller) since [dbtorms~] it's almost certainly much more compute-intensive than ptabread4~] \, since it has to call a library "exp" function.); #X obj 114 176 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; #X text 331 139 attack:; #X text 421 139 release:; #X obj 118 20 cnv 5 5 25 empty empty Using\ [adsr]'s\ output\ as\ dB 15 13 0 16 #dfdfdf #202020 0; #X text 69 66 For more natural sounding amplitude control \, you can use an ADSR's output as log amplitude. Technically \, this is more efficient if done using a lookup table., f 61; -#X connect 0 0 18 0; -#X connect 1 0 10 1; -#X connect 5 0 10 0; -#X connect 10 0 15 0; -#X connect 12 0 1 0; -#X connect 18 0 12 0; +#X text 82 424 Here's the patch I used to make the table:; +#X text 78 516 There's also a "real" [dbtorms~] object that you can just use instead if CPU cost is not a concern and the next example will use that instead \, but for didatical reasons it's shown how to implement a lookup table instead in cases where you might be really concerned (as running Pd in a microcontroller) since [dbtorms~] it's almost certainly much more compute-intensive than [tabread4~] \, since it has to call a library "exp" function.); +#X connect 0 0 16 0; +#X connect 1 0 9 1; +#X connect 4 0 9 0; +#X connect 9 0 14 0; +#X connect 11 0 1 0; +#X connect 16 0 11 0; diff --git a/doc/3.audio.examples/D04.envelope.quartic.pd b/doc/3.audio.examples/D04.envelope.quartic.pd index b9f87637..51adcd51 100644 --- a/doc/3.audio.examples/D04.envelope.quartic.pd +++ b/doc/3.audio.examples/D04.envelope.quartic.pd @@ -1,51 +1,55 @@ -#N canvas 520 54 686 666 12; +#N canvas 520 54 686 681 12; #X declare -stdpath ./; -#X obj 55 377 osc~; -#X obj 55 407 *~; -#X obj 107 381 line~; -#X obj 55 352 line~; -#X obj 197 487 osc~; -#X obj 250 535 *~; -#X obj 268 398 line~; -#X obj 197 398 line~; -#X obj 197 345 sqrt; -#X obj 197 371 sqrt; -#X obj 268 345 sqrt; -#X obj 268 371 sqrt; -#X obj 197 430 *~; -#X obj 197 460 *~; -#X obj 268 430 *~; -#X obj 268 459 *~; -#X obj 197 320 unpack; -#X obj 268 320 unpack; -#X obj 55 327 r freq; -#X obj 107 357 r amp; -#X obj 197 295 r freq; -#X obj 268 295 r amp; -#X obj 467 483 loadbang; -#X msg 467 511 \; amp 1 \; freq 1760; -#X text 56 297 LINEAR; -#X text 202 268 QUARTIC; -#X obj 55 446 output~; -#X obj 250 578 output~; -#X text 75 61 This patch has two sine wave oscillators \, one with linear envelopes \, the other with quartic ones which sound more uniform. The message boxes sweep the amplitude and frequency up and down. You can compare the two to see that quartic-shaped changes sound more uniform than linear ones., f 68; -#X obj 55 574 declare -stdpath ./; -#X text 75 141 In the quartic example \, for both the amplitude and the frequency \, we have to take the fourth root of the target value (which we get by taking square root twice.) Then we raise the [line~] output to the fourth power by squaring twice (the [*~] objects \, whose left and right inlets are the same.) The cost is mostly that of the four additional [*~] objects., f 68; -#X msg 511 304 \; amp 0 1000 \;; -#X msg 375 304 \; amp 0 5000 \;; -#X msg 375 259 \; amp 1 5000 \;; -#X msg 511 259 \; amp 0.5 1000 \;; -#X msg 376 364 \; freq 1760 5000; -#X msg 511 364 \; freq 880 1000; -#X msg 511 407 \; freq 220 1000; -#X msg 377 407 \; freq 110 5000; -#X obj 112 16 cnv 5 5 25 empty empty Quartic\ and\ Linear\ Envelopes\ Compared 15 13 0 16 #dfdfdf #202020 0; +#X obj 65 380 osc~; +#X obj 65 420 *~; +#X obj 117 384 line~; +#X obj 65 355 line~; +#X obj 207 516 osc~; +#X obj 260 549 *~; +#X obj 278 427 line~; +#X obj 207 427 line~; +#X obj 207 374 sqrt; +#X obj 207 400 sqrt; +#X obj 278 374 sqrt; +#X obj 278 400 sqrt; +#X obj 207 459 *~; +#X obj 207 489 *~; +#X obj 278 459 *~; +#X obj 278 488 *~; +#X obj 207 349 unpack; +#X obj 278 349 unpack; +#X obj 65 294 r freq; +#X obj 117 330 r amp; +#X obj 207 294 r freq; +#X obj 278 294 r amp; +#X obj 472 528 loadbang; +#X text 66 270 LINEAR; +#X text 212 270 QUARTIC; +#X obj 65 459 output~; +#X obj 260 581 output~; +#X obj 65 577 declare -stdpath ./; +#X text 100 145 In the quartic example \, for both the amplitude and the frequency \, we have to take the fourth root of the target value (which we get by taking square root twice.) Then we raise the [line~] output to the fourth power by squaring twice (the [*~] objects \, whose left and right inlets are the same.) The cost is mostly that of the four additional [*~] objects., f 68; +#X msg 507 342 \; amp 0 1000 \;; +#X msg 371 342 \; amp 0 5000 \;; +#X msg 371 297 \; amp 1 5000 \;; +#X msg 507 297 \; amp 0.5 1000 \;; +#X msg 507 402 \; freq 1760 5000; +#X msg 371 402 \; freq 880 1000; +#X msg 371 445 \; freq 220 1000; +#X msg 508 445 \; freq 110 5000; +#X obj 68 17 cnv 5 5 25 empty empty Quartic\ and\ Linear\ Envelopes\ Compared 15 13 0 16 #dfdfdf #202020 0; +#X text 100 65 This patch has two sine wave oscillators \, one with linear envelopes \, the other with quartic ones which sounds more uniform. The message boxes sweep the amplitude and frequency up and down. You can compare the two to see that quartic-shaped changes sound more uniform than linear ones., f 68; +#X msg 472 556 \; amp 1 \; freq 220; +#X floatatom 117 357 5 0 0 0 - - - 0; +#X floatatom 65 322 5 0 0 0 - - - 0; +#X floatatom 278 322 5 0 0 0 - - - 0; +#X floatatom 207 322 5 0 0 0 - - - 0; #X connect 0 0 1 0; -#X connect 1 0 26 0; +#X connect 1 0 25 0; #X connect 2 0 1 1; #X connect 3 0 0 0; #X connect 4 0 5 0; -#X connect 5 0 27 0; +#X connect 5 0 26 0; #X connect 6 0 14 0; #X connect 6 0 14 1; #X connect 7 0 12 0; @@ -64,8 +68,12 @@ #X connect 16 1 7 1; #X connect 17 0 10 0; #X connect 17 1 6 1; -#X connect 18 0 3 0; -#X connect 19 0 2 0; -#X connect 20 0 16 0; -#X connect 21 0 17 0; -#X connect 22 0 23 0; +#X connect 18 0 41 0; +#X connect 19 0 40 0; +#X connect 20 0 43 0; +#X connect 21 0 42 0; +#X connect 22 0 39 0; +#X connect 40 0 2 0; +#X connect 41 0 3 0; +#X connect 42 0 17 0; +#X connect 43 0 16 0; diff --git a/doc/3.audio.examples/D05.envelope.pitch.pd b/doc/3.audio.examples/D05.envelope.pitch.pd index e65cd65c..97939d09 100644 --- a/doc/3.audio.examples/D05.envelope.pitch.pd +++ b/doc/3.audio.examples/D05.envelope.pitch.pd @@ -1,20 +1,20 @@ -#N canvas 529 38 615 718 12; +#N canvas 529 38 615 731 12; #X declare -stdpath ./; -#X obj 68 409 *~; -#X obj 260 399 tabread4~ mtof; -#X obj 260 426 osc~; -#X obj 260 368 +~ 69; -#X text 62 527 This is an extreme use of pitch enveloping. In a real situation you might want an envelope controlling vibrato depth or the like instead of straight pitch., f 69; -#X obj 68 331 adsr 100 50 200 90 1000; -#X obj 260 331 adsr 20 200 100 100 1000; -#X obj 68 450 output~; -#X obj 263 478 declare -stdpath ./; +#X obj 68 419 *~; +#X obj 260 409 tabread4~ mtof; +#X obj 260 436 osc~; +#X obj 260 378 +~ 69; +#X text 72 548 This is an extreme use of pitch enveloping. In a real situation you might want an envelope controlling vibrato depth or the like instead of straight pitch., f 69; +#X obj 68 341 adsr 100 50 200 90 1000; +#X obj 260 341 adsr 20 200 100 100 1000; +#X obj 68 460 output~; +#X obj 263 488 declare -stdpath ./; #X text 130 188 <-- attack; #X text 507 188 <-- release; -#X text 66 62 For pitch envelopes \, unlike amplitude envelopes \, discontinuities are allowed and sometimes you would rather the envelope generator actually jump to zero when it's triggered. The [adsr] abstraction does this for you if you send a negative trigger instead of a positive one:, f 65; -#X text 444 331 <-- click to open and check the inner workings of the abstraction., f 17; -#X obj 68 365 dbtorms~; -#X text 62 588 We have added a new table ("mtof") for converting audio signals from pitch to frequency. Like in the previous example \, there's also a real [mtof~] object you can use instead and that we'll use in the next examples. The table lookup is \, again \, for CPU efficiency concerns and its range is 1-127 \, so you want to add a base pitch in before you start reading from it., f 69; +#X text 74 65 For pitch envelopes \, unlike amplitude envelopes \, discontinuities are allowed and sometimes you would rather the envelope generator actually jump to zero when it's triggered. The [adsr] abstraction does this for you if you send a negative trigger instead of a positive one:, f 65; +#X text 444 341 <-- click to open and check the inner workings of the abstraction., f 17; +#X obj 68 375 dbtorms~; +#X text 72 609 We have added a new table ("mtof") for converting audio signals from pitch to frequency. Like in the previous example \, there's also a real [mtof~] object you can use instead and that we'll use in the next examples. The table lookup is \, again \, for CPU efficiency concerns and its range is 1-127 \, so you want to add a base pitch in before you start reading from it., f 69; #N canvas 453 231 801 286 mtof-table 0; #X msg 67 39 bang; #X obj 67 68 t b b; @@ -58,18 +58,18 @@ #X connect 15 0 5 1; #X connect 15 1 6 0; #X connect 17 0 20 0; -#X restore 402 421 pd mtof-table; -#X obj 68 298 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; -#X obj 260 298 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; -#X obj 68 245 r trigger; -#X obj 260 245 r trigger2; -#X floatatom 68 271 3 0 0 0 - - - 0; -#X floatatom 260 271 3 0 0 0 - - - 0; +#X restore 402 431 pd mtof-table; +#X obj 68 308 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 260 308 tgl 21 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 68 255 r trigger; +#X obj 260 255 r trigger2; +#X floatatom 68 281 3 0 0 0 - - - 0; +#X floatatom 260 281 3 0 0 0 - - - 0; #X msg 51 171 \; trigger 1 \; trigger2 1; #X msg 224 171 \; trigger 1 \; trigger2 -1; #X msg 427 171 \; trigger 0 \; trigger2 0; #X text 321 174 <-- attack restarting pitch env, f 10; -#X obj 100 14 cnv 5 5 25 empty empty Pitch\ Envelopes 15 13 0 16 #dfdfdf #202020 0; +#X obj 47 17 cnv 5 5 25 empty empty Pitch\ Envelopes 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 7 0; #X connect 1 0 2 0; #X connect 2 0 0 1; diff --git a/doc/3.audio.examples/D06.envelope.portamento.pd b/doc/3.audio.examples/D06.envelope.portamento.pd index 012a3403..47a384e0 100644 --- a/doc/3.audio.examples/D06.envelope.portamento.pd +++ b/doc/3.audio.examples/D06.envelope.portamento.pd @@ -1,43 +1,40 @@ -#N canvas 617 93 531 407 12; +#N canvas 617 93 541 482 12; #X declare -stdpath ./; -#X obj 55 273 osc~; -#X obj 55 214 line~; -#X obj 55 152 r pitch; -#X msg 143 226 36, f 2; -#X msg 172 226 48, f 2; -#X msg 199 226 60, f 2; -#X msg 256 226 72, f 2; -#X msg 228 226 67, f 2; -#X msg 309 226 76, f 2; -#X msg 284 226 74, f 2; -#X obj 284 291 s pitch; -#X msg 336 226 84, f 2; -#X msg 365 226 96, f 2; -#X floatatom 122 152 4 0 0 0 - - - 0; -#X floatatom 284 265 6 0 0 0 - - - 0; -#X obj 256 200 loadbang; -#X obj 55 315 output~; -#X obj 284 341 declare -stdpath ./; -#X obj 55 183 pack f 100; -#X text 160 151 <-- change speed; -#X obj 55 244 mtof~; -#X text 63 70 Portamento can be done using just [line~] \, but you still might want to sweep in pitch \, not frequency:; -#X text 394 226 <-- set pitch; -#X obj 174 19 cnv 5 5 25 empty empty Portamento 15 13 0 16 #dfdfdf #202020 0; -#X connect 0 0 16 0; -#X connect 1 0 20 0; -#X connect 2 0 18 0; -#X connect 3 0 14 0; -#X connect 4 0 14 0; -#X connect 5 0 14 0; -#X connect 6 0 14 0; -#X connect 7 0 14 0; -#X connect 8 0 14 0; -#X connect 9 0 14 0; -#X connect 11 0 14 0; -#X connect 12 0 14 0; -#X connect 13 0 18 1; -#X connect 14 0 10 0; -#X connect 15 0 6 0; -#X connect 18 0 1 0; -#X connect 20 0 0 0; +#X obj 245 334 osc~; +#X obj 245 275 line~; +#X msg 104 166 36, f 2; +#X msg 133 166 48, f 2; +#X msg 160 166 60, f 2; +#X msg 217 166 72, f 2; +#X msg 189 166 67, f 2; +#X msg 270 166 76, f 2; +#X msg 245 166 74, f 2; +#X msg 297 166 84, f 2; +#X msg 326 166 96, f 2; +#X floatatom 312 213 4 0 0 0 - - - 0; +#X floatatom 245 205 6 0 0 0 - - - 0; +#X obj 217 140 loadbang; +#X obj 245 376 output~; +#X obj 61 352 declare -stdpath ./; +#X obj 245 244 pack f 100; +#X text 350 212 <-- change speed; +#X obj 245 305 mtof~; +#X text 355 166 <-- set pitch; +#X obj 40 21 cnv 5 5 25 empty empty Portamento 15 13 0 16 #dfdfdf #202020 0; +#X text 63 70 Portamento can be done using just [line~] \, but you still might want to sweep in pitch \, not frequency.; +#X connect 0 0 14 0; +#X connect 1 0 18 0; +#X connect 2 0 12 0; +#X connect 3 0 12 0; +#X connect 4 0 12 0; +#X connect 5 0 12 0; +#X connect 6 0 12 0; +#X connect 7 0 12 0; +#X connect 8 0 12 0; +#X connect 9 0 12 0; +#X connect 10 0 12 0; +#X connect 11 0 16 1; +#X connect 12 0 16 0; +#X connect 13 0 5 0; +#X connect 16 0 1 0; +#X connect 18 0 0 0; diff --git a/doc/3.audio.examples/D07.additive.pd b/doc/3.audio.examples/D07.additive.pd index 3dcf693b..1199a59f 100644 --- a/doc/3.audio.examples/D07.additive.pd +++ b/doc/3.audio.examples/D07.additive.pd @@ -1,27 +1,27 @@ -#N canvas 500 48 614 583 12; +#N canvas 500 48 613 599 12; #X declare -stdpath ./; -#X floatatom 306 381 5 0 0 0 - dur - 0; -#X floatatom 251 381 5 0 0 0 - pitch - 0; -#X text 208 382 pitch; -#X obj 197 493 output~; -#X obj 118 292 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 410 495 declare -stdpath ./; -#X msg 118 324 all bang; -#X obj 197 448 clone 11 partial; -#X msg 251 416 all \$1; -#X msg 306 416 all \$1; -#X obj 422 316 text define -k partials; +#X floatatom 306 395 5 0 0 0 - dur - 0; +#X floatatom 251 395 5 0 0 0 - pitch - 0; +#X text 208 396 pitch; +#X obj 197 507 output~; +#X obj 118 302 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 410 519 declare -stdpath ./; +#X msg 118 334 all bang; +#X obj 197 466 clone 11 partial; +#X msg 251 430 all \$1; +#X msg 306 430 all \$1; +#X obj 422 330 text define -k partials; #A set 0 1 1 0.56 0 \; 1 0.67 0.9 0.56 1 \; 2 1 0.65 0.92 0 \; 3 1.8 0.55 0.92 1.7 \; 4 2.67 0.32 1.19 0 \; 5 1.67 0.35 1.7 0 \; 6 1.46 0.25 2 0 \; 7 1.33 0.2 2.74 0 \; 8 1.33 0.15 3 0 \; 9 1 0.1 3.76 0 \; 10 1.33 0.075 4.07 0; -#X obj 197 334 text sequence partials; -#X msg 197 300 line 0 \, bang; -#X text 53 292 play -->; -#X obj 306 236 loadbang; -#X msg 306 272 \; pitch 72 \; dur 40; -#X text 351 374 duration (tenths of seconds), f 17; -#X text 36 71 This patch demonstrates using an abstraction \, [partial] \, to make a simple additive synthesis instrument originally from Jean-Claude Risset., f 78; -#X text 36 111 We use [clone] to create 11 copies of the abstraction and send list messages from a [text] object whose arguments are: instance number \, amplitude \, relative duration \, relative frequency and detuning frequency - click [text define] to see this. The usage of [text] is merely cosmetical as it's less polluted than using many messages in a message box. All the messages in [text define] are "dumped" with [text sequence]. You set absolute duration and pitch using the number box controls below. Click the bang to make sound., f 78; -#X text 446 292 click to open:; +#X obj 197 350 text sequence partials; +#X msg 197 314 line 0 \, bang; +#X text 53 302 play -->; +#X obj 306 250 loadbang; +#X text 36 75 This patch demonstrates using an abstraction \, [partial] \, to make a simple additive synthesis instrument originally from Jean-Claude Risset., f 78; +#X text 36 115 We use [clone] to create 11 copies of the abstraction and send list messages from a [text] object whose arguments are: instance number \, amplitude \, relative duration \, relative frequency and detuning frequency - click [text define] to see this. The usage of [text] is merely cosmetical as it's less polluted than using many messages in a message box. All the messages in [text define] are "dumped" with [text sequence]. You set absolute duration and pitch using the number box controls below. Click the bang to make sound., f 78; +#X text 446 306 click to open:; #X obj 139 23 cnv 5 5 25 empty empty Additive\ Synthesis 15 13 0 16 #dfdfdf #202020 0; +#X text 351 395 duration (ms); +#X msg 306 286 \; pitch 72 \; dur 4000; #X connect 0 0 9 0; #X connect 1 0 8 0; #X connect 4 0 6 0; @@ -32,4 +32,4 @@ #X connect 11 0 7 0; #X connect 12 0 11 0; #X connect 14 0 12 0; -#X connect 14 0 15 0; +#X connect 14 0 20 0; diff --git a/doc/3.audio.examples/D08.table.spectrum.pd b/doc/3.audio.examples/D08.table.spectrum.pd index b56a41a8..880308b6 100644 --- a/doc/3.audio.examples/D08.table.spectrum.pd +++ b/doc/3.audio.examples/D08.table.spectrum.pd @@ -5,32 +5,32 @@ #A 0 48.5713 48.5713 48.5713 48.2142 48.2142 48.2142 48.2142 48.2142 48.2142 48.2142 48.2142 48.2142 48.2142 48.5713 48.5713 48.9284 48.9284 48.9284 48.9284 48.9284 48.9284 48.9284 48.5713 48.5713 48.5713 48.2142 48.2142 47.4999 47.1427 46.4285 46.4285 46.0713 46.0713 46.0713 45.7142 44.9999 44.6428 43.5713 43.2142 42.8571 42.4999 41.7856 38.2143 36.7857 34.6429 31.7857 30.3572 29.6429 28.5715 27.8572 26.7858 25.3572 25.7144 23.9287 23.9287 23.5715 23.5715 23.5715 23.5715 23.2144 23.2144 23.2144 22.8573 22.8573 23.5715 23.9287 23.5715 26.0715 26.0715 48.5713 48.5713 48.5713 48.2142 47.4999 46.7856 46.7856 17.143 16.4287 16.0716 16.4287 14.643 13.5716 13.5716 40.7142 40.7142 40.7142 14.643 13.2145 12.8573 12.5002 12.5002 24.2858 29.6429 30.7143 16.4287 10.7145 11.7859 10.7145 24.2858 23.5715 17.143 13.9288 9.64309 6.78597 5.71455 5.71455 4.28599 3.92885 3.92885 3.92885 1.42887 1.42887 1.42887 1.07174 1.07174 1.07174 0.714596 0.714596 0.714596 0.714596 0.714596 1.07174 1.07174 1.07174 1.07174 0.714286 0.357143; #X coords 0 50 126 0 300 140 1; #X restore 374 164 graph; -#X obj 110 167 s pitch; -#X floatatom 110 139 4 0 0 0 - - - 0; -#X floatatom 110 208 4 0 0 0 - - - 0; -#X obj 110 255 s whammybar; +#X obj 114 172 s pitch; +#X floatatom 114 144 4 0 0 0 - - - 0; +#X floatatom 114 213 4 0 0 0 - - - 0; +#X obj 114 260 s whammybar; #N canvas 411 321 482 150 table-setup 0; #X obj 41 37 loadbang; #X msg 41 71 \; spectrum-tab xlabel -2.5 0 12 24 36 48 60 72 84 96 108 120; #X connect 0 0 1 0; #X restore 486 414 pd table-setup; -#X msg 471 354 \; spectrum-tab const 0; -#X text 33 59 In this array \, you can draw a spectral envelope that will be synthesized by an oscillator bank. Each oscillator in the bank computes its own frequency and uses it to look up amplitude from the array., f 65; -#X text 622 362 CLEAR; +#X msg 441 354 \; spectrum-tab const 0; +#X text 42 59 In this array \, you can draw a spectral envelope that will be synthesized by an oscillator bank. Each oscillator in the bank computes its own frequency and uses it to look up amplitude from the array., f 57; #X obj 67 449 output~; #X obj 534 78 declare -stdpath ./; #X obj 377 436 loadbang; #X obj 377 461 metro 30; #X obj 377 487 s poll-table; #X text 205 449 And here we send bangs to "poll-table" needed by the abstraction., f 23; -#X text 54 302 The [clone] object carries the bank of oscillators \, which is 30 copies of the [spectrum-partial] abstraction - click to open and see it:, f 39; +#X text 47 317 The [clone] object carries the bank of oscillators \, which is 30 copies of the [spectrum-partial] abstraction - click to open and see it:, f 39; #X obj 67 402 clone -s 1 spectrum-partial 30; -#X text 144 138 <-- pitch; -#X text 148 208 <-- left or right shift (normally 0), f 19; +#X text 148 143 <-- pitch; +#X text 152 213 <-- left or right shift (normally 0), f 19; #X text 598 414 <-- make the number labels, f 14; -#X obj 151 15 cnv 5 5 25 empty empty Drawable\ Spectra 15 13 0 16 #dfdfdf #202020 0; +#X obj 130 12 cnv 5 5 25 empty empty Drawable\ Spectra 15 13 0 16 #dfdfdf #202020 0; +#X text 592 362 clear; #X connect 2 0 1 0; #X connect 3 0 4 0; +#X connect 10 0 11 0; #X connect 11 0 12 0; -#X connect 12 0 13 0; -#X connect 16 0 9 0; +#X connect 15 0 8 0; diff --git a/doc/3.audio.examples/D09.shepard.tone.pd b/doc/3.audio.examples/D09.shepard.tone.pd index 69a275ff..d32123e9 100644 --- a/doc/3.audio.examples/D09.shepard.tone.pd +++ b/doc/3.audio.examples/D09.shepard.tone.pd @@ -1,58 +1,67 @@ -#N canvas 489 38 577 661 12; +#N canvas 489 38 596 819 12; #X declare -stdpath ./; -#X floatatom 47 575 0 0 0 0 - - - 0; -#X floatatom 110 458 0 0 0 0 - - - 0; -#X text 339 217 START; -#X floatatom 127 315 0 0 0 0 - - - 0; -#X obj 127 292 r incr; -#X obj 109 267 metro 50; -#X floatatom 109 385 5 0 0 0 - - - 0; -#X obj 109 409 s phase; -#X obj 109 362 +; -#X obj 110 481 s dropoff+; -#X obj 125 597 s interval+; -#X floatatom 125 574 4 0 0 0 - - - 0; -#X obj 47 598 s pitch+; -#X obj 110 435 r dropoff; -#X obj 47 552 r pitch; -#X obj 125 551 r interval; -#X obj 109 217 r metro; -#X obj 166 357 f; -#X floatatom 346 439 5 0 0 0 - - - 0; -#X obj 346 416 r rev; -#X obj 394 417 r revtime; -#X floatatom 394 440 5 0 0 0 - - - 0; -#X obj 166 380 mod 10000; -#X obj 109 339 f; -#X obj 324 478 rev2~, f 13; -#X obj 250 521 output~; -#X obj 109 242 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 371 24 declare -stdpath ./; -#X obj 324 386 clone 20 shepvoice; -#X text 26 53 This patch has a bank of 20 sinusoids (the [shepvoice] abstraction with 20 copies in [clone]) \, arranged so that their frequencies sweep upward or downward in parallel \, and their amplitudes fade in and out so that each one is quiet when it wraps around from one end to the other. The overall "phase" computed here is added to each voice's relative phase (its creation argument). The "incr" parameter controls how fast the phase changes \, "dropoff" the slope at which the amplitudes fall off at the ends \, "pitch" the center pitch of the cluster \, "interval" the number of (tenths of halftones) between successive voices \, and "rev" and "revtime" the reverberator at bottom., f 71; -#X msg 322 238 \; dropoff 10 \; pitch 60 \; interval 120 \; metro 1 \; rev 84 \; revtime 87 \; incr -2; -#X obj 84 16 cnv 5 5 25 empty empty Shepard\ Tone 15 13 0 16 #dfdfdf #202020 0; -#X connect 0 0 12 0; -#X connect 1 0 9 0; -#X connect 3 0 23 1; +#X floatatom 193 400 4 0 0 0 - - - 0; +#X obj 193 374 r incr; +#X obj 129 333 metro 50; +#X floatatom 267 638 5 0 0 0 - - - 0; +#X obj 267 611 r rev; +#X obj 314 611 r revtime; +#X floatatom 314 638 5 0 0 0 - - - 0; +#X obj 221 672 rev2~, f 27; +#X obj 221 714 output~; +#X obj 129 292 tgl 19 0 empty metro empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 63 23 cnv 5 5 25 empty empty Shepard\ Tone 15 13 0 16 #dfdfdf #202020 0; +#X text 155 291 Start/Stop; +#X floatatom 230 492 4 0 0 0 - - - 0; +#X floatatom 394 492 4 0 0 0 - - - 0; +#X floatatom 303 492 6 0 0 0 - - - 0; +#X obj 394 465 r dropoff; +#X obj 230 465 r pitch; +#X obj 303 465 r interval; +#X msg 230 522 all \$1; +#X msg 303 522 all \$1; +#X msg 394 522 all \$1; +#X msg 160 507 all \$1; +#X obj 129 453 f; +#X obj 160 425 +; +#X msg 147 396 0; +#X text 144 376 reset; +#X text 115 508 phase; +#X obj 193 426 / 10000; +#X obj 160 452 wrap; +#X obj 160 479 * 10000; +#X text 31 72 This patch has a bank of 20 sinusoids (the [shepvoice] abstraction with 20 copies instantieted inside [clone]). The oscillator bank is arranged so that the frequencies sweep upward or downward in parallel \, and their amplitudes fade in and out so that each one is quiet when it wraps around from one end to the other. The overall "phase" computed here is added to each voice's relative phase (its copy number argument). Click on the [clone] object for details., f 73; +#X text 31 183 The "incr" parameter controls how fast the phase changes \, "pitch" the center pitch of the cluster \, "interval" the number of cents between successive voices \, "dropoff" the slope at which the amplitudes fall off at the ends \, and "rev" and "revtime" are parameters for the reverberator., f 73; +#X obj 221 566 clone shepvoice 20; +#X obj 310 278 loadbang; +#X msg 310 307 \; dropoff 10 \; pitch 60 \; interval 1200 \; rev 84 \; revtime 87 \; incr -2 \; metro 1; +#X obj 386 740 declare -stdpath ./; +#X connect 0 0 27 0; +#X connect 1 0 0 0; +#X connect 2 0 22 0; +#X connect 3 0 7 1; #X connect 4 0 3 0; -#X connect 5 0 23 0; -#X connect 6 0 7 0; -#X connect 8 0 17 0; -#X connect 8 0 6 0; -#X connect 11 0 10 0; -#X connect 13 0 1 0; -#X connect 14 0 0 0; -#X connect 15 0 11 0; -#X connect 16 0 26 0; -#X connect 17 0 22 0; -#X connect 18 0 24 1; -#X connect 19 0 18 0; -#X connect 20 0 21 0; -#X connect 21 0 24 2; -#X connect 22 0 8 1; -#X connect 23 0 8 0; -#X connect 24 0 25 0; -#X connect 24 1 25 1; -#X connect 26 0 5 0; -#X connect 28 0 24 0; +#X connect 5 0 6 0; +#X connect 6 0 7 2; +#X connect 7 0 8 0; +#X connect 7 1 8 1; +#X connect 9 0 2 0; +#X connect 12 0 18 0; +#X connect 13 0 20 0; +#X connect 14 0 19 0; +#X connect 15 0 13 0; +#X connect 16 0 12 0; +#X connect 17 0 14 0; +#X connect 18 0 32 1; +#X connect 19 0 32 2; +#X connect 20 0 32 3; +#X connect 21 0 32 0; +#X connect 22 0 23 0; +#X connect 23 0 28 0; +#X connect 24 0 22 1; +#X connect 27 0 23 1; +#X connect 28 0 22 1; +#X connect 28 0 29 0; +#X connect 29 0 21 0; +#X connect 32 0 7 0; +#X connect 33 0 34 0; diff --git a/doc/3.audio.examples/D10.sampler.notes.pd b/doc/3.audio.examples/D10.sampler.notes.pd index dcf3762f..28a9f0cb 100644 --- a/doc/3.audio.examples/D10.sampler.notes.pd +++ b/doc/3.audio.examples/D10.sampler.notes.pd @@ -1,66 +1,16 @@ -#N canvas 402 38 816 789 12; +#N canvas 204 58 1157 787 12; #X declare -stdpath ./; -#X obj 243 64 delay 5; -#X text 419 288 end of note; -#N canvas 282 191 730 441 recorder 0; -#X obj 218 34 inlet; -#X obj 128 258 adc~ 1; -#X obj 128 286 hip~ 5; -#X obj 197 316 line~; -#X obj 128 315 *~; -#X msg 197 288 1; -#X obj 256 253 del 3990; -#X msg 233 288 0 10; -#X obj 128 366 tabwrite~ sample1; -#X obj 42 191 makefilename sample%1; -#X msg 42 220 set \$1 \, bang; -#X msg 300 224 stop; -#X msg 256 224 bang; -#X obj 382 226 loadbang; -#X obj 378 128 openpanel; -#X text 422 265 v-- re-read original samples; -#X obj 218 63 route record stop reload browse; -#X obj 382 347 soundfiler; -#X msg 378 155 read \$1 sample1; -#X obj 378 182 soundfiler; -#X msg 382 289 read -resize ../sound/bell.aiff sample1 \, read -resize ../sound/voice2.wav sample2, f 40; -#X text 402 98 <-- browse for samples; -#X obj 378 98 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X connect 0 0 16 0; -#X connect 1 0 2 0; -#X connect 2 0 4 0; -#X connect 3 0 4 1; -#X connect 4 0 8 0; -#X connect 5 0 3 0; -#X connect 6 0 7 0; -#X connect 7 0 3 0; -#X connect 9 0 10 0; -#X connect 10 0 8 0; -#X connect 11 0 6 0; -#X connect 12 0 6 0; -#X connect 13 0 20 0; -#X connect 14 0 18 0; -#X connect 16 0 9 0; -#X connect 16 0 12 0; -#X connect 16 0 5 0; -#X connect 16 1 7 0; -#X connect 16 1 11 0; -#X connect 16 2 20 0; -#X connect 16 3 22 0; -#X connect 18 0 19 0; -#X connect 20 0 17 0; -#X connect 22 0 14 0; -#X restore 631 179 pd recorder; -#X msg 624 55 record 1; -#X msg 638 99 stop; -#N canvas 797 90 569 656 playback 0; +#X obj 743 155 delay 5; +#X text 915 379 end of note; +#X msg 82 612 record 1; +#X msg 96 667 stop; +#N canvas 813 100 569 656 playback 0; #X obj 57 60 line~; #X obj 75 252 line~; #X obj 57 283 *~; #X obj 75 223 r cutoff; #X obj 57 31 r phase; #X obj 57 607 outlet~; -#X obj 57 579 hip~ 5; #X obj 69 94 r sample-number; #X obj 69 123 makefilename sample%d; #X msg 69 151 set \$1; @@ -83,159 +33,210 @@ #X text 190 95 setting the sample number; #X text 124 150 and send a "set" message to [tabread4~]; #X text 146 378 convert amplitude to linear units; -#X connect 0 0 10 0; +#X connect 0 0 9 0; #X connect 1 0 2 1; -#X connect 2 0 15 0; +#X connect 2 0 14 0; #X connect 3 0 1 0; #X connect 4 0 0 0; -#X connect 6 0 5 0; +#X connect 6 0 7 0; #X connect 7 0 8 0; #X connect 8 0 9 0; -#X connect 9 0 10 0; -#X connect 10 0 2 0; -#X connect 11 0 20 0; +#X connect 9 0 2 0; +#X connect 10 0 19 0; +#X connect 11 0 12 0; #X connect 12 0 13 0; -#X connect 13 0 14 0; -#X connect 14 0 16 0; -#X connect 14 0 16 1; -#X connect 15 0 6 0; -#X connect 16 0 17 0; -#X connect 16 0 17 1; -#X connect 17 0 15 1; -#X connect 20 0 21 0; -#X connect 20 1 14 1; -#X connect 21 0 12 0; -#X restore 454 648 pd playback; -#X msg 631 77 record 2; -#X text 50 272 ARGUMENTS FOR NOTES:; -#X text 81 294 pitch in halftones, f 21; -#X text 81 311 amplitude (dB), f 21; -#X text 81 345 sample number, f 21; -#X text 81 328 duration (msec), f 21; -#X text 81 362 start location (msec); -#X text 81 379 rise time (msec), f 21; -#X text 81 397 decay time (msec), f 21; -#X obj 491 188 f; -#X obj 442 162 f; -#X obj 373 162 f; -#X obj 336 162 f; -#X obj 304 162 f; -#X obj 227 162 f; -#X obj 227 189 mtof; -#X obj 227 217 / 261.62; -#X obj 227 244 * 4.41e+08; -#X obj 263 278 +; -#X obj 243 91 t b b b; -#X obj 373 217 + 1; -#X msg 42 485 60 100 10000 1 0 0 0; -#X obj 57 747 s note; -#X msg 491 216 \; envelope 0 \$1; -#X msg 185 667 62; -#X msg 220 667 64; -#X msg 151 667 60; -#X msg 119 667 55; -#X msg 253 667 72; -#X msg 87 667 48; -#X msg 252 693 60.5; -#X msg 49 508 60 90 10000 1 0 0 0; -#X obj 373 189 * 44.1; -#X msg 74 598 60 100 100 1 0 0 0; -#X msg 78 621 60 100 100 1 0 0 1000; -#X msg 69 576 60 100 10000 1 0 1000 0; -#X msg 644 121 reload; -#X msg 649 143 browse; -#X text 418 309 combine amplitude \, rise time \, start phase \, end phase \, and sample number in one message, f 43; -#X text 191 485 straight playback; -#X text 189 507 change amplitude; -#X text 204 529 change sample number; -#X text 230 552 change start location; -#X text 237 574 change rise time; -#X text 212 597 change duration; -#X text 233 619 ... and decay time; -#X text 90 643 If you omit values they stay unchanged; -#X obj 454 685 output~; -#X obj 372 82 unpack f f f f f f f; -#X obj 309 320 pack f f f f f; -#X text 39 70 as before we mute and wait, f 13; -#X text 31 442 These demonstrate the effect of varying the parameters one by one., f 34; -#X obj 478 162 del; -#X msg 62 552 60 100 10000 1 3000 0 0; -#X msg 56 530 60 100 10000 2 0 0 0; -#X msg 139 69 \; cutoff 0 5; -#N canvas 305 163 336 422 samples 0; -#N canvas 0 0 450 300 (subpatch) 0; -#X array sample1 155944 float 2; -#X coords 0 1.02 155944 -1.02 200 130 1; -#X restore 71 36 graph; -#N canvas 0 0 450 300 (subpatch) 0; -#X array sample2 39075 float 2; -#X coords 0 1.02 39075 -1.02 200 130 1; -#X restore 70 203 graph; -#X restore 636 223 pd samples; -#X obj 603 16 declare -stdpath ./; -#X obj 243 27 bang; -#X text 409 467 This patch takes the same principle as the earlier "one-shot sampler" \, but allows you to parameterize sample playback. Since we must wait 5 msec before starting the playback \, we store all the parameters in [f] objects \, and recall them to construct the new note. Transposition is done by altering the amount to play back in the (artificial) ten thousand seconds (1e+07). The playback segment can be altered to start in the middle of the sample instead of the beginning \, and you can change the duration and rise and decay times., f 50; -#X text 688 55 <-- record; -#X msg 309 376 \; envelope 0 \, \$1 \$2 \; phase \$3 \, \$4 1e+07 \; sample-number \$5 \; cutoff 1 5; -#X text 25 157 transposition works by altering the phase target (\$4 below right.) The [mtof] and [/ 261.62] calculate speed change considering 60 as unity., f 26; -#X text 462 369 This starts the note \, sending to [r] objects in the playback subpatch. The new [r envelope] is an amplitude control in parallel with the cutoff control. The "sample-number" switches the [tabread4~] between tables., f 40; -#X listbox 309 349 27 0 0 0 - - - 0; -#X obj 372 25 r note; -#X listbox 372 54 23 0 0 0 - - - 0; -#X text 289 693 microtones OK too; -#X obj 30 16 cnv 5 5 25 empty empty Chocolate\ Sampler 15 13 0 16 #dfdfdf #202020 0; -#X connect 0 0 25 0; -#X connect 3 0 2 0; +#X connect 13 0 15 0; +#X connect 13 0 15 1; +#X connect 14 0 5 0; +#X connect 15 0 16 0; +#X connect 15 0 16 1; +#X connect 16 0 14 1; +#X connect 19 0 20 0; +#X connect 19 1 13 1; +#X connect 20 0 11 0; +#X restore 620 443 pd playback; +#X msg 89 637 record 2; +#X text 67 275 ARGUMENTS FOR NOTES:; +#X text 95 314 amplitude (dB), f 19; +#X text 95 348 sample number, f 19; +#X obj 991 279 f; +#X obj 942 253 f; +#X obj 873 253 f; +#X obj 836 253 f; +#X obj 804 253 f; +#X obj 727 253 f; +#X obj 727 280 mtof; +#X obj 727 308 / 261.62; +#X obj 727 335 * 4.41e+08; +#X obj 814 369 +; +#X obj 743 182 t b b b; +#X obj 873 303 + 1; +#X obj 254 506 s note; +#X msg 991 307 \; envelope 0 \$1; +#X msg 382 421 62; +#X msg 417 421 64; +#X msg 348 421 60; +#X msg 316 421 55; +#X msg 450 421 72; +#X msg 284 421 48; +#X msg 449 447 60.5; +#X obj 873 278 * 44.1; +#X msg 70 582 reload; +#X msg 45 550 browse; +#X text 817 435 combine amplitude \, rise time \, start phase \, end phase \, and sample number in one message, f 29; +#X text 388 239 straight playback; +#X text 386 261 change amplitude; +#X text 401 283 change sample number; +#X text 427 306 change start location; +#X text 434 328 change rise time; +#X text 287 397 If you omit values they stay unchanged; +#X obj 620 480 output~; +#X obj 872 173 unpack f f f f f f f; +#X obj 804 407 pack f f f f f; +#X text 630 197 as before we mute and wait, f 13; +#X text 218 194 These demonstrate the effect of varying the parameters one by one., f 34; +#X obj 978 253 del; +#X msg 639 160 \; cutoff 0 5; +#X obj 743 118 bang; +#X msg 804 522 \; envelope 0 \, \$1 \$2 \; phase \$3 \, \$4 1e+07 \; sample-number \$5 \; cutoff 1 5; +#X listbox 804 490 27 0 0 0 - - - 0; +#X obj 872 116 r note; +#X listbox 872 145 23 0 0 0 - - - 0; +#X obj 76 23 cnv 5 5 25 empty empty Chocolate\ Sampler 15 13 0 16 #dfdfdf #202020 0; +#X text 47 74 This patch takes the same principle as the earlier "C05.sampler.oneshot" \, but allows you to parameterize sample playback. Since we must wait 5 msec before starting the playback \, we store all the parameters in [f] objects \, and recall them to construct the new note. Transposition is done by altering the amount to play back in the (artificial) ten thousand seconds (1e+07). The playback segment can be altered to start in the middle of the sample instead of the beginning \, and you can change the duration and rise and decay times., f 74; +#X msg 239 239 60 100 4000 1 0 0 0; +#X msg 246 261 60 90 4000 1 0 0 0; +#X msg 266 330 60 100 4000 1 0 1000 0; +#X text 95 331 duration (ms), f 19; +#X text 95 365 start location (ms); +#X text 95 382 rise time (ms), f 19; +#X text 95 400 decay time (ms), f 19; +#X text 95 297 MIDI pitch, f 19; +#X msg 275 375 60 100 100 1 0 0 1000; +#X msg 271 352 60 100 100 1 0 0 0; +#X text 409 351 short 0.1 sec duration; +#X text 433 374 with 1 sec decay time; +#X msg 259 306 60 100 4000 1 3000 0 0; +#N canvas 282 191 756 477 init-samples 0; +#X obj 234 37 inlet; +#X obj 144 271 adc~ 1; +#X obj 213 329 line~; +#X obj 144 308 *~; +#X msg 213 301 1; +#X obj 272 266 del 3990; +#X msg 249 301 0 10; +#X obj 144 379 tabwrite~ sample1; +#X obj 58 204 makefilename sample%1; +#X msg 58 233 set \$1 \, bang; +#X msg 316 237 stop; +#X msg 272 237 bang; +#X obj 398 239 loadbang; +#X obj 394 141 openpanel; +#X text 438 278 v-- re-read original samples; +#X obj 234 76 route record stop reload browse; +#X obj 398 360 soundfiler; +#X msg 394 168 read \$1 sample1; +#X obj 394 195 soundfiler; +#X text 418 111 <-- browse for samples; +#X obj 394 111 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 526 402 declare -stdpath ./; +#X msg 398 302 read ../sound/bell.aiff sample1 \, read ../sound/voice2.wav sample2, f 32; +#X connect 0 0 15 0; +#X connect 1 0 3 0; +#X connect 2 0 3 1; +#X connect 3 0 7 0; #X connect 4 0 2 0; -#X connect 5 0 53 0; +#X connect 5 0 6 0; #X connect 6 0 2 0; -#X connect 15 0 29 0; -#X connect 16 0 55 1; -#X connect 17 0 38 0; -#X connect 18 0 55 4; -#X connect 19 0 55 0; -#X connect 20 0 21 0; -#X connect 21 0 22 0; -#X connect 22 0 23 0; -#X connect 23 0 24 0; -#X connect 24 0 55 3; -#X connect 25 0 19 0; -#X connect 25 1 20 0; -#X connect 25 2 16 0; -#X connect 25 2 17 0; -#X connect 25 2 18 0; -#X connect 25 2 58 0; -#X connect 26 0 24 1; -#X connect 26 0 55 2; -#X connect 27 0 28 0; -#X connect 30 0 28 0; -#X connect 31 0 28 0; -#X connect 32 0 28 0; -#X connect 33 0 28 0; -#X connect 34 0 28 0; -#X connect 35 0 28 0; -#X connect 36 0 28 0; -#X connect 37 0 28 0; -#X connect 38 0 26 0; -#X connect 39 0 28 0; -#X connect 40 0 28 0; -#X connect 41 0 28 0; -#X connect 42 0 2 0; -#X connect 43 0 2 0; -#X connect 54 0 20 1; -#X connect 54 0 64 0; -#X connect 54 1 19 1; -#X connect 54 2 58 1; -#X connect 54 3 18 1; -#X connect 54 4 17 1; -#X connect 54 5 16 1; -#X connect 54 6 15 1; -#X connect 55 0 70 0; -#X connect 58 0 15 0; -#X connect 59 0 28 0; -#X connect 60 0 28 0; -#X connect 64 0 0 0; -#X connect 64 0 61 0; -#X connect 70 0 67 0; -#X connect 71 0 72 0; -#X connect 72 0 54 0; +#X connect 8 0 9 0; +#X connect 9 0 7 0; +#X connect 10 0 5 0; +#X connect 11 0 5 0; +#X connect 12 0 22 0; +#X connect 13 0 17 0; +#X connect 15 0 8 0; +#X connect 15 0 11 0; +#X connect 15 0 4 0; +#X connect 15 1 6 0; +#X connect 15 1 10 0; +#X connect 15 2 22 0; +#X connect 15 3 20 0; +#X connect 17 0 18 0; +#X connect 20 0 13 0; +#X connect 22 0 16 0; +#X restore 70 705 pd init-samples; +#N canvas 0 0 450 300 (subpatch) 0; +#X array sample1 176400 float 2; +#X coords 0 1.02 176400 -1.02 200 130 1; +#X restore 324 602 graph; +#N canvas 0 0 450 300 (subpatch) 0; +#X array sample2 176400 float 2; +#X coords 0 1.02 176400 -1.02 200 130 1; +#X restore 536 603 graph; +#X text 490 441 microtones are OK too, f 10; +#X text 652 43 Transposition works by altering the end phase target (\$4 below.) The [mtof] and [/ 261.62] calculate speed change considering 60 as unity., f 53; +#X text 121 583 reload original samples; +#X text 152 613 record sample 1; +#X text 157 636 record sample 2; +#X text 135 667 stop recording; +#X msg 253 284 60 100 4000 2 0 0 0; +#X text 361 740 ----- 4 sec -----; +#X text 561 740 ----- 4 sec -----; +#X text 97 549 choose a new sample for sample 1; +#X text 949 537 This starts the note \, sending to [r] objects in the [pd playback] subpatch., f 27; +#X text 819 612 The new [r envelope] is an amplitude control in parallel with the cutoff control. The "sample-number" switches the [tabread4~] between tables., f 37; +#X connect 0 0 19 0; +#X connect 2 0 67 0; +#X connect 3 0 67 0; +#X connect 4 0 40 0; +#X connect 5 0 67 0; +#X connect 9 0 22 0; +#X connect 10 0 42 1; +#X connect 11 0 30 0; +#X connect 12 0 42 4; +#X connect 13 0 42 0; +#X connect 14 0 15 0; +#X connect 15 0 16 0; +#X connect 16 0 17 0; +#X connect 17 0 18 0; +#X connect 18 0 42 3; +#X connect 19 0 13 0; +#X connect 19 1 14 0; +#X connect 19 2 10 0; +#X connect 19 2 11 0; +#X connect 19 2 12 0; +#X connect 19 2 45 0; +#X connect 20 0 18 1; +#X connect 20 0 42 2; +#X connect 23 0 21 0; +#X connect 24 0 21 0; +#X connect 25 0 21 0; +#X connect 26 0 21 0; +#X connect 27 0 21 0; +#X connect 28 0 21 0; +#X connect 29 0 21 0; +#X connect 30 0 20 0; +#X connect 31 0 67 0; +#X connect 32 0 67 0; +#X connect 41 0 14 1; +#X connect 41 0 47 0; +#X connect 41 1 13 1; +#X connect 41 2 45 1; +#X connect 41 3 12 1; +#X connect 41 4 11 1; +#X connect 41 5 10 1; +#X connect 41 6 9 1; +#X connect 42 0 49 0; +#X connect 45 0 9 0; +#X connect 47 0 0 0; +#X connect 47 0 46 0; +#X connect 49 0 48 0; +#X connect 50 0 51 0; +#X connect 51 0 41 0; +#X connect 54 0 21 0; +#X connect 55 0 21 0; +#X connect 56 0 21 0; +#X connect 62 0 21 0; +#X connect 63 0 21 0; +#X connect 66 0 21 0; +#X connect 76 0 21 0; diff --git a/doc/3.audio.examples/D11.sampler.poly.pd b/doc/3.audio.examples/D11.sampler.poly.pd index 207a1a08..37914d26 100644 --- a/doc/3.audio.examples/D11.sampler.poly.pd +++ b/doc/3.audio.examples/D11.sampler.poly.pd @@ -1,15 +1,5 @@ #N canvas 345 66 982 652 12; #X declare -stdpath ./; -#N canvas 966 150 406 431 samples 0; -#N canvas 0 0 450 300 (subpatch) 0; -#X array sample3 155944 float 2; -#X coords 0 1.02 155944 -1.02 200 130 1; -#X restore 100 58 graph; -#N canvas 0 0 450 300 (subpatch) 0; -#X array sample4 39075 float 2; -#X coords 0 1.02 39075 -1.02 200 130 1; -#X restore 99 225 graph; -#X restore 782 51 pd samples; #X text 35 81 ARGUMENTS FOR NOTES:; #X text 55 110 pitch in halftones, f 21; #X text 55 130 amplitude (dB), f 21; @@ -26,14 +16,35 @@ #X obj 474 175 makenote 64; #X obj 474 203 poly 8 1; #X obj 474 230 stripnote; -#X text 781 94 record \, etc.; +#X text 759 78 record \, etc.; #X text 294 200 allocate sampler voice; #X text 315 225 drop note off again; -#X obj 691 452 qlist; -#X obj 568 418 r comment; +#X obj 689 512 qlist; +#X obj 546 483 r comment; #X obj 547 331 output~; #X text 231 175 supply delayed note-off message; -#N canvas 530 314 704 442 recorder 0; +#X msg 772 104 record 1; +#X msg 787 150 stop; +#X msg 780 127 record 2; +#X msg 793 173 reload; +#X msg 798 196 browse; +#X obj 547 262 pack f f f f f f f f; +#X obj 561 47 unpack f f f f f f f; +#X obj 547 296 clone -s 1 sampvoice 8; +#X text 18 410 The [poly] object essentially repeats pitch and velocity pairs to its output \, but also sending a voice number from its left outlet. To use it \, we unpack the 7 parameters \, calculate the voice number \, repack the message as 8 parameters with voice number first \, and [clone] routes to internal instances of the abstraction., f 61; +#X obj 546 512 print comment; +#X msg 689 555 line 0 \, auto; +#X obj 520 590 text define -k seq; +#A set note 60 90 50 4 50 30 30 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 100 note 59 90 100 \; comment measure 1 \; 100 note 60 90 150 4 0 \; note 36 90 200 4 50 \; 200 note 48 90 250 4 0 \; note 40 90 200 4 50 \; note 43 90 200 4 50 \; 200 note 48 90 250 4 0 \; note 31 90 200 4 50 \; 200 note 55 90 100 \; note 41 90 200 \; note 43 90 200 \; 100 note 53 90 100 \; 100 note 52 90 100 \; note 36 90 200 \; 100 note 55 90 100 \; 100 note 60 90 100 \; note 40 90 200 \; note 43 90 200 \; 100 note 59 90 100 \; 100 note 60 90 100 \; note 25 90 200 \; 100 note 64 90 100 \; 100 note 62 90 100 \; note 39 90 200 \; note 43 90 200 \; 100 note 61 90 100 \; comment measure 2 \; 100 note 62 90 150 4 0 \; note 26 90 200 \; 200 note 50 90 250 4 50 \; note 41 90 200 \; note 42 90 200 \; 200 note 50 90 250 \; note 29 90 200 \; 200 note 50 90 100 \; note 30 90 200 \; note 44 90 200 \; note 48 90 200 \; 100 note 48 90 100 \; 100 note 47 90 100 \; note 31 90 200 \; note 43 90 200 \; note 47 90 200 \; 100 note 50 90 100 \; 100 note 55 90 100 \; note 34 90 200 \; note 42 90 200 \; note 46 90 200 \; 100 note 54 90 100 \; 100 note 55 90 200 \; note 35 90 200 \; note 42 90 200 \; note 45 90 200 \; 200 note 57 90 100 \; note 41 90 200 \; note 47 90 200 \; 100 note 59 90 100 \; comment measure 3 \; 100 note 60 90 100 \; note 24 90 200 \; note 40 90 200 \; note 48 90 200 4 0 \; 100 note 59 90 100 4 50 \; 100 note 57 90 100 \; 100 note 55 90 100 \; 100 note 57 90 100 \; note 28 90 200 \; note 38 90 200 \; note 46 90 200 \; 100 note 55 90 100 \; 100 note 53 90 100 \; 100 note 52 90 100 \; 100 note 53 90 100 \; note 29 90 100 \; note 36 90 100 \; note 45 90 100 \; 100 note 52 90 100 \; 100 note 50 90 100 \; note 29 90 300 \; note 36 90 300 \; note 45 90 300 \; 100 note 48 90 100 \; 100 note 50 90 100 \; 100 note 48 90 100 \; 100 note 47 90 100 \; note 29 90 300 \; note 38 90 300 \; note 44 90 300 4 0 \; 100 note 45 90 100 4 50 \; comment measure 4 \; 100 note 43 90 100 \; note 31 90 200 \; note 38 90 200 \; 100 note 48 90 100 \; 100 note 47 90 100 \; note 31 90 300 \; note 40 90 300 \; note 43 90 300 4 0 \; 100 note 50 90 100 4 50 \; 100 note 48 90 100 \; 100 note 52 90 100 \; 100 note 50 90 100 \; note 31 90 300 4 0 \; note 41 90 300 \; note 43 90 300 \; 100 note 53 90 100 4 50 \; 100 note 52 90 200 \; note 31 90 300 4 50 \; 200 note 48 90 200 \; note 19 90 200 4 50 \; note 29 90 200 4 50 \; note 36 90 200 4 50 \; 200 note 48 90 100 4 50 0 4000 \; note 12 90 300 \; note 28 90 300 \; note 36 90 300 \;; +#X obj 689 599 text sequence seq -g; +#X text 782 555 <--; +#X text 532 564 click to open:; +#X text 688 333 Lashed to the mast of his boat \, Ulysses hears beautiful singing. He begs his sailors to untie him..., f 35; +#X text 245 110 increment with [mod 1e+06] to make a note tag (acts like a MIDI pitch to identify the note to [poly]), f 29; +#X text 18 276 Here we take the previous patch and make it polyphonic \, with 8 voices. The single voice which we had before has been made into an abstraction \, [sampvoice] \, which we instantiate in 8 copies with the [clone] object. Earlier we used sends and receives to pass messages to "cutoff" \, etc \, but here if we did that the copies of [sampvoice] would be sending messages to each other \, so we combine the control and the audio computation in the [sampvoice] abstraction without using send and receive. Click on [clone] one to see how., f 61; +#X text 18 502 There's some bother because [poly] expects to track note on and note off messages separately as they would come from a MIDI keyboard. So we assign each note a unique fake "pitch" \, use [makenote] to generate the note-off messages \, and run [poly] on the resulting stream. We then discard both pitch and velocity for the note offs with [stripnoe] (using the velocity only to strip note-offs) and rebuild the original message adding the voice number we just scored., f 61; +#X obj 74 24 cnv 5 5 25 empty empty Polyphonic\ Sampler 15 13 0 16 #dfdfdf #202020 0; +#N canvas 446 297 961 453 init-samples 0; #X obj 218 34 inlet; #X obj 128 258 adc~ 1; #X obj 128 286 hip~ 5; @@ -54,9 +65,18 @@ #X obj 382 347 soundfiler; #X msg 378 155 read \$1 sample3; #X obj 378 182 soundfiler; -#X msg 382 288 read -resize ../sound/bell.aiff sample3 \, read -resize ../sound/voice2.wav sample4, f 40; #X obj 378 99 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X text 406 99 <-- browse for samples; +#X obj 513 351 declare -stdpath ./; +#X msg 382 288 read ../sound/bell.aiff sample3 \, read ../sound/voice2.wav sample4, f 33; +#N canvas 0 0 450 300 (subpatch) 0; +#X array sample3 176400 float 2; +#X coords 0 1.02 176400 -1.02 200 130 1; +#X restore 708 73 graph; +#N canvas 0 0 450 300 (subpatch) 0; +#X array sample4 176400 float 2; +#X coords 0 1.02 176400 -1.02 200 130 1; +#X restore 707 240 graph; #X connect 0 0 16 0; #X connect 1 0 2 0; #X connect 2 0 4 0; @@ -69,71 +89,50 @@ #X connect 10 0 8 0; #X connect 11 0 6 0; #X connect 12 0 6 0; -#X connect 13 0 20 0; +#X connect 13 0 23 0; #X connect 14 0 18 0; #X connect 16 0 9 0; #X connect 16 0 12 0; #X connect 16 0 5 0; #X connect 16 1 7 0; #X connect 16 1 11 0; -#X connect 16 2 20 0; -#X connect 16 3 21 0; +#X connect 16 2 23 0; +#X connect 16 3 20 0; #X connect 18 0 19 0; -#X connect 20 0 17 0; -#X connect 21 0 14 0; -#X restore 802 247 pd recorder; -#X msg 794 120 record 1; -#X msg 809 166 stop; -#X msg 802 143 record 2; -#X msg 815 189 reload; -#X msg 820 212 browse; -#X obj 786 292 declare -stdpath ./; -#X obj 547 262 pack f f f f f f f f; -#X obj 561 47 unpack f f f f f f f; -#X obj 547 296 clone -s 1 sampvoice 8; -#X text 18 410 The [poly] object essentially repeats pitch and velocity pairs to its output \, but also sending a voice number from its left outlet. To use it \, we unpack the 7 parameters \, calculate the voice number \, repack the message as 8 parameters with voice number first \, and [clone] routes to internal instances of the abstraction., f 61; -#X msg 691 413 read qlist-sampler.txt \, rewind \, tempo 1 \, bang, f 23; -#X obj 568 447 print comment; -#X msg 495 546 line 0 \, auto; -#X text 617 542 rewind and start automatically, f 16; -#X obj 811 557 text define -k seq; -#A set note 60 90 50 4 50 30 30 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 15 note 60 \; 100 note 59 90 100 \; comment measure 1 \; 100 note 60 90 150 4 0 \; note 36 90 200 4 50 \; 200 note 48 90 250 4 0 \; note 40 90 200 4 50 \; note 43 90 200 4 50 \; 200 note 48 90 250 4 0 \; note 31 90 200 4 50 \; 200 note 55 90 100 \; note 41 90 200 \; note 43 90 200 \; 100 note 53 90 100 \; 100 note 52 90 100 \; note 36 90 200 \; 100 note 55 90 100 \; 100 note 60 90 100 \; note 40 90 200 \; note 43 90 200 \; 100 note 59 90 100 \; 100 note 60 90 100 \; note 25 90 200 \; 100 note 64 90 100 \; 100 note 62 90 100 \; note 39 90 200 \; note 43 90 200 \; 100 note 61 90 100 \; comment measure 2 \; 100 note 62 90 150 4 0 \; note 26 90 200 \; 200 note 50 90 250 4 50 \; note 41 90 200 \; note 42 90 200 \; 200 note 50 90 250 \; note 29 90 200 \; 200 note 50 90 100 \; note 30 90 200 \; note 44 90 200 \; note 48 90 200 \; 100 note 48 90 100 \; 100 note 47 90 100 \; note 31 90 200 \; note 43 90 200 \; note 47 90 200 \; 100 note 50 90 100 \; 100 note 55 90 100 \; note 34 90 200 \; note 42 90 200 \; note 46 90 200 \; 100 note 54 90 100 \; 100 note 55 90 200 \; note 35 90 200 \; note 42 90 200 \; note 45 90 200 \; 200 note 57 90 100 \; note 41 90 200 \; note 47 90 200 \; 100 note 59 90 100 \; comment measure 3 \; 100 note 60 90 100 \; note 24 90 200 \; note 40 90 200 \; note 48 90 200 4 0 \; 100 note 59 90 100 4 50 \; 100 note 57 90 100 \; 100 note 55 90 100 \; 100 note 57 90 100 \; note 28 90 200 \; note 38 90 200 \; note 46 90 200 \; 100 note 55 90 100 \; 100 note 53 90 100 \; 100 note 52 90 100 \; 100 note 53 90 100 \; note 29 90 100 \; note 36 90 100 \; note 45 90 100 \; 100 note 52 90 100 \; 100 note 50 90 100 \; note 29 90 300 \; note 36 90 300 \; note 45 90 300 \; 100 note 48 90 100 \; 100 note 50 90 100 \; 100 note 48 90 100 \; 100 note 47 90 100 \; note 29 90 300 \; note 38 90 300 \; note 44 90 300 4 0 \; 100 note 45 90 100 4 50 \; comment measure 4 \; 100 note 43 90 100 \; note 31 90 200 \; note 38 90 200 \; 100 note 48 90 100 \; 100 note 47 90 100 \; note 31 90 300 \; note 40 90 300 \; note 43 90 300 4 0 \; 100 note 50 90 100 4 50 \; 100 note 48 90 100 \; 100 note 52 90 100 \; 100 note 50 90 100 \; note 31 90 300 4 0 \; note 41 90 300 \; note 43 90 300 \; 100 note 53 90 100 4 50 \; 100 note 52 90 200 \; note 31 90 300 4 50 \; 200 note 48 90 200 \; note 19 90 200 4 50 \; note 29 90 200 4 50 \; note 36 90 200 4 50 \; 200 note 48 90 100 4 50 0 4000 \; note 12 90 300 \; note 28 90 300 \; note 36 90 300 \;; -#X obj 495 590 text sequence seq -g; -#X text 588 546 <--; -#X text 493 492 You can use [qlist] or the more modern [text sequence] object \, which can save its contents with the patch.; -#X text 823 531 click to open:; -#X text 688 333 Lashed to the mast of his boat \, Ulysses hears beautiful singing. He begs his sailors to untie him..., f 39; -#X text 245 110 increment with [mod 1e+06] to make a note tag (acts like a MIDI pitch to identify the note to [poly]), f 29; -#X text 18 276 Here we take the previous patch and make it polyphonic \, with 8 voices. The single voice which we had before has been made into an abstraction \, [sampvoice] \, which we instantiate in 8 copies with the [clone] object. Earlier we used sends and receives to pass messages to "cutoff" \, etc \, but here if we did that the copies of [sampvoice] would be sending messages to each other \, so we combine the control and the audio computation in the [sampvoice] abstraction without using send and receive. Click on [clone] one to see how., f 61; -#X text 18 502 There's some bother because [poly] expects to track note on and note off messages separately as they would come from a MIDI keyboard. So we assign each note a unique fake "pitch" \, use [makenote] to generate the note-off messages \, and run [poly] on the resulting stream. We then discard both pitch and velocity for the note offs with [stripnoe] (using the velocity only to strip note-offs) and rebuild the original message adding the voice number we just scored., f 61; -#X obj 74 24 cnv 5 5 25 empty empty Polyphonic\ Sampler 15 13 0 16 #dfdfdf #202020 0; -#X connect 9 0 32 0; +#X connect 20 0 14 0; +#X connect 23 0 17 0; +#X restore 780 231 pd init-samples; +#X text 514 412 You can use the [qlist] to read a text file or the more modern [text sequence] object that can save its contents with the patch.; +#X msg 689 469 read qlist-sampler.txt \, rewind \, bang, f 23; +#X text 868 465 <- read \, rewind & start, f 8; +#X text 811 551 rewind and start (automatically), f 16; +#X connect 8 0 29 0; +#X connect 9 0 10 0; +#X connect 9 1 28 1; #X connect 10 0 11 0; -#X connect 10 1 31 1; +#X connect 10 0 13 0; #X connect 11 0 12 0; -#X connect 11 0 14 0; -#X connect 12 0 13 0; -#X connect 13 0 11 1; +#X connect 12 0 10 1; +#X connect 13 0 14 0; +#X connect 13 1 14 1; #X connect 14 0 15 0; -#X connect 14 1 15 1; -#X connect 15 0 16 0; -#X connect 15 2 16 1; -#X connect 16 0 31 0; -#X connect 21 0 36 0; -#X connect 25 0 24 0; -#X connect 26 0 24 0; -#X connect 27 0 24 0; -#X connect 28 0 24 0; -#X connect 29 0 24 0; -#X connect 31 0 33 0; -#X connect 32 0 10 0; -#X connect 32 1 31 2; -#X connect 32 2 14 2; -#X connect 32 2 31 3; -#X connect 32 3 31 4; -#X connect 32 4 31 5; -#X connect 32 5 31 6; -#X connect 32 6 31 7; -#X connect 33 0 22 0; -#X connect 35 0 20 0; -#X connect 37 0 40 0; +#X connect 14 2 15 1; +#X connect 15 0 28 0; +#X connect 20 0 32 0; +#X connect 23 0 43 0; +#X connect 24 0 43 0; +#X connect 25 0 43 0; +#X connect 26 0 43 0; +#X connect 27 0 43 0; +#X connect 28 0 30 0; +#X connect 29 0 9 0; +#X connect 29 1 28 2; +#X connect 29 2 13 2; +#X connect 29 2 28 3; +#X connect 29 3 28 4; +#X connect 29 4 28 5; +#X connect 29 5 28 6; +#X connect 29 6 28 7; +#X connect 30 0 21 0; +#X connect 33 0 35 0; +#X connect 45 0 19 0; diff --git a/doc/3.audio.examples/D12.sampler.bis.pd b/doc/3.audio.examples/D12.sampler.bis.pd index 8e2f489d..4a913b45 100644 --- a/doc/3.audio.examples/D12.sampler.bis.pd +++ b/doc/3.audio.examples/D12.sampler.bis.pd @@ -1,80 +1,65 @@ -#N canvas 266 156 1091 715 12; +#N canvas 252 70 1075 759 12; #X declare -stdpath ./; -#N canvas 642 163 417 426 samples 0; -#N canvas 0 0 450 300 (subpatch) 0; -#X array sample5 155944 float 2; -#X coords 0 1.02 155944 -1.02 200 130 1; -#X restore 116 45 graph; -#N canvas 0 0 450 300 (subpatch) 0; -#X array sample6 39075 float 2; -#X coords 0 1.02 39075 -1.02 200 130 1; -#X restore 116 210 graph; -#X restore 487 556 pd samples; -#X text 786 487 sample number; -#X obj 548 143 poly 8 1; -#X obj 617 366 output~; -#X obj 548 168 swap; -#X obj 548 215 route 0; -#X obj 548 192 pack; -#X text 937 440 amplitude; -#X text 936 464 pitch; -#X text 855 373 ARGUMENTS FOR:; -#X text 788 415 pitch; -#X text 788 439 amplitude; -#X text 788 463 duration; -#X obj 603 81 r onoff; -#X text 936 397 ON/OFF TRANSITIONS:; -#X text 789 396 ENTIRE NOTES:; -#X text 936 419 tag; -#X text 786 514 sample onset; -#X text 786 540 rise time; -#X text 787 564 decay time; -#X text 933 489 (same other 4); -#X obj 779 179 f; -#X obj 815 179 + 1; -#X obj 789 205 mod 1e+06; -#X obj 860 85 r note; -#X obj 833 148 t b f; -#X obj 874 316 s onoff; -#X obj 828 261 pipe; -#X obj 828 284 pack; -#X msg 299 538 \; onoff 1 0; -#X msg 300 580 \; onoff 2 0; -#X text 35 171 Messages to "onoff" require a tag \, which is a number shared between the note-on and note-off message so that we can track down the voice to turn it off. If you're using MIDI input \, you can just re-use the pitch as a tag., f 67; -#X text 92 633 single messages to do both as before:, f 18; -#X obj 603 106 unpack f f f f f f f; -#X obj 617 275 pack f f f f f f f; -#X obj 860 111 unpack f f f f f f f; -#X obj 874 261 pack f f f f f f f; -#N canvas 333 157 708 551 recorder 0; -#X obj 152 363 adc~ 1; -#X obj 152 391 hip~ 5; -#X obj 221 421 line~; -#X obj 152 420 *~; -#X msg 221 393 1; -#X obj 280 358 del 3990; -#X msg 257 393 0 10; -#X obj 152 471 tabwrite~ sample5; -#X obj 66 296 makefilename sample%1; -#X msg 66 325 set \$1 \, bang; -#X msg 324 329 stop; -#X msg 280 329 bang; -#X obj 406 331 loadbang; -#X obj 402 233 openpanel; -#X text 446 370 v-- re-read original samples; -#X obj 242 168 route record stop reload browse; -#X obj 406 452 soundfiler; -#X msg 402 260 read \$1 sample5; -#X obj 402 287 soundfiler; -#X text 228 21 record \, etc.; -#X msg 242 48 record 1; -#X msg 256 92 stop; -#X msg 249 70 record 2; -#X msg 262 114 reload; -#X msg 267 136 browse; -#X msg 406 394 read -resize ../sound/bell.aiff sample5 \, read -resize ../sound/voice2.wav sample6, f 40; -#X obj 402 201 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X text 429 201 <-- browse for samples; +#X text 55 617 sample number; +#X obj 548 133 poly 8 1; +#X obj 617 356 output~; +#X obj 548 158 swap; +#X obj 548 205 route 0; +#X obj 548 182 pack; +#X text 186 581 amplitude, f 16; +#X text 186 599 pitch, f 16; +#X text 109 516 ARGUMENTS FOR:; +#X text 55 563 pitch, f 13; +#X text 55 581 amplitude, f 13; +#X text 55 599 duration, f 13; +#X obj 603 71 r onoff; +#X text 165 545 ON/OFF TRANSITIONS:; +#X text 41 545 ENTIRE NOTES:, f 15; +#X text 186 563 tag, f 16; +#X text 55 635 sample onset, f 13; +#X text 55 653 rise time, f 13; +#X text 55 671 decay time, f 13; +#X text 186 617 (same other 4), f 16; +#X obj 789 169 f; +#X obj 825 169 + 1; +#X obj 799 195 mod 1e+06; +#X obj 870 75 r note; +#X obj 843 138 t b f; +#X obj 884 306 s onoff; +#X obj 838 251 pipe; +#X obj 838 274 pack; +#X msg 522 565 \; onoff 1 0; +#X msg 523 607 \; onoff 2 0; +#X text 35 161 Messages to "onoff" require a tag \, which is a number shared between the note-on and note-off message so that we can track down the voice to turn it off. If you're using MIDI input \, you can just re-use the pitch as a tag., f 67; +#X text 265 660 single messages to do both as before:, f 18; +#X obj 603 96 unpack f f f f f f f; +#X obj 617 265 pack f f f f f f f; +#X obj 870 101 unpack f f f f f f f; +#X obj 884 251 pack f f f f f f f; +#N canvas 659 253 685 450 recorder 0; +#X obj 146 273 adc~ 1; +#X obj 146 301 hip~ 5; +#X obj 215 331 line~; +#X obj 146 330 *~; +#X msg 215 303 1; +#X obj 274 268 del 3990; +#X msg 251 303 0 10; +#X obj 146 381 tabwrite~ sample5; +#X obj 60 206 makefilename sample%1; +#X msg 60 235 set \$1 \, bang; +#X msg 318 239 stop; +#X msg 274 239 bang; +#X obj 400 241 loadbang; +#X obj 396 143 openpanel; +#X text 440 280 v-- re-read original samples; +#X obj 236 78 route record stop reload browse; +#X obj 400 362 soundfiler; +#X msg 396 170 read \$1 sample5; +#X obj 396 197 soundfiler; +#X obj 396 111 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 423 111 <-- browse for samples; +#X obj 236 43 inlet; +#X msg 400 304 read ../sound/bell.aiff sample5 \, read ../sound/voice2.wav sample6, f 32; #X connect 0 0 1 0; #X connect 1 0 3 0; #X connect 2 0 3 1; @@ -86,72 +71,87 @@ #X connect 9 0 7 0; #X connect 10 0 5 0; #X connect 11 0 5 0; -#X connect 12 0 25 0; +#X connect 12 0 22 0; #X connect 13 0 17 0; #X connect 15 0 8 0; #X connect 15 0 11 0; #X connect 15 0 4 0; #X connect 15 1 6 0; #X connect 15 1 10 0; -#X connect 15 2 25 0; -#X connect 15 3 26 0; +#X connect 15 2 22 0; +#X connect 15 3 19 0; #X connect 17 0 18 0; -#X connect 20 0 15 0; +#X connect 19 0 13 0; #X connect 21 0 15 0; -#X connect 22 0 15 0; -#X connect 23 0 15 0; -#X connect 24 0 15 0; -#X connect 25 0 16 0; -#X connect 26 0 13 0; -#X restore 487 580 pd recorder; -#X obj 592 447 declare -stdpath ./; -#X obj 617 321 clone -s 1 sampvoice2 8; -#X msg 548 242 \$1 0; -#X msg 594 243 \$2; -#X msg 99 538 \; onoff 1 90 60 5 0 0 100; -#X msg 100 580 \; onoff 2 90 48 5 0 0 100; -#X msg 230 633 \; note 51 90 1000 5 0 0 100; -#X text 106 513 separate messages for note on and off:; -#X text 36 64 Here is a variation on the polyphonic sampler \, which can take separate messages to start and stop notes (so that you can attach it to a MIDI keyboard \, for example.) "Note" messages act as before \, but in an intermediate step they are split onto note-on and note-off messages \, sent to "onoff". You can alternatively send messages straight to "onoff" if you don't know the duration in advance., f 67; -#X text 35 240 Messages to "onoff" whose amplitude is zero are note-off messages (the other parameters of note-off messages are ignored). The [sampvoice2] abstraction is a modification of [sampvoice] which looks at the amplitude field to decide whether to begin or end a note., f 67; -#X text 35 320 To convert "note" messages to pairs of "onoff" messages \, first a counter generates a tag. The [pipe] object delays a copy of the tag \, which the following [pack] object converts into a note-off message (a pair of numbers \, the tag and a zero.), f 67; -#X text 35 386 Under [r onoff] \, the [poly] object allocates a voice number \, putting it out paired with velocity. After swapping the two and packing them into a single message \, the amplitude is checked against zero by the [route 0] object. If zero \, the "\$1 0" message outputs a list with "voice number" and "0". Otherwise \, the "\$2" retrieves the voice number from [poly] which gets packed in with the note data and routed to the appropriate [sampvoice2] copy inside [clone]., f 67; -#X obj 242 13 cnv 5 5 25 empty empty Polyphonic\ Sampler\ with\ Separate\ Note-On/Off\ Messages 15 13 0 16 #dfdfdf #202020 0; -#X connect 2 0 4 0; -#X connect 2 2 4 1; -#X connect 4 0 6 0; -#X connect 4 1 6 1; -#X connect 5 0 40 0; -#X connect 5 1 41 0; -#X connect 6 0 5 0; -#X connect 13 0 33 0; +#X connect 22 0 16 0; +#X restore 871 510 pd recorder; +#X obj 594 457 declare -stdpath ./; +#X obj 617 311 clone -s 1 sampvoice2 8; +#X msg 548 232 \$1 0; +#X msg 594 233 \$2; +#X msg 322 565 \; onoff 1 90 60 5 0 0 100; +#X msg 323 607 \; onoff 2 90 48 5 0 0 100; +#X msg 403 660 \; note 51 90 1000 5 0 0 100; +#X text 329 540 separate messages for note on and off:; +#X text 35 54 Here is a variation on the polyphonic sampler \, which can take separate messages to start and stop notes (so that you can attach it to a MIDI keyboard \, for example.) "Note" messages act as before \, but in an intermediate step they are split onto note-on and note-off messages \, sent to "onoff". You can alternatively send messages straight to "onoff" if you don't know the duration in advance., f 67; +#X text 35 230 Messages to "onoff" whose amplitude is zero are note-off messages (the other parameters of note-off messages are ignored). The [sampvoice2] abstraction is a modification of [sampvoice] which looks at the amplitude field to decide whether to begin or end a note., f 67; +#X text 35 310 To convert "note" messages to pairs of "onoff" messages \, first a counter generates a tag. The [pipe] object delays a copy of the tag \, which the following [pack] object converts into a note-off message (a pair of numbers \, the tag and a zero.), f 67; +#X text 35 376 Under [r onoff] \, the [poly] object allocates a voice number \, putting it out paired with velocity. After swapping the two and packing them into a single message \, the amplitude is checked against zero by the [route 0] object. If zero \, the "\$1 0" message outputs a list with "voice number" and "0". Otherwise \, the "\$2" retrieves the voice number from [poly] which gets packed in with the note data and routed to the appropriate [sampvoice2] copy inside [clone]., f 67; +#X obj 20 11 cnv 5 5 25 empty empty Polyphonic\ Sampler\ with\ Separate\ Note-On/Off\ Messages 15 13 0 16 #dfdfdf #202020 0; +#X text 857 361 record \, etc.; +#X msg 871 388 record 1; +#X msg 885 432 stop; +#X msg 878 410 record 2; +#X msg 891 454 reload; +#X msg 896 476 browse; +#N canvas 0 0 450 300 (subpatch) 0; +#X array sample5 176400 float 2; +#X coords 0 1.02 176400 -1.02 200 130 1; +#X restore 635 577 graph; +#N canvas 0 0 450 300 (subpatch) 0; +#X array sample6 176400 float 2; +#X coords 0 1.02 176400 -1.02 200 130 1; +#X restore 842 579 graph; +#X connect 1 0 3 0; +#X connect 1 2 3 1; +#X connect 3 0 5 0; +#X connect 3 1 5 1; +#X connect 4 0 39 0; +#X connect 4 1 40 0; +#X connect 5 0 4 0; +#X connect 12 0 32 0; +#X connect 20 0 21 0; #X connect 21 0 22 0; -#X connect 22 0 23 0; -#X connect 23 0 21 1; -#X connect 23 0 27 0; -#X connect 23 0 36 0; -#X connect 24 0 35 0; -#X connect 25 0 21 0; -#X connect 25 1 36 2; -#X connect 27 0 28 0; -#X connect 28 0 26 0; -#X connect 33 0 2 0; -#X connect 33 1 2 1; -#X connect 33 1 34 1; -#X connect 33 2 34 2; -#X connect 33 3 34 3; -#X connect 33 4 34 4; -#X connect 33 5 34 5; -#X connect 33 6 34 6; -#X connect 34 0 39 0; +#X connect 22 0 20 1; +#X connect 22 0 26 0; +#X connect 22 0 35 0; +#X connect 23 0 34 0; +#X connect 24 0 20 0; +#X connect 24 1 35 2; +#X connect 26 0 27 0; +#X connect 27 0 25 0; +#X connect 32 0 1 0; +#X connect 32 1 1 1; +#X connect 32 1 33 1; +#X connect 32 2 33 2; +#X connect 32 3 33 3; +#X connect 32 4 33 4; +#X connect 32 5 33 5; +#X connect 32 6 33 6; +#X connect 33 0 38 0; +#X connect 34 0 24 0; +#X connect 34 1 35 1; +#X connect 34 2 26 1; +#X connect 34 3 35 3; +#X connect 34 4 35 4; +#X connect 34 5 35 5; +#X connect 34 6 35 6; #X connect 35 0 25 0; -#X connect 35 1 36 1; -#X connect 35 2 27 1; -#X connect 35 3 36 3; -#X connect 35 4 36 4; -#X connect 35 5 36 5; -#X connect 35 6 36 6; -#X connect 36 0 26 0; -#X connect 39 0 3 0; -#X connect 40 0 39 0; -#X connect 41 0 34 0; +#X connect 38 0 2 0; +#X connect 39 0 38 0; +#X connect 40 0 33 0; +#X connect 51 0 36 0; +#X connect 52 0 36 0; +#X connect 53 0 36 0; +#X connect 54 0 36 0; +#X connect 55 0 36 0; diff --git a/doc/3.audio.examples/D13.additive.qlist.pd b/doc/3.audio.examples/D13.additive.qlist.pd index 90cc2303..6216da29 100644 --- a/doc/3.audio.examples/D13.additive.qlist.pd +++ b/doc/3.audio.examples/D13.additive.qlist.pd @@ -1,52 +1,42 @@ -#N canvas 421 53 665 605 12; +#N canvas 421 53 690 600 12; #X declare -stdpath ./; -#X obj 392 354 qlist; -#X msg 476 302 read qlist.txt; -#X obj 476 257 loadbang; -#X text 249 140 start; -#X text 486 281 reread file; -#X msg 392 212 rewind; -#X msg 460 212 next; -#X msg 241 164 tempo 1 \, bang; -#X text 404 191 single step; -#X obj 203 316 r #; -#X obj 49 227 output~; -#X obj 511 161 declare -stdpath ./; -#X obj 49 178 clone -s 1 osc-voice 8; -#X text 436 490 click to open:; -#X obj 421 516 text define -k additive; -#A set # This is the contents of a [text] object for the D13.additive.qlist patch \, which demonstrates an oscillator bank. \; # comments start with a "#" which must be followed by a space. The comment is terminated by a semicolon \; # first an arpeggio. You can group them in lines as you please. The 100s at the beginnings of lines are delay times. \; pit1 89 \; amp1 80 \; 100 pit2 72 \; amp2 80 \; 100 pit3 57 \; amp3 90 \; 100 pit4 84 \; amp4 78 \; 100 pit5 74 \; amp5 74 \; 100 pit6 73 \; amp6 74 \; 100 pit7 100 \; amp7 78 \; 100 pit8 37 \; amp8 95 \; # after a 600-msec rest \, gliss four of the oscillators to new frequencies. \; 600 pit1 70 1000 \; 300 pit8 40 1000 \; 300 pit4 89 1000 \; 300 pit7 95 1000 \; # a second later \, turn them off with decay time 1500 \; 1000 amp1 0 1500 \; amp2 0 1500 \; amp3 0 1500 \; amp4 0 1500 \; amp5 0 1500 \; amp6 0 1500 \; amp7 0 1500 \; amp8 0 1500 \; # and re-attack them.. \; 1000 amp1 85 5 \; amp2 85 5 \; amp3 85 5 \; amp4 90 5 \; amp5 85 5 \; amp6 85 5 \; amp7 90 5 \; amp8 85 5 \; # this time \, try varying decay times. \; 10 amp1 0 2000 \; amp2 0 2000 \; amp3 0 2000 \; amp4 0 500 \; amp5 0 1000 \; amp6 0 1000 \; amp7 0 500 \; amp8 0 4000 \;; -#X obj 93 560 text sequence additive -g; -#X obj 203 343 print comments; -#X msg 69 391 1; -#X msg 103 475 step; -#X msg 93 447 line 0; -#X text 145 446 <-- rewind; -#X text 141 476 <-- step through; -#X text 87 318 this is where comments go to:, f 15; -#X msg 347 164 tempo 5 \, bang; -#X msg 126 531 stop; -#X text 167 531 <-- stop; -#X msg 103 391 5; -#X msg 69 417 tempo \$1 permsec; -#X msg 119 503 line 0 \, auto; -#X text 216 500 <-- rewind and play; -#X text 244 517 automatically, f 15; -#X text 356 405 You can also use the more modern [text sequence] object instead which is more powerful. It can also save contents of the sequence with the patch., f 39; -#X text 54 56 Here is an eight voice additive synthesis patch controlled by a [qlist]. Open a text editor on the file \, "qlist.txt" \, to see how the oscillators' amplitudes and frequencies are specified. The abstraction \, [osc-voice] is loaded 8 times inside [clone] and shows an effective way to make patches react to [qlist] objects but also to mousing., f 81; -#X obj 91 16 cnv 5 5 25 empty empty Using\ [qlist]\ to\ Sequence\ an\ Oscillator\ Bank 15 13 0 16 #dfdfdf #202020 0; -#X connect 1 0 0 0; +#X obj 31 22 cnv 5 5 25 empty empty Using\ [text]\ to\ Sequence\ an\ Oscillator\ Bank 15 13 0 16 #dfdfdf #202020 0; +#X obj 433 371 qlist; +#X msg 517 319 read qlist.txt; +#X obj 517 274 loadbang; +#X text 527 298 reread file; +#X msg 433 229 rewind; +#X msg 501 229 next; +#X text 445 208 single step; +#X obj 208 336 r #; +#X obj 88 242 output~; +#X obj 523 21 declare -stdpath ./; +#X obj 88 193 clone -s 1 osc-voice 8; +#X text 57 61 Here is an eight voice additive synthesis patch controlled by a [qlist]. Open a text editor on the file \, "qlist.txt" \, to see how the oscillators' amplitudes and frequencies are specified. The abstraction \, "osc-voice" is loaded 8 times inside [clone] and shows an effective way to make patches react to qlists but also to mousing., f 81; +#X text 459 502 click to open:; +#X obj 447 528 text define -k additive; +#A set # This is a qlist for patch number 68 \, which demonstrates an oscillator bank. \; # comments start with a "#" which must be followed by a space. The comment is terminated by a semicolon like this: \; # first an arpeggio. You can group them in lines as you please. The 100s at the beginnings of lines are delay times. \; pit1 89 \; amp1 80 \; 100 pit2 72 \; amp2 80 \; 100 pit3 57 \; amp3 90 \; 100 pit4 84 \; amp4 78 \; 100 pit5 74 \; amp5 74 \; 100 pit6 73 \; amp6 74 \; 100 pit7 100 \; amp7 78 \; 100 pit8 37 \; amp8 95 \; # after a 600-msec rest \, gliss four of the oscillators to new frequencies. \; 600 pit1 70 1000 \; 300 pit8 40 1000 \; 300 pit4 89 1000 \; 300 pit7 95 1000 \; # a second later \, turn them off with decay time 1500 \; 1000 amp1 0 1500 \; amp2 0 1500 \; amp3 0 1500 \; amp4 0 1500 \; amp5 0 1500 \; amp6 0 1500 \; amp7 0 1500 \; amp8 0 1500 \; # and re-attack them.. \; 1000 amp1 85 5 \; amp2 85 5 \; amp3 85 5 \; amp4 90 5 \; amp5 85 5 \; amp6 85 5 \; amp7 90 5 \; amp8 85 5 \; # this time \, try varying decay times. \; 10 amp1 0 2000 \; amp2 0 2000 \; amp3 0 2000 \; amp4 0 500 \; amp5 0 1000 \; amp6 0 1000 \; amp7 0 500 \; amp8 0 4000 \;; +#X obj 106 534 text sequence additive -g; +#X obj 208 363 print comments; +#X msg 106 425 1; +#X text 82 338 this is where comments go to:, f 15; +#X msg 140 425 5; +#X text 364 421 You can also use the more modern [text sequence] object instead which is more powerful. It can also save contents of the sequence with the patch., f 35; +#X msg 106 461 tempo \$1 permsec \, line 0 \, auto, f 17; +#X msg 305 202 tempo \$1 \, bang; +#X msg 305 171 1; +#X msg 340 171 5; +#X text 375 171 set tempo and start; +#X text 174 424 set tempo and start; #X connect 2 0 1 0; -#X connect 5 0 0 0; -#X connect 6 0 0 0; -#X connect 7 0 0 0; -#X connect 9 0 16 0; -#X connect 12 0 10 0; -#X connect 17 0 27 0; -#X connect 18 0 15 0; -#X connect 19 0 15 0; -#X connect 23 0 0 0; -#X connect 24 0 15 0; -#X connect 26 0 27 0; -#X connect 27 0 15 0; -#X connect 28 0 15 0; +#X connect 3 0 2 0; +#X connect 5 0 1 0; +#X connect 6 0 1 0; +#X connect 8 0 16 0; +#X connect 11 0 9 0; +#X connect 17 0 21 0; +#X connect 19 0 21 0; +#X connect 21 0 15 0; +#X connect 22 0 1 0; +#X connect 23 0 22 0; +#X connect 24 0 22 0; diff --git a/doc/3.audio.examples/D14.vibrato.pd b/doc/3.audio.examples/D14.vibrato.pd index 1e09027c..3957418d 100644 --- a/doc/3.audio.examples/D14.vibrato.pd +++ b/doc/3.audio.examples/D14.vibrato.pd @@ -1,10 +1,10 @@ -#N canvas 389 74 717 685 12; +#N canvas 451 56 717 685 12; #X declare -stdpath ./; #X obj 55 235 r trigger; #X obj 55 453 *~; #X obj 55 481 *~; #X floatatom 93 283 4 0 100 0 - - - 0; -#X msg 478 486 \; trigger 0; +#X msg 478 489 \; trigger 0; #X obj 55 258 unpack; #X floatatom 55 283 4 0 100 0 - - - 0; #X obj 55 534 +~ 0.3; @@ -14,7 +14,7 @@ #X obj 93 329 sqrt; #X obj 93 351 sqrt; #X msg 478 409 \; trigger 1 60; -#X msg 478 446 \; trigger 1 72; +#X msg 478 449 \; trigger 1 72; #X obj 55 423 *~; #X obj 225 389 +~ 1; #N canvas 0 0 450 300 (subpatch) 0; @@ -26,32 +26,26 @@ #X floatatom 225 276 5 0 0 0 - - - 0; #X obj 225 303 / 6; #X obj 225 365 *~; -#X floatatom 379 305 4 0 0 0 - - - 0; -#X text 244 426 since we'll multiply \,; -#X text 243 441 vibrato output should; -#X text 243 458 be centered at 1 \, not 0; -#X text 261 369 multiply by vib depth; -#X obj 379 333 / 6923; +#X floatatom 366 305 4 0 0 0 - - - 0; +#X obj 366 333 / 6923; #X text 89 424 apply vibrato; -#X text 93 452 fourth; -#X text 96 468 power; #X text 117 530 waveform; #X text 118 510 simple; -#X text 431 335 4/(exp(log(2)/1200)-1); -#X text 435 316 conversion factor is; -#X text 372 267 vibrato depth; -#X text 371 284 in cents; -#X text 216 238 vibrato speed; -#X text 215 255 in Hertz; -#X obj 55 376 adsr 0 100 200 100 300; #X obj 55 592 output~; #X text 25 56 Portamento can be treated as a special case of an ADSR envelope \, with 100 percent sustain. Vibrato is properly computed in units of pitch \, but it's also possible to do the job without having to convert from pitch to frequency units at the audio rate. To do this we just raise the "pitch" to the fourth power \, so that it acts pseudo-exponentially. Rather than add vibrato to the ADSR output \, we multiply a signal which controls relative frequency. The relative frequency change is one plus an oscillator., f 94; #X text 25 152 The table below holds 6 cycles of vibrato with small variations to get a not-exactly-repeating vibrato. We thus have to divide vibrato frequency by six. You can just use a sine or triangle wave if you prefer., f 94; #X obj 238 622 declare -stdpath ./; #X text 576 414 <-- middle C; -#X text 576 452 <-- octave up; -#X text 550 493 <-- release is optional, f 11; +#X text 576 455 <-- octave up; +#X text 565 496 <-- release is optional, f 11; #X obj 54 15 cnv 5 5 25 empty empty Using\ ADSR\ Envelopes\ for\ Portamento\ and\ Vibrato 15 13 0 16 #dfdfdf #202020 0; +#X obj 55 376 adsr 0 100 0 100 300; +#X text 90 460 fourth power, f 6; +#X text 359 267 vibrato depth in cents, f 13; +#X text 216 238 vibrato speed in Hertz, f 13; +#X text 423 325 conversion factor is 4/(exp(log(2)/1200)-1), f 22; +#X text 258 366 multiply by vibrato depth; +#X text 265 387 since we'll multiply \, vibrato output should be centered at 1 \, not 0!, f 24; #X connect 0 0 5 0; #X connect 1 0 2 0; #X connect 1 0 2 1; @@ -59,13 +53,13 @@ #X connect 3 0 10 0; #X connect 5 0 6 0; #X connect 5 1 3 0; -#X connect 6 0 39 0; +#X connect 6 0 35 0; #X connect 7 0 8 0; -#X connect 8 0 40 0; +#X connect 8 0 27 0; #X connect 9 0 7 0; #X connect 10 0 11 0; #X connect 11 0 12 0; -#X connect 12 0 39 1; +#X connect 12 0 35 1; #X connect 15 0 1 0; #X connect 15 0 1 1; #X connect 16 0 15 1; @@ -73,6 +67,6 @@ #X connect 19 0 20 0; #X connect 20 0 18 0; #X connect 21 0 16 0; -#X connect 22 0 27 0; -#X connect 27 0 21 1; -#X connect 39 0 15 0; +#X connect 22 0 23 0; +#X connect 23 0 21 1; +#X connect 35 0 15 0; diff --git a/doc/3.audio.examples/E01.spectrum.pd b/doc/3.audio.examples/E01.spectrum.pd index b38a176f..bc6f5ff8 100644 --- a/doc/3.audio.examples/E01.spectrum.pd +++ b/doc/3.audio.examples/E01.spectrum.pd @@ -1,15 +1,14 @@ -#N canvas 372 54 733 774 12; +#N canvas 444 62 733 767 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array E01-signal 882 float 0; #X coords 0 6 882 -6 247 147 1 0 0; -#X restore 417 49 graph; -#X obj 119 338 hip~ 5; +#X restore 424 49 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array E01-spectrum 90 float 0; #X coords 0 4300 89 -40 255 130 1 0 0; -#X restore 412 290 graph; -#N canvas 310 109 540 689 fft 0; +#X restore 419 290 graph; +#N canvas 310 109 526 363 fft 0; #X obj 163 92 inlet~; #X obj 298 92 inlet; #X obj 163 122 rfft~; @@ -21,17 +20,7 @@ #X text 53 122 Fourier series; #X text 36 10 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later., f 66; #X text 31 93 signal to analyze; -#X obj 176 481 samplerate~; -#X obj 176 455 bng 18 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X floatatom 176 533 5 0 0 0 - - - 0; -#X obj 176 506 / 256; -#X obj 176 431 loadbang; -#X floatatom 176 615 9 0 0 0 - - - 0; -#X obj 184 561 s fundamental; -#X obj 176 588 ftom; -#X text 66 357 At load time \, calculate a good choice of fundamental frequency for showing spectra: the 16th bin in a 4096-point spectrum \, so SR*16/4096 or SR/256., f 62; #X text 355 87 "bang" into this inlet to graph it, f 18; -#X text 253 616 <-- just out of curiosity \, here's the pitch, f 17; #X obj 354 214 block~ 4096; #X text 79 214 delay two samples for better graphing, f 10; #X text 86 162 calculate magnitude, f 9; @@ -46,102 +35,122 @@ #X connect 4 0 5 0; #X connect 5 0 7 0; #X connect 7 0 6 0; -#X connect 11 0 14 0; -#X connect 12 0 11 0; -#X connect 13 0 17 0; -#X connect 13 0 18 0; -#X connect 14 0 13 0; -#X connect 15 0 12 0; -#X connect 18 0 16 0; -#X restore 131 303 pd fft; -#X text 472 207 ---- 0.02 seconds ----; -#X obj 191 268 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 119 372 output~; -#X obj 191 303 tabwrite~ E01-signal; -#X text 458 423 1; -#X text 504 423 2; -#X text 549 423 3; -#X text 595 423 4; -#X text 641 423 5; -#X text 413 423 0; -#X text 673 114 0; -#X obj 119 65 r fundamental; -#X obj 33 131 osc~; -#X obj 33 185 *~; -#X obj 76 131 osc~; -#X obj 76 185 *~; -#X obj 119 131 osc~; -#X obj 119 185 *~; -#X obj 162 131 osc~; -#X obj 162 185 *~; -#X obj 205 131 osc~; -#X obj 205 185 *~; -#X obj 248 131 osc~; -#X obj 248 185 *~; -#X text 547 17 WAVEFORM; -#X text 672 408 0; -#X text 670 287 1; -#X text 671 346 0.5; -#X text 25 643 The upper graph is just the (time domain) waveform \, about four periods long. The lower graph is the magnitude spectrum. Its peaks are the magnitudes of the partials. Note that a DC signal of amplitude one is considered a partial of magnitude 1 \, but the other partials \, which have peak amplitudes of 1 (and RMS 0.707) \, have peak magnitudes of only 0.5 in the spectrum., f 95; -#X obj 119 242 *~ 1; -#X text 85 242 sum; -#X obj 112 450 declare -stdpath ./; -#X text 214 267 <-- click to graph; -#X text 25 708 Here we're introducing a new feature: multiple signals connected to a signal inlet (as in the [*~ 1]) are added. This is the most convenient way to sum the six partials., f 95; -#X obj 51 160 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 94 160 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 137 160 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 180 160 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 223 160 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 266 160 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 672 46 6; -#X text 668 185 -6; -#X text 25 498 The next series of patches demonstrates various kinds of modulation: AM \, waveshaping \, and FM. We will need a tool for graphing spectra which is introduced here. In this patch the signal to be analyzed is a simple sum of up to six partials of a fundamental frequency (which is 172 Hz \, close to F below middle C \, if your sample rate happens to be 44100 Hz. The fundamental is chosen to agree with the analysis patch ([pd FFT]) and is computed within it., f 95; -#X obj 33 104 * 0; -#X obj 76 104 * 1; -#X obj 119 104 * 2; -#X obj 162 104 * 3; -#X obj 205 104 * 4; -#X obj 248 104 * 5; -#X text 25 577 The partials are the multipliers in the [*] objects and go from 0 through 5 \, where 0 means DC (or 0 Hz frequency) \, 1 is the fundamental \, and so on. The toggle switches allow you to turn them on and off separately. You have to press the "click to graph" button to update the two graphs., f 95; -#X text 290 160 <--; -#X text 316 160 On/Off for each partial, f 8; -#X text 538 262 SPECTRAL ANALYSIS; -#X text 449 452 ------ partial number ------; -#X obj 26 17 cnv 5 5 25 empty empty Graphing\ Spectra\ of\ Audio\ Signals 15 13 0 16 #dfdfdf #202020 0; -#X connect 1 0 6 0; -#X connect 5 0 3 1; -#X connect 5 0 7 0; -#X connect 15 0 47 0; -#X connect 15 0 48 0; -#X connect 15 0 49 0; -#X connect 15 0 50 0; -#X connect 15 0 51 0; -#X connect 15 0 52 0; +#X restore 138 348 pd fft; +#X text 479 207 ---- 0.02 seconds ----; +#X obj 198 313 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 126 393 output~; +#X obj 198 348 tabwrite~ E01-signal; +#X text 465 423 1; +#X text 511 423 2; +#X text 556 423 3; +#X text 602 423 4; +#X text 648 423 5; +#X text 420 423 0; +#X text 680 114 0; +#X obj 40 156 osc~; +#X obj 40 210 *~; +#X obj 83 156 osc~; +#X obj 83 210 *~; +#X obj 126 156 osc~; +#X obj 126 210 *~; +#X obj 169 156 osc~; +#X obj 169 210 *~; +#X obj 212 156 osc~; +#X obj 212 210 *~; +#X obj 255 156 osc~; +#X obj 255 210 *~; +#X text 554 17 WAVEFORM; +#X text 679 408 0; +#X text 677 287 1; +#X text 678 346 0.5; +#X text 38 638 The upper graph is just the (time domain) waveform \, about four periods long. The lower graph is the magnitude spectrum. Its peaks are the magnitudes of the partials. Note that a DC signal of amplitude one is considered a partial of magnitude 1 \, but the other partials \, which have peak amplitudes of 1 (and RMS 0.707) \, have peak magnitudes of only 0.5 in the spectrum., f 95; +#X obj 126 267 *~ 1; +#X text 92 267 sum; +#X text 38 704 Here we're introducing a new feature: multiple signals connected to a signal inlet (as in the [*~ 1]) are added. This is the most convenient way to sum the six partials., f 95; +#X obj 58 185 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 101 185 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 144 185 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 187 185 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 230 185 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 273 185 tgl 18 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X text 679 46 6; +#X text 675 185 -6; +#X obj 40 129 * 0; +#X obj 83 129 * 1; +#X obj 126 129 * 2; +#X obj 169 129 * 3; +#X obj 212 129 * 4; +#X obj 255 129 * 5; +#X text 297 185 <--; +#X text 323 185 On/Off for each partial, f 8; +#X text 545 262 SPECTRAL ANALYSIS; +#X text 456 452 ------ partial number ------; +#X obj 29 18 cnv 5 5 25 empty empty Graphing\ Spectra\ of\ Audio\ Signals 15 13 0 16 #dfdfdf #202020 0; +#N canvas 257 117 386 482 init 0; +#X obj 84 196 samplerate~; +#X obj 84 170 bng 18 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X floatatom 84 248 8 0 0 0 - - - 0; +#X obj 84 221 / 256; +#X obj 84 146 loadbang; +#X floatatom 84 330 9 0 0 0 - - - 0; +#X obj 92 276 s fundamental; +#X obj 84 303 ftom; +#X text 44 54 At load time \, calculate a good choice of fundamental frequency for showing spectra: the 16th bin in a 4096-point spectrum \, so SR*16/4096 or SR/256., f 42; +#X text 161 330 <-- just out of curiosity \, here's the pitch, f 18; +#X obj 109 423 declare -stdpath ./; +#X text 198 275 <-- send to number box, f 11; +#X text 43 16 This subpatch initializes the patch.; +#X connect 0 0 3 0; +#X connect 1 0 0 0; +#X connect 2 0 6 0; +#X connect 2 0 7 0; +#X connect 3 0 2 0; +#X connect 4 0 1 0; +#X connect 7 0 5 0; +#X restore 316 127 pd init; +#X floatatom 126 90 8 0 0 0 - - - 0; +#X obj 198 260 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 223 259 <-- graph repeatedly; +#X text 221 313 <-- graph once; +#X text 38 493 This next series of patches demonstrates various kinds of modulation: AM \, waveshaping \, and FM. We will need a tool for graphing spectra which is introduced here. In this patch the signal to be analyzed is a simple sum of up to six partials of a fundamental frequency \, which is 172 Hz (close to F below middle C \, if your sample rate happens to be 44100 Hz). The fundamental is chosen to agree with the analysis patch ([pd FFT]) and is computed within [pd init]., f 95; +#X text 38 572 The partials are the multipliers in the [*] objects and go from 0 through 5 \, where 0 means DC (or 0 Hz frequency) \, 1 is the fundamental \, and so on. The toggle switches allow you to turn them on and off separately. You have to press the "click to graph" button to update the two graphs or use the toggle button to graph repeatedly., f 95; +#X obj 198 285 metro 500; +#X obj 126 63 r fundamental; +#X connect 4 0 2 1; +#X connect 4 0 6 0; +#X connect 14 0 15 0; +#X connect 15 0 31 0; #X connect 16 0 17 0; -#X connect 17 0 33 0; +#X connect 17 0 31 0; #X connect 18 0 19 0; -#X connect 19 0 33 0; +#X connect 19 0 31 0; #X connect 20 0 21 0; -#X connect 21 0 33 0; +#X connect 21 0 31 0; #X connect 22 0 23 0; -#X connect 23 0 33 0; +#X connect 23 0 31 0; #X connect 24 0 25 0; -#X connect 25 0 33 0; -#X connect 26 0 27 0; -#X connect 27 0 33 0; -#X connect 33 0 3 0; -#X connect 33 0 1 0; -#X connect 33 0 7 0; -#X connect 38 0 17 1; -#X connect 39 0 19 1; -#X connect 40 0 21 1; -#X connect 41 0 23 1; -#X connect 42 0 25 1; -#X connect 43 0 27 1; -#X connect 47 0 16 0; -#X connect 48 0 18 0; -#X connect 49 0 20 0; -#X connect 50 0 22 0; -#X connect 51 0 24 0; -#X connect 52 0 26 0; +#X connect 25 0 31 0; +#X connect 31 0 2 0; +#X connect 31 0 6 0; +#X connect 31 0 5 0; +#X connect 34 0 15 1; +#X connect 35 0 17 1; +#X connect 36 0 19 1; +#X connect 37 0 21 1; +#X connect 38 0 23 1; +#X connect 39 0 25 1; +#X connect 42 0 14 0; +#X connect 43 0 16 0; +#X connect 44 0 18 0; +#X connect 45 0 20 0; +#X connect 46 0 22 0; +#X connect 47 0 24 0; +#X connect 54 0 42 0; +#X connect 54 0 43 0; +#X connect 54 0 44 0; +#X connect 54 0 45 0; +#X connect 54 0 46 0; +#X connect 54 0 47 0; +#X connect 55 0 60 0; +#X connect 60 0 4 0; +#X connect 61 0 54 0; diff --git a/doc/3.audio.examples/E02.ring.modulation.pd b/doc/3.audio.examples/E02.ring.modulation.pd index 6bf5692f..c5efb508 100644 --- a/doc/3.audio.examples/E02.ring.modulation.pd +++ b/doc/3.audio.examples/E02.ring.modulation.pd @@ -1,16 +1,16 @@ -#N canvas 425 38 743 743 12; +#N canvas 464 47 743 743 12; +#X declare -stdpath ./; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array E02-signal 882 float 0; #X coords 0 6 882 -6 257 131 1 0 0; #X restore 404 206 graph; -#X obj 115 490 hip~ 5; #N canvas 0 0 450 300 (subpatch) 0; #X array E02-spectrum 128 float 0; #X coords 0 4300 127 -40 257 130 1; #X restore 402 415 graph; -#X obj 189 469 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 115 531 output~; +#X obj 189 493 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 115 538 output~; #X text 433 548 1; #X text 467 548 2; #X text 499 548 3; @@ -20,40 +20,39 @@ #X text 625 548 7; #X text 401 548 0; #X text 666 263 0; -#X obj 116 174 r fundamental; -#X obj 29 232 osc~; -#X obj 29 282 *~; -#X obj 73 232 osc~; -#X obj 73 282 *~; -#X obj 116 232 osc~; -#X obj 116 282 *~; -#X obj 116 209 * 2; -#X obj 159 232 osc~; -#X obj 159 282 *~; -#X obj 202 232 osc~; -#X obj 202 282 *~; -#X obj 245 232 osc~; -#X obj 245 282 *~; -#X obj 29 209 * 0; -#X obj 73 209 * 1; -#X obj 159 209 * 3; -#X obj 202 209 * 4; -#X obj 245 209 * 5; +#X obj 29 256 osc~; +#X obj 29 306 *~; +#X obj 73 256 osc~; +#X obj 73 306 *~; +#X obj 116 256 osc~; +#X obj 116 306 *~; +#X obj 116 233 * 2; +#X obj 159 256 osc~; +#X obj 159 306 *~; +#X obj 202 256 osc~; +#X obj 202 306 *~; +#X obj 245 256 osc~; +#X obj 245 306 *~; +#X obj 29 233 * 0; +#X obj 73 233 * 1; +#X obj 159 233 * 3; +#X obj 202 233 * 4; +#X obj 245 233 * 5; #X text 562 176 WAVEFORM; #X text 550 392 SPECTRUM; #X text 662 531 0; #X text 660 410 1; #X text 661 469 0.5; -#X obj 116 359 *~; -#X text 307 240 partials; -#X obj 234 390 osc~; -#X floatatom 234 330 4 0 200 0 - - - 0; -#X obj 234 359 *; -#X obj 267 359 r freq-step; -#X obj 189 421 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 189 445 metro 500; +#X obj 116 383 *~; +#X text 307 264 partials; +#X obj 234 414 osc~; +#X floatatom 234 354 4 0 200 0 - - - 0; +#X obj 234 383 *; +#X obj 267 383 r freq-step; +#X obj 189 445 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 189 469 metro 500; #X text 63 628 If you choose a multiple of the fundamental as a modulation frequency (16 \, 32 \, 48 \, 64 \, ... "steps") the result is again periodic at the original frequency. If you select a half-integer times the fundamental (8 \, 24 \, 40 \, ... steps) the pitch drops by an octave and you get only odd partials. For most other settings you'll get an inharmonic complex of tones. These are sometimes heard as separate pitches and other times they seem to fuse into a single timbre with indeterminate pitch., f 89; -#N canvas 436 82 601 665 fft 0; +#N canvas 436 82 547 365 fft 0; #X obj 86 90 inlet~; #X obj 162 243 inlet; #X obj 96 121 rfft~; @@ -64,32 +63,17 @@ #X text 160 122 Fourier series; #X text 64 24 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later.; #X text 150 90 signal to analyze; -#X text 235 202 delay two samples; -#X text 234 218 for better graphing; -#X obj 91 466 samplerate~; -#X obj 91 443 bng 18 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X floatatom 91 523 5 0 0 0 - - - 0; -#X obj 91 499 / 256; -#X obj 91 419 loadbang; -#X floatatom 91 592 9 0 0 0 - - - 0; -#X obj 99 545 s fundamental; -#X obj 91 568 ftom; -#X text 70 353 At load time \, calculate a good choice of fundamental frequency for showing spectra: the 16th bin in a 4096-point spectrum \, so SR*16/4096 or SR/256., f 62; #X text 212 245 "bang" into this inlet to graph it; -#X floatatom 230 531 8 0 0 0 - - - 0; -#X obj 230 507 / 4096; -#X text 226 476 One bin is SR/4096:; -#X obj 230 553 s freq-step; #X obj 162 277 tabwrite~ E02-spectrum; #X obj 87 310 tabwrite~ E02-signal; #X obj 399 138 block~ 4096; -#X text 163 592 <-- just out of curiosity \, here's the fundamental pitch; #X text 398 113 Window size; #X text 163 157 calculate magnitude, f 9; +#X text 227 203 delay two samples for better graphing, f 19; #X connect 0 0 2 0; -#X connect 0 0 27 0; -#X connect 1 0 26 0; -#X connect 1 0 27 0; +#X connect 0 0 12 0; +#X connect 1 0 11 0; +#X connect 1 0 12 0; #X connect 2 0 3 0; #X connect 2 0 3 1; #X connect 2 1 4 0; @@ -97,73 +81,89 @@ #X connect 3 0 5 0; #X connect 4 0 5 0; #X connect 5 0 6 0; -#X connect 6 0 26 0; -#X connect 12 0 15 0; -#X connect 12 0 23 0; -#X connect 13 0 12 0; -#X connect 14 0 18 0; -#X connect 14 0 19 0; -#X connect 15 0 14 0; -#X connect 16 0 13 0; -#X connect 19 0 17 0; -#X connect 22 0 25 0; -#X connect 23 0 22 0; -#X restore 128 457 pd fft; +#X connect 6 0 11 0; +#X restore 128 481 pd fft; #X obj 490 27 declare -stdpath ./; -#X text 212 420 <-- graph repeatedly; -#X text 212 468 <-- graph once; -#X text 289 256 <-- On/Off; -#X obj 47 257 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 91 257 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 134 257 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 177 257 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 220 257 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 263 257 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X text 212 444 <-- graph repeatedly; +#X text 212 492 <-- graph once; +#X text 289 280 <-- On/Off; +#X obj 47 281 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 91 281 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 134 281 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 177 281 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 220 281 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 263 281 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X text 666 200 6; #X text 667 325 -6; #X text 433 579 ------ partial number --------; #X text 432 343 ------ 0.02 seconds ------; #X text 43 66 Now we ring modulate the signal by multiplying it by another sinusoid. The modulation frequency is controlled in steps of f/16 where "f" is the fundamental frequency \, giving roughly 11 Hz per step. Note that if the modulation frequency is set to zero we can't predict the overall amplitude because it depends on what phase the modulation oscillator happened to have at that moment., f 88; #X obj 85 21 cnv 5 5 25 empty empty Ring\ Modulation 15 13 0 16 #dfdfdf #202020 0; -#X text 294 286 modulation frequency in "steps" of f/16, f 10; -#X text 268 329 <--; -#X connect 1 0 4 0; -#X connect 3 0 47 1; -#X connect 14 0 28 0; -#X connect 14 0 29 0; -#X connect 14 0 21 0; -#X connect 14 0 30 0; -#X connect 14 0 31 0; -#X connect 14 0 32 0; +#X text 294 310 modulation frequency in "steps" of f/16, f 10; +#X text 268 353 <--; +#X floatatom 274 411 5 0 0 0 - - - 0; +#X obj 116 171 r fundamental; +#X floatatom 116 198 10 0 0 0 - - - 0; +#N canvas 876 61 416 495 init 0; +#X obj 84 196 samplerate~; +#X obj 84 170 bng 18 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X floatatom 84 248 8 0 0 0 - - - 0; +#X obj 84 221 / 256; +#X obj 84 146 loadbang; +#X floatatom 84 330 9 0 0 0 - - - 0; +#X obj 92 276 s fundamental; +#X obj 84 303 ftom; +#X text 44 54 At load time \, calculate a good choice of fundamental frequency for showing spectra: the 16th bin in a 4096-point spectrum \, so SR*16/4096 or SR/256., f 42; +#X text 161 330 <-- just out of curiosity \, here's the pitch, f 18; +#X obj 109 423 declare -stdpath ./; +#X text 198 275 <-- send to number box, f 11; +#X text 43 16 This subpatch initializes the patch \,; +#X connect 0 0 3 0; +#X connect 1 0 0 0; +#X connect 2 0 6 0; +#X connect 2 0 7 0; +#X connect 3 0 2 0; +#X connect 4 0 1 0; +#X connect 7 0 5 0; +#X restore 295 184 pd init; +#X connect 2 0 45 1; +#X connect 13 0 14 0; +#X connect 14 0 36 0; #X connect 15 0 16 0; -#X connect 16 0 38 0; +#X connect 16 0 36 0; #X connect 17 0 18 0; -#X connect 18 0 38 0; -#X connect 19 0 20 0; -#X connect 20 0 38 0; -#X connect 21 0 19 0; +#X connect 18 0 36 0; +#X connect 19 0 17 0; +#X connect 20 0 21 0; +#X connect 21 0 36 0; #X connect 22 0 23 0; -#X connect 23 0 38 0; +#X connect 23 0 36 0; #X connect 24 0 25 0; -#X connect 25 0 38 0; -#X connect 26 0 27 0; -#X connect 27 0 38 0; -#X connect 28 0 15 0; -#X connect 29 0 17 0; -#X connect 30 0 22 0; -#X connect 31 0 24 0; -#X connect 32 0 26 0; -#X connect 38 0 1 0; -#X connect 38 0 47 0; -#X connect 40 0 38 1; -#X connect 41 0 42 0; -#X connect 42 0 40 0; -#X connect 43 0 42 1; -#X connect 44 0 45 0; -#X connect 45 0 3 0; -#X connect 52 0 16 1; -#X connect 53 0 18 1; -#X connect 54 0 20 1; -#X connect 55 0 23 1; -#X connect 56 0 25 1; -#X connect 57 0 27 1; +#X connect 25 0 36 0; +#X connect 26 0 13 0; +#X connect 27 0 15 0; +#X connect 28 0 20 0; +#X connect 29 0 22 0; +#X connect 30 0 24 0; +#X connect 36 0 45 0; +#X connect 36 0 3 0; +#X connect 38 0 36 1; +#X connect 39 0 40 0; +#X connect 40 0 38 0; +#X connect 41 0 40 1; +#X connect 41 0 64 0; +#X connect 42 0 43 0; +#X connect 43 0 2 0; +#X connect 50 0 14 1; +#X connect 51 0 16 1; +#X connect 52 0 18 1; +#X connect 53 0 21 1; +#X connect 54 0 23 1; +#X connect 55 0 25 1; +#X connect 65 0 66 0; +#X connect 66 0 26 0; +#X connect 66 0 27 0; +#X connect 66 0 19 0; +#X connect 66 0 28 0; +#X connect 66 0 29 0; +#X connect 66 0 30 0; diff --git a/doc/3.audio.examples/E04.difference.tone.pd b/doc/3.audio.examples/E04.difference.tone.pd index 8b3e2f7d..607c5609 100644 --- a/doc/3.audio.examples/E04.difference.tone.pd +++ b/doc/3.audio.examples/E04.difference.tone.pd @@ -1,25 +1,25 @@ #N canvas 487 47 651 515 12; #X declare -stdpath ./; #X obj 59 170 +~; -#X obj 59 350 output~; +#X obj 59 370 output~; #X obj 145 213 / 100; #X floatatom 145 188 5 0 500 0 - - - 0; -#X obj 59 303 clip~ -1 1; +#X obj 59 323 clip~ -1 1; #X floatatom 77 103 5 0 0 0 - - - 0; #X obj 59 277 *~; #X obj 77 57 loadbang; #X msg 145 163 50; #X obj 145 139 loadbang; -#X obj 59 31 osc~ 300; +#X obj 59 21 osc~ 300; #X msg 77 80 225; #X obj 77 133 osc~; #X obj 401 134 declare -stdpath ./; #X text 120 102 <-- frequency of second tone; #X text 193 188 <--; #X text 222 188 amplitude of sum before clipping, f 16; -#X text 197 240 This patch demonstrates how nonlinear distortion (also known as "waveshaping") can create difference tones from a pair of sinusoids. The sinusoids are initially tuned to 225 and 300 Hz \, a musical fourth \, and have amplitude of 50 percent (0.5) so that the sum is always less than 1 in absolute value. At these settings the [clip~] object passes its input through unchanged., f 55; -#X text 198 350 If the amplitude rises above 50 percent \, the [clip~] object starts altering the signal nonlinearly \, and the result is no longer as if the two sinusoids had been processed separately. Instead \, they "intermodulate" \, finding a common subharmonic if one exists. At 300 and 225 Hz \, the subharmonic is at 75 \, two octaves below the upper tone and a twelfth below the lower one. Change the frequency of the second tone and you will hear a variety of effects., f 55; -#X obj 166 43 cnv 5 5 25 empty empty Nonlinear\ Distortion\ and\ Difference\ Tones 15 13 0 16 #dfdfdf #202020 0; +#X text 212 240 This patch demonstrates how nonlinear distortion (also known as "waveshaping") can create difference tones from a pair of sinusoids. The sinusoids are initially tuned to 225 and 300 Hz \, a musical fourth \, and have amplitude of 50 percent (0.5) so that the sum is always less than 1 in absolute value. At these settings the [clip~] object passes its input through unchanged., f 55; +#X text 213 350 If the amplitude rises above 50 percent \, the [clip~] object starts altering the signal nonlinearly \, and the result is no longer as if the two sinusoids had been processed separately. Instead \, they "intermodulate" \, finding a common subharmonic if one exists. At 300 and 225 Hz \, the subharmonic is at 75 \, two octaves below the upper tone and a twelfth below the lower one. Change the frequency of the second tone and you will hear a variety of effects., f 55; +#X obj 167 42 cnv 5 5 25 empty empty Nonlinear\ Distortion\ and\ Difference\ Tones 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 6 0; #X connect 2 0 6 1; #X connect 3 0 2 0; diff --git a/doc/3.audio.examples/E05.chebyshev.pd b/doc/3.audio.examples/E05.chebyshev.pd index 4af80e5b..bb33f548 100644 --- a/doc/3.audio.examples/E05.chebyshev.pd +++ b/doc/3.audio.examples/E05.chebyshev.pd @@ -1,20 +1,20 @@ -#N canvas 334 99 663 561 12; +#N canvas 374 67 930 660 12; #X declare -stdpath ./; -#X obj 34 360 output~; -#X obj 52 124 / 100; -#X floatatom 52 100 5 0 100 0 - - - 0; -#X obj 34 205 *~; -#X obj 34 73 osc~ 220; -#X obj 52 150 pack 0 50; -#X obj 52 177 line~; -#X text 119 114 hundredths; -#X obj 34 235 *~ 128; -#X obj 34 293 tabread4~ E05-tab; +#X obj 60 485 output~; +#X obj 129 155 / 100; +#X floatatom 129 131 5 0 100 0 - - - 0; +#X obj 111 236 *~; +#X obj 50 149 osc~ 220; +#X obj 129 181 pack 0 50; +#X obj 129 208 line~; +#X text 196 145 hundredths; +#X obj 111 266 *~ 128; +#X obj 111 334 tabread4~ E05-tab; #N canvas 0 0 450 300 (subpatch) 0; #X array E05-tab 259 float 1; -#A 0 1.29428 1 0.731356 0.487085 0.265966 0.0668144 -0.111528 -0.270176 -0.410202 -0.532652 -0.638542 -0.728844 -0.804502 -0.866436 -0.915518 -0.952603 -0.978506 -0.994019 -0.999902 -0.996889 -0.985682 -0.966955 -0.941362 -0.909525 -0.87204 -0.829481 -0.782396 -0.731311 -0.676722 -0.619108 -0.558926 -0.496607 -0.432564 -0.367188 -0.300848 -0.233896 -0.166664 -0.0994625 -0.0325871 0.0336857 0.0990982 0.163408 0.22639 0.287834 0.347547 0.405349 0.461077 0.51458 0.565722 0.61438 0.660444 0.703817 0.744413 0.782158 0.816989 0.848855 0.877715 0.903536 0.926298 0.945987 0.962602 0.976146 0.986633 0.994084 0.998528 1 0.998543 0.994206 0.987043 0.977117 0.964492 0.94924 0.931437 0.911165 0.888508 0.863555 0.836398 0.807134 0.775862 0.742682 0.707699 0.671021 0.632754 0.59301 0.5519 0.509538 0.466037 0.421512 0.376078 0.329851 0.282947 0.235482 0.18757 0.139328 0.0908676 0.0423039 -0.00625139 -0.0546875 -0.102895 -0.150766 -0.198194 -0.245075 -0.291307 -0.33679 -0.381427 -0.425123 -0.467786 -0.509325 -0.549655 -0.588691 -0.626354 -0.662567 -0.697254 -0.730347 -0.761777 -0.791483 -0.819403 -0.845483 -0.869671 -0.891918 -0.91218 -0.930418 -0.946595 -0.960681 -0.972646 -0.982468 -0.990127 -0.995608 -0.998902 -1 -0.998902 -0.995608 -0.990127 -0.982468 -0.972646 -0.960681 -0.946595 -0.930418 -0.91218 -0.891918 -0.869671 -0.845483 -0.819403 -0.791483 -0.761777 -0.730347 -0.697254 -0.662567 -0.626354 -0.588691 -0.549655 -0.509325 -0.467786 -0.425123 -0.381427 -0.33679 -0.291307 -0.245075 -0.198194 -0.150766 -0.102895 -0.0546875 -0.00625139 0.0423039 0.0908676 0.139328 0.18757 0.235482 0.282947 0.329851 0.376078 0.421512 0.466037 0.509538 0.5519 0.59301 0.632754 0.671021 0.707699 0.742682 0.775862 0.807134 0.836398 0.863555 0.888508 0.911165 0.931437 0.94924 0.964492 0.977117 0.987043 0.994206 0.998543 1 0.998528 0.994084 0.986633 0.976146 0.962602 0.945987 0.926298 0.903536 0.877715 0.848855 0.816989 0.782158 0.744413 0.703817 0.660444 0.61438 0.565722 0.51458 0.461077 0.405349 0.347547 0.287834 0.22639 0.163408 0.0990982 0.0336857 -0.0325871 -0.0994625 -0.166664 -0.233896 -0.300848 -0.367188 -0.432564 -0.496607 -0.558926 -0.619108 -0.676722 -0.731311 -0.782396 -0.829481 -0.87204 -0.909525 -0.941362 -0.966955 -0.985682 -0.996889 -0.999902 -0.994019 -0.978506 -0.952603 -0.915518 -0.866436 -0.804502 -0.728844 -0.638542 -0.532652 -0.410202 -0.270176 -0.111528 0.0668144 0.265966 0.487085 0.731356 1 1.29428; -#X coords 0 1 258 -1 200 140 1; -#X restore 230 105 graph; +#A 0 1.03137 1 0.968872 0.937988 0.907349 0.876953 0.846802 0.816895 0.787231 0.757812 0.728638 0.699707 0.671021 0.642578 0.61438 0.586426 0.558716 0.53125 0.504028 0.477051 0.450317 0.423828 0.397583 0.371582 0.345825 0.320312 0.295044 0.27002 0.245239 0.220703 0.196411 0.172363 0.14856 0.125 0.101685 0.0786133 0.0557861 0.0332031 0.0108643 -0.0112305 -0.0330811 -0.0546875 -0.0760498 -0.097168 -0.118042 -0.138672 -0.159058 -0.179199 -0.199097 -0.21875 -0.238159 -0.257324 -0.276245 -0.294922 -0.313354 -0.331543 -0.349487 -0.367188 -0.384644 -0.401855 -0.418823 -0.435547 -0.452026 -0.468262 -0.484253 -0.5 -0.515503 -0.530762 -0.545776 -0.560547 -0.575073 -0.589355 -0.603394 -0.617188 -0.630737 -0.644043 -0.657104 -0.669922 -0.682495 -0.694824 -0.706909 -0.71875 -0.730347 -0.741699 -0.752808 -0.763672 -0.774292 -0.784668 -0.7948 -0.804688 -0.814331 -0.82373 -0.832886 -0.841797 -0.850464 -0.858887 -0.867065 -0.875 -0.88269 -0.890137 -0.897339 -0.904297 -0.911011 -0.91748 -0.923706 -0.929688 -0.935425 -0.940918 -0.946167 -0.951172 -0.955933 -0.960449 -0.964722 -0.96875 -0.972534 -0.976074 -0.97937 -0.982422 -0.985229 -0.987793 -0.990112 -0.992188 -0.994019 -0.995605 -0.996948 -0.998047 -0.998901 -0.999512 -0.999878 -1 -0.999878 -0.999512 -0.998901 -0.998047 -0.996948 -0.995605 -0.994019 -0.992188 -0.990112 -0.987793 -0.985229 -0.982422 -0.97937 -0.976074 -0.972534 -0.96875 -0.964722 -0.960449 -0.955933 -0.951172 -0.946167 -0.940918 -0.935425 -0.929688 -0.923706 -0.91748 -0.911011 -0.904297 -0.897339 -0.890137 -0.88269 -0.875 -0.867065 -0.858887 -0.850464 -0.841797 -0.832886 -0.82373 -0.814331 -0.804688 -0.7948 -0.784668 -0.774292 -0.763672 -0.752808 -0.741699 -0.730347 -0.71875 -0.706909 -0.694824 -0.682495 -0.669922 -0.657104 -0.644043 -0.630737 -0.617188 -0.603394 -0.589355 -0.575073 -0.560547 -0.545776 -0.530762 -0.515503 -0.5 -0.484253 -0.468262 -0.452026 -0.435547 -0.418823 -0.401855 -0.384644 -0.367188 -0.349487 -0.331543 -0.313354 -0.294922 -0.276245 -0.257324 -0.238159 -0.21875 -0.199097 -0.179199 -0.159058 -0.138672 -0.118042 -0.097168 -0.0760498 -0.0546875 -0.0330811 -0.0112305 0.0108643 0.0332031 0.0557861 0.0786133 0.101685 0.125 0.14856 0.172363 0.196411 0.220703 0.245239 0.27002 0.295044 0.320312 0.345825 0.371582 0.397583 0.423828 0.450317 0.477051 0.504028 0.53125 0.558716 0.586426 0.61438 0.642578 0.671021 0.699707 0.728638 0.757812 0.787231 0.816895 0.846802 0.876953 0.907349 0.937988 0.968872 1 1.03137; +#X coords 0 1 258 -1 204 140 1; +#X restore 652 69 graph; #N canvas 352 38 835 723 make-table 0; #X obj 157 304 t b b; #X obj 229 329 f; @@ -158,28 +158,62 @@ #X connect 63 0 21 0; #X connect 64 0 32 0; #X connect 65 0 11 0; -#X restore 470 205 pd make-table; +#X restore 322 123 pd make-table; #X f 17; -#X obj 470 169 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 471 150 2; -#X text 501 150 3; -#X text 531 150 4; -#X text 560 151 5; -#X text 589 150 6; -#X obj 34 262 +~ 129; -#X obj 34 323 hip~ 5; -#X text 188 374 There is an audible "rolling" sound as the index changes for the higher degree polynomials \, because the amplitudes of the lower partials can rise and fall several times apiece as the index rises from zero to one., f 62; -#X text 188 437 Indices greater than one will try to read values outside the table (which would be clipped appropriately). Anyway \, the polynomials increase rapidly in value outside the interval from -1 to 1 that we are using here., f 62; -#X text 458 109 subpatch to calculate Chebychev polynomials, f 21; -#X obj 478 48 declare -stdpath ./; -#X obj 499 169 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 528 169 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 557 169 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 586 169 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 99 100 <-- index in; -#X obj 41 18 cnv 5 5 25 empty empty Waveshaphing\ with\ Chebyshev\ Polynomials 15 13 0 16 #dfdfdf #202020 0; -#X text 188 283 This patch demonstrates using Chebyshev polynomials (of the first kind) to generate pure harmonics using waveshaping. The pure harmonic only comes out when the index is one (top of the scale). Smaller indices will give various mixes of harmonics. The table initially holds the fifth Chebychev polynomial \, so you can get the fifth harmonic., f 62; -#X text 188 500 When you get tired of Chebyshev polynomials you can draw your own functions by hand and/or try other formulas., f 62; +#X obj 322 87 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 323 68 2; +#X text 353 68 3; +#X text 383 68 4; +#X text 412 69 5; +#X text 441 68 6; +#X obj 111 293 +~ 129; +#X text 293 400 Indices greater than one will try to read values outside the table (which would be clipped appropriately). Anyway \, the polynomials increase rapidly in value outside the interval from -1 to 1 that we are using here., f 43; +#X text 455 116 subpatch to calculate Chebychev polynomials, f 21; +#X obj 66 579 declare -stdpath ./; +#X obj 351 87 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 380 87 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 409 87 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 438 87 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 176 131 <-- index in; +#X obj 41 25 cnv 5 5 25 empty empty Waveshaphing\ with\ Chebyshev\ Polynomials 15 13 0 16 #dfdfdf #202020 0; +#X text 293 491 When you get tired of Chebyshev polynomials you can draw your own functions by hand and/or try other formulas., f 43; +#N canvas 58 38 450 300 (subpatch) 0; +#X array E05-signal 882 float 0; +#X coords 0 1 882 -1 204 140 1 0 0; +#X restore 652 255 graph; +#X text 679 408 ---- 0.02 seconds ----; +#N canvas 58 38 450 300 (subpatch) 0; +#X array E05-no-DC 882 float 0; +#X coords 0 1 882 -1 204 140 1 0 0; +#X restore 652 455 graph; +#X text 679 608 ---- 0.02 seconds ----; +#N canvas 295 275 450 300 graph 0; +#X obj 250 117 metro 500; +#X obj 250 180 tabwrite~ E05-signal; +#X obj 250 42 inlet; +#X obj 200 42 inlet; +#X obj 146 42 inlet~; +#X obj 200 211 tabwrite~ E05-no-DC; +#X obj 81 42 inlet~; +#X connect 0 0 1 0; +#X connect 0 0 5 0; +#X connect 2 0 0 0; +#X connect 3 0 1 0; +#X connect 3 0 5 0; +#X connect 4 0 1 0; +#X connect 6 0 5 0; +#X restore 94 444 pd graph; +#X obj 129 408 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 167 446 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 192 445 <-- graph repeatedly, f 10; +#X text 152 408 <-- graph once; +#X text 294 170 This patch demonstrates using Chebyshev polynomials (of the first kind) to generate pure harmonics using waveshaping. The pure harmonic only comes out when the index is one (top of the scale)., f 43; +#X text 293 246 Smaller indices will give various mixes of harmonics. The table initially holds the fifth Chebychev polynomial \, so you can get the fifth harmonic., f 43; +#X text 293 310 There's an audible "rolling" sound as the index changes for the higher degree polynomials \, because the amplitudes of the lower partials can rise and fall several times apiece as the index rises from zero to one., f 43; +#X text 293 542 Even though the [output~] abstraction has a builtin [hip~] object \, we include it in the patch to show that it is necessary to remove a DC offset that this technique generates \,, f 43; +#X obj 129 75 loadbang; +#X msg 129 103 25; +#X obj 60 404 hip~ 3; #X connect 1 0 5 0; #X connect 2 0 1 0; #X connect 3 0 8 0; @@ -187,11 +221,17 @@ #X connect 5 0 6 0; #X connect 6 0 3 1; #X connect 8 0 18 0; -#X connect 9 0 19 0; +#X connect 9 0 33 1; +#X connect 9 0 44 0; #X connect 12 0 11 0; #X connect 18 0 9 0; -#X connect 19 0 0 0; -#X connect 24 0 11 1; -#X connect 25 0 11 2; -#X connect 26 0 11 3; -#X connect 27 0 11 4; +#X connect 22 0 11 1; +#X connect 23 0 11 2; +#X connect 24 0 11 3; +#X connect 25 0 11 4; +#X connect 34 0 33 2; +#X connect 35 0 33 3; +#X connect 42 0 43 0; +#X connect 43 0 2 0; +#X connect 44 0 0 0; +#X connect 44 0 33 0; diff --git a/doc/3.audio.examples/E06.exponential.pd b/doc/3.audio.examples/E06.exponential.pd index f71b3776..e3d690ac 100644 --- a/doc/3.audio.examples/E06.exponential.pd +++ b/doc/3.audio.examples/E06.exponential.pd @@ -1,15 +1,14 @@ -#N canvas 352 48 872 723 12; +#N canvas 371 45 872 786 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array E06-signal 882 float 0; -#X coords 0 1.02 882 -1.02 200 130 1; -#X restore 540 242 graph; -#X obj 125 288 hip~ 5; +#X coords 0 1.02 882 -1.02 256 140 1; +#X restore 538 309 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array E06-spectrum 128 float 0; -#X coords 0 4300 127 -40 257 130 1; -#X restore 521 434 graph; -#N canvas 455 72 538 658 fft 0; +#X coords 0 4300 127 -40 257 140 1; +#X restore 538 546 graph; +#N canvas 455 72 527 377 fft 0; #X obj 62 86 inlet~; #X obj 251 237 inlet; #X obj 72 117 rfft~; @@ -24,32 +23,18 @@ #X text 126 86 signal to analyze; #X text 236 189 delay two samples; #X text 234 207 for better graphing; -#X obj 81 482 samplerate~; -#X obj 81 459 bng 18 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; -#X floatatom 81 549 5 0 0 0 - - - 0; -#X obj 81 525 / 256; -#X obj 81 435 loadbang; -#X floatatom 81 625 8 0 0 0 - - - 0; -#X obj 89 576 s fundamental; -#X obj 81 601 ftom; -#X text 79 376 At load time \, calculate a good choice of fundamental frequency for showing spectra: the 16th bin in a 4096-point spectrum \, so SR*16/4096 or SR/256.; -#X floatatom 256 557 5 0 0 0 - - - 0; -#X obj 256 533 / 4096; -#X text 252 509 One bin is SR/4096:; -#X obj 256 579 s freq-step; #X obj 251 320 tabwrite~ E06-spectrum; #X obj 62 320 tabwrite~ E06-signal; #X obj 263 282 metro 500; #X obj 263 259 inlet; #X text 316 257 toggle to graph repeatedly; #X text 305 237 bang to graph once; -#X text 143 624 <-- fundamental pitch; #X obj 375 134 block~ 4096; #X text 373 101 window size; #X connect 0 0 2 0; -#X connect 0 0 28 0; -#X connect 1 0 27 0; -#X connect 1 0 28 0; +#X connect 0 0 15 0; +#X connect 1 0 14 0; +#X connect 1 0 15 0; #X connect 2 0 3 0; #X connect 2 0 3 1; #X connect 2 1 4 0; @@ -57,49 +42,37 @@ #X connect 3 0 5 0; #X connect 4 0 5 0; #X connect 5 0 6 0; -#X connect 6 0 27 0; -#X connect 14 0 17 0; -#X connect 14 0 24 0; -#X connect 15 0 14 0; -#X connect 16 0 20 0; -#X connect 16 0 21 0; +#X connect 6 0 14 0; +#X connect 16 0 14 0; +#X connect 16 0 15 0; #X connect 17 0 16 0; -#X connect 18 0 15 0; -#X connect 21 0 19 0; -#X connect 23 0 26 0; -#X connect 24 0 23 0; -#X connect 29 0 27 0; -#X connect 29 0 28 0; -#X connect 30 0 29 0; -#X restore 189 286 pd fft; -#X text 562 375 ---- 0.02 seconds ----; -#X obj 208 258 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 125 326 output~; -#X text 552 567 1; -#X text 586 567 2; -#X text 618 567 3; -#X text 650 567 4; -#X text 683 567 5; -#X text 713 567 6; -#X text 744 567 7; -#X text 520 567 0; -#X text 571 586 -- partial number --; -#X text 742 296 0; -#X obj 124 58 r fundamental; -#X obj 124 87 osc~; -#X text 633 216 WAVEFORM; -#X text 637 413 SPECTRUM; -#X text 781 550 0; -#X text 779 429 1; -#X text 780 488 0.5; -#X obj 243 287 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X restore 165 493 pd fft; +#X text 579 458 ---- 0.02 seconds ----; +#X obj 184 465 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 139 532 output~; +#X text 568 689 1; +#X text 602 689 2; +#X text 634 689 3; +#X text 666 689 4; +#X text 699 689 5; +#X text 729 689 6; +#X text 760 689 7; +#X text 536 689 0; +#X text 799 370 0; +#X obj 139 293 osc~; +#X text 705 282 WAVEFORM; +#X text 727 523 SPECTRUM; +#X text 802 673 0; +#X text 800 541 1; +#X text 801 606 0.5; +#X obj 219 494 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #N canvas 0 0 450 300 (subpatch) 0; #X array E06-tab 1003 float 1; #A 0 1.01005 1 0.99005 0.980199 0.970446 0.960789 0.951229 0.941765 0.932394 0.923116 0.913931 0.904837 0.895834 0.88692 0.878095 0.869358 0.860708 0.852144 0.843665 0.83527 0.826959 0.818731 0.810584 0.802519 0.794534 0.786628 0.778801 0.771052 0.76338 0.755784 0.748264 0.740818 0.733447 0.726149 0.718924 0.71177 0.704688 0.697676 0.690734 0.683861 0.677057 0.67032 0.66365 0.657047 0.650509 0.644036 0.637628 0.631284 0.625002 0.618783 0.612626 0.606531 0.600496 0.594521 0.588605 0.582748 0.57695 0.571209 0.565525 0.559898 0.554327 0.548812 0.543351 0.537944 0.532592 0.527292 0.522046 0.516851 0.511709 0.506617 0.501576 0.496585 0.491644 0.486752 0.481909 0.477114 0.472367 0.467666 0.463013 0.458406 0.453845 0.449329 0.444858 0.440432 0.436049 0.431711 0.427415 0.423162 0.418952 0.414783 0.410656 0.40657 0.402524 0.398519 0.394554 0.390628 0.386741 0.382893 0.379083 0.375311 0.371577 0.367879 0.364219 0.360595 0.357007 0.353455 0.349938 0.346456 0.343008 0.339595 0.336216 0.332871 0.329559 0.32628 0.323033 0.319819 0.316637 0.313486 0.310367 0.307279 0.304221 0.301194 0.298197 0.29523 0.292293 0.289384 0.286505 0.283654 0.280832 0.278037 0.275271 0.272532 0.26982 0.267135 0.264477 0.261846 0.25924 0.256661 0.254107 0.251579 0.249075 0.246597 0.244143 0.241714 0.239309 0.236928 0.23457 0.232236 0.229925 0.227638 0.225373 0.22313 0.22091 0.218712 0.216536 0.214381 0.212248 0.210136 0.208045 0.205975 0.203926 0.201897 0.199888 0.197899 0.19593 0.19398 0.19205 0.190139 0.188247 0.186374 0.18452 0.182684 0.180866 0.179066 0.177284 0.17552 0.173774 0.172045 0.170333 0.168638 0.16696 0.165299 0.163654 0.162026 0.160414 0.158817 0.157237 0.155673 0.154124 0.15259 0.151072 0.149569 0.14808 0.146607 0.145148 0.143704 0.142274 0.140858 0.139457 0.138069 0.136695 0.135335 0.133989 0.132655 0.131336 0.130029 0.128735 0.127454 0.126186 0.12493 0.123687 0.122456 0.121238 0.120032 0.118837 0.117655 0.116484 0.115325 0.114178 0.113042 0.111917 0.110803 0.109701 0.108609 0.107528 0.106459 0.105399 0.10435 0.103312 0.102284 0.101266 0.100259 0.0992613 0.0982736 0.0972958 0.0963276 0.0953692 0.0944202 0.0934807 0.0925506 0.0916297 0.0907179 0.0898153 0.0889216 0.0880368 0.0871608 0.0862936 0.085435 0.0845849 0.0837432 0.08291 0.082085 0.0812682 0.0804596 0.079659 0.0788664 0.0780817 0.0773047 0.0765356 0.075774 0.07502 0.0742736 0.0735345 0.0728029 0.0720785 0.0713613 0.0706512 0.0699482 0.0692522 0.0685631 0.0678809 0.0672055 0.0665368 0.0658748 0.0652193 0.0645703 0.0639279 0.0632918 0.062662 0.0620385 0.0614212 0.0608101 0.060205 0.0596059 0.0590129 0.0584257 0.0578443 0.0572688 0.0566989 0.0561348 0.0555762 0.0550232 0.0544757 0.0539337 0.053397 0.0528657 0.0523397 0.0518189 0.0513033 0.0507928 0.0502874 0.0497871 0.0492917 0.0488012 0.0483156 0.0478349 0.0473589 0.0468877 0.0464212 0.0459593 0.045502 0.0450492 0.044601 0.0441572 0.0437178 0.0432828 0.0428521 0.0424257 0.0420036 0.0415857 0.0411719 0.0407622 0.0403566 0.0399551 0.0395575 0.0391639 0.0387742 0.0383884 0.0380064 0.0376283 0.0372538 0.0368832 0.0365162 0.0361528 0.0357931 0.035437 0.0350844 0.0347353 0.0343896 0.0340475 0.0337087 0.0333733 0.0330412 0.0327124 0.0323869 0.0320647 0.0317456 0.0314298 0.031117 0.0308074 0.0305009 0.0301974 0.0298969 0.0295994 0.0293049 0.0290133 0.0287246 0.0284388 0.0281559 0.0278757 0.0275983 0.0273237 0.0270518 0.0267827 0.0265162 0.0262523 0.0259911 0.0257325 0.0254765 0.025223 0.024972 0.0247235 0.0244775 0.024234 0.0239928 0.0237541 0.0235177 0.0232837 0.0230521 0.0228227 0.0225956 0.0223708 0.0221482 0.0219278 0.0217096 0.0214936 0.0212797 0.021068 0.0208584 0.0206508 0.0204453 0.0202419 0.0200405 0.0198411 0.0196437 0.0194482 0.0192547 0.0190631 0.0188734 0.0186856 0.0184997 0.0183156 0.0181334 0.017953 0.0177743 0.0175975 0.0174224 0.017249 0.0170774 0.0169075 0.0167392 0.0165727 0.0164078 0.0162445 0.0160829 0.0159229 0.0157644 0.0156076 0.0154523 0.0152985 0.0151463 0.0149956 0.0148464 0.0146986 0.0145524 0.0144076 0.0142642 0.0141223 0.0139818 0.0138427 0.0137049 0.0135686 0.0134336 0.0132999 0.0131675 0.0130365 0.0129068 0.0127784 0.0126512 0.0125254 0.0124007 0.0122773 0.0121552 0.0120342 0.0119145 0.0117959 0.0116786 0.0115624 0.0114473 0.0113334 0.0112206 0.011109 0.0109985 0.010889 0.0107807 0.0106734 0.0105672 0.0104621 0.010358 0.0102549 0.0101529 0.0100518 0.00995182 0.0098528 0.00975476 0.0096577 0.0095616 0.00946646 0.00937227 0.00927902 0.00918669 0.00909528 0.00900478 0.00891518 0.00882647 0.00873865 0.0086517 0.00856561 0.00848038 0.008396 0.00831246 0.00822975 0.00814786 0.00806679 0.00798652 0.00790705 0.00782838 0.00775048 0.00767337 0.00759701 0.00752142 0.00744658 0.00737249 0.00729913 0.0072265 0.0071546 0.00708341 0.00701293 0.00694315 0.00687406 0.00680567 0.00673795 0.0066709 0.00660453 0.00653881 0.00647375 0.00640933 0.00634556 0.00628242 0.00621991 0.00615802 0.00609675 0.00603608 0.00597602 0.00591656 0.00585769 0.0057994 0.0057417 0.00568457 0.00562801 0.00557201 0.00551657 0.00546167 0.00540733 0.00535353 0.00530026 0.00524752 0.0051953 0.00514361 0.00509243 0.00504176 0.00499159 0.00494193 0.00489275 0.00484407 0.00479587 0.00474815 0.00470091 0.00465413 0.00460782 0.00456197 0.00451658 0.00447164 0.00442715 0.0043831 0.00433948 0.00429631 0.00425356 0.00421123 0.00416933 0.00412785 0.00408677 0.00404611 0.00400585 0.00396599 0.00392653 0.00388746 0.00384878 0.00381048 0.00377257 0.00373503 0.00369786 0.00366107 0.00362464 0.00358857 0.00355287 0.00351752 0.00348252 0.00344786 0.00341356 0.00337959 0.00334597 0.00331267 0.00327971 0.00324708 0.00321477 0.00318278 0.00315111 0.00311976 0.00308871 0.00305798 0.00302755 0.00299743 0.0029676 0.00293808 0.00290884 0.0028799 0.00285124 0.00282287 0.00279478 0.00276698 0.00273944 0.00271219 0.0026852 0.00265848 0.00263203 0.00260584 0.00257991 0.00255424 0.00252883 0.00250366 0.00247875 0.00245409 0.00242967 0.00240549 0.00238156 0.00235786 0.0023344 0.00231117 0.00228818 0.00226541 0.00224287 0.00222055 0.00219846 0.00217658 0.00215492 0.00213348 0.00211225 0.00209124 0.00207043 0.00204983 0.00202943 0.00200924 0.00198925 0.00196945 0.00194986 0.00193045 0.00191125 0.00189223 0.0018734 0.00185476 0.0018363 0.00181803 0.00179994 0.00178203 0.0017643 0.00174675 0.00172937 0.00171216 0.00169512 0.00167826 0.00166156 0.00164502 0.00162866 0.00161245 0.00159641 0.00158052 0.0015648 0.00154923 0.00153381 0.00151855 0.00150344 0.00148848 0.00147367 0.00145901 0.00144449 0.00143012 0.00141589 0.0014018 0.00138785 0.00137404 0.00136037 0.00134683 0.00133343 0.00132016 0.00130703 0.00129402 0.00128115 0.0012684 0.00125578 0.00124328 0.00123091 0.00121866 0.00120654 0.00119453 0.00118265 0.00117088 0.00115923 0.00114769 0.00113627 0.00112497 0.00111377 0.00110269 0.00109172 0.00108086 0.0010701 0.00105946 0.00104891 0.00103848 0.00102814 0.00101791 0.00100779 0.000997758 0.00098783 0.000978001 0.00096827 0.000958635 0.000949097 0.000939653 0.000930303 0.000921047 0.000911882 0.000902808 0.000893825 0.000884932 0.000876127 0.000867409 0.000858778 0.000850233 0.000841773 0.000833397 0.000825105 0.000816895 0.000808767 0.000800719 0.000792752 0.000784864 0.000777055 0.000769323 0.000761668 0.000754089 0.000746586 0.000739157 0.000731803 0.000724521 0.000717312 0.000710174 0.000703108 0.000696112 0.000689185 0.000682328 0.000675539 0.000668817 0.000662162 0.000655574 0.00064905 0.000642592 0.000636198 0.000629868 0.000623601 0.000617396 0.000611253 0.000605171 0.000599149 0.000593188 0.000587285 0.000581442 0.000575656 0.000569928 0.000564257 0.000558643 0.000553084 0.000547581 0.000542133 0.000536738 0.000531398 0.00052611 0.000520875 0.000515692 0.000510561 0.000505481 0.000500451 0.000495472 0.000490542 0.000485661 0.000480829 0.000476044 0.000471307 0.000466618 0.000461975 0.000457378 0.000452827 0.000448321 0.000443861 0.000439444 0.000435072 0.000430743 0.000426456 0.000422213 0.000418012 0.000413853 0.000409735 0.000405658 0.000401622 0.000397626 0.000393669 0.000389752 0.000385874 0.000382034 0.000378233 0.00037447 0.000370744 0.000367055 0.000363402 0.000359786 0.000356206 0.000352662 0.000349153 0.000345679 0.000342239 0.000338834 0.000335463 0.000332125 0.00032882 0.000325548 0.000322309 0.000319102 0.000315927 0.000312783 0.000309671 0.00030659 0.000303539 0.000300519 0.000297529 0.000294568 0.000291637 0.000288735 0.000285862 0.000283018 0.000280202 0.000277414 0.000274654 0.000271921 0.000269215 0.000266536 0.000263884 0.000261259 0.000258659 0.000256085 0.000253537 0.000251014 0.000248517 0.000246044 0.000243596 0.000241172 0.000238772 0.000236396 0.000234044 0.000231716 0.00022941 0.000227127 0.000224867 0.00022263 0.000220415 0.000218221 0.00021605 0.0002139 0.000211772 0.000209665 0.000207579 0.000205513 0.000203468 0.000201444 0.000199439 0.000197455 0.00019549 0.000193545 0.000191619 0.000189713 0.000187825 0.000185956 0.000184106 0.000182274 0.00018046 0.000178665 0.000176887 0.000175127 0.000173384 0.000171659 0.000169951 0.00016826 0.000166586 0.000164928 0.000163287 0.000161663 0.000160054 0.000158461 0.000156885 0.000155324 0.000153778 0.000152248 0.000150733 0.000149233 0.000147748 0.000146278 0.000144823 0.000143382 0.000141955 0.000140543 0.000139144 0.00013776 0.000136389 0.000135032 0.000133688 0.000132358 0.000131041 0.000129737 0.000128446 0.000127168 0.000125903 0.00012465 0.00012341 0.000122182 0.000120966 0.000119763 0.000118571 0.000117391 0.000116223 0.000115067 0.000113922 0.000112788 0.000111666 0.000110555 0.000109455 0.000108366 0.000107287 0.00010622 0.000105163 0.000104117 0.00010308 0.000102055 0.000101039 0.000100034 9.90387e-05 9.80533e-05 9.70776e-05 9.61117e-05 9.51553e-05 9.42085e-05 9.32711e-05 9.23431e-05 9.14242e-05 9.05145e-05 8.96139e-05 8.87222e-05 8.78394e-05 8.69654e-05 8.61001e-05 8.52434e-05 8.43952e-05 8.35554e-05 8.27241e-05 8.1901e-05 8.1086e-05 8.02792e-05 7.94804e-05 7.86896e-05 7.79066e-05 7.71314e-05 7.6364e-05 7.56041e-05 7.48518e-05 7.4107e-05 7.33696e-05 7.26396e-05 7.19169e-05 7.12012e-05 7.04928e-05 6.97914e-05 6.9097e-05 6.84094e-05 6.77287e-05 6.70548e-05 6.63876e-05 6.5727e-05 6.5073e-05 6.44256e-05 6.37845e-05 6.31498e-05 6.25215e-05 6.18994e-05 6.12835e-05 6.06737e-05 6.007e-05 5.94723e-05 5.88805e-05 5.82947e-05 5.77146e-05 5.71403e-05 5.65718e-05 5.60089e-05 5.54516e-05 5.48998e-05 5.43536e-05 5.38128e-05 5.32773e-05 5.27472e-05 5.22224e-05 5.17027e-05 5.11883e-05 5.06789e-05 5.01747e-05 4.96754e-05 4.91812e-05 4.86918e-05 4.82073e-05 4.77276e-05 4.72527e-05 4.67826e-05 4.63171e-05; #A 1000 0 0 0; -#X coords 0 1 1002 0 180 100 1; -#X restore 538 75 graph; -#N canvas 352 106 412 285 make-table 0; +#X coords 0 1 1002 0 256 140 1; +#X restore 526 62 graph; +#N canvas 899 138 412 285 make-table 0; #X obj 142 98 t b b; #X obj 214 123 f; #X obj 252 123 + 1; @@ -124,44 +97,65 @@ #X connect 6 0 0 0; #X connect 7 0 10 0; #X connect 8 0 4 1; -#X restore 327 175 pd make-table; -#X text 383 105 waveshaping function; -#X text 722 167 0; -#X text 721 71 1; -#X obj 124 200 +~ 1; -#X obj 124 174 *~ 100; -#X obj 124 113 +~ 1; -#X floatatom 194 87 5 0 200 0 - - - 0; -#X obj 194 135 pack 0 50; -#X obj 194 159 line~; -#X text 266 103 tenths; -#X obj 194 112 / 10; -#X obj 124 147 *~; -#X obj 124 226 tabread4~ E06-tab; -#X text 742 236 1; -#X text 743 356 -1; -#X text 534 175 0; -#X text 701 177 10; -#X text 25 641 When the index of modulation exceeds 5 we scan past the right hand border of the table (the thousandth point \, corresponding to exp(-10). This isn't a problem because the values are all close to zero there., f 61; -#X text 25 401 Here we use an exponential function as a waveshaping transfer function. The theory is shown in detail in the accompanying book \, but in short \, we adjust the sinusoid so that \, as the index increases \, we scan starting from the left of the transfer function (previously the reading location grew from the center). The table contains exp(-x) with x varying from 0 to 10 When the index is zero \, the output is the constant 1 and the spectrum holds only DC. As the index grows \, the output is a sequence of steadily narrower pulses \, whose spectrum gets progressively fatter., f 61; -#X obj 686 21 declare -stdpath ./; -#X text 264 286 <-- repeatedly; -#X text 230 258 <-- graph once; -#X text 237 87 <-- index in; -#X text 25 549 Table lookup is prepared as follows. First add one to the sinusoid and adjust its amplitude according to index so it ranges from 0 to 2*index. Then adjust for the table's input scale (100 points per unit \, so multiply by 100) and add one to skip the interpolation point at the beginning of the table., f 61; -#X obj 42 14 cnv 5 5 25 empty empty Waveshaphing\ using\ Exponential\ Function 15 13 0 16 #dfdfdf #202020 0; -#X connect 1 0 6 0; -#X connect 5 0 3 1; -#X connect 17 0 18 0; -#X connect 18 0 32 0; -#X connect 24 0 3 2; -#X connect 30 0 39 0; -#X connect 31 0 30 0; -#X connect 32 0 38 0; -#X connect 33 0 37 0; -#X connect 34 0 35 0; -#X connect 35 0 38 1; -#X connect 37 0 34 0; -#X connect 38 0 31 0; -#X connect 39 0 3 0; -#X connect 39 0 1 0; +#X restore 666 33 pd make-table; +#X text 625 217 waveshaping function, f 11; +#X text 786 191 0; +#X text 785 55 1; +#X obj 139 406 +~ 1; +#X obj 139 380 *~ 100; +#X obj 139 319 +~ 1; +#X floatatom 215 312 6 0 50 0 - - - 0; +#X obj 215 341 pack 0 50; +#X obj 215 365 line~; +#X obj 139 353 *~; +#X obj 139 432 tabread4~ E06-tab; +#X text 799 308 1; +#X text 800 438 -1; +#X text 522 207 0; +#X text 769 209 10; +#X text 47 697 When the index of modulation exceeds 5 we scan past the right hand border of the table (the thousandth point \, corresponding to exp(-10). This isn't a problem because the values are all close to zero there., f 61; +#X text 240 493 <-- repeatedly; +#X text 206 465 <-- graph once; +#X obj 27 17 cnv 5 5 25 empty empty Waveshaphing\ using\ Exponential\ Function 15 13 0 16 #dfdfdf #202020 0; +#X obj 139 238 r fundamental; +#X floatatom 139 264 9 0 0 0 - - - 0; +#N canvas 805 262 462 481 init 0; +#X obj 157 422 declare -stdpath ./; +#X obj 206 221 samplerate~; +#X obj 206 194 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X floatatom 206 288 5 0 0 0 - - - 0; +#X obj 206 264 / 256; +#X obj 161 145 loadbang; +#X obj 206 324 s fundamental; +#X text 43 65 At load time \, calculate a good choice of fundamental frequency for showing spectra: the 16th bin in a 4096-point spectrum \, so SR*16/4096 or SR/256., f 52; +#X obj 161 358 s index; +#X text 44 25 This subpatch initializes the patch and loads values into number boxes., f 52; +#X msg 161 329 2.5; +#X connect 1 0 4 0; +#X connect 2 0 1 0; +#X connect 3 0 6 0; +#X connect 4 0 3 0; +#X connect 5 0 2 0; +#X connect 5 0 10 0; +#X connect 10 0 8 0; +#X restore 384 245 pd init; +#X text 579 718 ---- partial number ----; +#X text 44 58 Here we use an exponential function as a waveshaping transfer function. The theory is shown in detail in the accompanying book \, but in short \, we adjust the sinusoid so that \, as the index increases \, we scan starting from the left of the transfer function (previously the reading location grew from the center). The table contains exp(-x) with x varying from 0 to 10 When the index is zero \, the output is the constant 1 and the spectrum holds only DC. As the index grows \, the output is a sequence of steadily narrower pulses \, whose spectrum gets progressively fatter and the DC component descreases as you can see on the graphs., f 61; +#X text 47 605 Table lookup is prepared as follows. First add one to the sinusoid and adjust its amplitude according to index so it ranges from 0 to 2*index. Then adjust for the table's input scale (100 points per unit \, so multiply by 100) and add one to skip the interpolation point at the beginning of the table., f 61; +#X obj 218 287 hsl 162 19 0 50 0 0 empty index empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 266 313 <-- index; +#X connect 4 0 2 1; +#X connect 15 0 29 0; +#X connect 21 0 2 2; +#X connect 27 0 34 0; +#X connect 28 0 27 0; +#X connect 29 0 33 0; +#X connect 30 0 31 0; +#X connect 31 0 32 0; +#X connect 32 0 33 1; +#X connect 33 0 28 0; +#X connect 34 0 2 0; +#X connect 34 0 5 0; +#X connect 43 0 44 0; +#X connect 44 0 15 0; +#X connect 49 0 30 0; diff --git a/doc/3.audio.examples/E07.evenodd.pd b/doc/3.audio.examples/E07.evenodd.pd index 1ac88d1b..0c847f59 100644 --- a/doc/3.audio.examples/E07.evenodd.pd +++ b/doc/3.audio.examples/E07.evenodd.pd @@ -1,90 +1,93 @@ -#N canvas 349 38 894 710 12; +#N canvas 349 38 871 679 12; #X declare -stdpath ./; -#X obj 288 216 f; -#X obj 322 192 + 1; -#X obj 322 216 mod 11; +#X obj 288 186 f; +#X obj 322 162 + 1; +#X obj 322 186 mod 11; #N canvas 0 0 450 300 (subpatch) 0; #X array E07 11 float 2; #X coords 0 96 11 36 200 160 1 0 0; -#X restore 549 94 graph; -#X floatatom 348 98 5 10 999 0 - - - 0; +#X restore 550 74 graph; +#X floatatom 268 88 5 10 999 0 - - - 0; #X obj 288 288 mtof; -#X msg 85 208 1; -#X obj 155 410 *~; -#X obj 155 492 cos~; -#X obj 155 527 hip~ 5; -#X obj 155 461 +~ 0.1; -#X floatatom 117 249 0 0 0 0 - - - 0; -#X floatatom 216 250 0 0 200 0 - - - 0; -#X floatatom 150 249 0 0 999 0 - - - 0; -#X floatatom 183 249 0 0 999 0 - - - 0; +#X msg 85 178 1; +#X obj 155 380 *~; +#X obj 155 475 cos~; +#X obj 155 431 +~ 0.1; +#X floatatom 117 219 0 0 0 0 - - - 0; +#X floatatom 216 220 0 0 200 0 - - - 0; +#X floatatom 150 219 0 0 999 0 - - - 0; +#X floatatom 183 219 0 0 999 0 - - - 0; #X msg 276 399 0; #X msg 276 375 0.1; #X msg 276 424 0.25; -#X text 126 209 ADSR controls; -#X text 154 230 A; -#X text 187 230 D; -#X text 220 230 S; -#X floatatom 340 164 0 1 11 0 - - - 0; -#X obj 84 308 *~ 0.01; -#X obj 288 96 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 155 561 output~; -#X obj 84 275 adsr 70 10 90 50 500, f 24; +#X text 126 179 ADSR controls; +#X text 154 200 A; +#X text 187 200 D; +#X text 220 200 S; +#X floatatom 340 134 0 1 11 0 - - - 0; +#X obj 84 278 *~ 0.01; +#X obj 208 86 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 155 531 output~; +#X obj 84 245 adsr 70 10 90 50 500, f 24; #X obj 288 265 +; #X floatatom 323 265 5 -48 120 0 - - - 0; -#N canvas 763 374 531 210 make-table 0; +#N canvas 788 323 531 210 make-table 1; #X obj 111 86 loadbang; #X text 70 21 This patch loads a sequence of pitches into E07. The values are floating-point \, so we could use microtones (60.5 \, for example) if we wish.; #X msg 111 114 \; E07 0 54 55 57 63 61 67 71 57 70 61 63 \; E07 yticks 36 12 1 \; E07 ylabel 11.4 36 48 60 72 84 96; #X connect 0 0 2 0; -#X restore 609 274 pd make-table; -#X obj 49 180 sel 0; -#X msg 49 208 0; -#X text 106 230 level; +#X restore 645 42 pd make-table; +#X obj 49 150 sel 0; +#X msg 49 178 0; +#X text 106 200 level; #X obj 288 317 osc~; #X text 275 355 symmetry; #X text 309 397 even; #X text 316 423 odd; #X text 311 374 mixed; #X obj 288 241 tabread E07; -#X text 393 419 The metronome also triggers an ADSR envelope \, whose parameters may also be changed using the "level" \, "A" \, "D" \, and "S" controls., f 62; -#X obj 145 647 declare -stdpath ./; -#X text 209 95 ON/OFF -->; -#X text 390 98 <-- msec; -#X text 370 165 <-- increment; -#X text 364 265 <-- transpose; -#X text 393 472 The synthesis ([osc~] \, [*~] \, [+~ 0.1] and [cos~]) is a very simple application of the waveshaping technique. The [osc~] oscillator (whose amplitude depends on the ADSR generator) is used as an index into the [cos~] wavetable. An additional offset ("symmetry") controls how the oscillator's waveform is centered on the wavetable. If the offset is zero \, the oscillator reads into the (even) cosine function (producing only even harmonics). If the offset is 0.25 \, we read 1/4 wave into the cosine function: the result is an odd function and we get odd harmonics. Between the two we get mixtures of even and odd., f 62; -#X obj 288 128 metro 150; -#X text 393 324 This patch uses a stepping sequencer to control a waveshaping instrument. A metronome ([metro 150]) drives a counter ([f] \, [+ 1] \, and [mod 11]) which counts repeatedly through the 11 values which are read from the stored table ([tabread E07]). The values may be read in sequence \, by twos or threes \, etc. \, according to the "increment" parameter., f 62; -#X obj 72 31 cnv 5 5 25 empty empty Sequenced\ Waveshaphing\ Synthesizer 15 13 0 16 #dfdfdf #202020 0; +#X obj 145 617 declare -stdpath ./; +#X text 129 85 ON/OFF -->; +#X text 310 88 <-- msec; +#X text 370 135 <-- increment; +#X text 366 267 <-- transpose; +#X text 390 470 The synthesis ([osc~] \, [*~] \, [+~ 0.1] and [cos~]) is a very simple application of the waveshaping technique. The [osc~] oscillator (whose amplitude depends on the ADSR generator) is used as an index into the [cos~] wavetable. An additional offset ("symmetry") controls how the oscillator's waveform is centered on the wavetable. If the offset is zero \, the oscillator reads into the (even) cosine function (producing only even harmonics). If the offset is 0.25 \, we read 1/4 wave into the cosine function: the result is an odd function and we get odd harmonics. Between the two we get mixtures of even and odd., f 62; +#X obj 208 118 metro 150; +#X obj 61 21 cnv 5 5 25 empty empty Sequenced\ Waveshaphing\ Synthesizer 15 13 0 16 #dfdfdf #202020 0; +#X floatatom 288 213 5 0 0 0 - - - 0; +#X text 390 322 This patch uses a stepping sequencer to control a waveshaping instrument. A metronome ([metro 150]) drives a counter ([f] \, [+ 1] \, and [mod 11]) which counts repeatedly through the 11 values (0-10) which are read from the stored table ("E07"). The values may be read in sequence \, by twos or threes \, etc. \, according to the "increment" parameter., f 62; +#X floatatom 249 220 0 0 200 0 - - - 0; +#X text 252 200 R; +#X text 390 417 The metronome also triggers an ADSR envelope \, whose parameters may also be changed using the "level" \, "A" \, "D" \, "S" and "R" controls., f 62; #X connect 0 0 1 0; -#X connect 0 0 38 0; +#X connect 0 0 46 0; #X connect 1 0 2 0; #X connect 2 0 0 1; -#X connect 4 0 46 1; -#X connect 5 0 33 0; -#X connect 6 0 26 0; -#X connect 7 0 10 0; -#X connect 8 0 9 0; -#X connect 9 0 25 0; -#X connect 10 0 8 0; -#X connect 11 0 26 1; -#X connect 12 0 26 4; -#X connect 13 0 26 2; -#X connect 14 0 26 3; -#X connect 15 0 10 1; -#X connect 16 0 10 1; -#X connect 17 0 10 1; -#X connect 22 0 1 1; -#X connect 23 0 7 0; -#X connect 24 0 30 0; -#X connect 24 0 46 0; -#X connect 26 0 23 0; -#X connect 27 0 5 0; -#X connect 28 0 27 1; -#X connect 30 0 31 0; -#X connect 31 0 26 0; -#X connect 33 0 7 1; -#X connect 38 0 27 0; -#X connect 46 0 0 0; -#X connect 46 0 6 0; +#X connect 4 0 44 1; +#X connect 5 0 32 0; +#X connect 6 0 25 0; +#X connect 7 0 9 0; +#X connect 8 0 24 0; +#X connect 9 0 8 0; +#X connect 10 0 25 1; +#X connect 11 0 25 4; +#X connect 12 0 25 2; +#X connect 13 0 25 3; +#X connect 14 0 9 1; +#X connect 15 0 9 1; +#X connect 16 0 9 1; +#X connect 21 0 1 1; +#X connect 22 0 7 0; +#X connect 23 0 29 0; +#X connect 23 0 44 0; +#X connect 25 0 22 0; +#X connect 26 0 5 0; +#X connect 27 0 26 1; +#X connect 29 0 30 0; +#X connect 30 0 25 0; +#X connect 32 0 7 1; +#X connect 37 0 26 0; +#X connect 44 0 0 0; +#X connect 44 0 6 0; +#X connect 46 0 37 0; +#X connect 48 0 25 5; diff --git a/doc/3.audio.examples/E08.phase.mod.pd b/doc/3.audio.examples/E08.phase.mod.pd index 4c693b07..651636c9 100644 --- a/doc/3.audio.examples/E08.phase.mod.pd +++ b/doc/3.audio.examples/E08.phase.mod.pd @@ -1,72 +1,95 @@ -#N canvas 300 188 920 617 12; +#N canvas 343 49 918 651 12; #X declare -stdpath ./; #X obj 231 164 *~; -#X floatatom 231 107 4 0 0 0 - - - 0; +#X floatatom 231 107 4 0 0 0 - \$0-mod - 0; #X obj 319 144 line~; -#X floatatom 135 121 4 0 0 0 - - - 0; +#X floatatom 135 121 4 0 0 0 - \$0-carrier - 0; #X obj 135 247 cos~; #X obj 135 191 +~; -#X obj 231 132 osc~ 0; #X obj 319 118 pack 0 50; -#X floatatom 319 65 4 0 0 0 - - - 0; +#X floatatom 319 65 4 0 0 0 - \$0-index - 0; #X obj 319 92 / 100; -#X text 293 27 modulation index; -#X text 293 42 in hundredths; -#X text 132 78 carrier; -#X text 131 96 frequency; -#X text 216 83 frequency; -#X text 217 66 modulation; #X text 61 132 carrier; #X text 42 230 output; -#X text 56 397 Most implementations of "FM" actually use phase \, not frequency \, modulation \, because it extends in a more natural way to "multi-operator FM" with three or more oscillators., f 60; +#X text 56 417 Most implementations of "FM" actually use phase \, not frequency \, modulation \, because it extends in a more natural way to "multi-operator FM" with three or more oscillators., f 60; #X obj 135 148 phasor~; -#X obj 167 574 cos~; -#X obj 167 546 phasor~; -#X text 110 556 this:; -#X text 269 549 is the same; -#X text 270 568 as this:; -#X obj 385 561 osc~; +#X obj 341 599 cos~; +#X obj 341 571 phasor~; +#X text 284 581 this:; +#X text 443 574 is the same; +#X text 444 593 as this:; +#X obj 559 586 osc~; #N canvas 0 0 450 300 (subpatch) 0; #X array cos-out 441 float 0; -#X coords 0 1 440 -1 200 140 1 0 0; -#X restore 676 204 graph; -#X obj 250 263 tabwrite~ phase-out; -#X obj 240 290 tabwrite~ cos-out; -#X obj 135 322 output~; -#X text 531 392 The "modulation" index \, which in true FM is in units of Hertz \, is dimensionless for phase modulation. "Good" values tend to be between 0 and 1... in this patch the index is in hundredths., f 45; -#X obj 691 55 declare -stdpath ./; -#X obj 240 225 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X coords 0 1 440 -1 317 134 1 0 0; +#X restore 537 228 graph; +#X obj 135 335 output~; +#X text 541 412 The "modulation" index \, which in true FM is in units of Hertz \, is dimensionless for phase modulation. "Good" values tend to be between 0 and 1... in this patch the index is in hundredths., f 45; #N canvas 0 0 450 300 (subpatch) 0; #X array phase-out 441 float 0; -#X coords 0 1 440 0 200 140 1 0 0; -#X restore 432 204 graph; +#X coords 0 1 440 0 317 139 1 0 0; +#X restore 537 63 graph; #X obj 187 233 wrap~; -#X text 370 143 (the index is ramped to avoid clicks.); -#X text 413 332 0; -#X text 416 197 1; -#X text 661 199 1; -#X text 652 331 -1; +#X text 283 175 (the index is ramped to avoid clicks.), f 20; +#X text 518 191 0; +#X text 521 56 1; +#X text 522 223 1; +#X text 513 355 -1; #X text 63 147 phase -->; #X text 40 246 waveform -->; -#X text 264 225 <-- graph them; -#X text 56 453 To do phase modulation \, we split the "carrier oscillator" into its phase calculation ([phasor~]) and its waveform lookup ([cos~]). These together would be equivalent to an [osc~] object \, but the [+~] between them adds the modulating oscillator's output to the phase.; -#X text 530 476 We also have to use a [line~] object to smooth changes in the modulation index \, which wasn't necessary in the previous patch., f 46; +#X text 56 473 To do phase modulation \, we split the "carrier oscillator" into its phase calculation ([phasor~]) and its waveform lookup ([cos~]). These together would be equivalent to an [osc~] object \, but the [+~] between them adds the modulating oscillator's output to the phase.; +#X text 540 496 We also have to use a [line~] object to smooth changes in the modulation index \, which wasn't necessary in the previous patch., f 46; #X text 51 189 phase ---> modulation, f 10; #X obj 46 20 cnv 5 5 25 empty empty Phase\ Modulation 15 13 0 16 #dfdfdf #202020 0; +#X obj 206 265 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 245 294 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X text 266 293 <-- repeatedly; +#X text 228 265 <-- graph once; +#N canvas 455 72 538 384 graph 0; +#X obj 62 86 inlet~; +#X obj 251 237 inlet; +#X obj 263 259 inlet; +#X obj 148 131 inlet~; +#X obj 62 320 tabwrite~ cos-out; +#X obj 251 320 tabwrite~ phase-out; +#X obj 263 282 metro 250; +#X connect 0 0 4 0; +#X connect 1 0 4 0; +#X connect 1 0 5 0; +#X connect 2 0 6 0; +#X connect 3 0 5 0; +#X connect 6 0 4 0; +#X connect 6 0 5 0; +#X restore 171 293 pd graph; +#N canvas 951 219 362 391 init 0; +#X text 85 44 This subpatch initializes the patch and loads values into number boxes., f 30; +#X obj 105 304 declare -stdpath ./; +#X obj 113 117 loadbang; +#X msg 113 209 \; \$1-carrier 220 \; \$1-mod 110 \; \$1-index 50; +#X obj 113 179 f \$0; +#X obj 113 148 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X connect 2 0 5 0; +#X connect 4 0 3 0; +#X connect 5 0 4 0; +#X restore 308 353 pd init; +#X text 217 66 modulation frequency, f 10; +#X text 122 77 carrier frequency, f 9; +#X text 293 27 modulation index in hundredths, f 16; +#X obj 231 132 osc~; #X connect 0 0 5 1; -#X connect 1 0 6 0; +#X connect 1 0 44 0; #X connect 2 0 0 1; -#X connect 3 0 19 0; -#X connect 4 0 28 0; -#X connect 4 0 29 0; +#X connect 3 0 12 0; +#X connect 4 0 20 0; +#X connect 4 0 39 0; #X connect 5 0 4 0; -#X connect 5 0 34 0; -#X connect 6 0 0 0; -#X connect 7 0 2 0; -#X connect 8 0 9 0; -#X connect 9 0 7 0; -#X connect 19 0 5 0; -#X connect 21 0 20 0; -#X connect 32 0 27 0; -#X connect 32 0 28 0; -#X connect 34 0 27 0; +#X connect 5 0 23 0; +#X connect 6 0 2 0; +#X connect 7 0 8 0; +#X connect 8 0 6 0; +#X connect 12 0 5 0; +#X connect 14 0 13 0; +#X connect 23 0 39 1; +#X connect 35 0 39 2; +#X connect 36 0 39 3; +#X connect 44 0 0 0; diff --git a/doc/3.audio.examples/E09.FM.spectrum.pd b/doc/3.audio.examples/E09.FM.spectrum.pd index d9fba0a3..1b092ab1 100644 --- a/doc/3.audio.examples/E09.FM.spectrum.pd +++ b/doc/3.audio.examples/E09.FM.spectrum.pd @@ -1,15 +1,15 @@ -#N canvas 427 113 697 571 12; +#N canvas 427 113 693 639 12; #X declare -stdpath ./; -#X obj 146 239 *~; -#X obj 189 239 line~; -#X obj 71 240 cos~; -#X obj 71 215 +~; -#X obj 189 216 pack 0 50; -#X floatatom 189 168 4 0 0 0 - - - 0; -#X obj 189 192 / 100; -#X obj 71 190 phasor~; -#X obj 71 351 output~; -#N canvas 665 146 599 711 fft 0; +#X obj 162 381 *~; +#X obj 205 373 line~; +#X obj 87 382 cos~; +#X obj 87 357 +~; +#X obj 205 348 pack 0 50; +#X floatatom 205 300 4 0 100 0 - - - 0; +#X obj 205 324 / 100; +#X obj 87 332 phasor~; +#X obj 87 493 output~; +#N canvas 665 146 582 450 fft 0; #X obj 97 106 inlet~; #X obj 286 257 inlet; #X obj 113 137 rfft~; @@ -24,31 +24,21 @@ #X text 161 106 signal to analyze; #X text 271 209 delay two samples; #X text 269 227 for better graphing; -#X obj 133 532 samplerate~; -#X obj 133 509 bng 18 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X floatatom 133 581 5 0 0 0 - - - 0; -#X obj 133 555 / 256; -#X obj 133 485 loadbang; -#X obj 184 631 s fundamental; -#X text 86 426 At load time \, calculate a good choice of fundamental frequency for showing spectra: the 16th bin in a 4096-point spectrum \, so SR*16/4096 or SR/256.; #X obj 319 311 metro 500; #X obj 309 281 inlet; #X text 362 279 toggle to graph repeatedly; #X text 340 257 bang to graph once; #X obj 97 372 tabwrite~ E09-signal; #X obj 319 343 tabwrite~ E09-spectrum; -#X obj 133 603 t b f; -#X msg 133 631 \; cm 6; -#X text 138 671 set carrier multiplier after fundamental; #X obj 113 250 /~ 4096; #X msg 287 367 \; pd dsp 1; #X obj 401 149 block~ 4096; #X text 393 122 Window size; #X connect 0 0 2 0; -#X connect 0 0 25 0; -#X connect 1 0 25 0; -#X connect 1 0 26 0; -#X connect 1 0 31 0; +#X connect 0 0 18 0; +#X connect 1 0 18 0; +#X connect 1 0 19 0; +#X connect 1 0 21 0; #X connect 2 0 3 0; #X connect 2 0 3 1; #X connect 2 1 4 0; @@ -56,61 +46,71 @@ #X connect 3 0 5 0; #X connect 4 0 5 0; #X connect 5 0 6 0; -#X connect 6 0 30 0; -#X connect 14 0 17 0; +#X connect 6 0 20 0; +#X connect 14 0 18 0; +#X connect 14 0 19 0; #X connect 15 0 14 0; -#X connect 16 0 27 0; -#X connect 17 0 16 0; -#X connect 18 0 15 0; -#X connect 21 0 25 0; -#X connect 21 0 26 0; -#X connect 22 0 21 0; -#X connect 22 0 31 0; -#X connect 27 0 28 0; -#X connect 27 1 19 0; -#X connect 30 0 26 0; -#X restore 115 294 pd fft; -#X obj 134 270 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 175 294 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X connect 15 0 21 0; +#X connect 20 0 19 0; +#X restore 131 436 pd fft; +#X obj 150 412 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 191 436 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #N canvas 0 0 450 300 (subpatch) 0; #X array E09-signal 882 float 0; -#X coords 0 1.02 882 -1.02 200 80 1; -#X restore 411 89 graph; +#X coords 0 1.02 882 -1.02 259 130 1; +#X restore 376 195 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array E09-spectrum 259 float 0; #X coords 0 0.51 258 -0.008 259 130 1; -#X restore 361 238 graph; -#X text 429 175 ---- 0.02 seconds ----; -#X text 391 369 2; -#X text 422 369 4; -#X text 360 369 0; -#X text 332 117 WAVEFORM; -#X text 511 213 SPECTRUM; -#X text 621 354 0; -#X text 622 236 0.5; -#X obj 146 168 osc~; -#X obj 146 137 r fundamental; -#X text 224 168 index (x100); -#X text 454 369 6; -#X text 487 369 8; -#X text 515 369 10; -#X text 547 369 12; -#X text 579 369 14; -#X floatatom 71 109 3 0 15 0 - - - 0; -#X obj 71 166 *; -#X obj 71 80 r cm; -#X text 100 109 carrier harmonic #; -#X text 98 448 This patch measures the spectrum of two-operator phase modulation. The carrier frequency is initially six times the modulation frequency \, but you can change it with the "carrier harmonic #" control. Changing the index changes the relative strengths of the harmonics. Past a certain index (which depends on the carrier frequency) the lower sidebands begin to reflect about the left edge of the spectrum \, causing complicated interference effects., f 71; -#X obj 517 29 declare -stdpath ./; -#X text 196 293 <-- repeatedly; -#X text 156 270 <-- graph once; -#X obj 71 323 hip~ 5; -#X text 393 394 ------ partial number ------; -#X obj 46 26 cnv 5 5 25 empty empty Spectrum\ of\ Two-Operator\ Phase\ Modulation 15 13 0 16 #dfdfdf #202020 0; +#X restore 377 410 graph; +#X text 424 336 ---- 0.02 seconds ----; +#X text 407 541 2; +#X text 438 541 4; +#X text 376 541 0; +#X text 556 166 WAVEFORM; +#X text 527 385 SPECTRUM; +#X text 637 526 0; +#X text 638 408 0.5; +#X obj 162 310 osc~; +#X obj 162 262 r fundamental; +#X text 240 300 index (x100); +#X text 470 541 6; +#X text 503 541 8; +#X text 531 541 10; +#X text 563 541 12; +#X text 595 541 14; +#X floatatom 87 263 3 0 15 0 - cm - 0; +#X text 31 265 carrier harmonic #, f 11; +#X text 94 60 This patch measures the spectrum of two-operator phase modulation. The carrier frequency is initially six times the modulation frequency \, but you can change it with the "carrier harmonic #" control. Changing the index changes the relative strengths of the harmonics. Past a certain index (which depends on the carrier frequency) the lower sidebands begin to reflect about the left edge of the spectrum \, causing complicated interference effects., f 71; +#X text 212 435 <-- repeatedly; +#X text 172 412 <-- graph once; +#X text 409 566 ------ partial number ------; +#X obj 62 18 cnv 5 5 25 empty empty Spectrum\ of\ Two-Operator\ Phase\ Modulation 15 13 0 16 #dfdfdf #202020 0; +#N canvas 121 101 419 471 init 0; +#X obj 134 214 samplerate~; +#X obj 102 163 bng 18 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 134 241 / 256; +#X obj 102 135 loadbang; +#X obj 134 296 s fundamental; +#X text 44 45 At load time \, calculate a good choice of fundamental frequency for showing spectra: the 16th bin in a 4096-point spectrum \, so SR*16/4096 or SR/256., f 42; +#X msg 85 230 \; cm 6; +#X obj 93 344 declare -stdpath ./; +#X obj 102 186 t b b; +#X floatatom 134 268 9 0 0 0 - - - 0; +#X text 45 14 This subpatch initializes the patch.; +#X connect 0 0 2 0; +#X connect 1 0 8 0; +#X connect 2 0 9 0; +#X connect 3 0 1 0; +#X connect 8 0 6 0; +#X connect 8 1 0 0; +#X connect 9 0 4 0; +#X restore 249 502 pd init; +#X obj 87 308 *; #X connect 0 0 3 1; #X connect 1 0 0 1; #X connect 2 0 9 0; -#X connect 2 0 38 0; +#X connect 2 0 8 0; #X connect 3 0 2 0; #X connect 4 0 1 0; #X connect 5 0 6 0; @@ -120,8 +120,6 @@ #X connect 11 0 9 2; #X connect 22 0 0 0; #X connect 23 0 22 0; -#X connect 23 0 31 1; -#X connect 30 0 31 0; -#X connect 31 0 7 0; -#X connect 32 0 30 0; -#X connect 38 0 8 0; +#X connect 23 0 38 1; +#X connect 30 0 38 0; +#X connect 38 0 7 0; diff --git a/doc/3.audio.examples/E10.complex.FM.pd b/doc/3.audio.examples/E10.complex.FM.pd index 865e6659..f6bf19c8 100644 --- a/doc/3.audio.examples/E10.complex.FM.pd +++ b/doc/3.audio.examples/E10.complex.FM.pd @@ -1,4 +1,4 @@ -#N canvas 381 46 858 573 12; +#N canvas 497 41 789 590 12; #X declare -stdpath ./; #X obj 147 335 *~; #X obj 165 311 line~; @@ -9,7 +9,7 @@ #X obj 165 264 / 100; #X obj 71 208 phasor~; #X obj 129 493 output~; -#N canvas 298 189 621 664 fft 0; +#N canvas 298 189 609 386 fft 0; #X obj 84 81 inlet~; #X obj 273 232 inlet; #X obj 98 115 rfft~; @@ -24,28 +24,18 @@ #X text 148 81 signal to analyze; #X text 258 184 delay two samples; #X text 256 202 for better graphing; -#X obj 106 464 samplerate~; -#X obj 106 441 bng 18 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; -#X floatatom 106 511 5 0 0 0 - - - 0; -#X obj 106 487 / 256; -#X obj 106 417 loadbang; -#X obj 162 561 s fundamental; -#X text 74 350 At load time \, calculate a good choice of fundamental frequency for showing spectra: the 16th bin in a 4096-point spectrum \, so SR*16/4096 or SR/256.; #X obj 285 280 metro 500; #X obj 285 254 inlet; #X text 338 252 toggle to graph repeatedly; #X text 327 232 bang to graph once; -#X obj 106 533 t b f; #X obj 84 315 tabwrite~ E10-spectrum; #X obj 273 315 tabwrite~ E10-spectrum; -#X text 162 585 set carrier multiplier and modulation multipliers after fundamental, f 38; -#X msg 106 565 \; cm 8 \; m1 2 \; m2 3; #X obj 397 130 block~ 4096; #X text 395 103 Window size; #X connect 0 0 2 0; -#X connect 0 0 26 0; -#X connect 1 0 26 0; -#X connect 1 0 27 0; +#X connect 0 0 18 0; +#X connect 1 0 18 0; +#X connect 1 0 19 0; #X connect 2 0 3 0; #X connect 2 0 3 1; #X connect 2 1 4 0; @@ -53,37 +43,30 @@ #X connect 3 0 5 0; #X connect 4 0 5 0; #X connect 5 0 6 0; -#X connect 6 0 27 0; -#X connect 14 0 17 0; +#X connect 6 0 19 0; +#X connect 14 0 18 0; +#X connect 14 0 19 0; #X connect 15 0 14 0; -#X connect 16 0 25 0; -#X connect 17 0 16 0; -#X connect 18 0 15 0; -#X connect 21 0 26 0; -#X connect 21 0 27 0; -#X connect 22 0 21 0; -#X connect 25 0 29 0; -#X connect 25 1 19 0; -#X restore 196 452 pd fft; -#X obj 215 394 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 235 423 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X restore 178 452 pd fft; +#X obj 197 394 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 217 423 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #N canvas 0 0 450 300 (subpatch) 0; #X array E10-spectrum 259 float 0; #X coords 0 2100 258 -20 259 130 1; -#X restore 456 116 graph; -#X text 486 247 2; -#X text 517 247 4; -#X text 456 247 0; -#X text 588 90 SPECTRUM; -#X text 716 232 0; -#X text 717 114 0.5; +#X restore 429 299 graph; +#X text 459 430 2; +#X text 490 430 4; +#X text 429 430 0; +#X text 561 273 SPECTRUM; +#X text 689 415 0; +#X text 690 297 0.5; #X obj 147 207 osc~; #X obj 274 147 r fundamental; -#X text 549 247 6; -#X text 582 247 8; -#X text 610 247 10; -#X text 642 247 12; -#X text 674 247 14; +#X text 522 430 6; +#X text 555 430 8; +#X text 583 430 10; +#X text 615 430 12; +#X text 647 430 14; #X floatatom 71 93 4 0 15 0 - - - 0; #X obj 71 180 *; #X obj 71 66 r cm; @@ -104,17 +87,36 @@ #X text 260 115 mod 2; #X text 313 241 index2; #X obj 256 66 r m2; -#X text 380 346 Now we introduce a second modulator oscillator. The carrier is on the 8th harmonic and the two modulators are at 2 and 3 times the fundamental. When either index of modulation is zero \, changing the other index gives the familiar 2-operator FM result. But if index2 is nonzero (try around 10 \, for example) then sliding index1 upward from 0 introduces sidebands around each of the sidebands., f 63; -#X obj 623 21 declare -stdpath ./; -#X text 256 422 <-- repeatedly; -#X text 237 394 <-- graph once; -#X obj 129 452 hip~ 5; -#X text 472 275 -------- partial number --------; -#X obj 50 12 cnv 5 5 25 empty empty Spectrum\ of\ Complex\ Phase\ Modulation 15 13 0 16 #dfdfdf #202020 0; +#X text 238 422 <-- repeatedly; +#X text 219 394 <-- graph once; +#X text 445 458 -------- partial number --------; +#X obj 42 12 cnv 5 5 25 empty empty Spectrum\ of\ Complex\ Phase\ Modulation 15 13 0 16 #dfdfdf #202020 0; +#N canvas 241 111 402 454 init 0; +#X obj 134 214 samplerate~; +#X obj 102 163 bng 18 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 134 241 / 256; +#X obj 102 135 loadbang; +#X obj 134 296 s fundamental; +#X text 44 45 At load time \, calculate a good choice of fundamental frequency for showing spectra: the 16th bin in a 4096-point spectrum \, so SR*16/4096 or SR/256., f 42; +#X obj 93 344 declare -stdpath ./; +#X obj 102 186 t b b; +#X floatatom 134 268 9 0 0 0 - - - 0; +#X text 45 14 This subpatch initializes the patch.; +#X msg 74 248 \; cm 8 \; m1 2 \; m2 3; +#X connect 0 0 2 0; +#X connect 1 0 7 0; +#X connect 2 0 8 0; +#X connect 3 0 1 0; +#X connect 7 0 10 0; +#X connect 7 1 0 0; +#X connect 8 0 4 0; +#X restore 292 508 pd init; +#X text 436 72 Now we introduce a second modulator oscillator. The carrier is on the 8th harmonic and the two modulators are at 2 and 3 times the fundamental., f 38; +#X text 436 138 When either index of modulation is zero \, changing the other index gives the familiar 2-operator FM result. But if index2 is nonzero (try around 10 \, for example) then sliding index1 upward from 0 introduces sidebands around each of the sidebands., f 38; #X connect 0 0 3 1; #X connect 1 0 0 1; #X connect 2 0 9 0; -#X connect 2 0 50 0; +#X connect 2 0 8 0; #X connect 3 0 2 0; #X connect 4 0 1 0; #X connect 5 0 6 0; @@ -141,4 +143,3 @@ #X connect 41 0 40 0; #X connect 42 0 41 0; #X connect 45 0 42 0; -#X connect 50 0 8 0; diff --git a/doc/3.audio.examples/F01.pulse.pd b/doc/3.audio.examples/F01.pulse.pd index 9e823fe6..d606c22a 100644 --- a/doc/3.audio.examples/F01.pulse.pd +++ b/doc/3.audio.examples/F01.pulse.pd @@ -1,61 +1,63 @@ -#N canvas 438 149 897 731 12; +#N canvas 386 89 881 756 12; #X declare -stdpath ./; -#X obj 264 158 line~; -#X floatatom 170 105 4 0 0 0 - - - 0; -#X obj 246 364 cos~; +#X obj 264 188 line~; +#X floatatom 170 135 4 0 0 0 - - - 0; +#X obj 246 394 cos~; #N canvas 0 0 450 300 (subpatch) 0; #X array pulse-output 882 float 0; #X coords 0 1.02 882 -1.02 200 130 1; -#X restore 604 444 graph; -#X obj 264 134 pack 0 50; -#X floatatom 264 85 4 0 90 0 - - - 0; -#X text 97 104 frequency; -#X obj 170 156 -~ 0.5; -#X obj 246 219 *~; -#X obj 264 109 / 10; -#X obj 246 308 clip~ -0.5 0.5; -#X obj 246 505 hip~ 5; +#X restore 624 504 graph; +#X obj 264 164 pack 0 50; +#X floatatom 264 115 4 0 90 0 - - - 0; +#X text 97 134 frequency; +#X obj 170 186 -~ 0.5; +#X obj 246 249 *~; +#X obj 264 139 / 10; +#X obj 246 338 clip~ -0.5 0.5; +#X obj 246 535 hip~ 5; #N canvas 0 0 450 300 (subpatch) 0; #X array phase-output 882 float 0; #X coords 0 5 881 -5 200 175 1 0 0; -#X restore 604 57 graph; +#X restore 624 127 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array clip-output 882 float 0; #X coords 0 1.02 882 -1.02 200 130 1; -#X restore 604 290 graph; -#X text 43 156 phase -1/2 to 1/2; -#X text 78 131 phase 0 to 1; -#X obj 390 317 tabwrite~ phase-output; -#X obj 366 500 tabwrite~ pulse-output; -#X text 55 506 high pass filter to cut DC; -#X text 309 159 smooth it; -#X text 108 301 clip back to range -1/2 to 1/2, f 18; -#X text 87 350 cosine wave lookup (-1/2 and 1/2 give -1), f 22; -#X obj 387 392 tabwrite~ clip-output; -#X text 627 586 ---- 0.02 seconds ----; -#X obj 365 239 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 246 546 output~; -#X obj 246 407 +~ 1; -#X obj 246 450 *~ 0.5; -#X text 121 400 add one (range now from 0 to 2), f 16; -#X text 147 441 ...and now from 0 to 1, f 12; -#X text 65 631 This patch computes a pulse train \, with an "index" control that essentially squeezes the pulses. If "bandwidth" is zero you get a pure cosine wave \, and for larger values of the bandwidth \, the cosine wave is squeezed to fill smaller portions of the waveform., f 75; -#X text 299 83 index; -#X text 806 283 1; -#X text 808 408 -1; -#X text 808 448 1; -#X text 807 568 -1; -#X obj 61 566 declare -stdpath ./; -#X text 389 238 <-- click to graph; -#X obj 170 132 phasor~; -#X obj 170 48 loadbang; -#X text 809 49 5; -#X text 810 219 -5; -#X text 98 224 increase amplitude up to -5 and 5 range, f 20; -#X text 302 110 fix range (1 to 10); -#X msg 170 78 220; -#X obj 264 189 +~ 1; -#X obj 345 29 cnv 5 5 25 empty empty Pulse\ Generator 15 13 0 16 #dfdfdf #202020 0; +#X restore 624 350 graph; +#X text 43 186 phase -1/2 to 1/2; +#X text 78 161 phase 0 to 1; +#X obj 410 347 tabwrite~ phase-output; +#X obj 386 530 tabwrite~ pulse-output; +#X text 55 536 high pass filter to cut DC; +#X text 309 189 smooth it; +#X text 108 331 clip back to range -1/2 to 1/2, f 18; +#X text 87 380 cosine wave lookup (-1/2 and 1/2 give -1), f 22; +#X obj 407 422 tabwrite~ clip-output; +#X text 647 646 ---- 0.02 seconds ----; +#X obj 385 289 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 246 576 output~; +#X obj 246 437 +~ 1; +#X obj 246 480 *~ 0.5; +#X text 121 430 add one (range now from 0 to 2), f 16; +#X text 147 471 ...and now from 0 to 1, f 12; +#X text 47 655 This patch computes a pulse train \, with an "index" control that essentially squeezes the pulses. If "bandwidth" is zero you get a pure cosine wave \, and for larger values of the bandwidth \, the cosine wave is squeezed to fill smaller portions of the waveform., f 75; +#X text 299 113 index; +#X text 826 333 1; +#X text 828 458 -1; +#X text 828 498 1; +#X text 827 618 -1; +#X obj 650 40 declare -stdpath ./; +#X text 409 288 <-- click to graph; +#X obj 170 162 phasor~; +#X obj 170 78 loadbang; +#X text 829 119 5; +#X text 830 289 -5; +#X text 98 254 increase amplitude up to -5 and 5 range, f 20; +#X text 302 140 fix range (1 to 10); +#X msg 170 108 220; +#X obj 264 219 +~ 1; +#X obj 92 22 cnv 5 5 25 empty empty Pulse\ Generator 15 13 0 16 #dfdfdf #202020 0; +#X obj 385 227 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 385 256 metro 500; #X connect 0 0 45 0; #X connect 1 0 38 0; #X connect 2 0 26 0; @@ -78,3 +80,5 @@ #X connect 39 0 44 0; #X connect 44 0 1 0; #X connect 45 0 8 1; +#X connect 47 0 48 0; +#X connect 48 0 24 0; diff --git a/doc/3.audio.examples/F02.just.say.pd b/doc/3.audio.examples/F02.just.say.pd index 4027c69e..b17e4d1d 100644 --- a/doc/3.audio.examples/F02.just.say.pd +++ b/doc/3.audio.examples/F02.just.say.pd @@ -1,21 +1,20 @@ -#N canvas 455 76 710 648 12; +#N canvas 455 76 694 709 12; #X declare -stdpath ./; #X obj 128 402 cos~; #N canvas 0 22 450 278 (subpatch) 0; #X array env-output 44100 float 0; #X coords 0 1.02 44100 -1.02 200 130 1; -#X restore 416 181 graph; +#X restore 416 91 graph; #X obj 71 296 -~ 0.5; #X obj 128 344 *~; #X obj 128 371 clip~ -0.5 0.5; -#X obj 128 504 hip~ 5; #X obj 146 143 *~; #X floatatom 225 248 4 1 1000 0 - - - 0; #X floatatom 225 274 4 0 0 0 - - - 0; #X obj 146 105 phasor~ -4; #X obj 146 301 +~ 0.5; #X obj 182 204 tabwrite~ env-output; -#X text 415 316 --------- 1 second ---------; +#X text 415 226 --------- 1 second ---------; #X floatatom 225 300 4 0 0 0 - - - 0; #X obj 146 245 lop~ 130; #N canvas 704 266 342 431 freq 0; @@ -60,35 +59,58 @@ #X text 265 258 you can; #X text 263 276 adjust these; #X text 265 296 values; -#X text 346 373 We interrupt this series of patches to bring you an important message from Nancy Reagan. If \, anywhere \, at any time \, someone offers you an illicit drug \, just say one word in reply..., f 40; -#X text 346 471 Now that I'm sure you've heard this important message \, we can return to the essentially frivolous occupation of making turn-of-the-millennium western art music., f 40; +#X text 295 527 We interrupt this series of patches to bring you an important message from Nancy Reagan. If \, anywhere \, at any time \, someone offers you an illicit drug \, just say one word in reply..., f 47; +#X text 296 591 Now that I'm sure you've heard this important message \, we can return to the essentially frivolous occupation of making turn-of-the-millennium western art music., f 47; #X obj 146 272 *~ 6; -#X obj 128 546 output~; -#X obj 484 113 declare -stdpath ./; +#X obj 128 542 output~; +#X obj 484 23 declare -stdpath ./; #X obj 182 173 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X text 206 173 <-- click to graph; -#X text 231 97 negative frequency generates downwards ramps, f 25; +#X text 62 90 negative frequency generates downwards ramps, f 10; #X obj 128 433 +~ 1; #X obj 128 465 *~ 0.5; #X obj 81 34 cnv 5 5 25 empty empty Just\ Say\ One\ Word... 15 13 0 16 #dfdfdf #202020 0; -#X connect 0 0 30 0; +#X obj 209 446 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 236 475 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X text 257 474 <-- repeatedly; +#X text 231 446 <-- graph once; +#N canvas 298 189 432 298 graph 0; +#X obj 113 76 inlet~; +#X obj 179 76 inlet; +#X obj 241 76 inlet; +#X obj 112 183 tabwrite~ F02; +#X obj 241 122 metro 100; +#X connect 0 0 3 0; +#X connect 1 0 3 0; +#X connect 2 0 4 0; +#X connect 4 0 3 0; +#X restore 183 504 pd graph; +#N canvas 0 22 450 278 (subpatch) 0; +#X array F02 441 float 1; +#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.000934899 0.00399384 0.00916442 0.016421 0.0257295 0.037048 0.0503239 0.0654981 0.0825031 0.101265 0.1217 0.143721 0.167231 0.192129 0.218308 0.245657 0.274058 0.30339 0.333529 0.364349 0.395718 0.427505 0.459577 0.4918 0.52404 0.556161 0.588033 0.619521 0.650498 0.680834 0.710407 0.739096 0.766782 0.793355 0.818706 0.842733 0.86534 0.886437 0.905939 0.923769 0.939857 0.954141 0.966565 0.977082 0.985651 0.992241 0.996829 0.9994 0.999946 0.998468 0.994977 0.989488 0.982028 0.97263 0.961336 0.948193 0.933257 0.916592 0.898266 0.878357 0.856947 0.834122 0.809977 0.784611 0.758126 0.730629 0.702231 0.673047 0.643193 0.612789 0.581956 0.550817 0.519494 0.488111 0.456793 0.425662 0.394841 0.364449 0.334605 0.305425 0.277023 0.249506 0.222983 0.197554 0.173316 0.150363 0.12878 0.108649 0.0900462 0.0730406 0.0576954 0.0440673 0.0322062 0.0221542 0.0139472 0.00761372 0.00317565 0.000645965 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.000709087 0.00333789 0.00789398 0.014358 0.0227003 0.0328856 0.0448719 0.0586101 0.0740435 0.09111 0.109742 0.129864 0.151397 0.174256 0.19835 0.223586 0.249866 0.277087 0.305143 0.333926 0.363326 0.393229 0.423521 0.454087 0.48481 0.515573 0.54626 0.576755 0.606944 0.636713 0.66595 0.694547 0.722397 0.749397 0.775447 0.800451 0.824318 0.846959 0.868293 0.888241 0.906733 0.923702 0.939087 0.952834 0.964895 0.975227 0.983796 0.990572 0.995534 0.998667 0.999962 0.999416 0.997037 0.992834 0.986828 0.979042 0.969508 0.958265 0.945355 0.930829 0.914742 0.897156 0.878137 0.857756 0.83609 0.813219 0.789229 0.764206 0.738245 0.711439 0.683887 0.65569 0.626949 0.597768 0.568254 0.538512 0.508648 0.478771 0.448986 0.4194 0.390118 0.361243 0.332877 0.30512 0.278069 0.25182 0.226462 0.202085 0.178773 0.156607 0.135661 0.116008 0.0977153 0.0808438 0.0654512 0.0515881 0.0393001 0.0286285 0.0196073 0.0122647 0.00662357 0.00270107 0.000507981 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7.39992e-05 0.00146872 0.00462818 0.00953653 0.0161741 0.0245151 0.0345262 0.0461703 0.0594034 0.0741759 0.090434 0.108118 0.127164 0.147501 0.169059 0.191759 0.21552 0.240258 0.265884 0.29231 0.31944 0.347181 0.375436 0.404104 0.433088 0.462286 0.491598 0.520922 0.550158 0.579205 0.607963 0.636336; +#X coords 0 1 440 -1 200 140 1; +#X restore 417 296 graph; +#X text 425 443 ------- 0.1 second -------; +#X connect 0 0 29 0; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 4 0 0 0; -#X connect 5 0 25 0; -#X connect 6 0 14 0; -#X connect 6 0 11 0; -#X connect 7 0 14 1; -#X connect 8 0 24 1; -#X connect 9 0 6 0; -#X connect 9 0 6 1; -#X connect 10 0 3 1; -#X connect 13 0 10 1; -#X connect 14 0 24 0; +#X connect 5 0 13 0; +#X connect 5 0 10 0; +#X connect 6 0 13 1; +#X connect 7 0 23 1; +#X connect 8 0 5 0; +#X connect 8 0 5 1; +#X connect 9 0 3 1; +#X connect 12 0 9 1; +#X connect 13 0 23 0; +#X connect 14 0 15 0; #X connect 15 0 16 0; -#X connect 16 0 17 0; -#X connect 17 0 2 0; -#X connect 24 0 10 0; -#X connect 27 0 11 0; -#X connect 30 0 31 0; -#X connect 31 0 5 0; +#X connect 16 0 2 0; +#X connect 23 0 9 0; +#X connect 26 0 10 0; +#X connect 29 0 30 0; +#X connect 30 0 24 0; +#X connect 30 0 36 0; +#X connect 32 0 36 1; +#X connect 33 0 36 2; diff --git a/doc/3.audio.examples/F03.pulse.spectrum.pd b/doc/3.audio.examples/F03.pulse.spectrum.pd index d15263bf..2bdee356 100644 --- a/doc/3.audio.examples/F03.pulse.spectrum.pd +++ b/doc/3.audio.examples/F03.pulse.spectrum.pd @@ -1,22 +1,22 @@ -#N canvas 602 38 631 631 12; +#N canvas 509 45 619 675 12; #X declare -stdpath ./; -#X obj 193 184 line~; -#X obj 71 255 cos~; -#X obj 193 160 pack 0 50; -#X floatatom 147 59 4 0 100 0 - - - 0; -#X obj 71 131 -~ 0.5; -#X obj 71 168 *~; -#X obj 147 85 / 10; -#X obj 147 109 moses 0; -#X msg 147 133 0; -#X obj 71 231 clip~ -0.5 0.5; -#X text 192 59 bandwidth; -#X obj 193 209 +~ 1; -#X obj 71 279 +~ 1; -#X text 82 469 Here is a measured amplitude spectrum for the pulse train. Notice that \, other than a smallish spillover \, the energy sits in one "lobe" whose changing width justifies our calling the squeeze factor the "bandwidth.", f 68; -#X text 82 530 The spectrum is in units of amplitude. The sidelobes \, although they look small \, are actually only about 34 dB down. You can design more complicated pulse trains \, little Blackman window functions \, which control the sidelobes much better., f 68; -#X obj 71 375 output~; -#N canvas 715 281 537 493 fft 0; +#X obj 193 274 line~; +#X obj 71 353 cos~; +#X obj 193 250 pack 0 50; +#X floatatom 147 149 4 0 100 0 - - - 0; +#X obj 71 221 -~ 0.5; +#X obj 71 258 *~; +#X obj 147 175 / 10; +#X obj 147 199 moses 0; +#X msg 147 223 0; +#X obj 71 324 clip~ -0.5 0.5; +#X text 192 149 bandwidth; +#X obj 193 299 +~ 1; +#X obj 71 381 +~ 1; +#X text 66 59 Here is a measured amplitude spectrum for the pulse train. Notice that \, other than a smallish spillover \, the energy sits in one "lobe" whose changing width justifies our calling the squeeze factor the "bandwidth.", f 68; +#X text 86 577 The spectrum is in units of amplitude. The sidelobes \, although they look small \, are actually only about 34 dB down. You can design more complicated pulse trains \, little Blackman window functions \, which control the sidelobes much better., f 68; +#X obj 71 487 output~; +#N canvas 715 281 520 493 fft 0; #X obj 43 105 inlet~; #X obj 142 264 inlet; #X obj 63 136 rfft~; @@ -31,8 +31,6 @@ #X text 105 104 signal to analyze; #X text 194 216 delay two samples; #X text 192 234 for better graphing; -#X obj 383 280 samplerate~; -#X obj 383 303 / 256; #X obj 178 328 metro 500; #X obj 178 292 inlet; #X text 231 290 toggle to graph repeatedly, f 15; @@ -40,15 +38,12 @@ #X obj 63 249 /~ 4096; #X obj 43 422 tabwrite~ F03-signal; #X obj 143 396 tabwrite~ F03-spectrum; -#X obj 383 357 s freq; #X obj 366 153 block~ 4096; #X text 368 126 Window size; -#X floatatom 383 329 10 0 0 0 - - - 0; -#X obj 383 255 loadbang; #X obj 142 360 b; #X connect 0 0 2 0; -#X connect 0 0 21 0; -#X connect 1 0 28 0; +#X connect 0 0 19 0; +#X connect 1 0 23 0; #X connect 2 0 3 0; #X connect 2 0 3 1; #X connect 2 1 4 0; @@ -56,45 +51,55 @@ #X connect 3 0 5 0; #X connect 4 0 5 0; #X connect 5 0 6 0; -#X connect 6 0 20 0; -#X connect 14 0 15 0; -#X connect 15 0 26 0; -#X connect 16 0 28 0; -#X connect 17 0 16 0; -#X connect 20 0 22 0; -#X connect 26 0 23 0; -#X connect 27 0 14 0; -#X connect 28 0 22 0; -#X connect 28 0 21 0; -#X restore 134 332 pd fft; -#X obj 153 301 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 193 332 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 71 303 *~ 0.5; -#X obj 71 104 phasor~; +#X connect 6 0 18 0; +#X connect 14 0 23 0; +#X connect 15 0 14 0; +#X connect 18 0 20 0; +#X connect 23 0 20 0; +#X connect 23 0 19 0; +#X restore 119 449 pd fft; +#X obj 138 418 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 178 449 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 71 407 *~ 0.5; +#X obj 71 194 phasor~; #N canvas 0 0 450 300 (subpatch) 0; #X array F03-signal 882 float 0; #X coords 0 1.02 882 -1.02 200 130 1; -#X restore 371 287 graph; +#X restore 371 377 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array F03-spectrum 259 float 0; #X coords 0 0.51 258 -0.008 256 130 1; -#X restore 339 74 graph; -#X text 371 420 ---- 0.02 seconds ----; -#X text 368 205 2; -#X text 399 205 4; -#X text 338 205 0; -#X text 410 230 -- partial number --; -#X text 431 205 6; -#X text 464 205 8; -#X text 492 205 10; -#X text 524 205 12; -#X text 556 205 14; -#X obj 71 75 r freq; -#X obj 469 25 declare -stdpath ./; -#X text 214 331 <-- repeatedly; -#X text 175 301 <-- graph once; -#X obj 71 336 hip~ 5; -#X obj 44 14 cnv 5 5 25 empty empty Pulse\ Spectrum\ Measurement 15 13 0 16 #dfdfdf #202020 0; +#X restore 339 164 graph; +#X text 371 510 ---- 0.02 seconds ----; +#X text 368 295 2; +#X text 399 295 4; +#X text 338 295 0; +#X text 431 295 6; +#X text 464 295 8; +#X text 492 295 10; +#X text 524 295 12; +#X text 556 295 14; +#X obj 71 165 r freq; +#X text 199 448 <-- repeatedly; +#X text 160 418 <-- graph once; +#X obj 40 15 cnv 5 5 25 empty empty Pulse\ Spectrum\ Measurement 15 13 0 16 #dfdfdf #202020 0; +#X text 382 320 --- partial number ---; +#N canvas 241 111 402 454 init 0; +#X obj 102 214 samplerate~; +#X obj 102 163 bng 18 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 102 241 / 256; +#X obj 102 135 loadbang; +#X obj 102 296 s fundamental; +#X text 44 45 At load time \, calculate a good choice of fundamental frequency for showing spectra: the 16th bin in a 4096-point spectrum \, so SR*16/4096 or SR/256., f 42; +#X obj 93 344 declare -stdpath ./; +#X floatatom 102 268 9 0 0 0 - - - 0; +#X text 45 14 This subpatch initializes the patch.; +#X connect 0 0 2 0; +#X connect 1 0 0 0; +#X connect 2 0 7 0; +#X connect 3 0 1 0; +#X connect 7 0 4 0; +#X restore 226 511 pd init; #X connect 0 0 11 0; #X connect 1 0 12 0; #X connect 2 0 0 0; @@ -111,7 +116,6 @@ #X connect 17 0 16 1; #X connect 18 0 16 2; #X connect 19 0 16 0; -#X connect 19 0 37 0; +#X connect 19 0 15 0; #X connect 20 0 4 0; -#X connect 33 0 20 0; -#X connect 37 0 15 0; +#X connect 32 0 20 0; diff --git a/doc/3.audio.examples/F04.waveshaping.pulse.pd b/doc/3.audio.examples/F04.waveshaping.pulse.pd index 332277fa..4237bb67 100644 --- a/doc/3.audio.examples/F04.waveshaping.pulse.pd +++ b/doc/3.audio.examples/F04.waveshaping.pulse.pd @@ -2,7 +2,7 @@ #X declare -stdpath ./; #X obj 266 211 line~; #X obj 266 187 pack 0 50; -#X floatatom 220 86 4 0 100 0 - - - 0; +#X floatatom 220 86 4 0 200 0 - bandwidth - 0; #X obj 142 148 *~; #X obj 220 112 / 10; #X obj 220 136 moses 0; @@ -32,15 +32,11 @@ #X text 630 268 10; #X text 662 268 12; #X text 694 268 14; -#X obj 88 325 output~; +#X obj 88 330 output~; #N canvas 745 198 546 520 fft 0; #X text 60 23 This subpatch computes the spectrum of the incoming signal with a (rectangular windowed) FFT. FFTs aren't properly introduced until much later.; -#X obj 389 294 samplerate~; -#X obj 389 317 / 512; -#X obj 389 373 s freq/2; #X obj 364 143 block~ 4096; #X text 360 115 Window size; -#X floatatom 389 345 9 0 0 0 - - - 0; #X obj 43 105 inlet~; #X obj 142 264 inlet; #X obj 63 136 rfft~; @@ -62,42 +58,52 @@ #X obj 142 360 b; #X obj 143 396 tabwrite~ F04-spectrum; #X obj 43 422 tabwrite~ F04-signal; -#X obj 389 269 loadbang; -#X connect 1 0 2 0; -#X connect 2 0 6 0; -#X connect 6 0 3 0; -#X connect 7 0 9 0; -#X connect 7 0 27 0; -#X connect 8 0 25 0; -#X connect 9 0 10 0; -#X connect 9 0 10 1; -#X connect 9 1 11 0; -#X connect 9 1 11 1; -#X connect 10 0 12 0; -#X connect 11 0 12 0; -#X connect 12 0 13 0; -#X connect 13 0 24 0; -#X connect 20 0 25 0; -#X connect 21 0 20 0; -#X connect 24 0 26 0; -#X connect 25 0 26 0; -#X connect 25 0 27 0; -#X connect 28 0 1 0; -#X restore 145 289 pd fft; -#X obj 164 264 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 205 289 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X connect 3 0 5 0; +#X connect 3 0 23 0; +#X connect 4 0 21 0; +#X connect 5 0 6 0; +#X connect 5 0 6 1; +#X connect 5 1 7 0; +#X connect 5 1 7 1; +#X connect 6 0 8 0; +#X connect 7 0 8 0; +#X connect 8 0 9 0; +#X connect 9 0 20 0; +#X connect 16 0 21 0; +#X connect 17 0 16 0; +#X connect 20 0 22 0; +#X connect 21 0 22 0; +#X connect 21 0 23 0; +#X restore 121 293 pd fft; +#X obj 140 268 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 181 293 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X obj 142 121 osc~; #X text 32 418 Here we use waveshaping to make another form of pulse train. This one has a neat spectrum: the partials drop off exponentially (with the "bandwidth" controlling the rate of dropoff.) In later patches we'll use a wavetable to do the waveshaping but for simplicity \, it's done algebraically here. The oscillator runs at half the fundamental frequency. The symmetry of the waveshaping doubles the frequency of the output., f 66; #X text 741 253 0; #X text 738 66 1; #X obj 142 96 r freq/2; -#X obj 230 349 declare -stdpath ./; -#X text 186 264 <-- graph once; -#X text 226 288 <-- repeatedly; -#X obj 88 289 hip~ 5; +#X text 162 268 <-- graph once; +#X text 202 292 <-- repeatedly; #X text 513 301 ------ partial number ------; -#X text 32 527 This is the form of pulse train used in the original Phase Aligned Formant (PAF) algorithm \, which was protected by patents belonging to IRCAM from 1993 to 2011, f 66; -#X obj 25 36 cnv 5 5 25 empty empty Another\ Pulse\ Width\ Modulator\ Algorithm 15 13 0 16 #dfdfdf #202020 0; +#X obj 25 26 cnv 5 5 25 empty empty Another\ Pulse\ Width\ Modulator\ Algorithm 15 13 0 16 #dfdfdf #202020 0; +#X text 32 527 This is the form of pulse train used in the original Phase Aligned Formant (PAF) algorithm \, which was protected by patents belonging to IRCAM (from 1993 to 2011)., f 66; +#N canvas 264 120 348 434 init 0; +#X obj 159 176 samplerate~; +#X obj 159 204 / 512; +#X obj 159 260 s freq/2; +#X floatatom 159 232 9 0 0 0 - - - 0; +#X obj 97 353 declare -stdpath ./; +#X obj 107 291 s bandwidth; +#X obj 107 136 loadbang; +#X msg 107 262 50; +#X text 45 61 This subpatch initializes the patch and loads values into number boxes., f 35; +#X connect 0 0 1 0; +#X connect 1 0 3 0; +#X connect 3 0 2 0; +#X connect 6 0 0 0; +#X connect 6 0 7 0; +#X connect 7 0 5 0; +#X restore 255 354 pd init; #X connect 0 0 3 1; #X connect 1 0 0 0; #X connect 2 0 4 0; @@ -110,11 +116,10 @@ #X connect 8 0 11 1; #X connect 9 0 10 0; #X connect 9 0 11 0; -#X connect 10 0 38 0; #X connect 10 0 27 0; +#X connect 10 0 26 0; #X connect 11 0 10 1; #X connect 28 0 27 1; #X connect 29 0 27 2; #X connect 30 0 3 0; #X connect 34 0 30 0; -#X connect 38 0 26 0; diff --git a/doc/3.audio.examples/F05.ring.modulation.pd b/doc/3.audio.examples/F05.ring.modulation.pd index a3d49300..9853bc54 100644 --- a/doc/3.audio.examples/F05.ring.modulation.pd +++ b/doc/3.audio.examples/F05.ring.modulation.pd @@ -1,19 +1,19 @@ -#N canvas 433 119 793 595 12; +#N canvas 400 82 777 632 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; #X array F05-signal 882 float 0; -#X coords 0 1 882 -1 200 130 1; -#X restore 507 300 graph; +#X coords 0 1 882 -1 255 130 1; +#X restore 453 310 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array F05-spectrum 256 float 0; #X coords 0 0.51 255 -0.008 256 130 1; -#X restore 457 50 graph; -#X text 523 437 ---- 0.02 seconds ----; -#X text 453 183 0; -#X text 719 170 0; -#X text 716 47 0.5; -#X floatatom 89 57 5 0 100 0 - - - 0; -#N canvas 667 118 574 518 pulse-train 0; +#X restore 453 91 graph; +#X text 519 446 ---- 0.02 seconds ----; +#X text 449 224 0; +#X text 715 211 0; +#X text 712 88 0.5; +#X floatatom 89 187 5 0 200 0 - - - 0; +#N canvas 669 117 574 518 pulse-train 0; #X obj 229 289 line~; #X obj 99 368 cos~; #X obj 229 265 pack 0 50; @@ -49,36 +49,34 @@ #X connect 13 0 12 0; #X connect 17 0 3 0; #X connect 18 0 17 0; -#X restore 89 82 pd pulse-train; -#X obj 89 225 *~; -#X text 189 140 multiple of fundamental; -#X obj 89 292 output~; -#X obj 166 228 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 207 254 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 485 183 2; -#X text 517 183 4; -#X text 549 183 6; -#X text 581 183 8; -#X text 614 183 10; -#X text 646 183 12; -#X text 677 183 14; -#X text 712 295 1; -#X text 712 419 -1; -#X text 156 196 modulating oscillator; -#X text 69 371 Now we take a pulse train and ring modulate it \, which effectively aliases the spectrum so that it is centered at any desired partial number. The "bandwidth" control still affects the shape of the peak \, independently of where it is centered. This generates a formant centered at the given partial., f 55; -#X floatatom 107 127 6 0 100 0 - - - 0; -#X obj 107 193 osc~; -#X obj 107 165 *; -#X obj 141 165 r freq; -#X text 69 467 This patch is limited to making formants centered on harmonics. The center frequency thus can't be moved smoothly up and down at will (try shift-clicking on modulation frequency to make fractions). Next we'll look at two techniques for sliding a formant frequency without losing harmonicity., f 55; -#X text 201 97 generator from before; -#X obj 234 312 declare -stdpath ./; -#X text 188 228 <-- graph once; -#X text 228 253 <-- repeatedly; -#X text 140 57 <-- bandwidth; -#X text 202 81 <-- pulse train; -#X text 161 126 <-- modulation frequency as; -#X obj 89 258 hip~ 5; +#X restore 89 212 pd pulse-train; +#X obj 89 355 *~; +#X text 189 270 multiple of fundamental; +#X obj 89 422 output~; +#X obj 136 362 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 177 388 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X text 481 224 2; +#X text 513 224 4; +#X text 545 224 6; +#X text 577 224 8; +#X text 610 224 10; +#X text 642 224 12; +#X text 673 224 14; +#X text 710 307 1; +#X text 710 426 -1; +#X text 156 326 modulating oscillator; +#X text 53 62 Now we take a pulse train and ring modulate it \, which effectively aliases the spectrum so that it is centered at any desired partial number. The "bandwidth" control still affects the shape of the peak \, independently of where it is centered. This generates a formant centered at the given partial., f 50; +#X floatatom 107 257 6 0 100 0 - - - 0; +#X obj 107 323 osc~; +#X obj 107 295 *; +#X obj 141 295 r freq; +#X text 166 513 This patch is limited to making formants centered on harmonics. The center frequency thus can't be moved smoothly up and down at will (try shift-clicking on modulation frequency to make fractions). Next we'll look at two techniques for sliding a formant frequency without losing harmonicity., f 68; +#X text 201 227 generator from before; +#X text 158 362 <-- graph once; +#X text 198 387 <-- repeatedly; +#X text 131 187 <-- bandwidth; +#X text 202 211 <-- pulse train; +#X text 161 256 <-- modulation frequency as; #N canvas 715 281 537 493 fft 0; #X obj 43 105 inlet~; #X obj 142 264 inlet; @@ -94,24 +92,19 @@ #X text 105 104 signal to analyze; #X text 194 216 delay two samples; #X text 192 234 for better graphing; -#X obj 383 280 samplerate~; -#X obj 383 303 / 256; #X obj 178 328 metro 500; #X obj 178 292 inlet; #X text 231 290 toggle to graph repeatedly, f 15; #X text 185 264 bang to graph once; #X obj 63 249 /~ 4096; -#X obj 383 357 s freq; #X obj 366 153 block~ 4096; #X text 368 126 Window size; -#X floatatom 383 329 10 0 0 0 - - - 0; -#X obj 383 255 loadbang; #X obj 142 360 b; #X obj 143 396 tabwrite~ F05-spectrum; #X obj 43 422 tabwrite~ F05-signal; #X connect 0 0 2 0; -#X connect 0 0 28 0; -#X connect 1 0 26 0; +#X connect 0 0 23 0; +#X connect 1 0 21 0; #X connect 2 0 3 0; #X connect 2 0 3 1; #X connect 2 1 4 0; @@ -119,27 +112,36 @@ #X connect 3 0 5 0; #X connect 4 0 5 0; #X connect 5 0 6 0; -#X connect 6 0 20 0; -#X connect 14 0 15 0; -#X connect 15 0 24 0; -#X connect 16 0 26 0; -#X connect 17 0 16 0; -#X connect 20 0 27 0; -#X connect 24 0 21 0; -#X connect 25 0 14 0; -#X connect 26 0 27 0; -#X connect 26 0 28 0; -#X restore 147 254 pd fft; -#X text 481 211 ------ partial number ------; -#X obj 35 20 cnv 5 5 25 empty empty Ring\ Modulated\ Pulse\ Trains 15 13 0 16 #dfdfdf #202020 0; +#X connect 6 0 18 0; +#X connect 14 0 21 0; +#X connect 15 0 14 0; +#X connect 18 0 22 0; +#X connect 21 0 22 0; +#X connect 21 0 23 0; +#X restore 117 388 pd fft; +#X text 477 252 ------ partial number ------; +#X obj 30 20 cnv 5 5 25 empty empty Ring\ Modulated\ Pulse\ Trains 15 13 0 16 #dfdfdf #202020 0; +#N canvas 264 120 348 434 init 0; +#X obj 118 193 samplerate~; +#X floatatom 118 249 9 0 0 0 - - - 0; +#X obj 83 336 declare -stdpath ./; +#X obj 118 221 / 256; +#X obj 118 277 s freq; +#X text 26 48 At load time \, calculate a good choice of fundamental frequency for showing spectra: the 16th bin in a 4096-point spectrum \, so SR*16/4096 or SR/256., f 42; +#X text 27 17 This subpatch initializes the patch.; +#X obj 118 154 loadbang; +#X connect 0 0 3 0; +#X connect 1 0 4 0; +#X connect 3 0 1 0; +#X connect 7 0 0 0; +#X restore 250 439 pd init; #X connect 6 0 7 0; #X connect 7 0 8 0; -#X connect 8 0 36 0; -#X connect 8 0 37 0; -#X connect 11 0 37 1; -#X connect 12 0 37 2; +#X connect 8 0 35 0; +#X connect 8 0 10 0; +#X connect 11 0 35 1; +#X connect 12 0 35 2; #X connect 24 0 26 0; #X connect 25 0 8 1; #X connect 26 0 25 0; #X connect 27 0 26 1; -#X connect 36 0 10 0; diff --git a/doc/3.audio.examples/F06.packets.pd b/doc/3.audio.examples/F06.packets.pd index 9b933850..9db59d28 100644 --- a/doc/3.audio.examples/F06.packets.pd +++ b/doc/3.audio.examples/F06.packets.pd @@ -1,14 +1,14 @@ -#N canvas 399 42 818 674 12; +#N canvas 373 53 818 690 12; #X declare -stdpath ./; #X obj 373 374 line~; #X obj 106 433 cos~; #N canvas 0 0 450 300 (subpatch) 0; #X array pulse-output 882 float 0; #X coords 0 1 882 -1 200 130 1; -#X restore 563 415 graph; +#X restore 559 449 graph; #X obj 373 351 pack 0 50; -#X floatatom 373 305 6 0 0 0 - - - 0; -#X obj 166 332 -~ 0.5; +#X floatatom 373 305 6 0 200 0 - - - 0; +#X obj 158 332 -~ 0.5; #X obj 106 381 *~; #X obj 373 328 / 10; #X obj 106 406 clip~ -0.5 0.5; @@ -17,62 +17,75 @@ #X obj 106 456 +~ 1; #X obj 247 462 cos~; #X obj 106 518 *~; -#X floatatom 265 303 4 0 0 0 - - - 0; +#X floatatom 265 303 4 0 100 0 - - - 0; #X obj 265 327 / 10; -#X text 592 552 --- 0.02 seconds ---; +#X text 588 586 --- 0.02 seconds ---; #X obj 247 436 *~; -#N canvas 462 254 698 213 graph 0; +#N canvas 462 254 698 291 graph 0; #X obj 68 57 inlet~; -#X obj 563 57 inlet; -#X obj 68 124 tabwrite~ pulse-output; +#X obj 493 57 inlet; +#X obj 68 164 tabwrite~ pulse-output; #X obj 246 57 inlet~; -#X obj 398 57 inlet~; -#X obj 246 124 tabwrite~ window; -#X obj 398 124 tabwrite~ carrier; -#X msg 563 121 \; pd dsp 1; +#X obj 378 57 inlet~; +#X obj 246 164 tabwrite~ window; +#X obj 378 164 tabwrite~ carrier; +#X obj 553 57 inlet; +#X obj 553 97 metro 250; #X connect 0 0 2 0; #X connect 1 0 2 0; #X connect 1 0 5 0; #X connect 1 0 6 0; -#X connect 1 0 7 0; #X connect 3 0 5 0; #X connect 4 0 6 0; -#X restore 212 554 pd graph; +#X connect 7 0 8 0; +#X connect 8 0 6 0; +#X connect 8 0 5 0; +#X connect 8 0 2 0; +#X restore 221 564 pd graph; #X obj 265 373 line~; #X obj 265 350 pack 0 50; #N canvas 0 0 450 300 (subpatch) 0; #X array carrier 882 float 0; #X coords 0 1 881 -1 200 140 1; -#X restore 563 237 graph; +#X restore 559 271 graph; #N canvas 0 0 450 300 (subpatch) 0; #X array window 882 float 0; #X coords 0 1 881 -1 200 140 1; -#X restore 564 64 graph; -#X floatatom 166 281 4 0 0 0 - - - 0; -#X obj 166 307 phasor~ 100; +#X restore 560 98 graph; +#X floatatom 158 281 4 0 0 0 - \$0-fundamental - 0; #X text 54 470 window; #X text 282 440 magnified phase; #X text 35 51 The simpler of two techniques for making slidable center frequencies is to synthesize enveloped sinusoidal wave packets. The packets should repeat at the fundamental frequency \, but the frequency of the packet itself controls the center frequency of the formant. The length of the packet varies inversely with bandwidth., f 68; -#X obj 106 596 output~; -#X obj 265 529 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 106 606 output~; +#X obj 260 538 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 106 479 *~ 0.5; -#X text 767 190 -1; -#X text 769 60 1; -#X text 767 363 -1; -#X text 771 233 1; -#X text 768 534 -1; -#X text 771 409 1; +#X text 763 224 -1; +#X text 765 94 1; +#X text 763 397 -1; +#X text 767 267 1; +#X text 764 568 -1; +#X text 767 443 1; #X text 54 441 raised; #X text 54 456 cosine; -#X text 150 242 fundamental frequency, f 11; +#X text 65 276 fundamental frequency, f 11; #X text 307 476 desired center frequency but its phase is reset each fundamental period., f 24; #X text 253 253 center freq. (in tenths of fundamental), f 13; -#X obj 260 617 declare -stdpath ./; -#X text 287 527 <-- graph; #X text 286 463 <-- this cosine goes at the; -#X obj 106 556 hip~ 5; #X text 36 139 In the patch below \, the [clip~] followed by [cos~] and [+~ 1] is the enveloping ("windowing") function \, which appears in the top graph. The carrier \, on the other hand \, is a broken sinusoid made by amplifying the [phasor~] (the [*~] controlled by "center freq.") and taking the [cos~] of the result. The "breaks" in the sinusoid only occur when the enveloping signal is zero., f 68; #X obj 61 10 cnv 5 5 25 empty empty Windowed\ Packets 15 13 0 16 #dfdfdf #202020 0; +#X text 282 536 <-- graph once; +#X obj 291 565 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 313 565 <-- graph repeatedly; +#X obj 158 307 phasor~ 220; +#N canvas 238 316 368 300 init 0; +#X obj 122 223 declare -stdpath ./; +#X obj 131 97 loadbang; +#X obj 131 166 s \$0-fundamental; +#X msg 131 134 220; +#X text 81 28 This subpatch initializes the patch and loads a value in the number box., f 29; +#X connect 1 0 3 0; +#X connect 3 0 2 0; +#X restore 256 626 pd init; #X connect 0 0 10 0; #X connect 1 0 11 0; #X connect 3 0 0 0; @@ -83,19 +96,19 @@ #X connect 7 0 3 0; #X connect 8 0 1 0; #X connect 10 0 6 1; -#X connect 11 0 30 0; +#X connect 11 0 29 0; #X connect 12 0 13 1; #X connect 12 0 18 2; #X connect 13 0 18 0; -#X connect 13 0 45 0; +#X connect 13 0 27 0; #X connect 14 0 15 0; #X connect 15 0 20 0; #X connect 17 0 12 0; #X connect 19 0 17 1; #X connect 20 0 19 0; -#X connect 23 0 24 0; -#X connect 24 0 5 0; -#X connect 29 0 18 3; -#X connect 30 0 13 0; -#X connect 30 0 18 1; -#X connect 45 0 28 0; +#X connect 23 0 47 0; +#X connect 28 0 18 3; +#X connect 29 0 13 0; +#X connect 29 0 18 1; +#X connect 45 0 18 4; +#X connect 47 0 5 0; diff --git a/doc/3.audio.examples/F07.packet.spectrum.pd b/doc/3.audio.examples/F07.packet.spectrum.pd index bd3b63ff..5f365535 100644 --- a/doc/3.audio.examples/F07.packet.spectrum.pd +++ b/doc/3.audio.examples/F07.packet.spectrum.pd @@ -1,32 +1,31 @@ -#N canvas 532 66 639 719 12; +#N canvas 532 66 705 636 12; #X declare -stdpath ./; -#X obj 153 376 line~; -#X obj 59 489 cos~; -#X obj 153 352 pack 0 50; -#X floatatom 153 280 4 0 0 0 - - - 0; -#X obj 59 381 -~ 0.5; -#X obj 59 440 *~; -#X obj 153 304 / 10; -#X obj 59 465 clip~ -0.5 0.5; -#X text 189 281 bandwidth; -#X obj 153 400 +~ 1; -#X obj 60 512 +~ 1; -#X obj 218 485 cos~; -#X obj 60 551 *~; -#X floatatom 236 324 5 0 0 0 - - - 0; -#X obj 236 348 / 10; -#X obj 218 459 *~; -#X obj 153 328 max 0; -#X obj 236 420 line~; -#X obj 236 396 pack 0 50; -#X obj 236 372 max 0; -#X floatatom 59 333 5 0 0 0 - - - 0; -#X obj 59 357 phasor~ 100; +#X obj 188 267 line~; +#X obj 94 380 cos~; +#X obj 188 243 pack 0 50; +#X floatatom 188 171 4 0 0 0 - - - 0; +#X obj 94 272 -~ 0.5; +#X obj 94 331 *~; +#X obj 188 195 / 10; +#X obj 94 356 clip~ -0.5 0.5; +#X text 224 172 bandwidth; +#X obj 188 291 +~ 1; +#X obj 95 403 +~ 1; +#X obj 253 376 cos~; +#X obj 95 442 *~; +#X floatatom 271 224 5 0 0 0 - - - 0; +#X obj 271 248 / 10; +#X obj 253 350 *~; +#X obj 188 219 max 0; +#X obj 271 320 line~; +#X obj 271 296 pack 0 50; +#X obj 271 272 max 0; +#X floatatom 94 221 5 0 0 0 - \$0-fundamental - 0; #N canvas 0 22 450 278 (subpatch) 0; #X array spectrum 128 float 0; -#X coords 0 500 128 0 256 130 1; -#X restore 324 458 graph; -#N canvas 590 187 344 253 fft 0; +#X coords 0 500 128 0 302 187 1; +#X restore 344 350 graph; +#N canvas 590 187 344 278 fft 0; #X obj 46 48 inlet~; #X obj 137 179 tabwrite~ spectrum; #X obj 137 46 inlet; @@ -34,7 +33,9 @@ #X obj 46 111 *~; #X obj 78 111 *~; #X obj 78 142 sqrt~; -#X obj 163 114 block~ 1024; +#X obj 156 235 block~ 1024; +#X obj 207 46 inlet; +#X obj 207 80 metro 250; #X connect 0 0 3 0; #X connect 2 0 1 0; #X connect 3 0 4 0; @@ -44,19 +45,32 @@ #X connect 4 0 6 0; #X connect 5 0 6 0; #X connect 6 0 1 0; -#X restore 84 589 pd fft; -#X text 323 594 0; -#X text 571 594 5512; -#X text 57 69 Here's the spectrum you get. Note that even if you put the center frequency right on a partial \, there is significant energy in neighboring partials (try fundamental 440 \, "center freq" 30 \, bandwidth 0.), f 63; -#X text 56 136 The center frequency is in units of ten per partial \, or in other words a value of "30" means "centered on the third partial"., f 63; -#X text 55 192 This technique only works if you're doing Hanning-window shaped PWM--you can't combine this naturally with FM or with the waveshaping technique we'll see later., f 63; -#X obj 60 630 output~; -#X obj 420 381 declare -stdpath ./; -#X obj 123 562 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 145 560 <-- graph; -#X text 279 323 center freq.; -#X text 35 296 fundamental frequency, f 11; -#X obj 78 24 cnv 5 5 25 empty empty Windowed\ Packet\ Spectrum 15 13 0 16 #dfdfdf #202020 0; +#X connect 8 0 9 0; +#X connect 9 0 1 0; +#X restore 119 480 pd fft; +#X text 339 544 0; +#X text 622 544 5512; +#X text 46 69 Here's the spectrum you get. Note that even if you put the center frequency right on a partial \, there is significant energy in neighboring partials (try fundamental 440 \, "center freq" 30 \, bandwidth 0.), f 43; +#X text 384 91 The center frequency is in units of ten per partial \, or in other words a value of "30" means "centered on the third partial"., f 35; +#X obj 95 531 output~; +#X obj 138 453 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 258 201 center freq.; +#X text 70 184 fundamental frequency, f 11; +#X obj 32 21 cnv 5 5 25 empty empty Windowed\ Packet\ Spectrum 15 13 0 16 #dfdfdf #202020 0; +#N canvas 238 316 368 300 init 0; +#X obj 122 223 declare -stdpath ./; +#X obj 131 97 loadbang; +#X obj 131 166 s \$0-fundamental; +#X msg 131 134 220; +#X text 81 28 This subpatch initializes the patch and loads a value in the number box., f 29; +#X connect 1 0 3 0; +#X connect 3 0 2 0; +#X restore 241 550 pd init; +#X obj 94 246 phasor~; +#X obj 180 480 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 160 451 <-- graph once; +#X text 202 480 <-- graph repeatedly, f 10; +#X text 385 172 This technique only works if you're doing Hanning-window shaped PWM -- you can't combine this naturally with FM or with the waveshaping technique we'll see later., f 35; #X connect 0 0 9 0; #X connect 1 0 10 0; #X connect 2 0 0 0; @@ -69,8 +83,8 @@ #X connect 9 0 5 1; #X connect 10 0 12 0; #X connect 11 0 12 1; -#X connect 12 0 23 0; -#X connect 12 0 29 0; +#X connect 12 0 22 0; +#X connect 12 0 27 0; #X connect 13 0 14 0; #X connect 14 0 19 0; #X connect 15 0 11 0; @@ -78,6 +92,7 @@ #X connect 17 0 15 1; #X connect 18 0 17 0; #X connect 19 0 18 0; -#X connect 20 0 21 0; -#X connect 21 0 4 0; -#X connect 31 0 23 1; +#X connect 20 0 33 0; +#X connect 28 0 22 1; +#X connect 33 0 4 0; +#X connect 34 0 22 2; diff --git a/doc/3.audio.examples/F08.two.cosines.pd b/doc/3.audio.examples/F08.two.cosines.pd index 41613556..14fd44d0 100644 --- a/doc/3.audio.examples/F08.two.cosines.pd +++ b/doc/3.audio.examples/F08.two.cosines.pd @@ -1,17 +1,16 @@ -#N canvas 504 51 756 667 12; +#N canvas 438 38 756 667 12; #X declare -stdpath ./; #X obj 147 328 cos~; -#X floatatom 194 117 4 0 100 0 - - - 0; -#X obj 194 141 / 10; -#X text 519 506 --- 0.02 seconds ---; +#X floatatom 194 131 4 0 100 0 - \$0-center-freq - 0; +#X obj 194 155 / 10; +#X text 527 541 --- 0.02 seconds ---; #X obj 147 298 *~; #X obj 194 213 line~; -#X obj 194 165 max 0; #N canvas 0 0 450 300 (subpatch) 0; #X array F08-carrier 882 float 0; -#X coords 0 2 881 -2 200 140 1; -#X restore 488 355 graph; -#X floatatom 97 220 5 0 0 0 - - - 0; +#X coords 0 2 881 -2 228 182 1; +#X restore 479 350 graph; +#X floatatom 97 220 5 0 0 0 - \$0-fundamental - 0; #X obj 189 328 cos~; #X obj 230 241 wrap~; #X obj 194 268 -~; @@ -23,42 +22,64 @@ #X text 243 328 synthesize the two partials; #X obj 194 566 output~; #X text 297 116 The other \, spiffier way is to make a sum of cosines to interpolate between adjacent harmonics. Suppose for example we want a center frequency of 5.3 (in units of the fundamental.) We just take partial 5 with amplitude 0.7 and partial 6 with amplitude 0.3:, f 52; -#X obj 279 518 tabwrite~ F08-carrier; -#X obj 279 487 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 97 244 phasor~ 100; #X text 282 240 the fractional part "q"; #X text 243 268 subtract to get the integer part "k"; #X text 243 298 multiply phase by k and k+1; #X text 237 374 c2 - c1; #X text 250 421 q * (c2 - c1); #X text 229 458 q * c2 + (1-q) * c1; -#X obj 371 591 declare -stdpath ./; -#X text 302 486 <-- graph; -#X obj 194 517 hip~ 5; #X text 81 180 fundamental frequency, f 11; -#X text 26 113 center frequency (in tenths of fundamental), f 22; +#X text 26 127 center frequency (in tenths of fundamental), f 22; #X obj 103 37 cnv 5 5 25 empty empty Movable\ Center\ Frequency\ by\ Adding\ Two\ Cosines 15 13 0 16 #dfdfdf #202020 0; -#X connect 0 0 13 1; -#X connect 0 0 15 0; +#N canvas 238 316 365 358 init 0; +#X obj 125 294 declare -stdpath ./; +#X obj 131 97 loadbang; +#X obj 149 175 s \$0-fundamental; +#X msg 149 143 220; +#X text 81 28 This subpatch initializes the patch and loads a value in the number boxes., f 29; +#X obj 130 235 s \$0-center-freq; +#X msg 130 207 25; +#X connect 1 0 3 0; +#X connect 1 0 6 0; +#X connect 3 0 2 0; +#X connect 6 0 5 0; +#X restore 341 595 pd init; +#X obj 97 244 phasor~; +#N canvas 462 254 350 232 graph 0; +#X obj 68 57 inlet~; +#X obj 133 57 inlet; +#X obj 193 57 inlet; +#X obj 193 97 metro 250; +#X obj 68 164 tabwrite~ F08-carrier; +#X connect 0 0 4 0; +#X connect 1 0 4 0; +#X connect 2 0 3 0; +#X connect 3 0 4 0; +#X restore 219 521 pd graph; +#X obj 245 495 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 267 493 <-- graph once; +#X obj 289 522 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X text 311 522 <-- graph repeatedly, f 11; +#X connect 0 0 12 1; +#X connect 0 0 14 0; #X connect 1 0 2 0; -#X connect 2 0 6 0; +#X connect 2 0 15 0; #X connect 4 0 0 0; -#X connect 4 0 12 0; -#X connect 5 0 11 0; +#X connect 4 0 11 0; #X connect 5 0 10 0; -#X connect 6 0 16 0; -#X connect 8 0 22 0; -#X connect 9 0 13 0; -#X connect 10 0 11 1; -#X connect 10 0 14 1; -#X connect 11 0 4 1; -#X connect 12 0 9 0; -#X connect 13 0 14 0; -#X connect 14 0 15 1; -#X connect 15 0 20 0; -#X connect 15 0 31 0; -#X connect 16 0 5 0; -#X connect 21 0 20 0; -#X connect 22 0 4 0; -#X connect 22 0 12 1; -#X connect 31 0 18 0; +#X connect 5 0 9 0; +#X connect 7 0 29 0; +#X connect 8 0 12 0; +#X connect 9 0 10 1; +#X connect 9 0 13 1; +#X connect 10 0 4 1; +#X connect 11 0 8 0; +#X connect 12 0 13 0; +#X connect 13 0 14 1; +#X connect 14 0 17 0; +#X connect 14 0 30 0; +#X connect 15 0 5 0; +#X connect 29 0 4 0; +#X connect 29 0 11 1; +#X connect 31 0 30 1; +#X connect 33 0 30 2; diff --git a/doc/3.audio.examples/F09.declickit.pd b/doc/3.audio.examples/F09.declickit.pd index 0bc4fdad..337e5c6a 100644 --- a/doc/3.audio.examples/F09.declickit.pd +++ b/doc/3.audio.examples/F09.declickit.pd @@ -20,7 +20,7 @@ #X msg 137 142 4; #X obj 73 216 phasor~ 80; #X obj 175 183 pack f f; -#X obj 427 110 declare -stdpath ./; +#X obj 286 633 declare -stdpath ./; #X text 264 156 <-- gliss time; #X obj 267 254 hradio 19 1 0 2 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0; #X obj 229 298 == 0; diff --git a/doc/3.audio.examples/F10.sweepable.FM.pd b/doc/3.audio.examples/F10.sweepable.FM.pd index 5d5cc4b5..a838a238 100644 --- a/doc/3.audio.examples/F10.sweepable.FM.pd +++ b/doc/3.audio.examples/F10.sweepable.FM.pd @@ -1,4 +1,4 @@ -#N canvas 358 63 824 688 12; +#N canvas 358 63 809 627 12; #X declare -stdpath ./; #X obj 152 348 cos~; #X obj 152 268 *~; @@ -9,15 +9,13 @@ #X obj 195 381 -~; #X obj 218 407 *~; #X obj 199 216 samphold~; -#X floatatom 199 84 4 0 200 0 - - - 0; +#X floatatom 199 84 4 0 200 0 - \$0-center-freq - 0; #X obj 199 107 / 10; #X obj 199 159 line~; #X obj 199 133 pack 0 50; #X obj 131 151 phasor~; -#X floatatom 131 128 4 0 0 0 - - - 0; -#X text 330 109 index; -#X text 328 126 (percent); -#X floatatom 336 152 4 0 500 0 - - - 0; +#X floatatom 131 128 4 0 0 0 - \$0-fundamental - 0; +#X floatatom 336 152 4 0 500 0 - \$0-index - 0; #X obj 286 205 cos~; #X obj 336 221 line~; #X obj 286 256 *~; @@ -28,7 +26,7 @@ #X text 321 268 oscillator; #X text 39 309 both phases-->; #X text 25 294 add modulator to; -#X obj 200 542 output~; +#X obj 200 512 output~; #N canvas 605 126 529 576 fft 0; #X obj 83 140 inlet~; #X obj 197 410 inlet; @@ -88,30 +86,41 @@ #X obj 280 440 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #N canvas 0 0 450 300 (subpatch) 0; #X array F10-spectrum 259 float 0; -#X coords 0 0.51 258 -0.008 256 130 1; -#X restore 446 441 graph; -#X text 438 572 0; +#X coords 0 0.51 258 -0.008 317 162 1; +#X restore 435 336 graph; +#X text 431 505 0; #X obj 200 435 +~; -#X text 472 134 We can apply the two-cosine method to FM synthesis to get FM spectra which slide up and down: we just treat the cosines like carrier signals in an FM instrument. This doesn't work as well as you'd wish \, because the phases of the partials of the two FM instruments don't line up \, so that \, for indices of modulation above about 20% \, you get beating effects as the center frequency goes up and down., f 43; -#X text 678 573 2700; +#X text 730 505 2700; #X text 98 69 center freq. (in tenths of fundamental), f 13; #X text 40 128 fundamental (= mod freq), f 12; -#X obj 623 60 declare -stdpath ./; -#X text 282 415 <-- graph once; -#X text 301 439 <-- repeatedly; -#X obj 200 501 hip~ 5; -#X text 496 581 ---- frequency ----; -#X obj 59 26 cnv 5 5 25 empty empty Applying\ Two-Cosine\ Carrier\ to\ FM 15 13 0 16 #dfdfdf #202020 0; +#X text 286 415 <-- graph once; +#X text 518 508 ---- frequency ----; +#X obj 51 24 cnv 5 5 25 empty empty Applying\ Two-Cosine\ Carrier\ to\ FM 15 13 0 16 #dfdfdf #202020 0; +#N canvas 238 316 365 358 init 0; +#X obj 125 294 declare -stdpath ./; +#X obj 131 97 loadbang; +#X text 81 28 This subpatch initializes the patch and loads a value in the number boxes., f 29; +#X obj 131 126 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 131 153 f \$0; +#X msg 131 183 \; \$1-fundamental 220 \; \$1-center-freq 20 \; \$1-index 10; +#X connect 1 0 3 0; +#X connect 3 0 4 0; +#X connect 4 0 5 0; +#X restore 67 486 pd init; +#X text 445 110 We can apply the two-cosine method to FM synthesis to get FM spectra which slide up and down: we just treat the cosines like carrier signals in an FM instrument., f 43; +#X text 445 178 This doesn't work as well as you'd wish \, because the phases of the partials of the two FM instruments don't line up \, so that \, for indices of modulation above about 20% \, you get beating effects as the center frequency goes up and down., f 43; +#X text 326 111 index (percent), f 9; +#X text 305 439 <-- graph repeatedly, f 10; #X connect 0 0 6 1; -#X connect 0 0 34 0; -#X connect 1 0 23 0; +#X connect 0 0 32 0; +#X connect 1 0 21 0; #X connect 2 0 6 0; #X connect 3 0 4 1; #X connect 3 0 7 1; #X connect 4 0 1 1; #X connect 5 0 2 0; #X connect 6 0 7 0; -#X connect 7 0 34 1; +#X connect 7 0 32 1; #X connect 8 0 4 0; #X connect 8 0 3 0; #X connect 9 0 10 0; @@ -119,20 +128,19 @@ #X connect 11 0 8 0; #X connect 12 0 11 0; #X connect 13 0 8 1; -#X connect 13 0 18 0; +#X connect 13 0 16 0; #X connect 13 0 1 0; #X connect 13 0 5 1; #X connect 14 0 13 0; -#X connect 17 0 21 0; -#X connect 18 0 20 0; -#X connect 19 0 20 1; -#X connect 20 0 23 1; -#X connect 21 0 22 0; -#X connect 22 0 19 0; -#X connect 23 0 5 0; -#X connect 23 0 0 0; -#X connect 30 0 29 1; -#X connect 31 0 29 2; -#X connect 34 0 29 0; -#X connect 34 0 42 0; -#X connect 42 0 28 0; +#X connect 15 0 19 0; +#X connect 16 0 18 0; +#X connect 17 0 18 1; +#X connect 18 0 21 1; +#X connect 19 0 20 0; +#X connect 20 0 17 0; +#X connect 21 0 5 0; +#X connect 21 0 0 0; +#X connect 28 0 27 1; +#X connect 29 0 27 2; +#X connect 32 0 27 0; +#X connect 32 0 26 0; diff --git a/doc/3.audio.examples/F11.anharmonic.FM.pd b/doc/3.audio.examples/F11.anharmonic.FM.pd index 637ab257..ee30a688 100644 --- a/doc/3.audio.examples/F11.anharmonic.FM.pd +++ b/doc/3.audio.examples/F11.anharmonic.FM.pd @@ -1,43 +1,34 @@ -#N canvas 434 57 705 620 12; +#N canvas 434 57 705 551 12; #X declare -stdpath ./; -#X obj 175 416 cos~; -#X floatatom 165 204 4 0 200 0 - - - 0; -#X obj 165 227 / 10; -#X floatatom 109 246 4 0 0 0 - - - 0; -#X text 61 208 fundamental; -#X text 54 223 (= mod freq); -#X text 241 214 index; -#X text 241 234 (percent); -#X floatatom 241 255 4 0 500 0 - - - 0; -#X obj 241 324 line~; -#X obj 193 358 *~; -#X obj 241 278 / 100; -#X obj 241 301 pack 0 50; -#X obj 175 393 +~; -#X text 229 350 modulating; -#X text 229 365 oscillator; -#X obj 175 504 output~; -#X obj 248 410 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 268 437 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 148 354 cos~; +#X obj 138 165 / 10; +#X text 34 146 fundamental; +#X text 27 161 (= mod freq); +#X obj 214 262 line~; +#X obj 166 296 *~; +#X obj 214 216 / 100; +#X obj 214 239 pack 0 50; +#X obj 148 331 +~; +#X text 202 288 modulating; +#X text 202 303 oscillator; +#X obj 148 442 output~; +#X obj 201 348 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 221 375 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #N canvas 0 0 450 300 (subpatch) 0; #X array F11-spectrum 259 float 0; -#X coords 0 0.51 258 -0.008 256 130 1; -#X restore 373 203 graph; -#X text 365 334 0; -#X text 427 344 -- frequency --; -#X text 602 339 2700; -#X obj 165 276 *; -#X obj 165 253 t b f; -#X obj 193 329 osc~; -#X obj 130 350 phasor~; -#X text 122 74 Here's what happens if you just slide the carrier frequency around. The spectrum moves up and down all right \, but is only periodic at the original period when the center frequency roosts on a harmonic., f 67; -#X text 72 343 carrier; -#X text 51 358 oscillator; -#X text 159 152 center freq. (in tenths of fundamental), f 13; -#X obj 346 502 declare -stdpath ./; -#X text 270 410 <-- graph once; -#X text 289 436 <-- repeatedly; -#X obj 175 466 hip~ 5; +#X coords 0 0.51 258 -0.008 270 201 1; +#X restore 369 242 graph; +#X text 363 453 0; +#X text 614 453 2700; +#X obj 138 214 *; +#X obj 138 191 t b f; +#X obj 166 267 osc~; +#X obj 103 288 phasor~; +#X text 307 96 Here's what happens if you just slide the carrier frequency around. The spectrum moves up and down all right \, but is only periodic at the original period when the center frequency roosts on a harmonic., f 50; +#X text 45 281 carrier; +#X text 24 296 oscillator; +#X text 132 90 center freq. (in tenths of fundamental), f 13; +#X text 223 348 <-- graph once; #N canvas 605 126 529 576 fft 0; #X obj 83 140 inlet~; #X obj 197 410 inlet; @@ -92,25 +83,41 @@ #X connect 27 0 29 0; #X connect 28 0 23 1; #X connect 29 0 21 1; -#X restore 229 463 pd fft; -#X obj 80 31 cnv 5 5 25 empty empty How\ Not\ to\ Apply\ Two-Cosine\ Carrier\ to\ FM 15 13 0 16 #dfdfdf #202020 0; -#X connect 0 0 34 0; -#X connect 0 0 35 0; -#X connect 1 0 2 0; -#X connect 2 0 24 0; -#X connect 3 0 23 0; -#X connect 3 0 25 0; -#X connect 8 0 11 0; -#X connect 9 0 10 1; -#X connect 10 0 13 1; -#X connect 11 0 12 0; -#X connect 12 0 9 0; -#X connect 13 0 0 0; -#X connect 17 0 35 1; -#X connect 18 0 35 2; -#X connect 23 0 26 0; -#X connect 24 0 23 0; -#X connect 24 1 23 1; -#X connect 25 0 10 0; -#X connect 26 0 13 0; -#X connect 34 0 16 0; +#X restore 182 401 pd fft; +#X obj 63 29 cnv 5 5 25 empty empty How\ Not\ to\ Apply\ Two-Cosine\ Carrier\ to\ FM 15 13 0 16 #dfdfdf #202020 0; +#N canvas 238 316 365 358 init 0; +#X obj 125 294 declare -stdpath ./; +#X obj 131 97 loadbang; +#X text 81 28 This subpatch initializes the patch and loads a value in the number boxes., f 29; +#X obj 131 126 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 131 153 f \$0; +#X msg 131 183 \; \$1-fundamental 220 \; \$1-center-freq 20 \; \$1-index 10; +#X connect 1 0 3 0; +#X connect 3 0 4 0; +#X connect 4 0 5 0; +#X restore 50 424 pd init; +#X text 212 155 index (percent), f 9; +#X floatatom 138 138 4 0 200 0 - \$0-center-freq - 0; +#X floatatom 72 183 4 0 0 0 - \$0-fundamental - 0; +#X floatatom 214 190 4 0 500 0 - \$0-index - 0; +#X text 242 374 <-- graph repeatedly, f 11; +#X text 425 453 ---- frequency ----; +#X connect 0 0 26 0; +#X connect 0 0 11 0; +#X connect 1 0 18 0; +#X connect 4 0 5 1; +#X connect 5 0 8 1; +#X connect 6 0 7 0; +#X connect 7 0 4 0; +#X connect 8 0 0 0; +#X connect 12 0 26 1; +#X connect 13 0 26 2; +#X connect 17 0 20 0; +#X connect 18 0 17 0; +#X connect 18 1 17 1; +#X connect 19 0 5 0; +#X connect 20 0 8 0; +#X connect 30 0 1 0; +#X connect 31 0 19 0; +#X connect 31 0 17 0; +#X connect 32 0 6 0; diff --git a/doc/3.audio.examples/F12.paf.pd b/doc/3.audio.examples/F12.paf.pd index 92e0d6fc..953c8e25 100644 --- a/doc/3.audio.examples/F12.paf.pd +++ b/doc/3.audio.examples/F12.paf.pd @@ -10,16 +10,11 @@ #X obj 128 571 *~; #X obj 110 601 +~; #X obj 110 409 samphold~; -#X floatatom 148 273 4 0 500 0 - - - 0; #X obj 148 296 / 10; #X obj 148 343 line~; #X obj 148 320 pack 0 50; #X obj 50 340 phasor~; -#X floatatom 50 317 4 0 0 0 - - - 0; #X text 33 295 fundamental; -#X text 269 372 index; -#X text 269 389 (percent); -#X floatatom 272 412 4 0 500 0 - - - 0; #X obj 272 458 line~; #X obj 206 458 *~; #X obj 272 435 pack 0 50; @@ -27,9 +22,8 @@ #X array bell-curve 200 float 1; #A 0 1.12535e-07 1.54727e-07 2.12059e-07 2.89706e-07 3.94519e-07 5.35535e-07 7.24633e-07 9.77371e-07 1.31404e-06 1.76105e-06 2.35258e-06 3.13275e-06 4.15832e-06 5.50199e-06 7.25659e-06 9.54016e-06 1.25023e-05 1.63317e-05 2.1266e-05 2.76026e-05 3.57128e-05 4.60584e-05 5.92113e-05 7.58768e-05 9.69224e-05 0.00012341 0.000156634 0.000198167 0.000249912 0.000314163 0.000393669 0.000491721 0.000612231 0.000759842 0.000940028 0.00115923 0.00142498 0.00174605 0.00213263 0.00259648 0.00315111 0.00381201 0.00459678 0.0055254 0.0066204 0.00790705 0.0094136 0.0111714 0.013215 0.0155826 0.0183156 0.0214592 0.0250621 0.0291763 0.0338573 0.0391639 0.0451575 0.0519019 0.0594631 0.0679081 0.0773047 0.0877205 0.0992216 0.111872 0.125732 0.140858 0.1573 0.1751 0.194291 0.214896 0.236928 0.260383 0.285247 0.311486 0.339053 0.367879 0.397882 0.428956 0.46098 0.493812 0.527292 0.561244 0.595473 0.62977 0.663916 0.697676 0.730811 0.763074 0.794216 0.823987 0.852144 0.878447 0.902668 0.924595 0.944027 0.960789 0.974725 0.985703 0.99362 0.998401 1 0.998401 0.99362 0.985703 0.974725 0.960789 0.944027 0.924595 0.902668 0.878447 0.852144 0.823987 0.794216 0.763074 0.730811 0.697676 0.663916 0.62977 0.595473 0.561244 0.527292 0.493812 0.46098 0.428956 0.397882 0.367879 0.339053 0.311486 0.285247 0.260383 0.236928 0.214896 0.194291 0.1751 0.1573 0.140858 0.125732 0.111872 0.0992216 0.0877205 0.0773047 0.0679081 0.0594631 0.0519019 0.0451575 0.0391639 0.0338573 0.0291763 0.0250621 0.0214592 0.0183156 0.0155826 0.013215 0.0111714 0.0094136 0.00790705 0.0066204 0.0055254 0.00459678 0.00381201 0.00315111 0.00259648 0.00213263 0.00174605 0.00142498 0.00115923 0.000940028 0.000759842 0.000612231 0.000491721 0.000393669 0.000314163 0.000249912 0.000198167 0.000156634 0.00012341 9.69224e-05 7.58768e-05 5.92113e-05 4.60584e-05 3.57128e-05 2.76026e-05 2.1266e-05 1.63317e-05 1.25023e-05 9.54016e-06 7.25659e-06 5.50199e-06 4.15832e-06 3.13275e-06 2.35258e-06 1.76105e-06 1.31404e-06 9.77371e-07 7.24633e-07 5.35535e-07 3.94519e-07 2.89706e-07 2.12059e-07 1.54727e-07; #X coords 0 1 199 0 200 140 1; -#X restore 428 548 graph; -#N canvas 94 264 319 348 make-table 0; -#X msg 75 31 bang; +#X restore 415 543 graph; +#N canvas 371 467 319 348 make-table 0; #X obj 75 60 t b b; #X obj 168 149 f; #X obj 206 149 + 1; @@ -40,48 +34,47 @@ #X obj 68 251 expr exp(-$f1*$f1); #X obj 82 139 sel 199; #X obj 68 222 expr ($f1-100)/25; -#X connect 0 0 1 0; +#X obj 75 29 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X connect 0 0 4 0; +#X connect 0 1 3 0; +#X connect 1 0 2 0; #X connect 1 0 5 0; -#X connect 1 1 4 0; -#X connect 2 0 3 0; -#X connect 2 0 6 0; -#X connect 2 0 9 0; -#X connect 3 0 2 1; -#X connect 4 0 2 1; -#X connect 5 0 2 0; -#X connect 6 0 10 0; -#X connect 6 1 7 1; -#X connect 8 0 7 0; -#X connect 9 0 5 1; -#X connect 10 0 8 0; -#X restore 256 733 pd make-table; +#X connect 1 0 8 0; +#X connect 2 0 1 1; +#X connect 3 0 1 1; +#X connect 4 0 1 0; +#X connect 5 0 9 0; +#X connect 5 1 6 1; +#X connect 7 0 6 0; +#X connect 8 0 4 1; +#X connect 9 0 7 0; +#X connect 10 0 0 0; +#X restore 418 743 pd make-table; #X obj 206 435 cos~; #X obj 206 412 -~ 0.25; #X obj 206 481 +~ 100; #X obj 206 504 tabread4~ bell-curve; #X obj 110 640 *~; #X text 238 529 waveshaper; -#X text 426 691 0; -#X text 617 690 200; +#X text 413 686 0; +#X text 604 685 200; #N canvas 0 0 450 300 (subpatch) 0; #X array F12-spectrum 259 float 0; #X coords 0 0.51 258 -0.008 256 130 1; -#X restore 398 353 graph; -#X text 395 485 0; -#X text 460 489 -- frequency --; -#X text 621 486 2700; +#X restore 385 348 graph; +#X text 382 480 0; +#X text 447 484 -- frequency --; +#X text 608 481 2700; #X obj 110 721 output~; -#X obj 187 624 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 207 649 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 171 629 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 191 654 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X text 33 45 Instead of using the two cosines as FM carrier oscillators \, we can use them as ring modulators for a natural or synthetic tone. Here we use waveshaping - to wit \, a sinusoid looking up a Gaussian bell curve. This has the nice properties that the partials are always positive cosines in phase \, and the spectrum spreads out smoothly as the index changes., f 87; #X obj 206 386 *~ 0.5; #X text 186 274 center frequency (tenths of fundamental), f 23; -#X obj 511 278 declare -stdpath ./; -#X obj 110 684 hip~ 5; #X text 33 123 For phase coherency \, the waveshaper and the cosine pair are driven from the same [phasor~] object. Since the waveshaping is done using a symmetric curve \, its output is at double the frequency of the input. So for each cycle of the phasor we compute a half-cycle of the sine function (by multiplying by 0.5 and subtracting 0.25 before the cosine lookup). We center the cosine output for lookup in a 200-point table containing a bell curve., f 87; #X text 48 625 ring mod step -->, f 8; -#X text 208 623 <-- graph once; -#X text 228 650 <-- repeatedly; +#X text 192 628 <-- graph once; +#X text 212 655 <-- repeatedly; #N canvas 605 126 529 576 fft 0; #X obj 83 140 inlet~; #X obj 197 410 inlet; @@ -136,9 +129,24 @@ #X connect 27 0 29 0; #X connect 28 0 23 1; #X connect 29 0 21 1; -#X restore 168 675 pd fft; +#X restore 152 680 pd fft; #X text 33 217 Then with [*~] we do the ring modulation and we're done. This is the PAF (phase-aligned formant) synthesis algorithm (patented 1993 by IRCAM \, the patent ran out in 2011)., f 87; #X obj 77 8 cnv 5 5 25 empty empty PAF:\ Two-Cosine\ Ring\ Modulator\ for\ Waveshaper 15 13 0 16 #dfdfdf #202020 0; +#X floatatom 50 317 4 0 0 0 - \$0-fundamental - 0; +#X floatatom 148 273 4 0 200 0 - \$0-center-freq - 0; +#X floatatom 272 412 4 0 500 0 - \$0-index - 0; +#X text 269 372 index (percent), f 9; +#N canvas 238 316 365 358 init 0; +#X obj 125 294 declare -stdpath ./; +#X obj 131 97 loadbang; +#X text 81 28 This subpatch initializes the patch and loads a value in the number boxes., f 29; +#X obj 131 126 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 131 153 f \$0; +#X msg 131 183 \; \$1-fundamental 220 \; \$1-center-freq 20 \; \$1-index 10; +#X connect 1 0 3 0; +#X connect 3 0 4 0; +#X connect 4 0 5 0; +#X restore 350 743 pd init; #X connect 0 0 6 1; #X connect 0 0 8 0; #X connect 1 0 5 0; @@ -150,29 +158,28 @@ #X connect 5 0 2 0; #X connect 6 0 7 0; #X connect 7 0 8 1; -#X connect 8 0 29 0; +#X connect 8 0 24 0; #X connect 9 0 4 0; #X connect 9 0 3 0; -#X connect 10 0 11 0; -#X connect 11 0 13 0; -#X connect 12 0 9 0; -#X connect 13 0 12 0; -#X connect 14 0 9 1; -#X connect 14 0 5 1; -#X connect 14 0 1 0; -#X connect 14 0 41 0; -#X connect 15 0 14 0; -#X connect 19 0 22 0; -#X connect 20 0 21 1; -#X connect 21 0 27 0; -#X connect 22 0 20 0; -#X connect 25 0 21 0; -#X connect 26 0 25 0; -#X connect 27 0 28 0; -#X connect 28 0 29 1; -#X connect 29 0 44 0; -#X connect 29 0 49 0; -#X connect 38 0 49 1; -#X connect 39 0 49 2; -#X connect 41 0 26 0; -#X connect 44 0 37 0; +#X connect 10 0 12 0; +#X connect 11 0 9 0; +#X connect 12 0 11 0; +#X connect 13 0 9 1; +#X connect 13 0 5 1; +#X connect 13 0 1 0; +#X connect 13 0 36 0; +#X connect 15 0 16 1; +#X connect 16 0 22 0; +#X connect 17 0 15 0; +#X connect 20 0 16 0; +#X connect 21 0 20 0; +#X connect 22 0 23 0; +#X connect 23 0 24 1; +#X connect 24 0 42 0; +#X connect 24 0 32 0; +#X connect 33 0 42 1; +#X connect 34 0 42 2; +#X connect 36 0 21 0; +#X connect 45 0 13 0; +#X connect 46 0 10 0; +#X connect 47 0 17 0; diff --git a/doc/3.audio.examples/F13.paf.control.pd b/doc/3.audio.examples/F13.paf.control.pd index 1c01c897..6f7fb913 100644 --- a/doc/3.audio.examples/F13.paf.control.pd +++ b/doc/3.audio.examples/F13.paf.control.pd @@ -1,25 +1,50 @@ -#N canvas 484 38 626 757 12; +#N canvas 484 38 626 796 12; #X declare -stdpath ./; -#X obj 116 522 cos~; -#X obj 116 463 *~; -#X obj 156 522 cos~; -#X obj 229 473 wrap~; -#X obj 193 473 -~; -#X obj 156 499 +~; -#X obj 156 564 -~; -#X obj 186 595 *~; -#X obj 150 600 +~; -#X obj 193 441 samphold~; -#X floatatom 193 234 4 0 127 0 - - - 0; -#X obj 193 308 line~; -#X obj 193 284 pack 0 50; -#X obj 116 384 phasor~; -#X floatatom 116 280 4 0 127 0 - - - 0; -#X floatatom 354 302 4 0 127 0 - - - 0; -#X obj 354 373 line~; -#X obj 336 509 *~; -#X obj 354 350 pack 0 50; -#N canvas 270 258 499 360 make-table 0; +#X obj 116 552 cos~; +#X obj 116 493 *~; +#X obj 156 552 cos~; +#X obj 229 503 wrap~; +#X obj 193 503 -~; +#X obj 156 529 +~; +#X obj 156 594 -~; +#X obj 186 625 *~; +#X obj 150 630 +~; +#X obj 193 471 samphold~; +#X floatatom 193 264 4 0 127 0 - \$0-center-freq - 0; +#X obj 193 338 line~; +#X obj 193 314 pack 0 50; +#X obj 116 414 phasor~; +#X floatatom 116 310 4 0 127 0 - \$0-fundamental - 0; +#X floatatom 354 332 4 0 127 0 - \$0-bandwidth - 0; +#X obj 354 403 line~; +#X obj 336 539 *~; +#X obj 354 380 pack 0 50; +#X obj 291 508 cos~; +#X obj 291 483 -~ 0.25; +#X obj 336 565 +~ 100; +#X obj 336 588 tabread4~ bell-curve; +#X obj 181 663 *~; +#X text 346 615 waveshaper; +#X obj 116 334 mtof; +#X obj 211 366 expr 1/$f1; +#X obj 193 290 mtof; +#X obj 193 390 *~; +#X obj 354 354 mtof; +#X obj 354 439 *~; +#X obj 354 463 *~ 25; +#X text 394 438 divide by fundamental; +#X text 412 462 range for table; +#X text 391 552 offset to middle of table, f 16; +#X text 199 410 C.F. relative; +#X text 200 426 to fundamental; +#X text 217 661 ring mod; +#X obj 181 700 output~; +#X obj 291 458 *~ 0.5; +#X text 23 66 The more "natural" units for describing a formant might be center frequency and bandwidth \, so that you can change the fundamental without having the formant shift up and down in parallel. Here all three frequencies are expressed in MIDI units. The bandwidth and center frequency have to be divided by the fundamental (the expr 1/$f1 takes its reciprocal and two [*~] objects finish the division.), f 81; +#X text 23 154 Here we take a somewhat lax approach to sampholding the center frequency control. The frequency itself changes instantly \, but the center/fundamental frequency ratio waits for the next period. This gives a slight "chirp" if the fundamental is abruptly raised a couple of octaves. There's no easy way using Pd's built-in primitives to avoid this. Note however that there's a [paf~] extern available which solves this problem better and \, moreover \, runs much faster., f 81; +#X text 78 272 fundamental (MIDI units), f 12; +#X obj 42 19 cnv 5 5 25 empty empty Changing\ PAF\ Controls\ to\ Natural\ Units 15 13 0 16 #dfdfdf #202020 0; +#N canvas 270 258 499 360 table 0; #X obj 74 62 t b b; #X obj 152 131 f; #X obj 190 131 + 1; @@ -36,6 +61,7 @@ #X coords 0 1 199 0 200 140 1; #X restore 253 106 graph; #X obj 74 26 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 100 25 <- remake the table; #X connect 0 0 4 0; #X connect 0 1 3 0; #X connect 1 0 2 0; @@ -50,35 +76,20 @@ #X connect 8 0 4 1; #X connect 9 0 7 0; #X connect 11 0 0 0; -#X restore 446 629 pd make-table; -#X obj 291 478 cos~; -#X obj 291 453 -~ 0.25; -#X obj 336 535 +~ 100; -#X obj 336 558 tabread4~ bell-curve; -#X obj 181 633 *~; -#X text 345 585 waveshaper; -#X obj 116 304 mtof; -#X obj 211 336 expr 1/$f1; -#X obj 193 260 mtof; -#X obj 193 360 *~; -#X text 352 277 bandwidth; -#X obj 354 324 mtof; -#X obj 354 409 *~; -#X obj 354 433 *~ 25; -#X text 394 408 divide by fundamental; -#X text 412 432 range for table; -#X text 391 533 offset to middle of table; -#X text 199 380 C.F. relative; -#X text 200 396 to fundamental; -#X text 217 631 ring mod; -#X obj 181 670 output~; -#X obj 291 428 *~ 0.5; -#X obj 457 254 declare -stdpath ./; -#X text 23 46 The more "natural" units for describing a formant might be center frequency and bandwidth \, so that you can change the fundamental without having the formant shift up and down in parallel. Here all three frequencies are expressed in MIDI units. The bandwidth and center frequency have to be divided by the fundamental (the expr 1/$f1 takes its reciprocal and two [*~] objects finish the division.), f 81; -#X text 23 124 Here we take a somewhat lax approach to sampholding the center frequency control. The frequency itself changes instantly \, but the center/fundamental frequency ratio waits for the next period. This gives a slight "chirp" if the fundamental is abruptly raised a couple of octaves. There's no easy way using Pd's built-in primitives to avoid this. Note however that there's a [paf~] extern available which solves this problem better and \, moreover \, runs much faster., f 81; -#X text 227 234 center freq.; -#X text 78 242 fundamental (MIDI units), f 12; -#X obj 77 11 cnv 5 5 25 empty empty Changing\ PAF\ Controls\ to\ Natural\ Units 15 13 0 16 #dfdfdf #202020 0; +#X restore 451 705 pd table; +#N canvas 238 316 365 358 init 0; +#X obj 125 294 declare -stdpath ./; +#X obj 131 97 loadbang; +#X text 81 28 This subpatch initializes the patch and loads a value in the number boxes., f 29; +#X obj 131 126 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 131 153 f \$0; +#X msg 131 183 \; \$1-fundamental 48 \; \$1-center-freq 60 \; \$1-bandwidth 72; +#X connect 1 0 3 0; +#X connect 3 0 4 0; +#X connect 4 0 5 0; +#X restore 372 705 pd init; +#X text 227 264 center freq. (also MIDI); +#X text 393 332 bandwidth (MIDI); #X connect 0 0 6 1; #X connect 0 0 8 0; #X connect 1 0 5 0; @@ -90,33 +101,33 @@ #X connect 5 0 2 0; #X connect 6 0 7 0; #X connect 7 0 8 1; -#X connect 8 0 24 0; +#X connect 8 0 23 0; #X connect 9 0 4 0; #X connect 9 0 3 0; -#X connect 10 0 28 0; -#X connect 11 0 29 0; +#X connect 10 0 27 0; +#X connect 11 0 28 0; #X connect 12 0 11 0; #X connect 13 0 9 1; #X connect 13 0 1 0; #X connect 13 0 5 1; -#X connect 13 0 41 0; -#X connect 14 0 26 0; -#X connect 15 0 31 0; -#X connect 16 0 32 0; -#X connect 17 0 22 0; +#X connect 13 0 39 0; +#X connect 14 0 25 0; +#X connect 15 0 29 0; +#X connect 16 0 30 0; +#X connect 17 0 21 0; #X connect 18 0 16 0; -#X connect 20 0 17 0; -#X connect 21 0 20 0; -#X connect 22 0 23 0; -#X connect 23 0 24 1; -#X connect 24 0 40 0; -#X connect 26 0 27 0; -#X connect 26 0 13 0; -#X connect 27 0 29 1; -#X connect 27 0 32 1; -#X connect 28 0 12 0; -#X connect 29 0 9 0; -#X connect 31 0 18 0; -#X connect 32 0 33 0; -#X connect 33 0 17 1; -#X connect 41 0 21 0; +#X connect 19 0 17 0; +#X connect 20 0 19 0; +#X connect 21 0 22 0; +#X connect 22 0 23 1; +#X connect 23 0 38 0; +#X connect 25 0 26 0; +#X connect 25 0 13 0; +#X connect 26 0 28 1; +#X connect 26 0 30 1; +#X connect 27 0 12 0; +#X connect 28 0 9 0; +#X connect 29 0 18 0; +#X connect 30 0 31 0; +#X connect 31 0 17 1; +#X connect 39 0 20 0; diff --git a/doc/3.audio.examples/F14.wave.packet.pd b/doc/3.audio.examples/F14.wave.packet.pd index 03b7c9e2..9c0fe331 100644 --- a/doc/3.audio.examples/F14.wave.packet.pd +++ b/doc/3.audio.examples/F14.wave.packet.pd @@ -1,11 +1,7 @@ #N canvas 453 38 640 725 12; #X declare -stdpath ./; -#X floatatom 303 225 4 0 127 0 - - - 0; #X obj 303 301 line~; #X obj 303 278 pack 0 50; -#X floatatom 166 242 4 0 127 0 - - - 0; -#X text 73 236 fundamental; -#X floatatom 402 241 4 0 127 0 - - - 0; #X obj 402 315 line~; #X obj 108 517 *~; #X obj 402 289 pack 0 50; @@ -18,7 +14,6 @@ #X obj 402 263 mtof; #X obj 402 376 *~; #X text 435 375 divide by fundamental; -#X text 66 252 (MIDI units); #X obj 111 654 output~; #X obj 43 340 phasor~; #X obj 462 443 +~ 0.5; @@ -45,58 +40,72 @@ #X obj 402 400 max~ 1; #X obj 166 277 - 12; #X text 514 433 second phase signal out of phase from first one, f 13; -#X obj 461 593 declare -stdpath ./; #X text 69 62 The stretched wavetable method is an alternative to the PAF generator \, slightly more expensive in processing time but with the advantage it can be generalized to use samples instead of sinusoids to make complex spectral shapes., f 71; #X text 69 130 The patch is almost exactly like B13 (the overlapping sample) except that \, instead of using [tabread~] we just use [cos~] \, and that we control pulse width (for bandwidth) as well as wavetable transposition (for center frequency)., f 71; #X text 259 210 center freq., f 6; -#X obj 98 22 cnv 5 5 25 empty empty Wave\ Packets\ as\ Alternative\ to\ PAF 15 13 0 16 #dfdfdf #202020 0; -#X connect 0 0 12 0; -#X connect 1 0 13 0; -#X connect 2 0 1 0; -#X connect 3 0 43 0; -#X connect 5 0 15 0; -#X connect 6 0 16 0; -#X connect 7 0 31 0; -#X connect 8 0 6 0; -#X connect 9 0 23 0; -#X connect 10 0 11 0; -#X connect 10 0 20 0; -#X connect 11 0 13 1; -#X connect 11 0 16 1; -#X connect 12 0 2 0; -#X connect 13 0 29 0; -#X connect 13 0 39 0; -#X connect 15 0 8 0; -#X connect 16 0 42 0; -#X connect 20 0 21 0; -#X connect 20 0 24 0; -#X connect 20 0 29 1; -#X connect 20 0 28 1; +#X obj 39 22 cnv 5 5 25 empty empty Wave\ Packets\ as\ Alternative\ to\ PAF 15 13 0 16 #dfdfdf #202020 0; +#N canvas 238 316 365 358 init 0; +#X obj 125 294 declare -stdpath ./; +#X obj 131 97 loadbang; +#X text 81 28 This subpatch initializes the patch and loads a value in the number boxes., f 29; +#X obj 131 126 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 131 153 f \$0; +#X msg 131 183 \; \$1-fundamental 48 \; \$1-center-freq 60 \; \$1-bandwidth 72; +#X connect 1 0 3 0; +#X connect 3 0 4 0; +#X connect 4 0 5 0; +#X restore 427 658 pd init; +#X floatatom 303 225 4 0 127 0 - \$0-center-freq - 0; +#X floatatom 166 246 4 0 127 0 - \$0-fundamental - 0; +#X floatatom 402 238 4 0 127 0 - \$0-bandwidth - 0; +#X text 77 244 fundamental; +#X connect 0 0 9 0; +#X connect 1 0 0 0; +#X connect 2 0 12 0; +#X connect 3 0 26 0; +#X connect 4 0 2 0; +#X connect 5 0 18 0; +#X connect 6 0 7 0; +#X connect 6 0 15 0; +#X connect 7 0 9 1; +#X connect 7 0 12 1; +#X connect 8 0 1 0; +#X connect 9 0 24 0; +#X connect 9 0 34 0; +#X connect 11 0 4 0; +#X connect 12 0 37 0; +#X connect 15 0 16 0; +#X connect 15 0 19 0; +#X connect 15 0 24 1; +#X connect 15 0 23 1; +#X connect 16 0 17 0; +#X connect 17 0 30 0; +#X connect 17 0 34 1; +#X connect 17 0 33 1; +#X connect 18 0 25 1; +#X connect 19 0 3 0; +#X connect 19 0 21 0; +#X connect 20 0 14 0; #X connect 21 0 22 0; -#X connect 22 0 35 0; -#X connect 22 0 39 1; -#X connect 22 0 38 1; -#X connect 23 0 30 1; -#X connect 24 0 7 0; -#X connect 24 0 26 0; -#X connect 25 0 19 0; -#X connect 26 0 27 0; -#X connect 27 0 30 0; -#X connect 28 0 7 1; -#X connect 29 0 26 1; -#X connect 30 0 25 0; -#X connect 31 0 9 0; -#X connect 32 0 41 0; -#X connect 33 0 34 0; -#X connect 34 0 40 1; -#X connect 35 0 32 0; -#X connect 35 0 36 0; -#X connect 36 0 37 0; -#X connect 37 0 40 0; -#X connect 38 0 32 1; -#X connect 39 0 36 1; -#X connect 40 0 25 1; -#X connect 41 0 33 0; -#X connect 42 0 28 0; -#X connect 42 0 38 0; -#X connect 43 0 10 0; +#X connect 22 0 25 0; +#X connect 23 0 3 1; +#X connect 24 0 21 1; +#X connect 25 0 20 0; +#X connect 26 0 5 0; +#X connect 27 0 36 0; +#X connect 28 0 29 0; +#X connect 29 0 35 1; +#X connect 30 0 27 0; +#X connect 30 0 31 0; +#X connect 31 0 32 0; +#X connect 32 0 35 0; +#X connect 33 0 27 1; +#X connect 34 0 31 1; +#X connect 35 0 20 1; +#X connect 36 0 28 0; +#X connect 37 0 23 0; +#X connect 37 0 33 0; +#X connect 38 0 6 0; +#X connect 45 0 8 0; +#X connect 46 0 38 0; +#X connect 47 0 11 0; diff --git a/doc/3.audio.examples/G01.delay.pd b/doc/3.audio.examples/G01.delay.pd index c92ded36..9cf4d06b 100644 --- a/doc/3.audio.examples/G01.delay.pd +++ b/doc/3.audio.examples/G01.delay.pd @@ -1,16 +1,5 @@ -#N canvas 538 93 688 503 12; +#N canvas 538 93 679 573 12; #X declare -stdpath ./; -#N canvas 293 125 428 350 sample 0; -#N canvas 0 0 450 300 (subpatch) 0; -#X array G01-tab 62079 float 2; -#X coords 0 1 62079 -1 200 140 1; -#X restore 88 42 graph; -#X obj 68 218 loadbang; -#X obj 67 283 soundfiler; -#X msg 68 251 read -resize ../sound/voice.wav G01-tab; -#X connect 1 0 3 0; -#X connect 3 0 2 0; -#X restore 281 424 pd sample; #X floatatom 63 284 6 0 999 0 - - - 0; #X text 71 328 read from delay line; #X obj 63 357 delread~ delay1; @@ -21,22 +10,31 @@ #X obj 45 387 +~; #X obj 59 242 delwrite~ delay1 1000; #X text 61 198 test signal to delay; -#X obj 454 72 declare -stdpath ./; -#X text 269 126 You can delay a signal using the [delwrite~] and [delread~] objects. In this example \, a sample loops continuously and is added to a delayed copy of itself., f 55; -#X text 269 181 The [delwrite~] object creates the delay line. You give it a name and a size in milliseconds. Each [delwrite~] should have a different name., f 55; -#X text 269 232 The arguments of [delread~] are the name of a delwrite (of which there should be exactly one) and an optional delay time in milliseconds between 0 and the length of the delay line. The [delread~] object delays the signal at integer number of samples and does no interpolation., f 55; -#X text 269 311 Each [delwrite~] may have as many [delread~] objects as you wish \, which can then function as multiple delay taps., f 55; +#X obj 45 503 declare -stdpath ./; +#X text 250 28 You can delay a signal using the [delwrite~] and [delread~] objects. In this example \, a sample loops continuously and is added to a delayed copy of itself., f 55; +#X text 250 83 The [delwrite~] object creates the delay line. You give it a name and a size in milliseconds. Each [delwrite~] should have a different name., f 55; +#X text 250 134 The arguments of [delread~] are the name of a delwrite (of which there should be exactly one) and an optional delay time in milliseconds between 0 and the length of the delay line. The [delread~] object delays the signal at integer number of samples and does no interpolation., f 55; +#X text 250 213 Each [delwrite~] may have as many [delread~] objects as you wish \, which can then function as multiple delay taps., f 55; #X text 116 283 <-- delay time (msec), f 11; #X obj 44 73 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; #X obj 44 134 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X text 69 73 <-- play repeatedly; #X text 71 135 <-- play; -#X obj 282 67 cnv 5 5 25 empty empty Delays 15 13 0 16 #dfdfdf #202020 0; -#X connect 1 0 3 0; -#X connect 3 0 8 1; -#X connect 4 0 8 0; -#X connect 4 0 9 0; -#X connect 5 0 18 0; -#X connect 8 0 7 0; -#X connect 17 0 5 0; -#X connect 18 0 4 0; +#X obj 51 14 cnv 5 5 25 empty empty Delays 15 13 0 16 #dfdfdf #202020 0; +#N canvas 0 0 450 300 (subpatch) 0; +#X array G01-tab 62079 float 2; +#X coords 0 1 62079 -1 241 149 1; +#X restore 341 286 graph; +#X obj 243 429 loadbang; +#X obj 243 494 soundfiler; +#X msg 243 462 read -resize ../sound/voice.wav G01-tab; +#X connect 0 0 2 0; +#X connect 2 0 7 1; +#X connect 3 0 7 0; +#X connect 3 0 8 0; +#X connect 4 0 17 0; +#X connect 7 0 6 0; +#X connect 16 0 4 0; +#X connect 17 0 3 0; +#X connect 22 0 24 0; +#X connect 24 0 23 0; diff --git a/doc/3.audio.examples/G02.delay.loop.pd b/doc/3.audio.examples/G02.delay.loop.pd index e316823c..be2e0fd7 100644 --- a/doc/3.audio.examples/G02.delay.loop.pd +++ b/doc/3.audio.examples/G02.delay.loop.pd @@ -1,30 +1,30 @@ #N canvas 515 38 550 623 12; #X declare -stdpath ./; -#X floatatom 134 230 7 -30 130 0 - - - 0; -#X floatatom 152 356 7 0 0 0 - - - 0; -#X text 329 481 write to delay line; -#X text 301 385 read from delay line; -#X text 165 443 add the original and the delayed signal; -#X obj 134 266 mtof; -#X msg 208 266 1; -#X obj 134 319 *~; -#X obj 134 442 +~; -#X obj 152 413 *~ 0.7; -#X obj 208 319 *~; -#X obj 134 521 output~; -#X obj 134 290 phasor~; -#X obj 162 482 delwrite~ G02-del 2000; -#X obj 355 30 declare -stdpath ./; +#X floatatom 104 228 7 0 130 0 - - - 0; +#X floatatom 122 362 7 0 0 0 - - - 0; +#X text 299 487 write to delay line; +#X text 271 391 read from delay line; +#X text 135 449 add the original and the delayed signal; +#X obj 104 272 mtof; +#X msg 178 266 1; +#X obj 104 325 *~; +#X obj 104 448 +~; +#X obj 122 419 *~ 0.7; +#X obj 178 325 *~; +#X obj 104 527 output~; +#X obj 104 296 phasor~; +#X obj 132 488 delwrite~ G02-del 2000; +#X obj 268 557 declare -stdpath ./; #X text 33 69 You can feed the result of a [delread~] module back into its own [delwrite~] \, as long as you're careful about stability. For delays below 30 msec \, you can frequently hear the resonant pitch. For longer delay times you get the famous old delay loop effect., f 66; -#X text 209 356 <-- set delay time; -#X text 207 415 feedback gain (less than 1 for stability); -#X obj 208 290 adsr 1 100 1000 0 0; -#X obj 152 385 delread~ G02-del 150; -#X obj 134 201 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 179 362 <-- set delay time; +#X text 177 421 feedback gain (less than 1 for stability); +#X obj 178 296 adsr 1 100 1000 0 0; +#X obj 122 391 delread~ G02-del 150; #X text 33 138 We've added an amplitude control here so that the test oscillator only speaks while you're dragging the pitch up and down or when hitting 'bang'. Be sure to try shift-dragging on the pitch control., f 66; -#X text 189 229 <-- set pitch; -#X text 356 284 ADSR only uses attack and decay stages, f 22; +#X text 323 294 ADSR only uses attack and decay stages, f 22; #X obj 54 24 cnv 5 5 25 empty empty Delays\ With\ Feedback 15 13 0 16 #dfdfdf #202020 0; +#X text 159 227 <-- click and drag or set pitch; +#X text 209 265 <-- click to retrigger; #X connect 0 0 5 0; #X connect 0 0 6 0; #X connect 1 0 19 0; @@ -39,4 +39,3 @@ #X connect 18 0 10 0; #X connect 18 0 10 1; #X connect 19 0 9 0; -#X connect 20 0 0 0; diff --git a/doc/3.audio.examples/G03.delay.variable.pd b/doc/3.audio.examples/G03.delay.variable.pd index 7e449911..db0e8e13 100644 --- a/doc/3.audio.examples/G03.delay.variable.pd +++ b/doc/3.audio.examples/G03.delay.variable.pd @@ -1,73 +1,82 @@ -#N canvas 561 38 603 649 12; +#N canvas 514 38 603 649 12; #X declare -stdpath ./; -#X obj 100 331 hip~ 10; -#X floatatom 326 300 5 0 0 0 - - - 0; -#X obj 326 350 line~; -#X floatatom 255 248 5 0 0 0 - - - 0; -#X floatatom 255 447 5 0 0 0 - - - 0; -#X obj 255 520 line~; -#X obj 255 472 * 0.01; -#X floatatom 156 201 5 0 0 0 - - - 0; +#X floatatom 326 290 5 0 0 0 - \$0-cycle-depth - 0; +#X obj 326 340 line~; +#X floatatom 255 238 5 0 0 0 - \$0-cycle-freq - 0; +#X floatatom 255 437 5 0 0 0 - \$0-feedback - 0; +#X obj 255 510 line~; +#X obj 255 462 * 0.01; +#X floatatom 156 201 5 0 200 0 - \$0-timbre - 0; #X obj 156 278 line~; #X obj 100 277 *~; #X obj 100 304 cos~; -#X floatatom 100 165 6 0 0 0 - - - 0; +#X floatatom 100 165 6 0 100 0 - \$0-pitch - 0; #X obj 100 192 mtof; #X obj 100 220 * 0.5; #X obj 100 359 clip~ -0.2 0.2; #X obj 156 229 * 0.01; -#X obj 100 396 +~; -#X obj 237 548 *~; -#X obj 255 351 *~; -#X obj 100 430 hip~ 5; -#X obj 255 322 +~ 1; -#X obj 255 378 +~ 1.46; +#X obj 100 466 +~; +#X obj 237 538 *~; +#X obj 255 341 *~; +#X obj 255 312 +~ 1; +#X obj 255 368 +~ 1.46; #X obj 100 548 output~; -#X obj 237 596 delwrite~ G03-del 1000; -#X obj 237 572 clip~ -1 1; -#X obj 406 21 declare -stdpath ./; -#X obj 326 326 pack f 100; +#X obj 237 586 delwrite~ G03-del 1000; +#X obj 237 562 clip~ -1 1; +#X obj 326 316 pack f 100; #X obj 156 253 pack f 100; #X obj 100 249 osc~; -#X obj 255 409 delread4~ G03-del; +#X obj 255 399 delread4~ G03-del; #X text 31 67 This is a fuzzed FM generator going into a delay loop \, this time using a variable delay object ([delread4~]) that also performs interpolation for non integer indexes. You can get several interesting effects this way. We have taken the precaution of clipping inside the loop to avoid instabilities. You can push the loop gain past 1 if you want \, it will just oscillate., f 76; -#X obj 255 496 pack f 100; +#X obj 255 486 pack f 100; #X text 149 164 <-- pitch; -#X text 197 202 <-- timbre; -#X text 297 247 <-- cycle frequency (hundredths); -#X text 367 300 <-- cycle depth (msec); -#X text 300 447 <-- feedback (hundredths); -#X obj 255 298 osc~; -#X obj 255 274 * 0.01; +#X text 200 199 <-- timbre; +#X text 297 237 <-- cycle frequency (hundredths); +#X text 367 290 <-- cycle depth (msec); +#X text 300 437 <-- feedback (hundredths); +#X obj 255 288 osc~; +#X obj 255 264 * 0.01; #X obj 76 20 cnv 5 5 25 empty empty Variable\ Time\ Delays 15 13 0 16 #dfdfdf #202020 0; -#X connect 0 0 14 0; -#X connect 1 0 26 0; -#X connect 2 0 18 1; -#X connect 3 0 38 0; -#X connect 4 0 6 0; -#X connect 5 0 17 1; -#X connect 6 0 31 0; -#X connect 7 0 15 0; -#X connect 8 0 9 1; -#X connect 9 0 10 0; -#X connect 10 0 0 0; +#X obj 100 331 hip~ 5; +#X text 151 330 Remove DC; +#N canvas 857 345 365 358 init 0; +#X obj 125 294 declare -stdpath ./; +#X obj 131 97 loadbang; +#X text 81 28 This subpatch initializes the patch and loads a value in the number boxes., f 29; +#X obj 131 126 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 131 153 f \$0; +#X msg 131 183 \; \$1-pitch 48 \; \$1-timbre 20 \; \$1-cycle-freq 50 \; \$1-cycle-depth 50 \; \$1-feedback 75; +#X connect 1 0 3 0; +#X connect 3 0 4 0; +#X connect 4 0 5 0; +#X restore 459 550 pd init; +#X connect 0 0 23 0; +#X connect 1 0 17 1; +#X connect 2 0 35 0; +#X connect 3 0 5 0; +#X connect 4 0 16 1; +#X connect 5 0 28 0; +#X connect 6 0 14 0; +#X connect 7 0 8 1; +#X connect 8 0 9 0; +#X connect 9 0 37 0; +#X connect 10 0 11 0; #X connect 11 0 12 0; -#X connect 12 0 13 0; -#X connect 13 0 28 0; -#X connect 14 0 16 0; -#X connect 15 0 27 0; -#X connect 16 0 19 0; -#X connect 17 0 24 0; -#X connect 18 0 21 0; -#X connect 19 0 17 0; -#X connect 19 0 22 0; -#X connect 20 0 18 0; -#X connect 21 0 29 0; -#X connect 24 0 23 0; -#X connect 26 0 2 0; -#X connect 27 0 8 0; -#X connect 28 0 9 0; -#X connect 29 0 16 1; -#X connect 31 0 5 0; -#X connect 37 0 20 0; -#X connect 38 0 37 0; +#X connect 12 0 25 0; +#X connect 13 0 15 0; +#X connect 14 0 24 0; +#X connect 15 0 20 0; +#X connect 15 0 16 0; +#X connect 16 0 22 0; +#X connect 17 0 19 0; +#X connect 18 0 17 0; +#X connect 19 0 26 0; +#X connect 22 0 21 0; +#X connect 23 0 1 0; +#X connect 24 0 7 0; +#X connect 25 0 8 0; +#X connect 26 0 15 1; +#X connect 28 0 4 0; +#X connect 34 0 18 0; +#X connect 35 0 34 0; +#X connect 37 0 13 0; diff --git a/doc/3.audio.examples/G06.octave.doubler.pd b/doc/3.audio.examples/G06.octave.doubler.pd index a2c4eb99..c617f4b2 100644 --- a/doc/3.audio.examples/G06.octave.doubler.pd +++ b/doc/3.audio.examples/G06.octave.doubler.pd @@ -1,7 +1,7 @@ #N canvas 441 38 709 702 12; #X declare -stdpath ./; #X obj 54 558 output~; -#X obj 96 151 moses 1; +#X obj 96 154 moses 1; #X obj 142 183 mtof; #X text 173 427 on/off for original; #X obj 54 510 +~; @@ -21,8 +21,7 @@ #X obj 54 48 adc~ 1; #X obj 96 127 sigmund~ -npts 2048; #X text 241 127 track pitch; -#X text 158 151 reject low numbers indicating no pitch found; -#X text 188 481 We already saw how to use ring modulation to alias a pitched sound down one octave. Here we do the reverse: filter out all odd harmonics using a variable-delay comb filter tuned one octave above the incoming sound. We use two taps into the delay line. The fixed one (delread~) adjusts for the delayed output of sigmund~. The variable one (vd~) adds to this an additional delay equal to 1/2 the measured period of the incoming sound. These two are added. Odd harmonics are 180 degrees out of phase at the two taps and cancel. Even harmonics get through - so the sound goes up an octave \, without denaturing the timbre as a speed-up would., f 67; +#X text 158 154 reject low numbers indicating no pitch found; #X obj 115 443 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X obj 97 470 *~; #X obj 72 443 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; @@ -31,6 +30,7 @@ #X text 141 443 <-- and processed sounds; #X obj 115 387 delread4~ G06-del; #X obj 146 29 cnv 5 5 25 empty empty Octave\ Doubling\ via\ Variable\ Comb\ Filter 15 13 0 16 #dfdfdf #202020 0; +#X text 188 480 We already saw how to use ring modulation to alias a pitched sound down one octave. Here we do the reverse: filter out all odd harmonics using a variable-delay comb filter tuned one octave above the incoming sound. We use two taps into the delay line. The fixed one ([delread~]) adjusts for the delayed output of [sigmund~]. The variable one ([delread4~]) adds to this an additional delay equal to 1/2 the measured period of the incoming sound. These two are added. Odd harmonics are 180 degrees out of phase at the two taps and cancel. Even harmonics get through - so the sound goes up an octave \, without denaturing the timbre as a speed-up would., f 67; #X connect 1 1 2 0; #X connect 2 0 11 0; #X connect 4 0 0 0; @@ -38,19 +38,19 @@ #X connect 6 0 10 0; #X connect 6 1 5 0; #X connect 8 0 9 0; -#X connect 9 0 24 0; +#X connect 9 0 23 0; #X connect 10 0 13 0; #X connect 11 0 6 0; -#X connect 12 0 29 0; +#X connect 12 0 28 0; #X connect 13 0 12 0; #X connect 16 0 10 1; #X connect 16 0 8 0; #X connect 18 0 7 0; #X connect 18 0 19 0; -#X connect 18 0 26 0; +#X connect 18 0 25 0; #X connect 19 0 1 0; -#X connect 23 0 24 1; -#X connect 24 0 4 1; -#X connect 25 0 26 1; -#X connect 26 0 4 0; -#X connect 29 0 9 1; +#X connect 22 0 23 1; +#X connect 23 0 4 1; +#X connect 24 0 25 1; +#X connect 25 0 4 0; +#X connect 28 0 9 1; diff --git a/doc/3.audio.examples/G07.shaker.pd b/doc/3.audio.examples/G07.shaker.pd index 8b30cdab..4522ced0 100644 --- a/doc/3.audio.examples/G07.shaker.pd +++ b/doc/3.audio.examples/G07.shaker.pd @@ -1,40 +1,44 @@ -#N canvas 356 76 793 540 12; +#N canvas 496 77 637 757 12; #X declare -stdpath ./; -#X obj 54 415 output~; -#X obj 54 375 +~; -#X obj 63 184 delwrite~ G07-del 30; -#X obj 347 381 line~; -#X obj 196 388 *~; -#X obj 302 328 line~; -#X obj 159 330 *~; -#X obj 111 298 line~; -#X obj 72 295 *~; -#X obj 90 215 line~; -#X obj 54 215 *~; -#X obj 316 80 + 1; -#X obj 316 103 mod 4; -#X obj 281 91 f; -#X obj 325 154 random 1000; -#X obj 281 129 t f b; -#X obj 281 26 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X floatatom 369 28 5 10 1000 0 - - - 0; -#X obj 281 236 route 0 1 2 3; -#X obj 72 249 delread~ G07-del 30; -#X obj 53 153 phasor~ 80; -#X obj 159 304 delread~ G07-del 17; -#X obj 196 362 delread~ G07-del 11; -#X obj 369 63 * 4; -#X obj 325 181 expr 2 * $f1/1000 - 0.7; -#X floatatom 53 130 5 30 1000 0 - - - 0; -#X obj 281 52 metro 50; -#X text 53 106 frequency; -#X text 229 26 on/off; -#X text 413 28 time constant (msec); -#X text 422 377 Any collection of four gains for the four delayed copies of the signal (including the original) defines some sort of irregular comb filter. The peaks and valleys of the comb filter shift constantly as the gains change to new \, random values., f 45; -#X obj 546 84 declare -stdpath ./; -#X obj 281 209 pack f f 200, f 13; -#X text 422 224 This is a time-varying comb filter \, combining four delayed copies of the input signal. The amplitude of each delayed copy varies randomly between -0.7 and +1.3. Each time the metronome goes off \, one of the four delay's gains is changed in sequence. The change occurs over the next four ticks of the metronome (so \, if the metronome ticks every 50 msec \, each message to a [line~] has a second argument of 200.), f 45; -#X obj 47 35 cnv 5 5 25 empty empty The\ "Shaker" 15 13 0 16 #dfdfdf #202020 0; +#X obj 84 568 output~; +#X obj 84 528 +~; +#X obj 93 337 delwrite~ G07-del 30; +#X obj 377 534 line~; +#X obj 226 541 *~; +#X obj 332 481 line~; +#X obj 189 483 *~; +#X obj 141 451 line~; +#X obj 102 448 *~; +#X obj 120 368 line~; +#X obj 84 368 *~; +#X obj 346 233 + 1; +#X obj 346 256 mod 4; +#X obj 311 244 f; +#X obj 355 307 random 1000; +#X obj 311 282 t f b; +#X obj 311 179 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X floatatom 399 231 5 10 1000 0 - - - 0; +#X obj 311 389 route 0 1 2 3; +#X obj 102 402 delread~ G07-del 30; +#X obj 189 457 delread~ G07-del 17; +#X obj 226 515 delread~ G07-del 11; +#X obj 399 266 * 4; +#X obj 355 334 expr 2 * $f1/1000 - 0.7; +#X floatatom 83 276 5 30 1000 0 - - - 0; +#X text 125 276 frequency; +#X text 259 179 on/off; +#X text 443 231 time constant (msec); +#X text 71 667 Any collection of four gains for the four delayed copies of the signal (including the original) defines some sort of irregular comb filter. The peaks and valleys of the comb filter shift constantly as the gains change to new \, random values., f 73; +#X obj 245 593 declare -stdpath ./; +#X obj 311 362 pack f f 200, f 13; +#X text 28 61 This is a time-varying comb filter \, combining four delayed copies of the input signal. The amplitude of each delayed copy varies randomly between -0.7 and +1.3. Each time the metronome goes off \, one of the four delay's gains is changed in sequence. The change occurs over the next four ticks of the metronome (so \, if the metronome ticks every 50 msec \, each message to a [line~] has a second argument of 200.), f 80; +#X obj 52 18 cnv 5 5 25 empty empty The\ "Shaker" 15 13 0 16 #dfdfdf #202020 0; +#X obj 83 222 loadbang; +#X msg 83 248 80; +#X obj 83 303 phasor~; +#X obj 311 205 metro; +#X obj 399 181 loadbang; +#X msg 399 205 50; #X connect 1 0 0 0; #X connect 3 0 4 1; #X connect 4 0 1 1; @@ -48,23 +52,27 @@ #X connect 12 0 13 1; #X connect 13 0 11 0; #X connect 13 0 15 0; -#X connect 14 0 24 0; -#X connect 15 0 32 0; +#X connect 14 0 23 0; +#X connect 15 0 30 0; #X connect 15 1 14 0; -#X connect 16 0 26 0; -#X connect 17 0 23 0; -#X connect 17 0 26 1; +#X connect 16 0 36 0; +#X connect 17 0 22 0; +#X connect 17 0 36 1; #X connect 18 0 9 0; #X connect 18 1 7 0; #X connect 18 2 5 0; #X connect 18 3 3 0; #X connect 19 0 8 0; -#X connect 20 0 2 0; -#X connect 20 0 10 0; -#X connect 21 0 6 0; -#X connect 22 0 4 0; -#X connect 23 0 32 2; -#X connect 24 0 32 1; -#X connect 25 0 20 0; -#X connect 26 0 13 0; -#X connect 32 0 18 0; +#X connect 20 0 6 0; +#X connect 21 0 4 0; +#X connect 22 0 30 2; +#X connect 23 0 30 1; +#X connect 24 0 35 0; +#X connect 30 0 18 0; +#X connect 33 0 34 0; +#X connect 34 0 24 0; +#X connect 35 0 2 0; +#X connect 35 0 10 0; +#X connect 36 0 13 0; +#X connect 37 0 38 0; +#X connect 38 0 17 0; diff --git a/doc/3.audio.examples/G08.reverb.pd b/doc/3.audio.examples/G08.reverb.pd index f88c2533..875ebdff 100644 --- a/doc/3.audio.examples/G08.reverb.pd +++ b/doc/3.audio.examples/G08.reverb.pd @@ -1,7 +1,7 @@ #N canvas 514 73 467 484 12; #X declare -stdpath ./; -#N canvas 647 153 495 454 test-input 0; -#X obj 240 392 outlet~; +#N canvas 300 428 477 481 test-input 0; +#X obj 240 432 outlet~; #X obj 156 305 -~; #X obj 65 261 *~ 3; #X obj 174 235 *~ 2; @@ -9,26 +9,28 @@ #X obj 65 227 clip~ 0 0.667; #X obj 174 147 mtof; #X msg 258 154 1; -#X obj 240 359 *~; #X obj 258 188 adsr 100 100 2000 0 2000; #X obj 174 56 inlet; #X obj 174 181 phasor~; #X text 221 93 <-- pitch; #X obj 258 222 dbtorms~; -#X connect 1 0 8 0; +#X obj 156 339 hip~ 3; +#X obj 240 399 *~; +#X connect 1 0 13 0; #X connect 2 0 1 0; #X connect 3 0 1 1; #X connect 4 0 6 0; #X connect 4 0 7 0; #X connect 5 0 2 0; -#X connect 6 0 11 0; -#X connect 7 0 9 0; -#X connect 8 0 0 0; -#X connect 9 0 13 0; -#X connect 10 0 4 0; -#X connect 11 0 3 0; -#X connect 11 0 5 0; -#X connect 13 0 8 1; +#X connect 6 0 10 0; +#X connect 7 0 8 0; +#X connect 8 0 12 0; +#X connect 9 0 4 0; +#X connect 10 0 5 0; +#X connect 10 0 3 0; +#X connect 12 0 14 1; +#X connect 13 0 14 0; +#X connect 14 0 0 0; #X restore 87 185 pd test-input; #X floatatom 87 155 6 10 130 0 - - - 0; #X floatatom 147 221 6 0 100 0 - - - 0; diff --git a/doc/3.audio.examples/G09.pitchshift.pd b/doc/3.audio.examples/G09.pitchshift.pd index 3c7ac7cc..d362250a 100644 --- a/doc/3.audio.examples/G09.pitchshift.pd +++ b/doc/3.audio.examples/G09.pitchshift.pd @@ -1,140 +1,157 @@ -#N canvas 407 47 769 686 12; +#N canvas 449 38 792 716 12; #X declare -stdpath ./; -#X floatatom 101 79 6 0 0 0 - - - 0; -#X obj 101 450 *~; -#X obj 224 376 line~; -#X floatatom 224 131 6 0 0 0 - - - 0; -#X obj 224 105 r window; -#X obj 101 53 r transpose; -#X obj 101 135 exp; -#X floatatom 101 161 6 0 0 0 - - - 0; -#X obj 101 251 /; -#X obj 149 188 * 0.001; -#X obj 287 440 line~; -#X floatatom 287 364 8 0 0 0 - - - 0; -#X obj 287 338 r delay; -#X obj 101 487 +~; -#X obj 45 502 cos~; -#X obj 45 529 *~; -#X obj 165 573 +~; -#X obj 165 376 wrap~; -#X obj 241 435 *~; -#X obj 269 495 +~; -#X obj 183 512 cos~; -#X obj 183 539 *~; -#X msg 617 184 \; transpose 0 \; window 100 \; delay 0; -#X obj 617 158 loadbang; -#X obj 149 214 t b f; -#X floatatom 101 277 6 0 0 0 - - - 0; -#X obj 165 349 +~ 0.5; -#X obj 45 450 -~ 0.5; -#X obj 45 476 *~ 0.5; -#X obj 183 435 -~ 0.5; -#X obj 183 484 *~ 0.5; -#X obj 101 188 - 1; -#X obj 101 109 * 0.05776; -#X obj 101 214 * -1; -#X text 54 155 speed; -#X text 47 169 change; -#X text 29 268 tape head; -#N canvas 627 195 565 379 test-input 0; +#X floatatom 117 82 6 0 0 0 - transpose - 0; +#X obj 117 469 *~; +#X obj 240 395 line~; +#X floatatom 240 150 6 0 0 0 - window - 0; +#X floatatom 117 153 6 0 0 0 - - - 0; +#X obj 117 270 /; +#X obj 165 207 * 0.001; +#X obj 303 459 line~; +#X floatatom 303 383 8 0 0 0 - delay - 0; +#X obj 117 506 +~; +#X obj 61 521 cos~; +#X obj 61 548 *~; +#X obj 181 592 +~; +#X obj 181 395 wrap~; +#X obj 257 454 *~; +#X obj 257 514 +~; +#X obj 199 531 cos~; +#X obj 199 558 *~; +#X obj 165 233 t b f; +#X floatatom 117 296 6 0 0 0 - - - 0; +#X obj 181 368 +~ 0.5; +#X obj 61 469 -~ 0.5; +#X obj 61 495 *~ 0.5; +#X obj 199 454 -~ 0.5; +#X obj 199 503 *~ 0.5; +#X obj 117 207 - 1; +#X obj 117 233 * -1; +#X text 45 287 tape head; +#X obj 181 620 output~; +#X obj 117 327 phasor~; +#X obj 303 410 max 1.5; +#X obj 240 177 max 1; +#X text 45 300 rotation freq, f 9; +#X obj 482 274 delwrite~ G09-del 5000; +#X obj 257 543 delread4~ G09-del, f 9; +#X obj 117 532 delread4~ G09-del, f 9; +#X msg 240 368 \$1 200; +#X msg 303 434 \$1 200; +#X text 403 328 This is a classic rotating-tape-head style pitch shifter using the [delread4~] variable delay object. There are two moving tape heads \, each of which is loudest at the middle of its trajectory \, and enveloped out at the moment it has to jump back (or forward) to start another scratch. Most of the brain work is in computing how fast the tape heads have to move to get the desired transposition., f 49; +#X text 403 571 The [cos~] objects compute the fadein and fadeout of the two delay line outputs. They each traverse the positive half of the cosine waveform (phase -0.25 to +0.25) over the time the phase goes from one end to the other., f 49; +#X text 403 470 The "window size" is the total trajectory of the read points in the delay line \, in milliseconds. The delay times are controlled by a [phasor~] object. The second delay time \, 180 degrees out of phase from the first one \, is computed using the [wrap~] object., f 49; +#X obj 60 30 cnv 5 5 25 empty empty Pitch\ Shifter 15 13 0 16 #dfdfdf #202020 0; +#X text 300 358 delay (ms); +#X obj 117 111 expr pow(2 \, $f1/1200); +#X text 167 83 <-- transposition in cents; +#X text 163 145 speed change, f 6; +#N canvas 844 204 307 299 init 0; +#X obj 84 104 loadbang; +#X obj 72 225 declare -stdpath ./; +#X msg 84 130 \; transpose 0 \; window 100 \; delay 10; +#X text 41 21 This subpatch initialiazes the patch and loads values into number boxes., f 26; +#X connect 0 0 2 0; +#X restore 62 630 pd init; +#X text 364 220 sample loop for test signal -->, f 15; +#X obj 482 197 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 506 195 choose another sample; +#X text 291 150 <-- window (ms); +#N canvas 555 154 649 577 test-loop 0; +#X obj 121 511 outlet~; #N canvas 0 0 450 300 (subpatch) 0; -#X array array1 155944 float 2; -#X coords 0 1 155944 -1 200 150 1; -#X restore 302 170 graph; -#X obj 91 240 tabread4~ array1; -#X obj 63 52 r totsamps; -#X obj 91 135 /; -#X obj 91 187 *~ 0; -#X obj 91 214 +~ 1; -#X msg 63 108 44100; -#X obj 63 82 t b f, f 7; -#X obj 134 191 r totsamps; -#X obj 91 312 outlet~; -#X obj 193 111 soundfiler; -#X obj 193 139 s totsamps; -#X obj 91 161 phasor~; -#X msg 193 83 read -resize ../sound/bell.aiff array1; -#X obj 193 54 loadbang; -#X text 103 269 sample loop for test signal, f 16; +#X array \$0-sample 155944 float 2; +#X coords 0 1 155944 -1 279 142 1 0 0; +#X restore 308 268 graph; +#X obj 121 433 *~; +#X obj 163 394 phasor~; +#X obj 121 246 soundfiler; +#X obj 121 66 loadbang; +#X obj 121 94 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X msg 188 276 \$1; +#X obj 163 307 swap; +#X obj 163 335 /; +#X floatatom 163 365 10 0 0 0 - - - 0; +#X obj 175 160 symbol \$0-sample; +#X obj 121 469 tabread4~ \$0-sample; +#X obj 42 115 openpanel; +#X msg 121 215 read -resize \$1 \$2; +#X obj 121 188 pack s s; +#X obj 121 160 t a b; +#X floatatom 156 433 9 0 0 0 - - - 0; +#X floatatom 203 308 6 0 0 0 - - - 0; +#X text 204 327 sample rate, f 6; +#X text 223 434 length; +#X obj 42 75 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 42 41 inlet; +#X msg 121 124 ../sound/bell.aiff; +#X text 362 144 load file into array and play loop., f 22; +#X connect 2 0 12 0; +#X connect 3 0 2 0; +#X connect 4 0 8 0; +#X connect 4 0 17 0; +#X connect 4 1 7 0; +#X connect 5 0 6 0; +#X connect 6 0 23 0; +#X connect 7 0 8 1; +#X connect 7 0 18 0; +#X connect 8 0 9 0; +#X connect 8 1 9 1; +#X connect 9 0 10 0; +#X connect 10 0 3 0; +#X connect 11 0 15 1; +#X connect 12 0 0 0; +#X connect 13 0 16 0; +#X connect 14 0 4 0; +#X connect 15 0 14 0; +#X connect 16 0 15 0; +#X connect 16 1 11 0; +#X connect 17 0 2 1; +#X connect 21 0 13 0; +#X connect 22 0 21 0; +#X connect 23 0 16 0; +#X restore 482 235 pd test-loop; +#X connect 0 0 43 0; #X connect 1 0 9 0; -#X connect 2 0 7 0; -#X connect 3 0 12 0; -#X connect 4 0 5 0; -#X connect 5 0 1 0; -#X connect 6 0 3 0; -#X connect 7 0 6 0; -#X connect 7 1 3 1; -#X connect 8 0 4 1; -#X connect 10 0 11 0; -#X connect 12 0 4 0; -#X connect 13 0 10 0; -#X connect 14 0 13 0; -#X restore 392 186 pd test-input; -#X obj 165 601 output~; -#X obj 101 308 phasor~; -#X obj 287 391 max 1.5; -#X text 290 297 delay; -#X text 287 315 (msec); -#X obj 224 158 max 1; -#X text 29 281 rotation freq, f 9; -#X obj 392 217 delwrite~ G09-del 5000; -#X obj 536 86 declare -stdpath ./; -#X obj 269 524 delread4~ G09-del, f 9; -#X obj 101 513 delread4~ G09-del, f 9; -#X text 275 131 <-- window (msec); -#X msg 224 349 \$1 200; -#X msg 287 415 \$1 200; -#X text 151 79 <-- transposition in halftones; -#X text 372 289 This is a classic rotating-tape-head style pitch shifter using the [delread4~] variable delay object. There are two moving tape heads \, each of which is loudest at the middle of its trajectory \, and enveloped out at the moment it has to jump back (or forward) to start another scratch. Most of the brain work is in computing how fast the tape heads have to move to get the desired transposition., f 52; -#X text 371 519 The [cos~] objects compute the fadein and fadeout of the two delay line outputs. They each traverse the positive half of the cosine waveform (phase -0.25 to +0.25) over the time the phase goes from one end to the other., f 52; -#X text 371 423 The "window size" is the total trajectory of the read points in the delay line \, in milliseconds. The delay times are controlled by a [phasor~] object. The second delay time \, 180 degrees out of phase from the first one \, is computed using the [wrap~] object., f 52; -#X obj 311 26 cnv 5 5 25 empty empty Pitch\ Shifter 15 13 0 16 #dfdfdf #202020 0; -#X connect 0 0 32 0; -#X connect 1 0 13 0; #X connect 2 0 1 1; -#X connect 2 0 18 1; -#X connect 3 0 43 0; -#X connect 4 0 3 0; -#X connect 5 0 0 0; -#X connect 6 0 7 0; -#X connect 7 0 31 0; -#X connect 8 0 25 0; -#X connect 9 0 24 0; -#X connect 10 0 13 1; -#X connect 10 0 19 1; -#X connect 11 0 40 0; -#X connect 12 0 11 0; -#X connect 13 0 48 0; +#X connect 2 0 14 1; +#X connect 3 0 31 0; +#X connect 4 0 25 0; +#X connect 5 0 19 0; +#X connect 6 0 18 0; +#X connect 7 0 9 1; +#X connect 7 0 15 1; +#X connect 8 0 30 0; +#X connect 9 0 35 0; +#X connect 10 0 11 0; +#X connect 11 0 12 0; +#X connect 12 0 28 0; +#X connect 13 0 14 0; +#X connect 13 0 23 0; #X connect 14 0 15 0; -#X connect 15 0 16 0; -#X connect 16 0 38 0; -#X connect 17 0 18 0; -#X connect 17 0 29 0; -#X connect 18 0 19 0; -#X connect 19 0 47 0; -#X connect 20 0 21 0; -#X connect 21 0 16 1; -#X connect 23 0 22 0; -#X connect 24 0 8 0; -#X connect 24 1 8 1; -#X connect 25 0 39 0; -#X connect 26 0 17 0; -#X connect 27 0 28 0; -#X connect 28 0 14 0; -#X connect 29 0 30 0; -#X connect 30 0 20 0; -#X connect 31 0 33 0; -#X connect 32 0 6 0; -#X connect 33 0 8 0; -#X connect 37 0 45 0; -#X connect 39 0 1 0; -#X connect 39 0 27 0; -#X connect 39 0 26 0; -#X connect 40 0 51 0; -#X connect 43 0 9 0; -#X connect 43 0 50 0; -#X connect 47 0 21 1; -#X connect 48 0 15 1; -#X connect 50 0 2 0; -#X connect 51 0 10 0; +#X connect 15 0 34 0; +#X connect 16 0 17 0; +#X connect 17 0 12 1; +#X connect 18 0 5 0; +#X connect 18 1 5 1; +#X connect 19 0 29 0; +#X connect 20 0 13 0; +#X connect 21 0 22 0; +#X connect 22 0 10 0; +#X connect 23 0 24 0; +#X connect 24 0 16 0; +#X connect 25 0 26 0; +#X connect 26 0 5 0; +#X connect 29 0 1 0; +#X connect 29 0 21 0; +#X connect 29 0 20 0; +#X connect 30 0 37 0; +#X connect 31 0 6 0; +#X connect 31 0 36 0; +#X connect 34 0 17 1; +#X connect 35 0 11 1; +#X connect 36 0 2 0; +#X connect 37 0 7 0; +#X connect 43 0 4 0; +#X connect 48 0 51 0; +#X connect 51 0 33 0; diff --git a/doc/3.audio.examples/H01.low-pass.pd b/doc/3.audio.examples/H01.low-pass.pd index a01dc7da..78315d79 100644 --- a/doc/3.audio.examples/H01.low-pass.pd +++ b/doc/3.audio.examples/H01.low-pass.pd @@ -1,7 +1,7 @@ #N canvas 506 38 613 631 12; #X declare -stdpath ./; #X obj 96 373 mtof; -#X floatatom 96 350 5 0 0 0 - \$0-pit - 0; +#X floatatom 96 350 5 0 0 0 - \$0-pitch - 0; #X obj 72 546 output~; #X obj 71 423 lop~; #X obj 71 320 noise~; @@ -12,8 +12,7 @@ #X obj 145 453 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X text 170 452 graphing on/off; #X text 399 524 --- 0.02 sec ---; -#X text 33 139 The lop~ object is normalized to pass DC (the lowest frequency) with a gain of one. Higher frequencies are progressively more and more attenuated. The lower the cutoff frequency \, the lower the total power of the filtered noise. If you graph the output you'll see that the waveform gets smoother (and smaller overall) as the cutoff frequency is lowered., f 75; -#X text 40 218 At the cutoff frequency the gain is about -3 dB \, and above that the gain drops a further 6 dB per octave. (Sometimes one uses the word "rolloff" instead of "cutoff" to emphasize the gradual way the gain drops off with frequency.), f 74; +#X text 33 218 At the cutoff frequency the gain is about -3 dB \, and above that the gain drops a further 6 dB per octave. (Sometimes one uses the word "rolloff" instead of "cutoff" to emphasize the gradual way the gain drops off with frequency.), f 75; #X text 125 319 white noise \, test signal; #N canvas 0 0 450 300 (subpatch) 0; #X array H01-graph 882 float 0; @@ -23,15 +22,16 @@ #X text 155 397 <-- cutoff (Hertz); #N canvas 774 414 291 271 init 0; #X obj 107 103 loadbang; -#X obj 107 168 s \$0-pit; #X msg 107 135 60; #X obj 79 218 declare -stdpath ./; #X text 42 27 This subpatch initializes the patch and loads a value in the pitch number box., f 30; -#X connect 0 0 2 0; -#X connect 2 0 1 0; +#X obj 107 168 s \$0-pitch; +#X connect 0 0 1 0; +#X connect 1 0 4 0; #X restore 227 564 pd init; #X text 33 60 This and the following patches show how to use filters in Pd \, starting with the simplest one: the one-pole low-pass filter. Here we test it with an input of white noise. The [lop~] object does the filtering. Its left inlet takes an audio signal to be filtered \, and its right inlet takes messages or signals to set its cutoff frequency in Hertz., f 75; #X obj 136 15 cnv 5 5 25 empty empty One-Pole\ Low-Pass\ Filter 15 13 0 16 #dfdfdf #202020 0; +#X text 33 139 The [lop~] object is normalized to pass DC (the lowest frequency) with a gain of one. Higher frequencies are progressively more and more attenuated. The lower the cutoff frequency \, the lower the total power of the filtered noise. If you graph the output you'll see that the waveform gets smoother (and smaller overall) as the cutoff frequency is lowered., f 75; #X connect 0 0 5 0; #X connect 1 0 0 0; #X connect 3 0 2 0; diff --git a/doc/3.audio.examples/H02.high-pass.pd b/doc/3.audio.examples/H02.high-pass.pd index 8519ce97..fb75163b 100644 --- a/doc/3.audio.examples/H02.high-pass.pd +++ b/doc/3.audio.examples/H02.high-pass.pd @@ -1,40 +1,40 @@ -#N canvas 486 38 568 688 12; +#N canvas 486 38 575 744 12; #X declare -stdpath ./; -#X obj 41 592 output~; -#X obj 102 503 metro 250; -#X obj 102 476 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 125 475 graphing on/off; +#X obj 46 636 output~; +#X obj 107 547 metro 250; +#X obj 107 520 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X text 130 519 graphing on/off; #N canvas 0 0 450 300 (subpatch) 0; #X array H02-graph 882 float 0; #X coords 0 1 881 -1 200 140 1 0 0; -#X restore 328 319 graph; -#X text 372 465 --- 0.02 sec ---; -#X text 53 61 Many synthesis algorithms and transformations can have outputs with a zero-frequency component (commonly called DC for "direct current"). These are inaudible and sometimes cause distortion in audio output devices \, or when converting to fixed-point soundfile formats. It is often desirable to filter an audio signal to remove its DC component., f 65; -#X obj 40 282 +~ 1; -#X text 95 430 high-pass filter; -#X floatatom 79 393 5 0 0 0 - - - 0; -#X msg 79 318 0; -#X text 107 255 sinusoidal test signal; -#X text 86 282 add "DC"; -#X text 117 318 zero for no filtering; -#X msg 89 341 3; -#X text 124 342 3 (or so) to remove DC; -#X obj 40 257 osc~ 220; -#X msg 97 366 220; -#X obj 102 542 tabwrite~ H02-graph; -#X obj 365 523 declare -stdpath ./; -#X text 53 157 The simplest way to do this is to use a one-pole low-pass filter \, tuned to a low frequency such as 3 Hertz \, and to subtract its output from the original. This difference is called a one-pole \, one-zero high-pass filter \, and it is used so often that Pd provides one in the [hip~] object., f 65; -#X text 169 608 The [output~] abstraction includes [hip~] objects for this reason., f 34; -#X text 129 366 higher frequencies affect the audible part of the signal as well., f 23; -#X obj 40 429 hip~ 3; +#X restore 341 333 graph; +#X text 385 479 --- 0.02 sec ---; +#X text 54 62 Many synthesis algorithms and transformations can have outputs with a zero-frequency component (commonly called DC for "direct current"). These are inaudible and sometimes cause distortion in audio output devices \, or when converting to fixed-point soundfile formats. It is often desirable to filter an audio signal to remove its DC component., f 65; +#X obj 45 296 +~ 1; +#X text 100 474 high-pass filter; +#X floatatom 84 426 7 0 0 0 - - - 0; +#X msg 84 336 0; +#X text 112 269 sinusoidal test signal; +#X text 91 296 add "DC"; +#X text 122 336 zero for no filtering; +#X msg 94 359 3; +#X text 129 360 3 (or so) to remove DC; +#X obj 107 586 tabwrite~ H02-graph; +#X obj 370 537 declare -stdpath ./; +#X text 54 154 The simplest way to do this is to use a one-pole low-pass filter \, tuned to a low frequency such as 3 Hertz \, and to subtract its output from the original. This difference is called a one-pole \, one-zero high-pass filter \, and it is used so often that Pd provides one in the [hip~] object., f 65; +#X text 146 414 higher frequencies affect the audible part of the signal as well., f 23; +#X obj 45 473 hip~ 3; #X obj 93 19 cnv 5 5 25 empty empty One-Pole/One-Zero\ High-Pass\ Filter 15 13 0 16 #dfdfdf #202020 0; -#X connect 1 0 18 0; +#X obj 87 386 hsl 162 19 0 500 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 45 270 osc~ 220; +#X text 173 652 The [output~] abstraction includes [hip~ 3] objects to remove DC component., f 26; +#X connect 1 0 16 0; #X connect 2 0 1 0; -#X connect 7 0 23 0; -#X connect 9 0 23 1; -#X connect 10 0 9 0; -#X connect 14 0 9 0; -#X connect 16 0 7 0; -#X connect 17 0 9 0; -#X connect 23 0 0 0; -#X connect 23 0 18 0; +#X connect 7 0 20 0; +#X connect 9 0 20 1; +#X connect 10 0 22 0; +#X connect 14 0 22 0; +#X connect 20 0 0 0; +#X connect 20 0 16 0; +#X connect 22 0 9 0; +#X connect 23 0 7 0; diff --git a/doc/3.audio.examples/H04.filter.sweep.pd b/doc/3.audio.examples/H04.filter.sweep.pd index 99fe40ff..acaec49a 100644 --- a/doc/3.audio.examples/H04.filter.sweep.pd +++ b/doc/3.audio.examples/H04.filter.sweep.pd @@ -1,23 +1,23 @@ -#N canvas 553 38 513 624 12; +#N canvas 553 38 529 640 12; #X declare -stdpath ./; -#X floatatom 111 203 5 0 150 0 - \$0-pitch - 0; -#X obj 111 250 phasor~; -#X obj 123 408 +~; -#X floatatom 141 383 5 0 100 0 - \$0-offset - 0; -#X floatatom 124 279 5 0 0 0 - \$0-speed - 0; -#X floatatom 142 330 5 0 100 0 - \$0-depth - 0; -#X floatatom 136 463 5 0 1000 0 - \$0-q - 0; -#X obj 111 488 vcf~; -#X text 201 302 LFO for sweep; -#X text 159 407 add base to sweep; -#X text 168 437 convert to Hz.; -#X obj 111 529 output~; -#X obj 111 226 mtof; -#X obj 124 301 phasor~; -#X obj 124 355 *~; -#X text 52 140 Note the different effects of negative and positive sweep speeds., f 53; -#X obj 123 437 mtof~; -#X text 52 59 If you want actively changing center frequencies \, use [vcf~] instead of [bp~]. The [vcf~] module takes an audio signal to set center frequency (Q is still set by messages though) \, which makes it computationally somewhat more expensive than [bp~]., f 53; +#X floatatom 110 217 5 0 150 0 - \$0-pitch - 0; +#X obj 110 264 phasor~; +#X obj 170 432 +~; +#X floatatom 188 407 5 0 100 0 - \$0-offset - 0; +#X floatatom 170 303 5 0 0 0 - \$0-speed - 0; +#X floatatom 188 354 5 0 100 0 - \$0-depth - 0; +#X floatatom 183 487 5 0 1000 0 - \$0-q - 0; +#X obj 158 512 vcf~; +#X text 236 326 LFO for sweep; +#X text 206 431 add base to sweep; +#X text 215 461 convert to Hz.; +#X obj 158 553 output~; +#X obj 110 240 mtof; +#X obj 170 325 phasor~; +#X obj 170 379 *~; +#X text 68 150 Note the different effects of negative and positive sweep speeds., f 53; +#X obj 170 461 mtof~; +#X text 68 69 If you want actively changing center frequencies \, use [vcf~] instead of [bp~]. The [vcf~] module takes an audio signal to set center frequency (Q is still set by messages though) \, which makes it computationally somewhat more expensive than [bp~]., f 53; #N canvas 706 247 304 346 init 0; #X obj 85 23 loadbang; #X obj 85 47 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; @@ -28,16 +28,18 @@ #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 2 0 3 0; -#X restore 260 514 pd init; -#X text 179 461 <-- Q (selectivity); -#X text 184 383 <-- base center frequency; -#X text 184 331 <-- sweep depth; -#X text 166 278 <-- sweep speed; -#X text 157 203 <-- pitch; -#X text 171 251 [phasor~] as a sawtooth like oscillator; -#X obj 146 18 cnv 5 5 25 empty empty Sweeping\ Filters 15 13 0 16 #dfdfdf #202020 0; +#X restore 338 567 pd init; +#X text 226 485 <-- Q (selectivity); +#X text 231 407 <-- base center frequency; +#X text 230 355 <-- sweep depth; +#X text 212 302 <-- sweep speed; +#X text 156 217 <-- pitch; +#X obj 45 22 cnv 5 5 25 empty empty Sweeping\ Filters 15 13 0 16 #dfdfdf #202020 0; +#X obj 110 350 -~ 1; +#X obj 110 326 *~ 2; +#X text 176 257 [phasor~] is turned to a sawtooth like oscillator, f 25; #X connect 0 0 12 0; -#X connect 1 0 7 0; +#X connect 1 0 26 0; #X connect 2 0 16 0; #X connect 3 0 2 1; #X connect 4 0 13 0; @@ -48,3 +50,5 @@ #X connect 13 0 14 0; #X connect 14 0 2 0; #X connect 16 0 7 1; +#X connect 25 0 7 0; +#X connect 26 0 25 0; diff --git a/doc/3.audio.examples/H05.filter.floyd.pd b/doc/3.audio.examples/H05.filter.floyd.pd index 0c5ebca4..c5b7bda9 100644 --- a/doc/3.audio.examples/H05.filter.floyd.pd +++ b/doc/3.audio.examples/H05.filter.floyd.pd @@ -1,4 +1,4 @@ -#N canvas 600 38 589 749 12; +#N canvas 559 38 589 749 12; #X declare -stdpath ./; #X obj 167 472 line~; #X obj 167 444 pack 0 100; @@ -43,7 +43,7 @@ #X obj 122 470 -~ 1; #X text 28 451 make it go from -1 to 1, f 12; #X obj 179 548 max 3; -#X text 196 583 Put two [vcf~] objects in series for better rejection of the stop bands without having to make the passband excessively narrow., f 43; +#X text 209 592 Put two [vcf~] objects in series for better rejection of the stop bands without having to make the passband excessively narrow., f 43; #X text 224 549 at least 3; #X obj 140 178 metro 85; #X obj 140 256 tabread \$0-sequence; @@ -51,7 +51,7 @@ #X text 531 186 72; #X text 67 65 Here's an approximate reconstruction of an old riff by Pink Floyd. Because we're filtering a triangular waveform with odd partials \, it's easier to pick out the partials in the filtered sound than if we had had both even and odd ones.; #X text 459 170 Picthes; -#X obj 112 24 cnv 5 5 25 empty empty Another\ Filter\ Sweeping\ Example 15 13 0 16 #dfdfdf #202020 0; +#X obj 38 15 cnv 5 5 25 empty empty Another\ Filter\ Sweeping\ Example 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 20 0; #X connect 1 0 0 0; #X connect 2 0 18 0; diff --git a/doc/3.audio.examples/H06.envelope.follower.pd b/doc/3.audio.examples/H06.envelope.follower.pd index 2be79bca..106e3e5e 100644 --- a/doc/3.audio.examples/H06.envelope.follower.pd +++ b/doc/3.audio.examples/H06.envelope.follower.pd @@ -1,34 +1,34 @@ -#N canvas 569 38 549 725 12; -#X floatatom 68 587 8 0 0 0 - - - 0; -#X floatatom 322 310 5 0 999 0 - \$0-osc2 - 12; -#X obj 322 344 osc~; -#X obj 248 521 lop~; -#X floatatom 273 492 4 0 100 0 - \$0-lop - 0; -#X obj 247 396 +~; -#X obj 247 365 osc~ 500; -#X obj 248 458 *~; -#X obj 248 584 snapshot~; -#X floatatom 248 645 9 0 999 0 - - - 0; -#X obj 248 614 sqrt; -#X obj 68 614 dbtorms; -#X text 301 459 square the signal; -#X text 285 613 convert to RMS; -#X text 293 521 low-pass filter; -#X text 317 644 output; -#X obj 259 556 r \$0-tick; -#X obj 68 451 r \$0-tick; -#X obj 68 562 f; -#X obj 86 520 env~; -#X obj 322 398 *~; -#X obj 340 373 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 32 132 Here we're adding two oscillators so the result should be an RMS of one if the second oscillator is on \, 0.707 otherwise. Note two effects: first \, the more responsive the envelope follower \, the less accurate the result (but the faster it responds). Second \, if the two oscillators are tuned close to each other their beating affects the numbers coming out., f 70; -#X obj 68 352 ../5.reference/set-dsp-tgl; -#X text 99 355 DSP on/off; -#X msg 68 389 \; pd dsp \$1; -#X text 32 51 An envelope follower measures the mean square power of an signal as it changes over time. (You can convert mean square power to RMS amplitude or to decibels if you wish.) The term "mean square" means simply that the signal should be squared \, and then averaged. The averaging is done using a low-pass filter such as [lop~]., f 70; -#X text 33 226 The [env~] object at right \, which is a built-in envelope follower using a higher-quality low-pass filter than [lop~] \, is shown for comparison. Its output is artificially slowed down to match the homemade one at left., f 70; -#X text 308 492 <-- responsiveness; -#N canvas 536 459 382 265 init 0; +#N canvas 544 60 549 725 12; +#X floatatom 68 597 8 0 0 0 - - - 0; +#X floatatom 322 320 5 0 999 0 - \$0-osc2 - 12; +#X obj 322 354 osc~; +#X obj 248 531 lop~; +#X floatatom 273 502 4 0 100 0 - \$0-lop - 0; +#X obj 247 406 +~; +#X obj 247 375 osc~ 500; +#X obj 248 468 *~; +#X obj 248 594 snapshot~; +#X floatatom 248 655 9 0 999 0 - - - 0; +#X obj 248 624 sqrt; +#X obj 68 624 dbtorms; +#X text 301 469 square the signal; +#X text 285 623 convert to RMS; +#X text 293 531 low-pass filter; +#X text 317 654 output; +#X obj 259 566 r \$0-tick; +#X obj 68 461 r \$0-tick; +#X obj 68 572 f; +#X obj 86 530 env~; +#X obj 322 408 *~; +#X obj 340 383 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X text 32 142 Here we're adding two oscillators so the result should be an RMS of one if the second oscillator is on \, 0.707 otherwise. Note two effects: first \, the more responsive the envelope follower \, the less accurate the result (but the faster it responds). Second \, if the two oscillators are tuned close to each other their beating affects the numbers coming out., f 70; +#X obj 68 362 ../5.reference/set-dsp-tgl; +#X text 99 365 DSP on/off; +#X msg 68 399 \; pd dsp \$1; +#X text 32 61 An envelope follower measures the mean square power of an signal as it changes over time. (You can convert mean square power to RMS amplitude or to decibels if you wish.) The term "mean square" means simply that the signal should be squared \, and then averaged. The averaging is done using a low-pass filter such as [lop~]., f 70; +#X text 33 236 The [env~] object at right \, which is a built-in envelope follower using a higher-quality low-pass filter than [lop~] \, is shown for comparison. Its output is artificially slowed down to match the homemade one at left., f 70; +#X text 308 502 <-- responsiveness; +#N canvas 847 473 382 265 init 0; #X obj 85 14 loadbang; #X obj 85 38 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 85 67 f \$0; @@ -42,13 +42,13 @@ #X connect 2 0 6 0; #X connect 3 0 5 0; #X connect 4 0 3 0; -#X restore 444 621 pd init; -#X text 78 310 frequency of second oscillator -->; -#X text 365 373 <-- on/off; -#X floatatom 68 645 9 0 999 0 - - - 0; -#X text 331 552 take snapshot every 1/4 second, f 16; -#X text 122 519 <-- built-in envelope follower for comparison, f 12; -#X obj 109 14 cnv 5 5 25 empty empty Envelope\ Follower 15 13 0 16 #dfdfdf #202020 0; +#X restore 444 636 pd init; +#X text 78 320 frequency of second oscillator -->; +#X text 365 383 <-- on/off; +#X floatatom 68 655 9 0 999 0 - - - 0; +#X text 331 562 take snapshot every 1/4 second, f 16; +#X text 122 529 <-- built-in envelope follower for comparison, f 12; +#X obj 93 19 cnv 5 5 25 empty empty Envelope\ Follower 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 11 0; #X connect 1 0 2 0; #X connect 2 0 20 0; diff --git a/doc/3.audio.examples/H07.measure.spectrum.pd b/doc/3.audio.examples/H07.measure.spectrum.pd index 8288e43e..3aa9e6ec 100644 --- a/doc/3.audio.examples/H07.measure.spectrum.pd +++ b/doc/3.audio.examples/H07.measure.spectrum.pd @@ -7,48 +7,31 @@ #X floatatom 163 505 4 0 999 0 - \$0-q - 0; #X floatatom 154 430 7 0 150 0 - \$0-pitch - 0; #X obj 61 623 env~ 4096; -#X obj 122 343 *~ 0; -#X obj 122 368 +~ 1; #X text 35 60 In this example we use two cascaded band-pass filters to troll for partials in Jonathan Harvey's famous bell sample., f 82; #X text 35 207 You can hear partials around 48 \, 51.3 \, 55 (faint!) \, 57 (fainter!) \, 60 \, two beating partials around 65 \, 67 \, 69 \, 70.9 \, 71.75 \, 72.6 \, 74 \, 74.65 \, 75.6 \, 77 \, 81.2 \, 84.6 \, 86.5 \, and probably many more. There's also one down at 36 \, but it's easier to see it on the meter than hear it., f 82; #X text 189 454 (shift-drag to fine tune); #X obj 145 720 output~; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-array 155944 float 2; -#X coords 0 1 155944 -1 274 101 1; -#X restore 315 292 graph; -#X obj 122 295 r \$0-loopf; -#X obj 122 319 phasor~; -#X obj 122 392 tabread4~ \$0-array; -#X obj 166 343 r \$0-totsamps; -#N canvas 717 163 409 449 init 0; +#X coords 0 1 155944 -1 300 127 1; +#X restore 308 285 graph; +#N canvas 717 163 406 381 init 0; #X obj 81 239 soundfiler; #X obj 81 33 loadbang; #X obj 81 59 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 101 90 f \$0; -#X obj 116 367 /; -#X msg 81 337 44100; -#X obj 81 308 t b f, f 8; -#X obj 116 396 s \$0-loopf; #X msg 81 208 read -resize ../sound/bell.aiff \$1; -#X obj 197 330 declare -stdpath ./; -#X obj 103 275 s \$0-totsamps; +#X obj 129 305 declare -stdpath ./; #X obj 81 178 symbol \$0-array; #X msg 101 117 \; \$1-pitch 69 \; \$1-q 0; #X text 221 78 This subpatch initializes the patch \, loads the sample and values into number boxes, f 17; -#X connect 0 0 10 0; -#X connect 0 0 6 0; #X connect 1 0 2 0; #X connect 2 0 3 0; -#X connect 2 0 11 0; -#X connect 3 0 12 0; -#X connect 4 0 7 0; -#X connect 5 0 4 0; -#X connect 6 0 5 0; -#X connect 6 1 4 1; -#X connect 8 0 0 0; -#X connect 11 0 8 0; -#X restore 535 410 pd init; +#X connect 2 0 6 0; +#X connect 3 0 7 0; +#X connect 4 0 0 0; +#X connect 6 0 4 0; +#X restore 540 440 pd init; #X text 198 505 <-- Q (filter selectivity); #X text 210 480 <-- center frequency; #X text 210 429 <-- center pitch; @@ -65,8 +48,11 @@ #X text 130 808 <-- the [vu] object is used to display values in dBFS, f 27; #X text 263 636 convert to amplitude values (up to 10), f 21; #X obj 89 15 cnv 5 5 25 empty empty Measuring\ Spectra\ Using\ Band-Pass\ Filters 15 13 0 16 #dfdfdf #202020 0; +#X obj 122 363 tabplay~ \$0-array; +#X obj 238 392 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 122 334 loadbang; #X connect 0 0 6 0; -#X connect 0 0 29 0; +#X connect 0 0 23 0; #X connect 1 0 0 0; #X connect 2 0 3 0; #X connect 3 0 1 1; @@ -74,17 +60,15 @@ #X connect 4 0 1 2; #X connect 4 0 0 2; #X connect 5 0 2 0; -#X connect 6 0 31 0; -#X connect 7 0 8 0; -#X connect 8 0 16 0; -#X connect 14 0 15 0; -#X connect 15 0 7 0; -#X connect 16 0 1 0; -#X connect 17 0 7 1; -#X connect 22 0 26 0; -#X connect 25 0 29 1; -#X connect 26 0 27 0; -#X connect 27 0 28 0; -#X connect 28 0 25 0; -#X connect 29 0 12 0; -#X connect 31 0 30 0; +#X connect 6 0 25 0; +#X connect 16 0 20 0; +#X connect 19 0 23 1; +#X connect 20 0 21 0; +#X connect 21 0 22 0; +#X connect 22 0 19 0; +#X connect 23 0 10 0; +#X connect 25 0 24 0; +#X connect 29 0 1 0; +#X connect 29 1 30 0; +#X connect 30 0 29 0; +#X connect 31 0 29 0; diff --git a/doc/3.audio.examples/H08.heterodyning.pd b/doc/3.audio.examples/H08.heterodyning.pd index d9487d7b..8b13e158 100644 --- a/doc/3.audio.examples/H08.heterodyning.pd +++ b/doc/3.audio.examples/H08.heterodyning.pd @@ -1,4 +1,4 @@ -#N canvas 386 39 528 713 12; +#N canvas 545 63 534 746 12; #X obj 105 258 phasor~ 100; #X obj 158 328 phasor~; #X floatatom 158 290 5 0 999 0 - \$0-freq - 0; @@ -31,7 +31,7 @@ #X text 201 289 <-- test frequency, f 9; #X text 261 355 modulate test frequency to DC, f 15; #X text 204 453 <-- responsiveness; -#N canvas 536 459 361 258 init 0; +#N canvas 834 434 361 258 init 0; #X obj 68 22 loadbang; #X obj 68 46 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 68 75 f \$0; diff --git a/doc/3.audio.examples/H09.ssb.modulation.pd b/doc/3.audio.examples/H09.ssb.modulation.pd index 52459bdd..ae1c2882 100644 --- a/doc/3.audio.examples/H09.ssb.modulation.pd +++ b/doc/3.audio.examples/H09.ssb.modulation.pd @@ -1,4 +1,4 @@ -#N canvas 504 51 544 632 12; +#N canvas 541 61 544 632 12; #X declare -stdpath ./; #X obj 245 421 cos~; #X obj 288 403 +~ -0.25; @@ -12,32 +12,6 @@ #X text 52 419 90 degree phase; #X text 45 434 shifted versions; #X text 357 386 cosine and sine waves; -#N canvas 555 154 582 391 bell-loop 0; -#X obj 51 150 /; -#X obj 51 262 +~ 1; -#X msg 23 117 44100; -#X obj 23 91 t b f, f 7; -#X obj 51 312 outlet~; -#N canvas 0 0 450 300 (subpatch) 0; -#X array \$0-array 155944 float 2; -#X coords 0 1 155944 -1 279 142 1; -#X restore 251 105 graph; -#X obj 23 67 r \$0-totsamps; -#X obj 69 207 r \$0-totsamps; -#X obj 51 238 *~; -#X obj 51 176 phasor~; -#X obj 51 286 tabread4~ \$0-array; -#X connect 0 0 9 0; -#X connect 1 0 10 0; -#X connect 2 0 0 0; -#X connect 3 0 2 0; -#X connect 3 1 0 1; -#X connect 6 0 3 0; -#X connect 7 0 8 1; -#X connect 8 0 1 0; -#X connect 9 0 8 0; -#X connect 10 0 4 0; -#X restore 170 312 pd bell-loop; #X obj 170 544 output~; #X obj 245 375 phasor~; #X text 356 401 to form the real and; @@ -47,34 +21,77 @@ #X text 43 139 The technique is to filter the input into two versions \, 90 degrees out of phase \, which can be interpreted as the real and imaginary part of a complex signal with positive frequencies only. You can then form the (complex) product of this with a (complex) sinusoid to modulate upward or downward in frequency., f 64; #X obj 170 412 hilbert~; #X text 254 478 <-- complex multiplier (calculates real part), f 22; -#N canvas 711 110 382 287 init 0; -#X obj 55 140 soundfiler; -#X obj 55 15 loadbang; -#X obj 55 41 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X msg 55 113 read -resize ../sound/bell.aiff \$1; -#X obj 193 77 declare -stdpath ./; -#X obj 55 76 symbol \$0-array; -#X obj 55 172 s \$0-totsamps; -#X text 78 223 initialize and load file into array.; -#X connect 0 0 6 0; -#X connect 1 0 2 0; -#X connect 2 0 5 0; -#X connect 3 0 0 0; -#X connect 5 0 3 0; -#X restore 412 294 pd init; #X text 289 350 <-- shift frequency; #X text 43 222 The [hilbert~] object is an abstraction in the 'extra' library. It takes a signal and creates two copies that are 90 degrees out of phase., f 64; -#X text 83 295 sample loop for test signal, f 15; #X obj 36 18 cnv 5 5 25 empty empty Single\ Sideband\ Modulation\ (AKA\ Freq.\ Shifter) 15 13 0 16 #dfdfdf #202020 0; +#X text 52 297 sample loop for test signal -->, f 15; +#X obj 170 284 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 194 282 choose another sample; +#N canvas 555 154 649 577 test-loop 0; +#X obj 121 511 outlet~; +#N canvas 0 0 450 300 (subpatch) 0; +#X array \$0-sample 155944 float 2; +#X coords 0 1 155944 -1 279 142 1 0 0; +#X restore 308 268 graph; +#X obj 121 433 *~; +#X obj 163 394 phasor~; +#X obj 121 246 soundfiler; +#X obj 121 66 loadbang; +#X obj 121 94 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 445 432 declare -stdpath ./; +#X msg 188 276 \$1; +#X obj 163 307 swap; +#X obj 163 335 /; +#X floatatom 163 365 10 0 0 0 - - - 0; +#X obj 175 160 symbol \$0-sample; +#X obj 121 469 tabread4~ \$0-sample; +#X obj 42 115 openpanel; +#X msg 121 124 ../sound/bell.aiff; +#X msg 121 215 read -resize \$1 \$2; +#X obj 121 188 pack s s; +#X obj 121 160 t a b; +#X floatatom 156 433 9 0 0 0 - - - 0; +#X floatatom 203 308 6 0 0 0 - - - 0; +#X text 204 327 sample rate, f 6; +#X text 223 434 length; +#X text 362 144 initialize patch \, load file into array and play loop., f 22; +#X obj 42 75 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 42 41 inlet; +#X connect 2 0 13 0; +#X connect 3 0 2 0; +#X connect 4 0 9 0; +#X connect 4 0 19 0; +#X connect 4 1 8 0; +#X connect 5 0 6 0; +#X connect 6 0 15 0; +#X connect 8 0 9 1; +#X connect 8 0 20 0; +#X connect 9 0 10 0; +#X connect 9 1 10 1; +#X connect 10 0 11 0; +#X connect 11 0 3 0; +#X connect 12 0 17 1; +#X connect 13 0 0 0; +#X connect 14 0 18 0; +#X connect 15 0 18 0; +#X connect 16 0 4 0; +#X connect 17 0 16 0; +#X connect 18 0 17 0; +#X connect 18 1 12 0; +#X connect 19 0 2 1; +#X connect 24 0 14 0; +#X connect 25 0 24 0; +#X restore 170 312 pd test-loop; #X connect 0 0 3 1; #X connect 1 0 2 0; #X connect 2 0 4 1; #X connect 3 0 5 0; #X connect 4 0 5 1; -#X connect 5 0 13 0; -#X connect 6 0 14 0; -#X connect 12 0 20 0; -#X connect 14 0 1 0; -#X connect 14 0 0 0; -#X connect 20 0 3 0; -#X connect 20 1 4 0; +#X connect 5 0 12 0; +#X connect 6 0 13 0; +#X connect 13 0 1 0; +#X connect 13 0 0 0; +#X connect 19 0 3 0; +#X connect 19 1 4 0; +#X connect 25 0 27 0; +#X connect 27 0 19 0; diff --git a/doc/3.audio.examples/H16.adsr.filter.qlist.pd b/doc/3.audio.examples/H16.adsr.filter.qlist.pd deleted file mode 100644 index c25d1c1b..00000000 --- a/doc/3.audio.examples/H16.adsr.filter.qlist.pd +++ /dev/null @@ -1,171 +0,0 @@ -#N canvas 377 38 843 705 12; -#X declare -stdpath ./; -#X obj 30 250 r trigger; -#X obj 30 471 *~; -#X obj 30 364 *~ 0.01; -#X obj 30 399 *~; -#X obj 30 429 *~; -#X obj 77 393 r pitch; -#X obj 77 443 mtof; -#X floatatom 77 418 4 0 0 0 - - - 0; -#X floatatom 51 305 4 0 0 0 - - - 0; -#X obj 51 280 r level; -#X floatatom 114 305 4 0 0 0 - - - 0; -#X obj 114 280 r attack; -#X floatatom 182 305 4 0 0 0 - - - 0; -#X obj 182 280 r decay; -#X floatatom 246 305 4 0 0 0 - - - 0; -#X floatatom 322 305 4 0 0 0 - - - 0; -#X obj 246 280 r sustain; -#X obj 322 280 r release; -#X obj 481 186 r note; -#X msg 481 275 \; trigger 1; -#X msg 577 289 \; trigger 0; -#X obj 50 174 qlist; -#X obj 50 15 r qlist; -#X msg 68 67 rewind; -#X obj 78 96 r tempo; -#X floatatom 78 121 4 1 10 0 - - - 0; -#X msg 78 146 tempo \$1; -#X obj 481 233 t b f; -#X obj 539 229 s pitch; -#X obj 609 214 r duration; -#X floatatom 609 239 4 0 0 0 - - - 0; -#X floatatom 481 209 4 0 0 0 - - - 0; -#X obj 286 347 r trigger; -#X floatatom 305 403 4 0 0 0 - - - 0; -#X floatatom 365 433 4 0 0 0 - - - 0; -#X floatatom 455 433 4 0 0 0 - - - 0; -#X floatatom 541 433 4 0 0 0 - - - 0; -#X floatatom 637 433 4 0 0 0 - - - 0; -#X obj 305 378 r level2; -#X obj 365 408 r attack2; -#X obj 455 408 r decay2; -#X obj 541 408 r sustain2; -#X obj 637 408 r release2; -#X obj 77 468 tabosc4~ array1; -#X floatatom 237 393 4 0 0 0 - - - 0; -#X obj 225 576 vcf~; -#X floatatom 329 528 4 0 0 0 - - - 0; -#X obj 329 503 r q; -#X obj 305 428 / 69.23; -#X obj 237 418 mtof; -#X obj 237 443 sqrt; -#X obj 237 468 sqrt; -#X obj 215 361 r filter; -#X obj 237 521 *~; -#X obj 237 546 *~; -#X obj 286 496 +~ 1; -#X obj 237 493 *~; -#X text 107 250 ADSR for amplitude:; -#X msg 149 189 \; qlist read qlist2.txt; -#X obj 225 616 output~; -#X text 392 335 ADSR for filter. Here \, it works better to make the envelope modify a constant "filter pitch"--so the "filter" receive gets the "mtof" treatment and the ADSR is an offset in halftones., f 50; -#X obj 613 14 declare -stdpath ./; -#X obj 577 264 delay; -#X text 309 195 reload qlist2.txt; -#X msg 398 562 line 0 \, auto; -#X text 695 562 click to open:; -#X obj 398 505 r text; -#X obj 662 588 text define -k seq2; -#A set note 36 \; 1000 note 34 \; 1000 note 33 \; 1000 note 31 \; 1000 text bang \;; -#X obj 398 631 text sequence seq2 -g; -#X msg 413 591 stop; -#X msg 504 589 tempo \$1 permsec; -#X obj 504 539 r tempo; -#X floatatom 504 564 4 0 0 0 - - - 0; -#X text 590 506 You can also use the more modern [text] object as previsously mentioned., f 25; -#X obj 62 42 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X text 86 41 <-- start loop; -#X text 117 67 <-- stop loop; -#X text 114 121 <-- set tempo; -#X text 240 60 This is an analog-synth sound made using a wavetable oscillator and a [vcf~] object. Unlike the "floyd" example earlier \, we use a [qlist] object to do the sequencing. This can also be adapted to make a keyboard synth., f 77; -#X text 240 112 The [qlist] reads the file \, "qlist2.txt" \, which contains four "note" messages and a message at the end that restarts the qlist at the beginning. The "note" messages are translated into a pitch change and triggers for the ADSRs., f 77; -#X obj 286 471 adsr, f 15; -#N canvas 818 375 459 345 init 0; -#X obj 65 30 loadbang; -#X obj 214 30 loadbang; -#N canvas 0 0 450 300 (subpatch) 0; -#X array array1 67 float 1; -#A 0 0 0 0 0 0.714286 0.742857 0.757143 0.771429 0.778571 0.785714 0.785714 0.785714 0.785714 0.790476 0.795238 0.614286 0.585714 0.442857 0.271429 -0.128571 -0.142857 -0.157143 -0.171429 -0.642857 -0.528571 -0.614286 -0.685714 -0.828571 -0.828571 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.557143 0.571429 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 66 -1 200 140 1; -#X restore 200 140 graph; -#X msg 214 67 \; qlist read qlist2.txt; -#X msg 65 67 \; level 100 \; attack 20 \; decay 300 \; sustain 70 \; release 300 \; duration 300 \; pitch 72 \; filter 38 \; level2 49 \; attack2 19 \; decay2 300 \; sustain2 17 \; release2 700 \; q 3 \; tempo 4; -#X connect 0 0 4 0; -#X connect 1 0 3 0; -#X restore 95 614 pd init; -#X obj 30 338 adsr, f 16; -#X obj 398 532 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X text 425 533 start; -#X obj 223 13 cnv 5 5 25 empty empty Analog\ Synth\ Style\ Using\ [qlist] 15 13 0 16 #dfdfdf #202020 0; -#X connect 0 0 82 0; -#X connect 1 0 45 0; -#X connect 2 0 3 0; -#X connect 2 0 3 1; -#X connect 3 0 4 0; -#X connect 3 0 4 1; -#X connect 4 0 1 0; -#X connect 5 0 7 0; -#X connect 6 0 43 0; -#X connect 7 0 6 0; -#X connect 8 0 82 1; -#X connect 9 0 8 0; -#X connect 10 0 82 2; -#X connect 11 0 10 0; -#X connect 12 0 82 3; -#X connect 13 0 12 0; -#X connect 14 0 82 4; -#X connect 15 0 82 5; -#X connect 16 0 14 0; -#X connect 17 0 15 0; -#X connect 18 0 31 0; -#X connect 22 0 21 0; -#X connect 23 0 21 0; -#X connect 24 0 25 0; -#X connect 25 0 26 0; -#X connect 26 0 21 0; -#X connect 27 0 19 0; -#X connect 27 0 62 0; -#X connect 27 1 28 0; -#X connect 29 0 30 0; -#X connect 30 0 62 1; -#X connect 31 0 27 0; -#X connect 32 0 80 0; -#X connect 33 0 48 0; -#X connect 34 0 80 2; -#X connect 35 0 80 3; -#X connect 36 0 80 4; -#X connect 37 0 80 5; -#X connect 38 0 33 0; -#X connect 39 0 34 0; -#X connect 40 0 35 0; -#X connect 41 0 36 0; -#X connect 42 0 37 0; -#X connect 43 0 1 1; -#X connect 44 0 49 0; -#X connect 45 0 59 0; -#X connect 46 0 45 2; -#X connect 47 0 46 0; -#X connect 48 0 80 1; -#X connect 49 0 50 0; -#X connect 50 0 51 0; -#X connect 51 0 56 0; -#X connect 52 0 44 0; -#X connect 53 0 54 0; -#X connect 53 0 54 1; -#X connect 54 0 45 1; -#X connect 55 0 56 1; -#X connect 56 0 53 0; -#X connect 56 0 53 1; -#X connect 62 0 20 0; -#X connect 64 0 68 0; -#X connect 66 0 83 0; -#X connect 69 0 68 0; -#X connect 70 0 68 0; -#X connect 71 0 72 0; -#X connect 72 0 70 0; -#X connect 74 0 21 0; -#X connect 80 0 55 0; -#X connect 82 0 2 0; -#X connect 83 0 64 0; diff --git a/doc/3.audio.examples/H16.adsr.filter.text.pd b/doc/3.audio.examples/H16.adsr.filter.text.pd new file mode 100644 index 00000000..98fa25f1 --- /dev/null +++ b/doc/3.audio.examples/H16.adsr.filter.text.pd @@ -0,0 +1,155 @@ +#N canvas 468 38 821 760 12; +#X declare -stdpath ./; +#X obj 34 252 r trigger; +#X obj 34 473 *~; +#X obj 34 366 *~ 0.01; +#X obj 34 401 *~; +#X obj 34 431 *~; +#X obj 81 395 r pitch; +#X obj 81 445 mtof; +#X floatatom 81 420 4 0 0 0 - - - 0; +#X floatatom 55 307 4 0 0 0 - - - 0; +#X obj 55 282 r level; +#X floatatom 118 307 4 0 0 0 - - - 0; +#X obj 118 282 r attack; +#X floatatom 186 307 4 0 0 0 - - - 0; +#X obj 186 282 r decay; +#X floatatom 250 307 4 0 0 0 - - - 0; +#X floatatom 326 307 4 0 0 0 - - - 0; +#X obj 250 282 r sustain; +#X obj 326 282 r release; +#X obj 636 486 r note; +#X obj 636 533 t b f; +#X obj 712 508 s pitch; +#X obj 712 533 r duration; +#X floatatom 712 558 4 0 0 0 - - - 0; +#X floatatom 636 509 4 0 0 0 - - - 0; +#X obj 290 349 r trigger; +#X floatatom 310 405 4 0 0 0 - - - 0; +#X floatatom 369 435 4 0 0 0 - - - 0; +#X floatatom 459 435 4 0 0 0 - - - 0; +#X floatatom 545 435 4 0 0 0 - - - 0; +#X floatatom 641 435 4 0 0 0 - - - 0; +#X obj 310 380 r level2; +#X obj 369 410 r attack2; +#X obj 459 410 r decay2; +#X obj 545 410 r sustain2; +#X obj 641 410 r release2; +#X obj 81 470 tabosc4~ array1; +#X floatatom 241 395 4 0 0 0 - - - 0; +#X obj 229 598 vcf~; +#X floatatom 343 530 4 0 0 0 - - - 0; +#X obj 343 505 r q; +#X obj 310 430 / 69.23; +#X obj 241 420 mtof; +#X obj 241 445 sqrt; +#X obj 241 470 sqrt; +#X obj 219 363 r filter; +#X obj 241 523 *~; +#X obj 241 548 *~; +#X obj 290 498 +~ 1; +#X obj 241 495 *~; +#X text 111 252 ADSR for amplitude:; +#X obj 229 648 output~; +#X text 396 337 ADSR for filter. Here \, it works better to make the envelope modify a constant "filter pitch"--so the "filter" receive gets the "mtof" treatment and the ADSR is an offset in halftones., f 50; +#X obj 680 583 delay; +#X msg 500 189 line 0 \, auto; +#X text 545 48 click to open:; +#X obj 512 74 text define -k seq2; +#A set note 36 \; 1000 note 34 \; 1000 note 33 \; 1000 note 31 \; 1000 loop bang \;; +#X obj 500 258 text sequence seq2 -g; +#X msg 515 218 stop; +#X msg 606 216 tempo \$1 permsec; +#X obj 606 166 r tempo; +#X floatatom 606 191 4 0 0 0 - - - 0; +#X obj 290 473 adsr, f 15; +#N canvas 396 375 341 457 init 0; +#X obj 107 94 loadbang; +#X msg 107 131 \; level 100 \; attack 20 \; decay 300 \; sustain 70 \; release 300 \; duration 300 \; pitch 72 \; filter 38 \; level2 49 \; attack2 19 \; decay2 300 \; sustain2 17 \; release2 700 \; q 3 \; tempo 4; +#X obj 100 394 declare -stdpath ./; +#X text 59 23 This subpatch initialize the patch and loads values into number boxes., f 28; +#X connect 0 0 1 0; +#X restore 98 617 pd init; +#X obj 34 340 adsr, f 16; +#X obj 500 159 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 527 160 start; +#X obj 36 24 cnv 5 5 25 empty empty Analog\ Synth\ Style\ Using\ [text] 15 13 0 16 #dfdfdf #202020 0; +#X obj 500 132 r loop; +#X obj 680 669 s trigger; +#X obj 680 638 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X msg 636 583 1; +#X msg 680 608 0; +#X text 62 66 This is an analog-synth sound made using a wavetable oscillator and a [vcf~] object. Unlike the "floyd" example earlier \, we use a [text] object to do the sequencing. This can also be adapted to make a keyboard synth., f 54; +#X text 62 145 The [text definfe] stores a sequence that is read by [text sequence]. The sequence contains four "note" messages and a 'bang' message at the end that restarts the loop. The "note" messages are translated into a pitch change and triggers for the ADSRs., f 54; +#N canvas 0 0 450 300 (subpatch) 0; +#X array array1 67 float 1; +#A 0 0 0 0 0 0.714286 0.742857 0.757143 0.771429 0.778571 0.785714 0.785714 0.785714 0.785714 0.790476 0.795238 0.614286 0.585714 0.442857 0.271429 -0.128571 -0.142857 -0.157143 -0.171429 -0.642857 -0.528571 -0.614286 -0.685714 -0.828571 -0.828571 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.557143 0.571429 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 66 -1 200 140 1; +#X restore 404 549 graph; +#X connect 0 0 63 0; +#X connect 1 0 37 0; +#X connect 2 0 3 0; +#X connect 2 0 3 1; +#X connect 3 0 4 0; +#X connect 3 0 4 1; +#X connect 4 0 1 0; +#X connect 5 0 7 0; +#X connect 6 0 35 0; +#X connect 7 0 6 0; +#X connect 8 0 63 1; +#X connect 9 0 8 0; +#X connect 10 0 63 2; +#X connect 11 0 10 0; +#X connect 12 0 63 3; +#X connect 13 0 12 0; +#X connect 14 0 63 4; +#X connect 15 0 63 5; +#X connect 16 0 14 0; +#X connect 17 0 15 0; +#X connect 18 0 23 0; +#X connect 19 0 70 0; +#X connect 19 0 52 0; +#X connect 19 1 20 0; +#X connect 21 0 22 0; +#X connect 22 0 52 1; +#X connect 23 0 19 0; +#X connect 24 0 61 0; +#X connect 25 0 40 0; +#X connect 26 0 61 2; +#X connect 27 0 61 3; +#X connect 28 0 61 4; +#X connect 29 0 61 5; +#X connect 30 0 25 0; +#X connect 31 0 26 0; +#X connect 32 0 27 0; +#X connect 33 0 28 0; +#X connect 34 0 29 0; +#X connect 35 0 1 1; +#X connect 36 0 41 0; +#X connect 37 0 50 0; +#X connect 38 0 37 2; +#X connect 39 0 38 0; +#X connect 40 0 61 1; +#X connect 41 0 42 0; +#X connect 42 0 43 0; +#X connect 43 0 48 0; +#X connect 44 0 36 0; +#X connect 45 0 46 0; +#X connect 45 0 46 1; +#X connect 46 0 37 1; +#X connect 47 0 48 1; +#X connect 48 0 45 0; +#X connect 48 0 45 1; +#X connect 52 0 71 0; +#X connect 53 0 56 0; +#X connect 57 0 56 0; +#X connect 58 0 56 0; +#X connect 59 0 60 0; +#X connect 60 0 58 0; +#X connect 61 0 47 0; +#X connect 63 0 2 0; +#X connect 64 0 53 0; +#X connect 67 0 64 0; +#X connect 69 0 68 0; +#X connect 70 0 69 0; +#X connect 71 0 69 0; diff --git a/doc/3.audio.examples/I01.Fourier.analysis.pd b/doc/3.audio.examples/I01.Fourier.analysis.pd index 39f4780b..50259c5d 100644 --- a/doc/3.audio.examples/I01.Fourier.analysis.pd +++ b/doc/3.audio.examples/I01.Fourier.analysis.pd @@ -39,7 +39,7 @@ #X text 144 370 <--; #X text 171 369 phase in hundredths of a cycle, f 10; #X text 153 342 bang-on-snapshot from below; -#X text 97 477 [fft~] computes the Fourier transform \, given the real and imaginary part of a complex-valued signal. Here the imaginary part is zero (the input is real-valued). The output is a (real \, imaginary) pair for each frequency from 0 to 63 (in units of SR/64)., f 41; +#X text 97 474 [fft~] computes the Fourier transform \, given the real and imaginary part of a complex-valued signal. Here the imaginary part is zero (the input is real-valued). The output is a (real \, imaginary) pair for each frequency from 0 to 63 (in units of SR/64)., f 41; #X text 246 688 real and imaginary outputs are graphed separately., f 27; #X obj 85 21 cnv 5 5 25 empty empty Fourier\ Analysis 15 13 0 16 #dfdfdf #202020 0; #X connect 0 0 9 0; diff --git a/doc/3.audio.examples/I02.Hann.window.pd b/doc/3.audio.examples/I02.Hann.window.pd index 6d0502d1..ac46b194 100644 --- a/doc/3.audio.examples/I02.Hann.window.pd +++ b/doc/3.audio.examples/I02.Hann.window.pd @@ -1,4 +1,4 @@ -#N canvas 616 38 568 608 12; +#N canvas 538 57 568 608 12; #N canvas 349 161 612 574 fft-analysis 0; #X obj 46 184 *~; #X obj 45 119 inlet~; diff --git a/doc/3.audio.examples/I03.resynthesis.pd b/doc/3.audio.examples/I03.resynthesis.pd index 18c21179..f1c05baf 100644 --- a/doc/3.audio.examples/I03.resynthesis.pd +++ b/doc/3.audio.examples/I03.resynthesis.pd @@ -1,4 +1,4 @@ -#N canvas 510 55 623 510 12; +#N canvas 510 55 623 548 12; #X declare -stdpath ./; #N canvas 353 76 558 670 fft-analysis 0; #X obj 32 186 *~; @@ -42,7 +42,7 @@ #X connect 12 0 5 1; #X connect 14 0 12 0; #X connect 16 0 10 0; -#X restore 63 385 pd fft-analysis; +#X restore 144 406 pd fft-analysis; #N canvas 687 159 571 372 Hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 512 float 0; @@ -76,27 +76,27 @@ #X connect 11 0 1 0; #X connect 11 0 6 0; #X connect 16 0 11 0; -#X restore 233 456 pd Hann-window; -#X obj 63 419 output~; -#X obj 63 354 noise~; +#X restore 349 477 pd Hann-window; +#X obj 144 440 output~; +#X obj 144 375 noise~; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-gain 256 float 0; #X coords 0 1.025 255 -0.025 512 100 1 0 0; #X restore 54 205 graph; -#X obj 233 420 s \$0-gain; +#X obj 349 441 s \$0-gain; #X text 38 294 0; #X text 38 195 1; #X text 51 304 0; #X text 548 307 22K; #X text 267 180 GAIN; #X obj 403 27 declare -stdpath ./; -#X text 53 68 Using Fourier resynthesis you can take an incoming sound \, operate on its spectrum \, and hear the result. Here we start with white noise and apply a frequency-dependent gain \, which works as a graphic equalizer. There are N/2 = 256 points \, each spaced SR/512 Hz. apart (although their frequency ranges overlap). Open the [pd fft-analysis] subpatch to see the workings., f 73; -#X text 291 390 <-- reset gain; -#X msg 233 391 const 1; +#X text 407 411 <-- reset gain; +#X msg 349 412 const 1; #X text 173 323 Click on the array to draw and change the gains.; -#X obj 233 364 loadbang; -#X obj 81 24 cnv 5 5 25 empty empty Fourier\ Resynthesis 15 13 0 16 #dfdfdf #202020 0; +#X obj 349 385 loadbang; +#X obj 66 20 cnv 5 5 25 empty empty Fourier\ Resynthesis 15 13 0 16 #dfdfdf #202020 0; +#X text 53 68 Using Fourier resynthesis you can take an incoming sound \, operate on its spectrum \, and hear the result. Here we start with white noise and apply a frequency-dependent gain table \, which works as a graphic equalizer (click on it and drag to alter it). There are N/2 = 256 points \, each spaced SR/512 Hz apart (although their frequency ranges overlap). Open the subpatch [pd fft-analysis] to see the workings., f 73; #X connect 0 0 2 0; #X connect 3 0 0 0; -#X connect 14 0 5 0; -#X connect 16 0 14 0; +#X connect 13 0 5 0; +#X connect 15 0 13 0; diff --git a/doc/3.audio.examples/I04.noisegate.pd b/doc/3.audio.examples/I04.noisegate.pd index bbf570b3..bb5f63f1 100644 --- a/doc/3.audio.examples/I04.noisegate.pd +++ b/doc/3.audio.examples/I04.noisegate.pd @@ -1,7 +1,7 @@ -#N canvas 496 38 564 566 12; +#N canvas 496 38 660 631 12; #X declare -stdpath ./; -#X floatatom 271 388 4 0 1000 0 - - - 0; -#X floatatom 79 374 6 0 100 0 - - - 0; +#X floatatom 266 492 4 0 1000 0 - - - 0; +#X floatatom 79 386 6 0 100 0 - - - 0; #N canvas 453 53 560 665 fft-analysis 0; #X obj 35 589 *~; #X obj 142 287 *~; @@ -91,7 +91,6 @@ #X text 91 98 real Fourier transform; #X text 186 338 ... but not less than zero; #X text 87 558 real inverse Fourier transform; -#X text 151 489 normalize by 2/(3N) where N is window size, f 23; #X text 161 312 current power ("s") minus level-adjusted mask ("m"); #X text 149 175 compute power (call it "s") in each channel; #X obj 111 398 +~ 1e-20; @@ -105,6 +104,7 @@ #X text 145 431 compute sqrt((s-m)/s) where "s" is signal power and "m" is mask. (zero if s < m)., f 27; #X floatatom 303 65 5 0 0 0 - - - 0; #X text 375 87 set window size and overlap, f 15; +#X text 151 489 Divide by 3N/2 to normalize \, where N is window size., f 28; #X connect 0 0 9 0; #X connect 1 0 14 1; #X connect 2 0 11 1; @@ -122,22 +122,22 @@ #X connect 10 0 11 0; #X connect 11 0 14 0; #X connect 11 0 19 0; -#X connect 11 0 26 0; +#X connect 11 0 25 0; #X connect 12 0 1 1; -#X connect 13 0 30 0; +#X connect 13 0 29 0; #X connect 14 0 15 0; #X connect 15 0 13 0; #X connect 16 0 1 0; #X connect 17 0 3 1; #X connect 18 0 0 1; -#X connect 26 0 13 1; -#X connect 28 0 6 1; -#X connect 28 0 4 1; -#X connect 30 0 28 0; -#X connect 31 0 35 0; -#X connect 32 0 33 0; -#X connect 35 0 32 0; -#X restore 79 438 pd fft-analysis; +#X connect 25 0 13 1; +#X connect 27 0 6 1; +#X connect 27 0 4 1; +#X connect 29 0 27 0; +#X connect 30 0 34 0; +#X connect 31 0 32 0; +#X connect 34 0 31 0; +#X restore 79 450 pd fft-analysis; #N canvas 580 123 509 564 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 1024 float 0; @@ -190,120 +190,173 @@ #X connect 18 0 19 0; #X connect 18 0 11 0; #X connect 21 0 15 0; -#X restore 351 483 pd hann-window; -#X text 169 350 noise; -#N canvas 636 235 719 406 insample 0; +#X restore 365 579 pd hann-window; +#X text 169 362 noise; +#N canvas 621 135 735 607 insample 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-sample 155944 float 2; -#X coords 0 1 155944 -1 375 207 1; -#X restore 317 102 graph; -#X obj 65 187 r read-sample; -#X obj 179 338 s insamprate; -#X obj 65 300 soundfiler; -#X obj 65 338 s insamplength; -#X text 115 40 read a sample; -#X obj 35 39 loadbang; -#X obj 118 217 symbol \$0-sample; -#X obj 65 246 pack s s; -#X msg 65 271 read -resize \$1 \$2; -#X msg 35 63 \; read-sample ../sound/bell.aiff; -#X msg 35 122 \; read-sample ../sound/voice.wav; -#X msg 179 308 \$1; -#X obj 65 218 t a b; -#X connect 1 0 13 0; -#X connect 3 0 4 0; -#X connect 3 1 12 0; -#X connect 6 0 10 0; -#X connect 7 0 8 1; -#X connect 8 0 9 0; -#X connect 9 0 3 0; -#X connect 12 0 2 0; -#X connect 13 0 8 0; -#X connect 13 1 7 0; -#X restore 351 461 pd insample; -#X obj 271 413 s mask-level; -#X floatatom 174 374 6 0 100 0 - - - 0; -#X text 272 327 on; -#X text 317 328 off; -#X text 272 311 masking; -#X msg 316 351 0; -#N canvas 228 38 431 582 test-signal 0; -#X obj 89 316 line~; -#X obj 213 152 r insamprate; -#X obj 246 451 *~; -#X obj 90 430 *~; -#X obj 246 342 noise~; -#X obj 228 483 +~; -#X obj 108 403 dbtorms; -#X obj 264 425 dbtorms; -#X obj 108 378 inlet; -#X obj 264 401 inlet; -#X obj 228 538 outlet~; -#X obj 198 127 r insamplength; -#X msg 89 292 0 \, \$1 \$2; -#X obj 198 236 /; -#X obj 213 178 * 0.001; -#X obj 213 207 t b f; -#X obj 228 509 hip~ 5; -#X obj 89 104 loadbang; -#X obj 89 160 metro 1000; -#X obj 246 367 bp~ 10000 3; -#X obj 89 129 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 232 235 sample duration \, msec; -#X text 95 69 looped sample playback; -#X obj 89 344 tabread4~ \$0-sample; -#X text 243 315 filtered noise; -#X text 56 20 TEST SIGNAL: looped sample plus noise. The inlets control amplitude of each in dB., f 42; -#X obj 89 265 pack float float; -#X obj 89 238 float; -#X connect 0 0 23 0; -#X connect 1 0 14 0; -#X connect 2 0 5 1; -#X connect 3 0 5 0; -#X connect 4 0 19 0; +#X coords 0 1 155944 -1 279 142 1 0 0; +#X restore 375 268 graph; +#X obj 121 246 soundfiler; +#X obj 477 461 declare -stdpath ./; +#X msg 188 276 \$1; +#X obj 163 307 swap; +#X obj 163 335 /; +#X floatatom 163 395 10 0 0 0 - - - 0; +#X obj 174 160 symbol \$0-sample; +#X obj 42 124 openpanel; +#X msg 121 215 read -resize \$1 \$2; +#X obj 121 188 pack s s; +#X obj 121 160 t a b; +#X floatatom 121 446 9 0 0 0 - - - 0; +#X floatatom 248 384 6 0 0 0 - - - 0; +#X text 219 271 sample rate, f 6; +#X obj 54 19 inlet; +#X obj 121 502 s \$0-size; +#X obj 163 421 s \$0-hz; +#X obj 54 63 route bang; +#X obj 42 97 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 352 107 adc~ 1; +#X obj 407 19 inlet; +#X obj 556 78 samplerate~; +#X obj 407 170 tabwrite~ \$0-sample; +#X obj 569 167 s \$0-sample; +#X msg 569 140 resize \$1; +#X obj 556 111 * 2; +#X text 588 112 2 seconds; +#X obj 556 199 s \$0-size; +#X text 169 57 Subpatch to initialize patch \, load file into array and record., f 22; +#X obj 203 547 outlet; +#X obj 248 411 / 1000; +#X obj 203 487 /; +#X obj 224 517 r \$0-ms; +#X obj 493 113 s \$0-hz; +#X msg 493 88 0.5; +#X msg 448 114 2000; +#X obj 448 139 s \$0-ms; +#X connect 1 0 4 0; +#X connect 1 0 12 0; +#X connect 1 1 3 0; +#X connect 3 0 4 1; +#X connect 3 0 13 0; +#X connect 4 0 5 0; +#X connect 4 1 5 1; +#X connect 5 0 6 0; +#X connect 6 0 17 0; +#X connect 7 0 10 1; +#X connect 8 0 11 0; +#X connect 9 0 1 0; +#X connect 10 0 9 0; +#X connect 11 0 10 0; +#X connect 11 1 7 0; +#X connect 12 0 16 0; +#X connect 12 0 32 0; +#X connect 13 0 31 0; +#X connect 15 0 18 0; +#X connect 18 0 19 0; +#X connect 18 1 11 0; +#X connect 19 0 8 0; +#X connect 20 0 23 0; +#X connect 21 0 22 0; +#X connect 21 0 23 0; +#X connect 21 0 36 0; +#X connect 21 0 35 0; +#X connect 22 0 26 0; +#X connect 25 0 24 0; +#X connect 26 0 25 0; +#X connect 26 0 28 0; +#X connect 31 0 32 1; +#X connect 32 0 30 0; +#X connect 33 0 30 0; +#X connect 35 0 34 0; +#X connect 36 0 37 0; +#X restore 417 500 pd insample; +#X obj 266 517 s mask-level; +#X floatatom 174 386 6 0 100 0 - - - 0; +#X text 267 431 on; +#X text 312 432 off; +#X text 267 415 masking; +#X msg 311 455 0; +#N canvas 306 38 521 612 test-signal 0; +#X obj 323 437 *~; +#X obj 167 401 *~; +#X obj 254 339 noise~; +#X obj 305 481 +~; +#X obj 185 311 dbtorms; +#X obj 341 351 dbtorms; +#X obj 185 156 inlet; +#X obj 341 156 inlet; +#X obj 305 536 outlet~; +#X obj 254 364 bp~ 10000 3; +#X text 142 86 looped sample playback; +#X text 258 306 filtered noise, f 8; +#X text 103 37 TEST SIGNAL: looped sample plus noise. The inlets control amplitude of each in dB., f 42; +#X obj 76 267 *~; +#X obj 76 233 phasor~; +#X obj 76 303 tabread4~ \$0-sample, f 9; +#X msg 341 383 \$1 10; +#X obj 341 407 line~; +#X msg 185 337 \$1 10; +#X obj 185 361 line~; +#X obj 76 204 r \$0-hz; +#X obj 110 268 r \$0-size; +#X connect 0 0 3 1; +#X connect 1 0 3 0; +#X connect 2 0 9 0; +#X connect 3 0 8 0; +#X connect 4 0 18 0; #X connect 5 0 16 0; -#X connect 6 0 3 1; -#X connect 7 0 2 1; -#X connect 8 0 6 0; -#X connect 9 0 7 0; -#X connect 11 0 13 0; -#X connect 11 0 27 1; -#X connect 12 0 0 0; -#X connect 13 0 18 1; -#X connect 13 0 26 1; -#X connect 14 0 15 0; -#X connect 15 0 13 0; -#X connect 15 1 13 1; -#X connect 16 0 10 0; -#X connect 17 0 20 0; -#X connect 18 0 27 0; -#X connect 19 0 2 0; -#X connect 20 0 18 0; -#X connect 23 0 3 0; -#X connect 26 0 12 0; -#X connect 27 0 26 0; -#X restore 79 403 pd test-signal; -#X text 73 348 sampler; -#X text 413 336 calculate noise mask, f 10; -#X obj 79 475 output~; -#X msg 402 374 \; make-mask 2000; -#X msg 271 350 15; +#X connect 6 0 4 0; +#X connect 7 0 5 0; +#X connect 9 0 0 0; +#X connect 13 0 15 0; +#X connect 14 0 13 0; +#X connect 15 0 1 0; +#X connect 16 0 17 0; +#X connect 17 0 0 1; +#X connect 18 0 19 0; +#X connect 19 0 1 1; +#X connect 20 0 14 0; +#X connect 21 0 13 1; +#X restore 79 415 pd test-signal; +#X text 73 360 sampler; +#X text 264 330 calculate noise mask, f 10; +#X obj 79 487 output~; +#X msg 253 368 \; make-mask 2000; +#X msg 266 454 15; #N canvas 647 275 498 424 mask-table 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-mask 512 float 0; #X coords 0 500 511 0 400 300 1; #X restore 49 96 graph; #X text 108 22 This table is the average power measured in each channel of the spectrum \, presumed to represent the noise floor., f 41; -#X restore 351 505 pd mask-table; -#X text 96 317 amplitudes (dB); -#X obj 382 23 declare -stdpath ./; -#X text 47 63 This patch attempts to scrub the noise floor from a sample in two steps. First using the "make-mask" message (which is caught in the [pd fft-analysis] subpatch) \, you estimate the background spectrum. You would normally do this at a moment when only the background noise is audible. Then \, turn on "masking" (to 15 by default \, but try other values) and the patch will try to clean the background noise out of a signal., f 65; -#X text 47 169 For this demonstration \, you control the amplitudes of a looping sample and a filtered noise source. Normally you'd hit "calculate noise mask" with only the noise turned on \, then turn both the noise and the sampler on \, and also "masking" \, to see if the patch can clean the noise out of the signal. Open the [pd fft-analysis] window to see the algorithm \, or the "insample" window to change samples \, or "mask-table" to see the current mask (the average signal power of the noise to clean out of the signal)., f 65; -#X obj 65 18 cnv 5 5 25 empty empty Denoiser 15 13 0 16 #dfdfdf #202020 0; +#X restore 257 579 pd mask-table; +#X text 86 333 amplitudes (dB); +#X text 101 68 This patch attempts to scrub the noise floor from a sample in two steps. First using the "make-mask" message (which is caught in the [pd fft-analysis] subpatch) \, you estimate the background spectrum. You would normally do this at a moment when only the background noise is audible. Then \, turn on "masking" (to 15 by default \, but try other values) and the patch will try to clean the background noise out of a signal., f 68; +#X text 101 174 For this demonstration \, you control the amplitudes of a looping sample and a filtered noise source. Normally you'd hit "calculate noise mask" with only the noise turned on \, then turn both the noise and the sampler on \, and also "masking" \, to see if the patch can clean the noise out of the signal. Open the [pd fft-analysis] window to see the algorithm \, or the "insample" window to change samples \, or "mask-table" to see the current mask (the average signal power of the noise to clean out of the signal)., f 68; +#X obj 76 25 cnv 5 5 25 empty empty Denoiser 15 13 0 16 #dfdfdf #202020 0; +#X obj 439 448 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X msg 413 369 ../sound/bell.aiff; +#X msg 422 392 ../sound/voice.wav; +#X msg 429 416 ../sound/voice2.wav; +#X text 478 344 read input sound; +#X text 466 448 choose a file; +#X obj 413 342 loadbang; +#X obj 491 474 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 517 469 record 2 sec, f 6; +#X floatatom 417 529 8 0 0 0 - - - 0; +#X text 482 529 length in ms; #X connect 0 0 6 0; #X connect 1 0 12 0; #X connect 2 0 15 0; +#X connect 5 0 32 0; #X connect 7 0 12 1; #X connect 11 0 0 0; #X connect 12 0 2 0; #X connect 17 0 0 0; +#X connect 23 0 5 0; +#X connect 24 0 5 0; +#X connect 25 0 5 0; +#X connect 26 0 5 0; +#X connect 29 0 24 0; +#X connect 30 0 5 1; diff --git a/doc/3.audio.examples/I05.compressor.pd b/doc/3.audio.examples/I05.compressor.pd index 65724067..c7f347dd 100644 --- a/doc/3.audio.examples/I05.compressor.pd +++ b/doc/3.audio.examples/I05.compressor.pd @@ -1,36 +1,38 @@ -#N canvas 678 85 560 493 12; +#N canvas 465 57 552 579 12; #X declare -stdpath ./; -#N canvas 394 108 652 570 fft-analysis 0; -#X obj 101 425 *~; -#X obj 62 425 *~; +#N canvas 394 108 595 625 fft-analysis 0; +#X obj 101 465 *~; +#X obj 62 465 *~; #X obj 62 126 *~; #X obj 62 96 inlet~; #X obj 62 149 rfft~; -#X obj 62 488 *~; +#X obj 62 528 *~; #X obj 153 189 *~; -#X obj 62 454 rifft~; -#X obj 62 511 outlet~; +#X obj 62 494 rifft~; +#X obj 62 561 outlet~; #X obj 119 189 *~; #X obj 119 212 +~; #X obj 119 363 clip~; #X obj 151 315 r squelch; #X obj 97 124 tabreceive~ \$0-hann; #X obj 151 338 expr 0.01*$f1*$f1; -#X obj 119 393 *~ 0.00065; #X obj 119 237 +~ 1e-20; -#X obj 100 482 tabreceive~ \$0-hann; +#X obj 100 522 tabreceive~ \$0-hann; #X text 69 13 As in the previous patch \, this works by multiplying each channel of the Fourier analysis by a real number computed from the magnitude. If the magnitude is "m" \, the correction factor is 1/m \, but only to an upper limit controlled by the "squelch" parameter., f 68; #X text 193 186 squared magnitude; #X text 187 238 protect against divide-by-zero; -#X text 200 393 normalize for 1024-point \, overlap-4 Hann; #X text 117 149 outputs complex amplitudes; #X text 166 363 limit the gain to squelch * squelch/100; -#X text 131 416 multiply gain by real and complex part of the amplitude, f 29; +#X text 131 456 multiply gain by real and complex part of the amplitude, f 29; #X obj 119 274 rsqrt~; #X text 169 274 reciprocal square root; #X obj 360 113 r window-size; #X msg 360 139 set \$1 4; #X obj 360 165 block~; +#X obj 167 424 expr 2/(3*$f1); +#X obj 167 395 r window-size; +#X text 282 424 normalize; +#X obj 119 423 *~ 0; #X connect 0 0 7 1; #X connect 1 0 7 0; #X connect 2 0 4 0; @@ -45,121 +47,38 @@ #X connect 6 0 10 1; #X connect 7 0 5 0; #X connect 9 0 10 0; -#X connect 10 0 16 0; -#X connect 11 0 15 0; +#X connect 10 0 15 0; +#X connect 11 0 31 0; #X connect 12 0 14 0; #X connect 13 0 2 1; #X connect 14 0 11 2; -#X connect 15 0 0 1; -#X connect 15 0 1 1; -#X connect 16 0 25 0; -#X connect 17 0 5 1; -#X connect 25 0 11 0; -#X connect 27 0 28 0; -#X connect 28 0 29 0; -#X restore 89 310 pd fft-analysis; -#X floatatom 136 212 5 1 200 0 squelch squelch-set squelch 16; -#N canvas 406 293 420 439 test-signal 0; -#X obj 126 276 line~; -#X obj 126 369 outlet~; -#X msg 126 251 0 \, \$1 \$2; -#X obj 179 172 /; -#X obj 263 141 * 0.001; -#X obj 126 329 hip~ 5; -#X obj 79 55 loadbang; -#X msg 79 150 1; -#X obj 79 172 metro 1000; -#X obj 217 111 t b b f; -#X obj 99 110 t b f; -#X obj 126 301 tabread4~ \$0-sample; -#X text 63 10 test signal: looped sample playback; -#X obj 98 86 r \$0-samplength; -#X obj 217 85 r \$0-insamprate; -#X obj 126 225 pack f f; -#X obj 79 197 float; -#X connect 0 0 11 0; -#X connect 2 0 0 0; -#X connect 3 0 8 1; -#X connect 3 0 15 1; -#X connect 4 0 3 1; -#X connect 5 0 1 0; -#X connect 6 0 7 0; -#X connect 7 0 8 0; -#X connect 8 0 16 0; -#X connect 9 0 7 0; -#X connect 9 1 3 0; -#X connect 9 2 4 0; -#X connect 10 0 7 0; -#X connect 10 1 3 0; -#X connect 10 1 16 1; -#X connect 11 0 5 0; -#X connect 13 0 10 0; -#X connect 14 0 9 0; -#X connect 15 0 2 0; -#X connect 16 0 15 0; -#X restore 89 279 pd test-signal; -#X obj 89 343 output~; -#N canvas 444 61 780 500 insample 0; -#N canvas 0 0 450 300 (subpatch) 0; -#X array \$0-sample 155944 float 2; -#X coords 0 1 155944 -1 347 169 1; -#X restore 364 263 graph; -#X obj 74 174 soundfiler; -#X obj 127 84 symbol \$0-sample; -#X obj 74 114 pack s s; -#X msg 74 145 read -resize \$1 \$2; -#X obj 138 262 s \$0-samplength; -#X obj 74 247 /; -#X obj 74 281 * 1000; -#X obj 74 43 inlet; -#X obj 271 334 outlet; -#X msg 141 202 \$1; -#X obj 141 232 s \$0-insamprate; -#X obj 74 79 t a b; -#X obj 316 107 hip~ 5; -#X obj 316 83 adc~ 1; -#X obj 303 33 inlet; -#X obj 452 83 samplerate~; -#X obj 303 155 tabwrite~ \$0-sample; -#X obj 452 198 s \$0-insamprate; -#X obj 465 167 s \$0-sample; -#X msg 465 140 resize \$1; -#X obj 465 111 * 2; -#X text 536 140 2 seconds; -#X msg 271 191 2000; -#X connect 1 0 5 0; -#X connect 1 0 6 0; -#X connect 1 1 10 0; -#X connect 2 0 3 1; -#X connect 3 0 4 0; -#X connect 4 0 1 0; -#X connect 6 0 7 0; -#X connect 7 0 9 0; -#X connect 8 0 12 0; -#X connect 10 0 6 1; -#X connect 10 0 11 0; -#X connect 12 0 3 0; -#X connect 12 1 2 0; -#X connect 13 0 17 0; -#X connect 14 0 13 0; -#X connect 15 0 16 0; -#X connect 15 0 17 0; #X connect 15 0 23 0; -#X connect 16 0 18 0; -#X connect 16 0 21 0; -#X connect 20 0 19 0; -#X connect 21 0 20 0; -#X connect 23 0 9 0; -#X restore 274 339 pd insample; +#X connect 16 0 5 1; +#X connect 23 0 11 0; +#X connect 25 0 26 0; +#X connect 26 0 27 0; +#X connect 28 0 31 1; +#X connect 29 0 28 0; +#X connect 31 0 0 1; +#X connect 31 0 1 1; +#X restore 89 300 pd fft-analysis; +#X floatatom 136 202 5 1 200 0 squelch squelch-set squelch 16; +#N canvas 406 293 383 306 test-signal 0; +#X obj 105 229 outlet~; +#X text 63 27 test signal: looped sample playback; +#X obj 105 139 *~; +#X obj 105 105 phasor~; +#X obj 105 186 tabread4~ \$0-sample; +#X obj 105 76 r \$0-hz; +#X obj 139 140 r \$0-size; +#X connect 2 0 4 0; +#X connect 3 0 2 0; +#X connect 4 0 0 0; +#X connect 5 0 3 0; +#X connect 6 0 2 1; +#X restore 89 259 pd test-signal; +#X obj 89 343 output~; #X text 58 68 Here we divide each complex channel in the Fourier analysis by its own magnitude to "flatten" the spectrum. The "squelch" control limits the amplitude boost the algorithm will apply. If infinite \, you'll get a white spectrum. If less \, the louder parts of the spectrum will be flattened but the quieter ones will only be boosted by the squelch value., f 61; -#X floatatom 274 375 8 0 0 0 - - - 0; -#X obj 348 309 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 339 376 sample length \, msec; -#X msg 265 223 ../sound/bell.aiff; -#X msg 274 246 ../sound/voice.wav; -#X msg 282 270 ../sound/voice2.wav; -#X text 423 221 change input sound, f 7; -#X obj 265 195 loadbang; #N canvas 580 123 518 506 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 1024 float 0; @@ -175,50 +94,141 @@ #X obj 140 174 s \$0-hann; #X msg 137 336 0; #X obj 64 332 t f b; -#X obj 64 30 loadbang; -#X msg 64 58 1024; -#X floatatom 64 85 5 0 0 0 - - - 0; #X obj 75 114 s window-size; -#X text 107 58 default window size; #X floatatom 64 294 8 0 0 0 - - - 0; #X text 130 294 window hz; -#X text 234 126 Calculate Hann window table (variable window size) by getting the period of the window and Hz. Also get the analysis window size in seconds and msec., f 33; +#X text 246 123 Calculate Hann window table (variable window size) by getting the period of the window and Hz. Also get the analysis window size in seconds and msec., f 33; #X obj 89 206 samplerate~; #X obj 64 160 t f b f; +#X obj 64 60 inlet; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 5 0 6 0; #X connect 5 1 6 1; -#X connect 6 0 16 0; +#X connect 6 0 12 0; #X connect 7 0 8 0; #X connect 9 0 1 1; #X connect 10 0 1 0; #X connect 10 1 4 0; #X connect 10 1 9 0; -#X connect 11 0 12 0; -#X connect 12 0 13 0; -#X connect 13 0 14 0; -#X connect 13 0 20 0; -#X connect 16 0 10 0; -#X connect 19 0 5 1; -#X connect 20 0 5 0; -#X connect 20 1 19 0; -#X connect 20 2 7 0; -#X restore 232 441 pd hann-window; -#X text 376 312 <-- record 2 seconds, f 10; -#N canvas 208 188 323 266 init 0; -#X obj 60 146 declare -stdpath ./; -#X obj 64 61 loadbang; -#X msg 64 87 \; squelch-set 10; -#X connect 1 0 2 0; -#X restore 367 441 pd init; +#X connect 12 0 10 0; +#X connect 15 0 5 1; +#X connect 16 0 5 0; +#X connect 16 1 15 0; +#X connect 16 2 7 0; +#X connect 17 0 11 0; +#X connect 17 0 16 0; +#X restore 289 523 pd hann-window; #X obj 44 22 cnv 5 5 25 empty empty Dynamic\ Range\ Compression\ by\ Fourier\ Analysis 15 13 0 16 #dfdfdf #202020 0; +#N canvas 621 135 735 607 insample 0; +#N canvas 0 0 450 300 (subpatch) 0; +#X array \$0-sample 155944 float 2; +#X coords 0 1 155944 -1 279 142 1 0 0; +#X restore 375 268 graph; +#X obj 121 246 soundfiler; +#X msg 188 276 \$1; +#X obj 163 307 swap; +#X obj 163 335 /; +#X floatatom 163 395 10 0 0 0 - - - 0; +#X obj 175 160 symbol \$0-sample; +#X obj 42 124 openpanel; +#X msg 121 215 read -resize \$1 \$2; +#X obj 121 188 pack s s; +#X obj 121 160 t a b; +#X floatatom 121 446 9 0 0 0 - - - 0; +#X floatatom 248 384 6 0 0 0 - - - 0; +#X text 219 271 sample rate, f 6; +#X obj 54 19 inlet; +#X obj 121 502 s \$0-size; +#X obj 163 421 s \$0-hz; +#X obj 54 63 route bang; +#X obj 42 97 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 352 107 adc~ 1; +#X obj 407 19 inlet; +#X obj 556 78 samplerate~; +#X obj 407 170 tabwrite~ \$0-sample; +#X obj 569 167 s \$0-sample; +#X msg 569 140 resize \$1; +#X obj 556 111 * 2; +#X text 588 112 2 seconds; +#X obj 556 199 s \$0-size; +#X text 169 57 Subpatch to initialize patch \, load file into array and record., f 22; +#X obj 203 547 outlet; +#X obj 248 411 / 1000; +#X obj 203 487 /; +#X obj 224 517 r \$0-ms; +#X obj 493 113 s \$0-hz; +#X msg 493 88 0.5; +#X msg 448 114 2000; +#X obj 448 139 s \$0-ms; +#X obj 450 527 declare -stdpath ./; +#X obj 454 442 loadbang; +#X msg 454 468 \; squelch-set 10; +#X connect 1 0 3 0; +#X connect 1 0 11 0; +#X connect 1 1 2 0; +#X connect 2 0 3 1; +#X connect 2 0 12 0; +#X connect 3 0 4 0; +#X connect 3 1 4 1; +#X connect 4 0 5 0; +#X connect 5 0 16 0; +#X connect 6 0 9 1; +#X connect 7 0 10 0; +#X connect 8 0 1 0; +#X connect 9 0 8 0; +#X connect 10 0 9 0; +#X connect 10 1 6 0; +#X connect 11 0 15 0; +#X connect 11 0 31 0; +#X connect 12 0 30 0; +#X connect 14 0 17 0; +#X connect 17 0 18 0; +#X connect 17 1 10 0; +#X connect 18 0 7 0; +#X connect 19 0 22 0; +#X connect 20 0 21 0; +#X connect 20 0 22 0; +#X connect 20 0 35 0; +#X connect 20 0 34 0; +#X connect 21 0 25 0; +#X connect 24 0 23 0; +#X connect 25 0 24 0; +#X connect 25 0 27 0; +#X connect 30 0 31 1; +#X connect 31 0 29 0; +#X connect 32 0 29 0; +#X connect 34 0 33 0; +#X connect 35 0 36 0; +#X connect 38 0 39 0; +#X restore 287 348 pd insample; +#X obj 309 296 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X msg 283 217 ../sound/bell.aiff; +#X msg 292 240 ../sound/voice.wav; +#X msg 299 264 ../sound/voice2.wav; +#X text 348 192 read input sound; +#X text 336 296 choose a file; +#X obj 283 190 loadbang; +#X obj 361 322 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 387 317 record 2 sec, f 6; +#X floatatom 287 377 8 0 0 0 - - - 0; +#X text 352 377 length in ms; +#X obj 289 435 loadbang; +#X msg 289 463 1024; +#X floatatom 289 490 5 0 0 0 - - - 0; +#X text 332 463 default window size; +#X text 332 490 change window size; +#X text 93 438 In this example we can also change the window size. The subpatch to the right calculates a hann window according to the window size in samples., f 22; #X connect 0 0 3 0; #X connect 2 0 0 0; -#X connect 4 0 6 0; -#X connect 7 0 4 1; -#X connect 9 0 4 0; -#X connect 10 0 4 0; -#X connect 11 0 4 0; -#X connect 13 0 9 0; +#X connect 7 0 17 0; +#X connect 8 0 7 0; +#X connect 9 0 7 0; +#X connect 10 0 7 0; +#X connect 11 0 7 0; +#X connect 14 0 9 0; +#X connect 15 0 7 1; +#X connect 19 0 20 0; +#X connect 20 0 21 0; +#X connect 21 0 5 0; diff --git a/doc/3.audio.examples/I06.timbre.stamp.pd b/doc/3.audio.examples/I06.timbre.stamp.pd index e45fa7b6..a99c83a3 100644 --- a/doc/3.audio.examples/I06.timbre.stamp.pd +++ b/doc/3.audio.examples/I06.timbre.stamp.pd @@ -1,6 +1,6 @@ -#N canvas 441 38 626 557 12; +#N canvas 424 39 670 638 12; #X declare -stdpath ./; -#N canvas 352 38 545 673 fft-analysis 0; +#N canvas 352 38 540 704 fft-analysis 0; #X obj 92 534 *~; #X obj 53 534 *~; #X obj 330 325 *~; @@ -17,14 +17,11 @@ #X obj 110 238 *~; #X obj 110 261 +~; #X obj 110 443 *~; -#X obj 357 459 block~ 1024 4; #X obj 110 391 clip~; #X obj 86 177 tabreceive~ \$0-hann; -#X obj 356 499 loadbang; #X obj 142 341 r squelch; #X obj 142 365 expr 0.01*$f1*$f1; #X obj 110 287 +~ 1e-20; -#X obj 110 503 *~ 0.00065; #X obj 86 603 tabreceive~ \$0-hann; #X obj 298 268 *~; #X obj 298 147 inlet~; @@ -33,17 +30,23 @@ #X text 356 146 control source; #X text 360 296 Fourier transform; #X text 43 19 Internal workings of the timbre stamping algorithm. First the "filter input" is treated as in the compressor patch \, multiplying each channel amplitude by one over its modulus (but limited by the "squelch" parameter.) It is then multiplied by the modulus of the channel amplitude for the control source (which is Fourier analyzed in parallel with the filter input.); -#X msg 356 522 \; window-size 1024 \; squelch 30 \; squelch-set set 30; #X obj 110 312 rsqrt~; #X obj 298 374 sqrt~; #X text 365 353 modulus of control amplitude, f 10; #X text 148 440 multiply the two amplitude factors (for compression and to apply new timbre), f 26; #X text 181 254 reciprocal modulus of filter input amplitude, f 12; +#X obj 375 460 r window-size; +#X msg 375 486 set \$1 4; +#X obj 375 512 block~; +#X obj 157 533 expr 2/(3*$f1); +#X obj 157 504 r window-size; +#X text 272 533 normalize; +#X obj 110 503 *~ 0; #X connect 0 0 11 1; #X connect 1 0 11 0; #X connect 2 0 4 1; #X connect 3 0 4 0; -#X connect 4 0 34 0; +#X connect 4 0 30 0; #X connect 5 0 7 0; #X connect 6 0 5 0; #X connect 7 0 13 0; @@ -60,288 +63,276 @@ #X connect 10 1 2 1; #X connect 11 0 8 0; #X connect 13 0 14 0; -#X connect 14 0 22 0; -#X connect 15 0 23 0; -#X connect 17 0 15 0; -#X connect 18 0 5 1; -#X connect 19 0 32 0; -#X connect 20 0 21 0; -#X connect 21 0 17 2; -#X connect 22 0 33 0; -#X connect 23 0 0 1; -#X connect 23 0 1 1; -#X connect 24 0 8 1; -#X connect 25 0 10 0; -#X connect 26 0 25 0; -#X connect 27 0 25 1; -#X connect 33 0 17 0; -#X connect 34 0 15 1; -#X restore 108 428 pd fft-analysis; -#X text 46 406 filter; -#X text 48 421 input; -#X text 228 422 source; -#X text 229 403 control; -#X floatatom 59 259 4 0 500 0 - squelch-set - 16; -#X obj 59 293 s squelch; -#X obj 108 464 output~; -#X msg 163 247 ../sound/bell.aiff; -#X msg 169 269 ../sound/voice.wav; -#X msg 174 292 ../sound/voice2.wav; -#X obj 163 323 s read-sound1; -#X msg 339 249 ../sound/bell.aiff; -#X msg 346 271 ../sound/voice.wav; -#X msg 352 294 ../sound/voice2.wav; -#X obj 339 324 s read-sound2; -#X text 352 225 control source; -#X text 175 224 filter input; -#X text 251 200 change input sounds; -#X floatatom 438 390 8 0 0 0 - \$0-samp-msec - 0; -#N canvas 386 50 626 626 test-signals 0; -#X obj 80 481 line~; -#X obj 80 561 outlet~; -#X msg 80 455 0 \, \$1 \$2; -#X obj 80 429 pack 0 0; -#X obj 204 356 /; -#X obj 227 331 * 0.001; -#X obj 80 534 hip~ 5; -#X obj 81 215 loadbang; -#X msg 80 354 1; -#X obj 80 376 metro 1000; -#X obj 181 304 t b b f; -#X obj 103 274 t b f; -#X obj 80 506 tabread4~ \$0-sample; -#X text 61 26 test signal: looped sample playback; -#X obj 117 132 hip~ 5; -#X obj 117 108 adc~ 1; -#X obj 178 128 s insamprate; -#X obj 108 71 inlet; -#X obj 178 104 samplerate~; -#X obj 103 250 r \$0-samplength; -#X obj 181 278 r \$0-insamprate; -#X obj 108 160 tabwrite~ \$0-sample; -#X obj 336 480 line~; -#X obj 336 557 outlet~; -#X msg 336 454 0 \, \$1 \$2; -#X obj 336 428 pack 0 0; -#X obj 460 371 /; -#X obj 483 340 * 0.001; -#X obj 336 533 hip~ 5; -#X obj 336 226 loadbang; -#X msg 336 350 1; -#X obj 336 375 metro 1000; -#X obj 437 309 t b b f; -#X obj 363 277 t b f; -#X obj 320 135 hip~ 5; -#X obj 320 111 adc~ 1; -#X obj 311 76 inlet; -#X obj 382 109 samplerate~; -#X obj 382 133 s insamprate2; -#X obj 311 160 tabwrite~ \$0-sample2; -#X obj 362 253 r \$0-samplength2; -#X obj 437 283 r \$0-insamprate2; -#X obj 336 505 tabread4~ \$0-sample2; -#X obj 80 401 float; -#X obj 336 400 float; -#X connect 0 0 12 0; -#X connect 2 0 0 0; +#X connect 14 0 20 0; +#X connect 15 0 40 0; +#X connect 16 0 15 0; +#X connect 17 0 5 1; +#X connect 18 0 19 0; +#X connect 19 0 16 2; +#X connect 20 0 29 0; +#X connect 21 0 8 1; +#X connect 22 0 10 0; +#X connect 23 0 22 0; +#X connect 24 0 22 1; +#X connect 29 0 16 0; +#X connect 30 0 15 1; +#X connect 34 0 35 0; +#X connect 35 0 36 0; +#X connect 37 0 40 1; +#X connect 38 0 37 0; +#X connect 40 0 0 1; +#X connect 40 0 1 1; +#X restore 102 485 pd fft-analysis; +#X obj 102 521 output~; +#N canvas 386 50 506 348 test-signals 0; +#X obj 76 241 outlet~; +#X text 122 30 test signal: looped sample playback; +#X obj 76 157 *~; +#X obj 76 123 phasor~; +#X obj 76 94 r \$0-hz1; +#X obj 110 158 r \$0-size1; +#X obj 76 197 tabread4~ \$0-sample1; +#X obj 286 241 outlet~; +#X obj 286 157 *~; +#X obj 286 123 phasor~; +#X obj 286 94 r \$0-hz2; +#X obj 320 158 r \$0-size2; +#X obj 286 197 tabread4~ \$0-sample2; +#X connect 2 0 6 0; #X connect 3 0 2 0; -#X connect 4 0 3 1; -#X connect 4 0 9 1; -#X connect 5 0 4 1; -#X connect 6 0 1 0; -#X connect 7 0 8 0; -#X connect 8 0 9 0; -#X connect 9 0 43 0; -#X connect 10 0 8 0; -#X connect 10 1 4 0; -#X connect 10 2 5 0; -#X connect 11 0 8 0; -#X connect 11 1 4 0; -#X connect 11 1 43 1; -#X connect 12 0 6 0; -#X connect 14 0 21 0; -#X connect 15 0 14 0; -#X connect 17 0 18 0; -#X connect 17 0 21 0; -#X connect 18 0 16 0; -#X connect 19 0 11 0; -#X connect 20 0 10 0; -#X connect 22 0 42 0; -#X connect 24 0 22 0; -#X connect 25 0 24 0; -#X connect 26 0 25 1; -#X connect 26 0 31 1; -#X connect 27 0 26 1; -#X connect 28 0 23 0; -#X connect 29 0 30 0; -#X connect 30 0 31 0; -#X connect 31 0 44 0; -#X connect 32 0 30 0; -#X connect 32 1 26 0; -#X connect 32 2 27 0; -#X connect 33 0 30 0; -#X connect 33 1 26 0; -#X connect 33 1 44 1; -#X connect 34 0 39 0; -#X connect 35 0 34 0; -#X connect 36 0 37 0; -#X connect 36 0 39 0; -#X connect 37 0 38 0; -#X connect 40 0 33 0; -#X connect 41 0 32 0; -#X connect 42 0 28 0; -#X connect 43 0 3 0; -#X connect 44 0 25 0; -#X restore 106 399 pd test-signals; +#X connect 4 0 3 0; +#X connect 5 0 2 1; +#X connect 6 0 0 0; +#X connect 8 0 12 0; +#X connect 9 0 8 0; +#X connect 10 0 9 0; +#X connect 11 0 8 1; +#X connect 12 0 7 0; +#X restore 100 436 pd test-signals; #X f 16; -#N canvas 388 86 710 358 insample2 0; -#N canvas 0 50 450 300 (subpatch) 0; +#X text 63 71 This is a Fourier-based "vocoder" (perhaps better called a "timbre stamp") like the one the Convolution brothers use. The "control source" is analyzed to get its spectral envelope \, which is then stamped onto the "filter input" by adjusting the amplitudes of its Fourier transform. The "filter input" is first whitened by the compression algorithm from the previous patch in this series. The best value of "squelch" to use depends critically on what kind of sounds are used for the filter input and the control source., f 76; +#X obj 44 19 cnv 5 5 25 empty empty Cort\ &\ Zack's\ Secret 15 13 0 16 #dfdfdf #202020 0; +#X text 47 451 filter input, f 6; +#X text 222 448 control source, f 7; +#X obj 418 312 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X msg 392 234 ../sound/bell.aiff; +#X msg 401 257 ../sound/voice.wav; +#X msg 408 281 ../sound/voice2.wav; +#X text 445 311 choose a file; +#X obj 392 207 loadbang; +#X obj 477 339 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 503 335 record 2 sec, f 6; +#N canvas 621 135 735 607 insample1 0; +#N canvas 0 0 450 300 (subpatch) 0; +#X array \$0-sample1 155944 float 2; +#X coords 0 1 155944 -1 279 142 1 0 0; +#X restore 375 268 graph; +#X obj 121 246 soundfiler; +#X msg 188 276 \$1; +#X obj 163 307 swap; +#X obj 163 335 /; +#X floatatom 163 395 10 0 0 0 - - - 0; +#X obj 42 124 openpanel; +#X msg 121 215 read -resize \$1 \$2; +#X obj 121 188 pack s s; +#X obj 121 160 t a b; +#X floatatom 121 468 9 0 0 0 - - - 0; +#X floatatom 206 309 6 0 0 0 - - - 0; +#X text 219 271 sample rate, f 6; +#X obj 54 19 inlet; +#X obj 54 63 route bang; +#X obj 42 97 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 352 107 adc~ 1; +#X obj 407 19 inlet; +#X obj 556 78 samplerate~; +#X msg 569 140 resize \$1; +#X obj 556 111 * 2; +#X text 588 112 2 seconds; +#X text 169 57 Subpatch to initialize patch \, load file into array and record., f 22; +#X msg 453 88 0.5; +#X obj 174 160 symbol \$0-sample1; +#X obj 163 421 s \$0-hz1; +#X obj 121 502 s \$0-size1; +#X obj 556 199 s \$0-size1; +#X obj 569 167 s \$0-sample1; +#X obj 407 170 tabwrite~ \$0-sample1; +#X obj 453 113 s \$0-hz1; +#X connect 1 0 3 0; +#X connect 1 0 10 0; +#X connect 1 1 2 0; +#X connect 2 0 3 1; +#X connect 2 0 11 0; +#X connect 3 0 4 0; +#X connect 3 1 4 1; +#X connect 4 0 5 0; +#X connect 5 0 25 0; +#X connect 6 0 9 0; +#X connect 7 0 1 0; +#X connect 8 0 7 0; +#X connect 9 0 8 0; +#X connect 9 1 24 0; +#X connect 10 0 26 0; +#X connect 13 0 14 0; +#X connect 14 0 15 0; +#X connect 14 1 9 0; +#X connect 15 0 6 0; +#X connect 16 0 29 0; +#X connect 17 0 18 0; +#X connect 17 0 23 0; +#X connect 17 0 29 0; +#X connect 18 0 20 0; +#X connect 19 0 28 0; +#X connect 20 0 19 0; +#X connect 20 0 27 0; +#X connect 23 0 30 0; +#X connect 24 0 8 1; +#X restore 396 365 pd insample1; +#X obj 417 518 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X msg 407 487 ../sound/voice2.wav; +#X text 444 517 choose a file; +#X obj 391 413 loadbang; +#X obj 476 545 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 502 541 record 2 sec, f 6; +#N canvas 621 135 735 607 insample2 0; +#N canvas 0 0 450 300 (subpatch) 0; #X array \$0-sample2 62079 float 2; -#X coords 0 1 62079 -1 400 150 1; -#X restore 275 54 graph; -#X obj 27 74 unpack s f; -#X obj 26 191 soundfiler; -#X text 364 250 read a sample; -#X obj 284 249 loadbang; -#X obj 27 100 t s b; -#X obj 27 135 pack s s; -#X msg 27 163 read -resize \$1 \$2; -#X obj 27 47 t a b; -#X obj 26 254 /; -#X obj 26 278 * 1000; -#X obj 27 18 r read-sound2; -#X obj 124 74 s \$0-insamprate2; -#X obj 80 104 symbol \$0-sample2; -#X obj 36 218 s \$0-samplength2; -#X obj 64 251 r \$0-insamprate2; -#X obj 26 301 s \$0-samp2-msec; -#X msg 284 273 \; read-sound2 ../sound/voice.wav; -#X obj 125 46 f 44100; -#X connect 1 0 5 0; -#X connect 1 1 12 0; -#X connect 2 0 9 0; -#X connect 2 0 14 0; -#X connect 4 0 17 0; -#X connect 5 0 6 0; -#X connect 5 1 13 0; -#X connect 6 0 7 0; -#X connect 7 0 2 0; -#X connect 8 0 1 0; -#X connect 8 1 18 0; -#X connect 9 0 10 0; -#X connect 10 0 16 0; -#X connect 11 0 8 0; -#X connect 13 0 6 1; -#X connect 15 0 9 1; -#X connect 18 0 12 0; -#X restore 318 411 pd insample2; -#N canvas 498 195 722 350 insample1 0; -#N canvas 0 50 450 300 (subpatch) 0; -#X array \$0-sample 155944 float 2; -#X coords 0 1 155944 -1 400 150 1; -#X restore 259 42 graph; -#X obj 19 74 unpack s f; -#X obj 19 184 soundfiler; -#X text 356 250 read a sample; -#X obj 276 249 loadbang; -#X obj 19 100 t s b; -#X obj 72 104 symbol \$0-sample; -#X obj 19 135 pack s s; -#X msg 19 160 read -resize \$1 \$2; -#X obj 19 47 t a b; -#X obj 29 210 s \$0-samplength; -#X obj 116 74 s \$0-insamprate; -#X obj 19 247 /; -#X obj 19 275 * 1000; -#X obj 19 298 s \$0-samp-msec; -#X obj 57 247 r \$0-insamprate; -#X obj 19 23 r read-sound1; -#X msg 276 273 \; read-sound1 ../sound/bell.aiff; -#X obj 116 46 f 44100; -#X connect 1 0 5 0; -#X connect 1 1 11 0; -#X connect 2 0 10 0; -#X connect 2 0 12 0; -#X connect 4 0 17 0; -#X connect 5 0 7 0; -#X connect 5 1 6 0; -#X connect 6 0 7 1; -#X connect 7 0 8 0; -#X connect 8 0 2 0; -#X connect 9 0 1 0; -#X connect 9 1 18 0; -#X connect 12 0 13 0; +#X coords 0 1 62079 -1 279 142 1 0 0; +#X restore 375 268 graph; +#X obj 121 246 soundfiler; +#X msg 188 276 \$1; +#X obj 163 307 swap; +#X obj 163 335 /; +#X floatatom 163 395 10 0 0 0 - - - 0; +#X obj 42 124 openpanel; +#X msg 121 215 read -resize \$1 \$2; +#X obj 121 188 pack s s; +#X obj 121 160 t a b; +#X floatatom 121 468 9 0 0 0 - - - 0; +#X floatatom 206 309 6 0 0 0 - - - 0; +#X text 219 271 sample rate, f 6; +#X obj 54 19 inlet; +#X obj 54 63 route bang; +#X obj 42 97 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 352 107 adc~ 1; +#X obj 407 19 inlet; +#X obj 561 78 samplerate~; +#X msg 574 140 resize \$1; +#X obj 561 111 * 2; +#X text 593 112 2 seconds; +#X text 169 57 Subpatch to initialize patch \, load file into array and record., f 22; +#X msg 453 88 0.5; +#X obj 121 502 s \$0-size2; +#X obj 163 421 s \$0-hz2; +#X obj 561 199 s \$0-size2; +#X obj 574 167 s \$0-sample2; +#X obj 453 113 s \$0-hz2; +#X obj 407 170 tabwrite~ \$0-sample2; +#X obj 174 160 symbol \$0-sample2; +#X connect 1 0 3 0; +#X connect 1 0 10 0; +#X connect 1 1 2 0; +#X connect 2 0 3 1; +#X connect 2 0 11 0; +#X connect 3 0 4 0; +#X connect 3 1 4 1; +#X connect 4 0 5 0; +#X connect 5 0 25 0; +#X connect 6 0 9 0; +#X connect 7 0 1 0; +#X connect 8 0 7 0; +#X connect 9 0 8 0; +#X connect 9 1 30 0; +#X connect 10 0 24 0; #X connect 13 0 14 0; -#X connect 15 0 12 1; -#X connect 16 0 9 0; -#X connect 18 0 11 0; -#X restore 318 389 pd insample1; -#X floatatom 437 413 8 0 0 0 - \$0-samp2-msec - 0; -#N canvas 163 152 567 523 hann-window 0; +#X connect 14 0 15 0; +#X connect 14 1 9 0; +#X connect 15 0 6 0; +#X connect 16 0 29 0; +#X connect 17 0 18 0; +#X connect 17 0 23 0; +#X connect 17 0 29 0; +#X connect 18 0 20 0; +#X connect 19 0 27 0; +#X connect 20 0 19 0; +#X connect 20 0 26 0; +#X connect 23 0 28 0; +#X connect 30 0 8 1; +#X restore 395 571 pd insample2; +#X msg 391 440 ../sound/voice.wav; +#X msg 400 463 ../sound/bell.aiff; +#X floatatom 214 306 5 1 200 1 squelch - squelch 16; +#X text 463 207 FILTER INPUT; +#X text 462 412 CONTROL SOURCE; +#X obj 461 24 declare -stdpath ./; +#N canvas 580 123 518 506 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 1024 float 0; -#X coords 0 1 1023 0 300 100 1; -#X restore 110 394 graph; -#X obj 327 184 osc~; -#X obj 327 209 *~ -0.5; -#X obj 327 233 +~ 0.5; -#X obj 310 276 tabwrite~ \$0-hann; -#X obj 86 113 r window-size; -#X obj 157 237 /; -#X obj 175 205 samplerate~; -#X obj 157 315 s window-sec; -#X obj 67 251 swap; -#X obj 67 275 /; -#X obj 67 299 s window-hz; -#X obj 168 265 * 1000; -#X obj 168 292 s window-msec; -#X obj 86 148 t f b f; -#X msg 175 155 resize \$1; -#X obj 175 179 s \$0-hann; -#X obj 279 122 r window-hz; -#X msg 352 154 0; -#X obj 279 150 t f b; -#X text 56 20 calculate Hann window table (variable window size) and constants window-hz (fundamental frequency of analysis) \, window-sec and window-msec (analysis window size in seconds and msec)., f 56; +#X coords 0 1 1023 0 227 152 1; +#X restore 240 262 graph; +#X obj 112 366 osc~; +#X obj 112 391 *~ -0.5; +#X obj 112 415 +~ 0.5; +#X obj 95 458 tabwrite~ \$0-hann; +#X obj 64 236 swap; +#X obj 64 260 /; +#X msg 140 150 resize \$1; +#X obj 140 174 s \$0-hann; +#X msg 137 336 0; +#X obj 64 332 t f b; +#X obj 75 114 s window-size; +#X floatatom 64 294 8 0 0 0 - - - 0; +#X text 130 294 window hz; +#X text 246 123 Calculate Hann window table (variable window size) by getting the period of the window and Hz. Also get the analysis window size in seconds and msec., f 33; +#X obj 89 206 samplerate~; +#X obj 64 160 t f b f; +#X obj 64 60 inlet; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 3 0 4 0; -#X connect 5 0 14 0; -#X connect 6 0 8 0; -#X connect 6 0 12 0; -#X connect 7 0 6 1; -#X connect 7 0 9 1; -#X connect 9 0 10 0; -#X connect 9 1 10 1; -#X connect 10 0 11 0; -#X connect 12 0 13 0; -#X connect 14 0 6 0; -#X connect 14 0 9 0; -#X connect 14 1 7 0; -#X connect 14 2 15 0; -#X connect 15 0 16 0; -#X connect 17 0 19 0; -#X connect 18 0 1 1; -#X connect 19 0 1 0; -#X connect 19 1 4 0; -#X connect 19 1 18 0; -#X restore 318 434 pd hann-window; -#X text 500 390 sample lengths \,; -#X text 504 413 msec; -#X text 46 71 This is a Fourier-based "vocoder" (perhaps better called a "timbre stamp") like the one the Convolution brothers use. The "control source" is analyzed to get its spectral envelope \, which is then stamped onto the "filter input" by adjusting the amplitudes of its Fourier transform. The "filter input" is first whitened by the compression algorithm from the previous patch in this series. The best value of "squelch" to use depends critically on what kind of sounds are used for the filter input and the control source., f 76; -#X obj 411 28 declare -stdpath ./; -#X obj 215 372 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 126 372 <- record ->; -#X obj 106 373 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 73 23 cnv 5 5 25 empty empty Cort\ &\ Zack's\ Secret 15 13 0 16 #dfdfdf #202020 0; -#X connect 0 0 7 0; #X connect 5 0 6 0; -#X connect 8 0 11 0; -#X connect 9 0 11 0; -#X connect 10 0 11 0; -#X connect 12 0 15 0; -#X connect 13 0 15 0; -#X connect 14 0 15 0; -#X connect 20 0 0 0; -#X connect 20 1 0 1; -#X connect 29 0 20 1; -#X connect 31 0 20 0; +#X connect 5 1 6 1; +#X connect 6 0 12 0; +#X connect 7 0 8 0; +#X connect 9 0 1 1; +#X connect 10 0 1 0; +#X connect 10 1 4 0; +#X connect 10 1 9 0; +#X connect 12 0 10 0; +#X connect 15 0 5 1; +#X connect 16 0 5 0; +#X connect 16 1 15 0; +#X connect 16 2 7 0; +#X connect 17 0 11 0; +#X connect 17 0 16 0; +#X restore 96 383 pd hann-window; +#X floatatom 96 350 5 0 0 0 - - - 0; +#X msg 96 209 512; +#X obj 106 233 loadbang; +#X msg 106 257 1024; +#X msg 116 283 2048; +#X msg 127 312 4096; +#X obj 214 246 loadbang; +#X msg 214 273 30; +#X connect 0 0 1 0; +#X connect 2 0 0 0; +#X connect 2 1 0 1; +#X connect 7 0 15 0; +#X connect 8 0 15 0; +#X connect 9 0 15 0; +#X connect 10 0 15 0; +#X connect 12 0 8 0; +#X connect 13 0 15 1; +#X connect 16 0 22 0; +#X connect 17 0 22 0; +#X connect 19 0 23 0; +#X connect 20 0 22 1; +#X connect 23 0 22 0; +#X connect 24 0 22 0; +#X connect 30 0 29 0; +#X connect 31 0 30 0; +#X connect 32 0 33 0; +#X connect 33 0 30 0; +#X connect 34 0 30 0; +#X connect 35 0 30 0; +#X connect 36 0 37 0; +#X connect 37 0 25 0; diff --git a/doc/3.audio.examples/I07.phase.vocoder.pd b/doc/3.audio.examples/I07.phase.vocoder.pd index 5ec402cf..4e8c9b1a 100644 --- a/doc/3.audio.examples/I07.phase.vocoder.pd +++ b/doc/3.audio.examples/I07.phase.vocoder.pd @@ -1,9 +1,10 @@ -#N canvas 388 38 674 590 12; -#X declare -stdpath ./; -#X floatatom 404 317 5 0 0 0 - transpo-set - 0; -#X floatatom 123 357 5 0 0 0 - speed-set - 0; -#X floatatom 30 359 7 0 0 0 - location-set - 0; -#N canvas 457 38 740 709 fft-analysis 0; +#N canvas 489 71 701 624 12; +#X text 55 71 This patch takes a sound \, analyzes windows in it both for channel magnitude and for phase precession in each channel (compared to another overlapping window). The real-time output recreates the same magnitudes and phase precession \, although the phases themselves are in general different. You can control either the location or its motion (setting location stops motion \, while setting a non-zero motion causes the location to change automatically). "Rewind" goes back to the beginning. You can use different window sizes (use the message boxes - the number box is for readout). The "lock" feature forces phase coherency between neighboring channels \, which makes a more present sound but can add artifacts to the sound. Look into the [pd fft-analysis] subppatch to see the workings., f 82; +#X text 55 219 Note: The algorithm was altered and updated in Pd version 0.44 in a way that affected the result., f 82; +#X obj 27 20 cnv 5 5 25 empty empty Phase\ Vocoder\ for\ Time\ Stretching\ and\ Contraction 15 13 0 16 #dfdfdf #202020 0; +#X floatatom 421 324 5 0 0 0 - transpo-set - 0; +#X floatatom 47 366 7 0 0 0 - location-set - 0; +#N canvas 457 34 740 709 fft-analysis 0; #X obj 54 483 *~; #X obj 21 483 *~; #X obj 21 505 -~; @@ -314,11 +315,11 @@ #X connect 59 0 38 1; #X connect 61 0 20 1; #X connect 61 0 21 1; -#X restore 28 471 pd fft-analysis; -#X obj 404 348 s transpo; -#X text 120 338 hundredths; -#X text 323 332 normal; -#X obj 28 509 output~; +#X restore 45 478 pd fft-analysis; +#X obj 421 355 s transpo; +#X text 134 355 hundredths; +#X text 340 339 normal; +#X obj 45 516 output~; #N canvas 385 188 595 536 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 2048 float 0; @@ -366,124 +367,124 @@ #X connect 19 0 1 0; #X connect 19 1 4 0; #X connect 19 1 18 0; -#X restore 364 542 pd hann-window; -#N canvas 409 112 743 468 insample 0; +#X restore 381 549 pd hann-window; +#N canvas 724 173 764 665 insample 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-sample 62079 float 2; -#X coords 0 1 62079 -1 400 150 1 0 0; -#X restore 302 170 graph; -#X obj 68 127 r read-sample; -#X obj 59 192 unpack s f; -#X obj 59 302 soundfiler; -#X obj 356 352 loadbang; -#X obj 59 218 t s b; -#X obj 112 221 symbol \$0-sample; -#X obj 59 253 pack s s; -#X msg 59 278 read -resize \$1 \$2; -#X obj 59 165 t a b; -#X obj 69 331 s \$0-samplength; -#X obj 156 192 s \$0-insamprate; -#X obj 59 365 /; -#X obj 59 389 * 1000; -#X obj 59 412 s \$0-samp-msec; -#X obj 97 365 r \$0-insamprate; -#X obj 383 76 hip~ 5; -#X obj 383 52 adc~ 1; -#X obj 437 22 inlet; -#X obj 452 61 samplerate~; -#X obj 437 113 tabwrite~ \$0-sample, f 20; -#X obj 452 85 s \$0-insamprate; -#X msg 356 377 \; read-sample ../sound/voice.wav; +#X coords 0 1 62079 -1 363 214 1 0 0; +#X restore 344 349 graph; +#X obj 78 123 r read-sample; +#X obj 59 264 soundfiler; +#X obj 58 481 loadbang; +#X obj 112 171 symbol \$0-sample; +#X obj 59 203 pack s s; +#X msg 59 233 read -resize \$1 \$2; +#X obj 59 404 s \$0-samplength; +#X obj 90 317 /; +#X obj 90 348 * 1000; +#X obj 90 371 s \$0-samp-msec; +#X obj 289 90 adc~ 1; +#X obj 357 22 inlet; +#X obj 392 61 samplerate~; +#X obj 357 213 tabwrite~ \$0-sample, f 20; +#X obj 392 127 s \$0-insamprate; +#X msg 58 506 \; read-sample ../sound/voice.wav; #X obj 59 22 inlet; #X obj 59 69 openpanel; -#X obj 156 166 f 44100; -#X text 426 352 read default sample; -#X connect 1 0 9 0; -#X connect 2 0 5 0; -#X connect 2 1 11 0; -#X connect 3 0 10 0; -#X connect 3 0 12 0; -#X connect 4 0 22 0; -#X connect 5 0 7 0; -#X connect 5 1 6 0; -#X connect 6 0 7 1; -#X connect 7 0 8 0; -#X connect 8 0 3 0; -#X connect 9 0 2 0; -#X connect 9 1 25 0; -#X connect 12 0 13 0; -#X connect 13 0 14 0; -#X connect 15 0 12 1; -#X connect 16 0 20 0; -#X connect 17 0 16 0; -#X connect 18 0 19 0; -#X connect 18 0 20 0; -#X connect 19 0 21 0; -#X connect 23 0 24 0; -#X connect 24 0 9 0; -#X connect 25 0 11 0; -#X restore 364 507 pd insample; -#X f 12; -#X floatatom 519 501 9 0 0 0 - \$0-samp-msec - 0; -#X msg 172 468 ../sound/bell.aiff; -#X msg 181 491 ../sound/voice.wav; -#X msg 188 515 ../sound/voice2.wav; -#X obj 172 544 s read-sample; -#X obj 405 377 tgl 22 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 30 381 s location; -#X obj 123 381 s speed; -#X obj 208 384 s rewind; -#X msg 286 308 200; -#X msg 294 332 100; -#X msg 301 356 20; -#X text 315 307 contract; -#X text 331 356 expand; -#X obj 405 407 s lock; -#X text 30 304 location; -#X text 27 320 (stops; -#X text 32 335 motion); -#X text 121 322 motion in; -#X text 175 446 read input sound; -#X floatatom 522 450 7 0 0 0 - window-size - 0; -#X msg 533 319 512; -#X msg 539 342 1024; -#X msg 544 365 2048; -#X msg 549 388 4096; -#X obj 533 414 s window-size; -#X text 530 277 window size \,; -#X text 530 292 samples; -#X text 72 280 ------- location controls -------; -#X obj 286 384 s auto; -#X obj 402 283 bng 22 250 50 0 no-detune empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 462 243 declare -stdpath ./; -#X obj 208 355 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 364 453 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 445 478 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 444 310 detune in cents, f 8; -#X text 425 285 no detune; -#X text 568 318 <-- set; -#X text 388 453 <-- load file; -#X text 371 479 record -->; -#X text 517 524 sample length in msec, f 13; -#X text 521 470 window size; -#X text 38 54 This patch takes a sound \, analyzes windows in it both for channel magnitude and for phase precession in each channel (compared to another overlapping window). The real-time output recreates the same magnitudes and phase precession \, although the phases themselves are in general different. You can control either the location or its motion (setting location stops motion \, while setting a non-zero motion causes the location to change automatically). "Rewind" goes back to the beginning. You can use different window sizes (use the message boxes - the number box is for readout). The "lock" feature forces phase coherency between neighboring channels \, which makes a more present sound but can add artifacts to the sound. Look into the [pd fft-analysis] subppatch to see the workings., f 82; -#X text 38 202 Note: The algorithm was altered and updated in Pd version 0.44 in a way that affected the result., f 82; -#X obj 74 16 cnv 5 5 25 empty empty Phase\ Vocoder\ for\ Time\ Stretching\ and\ Contraction 15 13 0 16 #dfdfdf #202020 0; -#X connect 0 0 4 0; -#X connect 1 0 17 0; -#X connect 2 0 16 0; -#X connect 3 0 7 0; +#X text 128 481 read default sample; +#X msg 126 291 \$1; +#X obj 126 319 s \$0-insamprate; +#X obj 59 168 t a b; +#X obj 513 194 s \$0-samplength; +#X obj 377 187 s \$0-samp-msec; +#X msg 377 161 2000; +#X obj 513 111 * 2; +#X msg 533 164 s \$0-sample; +#X msg 533 139 resize \$1; +#X text 410 21 record 2 seconds; +#X connect 1 0 22 0; +#X connect 2 0 7 0; +#X connect 2 0 8 0; +#X connect 2 1 20 0; +#X connect 3 0 16 0; +#X connect 4 0 5 1; +#X connect 5 0 6 0; +#X connect 6 0 2 0; +#X connect 8 0 9 0; +#X connect 9 0 10 0; #X connect 11 0 14 0; +#X connect 12 0 13 0; #X connect 12 0 14 0; -#X connect 13 0 14 0; -#X connect 15 0 24 0; -#X connect 19 0 39 0; -#X connect 20 0 39 0; -#X connect 21 0 39 0; -#X connect 31 0 35 0; -#X connect 32 0 35 0; -#X connect 33 0 35 0; -#X connect 34 0 35 0; -#X connect 42 0 18 0; -#X connect 43 0 9 0; -#X connect 44 0 9 1; +#X connect 12 0 25 0; +#X connect 13 0 15 0; +#X connect 13 0 26 0; +#X connect 17 0 18 0; +#X connect 18 0 22 0; +#X connect 20 0 21 0; +#X connect 20 0 8 1; +#X connect 22 0 5 0; +#X connect 22 1 4 0; +#X connect 25 0 24 0; +#X connect 26 0 23 0; +#X connect 26 0 28 0; +#X connect 28 0 27 0; +#X restore 381 514 pd insample; +#X f 12; +#X floatatom 537 524 9 0 0 0 - \$0-samp-msec - 0; +#X msg 189 475 ../sound/bell.aiff; +#X msg 198 498 ../sound/voice.wav; +#X msg 202 520 ../sound/voice2.wav; +#X obj 189 551 s read-sample; +#X obj 422 384 tgl 22 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 47 388 s location; +#X obj 225 391 s rewind; +#X msg 303 315 200; +#X msg 311 339 100; +#X msg 318 363 20; +#X text 332 314 contract; +#X text 348 363 expand; +#X obj 422 414 s lock; +#X text 47 311 location; +#X text 44 327 (stops; +#X text 49 342 motion); +#X text 135 339 motion in; +#X text 192 453 read input sound; +#X floatatom 551 453 7 0 0 0 - window-size - 0; +#X msg 550 326 512; +#X msg 556 349 1024; +#X msg 561 372 2048; +#X msg 566 395 4096; +#X obj 550 421 s window-size; +#X text 547 284 window size \,; +#X text 547 299 samples; +#X text 81 287 ------- location controls -------; +#X obj 303 391 s auto; +#X obj 419 290 bng 22 250 50 0 no-detune empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 225 362 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 381 460 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 462 485 bng 22 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 461 317 detune in cents, f 8; +#X text 442 292 no detune; +#X text 585 325 <-- set; +#X text 405 460 <-- load file; +#X text 388 486 record -->; +#X text 535 547 sample length in msec, f 13; +#X text 550 473 window size; +#X obj 140 384 nbx 5 17 -1e+37 1e+37 0 0 speed speed-set empty 0 -10 0 12 #dfdfdf #000000 #000000 0 256; +#X connect 3 0 6 0; +#X connect 4 0 18 0; +#X connect 5 0 9 0; +#X connect 13 0 16 0; +#X connect 14 0 16 0; +#X connect 15 0 16 0; +#X connect 17 0 25 0; +#X connect 20 0 40 0; +#X connect 21 0 40 0; +#X connect 22 0 40 0; +#X connect 32 0 36 0; +#X connect 33 0 36 0; +#X connect 34 0 36 0; +#X connect 35 0 36 0; +#X connect 42 0 19 0; +#X connect 43 0 11 0; +#X connect 44 0 11 1; diff --git a/doc/3.audio.examples/I08.pvoc.reverb.pd b/doc/3.audio.examples/I08.pvoc.reverb.pd index 4bd2ae48..42b84406 100644 --- a/doc/3.audio.examples/I08.pvoc.reverb.pd +++ b/doc/3.audio.examples/I08.pvoc.reverb.pd @@ -1,4 +1,4 @@ -#N canvas 514 91 550 473 12; +#N canvas 513 86 605 530 12; #X declare -stdpath ./; #N canvas 359 38 837 719 fft 0; #X obj 63 584 *~; @@ -29,45 +29,37 @@ #X obj 298 131 inlet~; #X obj 279 400 outlet~; #X obj 74 213 -~; -#X obj 74 256 clip~ 0 1; -#X obj 74 234 *~ 1e+20; #X obj 445 128 inlet~; -#X text 161 243 stronger than; -#X text 163 258 old one; #X obj 298 232 -~; #X obj 316 207 lrshift~ 1; -#X obj 298 280 clip~ 0 1; -#X obj 298 258 *~ 1e+20; #X obj 474 212 -~; -#X obj 474 260 clip~ 0 1; -#X obj 474 238 *~ 1e+20; #X obj 492 187 lrshift~ -1; #X obj 279 342 *~; #X obj 279 371 *~; -#X text 159 229 1 if new signal; #X text 304 103 new; #X text 452 100 old; #X text 135 27 Choose whether to replace the "old" signal with the "new" one. The "new" one must be stronger than the old one and also must be stronger than its two neighboring channels; -#X text 419 327 1 if we're louder than neighbor; +#X text 466 268 1 if we're louder than neighbor, f 17; +#X obj 474 240 expr~ $v1 > 0; +#X obj 298 260 expr~ $v1 > 0; +#X obj 74 243 expr~ $v1 > 0; +#X text 180 229 1 if new signal stronger than old one, f 15; #X connect 0 0 2 0; -#X connect 0 0 9 0; -#X connect 0 0 8 0; -#X connect 0 0 12 0; -#X connect 0 0 15 0; -#X connect 2 0 4 0; -#X connect 3 0 16 0; -#X connect 4 0 3 0; -#X connect 5 0 2 1; -#X connect 8 0 11 0; -#X connect 9 0 8 1; -#X connect 10 0 16 1; -#X connect 11 0 10 0; -#X connect 12 0 14 0; -#X connect 13 0 17 1; -#X connect 14 0 13 0; -#X connect 15 0 12 1; -#X connect 16 0 17 0; -#X connect 17 0 1 0; +#X connect 0 0 5 0; +#X connect 0 0 4 0; +#X connect 0 0 6 0; +#X connect 0 0 7 0; +#X connect 2 0 16 0; +#X connect 3 0 2 1; +#X connect 4 0 15 0; +#X connect 5 0 4 1; +#X connect 6 0 14 0; +#X connect 7 0 6 1; +#X connect 8 0 9 0; +#X connect 9 0 1 0; +#X connect 14 0 9 1; +#X connect 15 0 8 1; +#X connect 16 0 8 0; #X restore 151 312 pd decision; #X obj 475 434 *~; #N canvas 352 333 393 308 divide-by-prev 0; @@ -135,12 +127,11 @@ #X connect 9 0 11 0; #X connect 10 0 9 1; #X restore 277 369 pd switch; -#X obj 548 357 r revtime; +#X obj 548 358 r revtime; #X obj 99 560 tabreceive~ \$0-hann; #X obj 186 83 tabreceive~ \$0-hann, f 11; #X msg 558 380 set \$1; #X obj 558 404 s revtime-set; -#X obj 681 141 loadbang; #X obj 681 50 r window-size; #X msg 681 72 set \$1 4; #X obj 681 94 block~; @@ -186,7 +177,6 @@ #X connect 9 0 11 0; #X connect 10 0 9 1; #X restore 397 353 pd switch; -#X msg 681 167 \; window-size 4096 \; revtime 20; #X obj 322 55 r~ \$0-amp-real; #X obj 337 107 r~ \$0-amp-imag; #X obj 442 174 r~ \$0-inc-real; @@ -203,11 +193,11 @@ #X connect 2 0 6 0; #X connect 3 0 5 1; #X connect 4 0 5 0; -#X connect 5 0 55 0; -#X connect 6 0 54 0; +#X connect 5 0 53 0; +#X connect 6 0 52 0; #X connect 7 0 1 0; #X connect 7 0 3 0; -#X connect 7 0 58 0; +#X connect 7 0 56 0; #X connect 8 0 10 1; #X connect 9 0 10 0; #X connect 10 0 24 0; @@ -230,16 +220,16 @@ #X connect 21 0 24 1; #X connect 22 0 2 0; #X connect 22 0 4 0; -#X connect 22 0 57 0; +#X connect 22 0 55 0; #X connect 23 0 0 1; #X connect 24 0 27 0; -#X connect 24 0 46 0; +#X connect 24 0 45 0; #X connect 25 0 22 1; #X connect 25 0 7 1; -#X connect 26 0 46 1; -#X connect 26 1 46 2; -#X connect 26 2 53 0; -#X connect 26 3 52 0; +#X connect 26 0 45 1; +#X connect 26 1 45 2; +#X connect 26 2 51 0; +#X connect 26 3 50 0; #X connect 27 0 19 0; #X connect 27 0 3 1; #X connect 27 0 2 1; @@ -247,49 +237,48 @@ #X connect 27 1 1 1; #X connect 27 1 4 1; #X connect 28 0 31 0; -#X connect 28 0 37 0; +#X connect 28 0 36 0; #X connect 29 0 17 1; #X connect 30 0 15 1; #X connect 31 0 32 0; -#X connect 33 0 47 0; +#X connect 33 0 34 0; #X connect 34 0 35 0; -#X connect 35 0 36 0; -#X connect 37 0 25 1; -#X connect 40 0 46 3; -#X connect 41 0 12 0; -#X connect 41 0 12 1; -#X connect 41 0 27 3; -#X connect 46 0 14 0; -#X connect 46 0 14 1; -#X connect 46 0 22 0; -#X connect 46 1 13 0; -#X connect 46 1 13 1; -#X connect 46 1 7 0; -#X connect 48 0 41 0; -#X connect 49 0 11 0; -#X connect 49 0 11 1; -#X connect 49 0 27 4; -#X connect 50 0 40 0; -#X connect 51 0 46 4; -#X connect 56 0 15 0; -#X restore 184 337 pd fft; -#X floatatom 368 266 4 0 1000 0 - revtime-set - 0; -#X floatatom 59 273 6 0 0 0 - - - 0; -#X text 406 266 reverb time; -#X obj 184 372 output~; -#X obj 59 372 output~; -#X text 25 56 This is a phase vocoder acting as a reverberator. The sound is more coherent (less "whispered") than a real room or a standard delay-based reverberator., f 70; -#X text 25 110 The technique is to "punch" the incoming sound into channels where (1) there's a peak \, and (2) the incoming sound drowns out whatever might already be there. If the sound already in any channel is louder than the input the input for that channel is ignored., f 70; +#X connect 36 0 25 1; +#X connect 39 0 45 3; +#X connect 40 0 12 0; +#X connect 40 0 12 1; +#X connect 40 0 27 3; +#X connect 45 0 14 0; +#X connect 45 0 14 1; +#X connect 45 0 22 0; +#X connect 45 1 13 0; +#X connect 45 1 13 1; +#X connect 45 1 7 0; +#X connect 46 0 40 0; +#X connect 47 0 11 0; +#X connect 47 0 11 1; +#X connect 47 0 27 4; +#X connect 48 0 39 0; +#X connect 49 0 45 4; +#X connect 54 0 15 0; +#X restore 214 393 pd fft; +#X floatatom 380 269 4 0 1000 0 - revtime-set - 0; +#X floatatom 89 314 6 0 0 0 - - - 0; +#X text 418 269 reverb time; +#X obj 214 428 output~; +#X obj 89 428 output~; +#X text 50 73 This is a phase vocoder acting as a reverberator. The sound is more coherent (less "whispered") than a real room or a standard delay-based reverberator., f 70; +#X text 50 127 The technique is to "punch" the incoming sound into channels where (1) there's a peak \, and (2) the incoming sound drowns out whatever might already be there. If the sound already in any channel is louder than the input the input for that channel is ignored., f 70; #N canvas 464 229 262 333 test-sound 0; #X obj 46 25 inlet; #X obj 46 145 osc~; #X obj 115 201 line~; -#X floatatom 46 86 0 0 0 0 - - - 0; +#X floatatom 46 86 5 0 0 0 - - - 0; #X obj 46 59 mtof; #X obj 46 170 cos~; #X obj 46 194 hip~ 20; #X obj 46 117 t f b; -#X obj 115 91 bng 15 250 50 0 empty empty empty 0 -6 0 8 #fcfcfc #000000 #000000; +#X obj 115 91 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 160 172 pack 0 30; #X obj 160 117 del 20; #X obj 115 144 pack 1 20; @@ -310,9 +299,9 @@ #X connect 10 0 9 0; #X connect 11 0 2 0; #X connect 12 0 13 0; -#X restore 59 300 pd test-sound; -#X obj 368 298 s revtime; -#X text 25 181 For each window \, the amplitude in each channel is propagated by a constant phase increment and multiplied downward by a gain that determines the "reverb time"., f 70; +#X restore 89 356 pd test-sound; +#X obj 380 301 s revtime; +#X text 50 198 For each window \, the amplitude in each channel is propagated by a constant phase increment and multiplied downward by a gain that determines the "reverb time"., f 70; #N canvas 635 123 602 538 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 4096 float 0; @@ -360,16 +349,20 @@ #X connect 19 0 1 0; #X connect 19 1 4 0; #X connect 19 1 18 0; -#X restore 366 328 pd hann-window; -#X text 76 436 reverb in; -#X text 184 436 reverb out; -#X obj 369 401 declare -stdpath ./; -#X obj 59 241 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X text 109 272 short tone pitch; -#X obj 174 14 cnv 5 5 25 empty empty Piano\ Reverb 15 13 0 16 #dfdfdf #202020 0; +#X restore 378 341 pd hann-window; +#X text 106 492 reverb in; +#X text 234 492 reverb out; +#X obj 378 472 declare -stdpath ./; +#X obj 89 277 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 30 20 cnv 5 5 25 empty empty Piano\ Reverb 15 13 0 16 #dfdfdf #202020 0; +#X text 118 277 <-- retrigger; +#X text 139 308 short tone pitch (click and drag or set pitch), f 24; +#X obj 378 376 loadbang; +#X msg 378 402 \; window-size 4096 \; revtime 20, f 18; #X connect 0 0 4 0; #X connect 1 0 9 0; #X connect 2 0 8 0; #X connect 8 0 5 0; #X connect 8 0 0 0; #X connect 15 0 2 0; +#X connect 19 0 20 0; diff --git a/doc/3.audio.examples/I09.sheep.from.goats.pd b/doc/3.audio.examples/I09.sheep.from.goats.pd index 2e3d3967..08222d10 100644 --- a/doc/3.audio.examples/I09.sheep.from.goats.pd +++ b/doc/3.audio.examples/I09.sheep.from.goats.pd @@ -1,4 +1,5 @@ -#N canvas 495 50 618 576 12; +#N canvas 471 54 637 650 12; +#X declare -stdpath ./; #X declare -stdpath ./; #N canvas 447 38 690 818 fft-analysis 0; #X obj 71 702 *~; @@ -14,7 +15,6 @@ #X obj 84 428 -~; #X obj 32 701 *~; #X obj 66 46 tabreceive~ \$0-hann; -#X obj 498 40 loadbang; #X obj 508 127 r window-size; #X obj 66 751 tabreceive~ \$0-hann; #X obj 118 325 *~; @@ -76,253 +76,161 @@ #X text 387 567 0 if all neighbors clean 1 if a neighbor dirty, f 24; #X text 465 378 adjust threshold to quadratic units and scale, f 25; #X text 368 227 add neighboring amplitude to this one and take squared magnitude of result - do this for both the left neighbor and the right one, f 34; -#X msg 498 65 \; window-size 1024; #X connect 0 0 6 1; #X connect 1 0 7 0; -#X connect 2 0 23 0; +#X connect 2 0 22 0; #X connect 3 0 5 0; #X connect 4 0 3 0; #X connect 5 0 11 0; #X connect 5 0 8 0; #X connect 5 0 8 1; -#X connect 5 0 22 0; +#X connect 5 0 21 0; #X connect 5 1 0 0; #X connect 5 1 2 0; #X connect 5 1 2 1; -#X connect 5 1 21 0; +#X connect 5 1 20 0; #X connect 6 0 1 0; -#X connect 8 0 23 0; -#X connect 9 0 22 1; +#X connect 8 0 22 0; #X connect 9 0 21 1; -#X connect 10 0 30 0; +#X connect 9 0 20 1; +#X connect 10 0 29 0; #X connect 11 0 6 0; #X connect 12 0 3 1; -#X connect 13 0 75 0; -#X connect 14 0 17 0; -#X connect 15 0 1 1; -#X connect 16 0 31 0; -#X connect 17 0 18 0; -#X connect 19 0 57 0; -#X connect 20 0 19 1; +#X connect 13 0 16 0; +#X connect 14 0 1 1; +#X connect 15 0 30 0; +#X connect 16 0 17 0; +#X connect 18 0 56 0; +#X connect 19 0 18 1; +#X connect 20 0 24 0; +#X connect 20 0 26 0; +#X connect 20 0 51 0; +#X connect 20 0 52 0; +#X connect 21 0 23 0; #X connect 21 0 25 0; -#X connect 21 0 27 0; -#X connect 21 0 52 0; -#X connect 21 0 53 0; -#X connect 22 0 24 0; -#X connect 22 0 26 0; -#X connect 22 0 50 0; -#X connect 22 0 51 0; -#X connect 23 0 9 0; -#X connect 24 0 50 1; -#X connect 25 0 52 1; -#X connect 26 0 51 1; -#X connect 27 0 53 1; -#X connect 28 0 31 1; -#X connect 29 0 32 0; -#X connect 29 0 34 0; -#X connect 29 0 33 0; -#X connect 30 0 29 0; -#X connect 31 0 10 0; -#X connect 31 0 36 0; -#X connect 32 0 35 0; -#X connect 33 0 32 1; -#X connect 34 0 35 1; -#X connect 35 0 45 0; +#X connect 21 0 49 0; +#X connect 21 0 50 0; +#X connect 22 0 9 0; +#X connect 23 0 49 1; +#X connect 24 0 51 1; +#X connect 25 0 50 1; +#X connect 26 0 52 1; +#X connect 27 0 30 1; +#X connect 28 0 31 0; +#X connect 28 0 33 0; +#X connect 28 0 32 0; +#X connect 29 0 28 0; +#X connect 30 0 10 0; +#X connect 30 0 35 0; +#X connect 31 0 34 0; +#X connect 32 0 31 1; +#X connect 33 0 34 1; +#X connect 34 0 44 0; +#X connect 35 0 37 0; #X connect 36 0 38 0; -#X connect 37 0 39 0; -#X connect 37 0 41 0; -#X connect 37 0 40 0; -#X connect 38 0 37 0; -#X connect 39 0 42 0; -#X connect 40 0 39 1; -#X connect 41 0 42 1; +#X connect 36 0 40 0; +#X connect 36 0 39 0; +#X connect 37 0 36 0; +#X connect 38 0 41 0; +#X connect 39 0 38 1; +#X connect 40 0 41 1; +#X connect 41 0 42 0; #X connect 42 0 43 0; -#X connect 43 0 44 0; -#X connect 44 0 45 1; -#X connect 45 0 19 0; -#X connect 46 0 31 1; -#X connect 47 0 31 0; -#X connect 50 0 47 0; -#X connect 50 0 47 1; -#X connect 51 0 16 0; -#X connect 51 0 16 1; -#X connect 52 0 46 0; -#X connect 52 0 46 1; -#X connect 53 0 28 0; -#X connect 53 0 28 1; -#X connect 55 0 57 1; -#X connect 56 0 55 0; -#X connect 57 0 11 1; -#X connect 57 0 0 1; -#X connect 58 0 10 1; -#X connect 59 0 36 1; +#X connect 43 0 44 1; +#X connect 44 0 18 0; +#X connect 45 0 30 1; +#X connect 46 0 30 0; +#X connect 49 0 46 0; +#X connect 49 0 46 1; +#X connect 50 0 15 0; +#X connect 50 0 15 1; +#X connect 51 0 45 0; +#X connect 51 0 45 1; +#X connect 52 0 27 0; +#X connect 52 0 27 1; +#X connect 54 0 56 1; +#X connect 55 0 54 0; +#X connect 56 0 11 1; +#X connect 56 0 0 1; +#X connect 57 0 10 1; +#X connect 58 0 35 1; +#X connect 59 0 57 0; #X connect 60 0 58 0; -#X connect 61 0 59 0; -#X restore 59 408 pd fft-analysis; -#X floatatom 358 276 6 0 100 0 - - - 0; -#X obj 59 443 output~; -#X floatatom 59 348 5 0 100 0 - - - 0; -#X text 103 326 noise; -#X floatatom 106 348 5 0 100 0 - - - 0; -#N canvas 272 180 466 593 test-signal 0; -#X obj 72 295 line~; -#X obj 242 395 *~; -#X obj 72 409 *~; -#X obj 242 286 noise~; -#X obj 224 457 +~; -#X obj 90 382 dbtorms; -#X obj 260 369 dbtorms; -#X obj 90 357 inlet; -#X obj 260 345 inlet; -#X obj 224 538 outlet~; -#X msg 72 267 0 \, \$1 \$2; -#X obj 181 212 /; -#X obj 196 160 * 0.001; -#X obj 196 186 t b f; -#X obj 224 510 hip~ 5; -#X obj 72 94 loadbang; -#X obj 72 146 metro 1000; -#X obj 242 311 bp~ 10000 3; -#X obj 72 119 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X text 215 211 sample duration \, msec; -#X text 87 63 looped sample playback; -#X obj 72 323 tabread4~ \$0-sample; -#X text 239 259 filtered noise; -#X text 67 16 TEST SIGNAL: looped sample plus noise. The inlets control amplitude of each in dB., f 42; -#X obj 181 113 r \$0-samplength; -#X obj 196 137 r \$0-insamprate; -#X obj 353 433 *~; -#X obj 371 407 dbtorms; -#X obj 371 383 inlet; -#X text 350 297 osc; -#X obj 353 323 osc~ 440; -#X obj 224 482 *~ 3; -#X obj 72 214 float; -#X obj 72 240 pack float float; -#X connect 0 0 21 0; -#X connect 1 0 4 1; -#X connect 2 0 4 0; -#X connect 3 0 17 0; -#X connect 4 0 31 0; -#X connect 5 0 2 1; -#X connect 6 0 1 1; -#X connect 7 0 5 0; -#X connect 8 0 6 0; -#X connect 10 0 0 0; -#X connect 11 0 16 1; -#X connect 11 0 33 1; -#X connect 12 0 13 0; -#X connect 13 0 11 0; -#X connect 13 1 11 1; -#X connect 14 0 9 0; -#X connect 15 0 18 0; -#X connect 16 0 32 0; +#X restore 59 458 pd fft-analysis; +#X floatatom 346 280 6 0 100 0 - - - 0; +#X obj 59 523 output~; +#X floatatom 59 358 5 0 100 0 - - - 0; +#X text 103 336 noise; +#X floatatom 106 358 5 0 100 0 - - - 0; +#N canvas 272 180 615 542 test-signal 0; +#X obj 313 338 *~; +#X obj 133 320 *~; +#X obj 270 267 noise~; +#X obj 295 400 +~; +#X obj 191 275 dbtorms; +#X obj 191 110 inlet; +#X obj 295 481 outlet~; +#X obj 270 292 bp~ 10000 3; +#X text 267 234 filtered noise, f 8; +#X obj 424 376 *~; +#X obj 497 346 dbtorms; +#X obj 497 110 inlet; +#X text 421 240 osc; +#X obj 424 266 osc~ 440; +#X obj 295 439 *~ 3; +#X obj 77 218 *~; +#X obj 77 184 phasor~; +#X obj 77 265 tabread4~ \$0-sample, f 9; +#X obj 77 155 r \$0-hz; +#X obj 111 219 r \$0-size; +#X msg 191 299 \$1 10; +#X obj 191 323 line~; +#X obj 361 295 dbtorms; +#X obj 361 110 inlet; +#X msg 361 319 \$1 10; +#X obj 361 343 line~; +#X msg 497 372 \$1 10; +#X obj 497 396 line~; +#X text 105 31 TEST SIGNAL: looped sample plus noise and oscillator. The inlets control amplitude of each in dB., f 42; +#X connect 0 0 3 1; +#X connect 1 0 3 0; +#X connect 2 0 7 0; +#X connect 3 0 14 0; +#X connect 4 0 20 0; +#X connect 5 0 4 0; +#X connect 7 0 0 0; +#X connect 9 0 3 1; +#X connect 10 0 26 0; +#X connect 11 0 10 0; +#X connect 13 0 9 0; +#X connect 14 0 6 0; +#X connect 15 0 17 0; +#X connect 16 0 15 0; #X connect 17 0 1 0; #X connect 18 0 16 0; -#X connect 21 0 2 0; -#X connect 24 0 11 0; -#X connect 24 0 32 1; -#X connect 25 0 12 0; -#X connect 26 0 4 1; -#X connect 27 0 26 1; -#X connect 28 0 27 0; -#X connect 30 0 26 0; -#X connect 31 0 14 0; -#X connect 32 0 33 0; -#X connect 33 0 10 0; -#X restore 59 377 pd test-signal; -#X text 43 326 sampler; -#X text 64 295 amplitudes (dB); -#N canvas 388 86 722 350 insample 0; -#N canvas 0 0 450 300 (subpatch) 0; -#X array \$0-sample 155944 float 2; -#X coords 0 1 155944 -1 400 150 1; -#X restore 259 38 graph; -#X obj 19 23 r read-sample; -#X obj 19 74 unpack s f; -#X obj 19 184 soundfiler; -#X text 356 250 read a sample; -#X obj 276 249 loadbang; -#X obj 19 100 t s b; -#X obj 72 105 symbol \$0-sample; -#X obj 19 135 pack s s; -#X msg 19 160 read -resize \$1 \$2; -#X obj 19 47 t a b; -#X msg 276 273 \; read-sample ../sound/bell.aiff; -#X obj 29 210 s \$0-samplength; -#X obj 116 74 s \$0-insamprate; -#X obj 19 247 /; -#X obj 19 271 * 1000; -#X obj 19 294 s \$0-samp-msec; -#X obj 55 244 r \$0-insamprate; -#X obj 116 49 f 44100; -#X connect 1 0 10 0; -#X connect 2 0 6 0; -#X connect 2 1 13 0; -#X connect 3 0 12 0; -#X connect 3 0 14 0; -#X connect 5 0 11 0; -#X connect 6 0 8 0; -#X connect 6 1 7 0; -#X connect 7 0 8 1; -#X connect 8 0 9 0; -#X connect 9 0 3 0; -#X connect 10 0 2 0; -#X connect 10 1 18 0; -#X connect 14 0 15 0; -#X connect 15 0 16 0; -#X connect 17 0 14 1; -#X connect 18 0 13 0; -#X restore 236 496 pd insample; -#X msg 236 395 ../sound/bell.aiff; -#X msg 243 418 ../sound/voice.wav; -#X msg 250 441 ../sound/voice2.wav; -#X text 239 375 change input sound; -#X obj 236 468 s read-sample; -#X floatatom 236 523 8 0 0 0 - \$0-samp-msec - 0; -#X text 302 523 sample length \, msec; -#X floatatom 236 274 6 0 100 0 - - - 0; -#X floatatom 154 348 6 0 100 0 - - - 0; -#X text 162 326 osc; -#X msg 456 296 512; -#X msg 462 319 1024; -#X msg 467 343 2048; -#X obj 456 392 s window-size; -#X msg 473 366 4096; -#X obj 236 300 s clean; -#X text 236 323 0=silent; -#X text 234 343 100=all; -#X obj 358 302 s dirty; -#X text 354 323 100=silent; -#X text 356 340 0=all; +#X connect 19 0 15 1; +#X connect 20 0 21 0; +#X connect 21 0 1 1; +#X connect 22 0 24 0; +#X connect 23 0 22 0; +#X connect 24 0 25 0; +#X connect 25 0 0 1; +#X connect 26 0 27 0; +#X connect 27 0 9 1; +#X restore 59 407 pd test-signal; +#X text 43 336 sampler; +#X text 62 300 amplitudes (dB); +#X floatatom 234 278 6 0 100 0 - - - 0; +#X floatatom 154 358 6 0 100 0 - - - 0; +#X text 162 336 osc; +#X msg 483 305 512; +#X msg 492 369 1024; +#X msg 497 396 2048; +#X msg 503 423 4096; +#X obj 234 306 s clean; +#X obj 346 306 s dirty; #X text 43 198 Two separate thresholds may be adjusted to listen to the "clean" or "dirty" part of the signal. You'll hear anything less incoherent than the clean threshold \, OR more incoherent than the dirty one., f 75; #X text 43 54 This patch applies a very simple coherence test to distinguish between sinusoids and noise in an input signal. It works very imperfectly (since noise is random \, no matter what test we place on it it will sometimes spoof its way in.) Here we just test that neighboring channels are 180 degrees (pi radians) out of phase \, as they should be in the main lobe in response to a sinusoid. If any three channels are so arranged \, all three are considered as contributing to a sinusoid. To do this we make an "incoherence" measure which is zero if the phase relationship is perfect and progressively larger otherwise., f 75; -#N canvas 577 259 559 559 tables 0; -#N canvas 0 22 450 278 (subpatch) 0; -#X array \$0-inc-imag 2048 float 2; -#X coords 0 1 2048 -1 200 140 1; -#X restore 289 389 graph; -#N canvas 0 22 450 278 (subpatch) 0; -#X array \$0-inc-real 2048 float 2; -#X coords 0 1 2048 -1 200 140 1 0 0; -#X restore 77 388 graph; -#N canvas 0 22 450 278 (subpatch) 0; -#X array \$0-precess-imag 2048 float 2; -#X coords 0 1 2048 -1 200 140 1 0 0; -#X restore 289 209 graph; -#N canvas 0 22 450 278 (subpatch) 0; -#X array \$0-precess-real 2048 float 2; -#X coords 0 1 2048 -1 200 140 1 0 0; -#X restore 77 208 graph; -#N canvas 0 22 450 278 (subpatch) 0; -#X array \$0-last-imag 2048 float 2; -#X coords 0 1 2048 -1 200 140 1 0 0; -#X restore 289 39 graph; -#N canvas 0 22 450 278 (subpatch) 0; -#X array \$0-last-real 2048 float 2; -#X coords 0 1 2048 -1 200 140 1 0 0; -#X restore 77 38 graph; -#X restore 455 465 pd tables; #N canvas 734 203 602 538 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 1024 float 0; @@ -370,20 +278,124 @@ #X connect 19 0 1 0; #X connect 19 1 4 0; #X connect 19 1 18 0; -#X restore 455 440 pd hann-window; +#X restore 479 538 pd hann-window; #X obj 430 17 declare -stdpath ./; -#X obj 74 15 cnv 5 5 25 empty empty Pitch/Unpitched\ Separation 15 13 0 16 #dfdfdf #202020 0; +#X obj 21 13 cnv 5 5 25 empty empty Pitch/Unpitched\ Separation 15 13 0 16 #dfdfdf #202020 0; +#N canvas 621 135 735 607 insample 0; +#N canvas 0 0 450 300 (subpatch) 0; +#X array \$0-sample 155944 float 2; +#X coords 0 1 155944 -1 279 142 1 0 0; +#X restore 375 268 graph; +#X obj 121 246 soundfiler; +#X msg 188 276 \$1; +#X obj 163 307 swap; +#X obj 163 335 /; +#X floatatom 163 395 10 0 0 0 - - - 0; +#X obj 175 160 symbol \$0-sample; +#X obj 42 124 openpanel; +#X msg 121 215 read -resize \$1 \$2; +#X obj 121 188 pack s s; +#X obj 121 160 t a b; +#X floatatom 121 446 9 0 0 0 - - - 0; +#X floatatom 248 384 6 0 0 0 - - - 0; +#X text 219 271 sample rate, f 6; +#X obj 54 19 inlet; +#X obj 121 502 s \$0-size; +#X obj 163 421 s \$0-hz; +#X obj 54 63 route bang; +#X obj 42 97 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 352 107 adc~ 1; +#X obj 407 19 inlet; +#X obj 556 78 samplerate~; +#X obj 407 170 tabwrite~ \$0-sample; +#X obj 569 167 s \$0-sample; +#X msg 569 140 resize \$1; +#X obj 556 111 * 2; +#X text 588 112 2 seconds; +#X obj 556 199 s \$0-size; +#X text 169 57 Subpatch to initialize patch \, load file into array and record., f 22; +#X obj 203 547 outlet; +#X obj 248 411 / 1000; +#X obj 203 487 /; +#X obj 224 517 r \$0-ms; +#X obj 493 113 s \$0-hz; +#X msg 493 88 0.5; +#X msg 448 114 2000; +#X obj 448 139 s \$0-ms; +#X obj 450 527 declare -stdpath ./; +#X obj 454 442 loadbang; +#X msg 454 468 \; squelch-set 10; +#X connect 1 0 3 0; +#X connect 1 0 11 0; +#X connect 1 1 2 0; +#X connect 2 0 3 1; +#X connect 2 0 12 0; +#X connect 3 0 4 0; +#X connect 3 1 4 1; +#X connect 4 0 5 0; +#X connect 5 0 16 0; +#X connect 6 0 9 1; +#X connect 7 0 10 0; +#X connect 8 0 1 0; +#X connect 9 0 8 0; +#X connect 10 0 9 0; +#X connect 10 1 6 0; +#X connect 11 0 15 0; +#X connect 11 0 31 0; +#X connect 12 0 30 0; +#X connect 14 0 17 0; +#X connect 17 0 18 0; +#X connect 17 1 10 0; +#X connect 18 0 7 0; +#X connect 19 0 22 0; +#X connect 20 0 21 0; +#X connect 20 0 22 0; +#X connect 20 0 35 0; +#X connect 20 0 34 0; +#X connect 21 0 25 0; +#X connect 24 0 23 0; +#X connect 25 0 24 0; +#X connect 25 0 27 0; +#X connect 30 0 31 1; +#X connect 31 0 29 0; +#X connect 32 0 29 0; +#X connect 34 0 33 0; +#X connect 35 0 36 0; +#X connect 38 0 39 0; +#X restore 274 551 pd insample; +#X obj 296 499 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X msg 270 420 ../sound/bell.aiff; +#X msg 279 443 ../sound/voice.wav; +#X msg 286 467 ../sound/voice2.wav; +#X text 335 395 read input sound; +#X text 323 499 choose a file; +#X obj 270 393 loadbang; +#X obj 348 525 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 374 520 record 2 sec, f 6; +#X floatatom 274 580 8 0 0 0 - - - 0; +#X text 339 580 length in ms; +#X text 234 329 0 = silent 100 = all, f 10; +#X text 341 329 100 = silent 0 = all, f 12; +#X obj 492 337 loadbang; +#X obj 483 494 s window-size; +#X floatatom 483 460 5 0 0 0 - - - 0; #X connect 0 0 2 0; -#X connect 1 0 28 0; +#X connect 1 0 17 0; #X connect 3 0 6 0; #X connect 5 0 6 1; #X connect 6 0 0 0; -#X connect 10 0 14 0; -#X connect 11 0 14 0; -#X connect 12 0 14 0; -#X connect 17 0 25 0; -#X connect 18 0 6 2; -#X connect 20 0 23 0; -#X connect 21 0 23 0; -#X connect 22 0 23 0; +#X connect 9 0 16 0; +#X connect 10 0 6 2; +#X connect 12 0 39 0; +#X connect 13 0 39 0; +#X connect 14 0 39 0; +#X connect 15 0 39 0; +#X connect 23 0 33 0; #X connect 24 0 23 0; +#X connect 25 0 23 0; +#X connect 26 0 23 0; +#X connect 27 0 23 0; +#X connect 30 0 25 0; +#X connect 31 0 23 1; +#X connect 37 0 13 0; +#X connect 39 0 38 0; diff --git a/doc/3.audio.examples/I10.phase.bash.pd b/doc/3.audio.examples/I10.phase.bash.pd index 8ebb2ac7..597a4fca 100644 --- a/doc/3.audio.examples/I10.phase.bash.pd +++ b/doc/3.audio.examples/I10.phase.bash.pd @@ -1,6 +1,6 @@ -#N canvas 479 38 802 610 12; +#N canvas 479 38 802 656 12; #X declare -stdpath ./; -#X floatatom 468 299 4 0 0 0 - - - 0; +#X floatatom 468 319 4 0 0 0 - - - 0; #N canvas 293 108 791 659 fft 0; #X obj 98 224 *~; #X obj 66 224 *~; @@ -13,7 +13,6 @@ #X obj 366 217 samplerate~; #X obj 357 173 bang~; #X obj 366 242 t f b, f 6; -#X obj 163 35 loadbang; #X obj 352 66 r window-size; #X obj 352 112 block~; #X obj 366 266 osc~; @@ -43,64 +42,60 @@ #X text 409 173 control computations to do every frame; #X text 65 618 output phase-aligned frames; #X text 351 618 output a bang to start recording; -#X msg 163 61 \; window-size 1024 \; pitch 48 \; specshift 0; #X obj 66 267 sqrt~; #X text 456 205 set sample rate of the oscillator to Nyquist (here we're operating at twice the global sample rate (queried from [samplerate~]) because of the overlap-2 blocking.) Also set phase to zero at beginning of frame., f 39; #X text 465 331 When analysis starts \, set a delay to one frame minus a sample (i.e. \, just one 64-sample block before the next frame) which is synchronized with the first frame emerging from [outlet~] at left. In the parent window this is used to start recording synchronously., f 40; -#X connect 0 0 42 0; -#X connect 1 0 42 0; +#X connect 0 0 40 0; +#X connect 1 0 40 0; #X connect 2 0 4 0; #X connect 3 0 2 0; #X connect 4 0 1 0; #X connect 4 0 1 1; #X connect 4 1 0 0; #X connect 4 1 0 1; -#X connect 5 0 20 0; -#X connect 6 0 16 0; +#X connect 5 0 19 0; +#X connect 6 0 15 0; #X connect 7 0 2 1; #X connect 8 0 10 0; #X connect 9 0 8 0; -#X connect 9 0 23 0; -#X connect 10 0 14 0; -#X connect 10 1 15 0; -#X connect 11 0 41 0; -#X connect 12 0 21 0; -#X connect 14 0 5 1; -#X connect 15 0 14 1; -#X connect 16 0 18 0; -#X connect 17 0 16 1; -#X connect 19 0 20 1; -#X connect 20 0 6 0; -#X connect 21 0 13 0; +#X connect 9 0 22 0; +#X connect 10 0 13 0; +#X connect 10 1 14 0; +#X connect 11 0 20 0; +#X connect 13 0 5 1; +#X connect 14 0 13 1; +#X connect 15 0 17 0; +#X connect 16 0 15 1; +#X connect 18 0 19 1; +#X connect 19 0 6 0; +#X connect 20 0 12 0; +#X connect 21 0 23 0; #X connect 22 0 24 0; -#X connect 23 0 25 0; -#X connect 23 0 32 0; -#X connect 24 0 23 1; -#X connect 25 0 23 1; -#X connect 27 0 33 0; -#X connect 28 0 30 0; -#X connect 28 1 29 0; -#X connect 29 0 30 1; -#X connect 30 0 31 0; -#X connect 31 0 32 1; -#X connect 32 0 26 0; -#X connect 33 0 34 0; -#X connect 34 0 28 0; -#X connect 42 0 5 0; -#X restore 99 467 pd fft; -#X floatatom 641 359 3 0 120 0 - pitch-set - 0; -#X floatatom 638 302 4 0 0 0 - specshift-set - 0; -#X obj 638 325 s specshift; -#X obj 468 406 s loco; -#X obj 641 382 s pitch; -#X obj 397 495 output~; -#X floatatom 260 353 8 0 0 0 - \$0-samp-msec - 0; -#X text 258 371 sample length \, msec; -#X msg 259 255 ../sound/bell.aiff; -#X msg 265 277 ../sound/voice.wav; -#X msg 271 299 ../sound/voice2.wav; -#X text 262 233 change input sound; -#X obj 259 328 s read-sample; +#X connect 22 0 31 0; +#X connect 23 0 22 1; +#X connect 24 0 22 1; +#X connect 26 0 32 0; +#X connect 27 0 29 0; +#X connect 27 1 28 0; +#X connect 28 0 29 1; +#X connect 29 0 30 0; +#X connect 30 0 31 1; +#X connect 31 0 25 0; +#X connect 32 0 33 0; +#X connect 33 0 27 0; +#X connect 40 0 5 0; +#X restore 99 497 pd fft; +#X floatatom 639 382 5 0 120 0 - pitch-set - 0; +#X floatatom 638 322 5 0 0 0 - specshift-set - 0; +#X obj 638 349 s specshift; +#X obj 468 426 s loco; +#X obj 639 415 s pitch; +#X obj 457 522 output~; +#X floatatom 273 417 8 0 0 0 - \$0-samp-msec - 0; +#X msg 266 296 ../sound/bell.aiff; +#X msg 260 273 ../sound/voice.wav; +#X msg 275 321 ../sound/voice2.wav; +#X text 258 223 change input sound; #N canvas 331 87 488 425 test-signal 0; #X obj 50 247 line~; #X obj 50 167 f; @@ -155,7 +150,7 @@ #X connect 21 0 20 0; #X connect 24 0 5 0; #X connect 24 1 6 0; -#X restore 99 439 pd test-signal; +#X restore 99 469 pd test-signal; #N canvas 248 155 565 454 hann-window 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-hann 1024 float 0; @@ -203,72 +198,22 @@ #X connect 19 0 1 0; #X connect 19 1 4 0; #X connect 19 1 18 0; -#X restore 272 419 pd hann-window; +#X restore 80 363 pd hann-window; #X msg 79 241 512; #X msg 85 262 1024; #X msg 91 284 2048; #X obj 79 331 s window-size; #X msg 96 306 4096; -#N canvas 649 60 717 500 insample 0; -#N canvas 0 0 450 300 (subpatch) 0; -#X array \$0-sample 62079 float 2; -#X coords 0 1 62079 -1 400 150 1; -#X restore 264 29 graph; -#X obj 35 39 r read-sample; -#X obj 35 94 unpack s f; -#X obj 35 204 soundfiler; -#X text 134 399 read a sample; -#X obj 54 398 loadbang; -#X obj 35 120 t s b; -#X obj 88 125 symbol \$0-sample; -#X obj 35 155 pack s s; -#X msg 35 180 read -resize \$1 \$2; -#X obj 35 67 t a b; -#X obj 45 231 s \$0-samplength; -#X obj 132 94 s \$0-insamprate; -#X obj 35 298 /; -#X obj 35 322 * 1000; -#X obj 35 346 s \$0-samp-msec; -#X obj 53 272 r \$0-insamprate; -#X msg 54 422 \; read-sample ../sound/voice.wav; -#N canvas 0 0 450 300 (subpatch) 0; -#X array \$0-nophase 62079 float 2; -#X coords 0 1 62079 -1 400 150 1; -#X restore 263 214 graph; -#X msg 381 408 resize \$1; -#X obj 381 384 r \$0-samplength; -#X obj 381 433 s \$0-nophase; -#X obj 132 66 f 44100; -#X connect 1 0 10 0; -#X connect 2 0 6 0; -#X connect 2 1 12 0; -#X connect 3 0 11 0; -#X connect 3 0 13 0; -#X connect 5 0 17 0; -#X connect 6 0 8 0; -#X connect 6 1 7 0; -#X connect 7 0 8 1; -#X connect 8 0 9 0; -#X connect 9 0 3 0; -#X connect 10 0 2 0; -#X connect 10 1 22 0; -#X connect 13 0 14 0; -#X connect 14 0 15 0; -#X connect 16 0 13 1; -#X connect 19 0 21 0; -#X connect 20 0 19 0; -#X connect 22 0 12 0; -#X restore 272 442 pd insample; -#X text 108 372 ---analyze---; -#X text 92 391 sample; -#X obj 138 499 tabwrite~ \$0-nophase; -#X obj 99 531 output~; -#X msg 476 347 0 \, 400 4000; -#X msg 481 374 0 \, 400 10000; +#X text 108 402 ---analyze---; +#X text 92 421 sample; +#X obj 138 529 tabwrite~ \$0-nophase; +#X obj 99 561 output~; +#X msg 476 367 0 \, 400 4000; +#X msg 481 394 0 \, 400 10000; #X text 55 61 This patch takes an incoming sound \, does an overlap-2 FFT analysis of it \, and bashes the phases of the spectra so that when regenerated the components will all have zero phase at the middle of each window. You can use the windows as waveforms and cross-fade them at will without getting phase modulation. This might be useful for making synthetic instruments that mimic the spectral variation of recorded sounds., f 46; -#X text 564 339 normal speed, f 6; -#X text 574 373 slow; -#X text 509 234 ------ playback -------; +#X text 564 359 normal speed, f 6; +#X text 574 393 slow; +#X text 509 254 ------ playback -------; #N canvas 226 38 923 890 playback 0; #X obj 170 619 r invblk; #X obj 71 646 *~; @@ -489,9 +434,9 @@ #X connect 102 0 86 0; #X connect 102 1 23 1; #X connect 109 0 28 0; -#X restore 397 457 pd playback; -#X text 681 295 octave); -#X text 181 390 live; +#X restore 457 484 pd playback; +#X text 685 315 octave); +#X text 181 420 live; #X text 400 64 You can save the analyses and needn't be running the FFT patch to do the resynthesis. You can read a sample \, select window size \, and press "sample" to analyze it \, or else analyze a "live" input. You'll hear the phase-bashed sample as the analysis runs. You can regenerate the sound with specified pitch \, sample location \, and spectral shift \, using the "playback" controls., f 44; #X text 137 248 analysis; #X text 134 234 (redo; @@ -499,30 +444,87 @@ #X text 138 279 changing; #X text 138 295 window; #X text 139 309 size); -#X obj 579 512 declare -stdpath ./; -#X obj 468 322 pack f 100; -#X obj 194 410 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X obj 99 409 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; -#X text 632 265 spectral shift (hundredths of, f 14; -#X text 462 261 location in sample (hundredths of sec), f 19; -#X obj 131 20 cnv 5 5 25 empty empty Phase\ Bashing 15 13 0 16 #dfdfdf #202020 0; -#X connect 0 0 44 0; -#X connect 1 0 25 0; -#X connect 1 0 26 0; -#X connect 1 1 25 0; +#X obj 468 342 pack f 100; +#X obj 194 440 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X obj 99 439 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; +#X text 636 285 spectral shift (hundredths of, f 14; +#X text 462 281 location in sample (hundredths of sec), f 19; +#X obj 35 23 cnv 5 5 25 empty empty Phase\ Bashing 15 13 0 16 #dfdfdf #202020 0; +#N canvas 627 119 765 557 insample 0; +#N canvas 0 0 450 300 (subpatch) 0; +#X array \$0-sample 62079 float 2; +#X coords 0 1 62079 -1 400 150 1; +#X restore 325 124 graph; +#X obj 96 230 soundfiler; +#X obj 149 151 symbol \$0-sample; +#X obj 96 181 pack s s; +#X msg 96 206 read -resize \$1 \$2; +#X obj 95 396 s \$0-samplength; +#X obj 117 305 /; +#X obj 117 329 * 1000; +#X obj 117 353 s \$0-samp-msec; +#N canvas 0 0 450 300 (subpatch) 0; +#X array \$0-nophase 62079 float 2; +#X coords 0 1 62079 -1 400 150 1; +#X restore 324 309 graph; +#X msg 96 450 resize \$1; +#X obj 96 426 r \$0-samplength; +#X obj 96 475 s \$0-nophase; +#X msg 163 257 \$1; +#X obj 163 296 s \$0-insamprate; +#X obj 96 146 t a b; +#X obj 29 36 inlet; +#X obj 29 80 route bang; +#X obj 28 115 openpanel; +#X connect 1 0 5 0; +#X connect 1 0 6 0; +#X connect 1 1 13 0; +#X connect 2 0 3 1; +#X connect 3 0 4 0; +#X connect 4 0 1 0; +#X connect 6 0 7 0; +#X connect 7 0 8 0; +#X connect 10 0 12 0; +#X connect 11 0 10 0; +#X connect 13 0 6 1; +#X connect 13 0 14 0; +#X connect 15 0 3 0; +#X connect 15 1 2 0; +#X connect 16 0 17 0; +#X connect 17 0 18 0; +#X connect 17 1 15 0; +#X connect 18 0 15 0; +#X restore 259 380 pd insample; +#X obj 260 247 loadbang; +#X obj 287 350 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 311 351 choose sample; +#X text 249 443 sample length (ms); +#N canvas 900 402 450 300 init 0; +#X obj 141 231 declare -stdpath ./; +#X obj 121 103 loadbang; +#X msg 121 129 \; window-size 1024 \; pitch 48 \; specshift 0; +#X text 85 36 This subpatch initializes the patch., f 27; +#X connect 1 0 2 0; +#X restore 654 537 pd init; +#X connect 0 0 40 0; +#X connect 1 0 22 0; +#X connect 1 0 23 0; +#X connect 1 1 22 0; #X connect 2 0 6 0; #X connect 3 0 4 0; -#X connect 10 0 14 0; -#X connect 11 0 14 0; -#X connect 12 0 14 0; -#X connect 15 0 1 0; -#X connect 17 0 20 0; -#X connect 18 0 20 0; -#X connect 19 0 20 0; -#X connect 21 0 20 0; -#X connect 27 0 5 0; -#X connect 28 0 5 0; -#X connect 33 0 7 0; -#X connect 44 0 5 0; -#X connect 45 0 15 1; -#X connect 46 0 15 0; +#X connect 9 0 46 0; +#X connect 10 0 46 0; +#X connect 11 0 46 0; +#X connect 13 0 1 0; +#X connect 15 0 18 0; +#X connect 16 0 18 0; +#X connect 17 0 18 0; +#X connect 19 0 18 0; +#X connect 24 0 5 0; +#X connect 25 0 5 0; +#X connect 30 0 7 0; +#X connect 40 0 5 0; +#X connect 41 0 13 1; +#X connect 42 0 13 0; +#X connect 47 0 10 0; +#X connect 48 0 46 0; diff --git a/doc/3.audio.examples/J02.trapezoids.pd b/doc/3.audio.examples/J02.trapezoids.pd index 1603b690..491003e1 100644 --- a/doc/3.audio.examples/J02.trapezoids.pd +++ b/doc/3.audio.examples/J02.trapezoids.pd @@ -1,76 +1,82 @@ -#N canvas 553 38 697 713 12; +#N canvas 519 48 697 713 12; #X declare -stdpath ./; -#X obj 125 195 wrap~; -#X obj 125 224 -~ 0.5; +#X obj 168 337 wrap~; +#X obj 168 366 -~ 0.5; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-sum 882 float 0; #X coords 0 1.02 881 -1.02 200 130 1; -#X restore 407 321 graph; -#X text 422 461 ---- 0.02 seconds ----; -#X obj 181 471 output~; -#X obj 231 434 tabwrite~ \$0-sum; -#X obj 125 167 -~; -#X obj 143 118 / 100; -#X floatatom 143 92 4 -100 100 0 - - - 0; -#X obj 143 281 / 100; -#X floatatom 143 255 4 -100 100 0 - - - 0; -#X obj 125 308 *~; -#X obj 197 195 wrap~; -#X obj 197 224 -~ 0.5; -#X obj 197 167 -~; -#X obj 215 119 / 100; -#X floatatom 215 93 4 -100 100 0 - - - 0; -#X obj 215 281 / 100; -#X floatatom 215 255 4 -100 100 0 - - - 0; -#X obj 197 309 *~; -#X obj 268 195 wrap~; -#X obj 268 224 -~ 0.5; -#X obj 268 167 -~; -#X obj 286 120 / 100; -#X floatatom 286 94 4 -100 100 0 - - - 0; -#X obj 286 281 / 100; -#X floatatom 286 255 4 -100 100 0 - - - 0; -#X obj 268 310 *~; -#X text 148 66 -- PHASES (percent) --; -#X text 323 255 AMPLITUDES (percent); -#X obj 179 345 +~; -#X obj 180 371 +~; -#X obj 231 371 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 37 113 phasor~ 88.2; -#X obj 231 398 metro 193; -#X text 84 621 If the amplitudes sum to zero (with negative ones to balance positive ones) \, the slope of each linear segment becomes zero. Otherwise \, the segments have just enough slope to make up for the three jumps and get to the same starting value after each cycle., f 70; -#X text 84 569 Here we combine three sawtooth waves with controllable relative phases and amplitudes (in percent \, between -100 and 100.) Each sawtooth wave gives rise to one jump (upward or downward) per cycle., f 70; -#X obj 426 163 declare -stdpath ./; +#X restore 412 484 graph; +#X text 427 624 ---- 0.02 seconds ----; +#X obj 220 623 output~; +#X obj 270 586 tabwrite~ \$0-sum; +#X obj 168 309 -~; +#X obj 186 260 / 100; +#X floatatom 186 234 4 -100 100 0 - - - 0; +#X obj 192 423 / 100; +#X floatatom 192 396 4 -100 100 0 - amp - 0; +#X obj 237 337 wrap~; +#X obj 237 366 -~ 0.5; +#X obj 237 309 -~; +#X obj 255 261 / 100; +#X floatatom 255 235 4 -100 100 0 - - - 0; +#X obj 262 423 / 100; +#X floatatom 262 397 4 -100 100 0 - - - 0; +#X obj 308 337 wrap~; +#X obj 308 366 -~ 0.5; +#X obj 308 309 -~; +#X obj 326 262 / 100; +#X floatatom 326 236 4 -100 100 0 - - - 0; +#X obj 333 423 / 100; +#X floatatom 333 397 4 -100 100 0 - - - 0; +#X text 188 208 -- PHASES (percent) --; +#X text 370 397 AMPLITUDES (percent); +#X obj 219 487 +~; +#X obj 219 523 +~; +#X obj 270 523 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 80 255 phasor~ 88.2; +#X obj 270 550 metro 193; +#X text 68 119 If the amplitudes sum to zero (with negative ones to balance positive ones) \, the slope of each linear segment becomes zero. Otherwise \, the segments have just enough slope to make up for the three jumps and get to the same starting value after each cycle., f 70; +#X text 68 67 Here we combine three sawtooth waves with controllable relative phases and amplitudes (in percent \, between -100 and 100.) Each sawtooth wave gives rise to one jump (upward or downward) per cycle., f 70; #X obj 43 19 cnv 5 5 25 empty empty Making\ Trapezoidal\ Waves\ from\ Sawtooth\ Waves 15 13 0 16 #dfdfdf #202020 0; +#X obj 237 451 *~ 0; +#X obj 308 453 *~ 0; +#X obj 168 450 *~ 0; +#N canvas 940 269 326 281 init 0; +#X obj 104 208 declare -stdpath ./; +#X obj 113 124 loadbang; +#X text 71 41 this subpatch initializes the patch and loads values in number boxes., f 29; +#X msg 113 154 \; amp 100; +#X connect 1 0 3 0; +#X restore 464 287 pd init; #X connect 0 0 1 0; -#X connect 1 0 11 0; +#X connect 1 0 37 0; #X connect 6 0 0 0; #X connect 7 0 6 1; #X connect 8 0 7 0; -#X connect 9 0 11 1; +#X connect 9 0 37 1; #X connect 10 0 9 0; -#X connect 11 0 30 0; -#X connect 12 0 13 0; -#X connect 13 0 19 0; -#X connect 14 0 12 0; -#X connect 15 0 14 1; -#X connect 16 0 15 0; -#X connect 17 0 19 1; -#X connect 18 0 17 0; -#X connect 19 0 30 1; -#X connect 20 0 21 0; -#X connect 21 0 27 0; -#X connect 22 0 20 0; -#X connect 23 0 22 1; +#X connect 11 0 12 0; +#X connect 12 0 35 0; +#X connect 13 0 11 0; +#X connect 14 0 13 1; +#X connect 15 0 14 0; +#X connect 16 0 35 1; +#X connect 17 0 16 0; +#X connect 18 0 19 0; +#X connect 19 0 36 0; +#X connect 20 0 18 0; +#X connect 21 0 20 1; +#X connect 22 0 21 0; +#X connect 23 0 36 1; #X connect 24 0 23 0; -#X connect 25 0 27 1; -#X connect 26 0 25 0; -#X connect 27 0 31 1; -#X connect 30 0 31 0; +#X connect 27 0 28 0; +#X connect 28 0 5 0; +#X connect 28 0 4 0; +#X connect 29 0 31 0; +#X connect 30 0 6 0; +#X connect 30 0 13 0; +#X connect 30 0 20 0; #X connect 31 0 5 0; -#X connect 31 0 4 0; -#X connect 32 0 34 0; -#X connect 33 0 6 0; -#X connect 33 0 14 0; -#X connect 33 0 22 0; -#X connect 34 0 5 0; +#X connect 35 0 27 1; +#X connect 36 0 28 1; +#X connect 37 0 27 0; diff --git a/doc/3.audio.examples/J03.pulse.width.mod.pd b/doc/3.audio.examples/J03.pulse.width.mod.pd index 1271ed84..d7209d81 100644 --- a/doc/3.audio.examples/J03.pulse.width.mod.pd +++ b/doc/3.audio.examples/J03.pulse.width.mod.pd @@ -1,34 +1,36 @@ -#N canvas 371 70 676 543 12; +#N canvas 371 70 681 562 12; #X declare -stdpath ./; -#X floatatom 129 87 5 0 0 0 - - - 0; +#X floatatom 130 134 5 0 0 0 - - - 0; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-difference 882 float 0; #X coords 0 1.02 881 -1.02 200 130 1; #X restore 448 351 graph; -#X text 51 87 frequency; +#X text 52 134 frequency; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-phasor1 882 float 0; #X coords 0 1.02 882 -1.02 200 130 1; #X restore 447 32 graph; -#X obj 129 117 + 0.2; -#X obj 111 200 -~; +#X obj 130 164 + 0.2; +#X obj 112 247 -~; #N canvas 0 0 450 300 (subpatch) 0; #X array \$0-phasor2 882 float 0; #X coords 0 1.02 882 -1.02 200 130 1; #X restore 448 191 graph; #X text 468 492 ---- 0.02 seconds ----; -#X obj 111 283 output~; -#X obj 208 187 tabwrite~ \$0-phasor1; -#X obj 196 221 tabwrite~ \$0-phasor2; -#X obj 182 253 tabwrite~ \$0-difference; -#X obj 55 141 phasor~; -#X obj 196 120 metro 193; -#X obj 196 93 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 253 310 declare -stdpath ./; -#X obj 129 141 phasor~; -#X text 220 92 <-- start/stop graphing; -#X text 65 391 This patch demonstrates pulse width modulation \, which is accomplished simply by subtracting two sawtooth waves at a varying phase difference. Here their frequencies are set to differ by 1/5 Hz so that the relative phase wanders continuously., f 47; +#X obj 112 330 output~; +#X obj 209 234 tabwrite~ \$0-phasor1; +#X obj 197 268 tabwrite~ \$0-phasor2; +#X obj 183 300 tabwrite~ \$0-difference; +#X obj 56 188 phasor~; +#X obj 197 167 metro 193; +#X obj 197 140 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; +#X obj 254 357 declare -stdpath ./; +#X obj 130 188 phasor~; +#X text 221 139 <-- start/stop graphing; +#X text 66 418 This patch demonstrates pulse width modulation \, which is accomplished simply by subtracting two sawtooth waves at a varying phase difference. Here their frequencies are set to differ by 1/5 Hz so that the relative phase wanders continuously., f 47; #X obj 46 26 cnv 5 5 25 empty empty Classical\ Pulse\ Width\ Modulation 15 13 0 16 #dfdfdf #202020 0; +#X obj 130 83 loadbang; +#X msg 130 108 50; #X connect 0 0 4 0; #X connect 0 0 12 0; #X connect 4 0 16 0; @@ -42,3 +44,5 @@ #X connect 14 0 13 0; #X connect 16 0 5 1; #X connect 16 0 10 0; +#X connect 20 0 21 0; +#X connect 21 0 0 0; diff --git a/doc/3.audio.examples/J04.corners.pd b/doc/3.audio.examples/J04.corners.pd index eb60f33a..c80ddcd4 100644 --- a/doc/3.audio.examples/J04.corners.pd +++ b/doc/3.audio.examples/J04.corners.pd @@ -3,10 +3,9 @@ #X obj 136 187 wrap~; #X obj 136 214 -~ 0.5; #N canvas 0 0 450 300 (subpatch) 0; -#X array \$0-sum 882 float 0; -#X coords 0 0.25 881 -0.25 200 130 1; +#X array \$0-sum 441 float 0; +#X coords 0 0.25 440 -0.25 200 130 1; #X restore 447 131 graph; -#X text 446 269 ---- 0.02 seconds ----; #X obj 293 510 output~; #X obj 339 480 tabwrite~ \$0-sum; #X obj 136 161 -~; @@ -34,9 +33,8 @@ #X obj 136 406 +~; #X obj 293 444 +~; #X obj 339 415 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 339 448 metro 193; #X obj 81 119 phasor~; -#X floatatom 81 98 5 0 0 0 - - - 0; +#X floatatom 81 98 5 0 0 0 - freq - 0; #X text 61 75 frequency; #X obj 136 239 *~; #X obj 223 239 *~; @@ -50,53 +48,61 @@ #X text 46 579 Here we combine three parabolic waves (in the same way as \, two patches ago \, we combined sawtooth waves). The parabolic wave is obtained from the sawtooth wave (assuming it runs from -0.5 to 0.5) by the formula: y=x*x/2 - 1/12. This is normalized so that the corner has a slope change of minus one unit per cycle \, and adjusted to remove any DC component., f 87; #X text 407 128 0.25; #X text 398 245 -0.25; -#X obj 500 70 declare -stdpath ./; #X text 46 655 In general \, the segments of the result will be curved \, but if the three magnitudes sum algebraically to zero \, the segments will be linear. Note the reduced scale of the graph (from -0.25 to 0.25) compared to the previous examples., f 87; -#X floatatom 154 321 5 -100 100 0 - - - 0; +#X floatatom 154 321 5 -100 100 0 - amp - 0; #X floatatom 241 321 5 -100 100 0 - - - 0; #X obj 40 17 cnv 5 5 25 empty empty Making\ Waveforms\ With\ Corners\ Using\ Parabloic\ Waveforms 15 13 0 16 #dfdfdf #202020 0; +#X obj 339 448 metro 100; +#X text 472 270 ---- 0.01 seconds ----; +#N canvas 940 269 326 281 init 0; +#X obj 104 221 declare -stdpath ./; +#X text 71 41 this subpatch initializes the patch and loads values in number boxes., f 29; +#X obj 113 110 loadbang; +#X msg 113 140 \; freq 440 \; amp 100; +#X connect 2 0 3 0; +#X restore 491 431 pd init; #X connect 0 0 1 0; -#X connect 1 0 35 0; -#X connect 1 0 35 1; -#X connect 6 0 0 0; -#X connect 7 0 6 1; -#X connect 8 0 7 0; -#X connect 9 0 10 1; -#X connect 10 0 28 0; -#X connect 11 0 12 0; -#X connect 12 0 36 0; -#X connect 12 0 36 1; -#X connect 13 0 11 0; -#X connect 14 0 13 1; -#X connect 15 0 14 0; -#X connect 16 0 17 1; -#X connect 17 0 28 1; -#X connect 18 0 19 0; -#X connect 19 0 37 0; -#X connect 19 0 37 1; -#X connect 20 0 18 0; -#X connect 21 0 20 1; -#X connect 22 0 21 0; -#X connect 23 0 25 1; -#X connect 24 0 23 0; -#X connect 25 0 29 1; -#X connect 28 0 29 0; -#X connect 29 0 5 0; -#X connect 29 0 4 0; -#X connect 30 0 31 0; -#X connect 31 0 5 0; -#X connect 32 0 6 0; -#X connect 32 0 13 0; -#X connect 32 0 20 0; -#X connect 33 0 32 0; -#X connect 35 0 38 0; -#X connect 36 0 40 0; -#X connect 37 0 41 0; -#X connect 38 0 39 0; -#X connect 39 0 10 0; -#X connect 40 0 42 0; -#X connect 41 0 43 0; -#X connect 42 0 17 0; -#X connect 43 0 25 0; -#X connect 49 0 9 0; -#X connect 50 0 16 0; +#X connect 1 0 33 0; +#X connect 1 0 33 1; +#X connect 5 0 0 0; +#X connect 6 0 5 1; +#X connect 7 0 6 0; +#X connect 8 0 9 1; +#X connect 9 0 27 0; +#X connect 10 0 11 0; +#X connect 11 0 34 0; +#X connect 11 0 34 1; +#X connect 12 0 10 0; +#X connect 13 0 12 1; +#X connect 14 0 13 0; +#X connect 15 0 16 1; +#X connect 16 0 27 1; +#X connect 17 0 18 0; +#X connect 18 0 35 0; +#X connect 18 0 35 1; +#X connect 19 0 17 0; +#X connect 20 0 19 1; +#X connect 21 0 20 0; +#X connect 22 0 24 1; +#X connect 23 0 22 0; +#X connect 24 0 28 1; +#X connect 27 0 28 0; +#X connect 28 0 4 0; +#X connect 28 0 3 0; +#X connect 29 0 49 0; +#X connect 30 0 5 0; +#X connect 30 0 12 0; +#X connect 30 0 19 0; +#X connect 31 0 30 0; +#X connect 33 0 36 0; +#X connect 34 0 38 0; +#X connect 35 0 39 0; +#X connect 36 0 37 0; +#X connect 37 0 9 0; +#X connect 38 0 40 0; +#X connect 39 0 41 0; +#X connect 40 0 16 0; +#X connect 41 0 24 0; +#X connect 46 0 8 0; +#X connect 47 0 15 0; +#X connect 49 0 4 0; diff --git a/doc/3.audio.examples/J05.triangle.pd b/doc/3.audio.examples/J05.triangle.pd index f5f5e7f2..47cf0a84 100644 --- a/doc/3.audio.examples/J05.triangle.pd +++ b/doc/3.audio.examples/J05.triangle.pd @@ -1,20 +1,19 @@ -#N canvas 507 44 636 663 12; +#N canvas 544 64 636 663 12; #X declare -stdpath ./; #N canvas 0 0 450 300 (subpatch) 0; -#X array \$0-sum 882 float 0; -#X coords 0 0.5 881 -0.5 200 130 1; +#X array \$0-sum 441 float 0; +#X coords 0 0.5 440 -0.5 200 130 1; #X restore 344 144 graph; #X text 365 282 ---- 0.02 seconds ----; #X obj 162 392 output~; #X obj 226 353 tabwrite~ \$0-sum; #X obj 180 153 / 100; -#X floatatom 180 128 4 0 100 0 - - - 0; +#X floatatom 180 128 4 0 100 0 - up - 0; #X obj 230 153 / 100; -#X floatatom 230 128 4 0 100 0 - - - 0; +#X floatatom 230 128 4 0 100 0 - down - 0; #X obj 226 292 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; -#X obj 226 318 metro 193; #X obj 103 147 phasor~; -#X floatatom 103 120 5 0 0 0 - - - 0; +#X floatatom 103 120 5 0 0 0 - freq - 0; #X text 74 95 frequency; #X text 167 87 SLOPES (percent); #X obj 162 183 *~; @@ -26,21 +25,28 @@ #X text 307 262 -0.5; #X text 183 108 up; #X text 230 108 down; -#X obj 334 426 declare -stdpath ./; #X text 90 481 Occasionally a second method for making corners is more convenient. Here we specify the slopes of the rising and falling segments (as always \, in units per cycle). We then make a triangle wave with a corner at (0 \, 0) and another one \, placed somewhere within the cycle. The slopes of the two lines determine the second point \, which will have an x value of t/(s+t) (if we let 's' denote the rising slope and 't' the falling one \, both as positive numbers). The y value is st/(s+t). If we wish instead to specify the corner location (x \, y) (with x in cycles \, 0 Date: Tue, 23 Jul 2024 18:04:17 -0300 Subject: [PATCH 47/89] rename introduction to 'about' and move it out of the manual --- doc/{1.manual/1.introduction.txt => 0.about.txt} | 0 doc/Makefile.am | 6 +++--- src/makefile.gnu | 6 +++--- src/makefile.mac | 7 ++++--- src/makefile.mingw | 7 ++++--- tcl/pd_menucommands.tcl | 2 +- 6 files changed, 15 insertions(+), 13 deletions(-) rename doc/{1.manual/1.introduction.txt => 0.about.txt} (100%) diff --git a/doc/1.manual/1.introduction.txt b/doc/0.about.txt similarity index 100% rename from doc/1.manual/1.introduction.txt rename to doc/0.about.txt diff --git a/doc/Makefile.am b/doc/Makefile.am index 93cd3b2b..b38e0160 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -8,12 +8,12 @@ AUTOMAKE_OPTIONS = foreign libpddir = $(pkglibdir)/doc # about text file, needed to write version string into -ABOUT_FILE=1.manual/1.introduction.txt +ABOUT_FILE=0.about.txt # location to pd header M_PD=$(top_srcdir)/src/m_pd.h -# get version info from m_pd.h to use in doc/1.manual/1.introduction.txt +# get version info from m_pd.h to use in doc/0.about.txt PD_MAJOR_VERSION = $(shell grep "^\s*\#\s*define\s*PD_MAJOR_VERSION\>" $(M_PD) | \ sed 's|^.define *PD_MAJOR_VERSION *\([0-9]*\).*|\1|' ) PD_MINOR_VERSION = $(shell grep "^\s*\#\s*define\s*PD_MINOR_VERSION\>" $(M_PD) | \ @@ -53,7 +53,7 @@ empty= # cd doc # find . -type f -not -path "./Makefile*" | sort | awk '{print " ", $1, "\\"}'; echo ' $(empty)' nobase_dist_libpd_DATA = \ - ./1.manual/1.introduction.txt \ + ./0.about.txt \ ./1.manual/resources/favicon.ico \ ./1.manual/resources/pdmanual.css \ ./1.manual/resources/icon.png \ diff --git a/src/makefile.gnu b/src/makefile.gnu index a4fc4889..f7825425 100644 --- a/src/makefile.gnu +++ b/src/makefile.gnu @@ -133,7 +133,7 @@ SRC = g_canvas.c g_graph.c g_text.c g_rtext.c g_array.c g_template.c g_io.c \ OBJ = $(SRC:.c=.o) -# get version from m_pd.h to use in doc/1.manual/1.introduction.txt +# get version from m_pd.h to use in doc/0.about.txt PD_MAJOR_VERSION := $(shell grep "^\s*\#\s*define\s*PD_MAJOR_VERSION\>" m_pd.h | \ sed 's|^.define *PD_MAJOR_VERSION *\([0-9]*\).*|\1|' ) PD_MINOR_VERSION := $(shell grep "^\s*\#\s*define\s*PD_MINOR_VERSION\>" m_pd.h | \ @@ -195,7 +195,7 @@ externs: BINARYMODE=-m755 -ABOUT_FILE=$(DESTDIR)$(pddocdir)/1.manual/1.introduction.txt +ABOUT_FILE=$(DESTDIR)$(pddocdir)/0.about.txt install: all install -d $(DESTDIR)$(libpdbindir) install $(BIN_DIR)/pd-watchdog $(DESTDIR)$(libpdbindir)/pd-watchdog @@ -206,7 +206,7 @@ install: all install -m755 $(BIN_DIR)/pdreceive $(DESTDIR)$(bindir)/pdreceive install -d $(DESTDIR)$(libpdtcldir) install ../tcl/* $(DESTDIR)$(libpdtcldir) - for dir in $(shell ls -1 ../doc | grep -v CVS); do \ + for dir in $(shell ls -1 ../doc | grep -v CVS | grep -v 0.about.txt); do \ echo "installing $$dir"; \ install -d $(DESTDIR)$(pddocdir)/$$dir ; \ install -m644 -p ../doc/$$dir/*.* $(DESTDIR)$(pddocdir)/$$dir ; \ diff --git a/src/makefile.mac b/src/makefile.mac index c8b0f77e..c95ffe9b 100644 --- a/src/makefile.mac +++ b/src/makefile.mac @@ -108,7 +108,7 @@ SRC = g_canvas.c g_graph.c g_text.c g_rtext.c g_array.c g_template.c g_io.c \ OBJ = $(SRC:.c=.o) -# get version from m_pd.h to use in doc/1.manual/1.introduction.txt +# get version from m_pd.h to use in doc/0.about.txt PD_MAJOR_VERSION := $(shell grep "^\s*\#\s*define\s*PD_MAJOR_VERSION\>" m_pd.h | \ sed 's|^.define *PD_MAJOR_VERSION *\([0-9]*\).*|\1|' ) PD_MINOR_VERSION := $(shell grep "^\s*\#\s*define\s*PD_MINOR_VERSION\>" m_pd.h | \ @@ -176,7 +176,7 @@ externs: BINARYMODE=-m755 -ABOUT_FILE=$(DESTDIR)$(pddocdir)/1.manual/1.introduction.txt +ABOUT_FILE=$(DESTDIR)$(pddocdir)/0.about.txt install: all install -d $(DESTDIR)$(libpdbindir) -install $(BIN_DIR)/$(GUINAME) $(DESTDIR)$(libpdbindir)/$(GUINAME) @@ -187,7 +187,7 @@ install: all install -m755 $(BIN_DIR)/pdreceive $(DESTDIR)$(bindir)/pdreceive install -d $(DESTDIR)$(libpdtcldir) install ../tcl/* $(DESTDIR)$(libpdtcldir) - for dir in $(shell ls -1 ../doc | grep -v CVS); do \ + for dir in $(shell ls -1 ../doc | grep -v CVS | grep -v 0.about.txt); do \ echo "installing $$dir"; \ install -d $(DESTDIR)$(pddocdir)/$$dir ; \ install -m644 -p ../doc/$$dir/*.* $(DESTDIR)$(pddocdir)/$$dir ; \ @@ -198,6 +198,7 @@ install: all install -m644 -p ../doc/7.stuff/$$dir/*.* \ $(DESTDIR)$(pddocdir)/7.stuff/$$dir ; \ done + install -p ../doc/0.about.txt $(ABOUT_FILE) mv $(ABOUT_FILE) $(ABOUT_FILE).tmp cat $(ABOUT_FILE).tmp | sed 's|PD_VERSION|Pd version $(PD_VERSION)|' \ > $(ABOUT_FILE) diff --git a/src/makefile.mingw b/src/makefile.mingw index 93b9363f..c3dfae0c 100644 --- a/src/makefile.mingw +++ b/src/makefile.mingw @@ -147,7 +147,7 @@ ASIOOBJ = $(ASIOSRC:.cpp=.o) OBJC = $(OBJ) $(PAOBJ) $(ASIOOBJ) $(PMOBJ) -# get version from m_pd.h to use in doc/1.manual/1.introduction.txt +# get version from m_pd.h to use in doc/0.about.txt PD_MAJOR_VERSION := $(shell grep "^\s*\#\s*define\s*PD_MAJOR_VERSION\>" m_pd.h | \ sed 's|^.define *PD_MAJOR_VERSION *\([0-9]*\).*|\1|' ) PD_MINOR_VERSION := $(shell grep "^\s*\#\s*define\s*PD_MINOR_VERSION\>" m_pd.h | \ @@ -240,7 +240,7 @@ testbin: $(PDEXEC) $(PDDLL) $(PDCOM) install -p $(PDCOM) $(BIN_DIR) install -p $(PDEXEC) $(BIN_DIR) -ABOUT_FILE=$(DESTDIR)$(pddocdir)/1.manual/1.introduction.txt +ABOUT_FILE=$(DESTDIR)$(pddocdir)/0.about.txt install: all # locales # make libpddir=$(libpddir) -C ../po install @@ -255,7 +255,7 @@ install: all install -p ../tcl/pd.ico $(DESTDIR)$(bindir)/pd.ico install -p $(PDSEND) $(DESTDIR)$(bindir)/$(PDSEND) install -p $(PDRECEIVE) $(DESTDIR)$(bindir)/$(PDRECEIVE) - for dir in $(shell ls -1 ../doc | grep -v CVS); do \ + for dir in $(shell ls -1 ../doc | grep -v CVS | grep -v 0.about.txt); do \ echo "installing $$dir"; \ install -d $(DESTDIR)$(pddocdir)/$$dir ; \ install -p ../doc/$$dir/*.* $(DESTDIR)$(pddocdir)/$$dir ; \ @@ -265,6 +265,7 @@ install: all install -d $(DESTDIR)$(pddocdir)/7.stuff/$$dir ; \ install -p ../doc/7.stuff/$$dir/*.* $(DESTDIR)$(pddocdir)/7.stuff/$$dir ; \ done + install -p ../doc/0.about.txt $(ABOUT_FILE) mv $(ABOUT_FILE) $(ABOUT_FILE).tmp cat $(ABOUT_FILE).tmp | sed 's|PD_VERSION|Pd version $(PD_VERSION)|' \ > $(ABOUT_FILE) diff --git a/tcl/pd_menucommands.tcl b/tcl/pd_menucommands.tcl index 954986f9..ab1225ad 100644 --- a/tcl/pd_menucommands.tcl +++ b/tcl/pd_menucommands.tcl @@ -235,7 +235,7 @@ proc ::pd_menucommands::set_filenewdir {mytoplevel} { # parse the textfile for the About Pd page proc ::pd_menucommands::menu_aboutpd {} { set versionstring "Pd $::PD_MAJOR_VERSION.$::PD_MINOR_VERSION.$::PD_BUGFIX_VERSION$::PD_TEST_VERSION" - set filename "$::sys_libdir/doc/1.manual/1.introduction.txt" + set filename "$::sys_libdir/doc/0.about.txt" if {![file exists $filename]} { ::pdwindow::error [_ "ignoring '%s': doesn't exist" $filename] ::pdwindow::error "\n" From 1af8a4cc9b6055c5253c23559ee245fc255634b5 Mon Sep 17 00:00:00 2001 From: porres Date: Tue, 23 Jul 2024 18:34:28 -0300 Subject: [PATCH 48/89] move '0.about.txt' to 'tcl' folder This partially closes https://github.com/pure-data/pddp/issues/215 The previous commit just takes '1.introduction.txt' out of the manual folder and renames it to "about" This commit hides it in the tcl tk folder, where I think it belongs as discussed in the issue --- doc/Makefile.am | 32 -------------------------------- src/makefile.gnu | 23 ++--------------------- src/makefile.mac | 24 ++---------------------- src/makefile.mingw | 24 +----------------------- tcl/Makefile.am | 1 + doc/0.about.txt => tcl/about.txt | 0 tcl/pd_menucommands.tcl | 2 +- 7 files changed, 7 insertions(+), 99 deletions(-) rename doc/0.about.txt => tcl/about.txt (100%) diff --git a/doc/Makefile.am b/doc/Makefile.am index b38e0160..6d815a77 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -7,40 +7,9 @@ AUTOMAKE_OPTIONS = foreign # but we want $(prefix)/lib/pd/doc libpddir = $(pkglibdir)/doc -# about text file, needed to write version string into -ABOUT_FILE=0.about.txt - # location to pd header M_PD=$(top_srcdir)/src/m_pd.h -# get version info from m_pd.h to use in doc/0.about.txt -PD_MAJOR_VERSION = $(shell grep "^\s*\#\s*define\s*PD_MAJOR_VERSION\>" $(M_PD) | \ - sed 's|^.define *PD_MAJOR_VERSION *\([0-9]*\).*|\1|' ) -PD_MINOR_VERSION = $(shell grep "^\s*\#\s*define\s*PD_MINOR_VERSION\>" $(M_PD) | \ - sed 's|^.define *PD_MINOR_VERSION *\([0-9]*\).*|\1|' ) -PD_BUGFIX_VERSION = $(shell grep "^\s*\#\s*define\s*PD_BUGFIX_VERSION\>" $(M_PD) | \ - sed 's|^.define *PD_BUGFIX_VERSION *\([0-9]*\).*|\1|' ) -PD_TEST_VERSION = $(shell grep "^\s*\#\s*define\s*PD_TEST_VERSION\>" $(M_PD) | \ - sed 's|^.define *PD_TEST_VERSION *"\(.*\)".*|\1|' ) -PD_VERSION = $(PD_MAJOR_VERSION).$(PD_MINOR_VERSION).$(PD_BUGFIX_VERSION) - -######################################### -##### Targets ##### - -# build version string & write into about file during install -install-data-hook: - mv $(DESTDIR)$(libpddir)/$(ABOUT_FILE) $(DESTDIR)$(libpddir)/$(ABOUT_FILE).tmp - if test "x${PD_TEST_VERSION}" == "x" ; then \ - cat $(DESTDIR)$(libpddir)/$(ABOUT_FILE).tmp | \ - sed 's|PD_VERSION|Pd version $(VERSION)|' \ - > $(DESTDIR)$(libpddir)/$(ABOUT_FILE) ; \ - else \ - cat $(DESTDIR)$(libpddir)/$(ABOUT_FILE).tmp | \ - sed 's|PD_VERSION|Pd version $(VERSION)-$(PD_TEST_VERSION)|' \ - > $(DESTDIR)$(libpddir)/$(ABOUT_FILE) ; \ - fi - rm $(DESTDIR)$(libpddir)/$(ABOUT_FILE).tmp - ######################################### ##### Files, Binaries, & Libs ##### @@ -53,7 +22,6 @@ empty= # cd doc # find . -type f -not -path "./Makefile*" | sort | awk '{print " ", $1, "\\"}'; echo ' $(empty)' nobase_dist_libpd_DATA = \ - ./0.about.txt \ ./1.manual/resources/favicon.ico \ ./1.manual/resources/pdmanual.css \ ./1.manual/resources/icon.png \ diff --git a/src/makefile.gnu b/src/makefile.gnu index f7825425..8f28410a 100644 --- a/src/makefile.gnu +++ b/src/makefile.gnu @@ -131,21 +131,7 @@ SRC = g_canvas.c g_graph.c g_text.c g_rtext.c g_array.c g_template.c g_io.c \ x_file.c x_scalar.c x_vexp.c x_vexp_if.c x_vexp_fun.c \ $(SYSSRC) -OBJ = $(SRC:.c=.o) - -# get version from m_pd.h to use in doc/0.about.txt -PD_MAJOR_VERSION := $(shell grep "^\s*\#\s*define\s*PD_MAJOR_VERSION\>" m_pd.h | \ - sed 's|^.define *PD_MAJOR_VERSION *\([0-9]*\).*|\1|' ) -PD_MINOR_VERSION := $(shell grep "^\s*\#\s*define\s*PD_MINOR_VERSION\>" m_pd.h | \ - sed 's|^.define *PD_MINOR_VERSION *\([0-9]*\).*|\1|' ) -PD_BUGFIX_VERSION := $(shell grep "^\s*\#\s*define\s*PD_BUGFIX_VERSION\>" m_pd.h | \ - sed 's|^.define *PD_BUGFIX_VERSION *\([0-9]*\).*|\1|' ) -PD_TEST_VERSION := $(shell grep "^\s*\#\s*define\s*PD_TEST_VERSION\>" m_pd.h | \ - sed 's|^.define *PD_TEST_VERSION *"\(.*\)".*|\1|' ) -PD_VERSION := $(PD_MAJOR_VERSION).$(PD_MINOR_VERSION).$(PD_BUGFIX_VERSION) -ifneq ($(PD_TEST_VERSION),) - PD_VERSION := $(PD_VERSION)-$(PD_TEST_VERSION) -endif +OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ @@ -195,7 +181,6 @@ externs: BINARYMODE=-m755 -ABOUT_FILE=$(DESTDIR)$(pddocdir)/0.about.txt install: all install -d $(DESTDIR)$(libpdbindir) install $(BIN_DIR)/pd-watchdog $(DESTDIR)$(libpdbindir)/pd-watchdog @@ -206,7 +191,7 @@ install: all install -m755 $(BIN_DIR)/pdreceive $(DESTDIR)$(bindir)/pdreceive install -d $(DESTDIR)$(libpdtcldir) install ../tcl/* $(DESTDIR)$(libpdtcldir) - for dir in $(shell ls -1 ../doc | grep -v CVS | grep -v 0.about.txt); do \ + for dir in $(shell ls -1 ../doc | grep -v CVS); do \ echo "installing $$dir"; \ install -d $(DESTDIR)$(pddocdir)/$$dir ; \ install -m644 -p ../doc/$$dir/*.* $(DESTDIR)$(pddocdir)/$$dir ; \ @@ -217,10 +202,6 @@ install: all install -m644 -p ../doc/7.stuff/$$dir/*.* \ $(DESTDIR)$(pddocdir)/7.stuff/$$dir ; \ done - mv $(ABOUT_FILE) $(ABOUT_FILE).tmp - cat $(ABOUT_FILE).tmp | sed 's|PD_VERSION|Pd version $(PD_VERSION)|' \ - > $(ABOUT_FILE) - rm $(ABOUT_FILE).tmp cp -pr ../extra $(DESTDIR)$(libpddir)/ rm -f $(DESTDIR)$(libpddir)/extra/*/*.o install -d $(DESTDIR)$(includedir) diff --git a/src/makefile.mac b/src/makefile.mac index c95ffe9b..486a0034 100644 --- a/src/makefile.mac +++ b/src/makefile.mac @@ -106,21 +106,7 @@ SRC = g_canvas.c g_graph.c g_text.c g_rtext.c g_array.c g_template.c g_io.c \ x_file.c x_scalar.c x_vexp.c x_vexp_if.c x_vexp_fun.c \ $(SYSSRC) -OBJ = $(SRC:.c=.o) - -# get version from m_pd.h to use in doc/0.about.txt -PD_MAJOR_VERSION := $(shell grep "^\s*\#\s*define\s*PD_MAJOR_VERSION\>" m_pd.h | \ - sed 's|^.define *PD_MAJOR_VERSION *\([0-9]*\).*|\1|' ) -PD_MINOR_VERSION := $(shell grep "^\s*\#\s*define\s*PD_MINOR_VERSION\>" m_pd.h | \ - sed 's|^.define *PD_MINOR_VERSION *\([0-9]*\).*|\1|' ) -PD_BUGFIX_VERSION := $(shell grep "^\s*\#\s*define\s*PD_BUGFIX_VERSION\>" m_pd.h | \ - sed 's|^.define *PD_BUGFIX_VERSION *\([0-9]*\).*|\1|' ) -PD_TEST_VERSION := $(shell grep "^\s*\#\s*define\s*PD_TEST_VERSION\>" m_pd.h | \ - sed 's|^.define *PD_TEST_VERSION *"\(.*\)".*|\1|' ) -PD_VERSION := $(PD_MAJOR_VERSION).$(PD_MINOR_VERSION).$(PD_BUGFIX_VERSION) -ifneq ($(PD_TEST_VERSION),) - PD_VERSION := $(PD_VERSION)-$(PD_TEST_VERSION) -endif +OBJ = $(SRC:.c=.o) # # ------------------ targets ------------------------------------ @@ -176,7 +162,6 @@ externs: BINARYMODE=-m755 -ABOUT_FILE=$(DESTDIR)$(pddocdir)/0.about.txt install: all install -d $(DESTDIR)$(libpdbindir) -install $(BIN_DIR)/$(GUINAME) $(DESTDIR)$(libpdbindir)/$(GUINAME) @@ -187,7 +172,7 @@ install: all install -m755 $(BIN_DIR)/pdreceive $(DESTDIR)$(bindir)/pdreceive install -d $(DESTDIR)$(libpdtcldir) install ../tcl/* $(DESTDIR)$(libpdtcldir) - for dir in $(shell ls -1 ../doc | grep -v CVS | grep -v 0.about.txt); do \ + for dir in $(shell ls -1 ../doc | grep -v CVS); do \ echo "installing $$dir"; \ install -d $(DESTDIR)$(pddocdir)/$$dir ; \ install -m644 -p ../doc/$$dir/*.* $(DESTDIR)$(pddocdir)/$$dir ; \ @@ -198,11 +183,6 @@ install: all install -m644 -p ../doc/7.stuff/$$dir/*.* \ $(DESTDIR)$(pddocdir)/7.stuff/$$dir ; \ done - install -p ../doc/0.about.txt $(ABOUT_FILE) - mv $(ABOUT_FILE) $(ABOUT_FILE).tmp - cat $(ABOUT_FILE).tmp | sed 's|PD_VERSION|Pd version $(PD_VERSION)|' \ - > $(ABOUT_FILE) - rm $(ABOUT_FILE).tmp cp -pr ../extra $(DESTDIR)$(libpddir)/ rm -f $(DESTDIR)$(libpddir)/extra/*/*.o install -d $(DESTDIR)$(includedir) diff --git a/src/makefile.mingw b/src/makefile.mingw index c3dfae0c..ef186ee4 100644 --- a/src/makefile.mingw +++ b/src/makefile.mingw @@ -146,22 +146,6 @@ ASIOOBJ = $(ASIOSRC:.cpp=.o) #VOBJ = $(VSRC:.c=.o) OBJC = $(OBJ) $(PAOBJ) $(ASIOOBJ) $(PMOBJ) - -# get version from m_pd.h to use in doc/0.about.txt -PD_MAJOR_VERSION := $(shell grep "^\s*\#\s*define\s*PD_MAJOR_VERSION\>" m_pd.h | \ - sed 's|^.define *PD_MAJOR_VERSION *\([0-9]*\).*|\1|' ) -PD_MINOR_VERSION := $(shell grep "^\s*\#\s*define\s*PD_MINOR_VERSION\>" m_pd.h | \ - sed 's|^.define *PD_MINOR_VERSION *\([0-9]*\).*|\1|' ) -PD_BUGFIX_VERSION := $(shell grep "^\s*\#\s*define\s*PD_BUGFIX_VERSION\>" m_pd.h | \ - sed 's|^.define *PD_BUGFIX_VERSION *\([0-9]*\).*|\1|' ) -PD_TEST_VERSION := $(shell grep "^\s*\#\s*define\s*PD_TEST_VERSION\>" m_pd.h | \ - sed 's|^.define *PD_TEST_VERSION *"\(.*\)".*|\1|' ) -PD_VERSION := $(PD_MAJOR_VERSION).$(PD_MINOR_VERSION).$(PD_BUGFIX_VERSION) -ifneq ($(PD_TEST_VERSION),) - PD_VERSION := $(PD_VERSION)-$(PD_TEST_VERSION) -endif - - # # ------------------ targets ------------------------------------ # @@ -240,7 +224,6 @@ testbin: $(PDEXEC) $(PDDLL) $(PDCOM) install -p $(PDCOM) $(BIN_DIR) install -p $(PDEXEC) $(BIN_DIR) -ABOUT_FILE=$(DESTDIR)$(pddocdir)/0.about.txt install: all # locales # make libpddir=$(libpddir) -C ../po install @@ -255,7 +238,7 @@ install: all install -p ../tcl/pd.ico $(DESTDIR)$(bindir)/pd.ico install -p $(PDSEND) $(DESTDIR)$(bindir)/$(PDSEND) install -p $(PDRECEIVE) $(DESTDIR)$(bindir)/$(PDRECEIVE) - for dir in $(shell ls -1 ../doc | grep -v CVS | grep -v 0.about.txt); do \ + for dir in $(shell ls -1 ../doc | grep -v CVS); do \ echo "installing $$dir"; \ install -d $(DESTDIR)$(pddocdir)/$$dir ; \ install -p ../doc/$$dir/*.* $(DESTDIR)$(pddocdir)/$$dir ; \ @@ -265,11 +248,6 @@ install: all install -d $(DESTDIR)$(pddocdir)/7.stuff/$$dir ; \ install -p ../doc/7.stuff/$$dir/*.* $(DESTDIR)$(pddocdir)/7.stuff/$$dir ; \ done - install -p ../doc/0.about.txt $(ABOUT_FILE) - mv $(ABOUT_FILE) $(ABOUT_FILE).tmp - cat $(ABOUT_FILE).tmp | sed 's|PD_VERSION|Pd version $(PD_VERSION)|' \ - > $(ABOUT_FILE) - rm $(ABOUT_FILE).tmp install -d $(DESTDIR)$(libpddir)/extra # install -p $(pd_src)/extra/*/*.dll $(DESTDIR)$(libpddir)/extra install -p $(pd_src)/extra/*.pd $(DESTDIR)$(libpddir)/extra diff --git a/tcl/Makefile.am b/tcl/Makefile.am index cf5d0c27..cf65cce4 100644 --- a/tcl/Makefile.am +++ b/tcl/Makefile.am @@ -18,6 +18,7 @@ CLEANFILES += pd-gui dist_libpdtcl_SCRIPTS = pd-gui.tcl dist_libpdtcl_DATA = \ + about.txt \ AppMain.tcl \ apple_events.tcl \ dialog_array.tcl \ diff --git a/doc/0.about.txt b/tcl/about.txt similarity index 100% rename from doc/0.about.txt rename to tcl/about.txt diff --git a/tcl/pd_menucommands.tcl b/tcl/pd_menucommands.tcl index ab1225ad..d6341d0e 100644 --- a/tcl/pd_menucommands.tcl +++ b/tcl/pd_menucommands.tcl @@ -235,7 +235,7 @@ proc ::pd_menucommands::set_filenewdir {mytoplevel} { # parse the textfile for the About Pd page proc ::pd_menucommands::menu_aboutpd {} { set versionstring "Pd $::PD_MAJOR_VERSION.$::PD_MINOR_VERSION.$::PD_BUGFIX_VERSION$::PD_TEST_VERSION" - set filename "$::sys_libdir/doc/0.about.txt" + set filename [file join $::sys_guidir about.txt] if {![file exists $filename]} { ::pdwindow::error [_ "ignoring '%s': doesn't exist" $filename] ::pdwindow::error "\n" From d68c44cb5de7ce60a10a3bb4395858dca174171d Mon Sep 17 00:00:00 2001 From: porres Date: Tue, 23 Jul 2024 18:59:01 -0300 Subject: [PATCH 49/89] add a 2d oscilloscope example to data structures closes https://github.com/pure-data/pddp/issues/236 --- doc/4.data.structures/18.scope2d.pd | 72 +++++++++++++++++++++++++++++ doc/Makefile.am | 1 + 2 files changed, 73 insertions(+) create mode 100644 doc/4.data.structures/18.scope2d.pd diff --git a/doc/4.data.structures/18.scope2d.pd b/doc/4.data.structures/18.scope2d.pd new file mode 100644 index 00000000..cff575cd --- /dev/null +++ b/doc/4.data.structures/18.scope2d.pd @@ -0,0 +1,72 @@ +#N canvas 385 45 894 575 10; +#X obj 287 270 pointer; +#X obj 224 293 append \$0-template x y, f 11; +#X obj 338 190 s pd-\$0-display; +#X obj 267 200 f \$0; +#X obj 145 348 setsize \$0-template \$0-data, f 11; +#X obj 291 392 array define \$0-x 1024; +#X obj 291 413 array define \$0-y 1024; +#N canvas 859 654 298 149 \$0-template 0; +#X obj 52 37 struct \$0-template float x float y array \$0-data \$0-data-template, f 32; +#X obj 53 83 plot -e 0 \$0-data 500 3; +#X restore 315 307 pd \$0-template; +#N canvas 744 580 370 121 \$0-data-template 0; +#X obj 60 46 struct \$0-data-template float x float y; +#X restore 315 328 pd \$0-data-template; +#X obj 101 440 array set -s \$0-template \$0-data -f \$0-data-template y, f 21; +#X obj 63 490 array set -s \$0-template \$0-data -f \$0-data-template x, f 32; +#X obj 63 395 array get \$0-x, f 5; +#X obj 101 395 array get \$0-y, f 5; +#X obj 63 317 tgl 19 0 empty empty empty 0 -8 0 10 #dfdfdf #000000 #000000 0 1; +#X floatatom 108 321 5 25 1000 0 - - - 0; +#X obj 159 319 block~; +#X msg 159 296 set \$1; +#X msg 145 245 1024; +#X floatatom 145 270 5 0 0 0 - - - 0; +#X obj 63 356 metro 25; +#N canvas 92 117 513 497 \$0-display 0; +#X coords 0 2 2 0 334 332 2 100 100; +#X restore 492 189 pd \$0-display; +#X obj 139 173 trigger a bang bang bang bang; +#X obj 139 129 bng 21 250 50 0 empty empty empty 0 -8 0 10 #dfdfdf #000000 #000000; +#X msg 63 280 1; +#X obj 537 114 osc~ 440; +#X obj 667 148 tabsend~ \$0-y; +#X obj 537 149 tabsend~ \$0-x; +#X obj 667 115 osc~ 660.1; +#X msg 224 253 0 0; +#X msg 287 226 traverse pd-\$1-display \, bang \; pd dsp 1, f 23; +#X msg 338 168 clear; +#X obj 338 143 loadbang; +#X text 165 131 (re)initialize; +#X text 83 31 This example plots a two-dimensional array taking into consideration two signal inputs. One signal is for the 'X' dimension (horizontal) and another for the 'Y' dimension (vertical). This way we can implement a 2D Oscilloscope!; +#X text 511 35 Thanks Ben Wesch for this patch.; +#X text 84 87 Click the bang below to initialize the patch.; +#X connect 0 0 1 2; +#X connect 1 0 4 1; +#X connect 1 0 9 2; +#X connect 1 0 10 2; +#X connect 3 0 29 0; +#X connect 11 0 10 0; +#X connect 12 0 9 0; +#X connect 13 0 19 0; +#X connect 14 0 19 1; +#X connect 16 0 15 0; +#X connect 17 0 18 0; +#X connect 18 0 4 0; +#X connect 18 0 16 0; +#X connect 19 0 11 0; +#X connect 19 0 12 0; +#X connect 21 0 23 0; +#X connect 21 1 17 0; +#X connect 21 2 28 0; +#X connect 21 3 3 0; +#X connect 21 4 30 0; +#X connect 22 0 21 0; +#X connect 23 0 13 0; +#X connect 24 0 26 0; +#X connect 27 0 25 0; +#X connect 28 0 1 0; +#X connect 29 0 0 0; +#X connect 30 0 2 0; +#X connect 31 0 30 0; diff --git a/doc/Makefile.am b/doc/Makefile.am index 6d815a77..a573c29b 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -321,6 +321,7 @@ nobase_dist_libpd_DATA = \ ./4.data.structures/15.sliderule.pd \ ./4.data.structures/16.FFT-plot.pd \ ./4.data.structures/17.partialtracer.pd \ + ./4.data.structures/18.scope2d.pd \ ./4.data.structures/add-trace.pd \ ./4.data.structures/beat-maker.pd \ ./4.data.structures/data-array.pd \ From 476845a257cad4a16ac4234508975d66c29becde Mon Sep 17 00:00:00 2001 From: porres Date: Tue, 23 Jul 2024 20:14:18 -0300 Subject: [PATCH 50/89] reorg manual folder closes https://github.com/pure-data/pddp/issues/240 --- doc/1.manual/index.htm | 268 +++++++++--------- .../{x1.htm => resources/chapter1.htm} | 38 +-- .../{x2.htm => resources/chapter2.htm} | 252 ++++++++-------- .../{x3.htm => resources/chapter3.htm} | 52 ++-- .../{x4.htm => resources/chapter4.htm} | 52 ++-- .../{x5.htm => resources/chapter5.htm} | 18 +- .../{x6.htm => resources/chapter6.htm} | 20 +- doc/2.control.examples/02.editing.pd | 2 +- doc/4.data.structures/01.scalars.pd | 2 +- doc/5.reference/declare-help.pd | 8 +- doc/Makefile.am | 12 +- 11 files changed, 362 insertions(+), 362 deletions(-) rename doc/1.manual/{x1.htm => resources/chapter1.htm} (86%) rename doc/1.manual/{x2.htm => resources/chapter2.htm} (93%) rename doc/1.manual/{x3.htm => resources/chapter3.htm} (94%) rename doc/1.manual/{x4.htm => resources/chapter4.htm} (95%) rename doc/1.manual/{x5.htm => resources/chapter5.htm} (99%) rename doc/1.manual/{x6.htm => resources/chapter6.htm} (98%) diff --git a/doc/1.manual/index.htm b/doc/1.manual/index.htm index 1ff27787..14558962 100644 --- a/doc/1.manual/index.htm +++ b/doc/1.manual/index.htm @@ -11,7 +11,7 @@ @@ -23,209 +23,209 @@

    Pure Data Manual

    Updated for Pd version 0.55-1

    Table of contents:

      -
    1. Introduction +
    2. Introduction
        -
      1. Guide to the documentation -
      2. The Help menu -
      3. Other resources -
      4. Other flavors +
      5. Guide to the documentation +
      6. The Help menu +
      7. Other resources +
      8. Other flavors
      -
    3. Theory of operation +
    4. Theory of operation
        -
      1. Overview +
      2. Overview
          -
        1. The main window, canvases, and printout -
        2. Object boxes -
        3. Message and GUI boxes -
        4. Patches and files +
        5. The main window, canvases, and printout +
        6. Object boxes +
        7. Message and GUI boxes +
        8. Patches and files
        -
      3. Editing Pd patches +
      4. Editing Pd patches
          -
        1. Edit and run mode -
        2. Creating boxes -
        3. Selecting items and moving them or "tidying them up" -
        4. Delete, cut, copy and paste boxes -
        5. Changing the text of objects, messages and comments -
        6. Connecting and disconnecting boxes -
        7. Context menu for 'Properties', 'Open' and 'Help' +
        8. Edit and run mode +
        9. Creating boxes +
        10. Selecting items and moving them or "tidying them up" +
        11. Delete, cut, copy and paste boxes +
        12. Changing the text of objects, messages and comments +
        13. Connecting and disconnecting boxes +
        14. Context menu for 'Properties', 'Open' and 'Help'
        -
      5. Advanced patch editing +
      6. Advanced patch editing
          -
        1. Tab navigation -
        2. Autopatching -
        3. Duplicate connections -
        4. Managing connections with the shift key -
        5. (Dis)Connect selection -
        6. Triggerize -
        7. Paste replace +
        8. Tab navigation +
        9. Autopatching +
        10. Duplicate connections +
        11. Managing connections with the shift key +
        12. (Dis)Connect selection +
        13. Triggerize +
        14. Paste replace
        -
      7. Messages +
      8. Messages
          -
        1. Message types (selectors) and numeric precision -
        2. Depth first message passing -
        3. Hot and cold inlets and right to left outlet order -
        4. Message boxes -
        5. Escaping characters +
        6. Message types (selectors) and numeric precision +
        7. Depth first message passing +
        8. Hot and cold inlets and right to left outlet order +
        9. Message boxes +
        10. Escaping characters
        -
      9. Audio signals +
      10. Audio signals
          -
        1. Sample rate and format -
        2. Tilde objects and audio connections -
        3. Converting audio to and from messages -
        4. Switching and blocking -
        5. Nonlocal signal connections -
        6. Multichannel signals +
        7. Sample rate and format +
        8. Tilde objects and audio connections +
        9. Converting audio to and from messages +
        10. Switching and blocking +
        11. Nonlocal signal connections +
        12. Multichannel signals
        -
      11. Scheduling +
      12. Scheduling
          -
        1. Audio and messages -
        2. Computation load -
        3. Determinism +
        4. Audio and messages +
        5. Computation load +
        6. Determinism
        -
      13. Semantics +
      14. Semantics
          -
        1. Creation of objects -
        2. Persistence of data -
        3. Message passing -
        4. Inlets and lists -
        5. Dollar signs +
        6. Creation of objects +
        7. Persistence of data +
        8. Message passing +
        9. Inlets and lists +
        10. Dollar signs
        -
      15. Subpatches +
      16. Subpatches
          -
        1. Abstractions -
        2. Graph-on-parent subpatches +
        3. Abstractions +
        4. Graph-on-parent subpatches
        -
      17. Arrays -
      18. Data structures +
      19. Arrays +
      20. Data structures
          -
        1. Traversal -
        2. Accessing and changing data -
        3. Editing -
        4. Limitations +
        5. Traversal +
        6. Accessing and changing data +
        7. Editing +
        8. Limitations
        -
      21. Pd vs. MAX +
      22. Pd vs. MAX
          -
        1. Differences between Pd and MAX -
        2. Running Pd inside MAX with the [pd~] external -
        3. The Cyclone library +
        4. Differences between Pd and MAX +
        5. Running Pd inside MAX with the [pd~] external +
        6. The Cyclone library
      -
    5. Installing and configuring Pd +
    6. Installing and configuring Pd
        -
      1. Installing Pd +
      2. Installing Pd
          -
        1. macOS -
        2. Microsoft Windows -
        3. Linux +
        4. macOS +
        5. Microsoft Windows +
        6. Linux
        -
      3. Running Pd via the command line -
      4. Testing and configuring Audio and MIDI +
      5. Running Pd via the command line +
      6. Testing and configuring Audio and MIDI
          -
        1. Audio settings -
        2. MIDI settings +
        3. Audio settings +
        4. MIDI settings
        -
      7. Path and startup +
      8. Path and startup
          -
        1. Startup flags +
        2. Startup flags
            -
          1. Font flags -
          2. Path flag -
          3. Flags for Audio and MIDI multiple devices and +
          4. Font flags +
          5. Path flag +
          6. Flags for Audio and MIDI multiple devices and sleepgrain -
          7. Sample rate flag -
          8. Audio buffer size and block size flags +
          9. Sample rate flag +
          10. Audio buffer size and block size flags
      -
    7. Externals +
    8. Externals
        -
      1. External objects & libraries +
      2. External objects & libraries
          -
        1. Vanilla objects, internals & externals -
        2. Types of external objects +
        3. Vanilla objects, internals & externals +
        4. Types of external objects
            -
          1. Compiled objects -
          2. Abstractions +
          3. Compiled objects +
          4. Abstractions
          -
        5. External libraries -
        6. Types of external libraries -
        7. Wrapping up section 4.1 +
        8. External libraries +
        9. Types of external libraries +
        10. Wrapping up section 4.1
        -
      3. GUI (.tcl) plugins -
      4. Installing externals and GUI plugins +
      5. GUI (.tcl) plugins +
      6. Installing externals and GUI plugins
          -
        1. Where to include externals and GUI plugins -
        2. How to download externals and GUI plugins from Pd +
        3. Where to include externals and GUI plugins +
        4. How to download externals and GUI plugins from Pd
        -
      7. Loading externals +
      8. Loading externals
          -
        1. Using the [declare] object +
        2. Using the [declare] object
            -
          1. [declare -path] -
          2. [declare -lib] +
          3. [declare -path] +
          4. [declare -lib]
          -
        3. Load via path and startup +
        4. Load via path and startup
            -
          1. User added path -
          2. Startup +
          3. User added path +
          4. Startup
          -
        5. Load using slash declarations +
        6. Load using slash declarations
        -
      9. How external binaries are loaded +
      10. How external binaries are loaded
          -
        1. Overriding objects (externals and native) +
        2. Overriding objects (externals and native)
        -
      11. Search order in Pd for objects and files +
      12. Search order in Pd for objects and files
      -
    9. Current status +
    10. Current status
        -
      1. Release notes +
      2. Release notes
      -
    11. Building Pd from source +
    12. Building Pd from source
        -
      1. Requirements -
      2. General autotools build steps -
      3. Building Pd for Linux -
      4. Building Pd for BSD +
      5. Requirements +
      6. General autotools build steps +
      7. Building Pd for Linux +
      8. Building Pd for BSD
          -
        1. FreeBSD -
        2. OpenBSD -
        3. NetBSD +
        4. FreeBSD +
        5. OpenBSD +
        6. NetBSD
        -
      9. Building Pd for macOS +
      10. Building Pd for macOS
          -
        1. macOS app bundle +
        2. macOS app bundle
            -
          1. macOS App bundle helpers +
          2. macOS App bundle helpers
          -
        3. Supplementary macOS build scripts -
        4. Preferences -
        5. Code signing -
        6. Privacy permissions -
        7. Font issues with macOS 10.15+ -
        8. Dark mode -
        9. Debugging releases +
        10. Supplementary macOS build scripts +
        11. Preferences +
        12. Code signing +
        13. Privacy permissions +
        14. Font issues with macOS 10.15+ +
        15. Dark mode +
        16. Debugging releases
        -
      11. Building Pd for Microsoft Windows +
      12. Building Pd for Microsoft Windows
          -
        1. Building a Pd application -
        2. Pd application directory +
        3. Building a Pd application +
        4. Pd application directory
            -
          1. Windows app bundle helpers +
          2. Windows app bundle helpers
          -
        5. pdfontloader -
        6. ASIO support +
        7. pdfontloader +
        8. ASIO support
        -
      13. Cross-compilation for Windows on Linux -
      14. Makefile build -
      15. Troubleshooting +
      16. Cross-compilation for Windows on Linux +
      17. Makefile build +
      18. Troubleshooting
    diff --git a/doc/1.manual/x1.htm b/doc/1.manual/resources/chapter1.htm similarity index 86% rename from doc/1.manual/x1.htm rename to doc/1.manual/resources/chapter1.htm index 9954a876..16b22a0a 100644 --- a/doc/1.manual/x1.htm +++ b/doc/1.manual/resources/chapter1.htm @@ -4,19 +4,19 @@ Pd Manual - Chapter 1: Introduction - - + +
    - +

    Chapter 1: Introduction

    @@ -52,12 +52,12 @@

    1.1. Guide to Pd's documentation

  2. The first subfolder 1.manual includes this HTML manual and consists of 6 sections:
  3. Next, there's a series of tutorial patches, starting with 2.control.examples, @@ -71,13 +71,13 @@

    1.1. Guide to Pd's documentation

  4. 4.data.structures is the last tutorial, giving an introduction to Pd's Data Structures feature, also described in this manual in section -2.10 Data Structures. +2.10 Data Structures.
  5. In the 5.reference folder, you find the help patches for all objects.
  6. The 6.externs folder includes instructions on how to write externals, including sample C code for different use cases. More information on externals -is found in Chapter 4: Externals of this manual. +is found in Chapter 4: Externals of this manual.
  7. In the 7.stuff folder, you'll find additional patches to explore. @@ -91,7 +91,7 @@

    1.2. The Help menu

    to the documentation and other resources. "Pd Help" opens this HTML manual.
    -pd help +pd help
    Fig. 1.2.1 The Help menu
    @@ -101,7 +101,7 @@

    1.2. The Help menu

    the manual, particular help files, examples from the tutorials, etc.
    -browser +browser
    Fig. 1.2.2 The Help browser accessing the Pd's documentation folder
    @@ -113,7 +113,7 @@

    1.2. The Help menu

    includes a list of all native objects with brief explanations.
    -list of objects +list of objects
    Fig. 1.2.3 The help-intro patch with a list of all internal objects
    @@ -131,7 +131,7 @@

    1.2. The Help menu

    The Help menu also allows you to find and download externals with the "Find externals" entry, which opens a Pd extension manager. This is described more detailed in -4.3.2 How to Download Externals from Pd. +4.3.2 How to Download Externals from Pd.

    1.3. Other resources

    @@ -186,8 +186,8 @@

    1.4. Other flavors

    diff --git a/doc/1.manual/x2.htm b/doc/1.manual/resources/chapter2.htm similarity index 93% rename from doc/1.manual/x2.htm rename to doc/1.manual/resources/chapter2.htm index 0dfa5fc2..40ddb61a 100644 --- a/doc/1.manual/x2.htm +++ b/doc/1.manual/resources/chapter2.htm @@ -4,27 +4,27 @@ Pd Manual - Chapter 2: Theory of operation - - + +
    - +

    Chapter 2: Theory of operation

    The purpose of this chapter is to describe Pd's design and how it is supposed to work. Practical details about how to obtain, install, and run Pd -are described in the next chapter. Links to more extensive +are described in the next chapter. Links to more extensive guides (and to more theoretical information about computer music) are provided -in the previous chapter. +in the previous chapter.

    2.1. Overview

    @@ -35,12 +35,12 @@

    2.1. Overview

    originally designed to offer a unique experimental feature not found in MAX, allowing users to define and access data structures in innovative ways, with the ability to attach shapes and colors to data in order to visualize it and/or edit it graphically -(see section 2.10 Data Structures for details). +(see section 2.10 Data Structures for details).

    Despite its lightweight and portable nature, Pd offers a wide range of external packages that enhance its capabilities, primarily focusing on audio and control processing, but also for graphical processing and whatnot. For examples and details -on installing and managing packages, refer to Chapter 4: Externals. +on installing and managing packages, refer to Chapter 4: Externals.

    2.1.1. The main window, canvases, and printout

    @@ -49,7 +49,7 @@

    2.1.1. The main window, canvases, and printo The main Pd window looks like this:
    -pd window +pd window
    Fig. 2.1.1 The main Pd window (aka "Console window") on Windows
    @@ -60,14 +60,14 @@

    2.1.1. The main window, canvases, and printo File menu, where you can also close and save them (note the handy shortcuts).
    -file menu +file menu
    Fig. 2.1.2 The File menu on macOS

    Creating a new file creates a blank window.

    -patch canvas +patch canvas
    Fig. 2.1.3 A new and blank patch canvas
    @@ -76,7 +76,7 @@

    2.1.1. The main window, canvases, and printo boxes in patches and for messages from Pd itself. Here is a simple Pd patch:
    -simple patch +simple patch
    Fig. 2.1.4 A simple patch
    @@ -95,22 +95,22 @@

    2.1.1. The main window, canvases, and printo audio samples in realtime for all open patches (whether they are visible or not).
    -DSP on +DSP on
    Fig. 2.1.5 Activated DSP toggle in the Pd window on a mac

    Turning off DSP halts the computation and releases any audio devices that Pure Data is utilizing. You can configure audio devices as described in -3.3.1. Audio settings. +3.3.1. Audio settings.

    The Media menu offers shortcuts to toggle DSP on and off. Use Ctrl+/ ("Control" key on PCs or "Command" key on Apple computers plus the / key) to turn audio processing on, and Ctrl+. to turn it off. You can check the input audio level if you select "Test Audio and MIDI..." and make other Audio and MIDI tests (read more -about this in 3.3. Testing and configuring Audio and MIDI). +about this in 3.3. Testing and configuring Audio and MIDI).

    -media menu +media menu
    Fig. 2.1.6 The Media menu
    @@ -119,19 +119,19 @@

    2.1.1. The main window, canvases, and printo You can increase it to get more detailed information or decrease it to only see fatal errors.
    - log levels + log levels
    Fig. 2.1.7 The log level popup menu

    Errors are mostly printed by objects and displayed in the Pd window in red color. You can find error sources for the corresponding line with Ctrl+click -as shown in here). +as shown in here).

    If the Pd window is focused, the font size for menus and printout can be changed using the "Font" dialog entry in the Edit menu.

    -edit menu +edit menu
    Fig. 2.1.8 The Edit menu
    @@ -140,7 +140,7 @@

    2.1.1. The main window, canvases, and printo that only works for Pd documents.
    -font settings +font settings
    Fig. 2.1.9 The Font settings dialog
    @@ -159,7 +159,7 @@

    2.1.1. The main window, canvases, and printo Note that the Zoom setting is not saved in the patch though.
    -zoomed in and out +zoomed in and out
    Fig. 2.1.10 A patch in standard and zoomed state
    @@ -179,7 +179,7 @@

    2.1.2. Object boxes

    and presented with a dashed border before creation.
    -dashed box +dashed box
    Fig. 2.1.11 An uncreated object box
    @@ -191,7 +191,7 @@

    2.1.2. Object boxes

    "+ 13".
    -object box +object box
    Fig. 2.1.12 A created object box
    @@ -202,7 +202,7 @@

    2.1.2. Object boxes

    a valid number is considered a symbol. Valid numbers may or may not have a decimal point, such as "12", "15.6", "-0.456". Numbers in Pd may also be written in exponential notation and have limited display and internal precison. -Check more details in subsection 2.4.1.. +Check more details in subsection 2.4.1..

    A number that starts with a "+" is not considered a valid number and is @@ -220,7 +220,7 @@

    2.1.2. Object boxes

    synthesizes a pure tone:
    -simple MIDI synthesizer +simple MIDI synthesizer
    Fig. 2.1.13 A simple MIDI synthesizer
    @@ -281,7 +281,7 @@

    2.1.3. Message and GUI boxes

    connected object box, which adds 13 to it.
    -Different box shapes +Different box shapes
    Fig. 2.1.14 Different box shapes
    @@ -298,7 +298,7 @@

    2.1.3. Message and GUI boxes

    running, a number box's content changes to reflect the current value held by the box. You can also use a number box as a control by clicking and dragging up and down, or by typing values in it and hitting enter (more details on how this and any other GUIs -work is available in the objects' help files; see 2.2.7. Popup +work is available in the objects' help files; see 2.2.7. Popup menu for "Properties", "Open" and "Help".

    2.1.4. Patches and files

    @@ -310,7 +310,7 @@

    2.1.4. Patches and files

    objects in the patch, but only what you see: the objects' creation arguments and their interconnections. Nonetheless, the [savestate] object offers a mechanism to save the state of abstractions (see -2.8. Subpatches). Also, certain data-storage objects have +2.8. Subpatches). Also, certain data-storage objects have functions for reading and writing files to save and restore their internal state (one example is the [text] object). When loading a patch, the [loadbang] object can be used to initialize @@ -318,7 +318,7 @@

    2.1.4. Patches and files

    Pd searches for files using specified paths. Most objects capable of reading files search along these paths, but when Pd writes files, they are saved to the directory -where the patch itself is located by default. Check 3.4. Path and +where the patch itself is located by default. Check 3.4. Path and startup for more details.

    2.2. Editing Pd patches

    @@ -334,7 +334,7 @@

    2.2.1. Edit and run mode

    number box) and message boxes (which are used as controls to send messages).
    -run mode arrow +run mode arrow
    Fig. 2.2.1 The arrow cursors in run mode
    @@ -342,7 +342,7 @@

    2.2.1. Edit and run mode

    Edit menu to activate and check it on.
    -edit mode +edit mode
    Fig. 2.2.2 Selecting edit mode from the Edit menu
    @@ -356,7 +356,7 @@

    2.2.1. Edit and run mode

    arrow. You can use the Ctrl+E shortcut to switch between these modes.
    -edit mode hand pointer +edit mode hand pointer
    Fig. 2.2.3 The hand cursor in edit mode
    @@ -364,11 +364,11 @@

    2.2.1. Edit and run mode

    You can also edit text, create or delete boxes and make or cut connections (more details on this will follow below) and you can resize some boxes in your patch, namely object boxes, number/symbol/list boxes, comments, messages. Note you can -also resize Graph-on-parent subpatches and -Arrays. +also resize Graph-on-parent subpatches and +Arrays.
    -resizing boxes +resizing boxes
    Fig. 2.2.4 The double arrow cursor for resizing boxes when in edit mode
    @@ -396,7 +396,7 @@

    2.2.1. Edit and run mode

    scrollbars.
    -scrollbars +scrollbars
    Fig. 2.2.5 A patch window with scrollbars
    @@ -408,7 +408,7 @@

    2.2.2. Creating boxes

    to create each item specifically.
    -put menu +put menu
    Fig. 2.2.6 The Put menu
    @@ -476,7 +476,7 @@

    2.2.3. Selecting items and moving them or "t better results. When boxes are misaligned drastically, this action won't do anything.
    -tidy up +tidy up
    Fig. 2.2.7 Tidying up (aligning) vertically
    @@ -524,7 +524,7 @@

    2.2.5. Changing the text of objects, messages is completely lost.
    -changing text +changing text
    Fig. 2.2.8 Editing text in an object box
    @@ -547,18 +547,18 @@

    2.2.6. Connecting and disconnecting boxes inlet.
    -connecting boxes +connecting boxes
    Fig. 2.2.9 Connecting boxes via click and drag

    If you move the mouse cursor over a patch cord, you'll see it takes the shape -of an "X" to denote you can select it and delete it. Click on the connection +of an "chapter" to denote you can select it and delete it. Click on the connection to select it and press Backspace or Delete key to delete it. You can't just select patch cords with click and drag for a rectangular area and you can only select a single connection by clicking on it.

    -disconnecting boxes +disconnecting boxes
    Fig. 2.2.10 Selecting a patch cord connection to delete it
    @@ -577,9 +577,9 @@

    2.2.7. Context menu for "Properties", "Open" every object class.

    The "Open" menu item is only enabled if you right-click on a -subpatch and prompts Pd to open it. +subpatch and prompts Pd to open it. Ordinary subpatches may also be opened by simply clicking on them, -but for graph-on-parent subpatches +but for graph-on-parent subpatches this is the only method available.

    The "Properties" dialog allows you to change certain settings of GUI @@ -600,7 +600,7 @@

    2.3.1. Tab navigation

    most recently created box back towards the first created ones.
    -tab navigation boxes +tab navigation boxes
    Fig. 2.3.1 Navigating through objects with Tab
    @@ -609,7 +609,7 @@

    2.3.1. Tab navigation

    and from last to first with Shift+Tab.
    -tab navigation cords +tab navigation cords
    Fig. 2.3.2 Navigating through patch cords with Tab
    @@ -619,7 +619,7 @@

    2.3.1. Tab navigation

    Shift+Tab navigates from right to left.
    -tab navigation outlets +tab navigation outlets
    Fig. 2.3.3 Navigating through outlets with Tab
    @@ -633,7 +633,7 @@

    2.3.1. Tab navigation

    2.3.2. Autopatching

    By default, Pd has an "autopatching" mode set to on. You can disable it -via startup flags (see "-autopatch" flag 3.4.1. +via startup flags (see "-autopatch" flag 3.4.1. Startup flags). This works with the shortcuts from the Put menu for inserting boxes. If you have a selected box and use a shortcut to create another one (such as Ctrl+1 to create an @@ -649,12 +649,12 @@

    2.3.2. Autopatching

    box gets deselected and instantiated.
    -autopatch objects +autopatch objects
    Fig. 2.3.4 Autopatching with shortcuts from the Put menu
    -

    You can also autopatch into a newly created subpatch (see +

    You can also autopatch into a newly created subpatch (see 2.8. Subpatches). By creating an object box and typing "pd", as soon as you deselect the object, a [pd] subpatch is created with an inlet - either a control [inlet] if the object @@ -662,7 +662,7 @@

    2.3.2. Autopatching

    it is a tilde object instead.
    -autopatching subpatches +autopatching subpatches
    Fig. 2.3.5 Creating subpatches with autopatching
    @@ -674,7 +674,7 @@

    2.3.3. Duplicate connections

    duplicate and create more connections.
    -duplicate connections +duplicate connections
    Fig. 2.3.6 Duplicate connections with Ctrl+D
    @@ -684,7 +684,7 @@

    2.3.4. Managing connections with the shift ke Shift+Click on another one.
    -swap connections +swap connections
    Fig. 2.3.7 Swap connections
    @@ -696,7 +696,7 @@

    2.3.4. Managing connections with the shift ke connect the same outlet to to multiple inlets sequentially.
    - shift fan out + shift fan out
    Fig. 2.3.8 Faning out
    @@ -706,7 +706,7 @@

    2.3.4. Managing connections with the shift ke not need to be of the same type or class).
    - select fan out + select fan out
    Fig. 2.3.9 Faning out with box selections
    @@ -717,7 +717,7 @@

    2.3.4. Managing connections with the shift ke be of the same type or class).
    - select fan in + select fan in
    Fig. 2.3.10 Faning in with box selections
    @@ -726,7 +726,7 @@

    2.3.4. Managing connections with the shift ke This creates all possible connections starting from the chosen outlet and inlet.
    -multiple connections +multiple connections
    Fig. 2.3.11 Multiple connections between 2 objects
    @@ -738,7 +738,7 @@

    2.3.4. Managing connections with the shift ke chosen inlet.
    - many to one + many to one
    Fig. 2.3.12 Multiple connections between many to one
    @@ -750,7 +750,7 @@

    2.3.4. Managing connections with the shift ke boxes.
    - one to many + one to many
    Fig. 2.3.13 Multiple connections between one to many
    @@ -761,7 +761,7 @@

    2.3.5. (Dis)Connect selection

    boxes in different ways.
    -ctrl+k +ctrl+k
    Fig. 2.3.14 The "(Dis)Connect selection" entry from the Edit menu
    @@ -772,7 +772,7 @@

    2.3.5. (Dis)Connect selection

    remaining outlets to inlets.
    - repeat ctrl+k + repeat ctrl+k
    Fig. 2.3.15 Using ctrl+k for one or multiple connections between 2 selected boxes
    @@ -782,7 +782,7 @@

    2.3.5. (Dis)Connect selection

    to fan out and connect the same outlet to all inlets.
    - fan out audio + fan out audio
    Fig. 2.3.16 Fan out audio connections with ctrl+k
    @@ -790,7 +790,7 @@

    2.3.5. (Dis)Connect selection

    single selected box.
    - exclude box + exclude box
    Fig. 2.3.17 Remove connections
    @@ -803,7 +803,7 @@

    2.3.5. (Dis)Connect selection

    to include the third one in the connection.
    - insert box + insert box
    Fig. 2.3.18 Insert box
    @@ -811,7 +811,7 @@

    2.3.5. (Dis)Connect selection

    Ctrl+K to bypass and remove the middle box from the connection.
    - exclude box + exclude box
    Fig. 2.3.19 Exclude box
    @@ -825,7 +825,7 @@

    2.3.6. Triggerize

    The [trigger] object is widely used in Pd to control the order of execution from right to left and is briefly described in -2.4.3. Hot and cold inlets and right to left outlet order. +2.4.3. Hot and cold inlets and right to left outlet order. "Triggerize" then creates the [trigger] object taking into account the order in which the connections were made, where the first connection starts at the rightmost outlet of [trigger] and continues to the leftmost. @@ -836,11 +836,11 @@

    2.3.6. Triggerize

    [trigger anything anything anything]) with three outlets and the order that the connections from [pack] were made reflect the order from right to left. You can swap connections with the Shift key (as described -in subsection 2.3.4.) if you need to adjust the order of +in subsection 2.3.4.) if you need to adjust the order of connections.
    - triggerize object + triggerize object
    Fig. 2.3.20 Add a [trigger] object
    @@ -852,7 +852,7 @@

    2.3.6. Triggerize

    - insert dummy + insert dummy
    Fig. 2.3.21 Insert a dummy subpatch
    @@ -862,7 +862,7 @@

    2.3.6. Triggerize

    outlet on the left.
    - add 1st outlet + add 1st outlet
    Fig. 2.3.22 Add a leftmost outlet
    @@ -870,7 +870,7 @@

    2.3.6. Triggerize

    connections, "Triggerize" removes the unused outlets.
    - reduce outlets + reduce outlets
    Fig. 2.3.23 Reduce outlets
    @@ -879,7 +879,7 @@

    2.3.6. Triggerize

    of the connections from right to left).
    - distribute connections + distribute connections
    Fig. 2.3.24 Distribute connections
    @@ -894,7 +894,7 @@

    2.3.7. Paste replace

    connections are preserved.
    - paste replace entry + paste replace entry
    Fig. 2.3.25 Paste replacing an object
    @@ -909,7 +909,7 @@

    2.3.7. Paste replace

    count as the same object group type.
    - paste replace boxes + paste replace boxes
    Fig. 2.3.26 Paste replacing a number box
    @@ -918,7 +918,7 @@

    2.3.7. Paste replace

    same type that was copied.
    - paste replace similar type + paste replace similar type
    Fig. 2.3.27 Paste replacing the same box type
    @@ -939,7 +939,7 @@

    2.4.1. Message types (selectors) and numerica symbols and/or floats.
    - list selector + list selector
    Fig. 2.4.1 List messages
    @@ -959,7 +959,7 @@

    2.4.1. Message types (selectors) and numerica arguments. The symbol selector can only have one symbol argument. See below.
    - Different selectors + Different selectors
    Fig. 2.4.2 Different selectors
    @@ -969,7 +969,7 @@

    2.4.1. Message types (selectors) and numerica corresponding action. Let's take the [float] object below as an example.
    - float help + float help
    Fig. 2.4.3 The help file of the [float] object
    @@ -984,7 +984,7 @@

    2.4.1. Message types (selectors) and numerica of messages they take and output. See below.
    - reference + reference
    Fig. 2.4.4 The [float]'s reference
    @@ -1066,7 +1066,7 @@

    2.4.1. Message types (selectors) and numerica "3.14159", but it can be calculated with more precision from math objects.
    - precision + precision
    Fig. 2.4.5Display precision
    @@ -1090,7 +1090,7 @@

    2.4.2. Depth first message passing

    executed in depth first fashion. For instance in the patch below:
    - depth first + depth first
    Fig. 2.4.6 A tree with depth first message passing
    @@ -1102,7 +1102,7 @@

    2.4.2. Depth first message passing

    Message-passing can give rise to infinite loops of the sort shown here:

    - infinite loop + infinite loop
    Fig. 2.4.7 An infinite loop (stack overflow)
    @@ -1114,7 +1114,7 @@

    2.4.2. Depth first message passing

    "Find Last Error" entry in the Find menu for this.
    - find error source + find error source
    Fig. 2.4.8 Find error via the console window
    @@ -1130,7 +1130,7 @@

    2.4.3. Hot and cold inlets and right to left So the following is a legal (and reasonable) loop construct:
    - hot and cold inlets + hot and cold inlets
    Fig. 2.4.9 Avoiding infinite loop with a cold inlet
    @@ -1152,7 +1152,7 @@

    2.4.3. Hot and cold inlets and right to left to double a number. The following is incorrect:
    -incorrect inlet connection +incorrect inlet connection
    Fig. 2.4.10 An undefined connection order
    @@ -1170,7 +1170,7 @@

    2.4.3. Hot and cold inlets and right to left the previous example:

    - trigger to disambiguate + trigger to disambiguate
    Fig. 2.4.11 A defined connection order with [trigger]
    @@ -1194,7 +1194,7 @@

    2.4.4. Message boxes

    elsewhere as specified.

    - message boxes + message boxes
    Fig. 2.4.12 Messages with different selectors
    @@ -1206,7 +1206,7 @@

    2.4.4. Message boxes

    Multiple messages may be separated by commas as shown:

    - multiple messages in one box + multiple messages in one box
    Fig. 2.4.13 Messages separated by commas
    @@ -1225,7 +1225,7 @@

    2.4.4. Message boxes

    likewise the next message is sent to "sue".
    - semicolons to send messages + semicolons to send messages
    Fig. 2.4.14 Messages sent to receive symbols
    @@ -1240,14 +1240,14 @@

    2.4.4. Message boxes

    this way).
    - message dialog + message dialog
    Fig. 2.4.15 Sending messages via the message dialog

    You can put variables in message boxes as shown below:

    - variables in message boxes + variables in message boxes
    Fig. 2.4.16 A message with a "$1" variable
    @@ -1326,16 +1326,16 @@

    2.5.2. Tilde objects and audio connections - dsp loop error + dsp loop error
    Fig. 2.5.1 A DSP loop error

    You can build algorithms with feedback using nonlocal signal connections -as explained in the 2.5.5. subsection. +as explained in the 2.5.5. subsection.

    Your subpatches can have audio inlets and outlets via the [inlet~] and [outlet~] -objects (see 2.8. Subpatches). +objects (see 2.8. Subpatches).

    2.5.3. Converting audio to and from messages

    @@ -1471,7 +1471,7 @@

    2.6.1. Audio and messages

    the messages "dsp 1" and "dsp 0" to "pd".
    - dsp on and off on patch level + dsp on and off on patch level
    Fig. 2.6.1 Setting the DSP status on the patch level
    @@ -1493,7 +1493,7 @@

    2.6.2. Computation load

    that is, it tries to keep ahead of real time by a small amount in order to be able to absorb unpredictable, momentary increases in computation time. This is specified using the "-audiobuf" and "-blocksize" command line flags -(see 3.4.1. Startup flags). +(see 3.4.1. Startup flags).

    If Pd gets late with respect to real time, gaps (either occasional or frequent) will appear in both the input and output audio streams. On the @@ -1669,14 +1669,14 @@

    2.8. Subpatches

    a one-off subpatch. For instance, in this fragment:
    - subpatch + subpatch
    Fig. 2.8.1 A subpatch called "my-subpatch"

    The box in the middle, if clicked on, opens the sub-patch shown here:

    - open subpatch window + open subpatch window
    Fig. 2.8.2 The insides of the subpatch
    @@ -1702,7 +1702,7 @@

    2.8.1. Abstractions

    and then invoke it in an object box as [abstraction1]:
    - abstraction + abstraction
    Fig. 2.8.3 An abstraction (a patch file loaded as an object)
    @@ -1710,7 +1710,7 @@

    2.8.1. Abstractions

    patch shown here:
    - abstraction example + abstraction example
    Fig. 2.8.4 The insides of the [abstraction1] abstraction
    @@ -1751,14 +1751,14 @@

    2.8.2. Graph-on-parent subpatches

    appear on the parent. For instance, here is an invocation of [abstraction2]:
    - graph-on-parent abstraction + graph-on-parent abstraction
    Fig. 2.8.5 An abstraction with "Graph-on-Parent" enabled

    Where the patch "abstraction2.pd" contains:

    - inside graph-on-parent abstraction + inside graph-on-parent abstraction
    Fig. 2.8.6 The insides of the "Graph-on-Parent" [abstraction2.pd] abstraction
    @@ -1809,7 +1809,7 @@

    2.9. Arrays

    In the "graph on parent" form, an array appears as shown:
    - array + array
    Fig. 2.9.1 An array
    @@ -1817,7 +1817,7 @@

    2.9. Arrays

    You can use objects to read and write arrays and manipulate them in many ways.
    - array indexing + array indexing
    Fig. 2.9.2 Reading an array with [tabread]
    @@ -1827,7 +1827,7 @@

    2.9. Arrays

    To write into the array, you can use the [tabwrite] object:
    - setting an value in an array + setting an value in an array
    Fig. 2.9.3Writing to an array with [tabwrite]
    @@ -1839,7 +1839,7 @@

    2.9. Arrays

    the patch below creates a 440 Hz tone with "array1" as a waveform:
    - setting an array with a waveform + setting an array with a waveform
    Fig. 2.9.4 Using signals to read an array with [tabread4~]
    @@ -1860,7 +1860,7 @@

    2.9. Arrays

    for the array and one for the graph. The array dialog looks like this:
    - array properties window + array properties window
    Fig. 2.9.5 The array properties dialog
    @@ -1880,7 +1880,7 @@

    2.9. Arrays

    The graph dialog (which also pops up) is shown here:

    - graph properties + graph properties
    Fig. 2.9.6 The canvas properties dialog
    @@ -1927,7 +1927,7 @@

    2.10. Data structures

    with a very short musical sketch realized using Pd:
    - graphical score + graphical score
    Fig. 2.10.1 A graphical score with Data Structures
    @@ -1952,7 +1952,7 @@

    2.10. Data structures

    above.
    - template for graphical score + template for graphical score
    Fig. 2.10.2 The "struct" and drawing instructions for the score's elements
    @@ -1961,15 +1961,15 @@

    2.10. Data structures

    and [plot]). The [struct] object gives the template the name "template-event". The data structure -is defined to contain three floating point numbers named "x", "y", and "color", +is defined to contain three floating point numbers named "chapter", "y", and "color", and two arrays, one named "pitch" whose elements belong to another template named "template-pitch", and similarly for the array "amp" (both data structures -contain three floating point numbers named "x", "y", and "w", for x/y position +contain three floating point numbers named "chapter", "y", and "w", for x/y position and width.)

    In general, data structures are built from four data types: scalar floats and symbols, text and arrays (whose elements share another, specified template). -The contents of a Pd window themselves form a list. Arrays +The contents of a Pd window themselves form a list. Arrays are actually implemented as a top-level data structure array, whose elements are scalars containing a single floating-point number. @@ -1995,7 +1995,7 @@

    2.10.1. Traversal

    Pd objects are provided to traverse lists and arrays, and to address elements of data structures for getting and setting. Pd has no built-in sequencer, nor -even any notion that "x" values should be used as a time axis. (However, a +even any notion that "chapter" values should be used as a time axis. (However, a "sort" function is provided, which reorders a list from left to right, on the assumption that users might often want to use Pd data collections as x-ordered sequences.) Recording sequences of events into lists, and/or playing the lists @@ -2012,7 +2012,7 @@

    2.10.1. Traversal

    responsible for synthesizing each voice from the score.
    - score playing subpatch + score playing subpatch
    Fig. 2.10.3 The subpatch that plays the graphcal score
    @@ -2026,7 +2026,7 @@

    2.10.1. Traversal

    with pointers.
    - [pd sequence] subpatch + [pd sequence] subpatch
    Fig. 2.10.4 The sequencing subpatch
    @@ -2045,7 +2045,7 @@

    2.10.1. Traversal

    [get template-event] object with the 'x' field. This is converted to incremental time with [-], corrected for tempo, and fed to the [delay] object. Pd provides the [get] and [set] objects for reading and writing values from data structures. -The [get] object shown here obtains the "x" and "y" fields of the current object. +The [get] object shown here obtains the "chapter" and "y" fields of the current object. The template name (template-event) is supplied to the [get] objects so that they can look up the offset of the necessary field(s) in advance, for greater run-time efficiency. @@ -2056,7 +2056,7 @@

    2.10.1. Traversal

    needed by [clone]). Let's check the [voice] abstraction below.
    - [voice] abstraction + [voice] abstraction
    Fig. 2.10.5 The cloned [voice] abstraction with sound synthesis
    @@ -2067,7 +2067,7 @@

    2.10.1. Traversal

    structures. Let's have a look at the [data-array] abstraction below.
    - [data-array] abstraction + [data-array] abstraction
    Fig. 2.10.6 The [data-array] abstraction
    @@ -2308,7 +2308,7 @@

    2.11.1. Differences between Pd and MAX ways in Pd and MAX, and block sizes are handled differently as well.

    The 'bpatcher' feature in MAX has a correlate in Pd -(Graph-on-parent subpatches); however, Pd's version is +(Graph-on-parent subpatches); however, Pd's version is quite different from the one in MAX.

    Pd's correlate of Max's [itable] object are arrays implemented as a high @@ -2340,7 +2340,7 @@

    2.11.2. Running Pd inside MAX with the [ installed for Pd. The picture below shows a [pd~] object in MAX 8.
    -pd~ in max +pd~ in max
    Fig. 2.11.1 The [pd~] external for MAX
    @@ -2366,9 +2366,9 @@

    2.11.3. The Cyclone library

    diff --git a/doc/1.manual/x3.htm b/doc/1.manual/resources/chapter3.htm similarity index 94% rename from doc/1.manual/x3.htm rename to doc/1.manual/resources/chapter3.htm index 11814fc7..f4a1b9a1 100644 --- a/doc/1.manual/x3.htm +++ b/doc/1.manual/resources/chapter3.htm @@ -4,19 +4,19 @@ Pd Manual - Chapter 3: Installing and configuring Pd - - + +
    - +

    Chapter 3: Installing and configuring Pd

    @@ -48,7 +48,7 @@

    3.1. Installing Pd

    Installation instructions are platform-specific and described in each case in this section, but Instructions on how to build Pd yourself for all supported OSes in both single -or double precision is provided in Chapter 6: Building Pd from source. +or double precision is provided in Chapter 6: Building Pd from source.

    Note that you can have different versions of Pd and also Pd compiled for different architectures and float precision in the same machine/OS. The Pd application is named in @@ -102,7 +102,7 @@

    3.1.3. Linux

    Pd is available via the package systems for some Linux distributions, but not always in the most recent version possible. In case you don't find it or want the very latest recent version, you need to compile Pd, which is -described in 6.3. Building Pd for Linux. +described in 6.3. Building Pd for Linux.

    3.2. Running Pd via the command line

    @@ -136,7 +136,7 @@

    3.3. Testing and configuring Audio and MIDI from the Media menu. You should see a window like this:
    - test audio and midi patch + test audio and midi patch
    Fig. 3.3.1 Test Audio and MIDI patch
    @@ -174,8 +174,8 @@

    3.3. Testing and configuring Audio and MIDI you may need both to run simultaneously. By default, Pd will try to run both, but if you don't need either input or output, you may find that Pd runs more reliably, or at least more efficiently, with the unused direction -turned off. This may be specified using the Audio -Settings dialog panel or Startup flags. +turned off. This may be specified using the Audio +Settings dialog panel or Startup flags.

    Depending on your application you will have a more or less stringent latency requirement. Ideally, when any input (audio, MIDI, keyboard, network) is @@ -208,7 +208,7 @@

    3.3. Testing and configuring Audio and MIDI On Linux, they are OSS-MIDI and ALSA-MIDI.
    - API choices in Windows + API choices in Windows
    Fig. 3.3.2 API choices in Windows
    @@ -323,7 +323,7 @@

    3.3.1. Audio settings

    settings window.
    - old MMIO API + old MMIO API
    Fig. 3.3.3 Audio Settings from the Media menu ('old MMIO system' API on Windows)
    @@ -332,7 +332,7 @@

    3.3.1. Audio settings

    While the screenshot below is for 'portaudio' on macOS.
    - audio settings dialog + audio settings dialog
    Fig. 3.3.4 Audio Settings from the Media menu (portaudio API on macOS)
    @@ -350,7 +350,7 @@

    3.3.1. Audio settings

    that's all you need or more if your hardware supports it.
    - audio settings dialog + audio settings dialog
    Fig. 3.3.5 The Audio Settings dialog as called from the Media menu on Linux
    @@ -375,7 +375,7 @@

    3.3.2. MIDI settings

    has a separate inlet to specify which MIDI port you want.
    - MIDI settings + MIDI settings
    Fig. 3.3.6 The MIDI Settings dialog as called from the Media menu on macOS
    @@ -397,7 +397,7 @@

    3.4. Path and startup

    that you can get choices for API this way.
    - preferences dialog + preferences dialog
    Fig. 3.4.1 The Audio Settings tab in tabbed Preferences on Windows
    @@ -407,7 +407,7 @@

    3.4. Path and startup

    - preferences dialog + preferences dialog
    Fig. 3.4.2 The Path dialog in the tabbed Preferences
    @@ -425,11 +425,11 @@

    3.4. Path and startup

    tab. Note you can use things like "../samples" to point to folders and subfolders that are relative to the patch directory and other search paths. Note you can also use [declare] to add paths for particular patches - this and other details about -path management is also covered in depth in Chapter 4: Externals, -and summarized in 4.6. Search order in Pd for objects and files. +path management is also covered in depth in Chapter 4: Externals, +and summarized in 4.6. Search order in Pd for objects and files.
    - startup dialog + startup dialog
    Fig. 3.4.3 The startup dialog
    @@ -437,7 +437,7 @@

    3.4. Path and startup

    Startup flags. Most of the configurations in Pd may be changed using the various dialogs you can open from Pd's menus. For instance, you can use the Font entry from the Edit menu to set what font size size Pd will use -for its main window (this is described in subsection 2.1.1., +for its main window (this is described in subsection 2.1.1., by the way). Nevertheless, this and every other configuration in Pd (from Audio and MIDI settings and whatnot) can also be configurable via startup flags. Other than that, some configurations are too cranky to put in a GUI @@ -446,7 +446,7 @@

    3.4. Path and startup

    Startup flags initialize Pd in many ways, but many configurations can be changed while Pd is running. Some configurations, on the other hand, requires Pd to restart, such as setting which external binaries to load -(more about external management in Chapter 4. +(more about external management in Chapter 4.

    The "defeat real-time scheduling" control, if enabled, makes Pd run without its usual effort to become a real-time process (whatever this means @@ -629,9 +629,9 @@

    3.4.1.5. Audio buffer size and block siz
    diff --git a/doc/1.manual/x4.htm b/doc/1.manual/resources/chapter4.htm similarity index 95% rename from doc/1.manual/x4.htm rename to doc/1.manual/resources/chapter4.htm index c1ad2a54..8ef42bc9 100644 --- a/doc/1.manual/x4.htm +++ b/doc/1.manual/resources/chapter4.htm @@ -4,19 +4,19 @@ Pd Manual - Chapter 4: Externals - - + +
    - +

    Chapter 4: Externals

    @@ -68,10 +68,10 @@

    4.1.1 Vanilla objects, internals & externals

    To get a full list of all objects in Pd Vanilla, go to the Help menu and then select List of Objects, or alternatively right click on an empty spot of a patch’s window and select “help” - this loads the help-intro.pd file that was already -shown in Chapter 1: Introduction and reproduced below. +shown in Chapter 1: Introduction and reproduced below.

    - list of objects + list of objects
    Fig. 1.2.3 The "help-intro' patch with a list of all internal objects
    @@ -83,7 +83,7 @@

    4.1.1 Vanilla objects, internals & externals install of Pd and lists the objects in the extra folder.
    - browser window + browser window
    Fig. 4.1.1 The browser window
    @@ -102,7 +102,7 @@
    4.1.2.1. Compiled objects
    floats aka "single-precision floating point numbers" or "double-precision floating point numbers" respectively "single" or "double"). -

    In Chapter 3: Installing and configuring Pd you can see +

    In Chapter 3: Installing and configuring Pd you can see how to download different Pd applications. Most commonly, you'll have Pd installed as a 64-bit application, which corresponds to most recent systems. @@ -113,7 +113,7 @@

    4.1.2.1. Compiled objects

    Also, at this point, Pure Data does not officially support double-precision numbers. You can download Pd64 beta releases or compile them yourself though (for -compilation instructions, see Chapter 6: Building Pd from source). +compilation instructions, see Chapter 6: Building Pd from source). Note that the numerical resolution of Pd and Pd64 here must not be confused with the register size of the system it's running on. @@ -346,7 +346,7 @@

    4.1.2.2. Abstractions

    You can have a Pd patch behave like an object by loading it into other patches - these are usually called “abstractions” (see -2.8.1. Abstractions). Note that some of the +2.8.1. Abstractions). Note that some of the externals in “extra” are abstractions (for instance, [rev1~] or [hilbert~]). Like any other Pd patch, an abstraction may contain any kind of objects (internals, compiled externals and even other abstractions). @@ -428,7 +428,7 @@

    4.3.1. Where to include externals and GUI pl search paths (under the 'Path' tab in Preferences), see figure below.
    - Preferences + Preferences
    Fig. 4.3.1 The Path preferences with a few user added paths
    @@ -472,7 +472,7 @@

    4.3.1. Where to include externals and GUI pl
    • Application-specific: /$PdPath/Contents/Resources/extra - this is inside the Pd Application (like Pd-0.49-1 in ~/Applications); right click it and -choose "Show Package Contents", then navigate to "Resources/extra". +choose "Show Package Contents", then navigate to "extra".
    • User-specific: ~/Library/Pd (/Users/user_name/Library/Pd)
    • Global: /Library/Pd @@ -515,7 +515,7 @@

      4.3.2. How to download externals and GUI plu all options.
      - deken install + deken install
      Fig. 4.3.2 Installing external libraries from 'deken'
      @@ -525,7 +525,7 @@

      4.3.2. How to download externals and GUI plu separating the search entries with commas.
      - installing multiple libraries + installing multiple libraries
      Fig. 4.3.3 Installing multiple libraries at once
      @@ -534,7 +534,7 @@

      4.3.2. How to download externals and GUI plu manager with a prompt search for the missing object ready to go.
      - searching object for creation error + searching object for creation error
      Fig. 4.3.4 Searching object in the plugin manager via the console window error
      @@ -544,14 +544,14 @@

      4.3.2. How to download externals and GUI plu for the plugin manager. For macOS these menus are on the top bar.
      - plugin manager menus + plugin manager menus
      Fig. 4.3.5 The plugin manager's menus

      And the plugin manager's preferences are as follows:

      - deken preferences + deken preferences
      Fig. 4.3.6 The plugin manager's preferences
      @@ -675,11 +675,11 @@
      4.4.2.2. Startup
      on startup". This is where you can manually and permanently load single binary pack libraries. But since they're only needed during startup, you need to restart Pd so this takes effect. The startup is also used for configuring -Pd in many ways, see 3.4.1 Startup flags for +Pd in many ways, see 3.4.1 Startup flags for details.
      - startup preferences + startup preferences
      Fig. 4.4.1 The Startup preferences with library binaries to load
      @@ -698,7 +698,7 @@

      4.4.2.2. Startup
      of loading cyclone.
      - lib print + lib print
      Fig. 4.4.2 Library loading printout
      @@ -716,7 +716,7 @@

      4.4.3. Load using slash declarations - slash declaration + slash declaration
      Fig. 4.4.3 An external object with a slash declaration
      @@ -853,9 +853,9 @@

      4.6. Search order in Pd for objects and files diff --git a/doc/1.manual/x5.htm b/doc/1.manual/resources/chapter5.htm similarity index 99% rename from doc/1.manual/x5.htm rename to doc/1.manual/resources/chapter5.htm index 6baf1227..d8eaf61d 100644 --- a/doc/1.manual/x5.htm +++ b/doc/1.manual/resources/chapter5.htm @@ -4,19 +4,19 @@ Pd Manual - Chapter 5: Current status - - + +
      - +

      Chapter 5: Current status

      @@ -2384,9 +2384,9 @@

      5.1. Release notes

      diff --git a/doc/1.manual/x6.htm b/doc/1.manual/resources/chapter6.htm similarity index 98% rename from doc/1.manual/x6.htm rename to doc/1.manual/resources/chapter6.htm index bdd67558..451ce26c 100644 --- a/doc/1.manual/x6.htm +++ b/doc/1.manual/resources/chapter6.htm @@ -4,19 +4,19 @@ Pd Manual - Chapter 6: Building Pd from source - - + +
      - +

      Chapter 6: Building Pd from source

      @@ -409,7 +409,7 @@

      6.5. Building Pd for macOS

      This builds Pd-#.##.#.app in the Pd source directory which can be then be double-clicked and/or copied to /Applications. For more info & options regarding the Pd .app bundle, -see 6.5.1. macOS app bundle. +see 6.5.1. macOS app bundle.

      If you want to have both the Pd application and use Pd from the commandline, add command aliases to the binaries inside the .app to your ~/.bash_profile:

      @@ -800,7 +800,7 @@

      6.6. Building Pd for Microsoft Windows

      ./configure --disable-mmio -

      Note: Because of license restrictions, Pd cannot distribute the ASIO SDK source files. If you want to build Pd with ASIO support, see 6.6.4 Windows ASIO support for further instructions.

      +

      Note: Because of license restrictions, Pd cannot distribute the ASIO SDK source files. If you want to build Pd with ASIO support, see 6.6.4 Windows ASIO support for further instructions.

      Once built Pd is built, you can either:

      diff --git a/doc/2.control.examples/02.editing.pd b/doc/2.control.examples/02.editing.pd index 27bc8ad7..cc31ae1a 100644 --- a/doc/2.control.examples/02.editing.pd +++ b/doc/2.control.examples/02.editing.pd @@ -22,7 +22,7 @@ #X obj 101 130 pdcontrol; #X msg 101 105 dir; #X text 205 94 this window opens the html manual link via the [pdcontrol] object., f 25; -#X msg 101 159 browse \$1/../1.manual/x2.htm; +#X msg 101 159 browse \$1/../1.manual/resources/chapter2.htm; #X connect 0 0 3 0; #X connect 2 0 5 0; #X connect 3 0 2 0; diff --git a/doc/4.data.structures/01.scalars.pd b/doc/4.data.structures/01.scalars.pd index 007a4aba..cf7b1e61 100644 --- a/doc/4.data.structures/01.scalars.pd +++ b/doc/4.data.structures/01.scalars.pd @@ -41,7 +41,6 @@ #X connect 5 0 1 0; #X restore 340 444 pd html-reference; #X text 363 414 <-- Open Pd's manual index; -#X text 44 413 Besides checking this tutorial and the help files of the objects \, take a look at section 2.9 (theory of operation / Data Structures) for more information., f 39; #X text 28 12 This patch shows a simple data window with two graphical objects in it. This kind of object is called a "scalar" and its data structures and appearances are defined by the "template1" subpatch. A single template is used to create the two objects \, which have a triangular shape., f 77; #N canvas 176 126 1015 508 template1 0; #X obj 104 99 struct template1 float x float y float z float q; @@ -60,4 +59,5 @@ #X restore 213 343 pd template1; #X text 28 116 When the data window is locked (not in edit mode) you can drag the apex of either triangle up or down to change the altitude (you should see the cursor change when dragging is possible and why this happens is explained in the "template1" subpatch.) You can also right click and ask for properties \, so you can see the Data Structures of the selected scalar \, you can also change values in the properties window. In edit (unlocked) mode \, you can move the entire triangles around \, or cut \, copy \, and paste them., f 77; #X text 28 222 Scalars are described by "templates" \, which are defined in [struct] objects inside a given subwindow. In this case \, the subwindow is "template1" but it could have any other name. The template in [struct] describes what form the data take and how it is shown. It's possible to mix data of many different templates in the same collection \, but each template needs its own distinct subwindow. The data is displayed in the [pd data1] subpatch., f 77; +#X text 44 413 Besides checking this tutorial and the help files of the objects \, take a look at section 2.1 (theory of operation / Data Structures) for more information., f 39; #X connect 4 0 5 0; diff --git a/doc/5.reference/declare-help.pd b/doc/5.reference/declare-help.pd index 8be96fc1..dd65d1e7 100644 --- a/doc/5.reference/declare-help.pd +++ b/doc/5.reference/declare-help.pd @@ -1,4 +1,4 @@ -#N canvas 148 35 1137 665 12; +#N canvas 148 38 1137 665 12; #X declare; #X declare; #X declare -path path1 -path path2; @@ -17,12 +17,12 @@ #X obj 101 190 pdcontrol; #X obj 101 130 pdcontrol; #X msg 101 105 dir; -#X msg 101 159 browse \$1/../1.manual/x4.htm; #X text 205 94 this window opens the html manual link via the [pdcontrol] object., f 25; +#X msg 101 159 browse \$1/../1.manual/resources/chapter4.htm; #X connect 0 0 3 0; -#X connect 2 0 4 0; +#X connect 2 0 5 0; #X connect 3 0 2 0; -#X connect 4 0 1 0; +#X connect 5 0 1 0; #X restore 708 424 pd open-manual; #X msg 917 517 \; pd compatibility \$1; #X msg 917 456 0.46; diff --git a/doc/Makefile.am b/doc/Makefile.am index a573c29b..2e12666e 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -136,12 +136,12 @@ nobase_dist_libpd_DATA = \ ./1.manual/resources/4.4.2.png \ ./1.manual/resources/4.4.3.png \ ./1.manual/index.htm \ - ./1.manual/x1.htm \ - ./1.manual/x2.htm \ - ./1.manual/x3.htm \ - ./1.manual/x4.htm \ - ./1.manual/x5.htm \ - ./1.manual/x6.htm \ + ./1.manual/resources/chapter1.htm \ + ./1.manual/resources/chapter2.htm \ + ./1.manual/resources/chapter3.htm \ + ./1.manual/resources/chapter4.htm \ + ./1.manual/resources/chapter5.htm \ + ./1.manual/resources/chapter6.htm \ ./2.control.examples/00.INTRO.txt \ ./2.control.examples/01.PART1.hello.pd \ ./2.control.examples/02.editing.pd \ From 341825006d8eea227899178c96bda0a923266585 Mon Sep 17 00:00:00 2001 From: porres Date: Tue, 23 Jul 2024 21:11:31 -0300 Subject: [PATCH 51/89] add an example in control examples of a 'graph on parent' abstraction and subpatch closes https://github.com/pure-data/pddp/issues/223 --- doc/2.control.examples/12.PART2.subpatch.pd | 74 ++++++++++++++------- doc/2.control.examples/dollarsign.pd | 7 +- doc/2.control.examples/dollarsign2.pd | 17 +++-- doc/2.control.examples/gop-abs.pd | 18 +++++ doc/2.control.examples/sendnumber.pd | 20 ++---- doc/Makefile.am | 1 + 6 files changed, 84 insertions(+), 53 deletions(-) create mode 100644 doc/2.control.examples/gop-abs.pd diff --git a/doc/2.control.examples/12.PART2.subpatch.pd b/doc/2.control.examples/12.PART2.subpatch.pd index a09595d3..9f70d714 100644 --- a/doc/2.control.examples/12.PART2.subpatch.pd +++ b/doc/2.control.examples/12.PART2.subpatch.pd @@ -1,8 +1,8 @@ -#N canvas 385 62 878 468 12; -#X floatatom 313 410 4 0 0 0 - - - 0; +#N canvas 355 84 901 701 12; +#X floatatom 324 627 4 0 0 0 - - - 0; #N canvas 685 165 422 119 sample-subpatch 0; #X text 39 43 this is a subpatch of the main patch.; -#X restore 124 112 pd sample-subpatch; +#X restore 105 124 pd sample-subpatch; #N canvas 566 198 644 307 eager-adder 0; #X obj 67 46 inlet; #X obj 123 46 inlet; @@ -17,30 +17,54 @@ #X connect 3 0 4 0; #X connect 3 1 4 1; #X connect 4 0 2 0; -#X restore 183 229 pd eager-adder; -#X floatatom 183 202 0 0 0 0 - - - 0; -#X floatatom 278 202 0 0 0 0 - - - 0; -#X floatatom 183 257 0 0 0 0 - - - 0; -#X obj 84 407 sendnumber 45 cookies; -#X obj 538 67 sendnumber 67 pretzels; -#X floatatom 740 87 4 0 0 0 - - - 0; -#X text 528 345 Note that "\$1" \, etc \, has a different meaning in object boxes. Open one of the "sendnumber" abstractions for details., f 42; -#X text 527 250 If you change one copy of an abstraction the change isn't automatically made on any other copies. You must keep track \, save the changes \, and cause Pd to reload the other copies (for example \, by closing and reopening the containing patch.), f 42; -#X obj 313 383 r cookies; -#X obj 740 60 r pretzels; -#X text 526 129 There is a separate file in this directory named "sendnumber.pd" which is loaded every time you type "sendnumber" in a box. Click on a "sendnumber" box above to see it. You can make changes in the subpatch and save them. The changes will be saved back to sendnumber.pd and not as part of this (containing) patch., f 43; -#X text 52 111 click --> to open, f 9; -#X text 259 111 <-- you can give the window; -#X text 288 127 a name as an argument; -#X text 34 162 Click on the one below to see how you give a subpatch inlets and outlets., f 63; -#X text 34 16 You can nest entire windows inside Pd boxes (and so on \, as deep as you wish.) There are two different ways to do it. First \, if you just want to add a room to the house \, so to speak \, type "pd" into an object box. If you click on the box (in run mode) the subwindow appears., f 63; -#X text 37 290 There is also a facility for making many copies of a patch which track any changes you make in the original. This subpatch type is called an abstraction. For example \, here's a simple abstraction that sends a number to a "receive" on command:, f 65; -#X obj 84 374 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 538 34 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X restore 91 350 pd eager-adder; +#X floatatom 91 323 5 0 0 0 - - - 0; +#X floatatom 186 323 5 0 0 0 - - - 0; +#X floatatom 91 378 6 0 0 0 - - - 0; +#X obj 112 623 sendnumber 45 cookies; +#X obj 515 58 sendnumber 67 pretzels; +#X floatatom 727 72 4 0 0 0 - - - 0; +#X text 503 348 Note that "\$1" \, etc \, has a different meaning in object boxes. Open one of the "sendnumber" abstractions for details., f 45; +#X text 503 246 If you change one copy of an abstraction the change isn't automatically made on any other copies. You must keep track \, save the changes \, and cause Pd to reload the other copies (for example \, by closing and reopening the containing patch.), f 45; +#X obj 324 599 r cookies; +#X obj 727 45 r pretzels; +#X text 503 116 There is a separate file in this directory named "sendnumber.pd" which is loaded every time you type "sendnumber" in a box. Click on a "sendnumber" box above to see it. You can make changes in the subpatch and save them. The changes will be saved back to sendnumber.pd and not as part of this (containing) patch., f 45; +#X text 33 123 click --> to open, f 9; +#X text 240 123 <-- you can give the window; +#X text 269 139 a name as an argument; +#X text 51 23 You can nest entire windows inside Pd boxes (and so on \, as deep as you wish.) There are two different ways to do it. First \, if you just want to add a room to the house \, so to speak \, type "pd" into an object box. If you click on the box (in run mode) the subwindow appears., f 56; +#X text 54 470 There is also a facility for making many copies of a patch which track any changes you make in the original. This subpatch type is called an abstraction. For example \, here's a simple abstraction that sends a number to a "receive" on command:, f 57; +#X obj 112 590 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 515 25 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X listbox 569 625 8 0 0 0 - - - 0; +#X floatatom 299 410 6 0 0 0 - - - 0; +#N canvas 566 198 632 327 eager-adder-2 0; +#X obj 225 212 outlet; +#X obj 225 125 t b f; +#X obj 225 180 +; +#X floatatom 110 130 5 0 0 0 - - - 0; +#X floatatom 163 130 5 0 0 0 - - - 0; +#X floatatom 137 173 5 0 0 0 - - - 0; +#X connect 1 0 2 0; +#X connect 1 1 2 1; +#X connect 2 0 0 0; +#X connect 2 0 5 0; +#X connect 3 0 2 0; +#X connect 4 0 1 0; +#X coords 0 -1 1 1 109 102 1 100 100; +#X restore 299 299 pd eager-adder-2; +#X text 677 562 <-- right click and choose "open", f 18; +#X text 51 192 Click on the one below to the see how you give a subpatch inlets and outlets. Subpatches can also displays graphs on the parent window. This way you can click and interact with GUI objects. Right click on the subpatch below to the right and choose "open" to check it out. You can turn a regular subpatch into a "Graph on Parent" one by accessing the properties on right click.; +#X text 503 408 Abstractions can also "Graph on Parent" \, as the one below. This example below also makes use of a feature in the [pdcontrol] object to load arguments. Open it to check it out., f 45; +#X msg 569 499 1 2 3 4; +#X obj 569 532 gop-abs 17 1 hi; #X connect 2 0 5 0; #X connect 3 0 2 0; #X connect 4 0 2 1; #X connect 11 0 0 0; #X connect 12 0 8 0; -#X connect 20 0 6 0; -#X connect 21 0 7 0; +#X connect 19 0 6 0; +#X connect 20 0 7 0; +#X connect 23 0 22 0; +#X connect 27 0 28 0; +#X connect 28 0 21 0; diff --git a/doc/2.control.examples/dollarsign.pd b/doc/2.control.examples/dollarsign.pd index e08dd1bc..c079bfe3 100644 --- a/doc/2.control.examples/dollarsign.pd +++ b/doc/2.control.examples/dollarsign.pd @@ -1,4 +1,4 @@ -#N canvas 559 33 613 599 12; +#N canvas 559 38 612 582 12; #X obj 200 54 inlet; #X obj 200 81 s \$1-a; #X obj 335 81 s \$1-b; @@ -16,7 +16,6 @@ #X obj 459 319 s \$0-d; #X obj 460 349 r \$0-d; #X text 96 17 This is an abstraction used in example 13 \, "locality".; -#X text 343 556 updated for Pd version 0.52; #X obj 77 454 float \$0; #X msg 77 485 \; \$1-d 10; #X obj 77 425 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; @@ -32,5 +31,5 @@ #X connect 11 0 8 0; #X connect 12 0 14 0; #X connect 15 0 13 0; -#X connect 18 0 19 0; -#X connect 20 0 18 0; +#X connect 17 0 18 0; +#X connect 19 0 17 0; diff --git a/doc/2.control.examples/dollarsign2.pd b/doc/2.control.examples/dollarsign2.pd index 068eee0b..b51c9a2e 100644 --- a/doc/2.control.examples/dollarsign2.pd +++ b/doc/2.control.examples/dollarsign2.pd @@ -26,7 +26,6 @@ #X obj 644 380 list prepend six; #X obj 644 410 list trim; #X obj 644 440 print; -#X text 701 496 updated for Pd version 0.52; #X listbox 644 353 15 0 0 0 - - - 0; #X floatatom 138 465 5 0 0 0 - - - 0; #X text 37 40 In object boxes \, dollar signs refer to the abstraction's creation arguments. In Messages \, they change dynamically:; @@ -41,7 +40,7 @@ #X connect 4 0 3 0; #X connect 6 0 9 0; #X connect 7 0 8 0; -#X connect 10 0 29 0; +#X connect 10 0 28 0; #X connect 11 0 13 0; #X connect 14 0 16 0; #X connect 15 0 16 1; @@ -50,12 +49,12 @@ #X connect 21 0 14 0; #X connect 21 1 15 0; #X connect 22 0 23 0; -#X connect 23 0 28 0; +#X connect 23 0 27 0; #X connect 24 0 25 0; #X connect 25 0 26 0; -#X connect 28 0 24 0; -#X connect 29 0 11 0; -#X connect 34 0 7 0; -#X connect 35 0 6 0; -#X connect 36 0 10 0; -#X connect 37 0 21 0; +#X connect 27 0 24 0; +#X connect 28 0 11 0; +#X connect 33 0 7 0; +#X connect 34 0 6 0; +#X connect 35 0 10 0; +#X connect 36 0 21 0; diff --git a/doc/2.control.examples/gop-abs.pd b/doc/2.control.examples/gop-abs.pd new file mode 100644 index 00000000..3df37e63 --- /dev/null +++ b/doc/2.control.examples/gop-abs.pd @@ -0,0 +1,18 @@ +#N canvas 601 234 727 394 12; +#X obj 107 23 inlet; +#X obj 107 348 outlet; +#X obj 40 113 pdcontrol; +#X msg 40 85 args; +#X obj 40 58 loadbang; +#X text 246 276 The properties window can also set the size of the graph in the “Range and Size” section.; +#X text 246 183 This is an abstraction with "graph on parent". Right click into an empty spot on the patch and choose "properties" as one of the ways to access this option. Another way is right clicking on the abstraction in the parent window. Note that this abstraction is also set to hide its name and arguments in the parent patch.; +#X listbox 107 196 8 0 0 0 - - - 16; +#X text 246 85 Check the help file of [pdcontrol] object that offers an alternative way to load arguments. This abstraction has the arguments "17 1 hi" as you can see on the top of the patch window. The advantage is that this allows you to manage a variable number of arguments \, so it can get lists of any size.; +#X text 120 156 Graph on parent, f 8; +#X text 111 112 <-----------------; +#X connect 0 0 7 0; +#X connect 2 0 7 0; +#X connect 3 0 2 0; +#X connect 4 0 3 0; +#X connect 7 0 1 0; +#X coords 0 -1 1 1 100 80 2 100 150; diff --git a/doc/2.control.examples/sendnumber.pd b/doc/2.control.examples/sendnumber.pd index 71fd0e27..13ce909f 100644 --- a/doc/2.control.examples/sendnumber.pd +++ b/doc/2.control.examples/sendnumber.pd @@ -1,20 +1,10 @@ -#N canvas 325 92 664 335 12; +#N canvas 325 92 664 302 12; #X obj 62 82 inlet; #X obj 62 110 float \$1; #X obj 62 138 send \$2; -#X text 180 223 For obvious reasons you might not want to call a patch -as an abstraction from itself., f 55; -#X text 177 182 In this case \$1 is a number you can specify and \$2 -is a "send" destination.; -#X text 411 287 updated for Pd version 0.26; -#X text 180 102 When you call an abstraction by typing \, say \, "sendnumber -1 x" in an object box. the subpatch can access the values of the creation -arguments (1 and x) as "\$1" and "\$2" inside object boxes. Typing -\$1 inside a message box has a different meaning (see the message box -help window.), f 61; -#X text 181 30 This window is used by 12.PART2.subpatch.pd to demonstrate -the abstraction mechanism in Pd. If you've opened this window directly -\, you might also want to open the other one to see how it's used. -; +#X text 180 223 For obvious reasons you might not want to call a patch as an abstraction from itself., f 55; +#X text 177 182 In this case \$1 is a number you can specify and \$2 is a "send" destination.; +#X text 181 30 This window is used by 12.PART2.subpatch.pd to demonstrate the abstraction mechanism in Pd. If you've opened this window directly \, you might also want to open the other one to see how it's used.; +#X text 180 102 When you call an abstraction by typing \, say \, "sendnumber 1 x" in an object box. The subpatch can access the values of the creation arguments (1 and x) as "\$1" and "\$2" inside object boxes. Typing \$1 inside a message box has a different meaning (see the message box help window.), f 61; #X connect 0 0 1 0; #X connect 1 0 2 0; diff --git a/doc/Makefile.am b/doc/Makefile.am index 2e12666e..b9505704 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -170,6 +170,7 @@ nobase_dist_libpd_DATA = \ ./2.control.examples/24.loops.pd \ ./2.control.examples/dollarsign.pd \ ./2.control.examples/dollarsign2.pd \ + ./2.control.examples/gop-abs.pd \ ./2.control.examples/sendnumber.pd \ ./3.audio.examples/A00.intro.pd \ ./3.audio.examples/A01.sinewave.pd \ From a0a610a4c4ee9fcda6ad63df7790854753f00bb1 Mon Sep 17 00:00:00 2001 From: porres Date: Fri, 26 Jul 2024 14:40:41 -0300 Subject: [PATCH 52/89] add bob~ to audio examples closes https://github.com/pure-data/pddp/issues/244 other changes in other files are merely cosmetics --- doc/1.manual/resources/chapter1.htm | 21 ++- doc/3.audio.examples/H04.filter.sweep.pd | 92 +++++----- doc/3.audio.examples/H10.measurement.pd | 10 +- doc/3.audio.examples/H16.adsr.filter.text.pd | 92 +++++----- doc/3.audio.examples/J08.classicsynth.pd | 68 ++++---- doc/5.reference/slop~-help.pd | 166 +++++++++---------- doc/5.reference/soundfiler-help.pd | 20 +-- doc/8.topics/compander-limiter.htm | 4 +- doc/8.topics/expr.htm | 38 ++--- doc/8.topics/fudi.htm | 49 ++++-- doc/8.topics/slop-tilde.htm | 22 +-- extra/bob~/bob~-help.pd | 16 +- 12 files changed, 325 insertions(+), 273 deletions(-) diff --git a/doc/1.manual/resources/chapter1.htm b/doc/1.manual/resources/chapter1.htm index 16b22a0a..59ead5a3 100644 --- a/doc/1.manual/resources/chapter1.htm +++ b/doc/1.manual/resources/chapter1.htm @@ -20,13 +20,26 @@

      Chapter 1: Introduction

      -

      This is the official HTML manual for Pd (Pure Data), a patchable +

      This is the official HTML manual for Pure Data, a patchable computer music environment for audio analysis, synthesis and digital signal processing in real time (aka "Live Electronics"). Pd can be extended with third-party libraries for additional computer music -features, multimedia capabilities and more. The latest version of this -manual is found online on -http://msp.ucsd.edu/software.html, along with the downloads of the +features, multimedia capabilities and more, making Pd a programming +environment also for video, graphics, interfacing with arduino, etc. + +

      Pd is commonly used for live music performance, VeeJaying, sound effects, +composition, audio analysis, interfacing with sensors, using cameras, +controlling robots, designing apps, procedural audio for games or even +interacting with websites. Because all of these various media are handled as +digital data within the program, many fascinating opportunities for +cross-synthesis between them exist. Sound can be used to manipulate video, +which could then be streamed over the internet to another computer which might +analyze that video and use it to control a motor-driven installation and whatnot. + +

      The latest version of this manual is found online +at +http://msp.ucsd.edu/software.html, +along with the downloads of the latest Pd releases.

      1.1. Guide to Pd's documentation

      diff --git a/doc/3.audio.examples/H04.filter.sweep.pd b/doc/3.audio.examples/H04.filter.sweep.pd index acaec49a..a4664208 100644 --- a/doc/3.audio.examples/H04.filter.sweep.pd +++ b/doc/3.audio.examples/H04.filter.sweep.pd @@ -1,54 +1,60 @@ -#N canvas 553 38 529 640 12; +#N canvas 553 38 697 632 12; #X declare -stdpath ./; -#X floatatom 110 217 5 0 150 0 - \$0-pitch - 0; -#X obj 110 264 phasor~; -#X obj 170 432 +~; -#X floatatom 188 407 5 0 100 0 - \$0-offset - 0; -#X floatatom 170 303 5 0 0 0 - \$0-speed - 0; -#X floatatom 188 354 5 0 100 0 - \$0-depth - 0; -#X floatatom 183 487 5 0 1000 0 - \$0-q - 0; -#X obj 158 512 vcf~; -#X text 236 326 LFO for sweep; -#X text 206 431 add base to sweep; -#X text 215 461 convert to Hz.; -#X obj 158 553 output~; -#X obj 110 240 mtof; -#X obj 170 325 phasor~; -#X obj 170 379 *~; -#X text 68 150 Note the different effects of negative and positive sweep speeds., f 53; -#X obj 170 461 mtof~; -#X text 68 69 If you want actively changing center frequencies \, use [vcf~] instead of [bp~]. The [vcf~] module takes an audio signal to set center frequency (Q is still set by messages though) \, which makes it computationally somewhat more expensive than [bp~]., f 53; +#X floatatom 193 252 5 0 150 0 - \$0-pitch - 0; +#X obj 193 320 phasor~; +#X obj 352 388 +~; +#X floatatom 370 363 5 0 100 0 - \$0-offset - 0; +#X floatatom 352 252 5 0 0 0 - \$0-speed - 0; +#X floatatom 370 310 5 0 100 0 - \$0-depth - 0; +#X floatatom 365 443 5 0 1000 0 - \$0-q - 0; +#X text 418 282 LFO for sweep; +#X text 388 387 add base to sweep; +#X text 397 417 convert to Hz.; +#X obj 340 532 output~; +#X obj 193 286 mtof; +#X obj 352 281 phasor~; +#X obj 352 335 *~; +#X obj 352 417 mtof~; #N canvas 706 247 304 346 init 0; #X obj 85 23 loadbang; #X obj 85 47 bng 19 250 50 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000; #X obj 85 76 f \$0; -#X msg 85 100 \; \$1-pitch 48 \; \$1-speed -2 \; \$1-depth 27 \; \$1-offset 56 \; \$1-q 2; #X obj 86 277 declare -stdpath ./; #X text 66 209 This subpatch initializes the patch and loads values in number boxes., f 27; +#X msg 85 100 \; \$1-pitch 36 \; \$1-speed -2 \; \$1-depth 27 \; \$1-offset 56 \; \$1-q 3; #X connect 0 0 1 0; #X connect 1 0 2 0; -#X connect 2 0 3 0; -#X restore 338 567 pd init; -#X text 226 485 <-- Q (selectivity); -#X text 231 407 <-- base center frequency; -#X text 230 355 <-- sweep depth; -#X text 212 302 <-- sweep speed; -#X text 156 217 <-- pitch; +#X connect 2 0 5 0; +#X restore 520 523 pd init; +#X text 408 441 <-- Q (selectivity); +#X text 413 363 <-- base center frequency; +#X text 412 311 <-- sweep depth; +#X text 394 251 <-- sweep speed; #X obj 45 22 cnv 5 5 25 empty empty Sweeping\ Filters 15 13 0 16 #dfdfdf #202020 0; -#X obj 110 350 -~ 1; -#X obj 110 326 *~ 2; -#X text 176 257 [phasor~] is turned to a sawtooth like oscillator, f 25; -#X connect 0 0 12 0; -#X connect 1 0 26 0; -#X connect 2 0 16 0; +#X obj 193 382 -~ 1; +#X obj 193 352 *~ 2; +#X text 81 324 [phasor~] is turned to a sawtooth like oscillator, f 14; +#X obj 193 532 output~; +#X obj 340 488 bob~; +#X obj 193 491 vcf~; +#X text 120 251 pitch -->; +#X text 68 69 If you want actively changing center frequencies \, use [vcf~] or [bob~] instead of [bp~]. The [vcf~] module takes an audio signal to set center frequency (Q is still set by messages though) \, which makes it computationally somewhat more expensive than [bp~] and has two outputs \, the left behaves as bandpass like [bp~] and the right output is a nit more like a resonant lowpass filter., f 80; +#X text 68 147 For a true resonant lowpass filter \, check [bob~] \, which is even more expensive and emulates the sound of the moog filter. It takes a signal to change the resonant frequency as well as the 'Q' factor. Check the help file of both. Note the different effects of negative and positive sweep speeds., f 80; +#X connect 0 0 11 0; +#X connect 1 0 22 0; +#X connect 2 0 14 0; #X connect 3 0 2 1; -#X connect 4 0 13 0; -#X connect 5 0 14 1; -#X connect 6 0 7 2; -#X connect 7 0 11 0; -#X connect 12 0 1 0; -#X connect 13 0 14 0; -#X connect 14 0 2 0; -#X connect 16 0 7 1; -#X connect 25 0 7 0; -#X connect 26 0 25 0; +#X connect 4 0 12 0; +#X connect 5 0 13 1; +#X connect 6 0 25 2; +#X connect 6 0 26 2; +#X connect 11 0 1 0; +#X connect 12 0 13 0; +#X connect 13 0 2 0; +#X connect 14 0 25 1; +#X connect 14 0 26 1; +#X connect 21 0 25 0; +#X connect 21 0 26 0; +#X connect 22 0 21 0; +#X connect 25 0 10 0; +#X connect 26 0 24 0; diff --git a/doc/3.audio.examples/H10.measurement.pd b/doc/3.audio.examples/H10.measurement.pd index f640e279..dfabeddd 100644 --- a/doc/3.audio.examples/H10.measurement.pd +++ b/doc/3.audio.examples/H10.measurement.pd @@ -34,7 +34,6 @@ #X restore 350 410 pd init; #X text 55 71 You can use the [filter-graph1] and [filter-graph2] abstractions as shown to test filters. Connect them as shown with a filter between them. Try varying the parameters and/or substituting other filters., f 51; #X text 55 139 [filter-graph1] takes as arguments the number of points to graph and the frequency range \, while [filter-graph2] takes as arguments the name of a table to hold the (frequency dependent) gain \, and another \, if specified \, for the phase., f 51; -#X text 55 225 You can edit this patch to replace [bp~] with any other filter you're curious about., f 51; #X text 505 398 0; #X text 517 212 0 Hz; #X text 700 212 44100 Hz; @@ -43,12 +42,13 @@ #X text 517 417 0 Hz; #X text 700 417 44100 Hz; #X obj 29 25 cnv 5 5 25 empty empty Measuring\ Filter\ Frequency/Phase\ Response 15 13 0 16 #dfdfdf #202020 0; +#X text 55 225 You can edit this patch to replace [bp~] with any other filter you're curious about. Try \, for instance \, [vcf~] and [bob~]., f 51; #X connect 5 0 10 0; -#X connect 6 0 24 0; +#X connect 6 0 23 0; #X connect 8 0 11 1; #X connect 9 0 11 2; #X connect 10 0 6 0; #X connect 10 1 11 0; -#X connect 10 1 24 1; -#X connect 10 2 24 2; -#X connect 11 0 24 3; +#X connect 10 1 23 1; +#X connect 10 2 23 2; +#X connect 11 0 23 3; diff --git a/doc/3.audio.examples/H16.adsr.filter.text.pd b/doc/3.audio.examples/H16.adsr.filter.text.pd index 98fa25f1..4809a8fc 100644 --- a/doc/3.audio.examples/H16.adsr.filter.text.pd +++ b/doc/3.audio.examples/H16.adsr.filter.text.pd @@ -37,9 +37,8 @@ #X obj 641 410 r release2; #X obj 81 470 tabosc4~ array1; #X floatatom 241 395 4 0 0 0 - - - 0; -#X obj 229 598 vcf~; -#X floatatom 343 530 4 0 0 0 - - - 0; -#X obj 343 505 r q; +#X floatatom 292 560 4 0 5 0 - - - 0; +#X obj 292 535 r q; #X obj 310 430 / 69.23; #X obj 241 420 mtof; #X obj 241 445 sqrt; @@ -79,15 +78,16 @@ #X obj 680 638 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; #X msg 636 583 1; #X msg 680 608 0; -#X text 62 66 This is an analog-synth sound made using a wavetable oscillator and a [vcf~] object. Unlike the "floyd" example earlier \, we use a [text] object to do the sequencing. This can also be adapted to make a keyboard synth., f 54; #X text 62 145 The [text definfe] stores a sequence that is read by [text sequence]. The sequence contains four "note" messages and a 'bang' message at the end that restarts the loop. The "note" messages are translated into a pitch change and triggers for the ADSRs., f 54; #N canvas 0 0 450 300 (subpatch) 0; #X array array1 67 float 1; #A 0 0 0 0 0 0.714286 0.742857 0.757143 0.771429 0.778571 0.785714 0.785714 0.785714 0.785714 0.790476 0.795238 0.614286 0.585714 0.442857 0.271429 -0.128571 -0.142857 -0.157143 -0.171429 -0.642857 -0.528571 -0.614286 -0.685714 -0.828571 -0.828571 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.557143 0.571429 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 66 -1 200 140 1; #X restore 404 549 graph; -#X connect 0 0 63 0; -#X connect 1 0 37 0; +#X obj 229 598 bob~; +#X text 62 66 This is an analog-synth sound made using a wavetable oscillator and a [bob~] object. Unlike the "floyd" example earlier \, we use a [text] object to do the sequencing. This can also be adapted to make a keyboard synth., f 54; +#X connect 0 0 62 0; +#X connect 1 0 73 0; #X connect 2 0 3 0; #X connect 2 0 3 1; #X connect 3 0 4 0; @@ -96,60 +96,60 @@ #X connect 5 0 7 0; #X connect 6 0 35 0; #X connect 7 0 6 0; -#X connect 8 0 63 1; +#X connect 8 0 62 1; #X connect 9 0 8 0; -#X connect 10 0 63 2; +#X connect 10 0 62 2; #X connect 11 0 10 0; -#X connect 12 0 63 3; +#X connect 12 0 62 3; #X connect 13 0 12 0; -#X connect 14 0 63 4; -#X connect 15 0 63 5; +#X connect 14 0 62 4; +#X connect 15 0 62 5; #X connect 16 0 14 0; #X connect 17 0 15 0; #X connect 18 0 23 0; -#X connect 19 0 70 0; -#X connect 19 0 52 0; +#X connect 19 0 69 0; +#X connect 19 0 51 0; #X connect 19 1 20 0; #X connect 21 0 22 0; -#X connect 22 0 52 1; +#X connect 22 0 51 1; #X connect 23 0 19 0; -#X connect 24 0 61 0; -#X connect 25 0 40 0; -#X connect 26 0 61 2; -#X connect 27 0 61 3; -#X connect 28 0 61 4; -#X connect 29 0 61 5; +#X connect 24 0 60 0; +#X connect 25 0 39 0; +#X connect 26 0 60 2; +#X connect 27 0 60 3; +#X connect 28 0 60 4; +#X connect 29 0 60 5; #X connect 30 0 25 0; #X connect 31 0 26 0; #X connect 32 0 27 0; #X connect 33 0 28 0; #X connect 34 0 29 0; #X connect 35 0 1 1; -#X connect 36 0 41 0; -#X connect 37 0 50 0; -#X connect 38 0 37 2; -#X connect 39 0 38 0; -#X connect 40 0 61 1; +#X connect 36 0 40 0; +#X connect 37 0 73 2; +#X connect 38 0 37 0; +#X connect 39 0 60 1; +#X connect 40 0 41 0; #X connect 41 0 42 0; -#X connect 42 0 43 0; -#X connect 43 0 48 0; -#X connect 44 0 36 0; -#X connect 45 0 46 0; -#X connect 45 0 46 1; -#X connect 46 0 37 1; -#X connect 47 0 48 1; -#X connect 48 0 45 0; -#X connect 48 0 45 1; -#X connect 52 0 71 0; -#X connect 53 0 56 0; -#X connect 57 0 56 0; -#X connect 58 0 56 0; -#X connect 59 0 60 0; -#X connect 60 0 58 0; -#X connect 61 0 47 0; -#X connect 63 0 2 0; -#X connect 64 0 53 0; -#X connect 67 0 64 0; +#X connect 42 0 47 0; +#X connect 43 0 36 0; +#X connect 44 0 45 0; +#X connect 44 0 45 1; +#X connect 45 0 73 1; +#X connect 46 0 47 1; +#X connect 47 0 44 0; +#X connect 47 0 44 1; +#X connect 51 0 70 0; +#X connect 52 0 55 0; +#X connect 56 0 55 0; +#X connect 57 0 55 0; +#X connect 58 0 59 0; +#X connect 59 0 57 0; +#X connect 60 0 46 0; +#X connect 62 0 2 0; +#X connect 63 0 52 0; +#X connect 66 0 63 0; +#X connect 68 0 67 0; #X connect 69 0 68 0; -#X connect 70 0 69 0; -#X connect 71 0 69 0; +#X connect 70 0 68 0; +#X connect 73 0 49 0; diff --git a/doc/3.audio.examples/J08.classicsynth.pd b/doc/3.audio.examples/J08.classicsynth.pd index 3942c5d2..ab8dc9e0 100644 --- a/doc/3.audio.examples/J08.classicsynth.pd +++ b/doc/3.audio.examples/J08.classicsynth.pd @@ -1,4 +1,4 @@ -#N canvas 533 85 569 628 12; +#N canvas 533 85 595 677 12; #X declare -stdpath ./; #N canvas 456 42 579 692 16x 0; #X obj 84 387 *~ 0.064; @@ -66,12 +66,12 @@ #X connect 26 5 24 1; #X connect 27 0 26 0; #X restore 108 224 pd 16x; -#X obj 108 331 output~; +#X obj 108 361 output~; #X obj 188 196 *~; #X obj 188 166 +~ 0.2; #X obj 188 221 *~ 2000; -#X obj 175 296 *~; -#X obj 108 292 *~; +#X obj 175 326 *~; +#X obj 108 322 *~; #X obj 108 186 mtof; #X obj 68 66 r \$0-note; #X obj 68 121 makenote 1; @@ -79,11 +79,10 @@ #X obj 372 125 tgl 19 0 empty empty empty 0 -6 0 8 #dfdfdf #000000 #000000 0 1; #X obj 372 299 s \$0-note; #X obj 372 182 random 70; -#X obj 108 256 vcf~ 3; #X floatatom 265 173 6 0 0 0 - - - 0; #X floatatom 265 221 7 0 0 0 - - - 0; #X obj 265 197 mtof; -#X obj 175 260 adsr 2 30 200 50 500; +#X obj 175 290 adsr 2 30 200 50 500; #X obj 188 141 adsr 1 10 200 50 500; #X obj 82 151 poly 1 1; #X floatatom 432 125 6 0 0 0 - - - 0; @@ -96,38 +95,41 @@ #X obj 175 108 tgl 19 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0 1; #X obj 372 242 pack f 300; #X obj 372 159 metro 500; -#X text 34 407 Now that we can make reasonably high-quality classic waveforms using upsampling \, we combine an upsampled oscillator with a [vcf~] filter and [adsr] envelopre generators to control the filter resonant frequency and the amplitude to make the classic subtractive synthesis sound. Send an [s \$0-note] object a pitch/duration pair to play a note \, wihch is sent to [makenote] to generate note ons/offs and the [poly] object is used here to make it a simple polyphonic synth. The velocity is set in [makenote] to an amplitude of "1" (note that classic VC synths did not have velocity sensitive keyboards!), f 71; -#X text 34 545 You can add controls to change the parameters [adsr] and/or [vcf~]'s "Q" parameter. The oscillators' waveforms and tuning relationship is controlled by other parameters set within the [pd 16x] subwindow., f 71; #X obj 38 17 cnv 5 5 25 empty empty The\ Classic\ Subtractive\ Synth\ Sound 15 13 0 16 #dfdfdf #202020 0; -#X connect 0 0 14 0; +#X obj 189 255 sig~ 3; +#X obj 108 286 bob~, f 7; +#X text 34 437 Now that we can make reasonably high-quality classic waveforms using upsampling \, we combine an upsampled oscillator with a [bob~] filter and [adsr] envelopre generators to control the filter resonant frequency and the amplitude to make the classic subtractive synthesis sound. Send an [s \$0-note] object a pitch/duration pair to play a note \, wihch is sent to [makenote] to generate note ons/offs and the [poly] object is used here to make it a simple polyphonic synth. The velocity is set in [makenote] to an amplitude of "1" (note that classic VC synths did not have velocity sensitive keyboards!), f 71; +#X text 34 575 You can add controls to change the parameters [adsr] and/or [bob~]'s "Q" parameter. The oscillators' waveforms and tuning relationship is controlled by other parameters set within the [pd 16x] subwindow., f 71; +#X connect 0 0 32 0; #X connect 2 0 4 0; #X connect 3 0 2 0; #X connect 3 0 2 1; -#X connect 4 0 14 1; +#X connect 4 0 32 1; #X connect 5 0 6 1; #X connect 6 0 1 0; #X connect 7 0 0 0; -#X connect 8 0 23 0; -#X connect 9 0 20 0; -#X connect 9 1 20 1; -#X connect 10 0 29 0; -#X connect 11 0 30 0; +#X connect 8 0 22 0; +#X connect 9 0 19 0; +#X connect 9 1 19 1; +#X connect 10 0 28 0; +#X connect 11 0 29 0; #X connect 13 0 10 0; -#X connect 14 0 6 0; -#X connect 15 0 17 0; -#X connect 16 0 4 1; -#X connect 17 0 16 0; -#X connect 18 0 5 0; -#X connect 18 0 5 1; -#X connect 19 0 3 0; -#X connect 20 1 7 0; -#X connect 20 2 28 0; -#X connect 21 0 30 1; -#X connect 22 0 29 1; -#X connect 23 0 9 0; -#X connect 23 1 9 2; -#X connect 25 0 12 0; -#X connect 28 0 19 0; -#X connect 28 0 18 0; -#X connect 29 0 25 0; -#X connect 30 0 13 0; +#X connect 14 0 16 0; +#X connect 15 0 4 1; +#X connect 16 0 15 0; +#X connect 17 0 5 0; +#X connect 17 0 5 1; +#X connect 18 0 3 0; +#X connect 19 1 7 0; +#X connect 19 2 27 0; +#X connect 20 0 29 1; +#X connect 21 0 28 1; +#X connect 22 0 9 0; +#X connect 22 1 9 2; +#X connect 24 0 12 0; +#X connect 27 0 18 0; +#X connect 27 0 17 0; +#X connect 28 0 24 0; +#X connect 29 0 13 0; +#X connect 31 0 32 2; +#X connect 32 0 6 0; diff --git a/doc/5.reference/slop~-help.pd b/doc/5.reference/slop~-help.pd index 1c3fc186..9e7ef132 100644 --- a/doc/5.reference/slop~-help.pd +++ b/doc/5.reference/slop~-help.pd @@ -11,9 +11,7 @@ #X obj 152 229 / 100; #X text 158 179 cutoff frequency in linear region; #X floatatom 188 256 5 0 10000 0 - - - 0; -#X text 198 206 maximum downward slew of linear region; #X text 231 246 asymptotic downward cutoff frequency (for downward slews greater than maximum), f 41; -#X text 273 287 maximum upward slew of linear region; #X text 305 332 asymptotic upward cutoff frequency (for upward slews greater than maximum), f 40; #X floatatom 260 343 5 0 10000 0 - - - 0; #X text 76 96 frequency of test oscillator; @@ -351,7 +349,7 @@ #X connect 40 0 6 0; #X connect 41 0 6 0; #X restore 701 291 pd compander-limiter; -#N canvas 392 78 880 817 slew-limiter 0; +#N canvas 522 50 880 817 slew-limiter 0; #X floatatom 134 76 6 0 1000 0 - - - 0; #X obj 134 100 t f b; #X obj 166 129 samplerate~; @@ -385,7 +383,6 @@ #X text 419 174 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. See the HTML documentation (link on main page of this patch) for details., f 61; #X floatatom 212 506 5 10 125 0 - - - 0; #X floatatom 212 598 8 0 0 0 - - - 0; -#X obj 125 628 slop~ 1e+09, f 16; #X obj 125 595 sig~; #X obj 125 465 tgl 20 0 empty empty empty 17 7 0 10 #dcdcdc #000000 #000000 0 1; #X floatatom 125 565 5 0 0 0 - - - 0; @@ -407,6 +404,7 @@ #X msg 149 527 0; #X obj 212 458 loadbang; #X text 278 590 amplitude per sample, f 11; +#X obj 125 628 slop~ 1e+09, f 16; #X connect 0 0 1 0; #X connect 1 0 3 0; #X connect 1 1 2 0; @@ -426,25 +424,25 @@ #X connect 24 0 25 2; #X connect 25 0 5 0; #X connect 26 0 25 4; -#X connect 28 0 35 0; -#X connect 29 0 30 4; -#X connect 29 0 30 2; -#X connect 30 0 40 0; -#X connect 31 0 30 0; -#X connect 32 0 33 0; -#X connect 33 0 31 0; -#X connect 35 0 37 0; -#X connect 35 1 36 0; -#X connect 36 0 37 1; -#X connect 37 0 29 0; +#X connect 28 0 34 0; +#X connect 29 0 51 4; +#X connect 29 0 51 2; +#X connect 30 0 51 0; +#X connect 31 0 32 0; +#X connect 32 0 30 0; +#X connect 34 0 36 0; +#X connect 34 1 35 0; +#X connect 35 0 36 1; +#X connect 36 0 29 0; +#X connect 37 0 38 0; #X connect 38 0 39 0; -#X connect 39 0 40 0; -#X connect 40 0 46 0; -#X connect 42 0 28 0; -#X connect 46 0 41 0; -#X connect 48 0 33 0; -#X connect 49 0 33 0; -#X connect 50 0 42 0; +#X connect 39 0 45 0; +#X connect 41 0 28 0; +#X connect 45 0 40 0; +#X connect 47 0 32 0; +#X connect 48 0 32 0; +#X connect 49 0 41 0; +#X connect 51 0 39 0; #X restore 701 243 pd slew-limiter; #N canvas 590 165 749 548 peak-meter 0; #X floatatom 217 132 5 0 50 0 - \$0-decay-speed-init - 0; @@ -566,20 +564,20 @@ #X coords 0 1 999 -1 500 140 1 0 0; #X restore 305 262 graph; #X obj 135 175 hsl 162 19 0 0.1 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; -#X obj 186 110 *~ 0.1; #X text 190 203 jitter range (0 to 0.1); +#X obj 186 110 *~ 0.03; #X connect 0 0 8 2; #X connect 0 0 8 4; #X connect 1 0 4 0; #X connect 2 0 1 0; #X connect 3 0 5 0; #X connect 5 0 7 0; -#X connect 6 0 19 0; +#X connect 6 0 20 0; #X connect 7 0 8 0; #X connect 8 0 4 0; #X connect 14 0 13 0; #X connect 18 0 0 0; -#X connect 19 0 7 1; +#X connect 20 0 7 1; #X restore 701 317 pd jitter-remover; #X text 688 216 Examples:; #X text 22 565 see also:; @@ -630,7 +628,6 @@ #X restore 739 44 pd reference; #X text 837 43 <= click; #X text 497 103 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 412 <- start metronome to graph output, f 18; #X text 459 14 <- Open HTML reference; #X text 84 43 - slew-limiting / low-pass filter; #X msg 252 489 \; pd dsp \$1; @@ -657,7 +654,6 @@ #X obj 293 202 t f f; #X obj 181 82 trigger float float; #X obj 254 414 expr 1000./$f1; -#X obj 181 548 slop~ 1e+09, f 18; #X msg 181 328 0; #X obj 181 110 != 0; #X obj 535 387 v D_\$0; @@ -702,64 +698,68 @@ #X floatatom 343 200 6 0 0 0 - - - 0; #X text 446 48 Here we use [vline~] and [slop~] to make a non-linear ADSR envelope. This example is hopefully simple enough to not require more details in the HTML reference., f 43; #X text 446 118 This example uses [vline~] to schedule an attack and decay stage when receiving a gate on message. The sustain point is defined as a ratio of the gate value. The attack \, decay and release time are defined in ms and are converted to values in Hz., f 43; -#X connect 0 0 36 0; -#X connect 5 0 9 0; -#X connect 6 0 27 0; -#X connect 6 1 32 0; -#X connect 7 0 11 0; -#X connect 7 1 30 1; -#X connect 8 0 44 0; -#X connect 9 0 4 0; -#X connect 9 0 39 1; -#X connect 10 0 5 0; -#X connect 11 0 31 0; -#X connect 13 0 22 0; -#X connect 14 0 35 0; -#X connect 15 0 13 0; -#X connect 15 1 16 0; -#X connect 15 2 17 0; -#X connect 15 3 18 0; -#X connect 16 0 12 0; -#X connect 17 0 20 0; -#X connect 18 0 26 0; -#X connect 19 0 49 0; -#X connect 21 0 51 0; -#X connect 23 0 43 0; -#X connect 24 0 50 0; -#X connect 25 0 49 0; -#X connect 27 0 29 0; -#X connect 28 0 27 2; -#X connect 29 0 5 0; -#X connect 30 0 6 0; -#X connect 31 0 25 0; -#X connect 31 0 10 0; -#X connect 31 1 19 0; -#X connect 31 1 30 0; -#X connect 32 0 27 1; -#X connect 33 0 34 0; -#X connect 34 0 7 0; -#X connect 35 0 15 0; -#X connect 36 0 4 0; -#X connect 39 0 41 0; -#X connect 40 0 39 0; -#X connect 43 0 9 5; -#X connect 44 0 9 3; -#X connect 49 0 8 0; -#X connect 50 0 23 0; -#X connect 51 0 32 1; +#X obj 181 548 slop~, f 18; +#X connect 0 0 35 0; +#X connect 5 0 53 0; +#X connect 6 0 26 0; +#X connect 6 1 31 0; +#X connect 7 0 10 0; +#X connect 7 1 29 1; +#X connect 8 0 43 0; +#X connect 9 0 5 0; +#X connect 10 0 30 0; +#X connect 12 0 21 0; +#X connect 13 0 34 0; +#X connect 14 0 12 0; +#X connect 14 1 15 0; +#X connect 14 2 16 0; +#X connect 14 3 17 0; +#X connect 15 0 11 0; +#X connect 16 0 19 0; +#X connect 17 0 25 0; +#X connect 18 0 48 0; +#X connect 20 0 50 0; +#X connect 22 0 42 0; +#X connect 23 0 49 0; +#X connect 24 0 48 0; +#X connect 26 0 28 0; +#X connect 27 0 26 2; +#X connect 28 0 5 0; +#X connect 29 0 6 0; +#X connect 30 0 24 0; +#X connect 30 0 9 0; +#X connect 30 1 18 0; +#X connect 30 1 29 0; +#X connect 31 0 26 1; +#X connect 32 0 33 0; +#X connect 33 0 7 0; +#X connect 34 0 14 0; +#X connect 35 0 4 0; +#X connect 38 0 40 0; +#X connect 39 0 38 0; +#X connect 42 0 53 5; +#X connect 43 0 53 3; +#X connect 48 0 8 0; +#X connect 49 0 22 0; +#X connect 50 0 31 1; +#X connect 53 0 4 0; +#X connect 53 0 38 1; #X restore 701 343 pd non-linear-envelope; -#X connect 0 0 44 0; +#X text 198 206 maximum downward slew of linear region (slew limit in amplitude per sample), f 38; +#X text 273 287 maximum upward slew of linear region (slew limit in amplitude per sample), f 36; +#X text 133 412 <-- graph output; +#X connect 0 0 41 0; #X connect 2 0 1 0; #X connect 3 0 2 0; -#X connect 4 0 45 1; +#X connect 4 0 42 1; #X connect 5 0 9 0; #X connect 6 0 8 0; -#X connect 7 0 45 0; -#X connect 8 0 45 4; -#X connect 9 0 45 2; -#X connect 11 0 45 3; -#X connect 16 0 45 5; -#X connect 29 0 31 0; -#X connect 39 0 38 0; -#X connect 44 0 45 0; -#X connect 45 0 1 0; +#X connect 7 0 42 0; +#X connect 8 0 42 4; +#X connect 9 0 42 2; +#X connect 11 0 42 3; +#X connect 14 0 42 5; +#X connect 27 0 29 0; +#X connect 36 0 35 0; +#X connect 41 0 42 0; +#X connect 42 0 1 0; diff --git a/doc/5.reference/soundfiler-help.pd b/doc/5.reference/soundfiler-help.pd index 4ef75134..8762a716 100644 --- a/doc/5.reference/soundfiler-help.pd +++ b/doc/5.reference/soundfiler-help.pd @@ -1,15 +1,15 @@ -#N canvas 196 60 1039 631 12; +#N canvas 229 59 1037 629 12; #X obj 60 320 soundfiler; #X floatatom 60 349 7 0 0 0 - - - 12; -#X obj 278 594 tabwrite~; -#X obj 352 594 tabread4~; -#X obj 425 594 tabplay~; +#X obj 274 594 tabwrite~; +#X obj 348 594 tabread4~; +#X obj 421 594 tabplay~; #X obj 159 594 writesf~; #X obj 101 594 readsf~; #X text 28 593 See also:; #X text 256 156 read a file to zero or more arrays, f 35; #X obj 40 15 soundfiler; -#X obj 230 594 array; +#X obj 227 594 array; #X listbox 127 349 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; @@ -35,7 +35,7 @@ #X msg 60 191 read -resize ../sound/bell.aiff sample; #X text 340 184 optionally resize array to fit the whole file, f 23; #X text 28 127 Basic read/write example:; -#N canvas 705 194 575 345 Dealing_with_"\$0" 0; +#N canvas 762 180 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; @@ -53,8 +53,8 @@ #X text 577 255 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 443 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 576 cnv 1 1025 1 empty empty empty 8 12 0 13 #000000 #000000 0; -#X obj 493 594 openpanel; -#X obj 566 594 savepanel; +#X obj 489 594 openpanel; +#X obj 562 594 savepanel; #X text 44 369 # samples; #X text 86 243 write to a file; #X text 124 369 info: sample rate \, header size \, channels \, bytes \, endianness; @@ -71,7 +71,7 @@ #X text 29 499 Also 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 73; #X msg 83 271 write ~/test.wav sample; #X text 577 74 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 and Endianness ("b" for "big" or "l" for "little")., f 62; -#N canvas 88 123 1235 596 read-write-flags 0; +#N canvas 189 207 1235 596 read-write-flags 0; #X obj 629 464 soundfiler; #X text 27 15 Flags for 'read' message:, f 73; #X text 18 417 Flags for 'write' message:, f 69; @@ -135,7 +135,6 @@ #X array array2 78003 float 2; #X coords 0 1 78003 -1 325 120 1 0 0; #X restore 862 392 graph; -#X text 18 503 -bytes (bytes per sample: 2 \, 3 \, 4 \, or 8 default: 2); #N canvas 460 493 480 224 8-byte 0; #X text 19 62 The precision of the 8-byte samples is based on the precision of the Pure Data build. If Pd is single precision (using 32-bit float internally) \, the written samples will be cast from 4-byte float to 8-byte double when writing to a file with -bytes 8 argument. In this case it's better to write with 4-byte float samples for a smaller file with the same precision., f 63; #X text 19 159 if Pd is double-precision \, writing 8-byte float samples will be full precision as Pd uses 64-bit float internally., f 63; @@ -149,6 +148,7 @@ #X text 1043 131 read overriding the file's header, f 17; #X text 17 288 * When loading a file \, [soundfiler] populates the array until reaching its size. If the sound file is smaller \, the remaining points are zeroed out. The -resize flag resizes the array to the sample size \, while the -maxsize flag sets a maximum size to clip to even if used in conjunction with the '-resize' flag (also \, errors are given to warn you about the truncation). The -maxsize was needed for historical reasons when its default value used to be rather small (4 million). The default now is much bigger \, hence \, this flag can just be ingored., f 78; #X text 18 485 -nframes (maximum points to write \, default from skip point to end of array), f 83; +#X text 18 503 -bytes (bytes per sample: 2 \, 3 \, 4 \, or 8 default: 2); #X connect 0 0 11 0; #X connect 0 1 8 0; #X connect 9 0 0 0; diff --git a/doc/8.topics/compander-limiter.htm b/doc/8.topics/compander-limiter.htm index d50f36ed..843aa7fd 100644 --- a/doc/8.topics/compander-limiter.htm +++ b/doc/8.topics/compander-limiter.htm @@ -19,8 +19,8 @@

      Companding and limiting

      -

      using slop~ in a compander-limiter

      -

      A subpatch of the slop~ help file gives an example that uses slop~ to make a compander-limiter. (The link will only work if you are reading this document as a local file on your machine and if your browser is set up to open .pd files using Pd. Alternatively you can create a slop~ object in a patch and get help for it). Here is additional documentation for the slop~ object itself.

      +

      using [slop~] in a compander-limiter

      +

      A subpatch of the [slop~] help file gives an example that uses [slop~] to make a compander-limiter. (The link will only work if you are reading this document as a local file on your machine and if your browser is set up to open .pd files using Pd. Alternatively you can create a [slop~] object in a patch and get help for it). Here is additional documentation for the [slop~] object itself.

      (TBW… just testing the directory layout and links for now.)

      diff --git a/doc/8.topics/expr.htm b/doc/8.topics/expr.htm index 1aea9b2f..3eba9312 100644 --- a/doc/8.topics/expr.htm +++ b/doc/8.topics/expr.htm @@ -167,14 +167,14 @@


      -

      Expr, Expr~, Fexpr~

      +

      [expr], [expr~], [fexpr~]

      Based on original sources from IRCAM’s jMax Released under BSD License.

      -

      The expr family is a set of C-like expression evaluation objects for the graphical music language Pure Data. It used to come as an ‘extra’ external, but it is now a built-in native object.

      +

      The [expr] family is a set of C-like expression evaluation objects for the graphical music language Pure Data. It used to come as an ‘extra’ external, but it is now a built-in native object.

      -

      expr runs in control rate and evaluates C-like expressions. See below for the list of operators. Multiple expressions separated by semicolons can be defined in a single expr object and this results in multiple outlets (up to 100, each for each expression). Expressions are evaluated from right to left (which means that the bottom expression will be the first executed.) The number of inlets in expr are defined by variables that take a few different forms: $i#, $i# and $s# for 'integers', 'floats' and 'symbols' ('#' is an inlet number from 1 up to 100, ordered from left to right). As an example, we can have 3 inlets defined as "$i1", "$f2" and "$s3", where:

      +

      [expr] runs in control rate and evaluates C-like expressions. See below for the list of operators. Multiple expressions separated by semicolons can be defined in a single [expr] object and this results in multiple outlets (up to 100, each for each expression). Expressions are evaluated from right to left (which means that the bottom expression will be the first executed.) The number of inlets in [expr] are defined by variables that take a few different forms: $i#, $i# and $s# for 'integers', 'floats' and 'symbols' ('#' is an inlet number from 1 up to 100, ordered from left to right). As an example, we can have 3 inlets defined as "$i1", "$f2" and "$s3", where:

      • $i1 is the input from the first (left) inlet and is treated as an integer
      • @@ -187,7 +187,7 @@

        Expr, Expr~, Fexpr~

        Type conversion from a float input to an integer is done automatically if the inlet is defined as an integer. Conversely, you can convert it explicitly by using functions (see below for the list of functions).

        -

        expr~ is designed to efficiently combine signal and control stream processing by vector operations on the basis of the audio block size. The operations, functions, and syntax for expr~ is just like expr with the addition of the $v# variable for signal vector input (also numbered up to 100). The '$v' is needed at least for the first and main input, so:

        +

        [expr~] is designed to efficiently combine signal and control stream processing by vector operations on the basis of the audio block size. The operations, functions, and syntax for [expr~] is just like [expr] with the addition of the $v# variable for signal vector input (also numbered up to 100). The '$v' is needed at least for the first and main input, so:

        • $v1 - means the first inlet is a signal input
        • @@ -197,16 +197,16 @@

          Expr, Expr~, Fexpr~

        -

        The result of an expression from expr~ is also an audio signal and multiple expressions up to 1000 can also be defined via semicolons.

        +

        The result of an expression from [expr~] is also an audio signal and multiple expressions up to 1000 can also be defined via semicolons.

        -

        Note for MSP users: Currently in the MSP version all signal inputs should come first followed by other types of inlet. (There seems to be no way of mixing signal and other types of inlets in their order in Max/MSP, if you know otherwise, please let me know.) This means that signal inlets cannot be mixed with other types of inlets. For example, “expr~ $v1$f2$v3 ” is not legal. The second and third inlet should be switched and “expr~ $v1$v2$f3” should be used. In Pd you can mix them in any way you want.

        +

        Note for MSP users: Currently in the MSP version all signal inputs should come first followed by other types of inlet. (There seems to be no way of mixing signal and other types of inlets in their order in Max/MSP, if you know otherwise, please let me know.) This means that signal inlets cannot be mixed with other types of inlets. For example, [expr~ $v1 + $f2 + $v3] is not legal. The second and third inlet should be switched and [expr~ $v1 + $v2 + $f3] should be used. In Pd you can mix them in any way you want.

        -

        The fexpr~ object provides a flexible mechanism for building FIR and IIR filters by evaluating expressions on a sample by sample basis and providing access to prior samples of the input and output audio streams. When fractional offset is used, fexpr~ uses linear interpolation to determine the value of the indexed sample. The operations, functions, and syntax for expr~ is just like expr with the addition of $x# and $y# variables. fexpr~ can access previous input and output samples up to the block size (64 by default).

        +

        The [fexpr~] object provides a flexible mechanism for building FIR and IIR filters by evaluating expressions on a sample by sample basis and providing access to prior samples of the input and output audio streams. When fractional offset is used, [fexpr~] uses linear interpolation to determine the value of the indexed sample. The operations, functions, and syntax for [fexpr~] is just like [expr~] with the addition of $x# and $y# variables. [fexpr~] can access previous input and output samples up to the block size (64 by default).

        -

        $x# is used to denote a signal input whose samples we would like to access. The syntax is $x followed by '#' (the inlet number up to 100) and the samples indexed by brackets, for example $x1[-1] specifies the previous sample of the first inlet. Therefore, if we are to build a simple filter which replaces every sample by the average of that sample and its previous one, we would use “fexpr~ ($x1[0]+$x1[-1])/2 ”. For ease of when the brackets are omitted, the current sample is implied, so we can write the previous filter expression as follows: “ fexpr~ ($x1+$x1[-1])/2”. To build IIR filters $y# is used to access the previous output samples indexed from -1 inside brackets. Note now that '#' here is used to define the outlet number.

        +

        $x# is used to denote a signal input whose samples we would like to access. The syntax is $x followed by '#' (the inlet number up to 100) and the samples indexed by brackets, for example $x1[-1] specifies the previous sample of the first inlet. Therefore, if we are to build a simple filter which replaces every sample by the average of that sample and its previous one, we would use [fexpr~ ($x1[0] + $x1[-1]) / 2]. For ease of when the brackets are omitted, the current sample is implied, so we can write the previous filter expression as follows: [fexpr~ ($x1 + $x1[-1]) / 2]. To build IIR filters $y# is used to access the previous output samples indexed from -1 inside brackets. Note now that '#' here is used to define the outlet number.

        -

        The first inlet also needs to be a signal input ($x1), the output of fexpr~ is a signal output and multiple expressions can also be defined via semicolons and each will correspond to an outlet that can be accessed by '$y#'. Note that '$v#' is not allowed in fexpr~, so:

        +

        The first inlet also needs to be a signal input ($x1), the output of [fexpr~] is a signal output and multiple expressions can also be defined via semicolons and each will correspond to an outlet that can be accessed by '$y#'. Note that '$v#' is not allowed in [fexpr~], so:

        • $x1[n] - means the first inlet is a signal input and 'n' is an index from 0 to -block size
        • @@ -218,7 +218,7 @@

          Expr, Expr~, Fexpr~


          -

          The operators expr, expr~ and fexpr~ support (listed from highest precedence to lowest) are as follows:

          +

          The operators [expr], [expr~] and [fexpr~] support (listed from highest precedence to lowest) are as follows:

          @@ -332,7 +332,7 @@

          The operators expr, expr~ and fexpr~ support (listed from hig

          -

          The supported functions for expr, expr~ and fexpr~ are:

          +

          The supported functions for [expr], [expr~] and [fexpr~] are:

          @@ -346,7 +346,7 @@

          The supported functions for expr, expr~ and fexpr~ are:

          - + @@ -391,7 +391,7 @@

          The supported functions for expr, expr~ and fexpr~ are:

          - + @@ -692,7 +692,7 @@

          New Additions in version 0.57

          New Additions in version 0.56

            -
          • Fexpr~ now accepts a float in its first input.
          • +
          • [fexpr~] now accepts a float in its first input.
          • Added avg() and Avg() back to the list of functions
          @@ -700,7 +700,7 @@

          New Additions in version 0.56

          New Additions in version 0.55

            -
          • Expr, expr~, and fexpr~ are now built-in native objects.
          • +
          • [expr], [expr~], and [fexpr~] are now built-in native objects.
          • The arrays now redraw after a store into one of their members
          • ex_if() (the “if()” function is reworked to only evaluate either the left or the right args depending on the truth value of the condition. However, if the condition is an audio vector, both the left and the right are evaluated regardless.
          • priority of ‘,’ and ‘=’ was switched to fix the bug of using store “=” in functions with multiple arguments, which caused an error during execution.
          • @@ -711,7 +711,7 @@

            New Additions in version 0.55

            New Additions in version 0.5

              -
            • Expr, expr~, and fexpr~ are now built-in native objects.
            • +
            • [expr], [expr~] and [fexpr~] are now built-in native objects.
            • minor fixes/improvements.
            @@ -719,18 +719,18 @@

            New Additions in version 0.5

            New Additions in version 0.4

              -
            • Expr, expr~, and fexpr~ now support multiple expressions separated by semicolons which results in multiple outlets.
            • +
            • [expr], [expr~] and [fexpr~] now support multiple expressions separated by semicolons which results in multiple outlets.
            • Variables are supported now in the same way they are supported in C. - Variables have to be defined with the “value” object prior to execution.
            • A new if function if (condition-expression, IfTrue-expression, IfFalse-expression) has been added.
            • New math functions added.
            • -
            • New shorthand notations for fexpr~ have been added. +
            • New shorthand notations for [fexpr~] have been added.
              • $x ->$x1[0] $x# -> $x#[0]
              • $y = $y1[-1] and $y# = $y#[-1]
            • -
            • New ‘set’ and ‘clear’ methods were added for fexpr~ +
            • New ‘set’ and ‘clear’ methods were added for [fexpr~]
              • clear - clears all the past input and output buffers
              • diff --git a/doc/8.topics/fudi.htm b/doc/8.topics/fudi.htm index 5066b71c..e451ee1a 100644 --- a/doc/8.topics/fudi.htm +++ b/doc/8.topics/fudi.htm @@ -63,9 +63,11 @@

                FUDI

                FUDI is a the networking protocol used by Pd internally to communicate between the GUI process and the DSP process. The same protocol is also used for saving patches to the Pd file. FUDI -stand for ‘Fast Unified Digital Interface’ (or according to Miller +stands for "Fast Unified Digital Interface" (or according to Miller Puckette, whatever other acronym people can come up with :)

                +

                Format:

                +

                FUDI is a packet oriented protocol. Each message consists of one or more atoms, separated by one or more whitespace characters, and it’s terminated by a @@ -73,16 +75,23 @@

                Format:

                sequence of one or more characters; whitespaces inside atoms can be escaped by the backslash (ascii 92) character (see Examples below).

                +

                A whitespace is either a space (ascii 32), a tab (ascii 9) or a newline (ascii 10).

                +

                A semicolon (ascii 59) is mandatory to terminate (and send) a message. A newline is just treated as whitespace and not needed for message termination.

                +

                Implementations:

                -

                netsend / netreceive

                + +

                [netsend] / [netreceive]

                +

                Those classes can be used to transport Pd-messages over a TCP or UDP -socket. Both are Pd’s built-in objects.

                +socket.

                +

                Example messages:

                +
                test/blah 123.45314;
                my-slider 12;
                hello this is a message;
                @@ -93,43 +102,63 @@

                Example messages:

                this\ is\ one\ whole\ atom;
                this_atom_contains_a\
                 newline_character_in_it;
                +

                Message conversion:

                -

                fudiformat / fudiparse

                + +

                [fudiformat] / [fudiparse]

                +

                These classes can be used to convert Pd-messages to FUDI and -vice-versa. Both are Pd’s built-in objects.

                -

                fudiformat: convert Pd messages to FUDI packets.

                -

                fudiparse: parse FUDI packets into Pd messages

                +vice-versa.

                + +

                [fudiformat]: convert Pd messages to FUDI packets.

                +

                [fudiparse]: parse FUDI packets into Pd messages

                +

                Using other languages or tools:

                +

                pdsend

                +

                usage: pdsend [host] [udp|tcp] (default is localhost and tcp)

                +

                Example:

                +
                echo "list foo bar;" | pdsend 8888
                +

                Tcl

                +

                Just create a socket object and write data to it:

                +
                set sock [socket localhost 8888]
                 puts $sock "test/blah 123.45314;"
                +

                note that since newline is not mandatory, you can send messages without newline at the end, but you have to flush the socket buffer (or change buffering mode - not recommended):

                +
                set sock [socket localhost 8888]
                 puts -nonewline $sock "test/blah 123.45314;"
                 flush $sock
                +

                netcat

                +

                netcat (aka nc) is a handy command line tool for networking. You can use it to send FUDI messages:

                +
                echo "blah;" | nc localhost 8888

                + +

                Pd also interfaces via OpenSoundControl (aka OSC)

                https://en.wikipedia.org/wiki/Open_Sound_Control

                -

                Pd’s built-in objects:

                -

                oscformat - convert Pd lists to OSC packets

                -

                oscparse - parse OSC packets into Pd messages

                + +

                The native OSC objects in Pd are:

                +

                [oscformat] - convert Pd lists to OSC packets

                +

                [oscparse] - parse OSC packets into Pd messages

                diff --git a/doc/8.topics/slop-tilde.htm b/doc/8.topics/slop-tilde.htm index db9ba91a..de05c92b 100644 --- a/doc/8.topics/slop-tilde.htm +++ b/doc/8.topics/slop-tilde.htm @@ -16,7 +16,7 @@ -

                Nonlinear filtering using the slop~ slew-limiting low-pass filter

                +

                Nonlinear filtering using the [slop~] slew-limiting low-pass filter

                Tasks such as envelope following, dynamics processing, and soft saturation often rely on low-pass filtering in which the cutoff frequency of the filter (which you can alternatively think of as its reaction speed) varies according to whether the input is rising, stable, or falling. For example, a VU meter design might call for an envelope follower whose output can rise quickly but then drops off more slowly. To make this we could use a low-pass filter to make a moving average of the instantaneous signal level, but the moving average should react faster on rising inputs than on falling ones.

                The simplest type of digital low-pass filter can be understood as a moving average:


                y[n] = y[n − 1] + k ⋅ (x[n] − y[n − 1])

                @@ -25,17 +25,17 @@


                y[n] − y[n − 1] = f(x[n] − y[n − 1])

                where the function f is linear:


                f(x) = k ⋅ x

                -

                In words, this equation says, “increment your output by k times the distance you have to travel to reach the goal x[n]”. (So far, we’ve described the action of the linear lop~ object.) In the slop~ object, this linear function is replaced by a nonlinear one with three segments, one for an interval ( − n, p) containing zero, and two others joining this one at the input values  − n and p. The three segments have slopes equal to kn, k, and kp for the negative, middle, and positive regions:

                +

                In words, this equation says, “increment your output by k times the distance you have to travel to reach the goal x[n]”. (So far, we’ve described the action of the linear [lop~] object.) In the [slop~] object, this linear function is replaced by a nonlinear one with three segments, one for an interval ( − n, p) containing zero, and two others joining this one at the input values  − n and p. The three segments have slopes equal to kn, k, and kp for the negative, middle, and positive regions:

                -response curve for slop~
                response curve for slop~
                +response curve for [slop~]
                response curve for [slop~]
                -

                Rationale. In general, k could depend on both the previous output y[n − 1] and on the current input x. This would require that the invoking patch somehow specify a function of two variables, a feat for which Pd is ill suited. In slop~ we make the simplifying assumption that adding an offset to both the filter’s state and its input should result in adding the same offset to the output; that is, the filter should be translation-invariant. (As will be seen below, through a bit of skulduggery we can still make translation-dependent effects such as soft saturation). One could also ask why we don’t allow the function f to refer to a stored array instead of restricting it to a 5-parameter family of piecewise linear functions. The reason for choosing the approach taken is that it is often desirable to modulate the parameters at audio rates, and that would be difficult if we used an array.

                -

                The following four examples are demonstrated in subpatches of the slop~ help file. (If your browser is set up to open “.pd” files using Pure Data then you can open it with this link; alternatively you can create a slop~ object in a patch and get help for it, or navigate to it using Pd’s help browser.)

                +

                Rationale. In general, k could depend on both the previous output y[n − 1] and on the current input x. This would require that the invoking patch somehow specify a function of two variables, a feat for which Pd is ill suited. In [slop~] we make the simplifying assumption that adding an offset to both the filter’s state and its input should result in adding the same offset to the output; that is, the filter should be translation-invariant. (As will be seen below, through a bit of skulduggery we can still make translation-dependent effects such as soft saturation). One could also ask why we don’t allow the function f to refer to a stored array instead of restricting it to a 5-parameter family of piecewise linear functions. The reason for choosing the approach taken is that it is often desirable to modulate the parameters at audio rates, and that would be difficult if we used an array.

                +

                The following four examples are demonstrated in subpatches of the [slop~] help file. (If your browser is set up to open “.pd” files using Pure Data then you can open it with this link; alternatively you can create a [slop~] object in a patch and get help for it, or navigate to it using Pd’s help browser.)

                example: slew limiter

                -

                The output signal y[n] has a time-varying slope equal to (y[n] − y[n − 1])/τ, where τ denotes the elapsed time between two samples, equal to one over the sample rate R. The slope can be rewritten as R ⋅ (y[n] − y[n − 1]). Suppose we wish to create an output signal whose slope is limited between two values  − sn and sp (so sn and sp, both greater than zero, are the maximum downward and upward slope). This implies that we should limit the difference between successive outputs, y[n] − y[n − 1] to lie between  − sn/R and sp/R. We therefore increment the output by a quantity x[n] − y[n − 1] as long as that increment lies between those two limits. Beyond those limits the response speed should be zero so that the increment doesn’t vary past those limits. To do this we set the five filter coefficients to slop~ to k = 1, n = sn/R, p = sp/R, and kn = kp = 0. Since the three speed inputs to slop~ are in units of Hz, we can set k = 1 by giving a linear-response frequency higher than the sample rate. (In practice, “1e9”, meaning a billion, will do fine for any sample rate we expect to encounter.)

                +

                The output signal y[n] has a time-varying slope equal to (y[n] − y[n − 1])/τ, where τ denotes the elapsed time between two samples, equal to one over the sample rate R. The slope can be rewritten as R ⋅ (y[n] − y[n − 1]). Suppose we wish to create an output signal whose slope is limited between two values  − sn and sp (so sn and sp, both greater than zero, are the maximum downward and upward slope). This implies that we should limit the difference between successive outputs, y[n] − y[n − 1] to lie between  − sn/R and sp/R. We therefore increment the output by a quantity x[n] − y[n − 1] as long as that increment lies between those two limits. Beyond those limits the response speed should be zero so that the increment doesn’t vary past those limits. To do this we set the five filter coefficients to [slop~] to k = 1, n = sn/R, p = sp/R, and kn = kp = 0. Since the three speed inputs to [slop~] are in units of Hz, we can set k = 1 by giving a linear-response frequency higher than the sample rate. (In practice, “1e9”, meaning a billion, will do fine for any sample rate we expect to encounter.)

                A patch to do this is shown here:

                -slew-limiting patch from slop~ help file
                slew-limiting patch from slop~ help file
                +slew-limiting patch from [slop~] help file
                slew-limiting patch from [slop~] help file

                A sample input and output are shown here:

                @@ -44,16 +44,16 @@

                example: slew

                The input is a square pulse of unit height lasting 0.7 msec, at a sample rate of 48000. The upward maximum slope is set to 9000. For the first 5 samples of the pulse, the upward increment is limited to 9000/48000 units. At the sixth sample of the pulse the input is within that limit of the previous output, and so the increment becomes exactly what is needed to make the output reach the input in value.

                Note: slew limiting is useful for conditioning time-varting controls to avoid discontinuities. It’s not so useful as a way to generate triangle waves from rectangular pulse trains, because the rising and falling edges are quantized to an integer sample number, making audible (and ugly) non-periodicities.

                example: peak meter

                -

                To make a peak meter, we need an estimate of how strongly a signal has peaked in the recent past. This can be done using slop~ as shown:

                +

                To make a peak meter, we need an estimate of how strongly a signal has peaked in the recent past. This can be done using [slop~] as shown:

                instant-rise, controlled-decay envelope follower
                instant-rise, controlled-decay envelope follower
                -

                Here the abs~ object takes the input’s absolute value (known in electronics as “rectification”) and the slop~ object is set to have no linear region at all, but a rise region with an infinite (1e9) cutoff (so that it follows a rise in the input instantly), and a decay region with a controllable cutoff frequency that sets the speed of the decay. Here is the response to the same rectangular pulse input as the example above:

                +

                Here the [abs~] object takes the input’s absolute value (known in electronics as “rectification”) and the [slop~] object is set to have no linear region at all, but a rise region with an infinite (1e9) cutoff (so that it follows a rise in the input instantly), and a decay region with a controllable cutoff frequency that sets the speed of the decay. Here is the response to the same rectangular pulse input as the example above:

                response to a square pulse
                response to a square pulse

                (In order to keep the same time scale, 100 samples, as above we have here set the decay speed to 1000 Hz, but for an envelope follower this will normally be between 0.1 and 5 Hz. Lower values will result in a less jittery output when an audio signal is input, but higher ones will cause the output to react faster to falling signal levels.) The result is in linear amplitude units, and can be converted to decibels for metering as shown in the help patch.

                -

                using slop~ in a compander-limiter

                +

                using [slop~] in a compander-limiter

                Audio engineers make frequent use of dynamics processors such as companders (compressors/expanders) and limiters. Companders are most often used to compress the dynamic range of an audio signal to make it less likely that the level falls outside a useful range, but are also sometimes configured to expand dynamic range below a chosen threshold, so that they act as noise gates. Limiters are often used with instruments such as percussion and guitars whose attacks can have much higher amplitude than the body of the note. To hear the body one turns the gain up, but then one has to limit the attack amplitude in order to avoid distortion.

                There is no one standard design for a dynamics processor, and few makers of modern ones have divulged their secrets, which might take the form of nonlinear transfer functions, carefully tuned filter parameters, and perhaps many other possible fudge factors. There is also a whole industry in which software designers try to emulate analog hardware dynamics processors. There are also stereo compressors (for mastering CDs and LPs) and multi-band ones. Engineers frequently allow one signal to control the level of a different one, in a technique popularly known as “side chaining”. If one is working from recorded tracks (as opposed to live sound), it’s possible to look ahead in the recorded sound to reduce the distortion that inevitably occurs when a limiter is hit too hard. And so on.

                Here we’ll describe a fairly straightforward design based on the instant-attack envelope follower described in the previous example. (This is somewhat atypical; the implications of this approach are discussed a bit later.) Once the envelope is determined (and converted to decibels), a table lookup gives the desired dynamic, and the necessary gain is computed and applied. Thus:

                @@ -64,7 +64,7 @@

                using slop~ to remove signal jitter

                +

                using [slop~] to remove signal jitter

                By setting the linear cutoff frequency to zero and the linear region to an interval of length a (either by setting n = 0, p = 1 or n = p = a/2), and then setting kn = kp = inf , we get a filter that allows its input to jitter over a range of a units before the filter responds to it. This is sometimes useful for quieting down noisy control sources (such as envelope followers or physical sensors). This is analogous to a loose physical linkage.

                diff --git a/extra/bob~/bob~-help.pd b/extra/bob~/bob~-help.pd index 77899fcc..6fbd687a 100644 --- a/extra/bob~/bob~-help.pd +++ b/extra/bob~/bob~-help.pd @@ -8,9 +8,9 @@ #X msg 692 277 saturation \$1; #X msg 666 192 oversample \$1; #N canvas 635 124 513 424 test 0; -#X obj 313 147 min~; -#X obj 357 123 -~ 1; -#X obj 357 148 *~ -50; +#X obj 313 137 min~; +#X obj 367 123 -~ 1; +#X obj 367 148 *~ -50; #X floatatom 105 105 5 0 128 0 - - - 0; #X obj 233 52 mtof; #X text 301 49 test signal; @@ -19,7 +19,7 @@ #X obj 65 34 loadbang; #X msg 105 70 57; #X msg 65 102 1; -#X obj 362 239 noise~; +#X obj 362 244 noise~; #X obj 233 277 *~ 0; #X obj 313 244 *~ 0; #X obj 362 287 *~ 0; @@ -29,12 +29,13 @@ #X obj 105 127 vradio 19 1 0 3 empty empty empty 0 -8 0 10 #dfdfdf #000000 #000000 0; #X obj 258 225 == 0; #X obj 105 207 == 2; -#X obj 338 206 == 1; -#X obj 313 172 -~ 0.5; +#X obj 338 221 == 1; +#X obj 313 162 -~ 0.5; #X text 127 126 Sine, f 8; #X text 127 146 Sawtooth; #X text 127 165 Noise, f 8; #X text 144 104 Pitch; +#X obj 313 190 *~ 2; #X connect 0 0 22 0; #X connect 1 0 2 0; #X connect 2 0 0 1; @@ -59,7 +60,8 @@ #X connect 19 0 12 1; #X connect 20 0 14 1; #X connect 21 0 13 1; -#X connect 22 0 13 0; +#X connect 22 0 27 0; +#X connect 27 0 13 0; #X coords 0 -1 1 1 93 90 2 100 100; #X restore 126 162 pd test; #X obj 33 15 bob~; From 13f9b43fc75620d2f9e68669943f9974b241f11c Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Sun, 4 Aug 2024 17:14:14 +0900 Subject: [PATCH 53/89] fixed mistake parsing -nharmonics arg to sigmund~ --- extra/sigmund~/sigmund~.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extra/sigmund~/sigmund~.c b/extra/sigmund~/sigmund~.c index e8e7b826..87d4a346 100644 --- a/extra/sigmund~/sigmund~.c +++ b/extra/sigmund~/sigmund~.c @@ -1371,7 +1371,7 @@ static void *sigmund_new(t_symbol *s, int argc, t_atom *argv) { sigmund_nharmonics(x, atom_getfloatarg(1, argc, argv), atom_getfloatarg(2, argc, argv)); - argc -= 3; argv += 3; + argc -= 2; argv += 2; } else if (!strcmp(firstarg->s_name, "-amppowerlaw") && argc > 1) { From 0d3ff8a998bcd001c6c7db7e0ee843a6610bdfb8 Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Fri, 9 Aug 2024 16:34:46 -0500 Subject: [PATCH 54/89] fix compile oops for esp32 --- src/x_text.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/x_text.c b/src/x_text.c index 109bd598..e00e00d2 100644 --- a/src/x_text.c +++ b/src/x_text.c @@ -109,11 +109,10 @@ static void textbuf_open(t_textbuf *x) { char buf[40]; sprintf(buf, "%dx%d", 600, 340); - pdgui_vmess("pdtk_textwindow_open", "^r si", - x, buf, - x->b_sym->s_name, - sys_hostfontsize(glist_getfont(x->b_canvas), glist_getzoom(x->b_canvas))); - sprintf(buf, ".x%lx", x); + pdgui_vmess("pdtk_textwindow_open", "^r si", x, buf, + x->b_sym->s_name, sys_hostfontsize(glist_getfont(x->b_canvas), + glist_getzoom(x->b_canvas))); + sprintf(buf, ".x%lx", (unsigned long)x); x->b_guiconnect = guiconnect_new(&x->b_ob.ob_pd, gensym(buf)); textbuf_senditup(x); } From 868be452fd4f8ad48c603a913cb6ca9a0ee2e25a Mon Sep 17 00:00:00 2001 From: porres Date: Sat, 10 Aug 2024 11:43:10 -0300 Subject: [PATCH 55/89] fix and improve 10.interaction example in data structures added 'displace' routing and remove old text that referred to how things worked in pd 0.39 --- doc/4.data.structures/10.interaction.pd | 81 +++++++++++++------------ 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/doc/4.data.structures/10.interaction.pd b/doc/4.data.structures/10.interaction.pd index 5c22c216..b62e0d29 100644 --- a/doc/4.data.structures/10.interaction.pd +++ b/doc/4.data.structures/10.interaction.pd @@ -1,11 +1,11 @@ #N struct template9 float x float y float w float h float q; -#N canvas 223 50 638 556 12; -#X floatatom 279 316 4 0 0 0 - - - 0; -#N canvas 876 65 388 446 data9 1; +#N canvas 223 50 652 591 12; +#X floatatom 279 333 4 0 0 0 - - - 0; +#N canvas 895 64 388 446 data9 1; #X scalar template9 19 186 73 25 9 \;; #X scalar template9 293 328 38 32 66 \;; #X scalar template9 202 32 46 71 78 \;; -#X scalar template9 62 320 49 46 220 \;; +#X scalar template9 50 321 49 46 220 \;; #X scalar template9 140 183 28 72 634 \;; #X scalar template9 250 125 46 11 48 \;; #X scalar template9 26 62 70 11 903 \;; @@ -14,54 +14,57 @@ #X scalar template9 311 254 50 25 612 \;; #X scalar template9 19 114 77 26 16 \;; #X scalar template9 177 241 39 66 866 \;; -#X scalar template9 40 240 27 27 125 \;; +#X scalar template9 44 239 27 27 125 \;; #X scalar template9 117 111 66 32 319 \;; #X scalar template9 135 61 50 25 454 \;; #X scalar template9 316 143 21 45 583 \;; #X scalar template9 270 230 25 38 548 \;; #X scalar template9 237 278 24 73 214 \;; -#X scalar template9 133 335 50 78 647 \;; +#X scalar template9 143 332 49 77 649 \;; #X scalar template9 288 91 72 19 325 \;; #X coords 0 446 1 445 0 0 0; -#X restore 508 269 pd data9; -#N canvas 267 109 673 314 template9 0; -#X obj 343 207 filledpolygon q 0 1 0 0 w 0 w h 0 h; -#X obj 344 234 drawnumber q 0 0 0; +#X restore 508 286 pd data9; +#N canvas 150 451 673 314 template9 0; +#X obj 393 207 filledpolygon q 0 1 0 0 w 0 w h 0 h; +#X obj 394 234 drawnumber q 0 0 0; #X obj 171 124 struct template9 float x float y float w float h float q; #X obj 171 268 outlet; #X obj 182 159 print struct-template9; #X text 347 158 <-- print all messages.; -#X obj 171 199 route select change; #X text 42 17 [struct] outputs messages notifying you when objects of this structure are interacted with. In run mode you get: 'click' (when you click on them) and 'change' (when you change field values by dragging). In edit mode you get: 'select' when you select the object \, 'deselect' when you deselect it and 'displace' when you move it around. Here we catch 'change' and 'select' interactions and pass the pointer through with the [route] object., f 86; +#X obj 171 199 route select change displace; +#X obj 299 229 unpack p; #X connect 2 0 4 0; -#X connect 2 0 6 0; -#X connect 6 0 3 0; -#X connect 6 1 3 0; -#X restore 279 219 pd template9; -#X obj 279 288 get template9 x y w h q; -#X floatatom 397 316 4 0 0 0 - - - 0; -#X floatatom 358 316 4 0 0 0 - - - 0; -#X floatatom 318 316 4 0 0 0 - - - 0; -#X floatatom 437 316 4 0 0 0 - - - 0; -#X msg 279 496 \; set-x set \$1; -#X msg 318 458 \; set-y set \$1; -#X msg 358 420 \; set-w set \$1; -#X msg 397 381 \; set-h set \$1; -#X msg 437 342 \; set-q set \$1; -#X floatatom 79 251 5 0 0 0 - set-x - 0; -#X obj 79 275 set template9 x; -#X obj 79 333 set template9 y; -#X obj 79 391 set template9 w; -#X obj 79 448 set template9 h; -#X obj 79 505 set template9 q; -#X floatatom 79 309 5 0 0 0 - set-y - 0; -#X floatatom 79 367 5 0 0 0 - set-w - 0; -#X floatatom 79 425 5 0 0 0 - set-h - 0; -#X floatatom 79 482 5 0 0 0 - set-q - 0; -#X text 46 66 To try it \, unlock the subpatch (data9) and select a scalar. The 5 parameters should show up under the [get] object in this window and set the number boxes connected to the [set] objects so you're able to change them. The blue "selection" rectangle ought to notice when the object that got selected gets moved or resized \, but this isn't done yet (as of Pd version 0.39)., f 79; -#X text 375 219 <-- open for details; -#X text 46 17 The [struct] object outputs a pointers in different interaction situations as in the case of any selected object of template9 or when you click and change any parameter. This patch demonstrates catching these interactions., f 79; -#X text 46 142 When in run mode (that is 'locked' and not in edit mode) you can click on any corner of the rectangles to drag and change the field values or also click on the color number and drag it too. You'll then also see the parameters come out of the [get] objects., f 79; +#X connect 2 0 7 0; +#X connect 7 0 3 0; +#X connect 7 1 3 0; +#X connect 7 2 8 0; +#X connect 8 0 3 0; +#X restore 279 236 pd template9; +#X obj 279 305 get template9 x y w h q; +#X floatatom 397 333 4 0 0 0 - - - 0; +#X floatatom 358 333 4 0 0 0 - - - 0; +#X floatatom 318 333 4 0 0 0 - - - 0; +#X floatatom 437 333 4 0 0 0 - - - 0; +#X msg 279 513 \; set-x set \$1; +#X msg 318 475 \; set-y set \$1; +#X msg 358 437 \; set-w set \$1; +#X msg 397 398 \; set-h set \$1; +#X msg 437 359 \; set-q set \$1; +#X floatatom 79 255 5 0 0 0 - set-x - 0; +#X obj 79 292 set template9 x; +#X obj 79 350 set template9 y; +#X obj 79 408 set template9 w; +#X obj 79 465 set template9 h; +#X obj 79 522 set template9 q; +#X floatatom 79 326 5 0 0 0 - set-y - 0; +#X floatatom 79 384 5 0 0 0 - set-w - 0; +#X floatatom 79 442 5 0 0 0 - set-h - 0; +#X floatatom 79 499 5 0 0 0 - set-q - 0; +#X text 375 236 <-- open for details; +#X text 46 17 The [struct] object outputs a pointers in different interaction situations as in the case of any selected object of 'template9' or when you click and change any parameter. This patch demonstrates catching these interactions., f 79; +#X text 46 64 When in run mode (that is not in edit mode) you can click on any corner of the rectangles in the [pd data9] window to drag and change its size or click on the numbers and drag to change the color number. You'll then see the parameters come out of the [get] object \, which outputs the 5 parameters from the [struct]. You can also set the number boxes connected to the [set] objects so you're able to change them., f 79; +#X text 46 156 If you go into edit mode in the [pd data9] window \, you can also select a scalar (note the blue "selection" rectangle) and drag it. The 5 parameters should also show up under the [get] object. The blue "selection" rectangle also notices when the object that got selected gets moved or resized via the [set] object., f 79; #X connect 0 0 8 0; #X connect 2 0 3 0; #X connect 2 0 14 1; From bdf2fd440a2ac1a48eae3a6399a7c039dfb83656 Mon Sep 17 00:00:00 2001 From: porres Date: Wed, 14 Aug 2024 12:58:58 -0300 Subject: [PATCH 56/89] add note to 10.interaction.pd in data structures that you can get change messages for array elements also a minor update to 16.more.arrays.pd --- doc/2.control.examples/16.more.arrays.pd | 108 +++++++++++------------ doc/4.data.structures/10.interaction.pd | 3 +- 2 files changed, 56 insertions(+), 55 deletions(-) diff --git a/doc/2.control.examples/16.more.arrays.pd b/doc/2.control.examples/16.more.arrays.pd index 16e5c7bb..d9b60c3d 100644 --- a/doc/2.control.examples/16.more.arrays.pd +++ b/doc/2.control.examples/16.more.arrays.pd @@ -1,28 +1,28 @@ -#N canvas 409 38 887 709 12; +#N canvas 358 50 930 745 12; #X text 105 13 MORE ON ARRAYS; -#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 659 \; array98 style \$1; -#X floatatom 506 430 4 1 10 0 - - - 0; -#X floatatom 708 485 5 0 0 0 - - - 0; -#X msg 708 511 \; array98 color \$1; -#X msg 708 455 9, f 2; -#X msg 739 455 900; +#X obj 644 397 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1; +#X msg 644 424 \; array98 vis \$1; +#X msg 548 683 \; array98 style \$1; +#X floatatom 536 454 4 1 10 0 - - - 0; +#X floatatom 738 509 5 0 0 0 - - - 0; +#X msg 738 535 \; array98 color \$1; +#X msg 738 479 9, f 2; +#X msg 769 479 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 486 374 show/hide arrays:; -#X text 753 485 set color; -#X floatatom 518 629 5 0 0 0 - - - 0; +#X text 516 398 show/hide arrays:; +#X text 783 509 set color; +#X floatatom 548 653 5 0 0 0 - - - 0; #X msg 302 166 \; array97 3 -0.5 0.5; -#X msg 27 229 \; array97 rename george; -#X msg 231 229 \; george rename array97; -#X msg 28 296 \; array97 bounds 0 2 10 -2; -#X msg 29 395 \; array97 xticks 0 1 1; -#X msg 222 394 \; array97 yticks 0 0.1 5; -#X msg 291 478 \; array97 ylabel -0.1 -1 0 1; -#X msg 736 399 \; array97 vis \$1; +#X msg 27 234 \; array97 rename george; +#X msg 231 234 \; george rename array97; +#X msg 28 307 \; array97 bounds 0 2 10 -2; +#X msg 29 416 \; array97 xticks 0 1 1; +#X msg 222 415 \; array97 yticks 0 0.1 5; +#X msg 291 515 \; array97 ylabel -0.1 -1 0 1; +#X msg 766 423 \; 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; @@ -40,51 +40,51 @@ #X connect 2 0 5 0; #X connect 3 0 1 0; #X connect 5 0 4 0; -#X restore 215 655 pd locality; -#X msg 693 615 0; -#X msg 683 578 1; -#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 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 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 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 obj 532 41 cnv 19 298 148 empty empty empty 20 12 0 12 #e0e0e0 #404040 0; +#X restore 254 692 pd locality; +#X msg 723 639 0; +#X msg 713 602 1; +#X text 746 596 allow editing with mouse, f 13; +#X text 752 632 prevent mouse interaction, f 14; +#X msg 713 669 \; array97 edit \$1 \; array98 edit \$1; +#X text 25 573 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 212 renaming an array; +#X text 26 285 setting the bounds rectangle; +#X text 103 476 adding labels: give a y value and a bunch of x values or vice versa, f 37; +#X text 25 363 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 obj 766 397 tgl 19 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000 0 1; +#X obj 548 587 vradio 19 1 0 3 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000 0; +#X text 572 587 Point (0); +#X text 572 606 Polygon (1); +#X text 572 626 Bezier (2); +#X text 542 557 set display style:; +#X obj 542 38 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 7 -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 650 455 444; -#X msg 255 294 \; array97 bounds 0 1 7 -1; -#X msg 20 478 \; array97 xlabel -1.1 0 1 2 3 4 5 6 7; -#X msg 682 455 0, f 2; -#X text 544 425 line width, f 5; -#X msg 388 659 \; array97 style \$1; -#X msg 506 467 \; array97 width \$1 \; array98 width \$1; -#X text 63 642 open subpatch for local array names -->, f 21; +#X restore 541 37 graph; +#X text 507 328 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 680 479 444; +#X msg 255 305 \; array97 bounds 0 1 7 -1; +#X msg 20 515 \; array97 xlabel -1.1 0 1 2 3 4 5 6 7; +#X msg 712 479 0, f 2; +#X text 574 449 line width, f 5; +#X msg 418 683 \; array97 style \$1; +#X msg 536 491 \; array97 width \$1 \; array98 width \$1; +#X text 102 679 open subpatch for local array names -->, f 21; +#X text 507 204 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".) In this case you need to click on an exact point of one of the arrays to drag and change values. Note that arrays' sizes need not match the bounds of the containing graph. But if you have only one array in a graph and resize it \, the graph is automatically reset to match its bounds., f 52; #X connect 1 0 2 0; -#X connect 4 0 51 0; +#X connect 4 0 50 0; #X connect 5 0 6 0; #X connect 7 0 5 0; #X connect 8 0 5 0; #X connect 15 0 3 0; -#X connect 15 0 50 0; +#X connect 15 0 49 0; #X connect 25 0 29 0; #X connect 26 0 29 0; -#X connect 36 0 23 0; -#X connect 37 0 15 0; -#X connect 45 0 5 0; -#X connect 48 0 5 0; +#X connect 35 0 23 0; +#X connect 36 0 15 0; +#X connect 44 0 5 0; +#X connect 47 0 5 0; diff --git a/doc/4.data.structures/10.interaction.pd b/doc/4.data.structures/10.interaction.pd index b62e0d29..a32a524a 100644 --- a/doc/4.data.structures/10.interaction.pd +++ b/doc/4.data.structures/10.interaction.pd @@ -24,7 +24,7 @@ #X scalar template9 288 91 72 19 325 \;; #X coords 0 446 1 445 0 0 0; #X restore 508 286 pd data9; -#N canvas 150 451 673 314 template9 0; +#N canvas 282 376 705 419 template9 0; #X obj 393 207 filledpolygon q 0 1 0 0 w 0 w h 0 h; #X obj 394 234 drawnumber q 0 0 0; #X obj 171 124 struct template9 float x float y float w float h float q; @@ -34,6 +34,7 @@ #X text 42 17 [struct] outputs messages notifying you when objects of this structure are interacted with. In run mode you get: 'click' (when you click on them) and 'change' (when you change field values by dragging). In edit mode you get: 'select' when you select the object \, 'deselect' when you deselect it and 'displace' when you move it around. Here we catch 'change' and 'select' interactions and pass the pointer through with the [route] object., f 86; #X obj 171 199 route select change displace; #X obj 299 229 unpack p; +#X text 153 316 Note: later we'll see how to deal with arrays in data structures. Unfortunately \, at least until now \, you can't have messages like 'change' when clicking and dragging an array element value., f 65; #X connect 2 0 4 0; #X connect 2 0 7 0; #X connect 7 0 3 0; From cad91dc791c7b17972d4d508f6bf6a93f1ff0613 Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Mon, 19 Aug 2024 16:51:13 +0200 Subject: [PATCH 57/89] update expr object --- doc/5.reference/expr-help.pd | 206 ++++++++--- doc/8.topics/expr.htm | 298 ++++++++++++---- src/x_vexp.c | 640 ++++++++++++++++++++++------------- src/x_vexp.h | 74 ++-- src/x_vexp_fun.c | 626 ++++++++++++++++++++++++++++++---- src/x_vexp_if.c | 608 ++++++++++++++++++++++----------- 6 files changed, 1824 insertions(+), 628 deletions(-) diff --git a/doc/5.reference/expr-help.pd b/doc/5.reference/expr-help.pd index 7f0a6559..beaff296 100644 --- a/doc/5.reference/expr-help.pd +++ b/doc/5.reference/expr-help.pd @@ -1,4 +1,4 @@ -#N canvas 366 23 745 703 12; +#N canvas 1012 305 745 703 12; #X declare -stdpath ./; #N canvas 302 55 911 485 Arrays 0; #X floatatom 123 370 4 0 9 0 - - - 0; @@ -90,7 +90,7 @@ #X text 28 607 see also:; #X obj 285 671 block~; #X obj 339 671 value; -#N canvas 700 94 468 543 All_functions 0; +#N canvas 795 78 513 543 All_functions 0; #N canvas 497 97 374 326 Arithmetic-operators 0; #X obj 57 90 expr $f1 + 4; #X floatatom 57 63 5 0 0 0 - - - 0; @@ -155,7 +155,7 @@ #X connect 19 0 21 0; #X connect 21 0 18 0; #X connect 22 0 1 0; -#X restore 125 229 pd Bitwise-operators; +#X restore 125 226 pd Bitwise-operators; #N canvas 458 88 472 464 If-function 0; #X floatatom 82 53 5 0 0 0 - - - 0; #X floatatom 82 112 5 0 0 0 - - - 0; @@ -177,7 +177,7 @@ #X connect 6 0 8 0; #X connect 8 0 7 0; #X connect 10 0 1 0; -#X restore 125 261 pd If-function; +#X restore 125 256 pd If-function; #N canvas 444 91 443 422 Random-function 0; #X floatatom 107 187 5 0 0 0 - - - 0; #X obj 107 156 expr random(10 \, 20); @@ -197,15 +197,14 @@ #X connect 4 0 3 0; #X connect 7 0 1 0; #X connect 8 0 4 0; -#X restore 125 292 pd Random-function; -#N canvas 292 68 604 529 Table-functions 0; +#X restore 125 286 pd Random-function; +#N canvas 1794 443 604 529 Table-functions 0; #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; -#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; -#X floatatom 364 455 5 0 0 0 - - - 0; +#X msg 364 402 symbol table; +#X floatatom 364 465 5 0 0 0 - - - 0; #X text 64 187 Sums a range of indexes, f 8; #X text 146 189 Sums all indexes, f 8; #X text 225 189 Gives array size, f 5; @@ -218,29 +217,30 @@ #X text 73 267 avg - Averages all indexes; #X text 72 396 Avg - averages a range of indexes; #X text 127 26 There are 5 functions that operate on arrays: Avg \, avg \, Sum \, sum and size., f 45; -#X text 354 286 You can use a symbol type to specify the array name. Note that the syntax requires that the array name is inside quotes., f 23; #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 obj 337 118 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0; +#X obj 337 98 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 restore 125 361 pd Table-functions; +#X restore 336 98 graph; +#X obj 364 432 expr size($s1) \;; +#X text 354 256 You can use a symbol type to specify the array name. Up to expr 0.57 symbol types had to be put in double quotes. In expr verions 0.58 and up this is no longer the case., f 23; +#X connect 3 0 0 0; +#X connect 3 1 1 0; +#X connect 3 2 2 0; +#X connect 4 0 23 0; +#X connect 13 0 9 0; +#X connect 13 1 10 0; +#X connect 14 0 11 0; +#X connect 14 1 12 0; +#X connect 18 0 3 0; +#X connect 19 0 13 0; +#X connect 20 0 14 0; +#X connect 23 0 5 0; +#X restore 125 346 pd Table-functions; #N canvas 286 64 570 578 Power-functions 0; #X floatatom 62 60 5 0 0 0 - - - 0; #X floatatom 62 119 5 0 0 0 - - - 0; @@ -312,7 +312,7 @@ #X connect 31 0 29 0; #X connect 35 0 10 0; #X connect 35 1 18 0; -#X restore 125 394 pd Power-functions; +#X restore 125 376 pd Power-functions; #N canvas 241 137 849 422 Trigonometric-functions 0; #X floatatom 34 54 5 0 0 0 - - - 0; #X floatatom 34 113 5 0 0 0 - - - 0; @@ -395,7 +395,7 @@ #X connect 47 0 24 0; #X connect 48 0 26 0; #X connect 49 0 28 0; -#X restore 125 427 pd Trigonometric-functions; +#X restore 125 406 pd Trigonometric-functions; #N canvas 307 85 592 281 Store-function 0; #X text 40 26 The store function is defined with "=" \, and it can store the result of any operation into a variable or table index.; #X floatatom 62 211 5 0 0 0 - - - 0; @@ -413,7 +413,7 @@ #X connect 3 1 2 0; #X connect 5 0 4 0; #X connect 6 0 3 0; -#X restore 125 326 pd Store-function; +#X restore 125 316 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; #N canvas 202 125 850 540 Other-functions 0; @@ -524,7 +524,7 @@ #X connect 64 0 41 0; #X connect 64 1 42 0; #X connect 64 2 60 0; -#X restore 124 492 pd Other-functions; +#X restore 125 496 pd Other-functions; #N canvas 369 170 564 371 Acoustics 0; #X floatatom 70 109 0 0 0 0 - - - 0; #X floatatom 70 164 0 0 0 0 - - - 0; @@ -564,7 +564,7 @@ #X connect 12 0 7 0; #X connect 20 0 9 0; #X connect 21 0 10 0; -#X restore 124 460 pd Acoustics; +#X restore 125 436 pd Acoustics; #N canvas 455 162 370 439 Logic-operators 0; #X text 107 292 Logical Not; #X obj 75 325 expr !$f1; @@ -603,7 +603,7 @@ #X connect 14 0 15 0; #X connect 15 0 13 0; #X connect 16 0 1 0; -#X restore 125 197 pd Logic-operators; +#X restore 125 196 pd Logic-operators; #N canvas 384 197 547 333 Relational-operators 0; #X floatatom 48 55 5 0 0 0 - - - 0; #X floatatom 48 110 5 0 0 0 - - - 0; @@ -643,9 +643,137 @@ #X connect 21 0 7 0; #X connect 22 0 25 0; #X connect 25 0 23 0; -#X restore 125 167 pd Relational-operators; +#X restore 125 166 pd Relational-operators; +#N canvas 832 68 692 1083 string-functions 0; +#X obj 334 63 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X obj 54 173 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X obj 54 63 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X obj 55 87 expr "hello"; +#X obj 335 87 expr symbol(4.52); +#X obj 54 253 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X obj 55 277 expr tolower("HELLO"); +#X obj 54 333 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X obj 55 357 expr tonlower("HELLO" \, 2); +#X symbolatom 55 383 10 0 0 0 - - - 0; +#X symbolatom 55 301 10 0 0 0 - - - 0; +#X symbolatom 55 221 10 0 0 0 - - - 0; +#X symbolatom 335 111 10 0 0 0 - - - 0; +#X symbolatom 55 111 10 0 0 0 - - - 0; +#X obj 334 253 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X obj 334 333 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X symbolatom 335 383 10 0 0 0 - - - 0; +#X symbolatom 335 301 10 0 0 0 - - - 0; +#X obj 335 277 expr toupper("hello"); +#X obj 335 357 expr tonupper("hello" \, 2); +#X obj 54 423 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X obj 55 447 expr strlen("hello"); +#X floatatom 55 471 5 0 0 0 - - - 0; +#X obj 334 423 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X symbolatom 335 471 15 0 0 0 - - - 0; +#X obj 335 447 expr strcat ("hello " \, "world"); +#X obj 54 503 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X symbolatom 55 551 15 0 0 0 - - - 0; +#X obj 55 527 expr strncat ("hello " \, "world" \, 2); +#X obj 54 663 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X obj 54 687 symbol hello; +#X listbox 54 710 20 0 0 0 - - - 0; +#X floatatom 55 823 5 0 0 0 - - - 0; +#X floatatom 109 823 5 0 0 0 - - - 0; +#X floatatom 162 823 5 0 0 0 - - - 0; +#X floatatom 216 823 5 0 0 0 - - - 0; +#X obj 55 737 expr strcmp ($s1 \, "hello") \; strcmp($s1 \, "HELLO") \; strcasecmp($s1 \, "HELLO") \; strncmp($s1 \, "heWorld" \, 2) \; strncasecmp($s1 \, "HEWORLD" \, 2) \;; +#X floatatom 269 823 5 0 0 0 - - - 0; +#X obj 334 583 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X symbolatom 335 633 10 0 0 0 - - - 0; +#X obj 335 607 expr strpbrk("hello" \, "lx"); +#X obj 334 663 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X floatatom 335 710 5 0 0 0 - - - 0; +#X obj 335 687 expr strspn("hello" \, "ehx"); +#X obj 54 583 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X floatatom 55 630 5 0 0 0 - - - 0; +#X obj 55 607 expr strcspn("hello" \, "lx"); +#X obj 55 197 expr symboln(4.52 \, 6 \, 3); +#X text 46 142 symboln(flt \, length \, decimal length); +#X obj 334 173 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X symbolatom 335 221 10 0 0 0 - - - 0; +#X text 331 142 symboln(sym \, length \, sym trim length); +#X obj 335 197 expr symboln("hello" \, 5 \, 3); +#X obj 56 934 array define expr2_\$0; +#X floatatom 65 1034 5 0 0 0 - - - 0; +#X msg 409 961 symbol expr1_; +#X msg 517 960 symbol expr2_; +#X obj 65 972 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X obj 416 804 loadbang; +#X msg 416 828 50; +#X obj 65 996 expr size(strcat(if (!strcmp($s2 \, "") \, "expr0_" \, $s2) \, sym(\$0))), f 65; +#X text 53 914 table with size 200; +#X obj 466 852 array size expr2_\$0; +#X obj 416 875 array size expr1_\$0; +#X msg 466 828 200; +#X text 213 871 table with size 50; +#X text 53 871 table with size 100; +#X text 50 6 String Functions; +#X obj 216 889 array define expr1_\$0; +#X obj 56 888 array define expr0_\$0; +#X obj 334 503 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X symbolatom 335 551 20 0 0 0 - - - 0; +#X obj 335 527 expr strcat ("hello " \, "world " \, "again"); +#X text 90 971 checking for null symbol input; +#X text 408 902 First bang the expr; +#X text 408 920 then click one of the below; +#X text 408 936 then bang the expr again; +#X text 48 156 for floats; +#X text 329 156 for symbols; +#X text 50 26 for more info see string functions' manuals in C language; +#X connect 0 0 4 0; +#X connect 1 0 47 0; +#X connect 2 0 3 0; +#X connect 3 0 13 0; +#X connect 4 0 12 0; +#X connect 5 0 6 0; +#X connect 6 0 10 0; +#X connect 7 0 8 0; +#X connect 8 0 9 0; +#X connect 14 0 18 0; +#X connect 15 0 19 0; +#X connect 18 0 17 0; +#X connect 19 0 16 0; +#X connect 20 0 21 0; +#X connect 21 0 22 0; +#X connect 23 0 25 0; +#X connect 25 0 24 0; +#X connect 26 0 28 0; +#X connect 28 0 27 0; +#X connect 29 0 30 0; +#X connect 30 0 31 0; +#X connect 31 0 36 0; +#X connect 36 0 32 0; +#X connect 36 1 33 0; +#X connect 36 2 34 0; +#X connect 36 3 35 0; +#X connect 36 4 37 0; +#X connect 38 0 40 0; +#X connect 40 0 39 0; +#X connect 41 0 43 0; +#X connect 43 0 42 0; +#X connect 44 0 46 0; +#X connect 46 0 45 0; +#X connect 47 0 11 0; +#X connect 49 0 52 0; +#X connect 52 0 50 0; +#X connect 55 0 60 1; +#X connect 56 0 60 1; +#X connect 57 0 60 0; +#X connect 58 0 59 0; +#X connect 58 0 64 0; +#X connect 59 0 63 0; +#X connect 60 0 54 0; +#X connect 64 0 62 0; +#X connect 70 0 72 0; +#X connect 72 0 71 0; +#X restore 125 466 pd string-functions; #X restore 505 549 pd All_functions \; and operators; -#N canvas 204 96 961 640 [expr] 0; +#N canvas 50 475 961 640 [expr] 0; #X obj 206 123 expr 1; #X floatatom 206 153 4 0 0 0 - - - 0; #X floatatom 307 151 4 0 0 0 - - - 0; @@ -1076,12 +1204,9 @@ #X obj 278 355 expr~ $v1 + $f2; #X floatatom 401 355 5 0 0 0 - - - 0; #X obj 242 671 cos~; -#X text 51 147 These objects have several built in operators and functions and the syntax is quite similar to how expressions are written in C. They receive input variables via the inlets and understand the variable types: '$f#' (floats) \, '$i#' (integers) and '$s#' (symbols \, used to represent array names) - '#' is the inlet number (up to 100) as below:, f 88; -#X text 518 670 updated for Pd version 0.51-3; #X obj 70 33 expr; #X obj 63 58 expr~; #X obj 57 96 fexpr~; -#X text 26 3 Expression evaluation family of objects By Shahrokh Yadegari - Version 0.57, f 75; #X text 107 96 - evaluation of audio signal expressions; #X text 107 58 - evaluation of audio signal expressions; #X text 107 33 - evaluation of control data expressions; @@ -1103,7 +1228,7 @@ #X restore 451 91 pd reference; #X obj 8 595 cnv 1 730 1 empty empty empty 8 12 0 13 #000000 #000000 0; #X text 655 90 <= click; -#N canvas 705 69 573 527 reference 0; +#N canvas 615 128 573 527 reference 0; #X obj 9 43 cnv 5 550 5 empty empty INLETS: 8 18 0 13 #202020 #000000 0; #X obj 9 258 cnv 2 550 2 empty empty OUTLETS: 8 12 0 13 #202020 #000000 0; #X obj 9 347 cnv 2 550 2 empty empty ARGUMENTS: 8 12 0 13 #202020 #000000 0; @@ -1129,7 +1254,7 @@ #X text 60 119 stop/start - in [fexpr~]: stop/start computation., f 70; #X text 151 139 in [fexpr~]: clear input/output memory \, optional symbol specifies a specific input (such as x1) or output (y1)., f 57; #X text 84 183 float - if inlet type is '$f#' or '$i#' ('#' is inlet number)., f 62; -#X text 83 374 expression including operators \, functions \, inlet types \, float and symbols (for array names and variables). See html reference and examples for all operators and functions. Semicolons create more expressions (and outlets). Inlet type has the format '$t#' - where 't' is type (f \, i \, s \, v and x) and # is the inlet number \, fexpr~'s 'x' type also has a sample number inside brackets and fexpr~ also has a 'y' variable for output samples with previous samples inside brackets as well (default: output zeros)., f 66; +#X text 83 374 expression including operators \, functions \, inlet types \, float and symbols. See html reference and examples for all operators and functions. Semicolons create more expressions (and outlets). Inlet type has the format '$t#' - where 't' is type (f \, i \, s \, v and x) and # is the inlet number \, fexpr~'s 'x' type also has a sample number inside brackets and fexpr~ also has a 'y' variable for output samples with previous samples inside brackets as well (default: output zeros)., f 66; #X restore 561 91 pd reference; #X text 338 328 <-- 1st inlet is an audio signal vector/block; #X text 256 443 'n' index for '$x#' is from 0 to minus "vector size - 1".; @@ -1147,9 +1272,12 @@ #X obj 335 638 sin; #X text 366 607 - other binary operators (control only); #X text 364 637 - trigonometric functions (control only); +#X text 26 3 Expression evaluation family of objects By Shahrokh Yadegari - Version 0.58, f 75; +#X text 518 670 updated for Pd version 0.54-2; +#X text 51 147 These objects have several built in operators and functions and the syntax is quite similar to how expressions are written in C. They receive input variables via the inlets and understand the variable types: '$f#' (floats) \, '$i#' (integers) and '$s#' (symbols \, used to represent array names) - '#' is the inlet number (up to 100) as below:, f 88; #X connect 16 0 15 2; #X connect 17 0 15 1; #X connect 18 0 15 0; #X connect 19 0 25 0; #X connect 26 0 25 1; -#X connect 40 0 41 0; +#X connect 37 0 38 0; diff --git a/doc/8.topics/expr.htm b/doc/8.topics/expr.htm index 3eba9312..1dde69a7 100644 --- a/doc/8.topics/expr.htm +++ b/doc/8.topics/expr.htm @@ -167,14 +167,14 @@


                -

                [expr], [expr~], [fexpr~]

                +

                Expr, Expr~, Fexpr~

                Based on original sources from IRCAM’s jMax Released under BSD License.

                -

                The [expr] family is a set of C-like expression evaluation objects for the graphical music language Pure Data. It used to come as an ‘extra’ external, but it is now a built-in native object.

                +

                The expr family is a set of C-like expression evaluation objects for the graphical music language Pure Data. It used to come as an ‘extra’ external, but it is now a built-in native object.

                -

                [expr] runs in control rate and evaluates C-like expressions. See below for the list of operators. Multiple expressions separated by semicolons can be defined in a single [expr] object and this results in multiple outlets (up to 100, each for each expression). Expressions are evaluated from right to left (which means that the bottom expression will be the first executed.) The number of inlets in [expr] are defined by variables that take a few different forms: $i#, $i# and $s# for 'integers', 'floats' and 'symbols' ('#' is an inlet number from 1 up to 100, ordered from left to right). As an example, we can have 3 inlets defined as "$i1", "$f2" and "$s3", where:

                +

                expr runs in control rate and evaluates C-like expressions. See below for the list of operators. Multiple expressions separated by semicolons can be defined in a single expr object and this results in multiple outlets (up to 100, each for each expression). Expressions are evaluated from right to left (which means that the bottom expression will be the first executed.) The number of inlets in expr are defined by variables that take a few different forms: $i#, $i# and $s# for 'integers', 'floats' and 'symbols' ('#' is an inlet number from 1 up to 100, ordered from left to right). As an example, we can have 3 inlets defined as "$i1", "$f2" and "$s3", where:

                • $i1 is the input from the first (left) inlet and is treated as an integer
                • @@ -187,7 +187,9 @@

                  [expr], [expr~], [fexpr~]

                  Type conversion from a float input to an integer is done automatically if the inlet is defined as an integer. Conversely, you can convert it explicitly by using functions (see below for the list of functions).

                  -

                  [expr~] is designed to efficiently combine signal and control stream processing by vector operations on the basis of the audio block size. The operations, functions, and syntax for [expr~] is just like [expr] with the addition of the $v# variable for signal vector input (also numbered up to 100). The '$v' is needed at least for the first and main input, so:

                  +

                  expr is also able to manipulate and output symbols. A symbol is written as a string with quotes around it, such as "hello", or as a symbol input $s# such as $s2. For more information about supported string manipulation functions see below. + +

                  expr~ is designed to efficiently combine signal and control stream processing by vector operations on the basis of the audio block size. The operations, functions, and syntax for expr~ is just like expr with the addition of the $v# variable for signal vector input (also numbered up to 100). The '$v' is needed at least for the first and main input, so:

                  • $v1 - means the first inlet is a signal input
                  • @@ -197,16 +199,16 @@

                    [expr], [expr~], [fexpr~]

                  -

                  The result of an expression from [expr~] is also an audio signal and multiple expressions up to 1000 can also be defined via semicolons.

                  +

                  The result of an expression from expr~ is also an audio signal and multiple expressions up to 1000 can also be defined via semicolons.

                  -

                  Note for MSP users: Currently in the MSP version all signal inputs should come first followed by other types of inlet. (There seems to be no way of mixing signal and other types of inlets in their order in Max/MSP, if you know otherwise, please let me know.) This means that signal inlets cannot be mixed with other types of inlets. For example, [expr~ $v1 + $f2 + $v3] is not legal. The second and third inlet should be switched and [expr~ $v1 + $v2 + $f3] should be used. In Pd you can mix them in any way you want.

                  +

                  Note for MSP users: Currently in the MSP version all signal inputs should come first followed by other types of inlet. (There seems to be no way of mixing signal and other types of inlets in their order in Max/MSP, if you know otherwise, please let me know.) This means that signal inlets cannot be mixed with other types of inlets. For example, “expr~ $v1$f2$v3 ” is not legal. The second and third inlet should be switched and “expr~ $v1$v2$f3” should be used. In Pd you can mix them in any way you want.

                  -

                  The [fexpr~] object provides a flexible mechanism for building FIR and IIR filters by evaluating expressions on a sample by sample basis and providing access to prior samples of the input and output audio streams. When fractional offset is used, [fexpr~] uses linear interpolation to determine the value of the indexed sample. The operations, functions, and syntax for [fexpr~] is just like [expr~] with the addition of $x# and $y# variables. [fexpr~] can access previous input and output samples up to the block size (64 by default).

                  +

                  The fexpr~ object provides a flexible mechanism for building FIR and IIR filters by evaluating expressions on a sample by sample basis and providing access to prior samples of the input and output audio streams. When fractional offset is used, fexpr~ uses linear interpolation to determine the value of the indexed sample. The operations, functions, and syntax for expr~ is just like expr with the addition of $x# and $y# variables. fexpr~ can access previous input and output samples up to the block size (64 by default).

                  -

                  $x# is used to denote a signal input whose samples we would like to access. The syntax is $x followed by '#' (the inlet number up to 100) and the samples indexed by brackets, for example $x1[-1] specifies the previous sample of the first inlet. Therefore, if we are to build a simple filter which replaces every sample by the average of that sample and its previous one, we would use [fexpr~ ($x1[0] + $x1[-1]) / 2]. For ease of when the brackets are omitted, the current sample is implied, so we can write the previous filter expression as follows: [fexpr~ ($x1 + $x1[-1]) / 2]. To build IIR filters $y# is used to access the previous output samples indexed from -1 inside brackets. Note now that '#' here is used to define the outlet number.

                  +

                  $x# is used to denote a signal input whose samples we would like to access. The syntax is $x followed by '#' (the inlet number up to 100) and the samples indexed by brackets, for example $x1[-1] specifies the previous sample of the first inlet. Therefore, if we are to build a simple filter which replaces every sample by the average of that sample and its previous one, we would use “fexpr~ ($x1[0]+$x1[-1])/2 ”. For ease of when the brackets are omitted, the current sample is implied, so we can write the previous filter expression as follows: “ fexpr~ ($x1+$x1[-1])/2”. To build IIR filters $y# is used to access the previous output samples indexed from -1 inside brackets. Note now that '#' here is used to define the outlet number.

                  -

                  The first inlet also needs to be a signal input ($x1), the output of [fexpr~] is a signal output and multiple expressions can also be defined via semicolons and each will correspond to an outlet that can be accessed by '$y#'. Note that '$v#' is not allowed in [fexpr~], so:

                  +

                  The first inlet also needs to be a signal input ($x1), the output of fexpr~ is a signal output and multiple expressions can also be defined via semicolons and each will correspond to an outlet that can be accessed by '$y#'. Note that '$v#' is not allowed in fexpr~, so:

                  • $x1[n] - means the first inlet is a signal input and 'n' is an index from 0 to -block size
                  • @@ -218,7 +220,7 @@

                    [expr], [expr~], [fexpr~]


                    -

                    The operators [expr], [expr~] and [fexpr~] support (listed from highest precedence to lowest) are as follows:

                    +

                    The operators expr, expr~ and fexpr~ support (listed from highest precedence to lowest) are as follows:

          if () 3 conditional - if (condition, IfTrue-expr, IfFalse-expr) - in expr~ if ‘condition’ is a signal, the result will be determined on sample by sample basis (added in version 0.4) conditional - if (condition, IfTrue-expr, IfFalse-expr) - in [expr~] if ‘condition’ is a signal, the result will be determined on sample by sample basis (added in version 0.4)
          int ()
          if() 3conditional - if (condition, IfTrue-expr, IfFalse-expr) - in expr~ if ‘condition’ is a signal, the result will be determined on sample by sample basis (added in version 0.4)conditional - if (condition, IfTrue-expr, IfFalse-expr) - in [expr~] if ‘condition’ is a signal, the result will be determined on sample by sample basis (added in version 0.4)
          isinf()
          @@ -332,21 +334,24 @@

          The operators [expr], [expr~] and [fexpr~] support (listed fr

          -

          The supported functions for [expr], [expr~] and [fexpr~] are:

          +

          The supported functions for expr, expr~ and fexpr~ are:

          - +General Functions + +
          - - - + + + - - + + @@ -391,7 +396,7 @@

          The supported functions for [expr], [expr~] and [fexpr~] are:

          - + @@ -436,14 +441,17 @@

          The supported functions for [expr], [expr~] and [fexpr~] are:

          Functions # of Args Description Function
          Name
          # of
          Args
          + Description
          if () 3 conditional - if (condition, IfTrue-expr, IfFalse-expr) - in [expr~] if ‘condition’ is a signal, the result will be determined on sample by sample basis (added in version 0.4) 3 conditional - if (condition, IfTrue-expr, IfFalse-expr) - in expr~ if ‘condition’ is a signal, the result will be determined on sample by sample basis (added in version 0.4)
          int ()
          if() 3conditional - if (condition, IfTrue-expr, IfFalse-expr) - in [expr~] if ‘condition’ is a signal, the result will be determined on sample by sample basis (added in version 0.4)conditional - if (condition, IfTrue-expr, IfFalse-expr) - in expr~ if ‘condition’ is a signal, the result will be determined on sample by sample basis (added in version 0.4)
          isinf()
          -

          power functions

          +

          + +Power Functions - +
          - - - + + + @@ -510,15 +518,16 @@

          The supported functions for [expr], [expr~] and [fexpr~] are:

          Functions # of Args Description Function
          Name
          # of
          Args
          + Description
          - -

          Trigonometric (all trigonometric functions here work with radians)

          - - +

          + +Trigonometric (all trigonometric functions here expect radian values) +

          - - - + + + @@ -587,58 +596,68 @@

          The supported functions for [expr], [expr~] and [fexpr~] are:

          + + + + +
          Functions # of Args Description Function
          Name
          # of
          Args
          + Description
          1 inverse hyperbolic tangent
          hypot()2 euclidean distance function (0 to this location)
          -

          Table Functions

          - - +

          + + Table Functions +

          +
          - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + +
          Functions # of Args Description Function
          Name
          # of
          Args
          Description
          size()1size of a tablesize()1size of a table
          sum()1sum of all elements of a tablesum()1sum of all elements of a table
          Sum()3sum of elements of a specified boundary of a tableSum()3sum of elements of a specified boundary of a table
          avg()1averages all elements of a tableavg()1averages all elements of a table
          Avg()3averages elements of a specified boundary of a tableAvg()3averages elements of a specified boundary of a table
          -

          Acoustics

          - - +

          + +Acoustics Functions + +

          +
          - - - + + + @@ -675,11 +694,154 @@

          The supported functions for [expr], [expr~] and [fexpr~] are:

          Functions # of Args Description Function
          Name
          # of
          Args
          Description
          +

          + String Manipulation Functions + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Function
          Name
          # of
          Args
          returns Description
          symbol(int/float/symbol)
          sym(int/float/symbol)
          1 symbol symbol formatted based on the type of the input +
          symboln(int/float/symbol, int, int)
          symn(int/float/symbol, int, int)
          3 symbol symbol formatted using sprintf "%#.#s" formatting string construction, where the first number argument is the length of the final symbol, and the second number argument is the number of decimal point included +
          strlen(symbol) 1 int length of symbol +
          tolower(symbol) 1 symbol convert all upper-case letters of the string to the corresponding lower-case letters +
          tonlower(symbol, int) 2 symbol convert n'th character of the string from upper-case letter to the corresponding lower-case letter +
          +toupper(symbol) 1 symbol convert all lower-case letters of the string to the corresponding upper-case letters +
          tonupper(symbol, int) 2 symbol convert n'th character of the string from lower-case letter to the corresponding upper-case letter +
          strcat(symbol, symbol, ...) var symbol Concatenate two or more strings +
          strncat(symbol, symbol, int) 3 symbol Contatenate the first string, by no more than n characters of the second string +
          strcmp(symbol, symbol) 2 int Compare two strings; return an integer greater than, equal to, or less than 0, according as the first string is greater than, + equal to, or less than the second string. +
          strncmp(symbol, symbol, int) 3 int Compare no more than n characters of two strings; return an integer greater than, equal to, or less than 0, according as the first string is greater than, +
          strcasecmp(symbol, symbol) 2 int similar to strcmp() but ignore case of the letters +
          strncasecmp(symbol, symbol, int) 3 int similar to strncmp() but ignore case of the letters +
          strpbrk(symbol, symbol) 2 symbol In the first string locate the first + occurrence of any character in the second (character set) string and + return a substring of the first string starting with the found character. + If no characters from second string is found return 0; +
          strspn(symbol, symbol) 2 int return the string array index of the first character of the first string which is not in the + second (charset) string, else return the index of the first null character. +
          strcspn(symbol, symbol) 2 int return the string array index of the first character of the + first string which is also in charset, else return the index of the first null character. +
          + + +
          +


          CHANGELOG:

          -

          New Additions in version 0.57

          +

          version 0.58

          +
            +
          • Added string functions in expr; now expr can output symbols (major redesign)
          • +
          • Provide better error messages; now expr prints the expr string when reporting errors +
          • Fixed the expr~ array[0]" bug +
          • Fixed a memory issue were extra unused output vectors were
            + allocated for each inlet +
          • NOTE: the syntax func("$s#", ...) is now deprecated and func($s#, ...) should be used +
          + +

          version 0.57

          • fixed a bug in fact().
          • @@ -689,18 +851,18 @@

            New Additions in version 0.57

          -

          New Additions in version 0.56

          +

          version 0.56

            -
          • [fexpr~] now accepts a float in its first input.
          • +
          • Fexpr~ now accepts a float in its first input.
          • Added avg() and Avg() back to the list of functions
          -

          New Additions in version 0.55

          +

          version 0.55

            -
          • [expr], [expr~], and [fexpr~] are now built-in native objects.
          • +
          • Expr, expr~, and fexpr~ are now built-in native objects.
          • The arrays now redraw after a store into one of their members
          • ex_if() (the “if()” function is reworked to only evaluate either the left or the right args depending on the truth value of the condition. However, if the condition is an audio vector, both the left and the right are evaluated regardless.
          • priority of ‘,’ and ‘=’ was switched to fix the bug of using store “=” in functions with multiple arguments, which caused an error during execution.
          • @@ -708,29 +870,29 @@

            New Additions in version 0.55

          -

          New Additions in version 0.5

          +

          version 0.5

            -
          • [expr], [expr~] and [fexpr~] are now built-in native objects.
          • +
          • Expr, expr~, and fexpr~ are now built-in native objects.
          • minor fixes/improvements.
          -

          New Additions in version 0.4

          +

          version 0.4

            -
          • [expr], [expr~] and [fexpr~] now support multiple expressions separated by semicolons which results in multiple outlets.
          • +
          • Expr, expr~, and fexpr~ now support multiple expressions separated by semicolons which results in multiple outlets.
          • Variables are supported now in the same way they are supported in C. - Variables have to be defined with the “value” object prior to execution.
          • A new if function if (condition-expression, IfTrue-expression, IfFalse-expression) has been added.
          • New math functions added.
          • -
          • New shorthand notations for [fexpr~] have been added. +
          • New shorthand notations for fexpr~ have been added.
            • $x ->$x1[0] $x# -> $x#[0]
            • $y = $y1[-1] and $y# = $y#[-1]
          • -
          • New ‘set’ and ‘clear’ methods were added for [fexpr~] +
          • New ‘set’ and ‘clear’ methods were added for fexpr~
            • clear - clears all the past input and output buffers
            • diff --git a/src/x_vexp.c b/src/x_vexp.c index 96583394..d07efb8e 100644 --- a/src/x_vexp.c +++ b/src/x_vexp.c @@ -1,46 +1,59 @@ /* Copyright (c) IRCAM. -* For information on usage and redistribution, and for a DISCLAIMER OF ALL -* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ + * For information on usage and redistribution, and for a DISCLAIMER OF ALL + * WARRANTIES, see the file, "LICENSE.txt," in this distribution. + */ /* "expr" was written by Shahrokh Yadegari c. 1989. -msp */ /* "expr~" and "fexpr~" conversion by Shahrokh Yadegari c. 1999,2000 */ /* - * Feb 2002 - added access to variables - * multiple expression support - * new short hand forms for fexpr~ - * now $y or $y1 = $y1[-1] and $y2 = $y2[-1] - * --sdy * - * July 2002 - * fixed bugs introduced in last changes in store and ET_EQ - * --sdy + * July 2024, Version 0.58 (major changes) + * - Added string functions in expr; now expr can output sympols + * - fixed the expr~ array[0]" bug + * - Provide better error messages; + * now expr prints the expr string when reporting errors + * - fixed a memory issue were extra unused vector output was + * allocated for each inlet even though the were not used + * - cleaned up some indentation issues * - * Oct 2015 - * $x[-1] was not equal $x1[-1], not accessing the previous block - * (bug fix by Dan Ellis) + * Oct 2020, Version 0.57 + * - fixed a bug in fact() + * - fixed the bad lvalue bug - "4 + 5 = 3" was not caught before + * - fact() (factorial) now calculates and returns its value in double + * - Added mtof(), mtof(), dbtorms(), rmstodb(), powtodb(), dbtopow() * * July 2017, Version 0.55 * - The arrays now redraw after a store into one of their members - * - ex_if() (the "if()" function is reworked to only evaluate - * either the left or the right args depending on the truth - * value of the condition. However, if the condition is a - * vector, both the left and the right are evaluated regardless. - * - priority of ',' and '=' was switched to fix the bug of using - * store "=" in functions with multiple arguments, which caused - * an error during execution. - * - The number of inlet and outlets (MAX_VARS) is now set at 100 + * - ex_if() (the "if()" function is reworked to only evaluate + * either the left or the right args depending on the truth + * value of the condition. However, if the condition is a + * vector, both the left and the right are evaluated regardless. + * - priority of ',' and '=' was switched to fix the bug of using + * store "=" in functions with multiple arguments, which caused + * an error during execution. + * - The number of inlet and outlets (EX_MAX_INLETS) is now set at 100 + * + * Oct 2015 + * $x[-1] was not equal $x1[-1], not accessing the previous block + * (bug fix by Dan Ellis) + * + * July 2002 + * fixed bugs introduced in last changes in store and ET_EQ + * --sdy * * Jan 2018, Version 0.56 - * -fexpr~ now accepts a float in its first input - * -Added avg() and Avg() back to the list of functions + * -fexpr~ now accepts a float in its first input + * -Added avg() and Avg() back to the list of functions + * + * Feb 2002 + * added access to variables + * multiple expression support + * new short hand forms for fexpr~ + * now $y or $y1 = $y1[-1] and $y2 = $y2[-1] + * --sdy * - * Oct 2020, Version 0.57 - * - fixed a bug in fact() - * - fixed the bad lvalue bug - "4 + 5 = 3" was not caught before - * - fact() (factorial) now calculates and returns its value in double - * - Added mtof(), mtof(), dbtorms(), rmstodb(), powtodb(), dbtopow() */ /* @@ -72,6 +85,7 @@ #include #include +#include #include #include "x_vexp.h" #include @@ -91,7 +105,7 @@ static struct ex_ex *ex_lex(struct expr *expr, long int *n); struct ex_ex *ex_match(struct ex_ex *eptr, long int op); struct ex_ex *ex_parse(struct expr *expr, struct ex_ex *iptr, struct ex_ex *optr, long int *argc); -static int ex_checklval (struct ex_ex *eptr); +static int ex_checklval (struct expr *e, struct ex_ex *eptr); struct ex_ex *ex_eval(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int i); @@ -217,7 +231,7 @@ expr_donew(struct expr *expr, int ac, t_atom *av) t_binbuf *b; int i; - memset(expr->exp_var, 0, MAX_VARS * sizeof (*expr->exp_var)); + memset(expr->exp_var, 0, EX_MAX_INLETS * sizeof (*expr->exp_var)); #ifdef PD b = binbuf_new(); binbuf_add(b, ac, av); @@ -245,9 +259,9 @@ expr_donew(struct expr *expr, int ac, t_atom *av) strcpy(buf + length, string); length = newlength; if (ap->a_type == A_SEMI) - buf[length-1] = '\n'; + buf[length-1] = '\n'; else - buf[length-1] = ' '; + buf[length-1] = ' '; } if (length && buf[length-1] == ' ') { @@ -278,32 +292,31 @@ expr_donew(struct expr *expr, int ac, t_atom *av) } expr->exp_stack[expr->exp_nexpr] = (struct ex_ex *)fts_malloc(max_node * sizeof (struct ex_ex)); - if (!expr->exp_stack[expr->exp_nexpr]) { - post_error( (fts_object_t *) expr, - "expr: malloc for expr nodes failed\n"); - goto error; - } - expr->exp_stack[expr->exp_nexpr][max_node-1].ex_type=0; + if (!expr->exp_stack[expr->exp_nexpr]) { + post_error( (fts_object_t *) expr, + "expr: malloc for expr nodes failed\n"); + goto error; + } + expr->exp_stack[expr->exp_nexpr][max_node-1].ex_type=0; expr->exp_nexpr++; ret = ex_match(list, (long)0); - if (expr->exp_nexpr > MAX_VARS) - /* we cannot exceed MAX_VARS '$' variables */ + if (expr->exp_nexpr > EX_MAX_INLETS) + /* we cannot exceed EX_MAX_INLETS '$' variables */ { post_error((fts_object_t *) expr, "expr: too many variables (maximum %d allowed)", - MAX_VARS); + EX_MAX_INLETS); goto error; } if (!ret) /* syntax error */ goto error; ret = ex_parse(expr, list, expr->exp_stack[expr->exp_nexpr - 1], (long *)0); - if (!ret || ex_checklval(expr->exp_stack[expr->exp_nexpr - 1])) + if (!ret || ex_checklval(expr, expr->exp_stack[expr->exp_nexpr - 1])) goto error; fts_free(list); } *ret = nullex; - t_freebytes(exp_string, exp_strlen+1); return (0); error: for (i = 0; i < expr->exp_nexpr; i++) { @@ -317,6 +330,35 @@ expr_donew(struct expr *expr, int ac, t_atom *av) return (1); } + +void * +ex_calloc(size_t count, size_t size) +{ + //printf ("calloc called with %zu bytes\n", size); + return calloc(count, size); +} + +void +ex_free(void *ptr) +{ + free (ptr); +} + + +void * +ex_malloc(size_t size) +{ + //printf ("malloc called with %zu bytes\n", size); + return malloc(size); +} + +void * +ex_realloc(void *ptr, size_t size) +{ + printf ("realloc called with %zu bytes\n", size); + return realloc(ptr, size); +} + /* * ex_lex -- This routine is a bit more than a lexical parser since it will * also do some syntax checking. It reads the string s and will @@ -327,51 +369,71 @@ struct ex_ex * ex_lex(struct expr *expr, long int *n) { struct ex_ex *list_arr; - struct ex_ex *exptr; + struct ex_ex *exptr, *p; + static struct ex_ex tmpnodes[EX_MINODES]; long non = 0; /* number of nodes */ long maxnode = 0; + int reallocated = 0; /* did we reallocate the tmp buffer */ - list_arr = (struct ex_ex *)fts_malloc(sizeof (struct ex_ex) * MINODES); - if (! list_arr) { - post("ex_lex: no mem\n"); - return ((struct ex_ex *)0); - } - exptr = list_arr; - maxnode = MINODES; + memset ((void *) tmpnodes, 0, sizeof(struct ex_ex) * EX_MINODES); + + list_arr = tmpnodes; + maxnode = EX_MINODES; - while (8) + while (1) { if (non >= maxnode) { - maxnode += MINODES; - - list_arr = fts_realloc((void *)list_arr, + maxnode += EX_MINODES; + + if (!reallocated) { + list_arr = fts_calloc(maxnode, sizeof (struct ex_ex)); + memcpy (list_arr, tmpnodes, sizeof (struct ex_ex) * EX_MINODES); + if (!list_arr) { + ex_error (expr, "ex_lex: no memory\n"); + return ((struct ex_ex *)0); + } + reallocated = 1; + } else { + p = fts_realloc((void *) list_arr, sizeof (struct ex_ex) * maxnode); - if (!list_arr) { - post("ex_lex: no mem\n"); - return ((struct ex_ex *)0); + if (!p) { + fts_free (list_arr); + ex_error (expr, "ex_lex: no memory\n"); + return ((struct ex_ex *)0); + } + list_arr = p; } - exptr = &(list_arr)[non]; } + exptr = &list_arr[non]; if (getoken(expr, exptr)) { - fts_free(list_arr); + if (reallocated) + fts_free(exptr); return ((struct ex_ex *)0); } non++; if (!exptr->ex_type) break; - - exptr++; } + p = fts_calloc(non, sizeof (struct ex_ex)); + if (!p) { + if (reallocated) + fts_free(list_arr); + ex_error (expr, "ex_lex: no memory\n"); + return ((struct ex_ex *)0); + } + memcpy(p, list_arr, sizeof (struct ex_ex) * non); *n = non; + if (reallocated) + fts_free(list_arr); - return list_arr; + return (p); } /* * ex_match -- this routine walks through the eptr and matches the - * perentheses and brackets, it also converts the function + * parentheses and brackets, it also converts the function * names to a pointer to the describing structure of the * specified function */ @@ -408,12 +470,12 @@ ex_match(struct ex_ex *eptr, long int op) if (eptr[1].ex_type != ET_OP || eptr[1].ex_op != OP_LB) eptr->ex_type = ET_XI0; continue; - /* - * tables, functions, parenthesis, and brackets, are marked as - * operations, and they are assigned their proper operation - * in this function. Thus, if we arrive to any of these in this - * type tokens at this location, we must have had some error - */ + /* + * tables, functions, parenthesis, and brackets, are marked as + * operations, and they are assigned their proper operation + * in this function. Thus, if we arrive to any of these in this + * type tokens at this location, we must have had some error + */ case ET_TBL: case ET_FUNC: case ET_LP: @@ -484,7 +546,7 @@ ex_match(struct ex_ex *eptr, long int op) eptr->ex_type = ET_TBL; tmp = eptr->ex_ptr; if (ex_getsym(tmp, (t_symbol **)&(eptr->ex_ptr))) { - post("expr: syntax error: problms with ex_getsym\n"); + post("expr: syntax error: problem with ex_getsym\n"); return (exNULL); } fts_free((void *)tmp); @@ -549,6 +611,7 @@ ex_parse(struct expr *x, struct ex_ex *iptr, struct ex_ex *optr, long int *argc) struct ex_ex *tmpex; long pre = HI_PRE; long count; + t_ex_func *f; /* function pointer */ if (!iptr) { post("ex_parse: input is null, iptr = 0x%lx\n", iptr); @@ -562,15 +625,10 @@ ex_parse(struct expr *x, struct ex_ex *iptr, struct ex_ex *optr, long int *argc) * the input token list, comma is explicitly checked here since * that is a special operator and is only legal in functions */ - for (eptr = iptr, count = 0; eptr->ex_type; eptr++, count++) + for (eptr = iptr, count = 0; eptr->ex_type; eptr++, count++) { switch (eptr->ex_type) { case ET_SYM: case ET_VSYM: - if (!argc) { - post("expr: syntax error: symbols allowed for functions only\n"); - ex_print(eptr); - return (exNULL); - } /* falls through */ case ET_INT: case ET_FLT: case ET_II: @@ -581,18 +639,31 @@ ex_parse(struct expr *x, struct ex_ex *iptr, struct ex_ex *optr, long int *argc) case ET_VAR: if (!count && !eptr[1].ex_type) { *optr = *eptr; - tmpex = optr; - tmpex->ex_end = ++optr; + tmpex = optr; + tmpex->ex_end = ++optr; + return (optr); + } + break; + case ET_SI: + if (eptr[1].ex_type == ET_LB) { + eptr->ex_flags |= EX_F_SI_TAB; + goto processtable; + } + if (!count && !eptr[1].ex_type) { + eptr->ex_flags &= ~EX_F_SI_TAB; + *optr = *eptr; + tmpex = optr; + tmpex->ex_end = ++optr; return (optr); } break; case ET_XI: case ET_YO: - case ET_SI: case ET_TBL: +processtable: if (eptr[1].ex_type != ET_LB) { - post("expr: syntax error: brackets missing\n"); - ex_print(eptr); + post("expr: '%s' - syntax error: brackets missing\n", + x->exp_string); return (exNULL); } /* if this table is the only token, parse the table */ @@ -611,14 +682,14 @@ ex_parse(struct expr *x, struct ex_ex *iptr, struct ex_ex *optr, long int *argc) case ET_OP: if (eptr->ex_op == OP_COMMA) { if (!argc || !count || !eptr[1].ex_type) { - post("expr: syntax error: illegal comma\n"); - ex_print(eptr[1].ex_type ? eptr : iptr); + post("expr: '%s' - syntax error: illegal comma\n", + x->exp_string); return (exNULL); } } if (!eptr[1].ex_type) { - post("expr: syntax error: missing operand\n"); - ex_print(iptr); + post("expr: '%s' - syntax error: missing operand\n", + x->exp_string); return (exNULL); } if ((eptr->ex_op & PRE_MASK) <= pre) { @@ -628,37 +699,46 @@ ex_parse(struct expr *x, struct ex_ex *iptr, struct ex_ex *optr, long int *argc) break; case ET_FUNC: if (eptr[1].ex_type != ET_LP) { - post("expr: ex_parse: no parenthesis\n"); + post("expr: '%s' - ex_parse: no parenthesis\n", + x->exp_string); return (exNULL); } /* if this function is the only token, parse it */ if (!count && !((struct ex_ex *) eptr[1].ex_ptr)[1].ex_type) { - long ac; + long ac = 0; - if (eptr[1].ex_ptr == (char *) &eptr[2]) { - post("expr: syntax error: missing argument\n"); - ex_print(eptr); - return (exNULL); - } - ac = 0; - savex = *((struct ex_ex *) eptr[1].ex_ptr); - *((struct ex_ex *) eptr[1].ex_ptr) = nullex; *optr = *eptr; - lowpre = ex_parse(x, &eptr[2], optr + 1, &ac); - if (!lowpre) - return (exNULL); - ac++; - if (ac != - ((t_ex_func *)eptr->ex_ptr)->f_argc){ - post("expr: syntax error: function '%s' needs %ld arguments\n", - ((t_ex_func *)eptr->ex_ptr)->f_name, - ((t_ex_func *)eptr->ex_ptr)->f_argc); - return (exNULL); + savex = *((struct ex_ex *) eptr[1].ex_ptr); + /* do we have arguments? */ + if (eptr[1].ex_ptr != (char *) &eptr[2]) { + /* parse the arguments */ + savex = *((struct ex_ex *) eptr[1].ex_ptr); + *((struct ex_ex *) eptr[1].ex_ptr) = nullex; + lowpre = ex_parse(x, &eptr[2], optr + 1, &ac); + if (!lowpre) + return (exNULL); + ac++; } + + f = (t_ex_func *) eptr->ex_ptr; + if (f->f_argc != -1 && ac != f->f_argc){ + ex_error(x, + "syntax error: function '%s' needs %ld arguments\n", + f->f_name, f->f_argc); + return (exNULL); + } else + optr->ex_argc = ac; *((struct ex_ex *) eptr[1].ex_ptr) = savex; - optr->ex_end = lowpre; - return (lowpre); + if (lowpre) { + optr->ex_end = lowpre; + return (lowpre); + } + /* we have no arguments */ + tmpex = optr; + tmpex->ex_end = ++optr; + return (optr); + } eptr = (struct ex_ex *) eptr[1].ex_ptr; break; @@ -667,9 +747,9 @@ ex_parse(struct expr *x, struct ex_ex *iptr, struct ex_ex *optr, long int *argc) if (!count && !((struct ex_ex *) eptr->ex_ptr)[1].ex_type) { if (eptr->ex_ptr == (char *)(&eptr[1])) { - post("expr: syntax error: empty '%s'\n", + ex_error(x, "expr: '%s' - syntax error: empty '%s'\n", + x->exp_string, eptr->ex_type==ET_LP?"()":"[]"); - ex_print(eptr); return (exNULL); } savex = *((struct ex_ex *) eptr->ex_ptr); @@ -683,19 +763,18 @@ ex_parse(struct expr *x, struct ex_ex *iptr, struct ex_ex *optr, long int *argc) break; case ET_STR: default: - ex_print(eptr); - post("expr: ex_parse: type = 0x%lx\n", eptr->ex_type); + post("expr: '%s' - ex_parse: type = 0x%lx\n", + x->exp_string, eptr->ex_type); return (exNULL); } + } if (pre == HI_PRE) { - post("expr: syntax error: missing operation\n"); - ex_print(iptr); + post("expr: '%s' - syntax error: missing operation\n", x->exp_string); return (exNULL); } if (count < 2) { - post("expr: syntax error: mission operand\n"); - ex_print(iptr); + post("expr: '%s' - syntax error: mission operand\n", x->exp_string); return (exNULL); } if (count == 2) { @@ -704,8 +783,8 @@ ex_parse(struct expr *x, struct ex_ex *iptr, struct ex_ex *optr, long int *argc) return (exNULL); } if (!unary_op(lowpre->ex_op)) { - post("expr: syntax error: not a uniary operator\n"); - ex_print(iptr); + post("expr: '%s' - syntax error: not a uniary operator\n", + x->exp_string); return (exNULL); } *optr = *lowpre; @@ -715,29 +794,28 @@ ex_parse(struct expr *x, struct ex_ex *iptr, struct ex_ex *optr, long int *argc) } /* this is the case of using unary operator as a binary opetator */ if (count == 3 && unary_op(lowpre->ex_op)) { - post("expr: syntax error, missing operand before unary operator\n"); - ex_print(iptr); + post("expr: '%s' - syntax error, missing operand before unary operator\n", + x->exp_string); return (exNULL); } if (lowpre == iptr) { - post("expr: syntax error: mission operand\n"); - ex_print(iptr); + post("expr: '%s' - syntax error: mission operand\n", x->exp_string); return (exNULL); } savex = *lowpre; *lowpre = nullex; if (savex.ex_op != OP_COMMA) { - *optr = savex; + *optr = savex; eptr = ex_parse(x, iptr, optr + 1, argc); - } else { - (*argc)++; + } else { + (*argc)++; eptr = ex_parse(x, iptr, optr, argc); - } + } if (eptr) { eptr = ex_parse(x, &lowpre[1], eptr, argc); *lowpre = savex; } - optr->ex_end = eptr; + optr->ex_end = eptr; return (eptr); } @@ -749,7 +827,7 @@ ex_parse(struct expr *x, struct ex_ex *iptr, struct ex_ex *optr, long int *argc) */ static int -ex_checklval(struct ex_ex *eptr) +ex_checklval(struct expr *e, struct ex_ex *eptr) { struct ex_ex *extmp; @@ -759,8 +837,7 @@ ex_checklval(struct ex_ex *eptr) if (eptr[1].ex_type != ET_VAR && eptr[1].ex_type != ET_SI && eptr[1].ex_type != ET_TBL) { - post("Bad left value: "); - ex_print(eptr); + post("expr: '%s' - Bad left value: ", e->exp_string); return (1); } } @@ -1010,7 +1087,7 @@ ex_dzdetect(struct expr *expr) post ("expr -- ex_dzdetect internal error"); etype = ""; } - post ("%s divide by zero detected", etype); + post ("%s divide by zero detected - '%s'", etype, expr->exp_string); expr->exp_error |= EE_DZ; } } @@ -1022,13 +1099,7 @@ ex_dzdetect(struct expr *expr) * in the array. This is a recursive routine. */ -/* SDY - potential memory leak -all the returns in this function need to be changed so that the code -ends up at the end to check for newly allocated right and left vectors which -need to be freed - -look into the variable nullret -*/ +/* SDY - look into the variable nullret */ struct ex_ex * ex_eval(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) /* the expr object data pointer */ @@ -1068,16 +1139,24 @@ ex_eval(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) case ET_SYM: if (optr->ex_type == ET_VEC) { - post_error((fts_object_t *) expr, - "expr: ex_eval: cannot turn string to vector\n"); - return (exNULL); - } - *optr = *eptr; + if (!(expr->exp_error & EE_BADSYM)) { + expr->exp_error |= EE_BADSYM; + post_error((fts_object_t *) expr, + "expr~: '%s': cannot convert string to vector\n", + expr->exp_string); + post_error(expr, + "expr~: No more symbol-vector errors will be reported"); + post_error(expr, + "expr~: till the next reset"); + } + ex_mkvector(optr->ex_vec, 0, expr->exp_vsize); + } else + *optr = *eptr; return (++eptr); case ET_II: if (eptr->ex_int == -1) { post_error((fts_object_t *) expr, - "expr: ex_eval: inlet number not set\n"); + "expr: '%s': inlet number not set\n", expr->exp_string); return (exNULL); } if (optr->ex_type == ET_VEC) { @@ -1104,6 +1183,7 @@ ex_eval(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) } return (++eptr); +/* SDY ET_VSYM is gone? */ case ET_VSYM: if (optr->ex_type == ET_VEC) { post_error((fts_object_t *) expr, @@ -1116,6 +1196,8 @@ ex_eval(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) return (exNULL); } optr->ex_type = ET_SYM; + /* not a temporary symbol; do not free this ET_SYM expression */ + optr->ex_flags &= ~EX_F_TSYM; optr->ex_ptr = expr->exp_var[eptr->ex_int].ex_ptr; return(++eptr); @@ -1176,8 +1258,32 @@ ex_eval(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) return (eval_sigidx(expr, eptr, optr, idx)); case ET_TBL: - case ET_SI: return (eval_tab(expr, eptr, optr, idx)); + case ET_SI: + /* check if the symbol input is a table */ + if (eptr->ex_flags & EX_F_SI_TAB) { + eptr = eval_tab(expr, eptr, optr, idx); + return (eptr); + //return (eval_tab(expr, eptr, optr, idx)); + } + /* it is just a symbol input */ + if (optr->ex_type == ET_VEC) { + if (!(expr->exp_error & EE_BADSYM)) { + expr->exp_error |= EE_BADSYM; + post_error((fts_object_t *) expr, + "expr~: '%s': cannot convert string inlet to vector\n", + expr->exp_string); + post_error(expr, + "expr~: No more symbol-vector errors will be reported"); + post_error(expr, + "expr~: till the next reset"); + } + ex_mkvector(optr->ex_vec, 0, expr->exp_vsize); + return (exNULL); + } + *optr = *eptr++; + return(eptr); + case ET_FUNC: return (eval_func(expr, eptr, optr, idx)); case ET_VAR: @@ -1273,7 +1379,8 @@ ex_eval(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) case OP_SEMI: default: post_error((fts_object_t *) expr, - "expr: ex_print: bad op 0x%x\n", (unsigned)eptr->ex_op); + "expr: '%s' - bad op 0x%x\n", + expr->exp_string, (unsigned)eptr->ex_op); return (exNULL); } @@ -1309,37 +1416,44 @@ eval_func(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) int i; struct ex_ex args[MAX_ARGS]; t_ex_func *f; + int argc; + argc = eptr->ex_argc; f = (t_ex_func *)(eptr++)->ex_ptr; if (!f || !f->f_name) { return (exNULL); } - if (f->f_argc > MAX_ARGS) { + if (argc > MAX_ARGS) { post_error((fts_object_t *) expr, "expr: eval_func: asking too many arguments\n"); return (exNULL); } - /* - * We treat the "if" function differently to be able to evaluate - * the args selectively based on the truth value of the "condition" - */ - if (f->f_func != (void (*)) ex_if) { - for (i = 0; i < f->f_argc; i++) { - args[i].ex_type = 0; - args[i].ex_int = 0; - eptr = ex_eval(expr, eptr, &args[i], idx); - } - (*f->f_func)(expr, f->f_argc, args, optr); + /* + * We treat the "if" function differently to be able to evaluate + * the args selectively based on the truth value of the "condition" + */ + if (f->f_func != (void (*)) ex_if) { + for (i = 0; i < argc; i++) { + args[i].ex_type = 0; + args[i].ex_int = 0; + eptr = ex_eval(expr, eptr, &args[i], idx); + } + (*f->f_func)(expr, argc, args, optr); } else { - for (i = 0; i < f->f_argc; i++) { - args[i].ex_type = 0; - args[i].ex_int = 0; - } - eptr = ex_if(expr, eptr, optr, args, idx); + for (i = 0; i < argc; i++) { + args[i].ex_type = 0; + args[i].ex_int = 0; } - for (i = 0; i < f->f_argc; i++) { + eptr = ex_if(expr, eptr, optr, args, idx); + } + for (i = 0; i < argc; i++) { if (args[i].ex_type == ET_VEC) - fts_free(args[i].ex_vec); + free(args[i].ex_vec); + else if (args[i].ex_type == ET_SYM + && args[i].ex_flags & EX_F_TSYM) { + free(args[i].ex_ptr); + args[i].ex_flags &= ~EX_F_TSYM; + } } return (eptr); } @@ -1383,18 +1497,22 @@ eval_store(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) tbl = (char *) eptr->ex_ptr; break; case ET_SI: + if (eptr->ex_flags & EX_F_SI_TAB) { + post("expr: symbol cannot be a left value '%s'", + expr->exp_string); + retp = exNULL; + return (retp); + } if (!expr->exp_var[eptr->ex_int].ex_ptr) { if (!(expr->exp_error & EE_NOTABLE)) { - post("expr: syntax error: no string for inlet %d", - eptr->ex_int + 1); - post("expr: No more table errors will be reported"); - post("expr: till the next reset"); + post_error(expr, "expr: '%s': syntax error: no string for inlet %ld", + expr->exp_string, eptr->ex_int + 1); + post_error(expr, "expr: No more table errors will be reported"); + post_error(expr, "expr: till the next reset"); expr->exp_error |= EE_NOTABLE; } badleft++; - post("Bad left value: "); - /* report Error */ - ex_print(eptr); + post("expr: '%s' - Bad left value", expr->exp_string); retp = exNULL; return (retp); } else { @@ -1402,9 +1520,8 @@ eval_store(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) } break; default: - post("Bad left value: "); + post("expr: '%s' - Bad left value", expr->exp_string); /* report Error */ - ex_print(eptr); retp = exNULL; return (retp); } @@ -1420,7 +1537,7 @@ eval_store(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) optr->ex_type = ET_INT; optr->ex_int = 0; if (!notable || badleft) - (void)max_ex_tab_store(expr, (t_symbol *)tbl, &arg, &rval, optr); + (void)max_ex_tab_store(expr, (t_symbol *)tbl, &arg, &rval,optr); if (arg.ex_type == ET_VEC) fts_free(arg.ex_vec); return (eptr); @@ -1442,8 +1559,8 @@ eval_tab(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) if (eptr->ex_type == ET_SI) { if (!expr->exp_var[eptr->ex_int].ex_ptr) { if (!(expr->exp_error & EE_NOTABLE)) { - post("expr: syntax error: no string for inlet %d", - eptr->ex_int + 1); + post_error(expr, "expr:'%s': no string for inlet %ld", + expr->exp_string, eptr->ex_int + 1); post("expr: No more table errors will be reported"); post("expr: till the next reset"); expr->exp_error |= EE_NOTABLE; @@ -1468,10 +1585,8 @@ eval_tab(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) if (!(eptr = ex_eval(expr, ++eptr, &arg, idx))) return (eptr); - optr->ex_type = ET_INT; - optr->ex_int = 0; if (!notable) - (void)max_ex_tab(expr, (t_symbol *)tbl, &arg, optr); + (void)max_ex_tab(expr, (t_symbol *)tbl, &arg, 0, optr); if (arg.ex_type == ET_VEC) fts_free(arg.ex_vec); return (eptr); @@ -1491,13 +1606,13 @@ eval_var(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) if (eptr->ex_type == ET_SI) { if (!expr->exp_var[eptr->ex_int].ex_ptr) { - if (!(expr->exp_error & EE_NOVAR)) { - post("expr: syntax error: no string for inlet %d", eptr->ex_int + 1); - post("expr: no more table errors will be reported"); - post("expr: till the next reset"); - expr->exp_error |= EE_NOVAR; - } - novar++; + if (!(expr->exp_error & EE_NOVAR)) { + post("expr: syntax error: no string for inlet %d", eptr->ex_int + 1); + post("expr: no more table errors will be reported"); + post("expr: till the next reset"); + expr->exp_error |= EE_NOVAR; + } + novar++; } else var = (char *) expr->exp_var[eptr->ex_int].ex_ptr; } else if (eptr->ex_type == ET_VAR) @@ -1553,11 +1668,10 @@ eval_sigidx(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) if (fi > 0) { if (!(expr->exp_error & EE_BI_INPUT)) { expr->exp_error |= EE_BI_INPUT; - post("expr: input vector index > 0, (vector x%d[%f])", - eptr->ex_int + 1, i + rem_i); + post("expr: '%s' - input vector index > 0, (vector x%d[%f])", + expr->exp_string, eptr->ex_int + 1, i + rem_i); post("fexpr~: index assumed to be = 0"); post("fexpr~: no error report till next reset"); - ex_print(eptr); } /* just replace it with zero */ i = 0; @@ -1568,8 +1682,8 @@ eval_sigidx(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) expr->exp_p_var[eptr->ex_int])) { if (!(expr->exp_error & EE_BI_INPUT)) { expr->exp_error |= EE_BI_INPUT; - post("expr: input vector index < -VectorSize, (vector x%d[%f])", eptr->ex_int + 1, fi); - ex_print(eptr); + post("expr: '%s' - input vector index < -VectorSize, (vector x%d[%f])", + expr->exp_string, eptr->ex_int + 1, fi); post("fexpr~: index assumed to be = -%d", expr->exp_vsize); post("fexpr~: no error report till next reset"); @@ -1584,15 +1698,15 @@ eval_sigidx(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) if (fi >= 0) { if (!(expr->exp_error & EE_BI_OUTPUT)) { expr->exp_error |= EE_BI_OUTPUT; - post("fexpr~: bad output index, (%f)", fi); - ex_print(eptr); + post("fexpr~: '%s' - bad output index, (%f)", + expr->exp_string, fi); post("fexpr~: no error report till next reset"); post("fexpr~: index assumed to be = -1"); } i = -1; } if (eptr->ex_int >= expr->exp_nexpr) { - post("fexpr~: $y%d illegal: not that many exprs", + post("fexpr~: $y%d illegal: not that many expr's", eptr->ex_int); optr->ex_flt = 0; return (reteptr); @@ -1602,8 +1716,8 @@ eval_sigidx(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) expr->exp_p_res[eptr->ex_int])) { if (!(expr->exp_error & EE_BI_OUTPUT)) { expr->exp_error |= EE_BI_OUTPUT; - post("fexpr~: bad output index, (%f)", fi); - ex_print(eptr); + post("fexpr~: '%s' - bad output index, (%f)", + expr->exp_string, fi); post("fexpr~: index assumed to be = -%d", expr->exp_vsize); } @@ -1674,10 +1788,11 @@ cal_sigidx(struct ex_ex *optr, /* The output value */ int getoken(struct expr *expr, struct ex_ex *eptr) { - char *p; + char *p, *tmpstr; long i; + if (!expr->exp_str) { post("expr: getoken: expression string not set\n"); return (0); @@ -1897,7 +2012,7 @@ getoken(struct expr *expr, struct ex_ex *eptr) * make the user inlets one based rather than zero based * therefore we decrement the number that user has supplied */ - if (!eptr->ex_op || (eptr->ex_op)-- > MAX_VARS) { + if (!eptr->ex_op || (eptr->ex_op)-- > EX_MAX_INLETS) { post("expr: syntax error: inlet or outlet out of range: %s\n", expr->exp_str); return (1); @@ -1931,39 +2046,75 @@ getoken(struct expr *expr, struct ex_ex *eptr) expr->exp_str = p; noinletnum: break; + case '"': - { - struct ex_ex ex = { 0 }; + { + struct ex_ex ex = { 0 }; + char *savestrp; - p = expr->exp_str; - if (!*expr->exp_str || *expr->exp_str == '"') { - post("expr: syntax error: empty symbol: %s\n", --expr->exp_str); - return (1); - } + p = expr->exp_str; + /* + * Before strings were supported a string inlet for functions + * such as size(), avg(), etc had the hacky syntax as + * size ("$s2") + * all other inlet in strings such as 'size ("$f1")' + * were considered syntax error + * Now that strings are processed fully, the quotes are + * no longer necessary, however, in order to keep a backward + * compatibility we process func("$s#") as func($s#) with + * a message to the user as this will become deprecated + */ + if (*p == '$' && p[1] == 's') { + /* check for possible backward compatibilty */ + savestrp = expr->exp_str; if (getoken(expr, &ex)) return (1); - switch (ex.ex_type) { - case ET_STR: - if (ex_getsym(ex.ex_ptr, (t_symbol **)&(eptr->ex_ptr))) { - post("expr: syntax error: getoken: problms with ex_getsym\n"); - return (1); - } - eptr->ex_type = ET_SYM; - break; - case ET_SI: + if (ex.ex_type == ET_SI && *expr->exp_str++ == '"') { + /* this is the old case */ *eptr = ex; - eptr->ex_type = ET_VSYM; + ex_error(expr, "expr: deprecated old func(\"$s#\") format detected;\nDouble quotes should no longer be used\nUse func($s#) instead"); break; - default: - post("expr: syntax error: bad symbol name: %s\n", p); - return (1); } - if (*expr->exp_str++ != '"') { - post("expr: syntax error: missing '\"'\n"); + /* + * not in compatibility mode + * parse as usual + */ + expr->exp_str = savestrp; + p = expr->exp_str; + } + + i = 0; + while (*p != '"') { + if (!*p) { /* missing close quote */ + post("expr: syntax error: missing '\"': \n", expr->exp_str - 1); return (1); } - break; + i++; + p++; + } + tmpstr= calloc(i + 1, sizeof (char)); + if (!tmpstr) { + post("expr: no memory %s: %d\n", __FILE__, __LINE__); + return (1); } + strncpy(tmpstr, expr->exp_str, i); + expr->exp_str= p + 1; + /* + * ET_SYM in the expr string are converted to symbols, + * to avoid the symbol generation in eval + */ + if (ex_getsym(tmpstr, (t_symbol **)&(eptr->ex_ptr))) { + fts_free(tmpstr); + post("expr: syntax error: getoken: problms with ex_getsym %s:%d\n" __FILE__, __LINE__); + return (1); + } + fts_free(tmpstr); + eptr->ex_type = ET_SYM; + /* not a temporary symbol; do not free this ET_SYM expression during eval*/ + eptr->ex_flags &= ~EX_F_TSYM; + break; + + } case '.': case '0': case '1': @@ -2013,8 +2164,8 @@ getoken(struct expr *expr, struct ex_ex *eptr) char * atoif(char *s, long int *value, long int *type) { - const char*s0 = s; - char *p; + const char*s0 = s; + char *p; long lval; float fval; @@ -2058,6 +2209,23 @@ find_func(char *s) return ((t_ex_func *) 0); } +/* + * ex_error - print an error message + */ + +void +ex_error(t_expr *e, const char *fmt, ...) +{ + char buf[1024]; + va_list args; + + post_error( (fts_object_t *) e, "expr: '%s'", e->exp_string); + va_start(args, fmt); + vsprintf(buf, fmt, args); + post_error((fts_object_t *) e, "%s", buf); + va_end(args); + +} /* * ex_print -- print an expression array @@ -2066,9 +2234,11 @@ find_func(char *s) void ex_print(struct ex_ex *eptr) { - struct ex_ex *extmp; + struct ex_ex *extmp; - extmp = eptr->ex_end; +#define post printf + + extmp = eptr->ex_end; while (eptr->ex_type && eptr != extmp) { switch (eptr->ex_type) { case ET_INT: @@ -2090,7 +2260,13 @@ ex_print(struct ex_ex *eptr) post("%s ", ex_symname((fts_symbol_t )eptr->ex_ptr)); break; case ET_SYM: - post("\"%s\" ", ex_symname((fts_symbol_t )eptr->ex_ptr)); + if (eptr->ex_flags & EX_F_TSYM) { + post("\"%s\"\n", eptr->ex_ptr); + /* temporary symbols (TSYM) are just one off */ + return; + } else + post("\"%s\" ", + ex_symname((fts_symbol_t )eptr->ex_ptr)); break; case ET_VSYM: post("\"$s%ld\" ", eptr->ex_int + 1); @@ -2122,21 +2298,21 @@ ex_print(struct ex_ex *eptr) post("$f%ld ", eptr->ex_int + 1); break; case ET_SI: - post("$s%lx ", eptr->ex_ptr); + post("$s%lx ", (long) eptr->ex_ptr + 1); break; case ET_VI: - post("$v%lx ", eptr->ex_vec); + post("$v%lx ", (long) eptr->ex_vec); break; case ET_VEC: - post("vec = %ld ", eptr->ex_vec); + post("vec = %ld ", (long) eptr->ex_vec); break; case ET_YOM1: case ET_YO: - post("$y%d", eptr->ex_int + 1); + post("$y%ld", eptr->ex_int + 1); break; case ET_XI: case ET_XI0: - post("$x%d", eptr->ex_int + 1); + post("$x%ld", eptr->ex_int + 1); break; case ET_OP: switch (eptr->ex_op) { diff --git a/src/x_vexp.h b/src/x_vexp.h index a41e9d8c..cb84d8a7 100644 --- a/src/x_vexp.h +++ b/src/x_vexp.h @@ -18,10 +18,24 @@ typedef float t_float; // t_float is from m_pd.h #endif -#define fts_malloc malloc -#define fts_calloc calloc +#define fts_malloc ex_malloc +#define fts_calloc ex_calloc #define fts_free free -#define fts_realloc realloc +#define fts_realloc ex_realloc + +void * +ex_calloc(size_t count, size_t size); + +void +ex_free(void *ptr); + +void * +ex_malloc(size_t size); + +void * +ex_realloc(void *ptr, size_t size); + + #define fts_atom_t t_atom #define fts_object_t t_object typedef t_symbol *fts_symbol_t; @@ -55,11 +69,11 @@ void pd_error(void *object, char *fmt, ...); /* * Currently the maximum number of variables (inlets) that are supported - * is 10. + * is 100. */ -#define MAX_VARS 100 -#define MINODES 10 /* was 200 */ +#define EX_MAX_INLETS 100 /* max number if inlets or outlets */ +#define EX_MINODES 30 /* terminal defines */ @@ -119,7 +133,11 @@ struct ex_ex { #define ex_op ex_cont.op #define ex_ptr ex_cont.ptr long ex_type; /* type of the node */ - struct ex_ex *ex_end; /* the node after the end of this expression */ + struct ex_ex *ex_end; /* the node after the end of this expression */ +#define EX_F_TSYM 0x1 /* mark this unit as temporary symbol for evaluation */ +#define EX_F_SI_TAB 0x2 /* The symbol input is a table */ + short ex_flags; + short ex_argc; /* number of actual arguments */ }; #define exNULL ((struct ex_ex *)0) @@ -184,6 +202,7 @@ struct ex_ex { #define EE_BI_INPUT 0x04 /* Bad input index */ #define EE_NOTABLE 0x08 /* NO TABLE */ #define EE_NOVAR 0x10 /* NO VARIABLE */ +#define EE_BADSYM 0x20 /* Symbol passed for Vector */ typedef struct expr { #ifdef PD @@ -196,28 +215,28 @@ typedef struct expr { int exp_nexpr; /* number of expressions */ char *exp_string; /* the full expression string */ char *exp_str; /* current parsing position */ - t_outlet *exp_outlet[MAX_VARS]; + t_outlet *exp_outlet[EX_MAX_INLETS]; #ifdef PD struct _exprproxy *exp_proxy; #else /* MAX */ - void *exp_proxy[MAX_VARS]; + void *exp_proxy[EX_MAX_INLETS]; long exp_proxy_id; #endif - struct ex_ex *exp_stack[MAX_VARS]; - struct ex_ex exp_var[MAX_VARS]; - struct ex_ex exp_res[MAX_VARS]; /* the evluation result */ - t_float *exp_p_var[MAX_VARS]; - t_float *exp_p_res[MAX_VARS]; /* the previous evaluation result */ - t_float *exp_tmpres[MAX_VARS]; /* temporty result for fexpr~ */ + struct ex_ex *exp_stack[EX_MAX_INLETS]; + struct ex_ex exp_var[EX_MAX_INLETS]; + struct ex_ex exp_res[EX_MAX_INLETS]; /* the evluation result */ + t_float *exp_p_var[EX_MAX_INLETS]; + t_float *exp_p_res[EX_MAX_INLETS]; /* the previous evaluation result */ + t_float *exp_tmpres[EX_MAX_INLETS]; /* temporty result for fexpr~ */ int exp_vsize; /* the size of the signal vector */ int exp_nivec; /* # of vector inlets */ t_float exp_f; /* control value to be transformed to signal */ } t_expr; typedef struct ex_funcs { - char *f_name; /* function name */ + char *f_name; /* function name */ + /* the real function performing the function */ void (*f_func)(t_expr *, long, struct ex_ex *, struct ex_ex *); - /* the real function performing the function (void, no return!!!) */ long f_argc; /* number of arguments */ } t_ex_func; @@ -225,26 +244,19 @@ typedef struct ex_funcs { extern int max_ex_tab_store(struct expr *expr, t_symbol *s, struct ex_ex *arg, - struct ex_ex *rval, struct ex_ex *optr); + struct ex_ex *rval, struct ex_ex *optr); extern int max_ex_tab(struct expr *expr, t_symbol *s, struct ex_ex *arg, - struct ex_ex *optr); + int interpol, struct ex_ex *optr); extern int max_ex_var(struct expr *expr, t_symbol *s, struct ex_ex *optr, - int idx); -extern int max_ex_var_store(struct expr *, t_symbol *, struct ex_ex *, struct ex_ex *); + int idx); +extern int max_ex_var_store(struct expr *, t_symbol *, struct ex_ex *, + struct ex_ex *); extern int ex_getsym(char *p, t_symbol **s); -extern const char *ex_symname(t_symbol *s); +extern char *ex_symname(t_symbol *s); void ex_mkvector(t_float *fp, t_float x, int size); -extern void ex_size(t_expr *expr, long int argc, struct ex_ex *argv, - struct ex_ex *optr); -extern void ex_sum(t_expr *expr, long int argc, struct ex_ex *argv, struct ex_ex *optr); -extern void ex_Sum(t_expr *expr, long int argc, struct ex_ex *argv, struct ex_ex *optr); -extern void ex_avg(t_expr *expr, long int argc, struct ex_ex *argv, struct ex_ex *optr); -extern void ex_Avg(t_expr *expr, long int argc, struct ex_ex *argv, struct ex_ex *optr); -extern void ex_store(t_expr *expr, long int argc, struct ex_ex *argv, struct ex_ex *optr); - -int value_getonly(t_symbol *s, t_float *f); +void ex_error(t_expr *e, const char *fmt, ...); /* These pragmas are only used for MSVC, not MinGW or Cygwin */ #ifdef _MSC_VER diff --git a/src/x_vexp_fun.c b/src/x_vexp_fun.c index 1332e143..1aa6565e 100644 --- a/src/x_vexp_fun.c +++ b/src/x_vexp_fun.c @@ -31,7 +31,7 @@ * * The following are done but not popular enough in math libss * to be included yet - * hypoth - Euclidean distance function + * hypot - Euclidean distance function * trunc * round * nearbyint - @@ -77,6 +77,7 @@ #include #include +#include #include @@ -141,14 +142,43 @@ static void ex_drem(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *o static void ex_remainder(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); static void ex_round(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); static void ex_trunc(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_hypot(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); static void ex_nearbyint(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); - -#endif -#ifdef notdef -/* the following will be added once they are more popular in math libraries */ -static void ex_hypoth(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); #endif +static void ex_symboln(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_symbol(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_tolower(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_tonlower(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_toupper(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_tonupper(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_strlen(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_strcat(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_strncat(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_strcmp(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_strncmp(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_strcasecmp(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_strncasecmp(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_strchr(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_strrchr(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_strspn(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_strcspn(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_strpbrk(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +extern void ex_size(t_expr *expr, long int argc, struct ex_ex *argv, + struct ex_ex *optr); +extern void ex_sum(t_expr *expr, long int argc, struct ex_ex *argv, + struct ex_ex *optr); +extern void ex_Sum(t_expr *expr, long int argc, struct ex_ex *argv, + struct ex_ex *optr); +extern void ex_avg(t_expr *expr, long int argc, struct ex_ex *argv, + struct ex_ex *optr); +extern void ex_Avg(t_expr *expr, long int argc, struct ex_ex *argv, + struct ex_ex *optr); +extern void ex_store(t_expr *expr, long int argc, struct ex_ex *argv, + struct ex_ex *optr); +extern void ex_tabread4(t_expr *expr, long int argc, struct ex_ex *argv, + struct ex_ex *optr); + t_ex_func ex_funcs[] = { {"min", ex_min, 2}, @@ -178,16 +208,16 @@ t_ex_func ex_funcs[] = { {"fact", ex_fact, 1}, {"random", ex_random, 2}, /* random number */ {"abs", ex_abs, 1}, - {"if", (void (*))ex_if, 3}, + {"if", (void (*))ex_if,3}, {"ldexp", ex_ldexp, 2}, {"imodf", ex_imodf, 1}, {"modf", ex_modf, 1}, - {"mtof", ex_mtof, 1}, - {"ftom", ex_ftom, 1}, - {"dbtorms", ex_dbtorms, 1}, - {"rmstodb", ex_rmstodb, 1}, - {"dbtopow", ex_dbtopow, 1}, - {"powtodb", ex_powtodb, 1}, + {"mtof", ex_mtof, 1}, + {"ftom", ex_ftom, 1}, + {"dbtorms", ex_dbtorms, 1}, + {"rmstodb", ex_rmstodb, 1}, + {"dbtopow", ex_dbtopow, 1}, + {"powtodb", ex_powtodb, 1}, #if !defined(_MSC_VER) || (_MSC_VER >= 1700) {"asinh", ex_asinh, 1}, {"acosh", ex_acosh, 1}, @@ -204,18 +234,36 @@ t_ex_func ex_funcs[] = { {"nearbyint", ex_nearbyint, 1}, {"copysign", ex_copysign, 2}, {"isinf", ex_isinf, 1}, - {"remainder", ex_remainder, 2}, + {"remainder", ex_remainder, 2}, + {"hypot", ex_hypot, 2}, #endif + /* Symbol functions */ + {"symbol", ex_symbol, 1}, + {"sym", ex_symbol, 1}, + {"symboln", ex_symboln, 3}, + {"symn", ex_symboln, 3}, + {"tolower", ex_tolower, 1}, + {"tonlower", ex_tonlower, 2}, + {"toupper", ex_toupper, 1}, + {"tonupper", ex_tonupper, 2}, + {"strlen", ex_strlen, 1}, + {"strcat", ex_strcat, -1}, /* variable num of arguments */ + {"strncat", ex_strncat, 3}, + {"strcmp", ex_strcmp, 2}, + {"strncmp", ex_strncmp, 3}, + {"strcasecmp", ex_strcasecmp, 2}, + {"strncasecmp", ex_strncasecmp, 3}, + {"strpbrk", ex_strpbrk, 2}, + {"strspn", ex_strspn, 2}, + {"strcspn", ex_strcspn, 2}, + #ifdef PD {"size", ex_size, 1}, {"sum", ex_sum, 1}, {"Sum", ex_Sum, 3}, {"avg", ex_avg, 1}, {"Avg", ex_Avg, 3}, -#endif -#ifdef notdef -/* the following will be added once they are more popular in math libraries */ - {"hypoth", ex_hypoth, 1}, +//SDY {"tabread4", ex_tabread4, 2}, place holder - This will be implemented later #endif {0, 0, 0} }; @@ -1011,14 +1059,14 @@ ex_if(t_expr *e, struct ex_ex *eptr, struct ex_ex *optr, struct ex_ex *argv, int t_float *cp; /* condition pointer */ t_float leftvalue, rightvalue; int j; - int condtrue = 0; + int condtrue = 0; - // evaluate the condition - eptr = ex_eval(e, eptr, argv, idx); + // evaluate the condition + eptr = ex_eval(e, eptr, argv, idx); cond = argv++; - // only either the left or right will be evaluated depending - // on the truth value of the condition - // However, if the condition is a vector, both args will be evaluated + // only either the left or right will be evaluated depending + // on the truth value of the condition + // However, if the condition is a vector, both args will be evaluated switch (cond->ex_type) { case ET_VEC: @@ -1032,20 +1080,32 @@ ex_if(t_expr *e, struct ex_ex *eptr, struct ex_ex *optr, struct ex_ex *argv, int optr->ex_type = ET_VEC; optr->ex_vec = (t_float *) fts_malloc(sizeof (t_float) * e->exp_vsize); - if (!optr->ex_vec) { - post("expr:if: no mem"); - /* pass over the left and right args */ - return(cond->ex_end->ex_end); - } + if (!optr->ex_vec) { + post("expr:if: no mem"); + /* pass over the left and right args */ + return(cond->ex_end->ex_end); + } + } + /* + * if the condition is a vector + * the left and the right args both will get processed + */ + eptr = ex_eval(e, eptr, argv, idx); + left = argv++; + eptr = ex_eval(e, eptr, argv, idx); + right = argv; + if (left->ex_type == ET_SYM || left->ex_type == ET_SI){ + pd_error(e, + "'%s': vector condition cannot return symbol value(l)", + e->exp_string); + return (eptr); + } + if (right->ex_type == ET_SYM || right->ex_type == ET_SI){ + pd_error(e, + "'%s': vector condition cannot return symbol value(r)", + e->exp_string); + return (eptr); } - /* - * if the condition is a vector - * the left and the right args both will get processed - */ - eptr = ex_eval(e, eptr, argv, idx); - left = argv++; - eptr = ex_eval(e, eptr, argv, idx); - right = argv; op = optr->ex_vec; j = e->exp_vsize; cp = cond->ex_vec; @@ -1082,7 +1142,6 @@ ex_if(t_expr *e, struct ex_ex *eptr, struct ex_ex *optr, struct ex_ex *argv, int rp++; } return (eptr); - case ET_SYM: default: post_error((fts_object_t *) e, "expr: FUNC_EVAL(%d): bad right type %ld\n", @@ -1121,7 +1180,6 @@ ex_if(t_expr *e, struct ex_ex *eptr, struct ex_ex *optr, struct ex_ex *argv, int rp++; } return (eptr); - case ET_SYM: default: post_error((fts_object_t *) e, "expr: FUNC_EVAL(%d): bad right type %ld\n", @@ -1163,14 +1221,12 @@ ex_if(t_expr *e, struct ex_ex *eptr, struct ex_ex *optr, struct ex_ex *argv, int lp++; rp++; } return (eptr); - case ET_SYM: default: post_error((fts_object_t *) e, "expr: FUNC_EVAL(%d): bad right type %ld\n", __LINE__, right->ex_type); return (eptr); } - case ET_SYM: default: post_error((fts_object_t *) e, "expr: FUNC_EVAL(%d): bad left type %ld\n", @@ -1189,27 +1245,31 @@ ex_if(t_expr *e, struct ex_ex *eptr, struct ex_ex *optr, struct ex_ex *argv, int else condtrue = 0; break; + case ET_SI: case ET_SYM: + pd_error(e, "'%s': if() condition cannot be a string", + e->exp_string); + return (eptr); default: post_error((fts_object_t *) e, "expr: FUNC_EVAL(%d): bad condition type %ld\n", __LINE__, cond->ex_type); return (eptr); } - if (condtrue) { - eptr = ex_eval(e, eptr, argv, idx); - res = argv++; - if (!eptr) - return (exNULL); - eptr = eptr->ex_end; /* no right processing */ - - } else { - if (!eptr) - return (exNULL); - eptr = eptr->ex_end; /* no left rocessing */ - eptr = ex_eval(e, eptr, argv, idx); - res = argv++; - } + if (condtrue) { + eptr = ex_eval(e, eptr, argv, idx); + res = argv++; + if (!eptr) + return (exNULL); + eptr = eptr->ex_end; /* no right processing */ + + } else { + if (!eptr) + return (exNULL); + eptr = eptr->ex_end; /* no left rocessing */ + eptr = ex_eval(e, eptr, argv, idx); + res = argv++; + } switch(res->ex_type) { case ET_INT: if (optr->ex_type == ET_VEC) { @@ -1238,14 +1298,21 @@ ex_if(t_expr *e, struct ex_ex *eptr, struct ex_ex *optr, struct ex_ex *argv, int optr->ex_type = ET_VEC; optr->ex_vec = (t_float *) fts_malloc(sizeof (t_float) * e->exp_vsize); - if (!optr->ex_vec) { - post("expr:if: no mem"); - return (eptr); - } + if (!optr->ex_vec) { + post("expr:if: no mem"); + return (eptr); + } } memcpy(optr->ex_vec, res->ex_vec, e->exp_vsize*sizeof(t_float)); return (eptr); case ET_SYM: + case ET_SI: + if (optr->ex_type == ET_VEC) { + ex_mkvector(optr->ex_vec, 0.0, e->exp_vsize); + return (eptr); + } + *optr = *res; + return (eptr); default: post_error((fts_object_t *) e, "expr: FUNC_EVAL(%d): bad res type %ld\n", @@ -1255,6 +1322,438 @@ ex_if(t_expr *e, struct ex_ex *eptr, struct ex_ex *optr, struct ex_ex *argv, int } +/* + * ex_getstring - get a string from an argument + */ + +static char * +ex_getstring(t_expr *e, struct ex_ex *eptr) +{ + switch (eptr->ex_type) { + case ET_SYM: + if (eptr->ex_flags & EX_F_TSYM) + return (eptr->ex_ptr); + return (ex_symname((t_symbol *) eptr->ex_ptr)); + + case ET_SI: + if (!e->exp_var[eptr->ex_int].ex_ptr) + return (""); + return (ex_symname((t_symbol *) + e->exp_var[eptr->ex_int].ex_ptr)); + default: + post_error(e, "expr: '%s' - argument not a string - type = %ld\n", + e->exp_string, eptr->ex_type); + return ((char *) 0); + } +} + +static int +ex_getnumber(t_expr *e, struct ex_ex *eptr) +{ + switch (eptr->ex_type) { + case ET_INT: + return (eptr->ex_int); + + case ET_FLT: + return ((int) eptr->ex_flt); + + case ET_SYM: + if (eptr->ex_flags & EX_F_TSYM) { + free(eptr->ex_ptr); + eptr->ex_flags &= ~EX_F_TSYM; + } + + default: + return (0); + } +} + +static int +ex_makesymbol(t_expr *e, struct ex_ex *optr, size_t size) +{ + optr->ex_type = ET_SYM; + optr->ex_flags |= EX_F_TSYM; + optr->ex_ptr = (char *) calloc(size + 1, sizeof (char)); + if (!optr->ex_ptr) { + post_error(e, "expr: '%s' - makesymbol: no memory\n", e->exp_string); + optr->ex_type = ET_INT; + optr->ex_int = 0; + return 0; + } + return 1; +} + + +#define CHECK_LEFT_STR(left) \ + left = argv; \ + leftstr = ex_getstring(e, left); \ + if (!leftstr) { \ + optr->ex_type = ET_INT; \ + optr->ex_int = 0; \ + return; \ + } \ + +#define CHECK_RIGHT_STR(right) \ + right = argv + 1; \ + rightstr = ex_getstring(e, right); \ + if (!rightstr) { \ + optr->ex_type = ET_INT; \ + optr->ex_int = 0; \ + return; \ + } + + +#define CHECK_LR_STR(left, right) \ + CHECK_LEFT_STR(left) \ + CHECK_RIGHT_STR(right) + + +#define STRFUNC_DEF(func) \ +static void \ +func(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) \ +{ \ + struct ex_ex *left = (struct ex_ex *) 0; \ + struct ex_ex *right = (struct ex_ex *) 0; \ + char *leftstr, *rightstr; \ + \ + CHECK_LR_STR(left, right); + +/* + * only set the left, and be sure right is set to zero + * so that CHECK)FREE_STRING() in STREFUNC_END does not free right + */ +#define STRSINGLEFUNC_DEF(func) \ +static void \ +func(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr)\ +{ \ + struct ex_ex *left = (struct ex_ex *) 0; \ + struct ex_ex *right = (struct ex_ex *) 0; \ + char *leftstr, *rightstr; \ + \ + CHECK_LEFT_STR(left); + +/* + * check to see if we need to free any buffers + */ +#define STRFUNC_END() \ + return; \ +} + +#define EXPR_MAX_SYM_SIZE 512 /*largest symbol size, in sprintf it may be 500*/ + +static void +ex_symbol(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) +{ + struct ex_ex *left; + /* we will not realloc to exact size for efficiecy */ + int i; + char *strp; /* string pointer */ + + left = argv; + switch (left->ex_type) { + case ET_SYM: + *optr = *left; + left->ex_type = ET_INT; + left->ex_flags = 0; + left->ex_ptr = (char *)0; + return; + + case ET_SI: + strp = ex_getstring(e, left); + if (!strp) { + if (!ex_makesymbol(e, optr, 1)) + goto goterror; + *optr->ex_ptr = 0; + return; + } + if (!ex_makesymbol(e, optr, strlen(strp))) + goto goterror; + strcpy (optr->ex_ptr, strp); + return; + + + case ET_INT: + if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) + goto goterror; + snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, "%ld", left->ex_int); + return; + + case ET_FLT: + if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) + goto goterror; + snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, "%.6f", left->ex_flt); + for (i = strlen(optr->ex_ptr) - 1; i && optr->ex_ptr[i] == '0'; i--) + if (optr->ex_ptr[i-1] != '.') + optr->ex_ptr[i] = 0; + return; + + default: + optr->ex_type = ET_INT; + optr->ex_int = 0; + post_error((fts_object_t *) e, "expr: bad argument to tosym/sym() - '%s'", e->exp_string); + } + +goterror: + optr->ex_type = ET_INT; + optr->ex_int = 0; + return; +} + +static void +ex_symboln(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) +{ + struct ex_ex *left; + char format[25]; /* the largest int in a 64 bit is 20 characters */ + int i, num1, num2; + char *strp; /* string pointer */ + + left = argv; + num1 = ex_getnumber(e, argv + 1); + num2 = ex_getnumber(e, argv + 2); + switch (left->ex_type) { + case ET_SYM: + case ET_SI: + strp = ex_getstring(e, left); + if (!strp) { + if (!ex_makesymbol(e, optr, 1)) + goto goterror; + *optr->ex_ptr = 0; + return; + } + if (!ex_makesymbol(e, optr, strlen(strp))) + goto goterror; + snprintf(format, 25, "%%%d.%ds", num1, num2); + snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, strp); + return; + + case ET_INT: + if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) + goto goterror; + snprintf(format, 25, "%%%dld", num1); + snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, left->ex_int); + return; + + case ET_FLT: + if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) + goto goterror; + snprintf(format, 25, "%%%d.%df", num1, num2); + snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, left->ex_flt); + return; + + default: + optr->ex_type = ET_INT; + optr->ex_int = 0; + post_error((fts_object_t *) e, "expr: bad argument to tosym/sym() - '%s'", e->exp_string); + } + +goterror: + optr->ex_type = ET_INT; + optr->ex_int = 0; + return; +} + + +/* + * ex_tolower - replace all characters of the string with + * the corresponding lowercase letter + */ +STRSINGLEFUNC_DEF(ex_tolower) + int i, size; + + size = strlen(leftstr); + if (!ex_makesymbol(e, optr, size)) + return; + strcat(optr->ex_ptr, leftstr); + for (i = 0; i < size +1; i++) + optr->ex_ptr[i] = tolower(optr->ex_ptr[i]); +STRFUNC_END() + +/* + * ex_tonlower - replace all characters of the string with + * the corresponding lowercase letter + */ +STRSINGLEFUNC_DEF(ex_tonlower) + int i, size, num; + + size = strlen(leftstr); + if (!ex_makesymbol(e, optr, size)) + return; + num = ex_getnumber(e, argv + 1); + strcat(optr->ex_ptr, leftstr); + num = min (size, num); + for (i = 0; i < num; i++) + optr->ex_ptr[i] = tolower(optr->ex_ptr[i]); +STRFUNC_END() + + + +/* + * ex_toupper - replace all characters of the string with + * the corresponding uppercase letter + */ +STRSINGLEFUNC_DEF(ex_toupper) + int i, size; + + size = strlen(leftstr); + if (!ex_makesymbol(e, optr, size)) + return; + strcat(optr->ex_ptr, leftstr); + for (i = 0; i < size +1; i++) + optr->ex_ptr[i] = toupper(optr->ex_ptr[i]); +STRFUNC_END() + +/* + * ex_tonupper - replace no more than n characters of the string with + * the corresponding uppercase letter + */ +STRSINGLEFUNC_DEF(ex_tonupper) + int i, size, num; + + size = strlen(leftstr); + if (!ex_makesymbol(e, optr, size)) + return; + num = ex_getnumber(e, argv + 1); + strcat(optr->ex_ptr, leftstr); + num = min (size, num); + for (i = 0; i < num; i++) + optr->ex_ptr[i] = toupper(optr->ex_ptr[i]); +STRFUNC_END() + +/* + * ex_strlen - implement strlen() + */ +STRSINGLEFUNC_DEF(ex_strlen) + optr->ex_type = ET_INT; + optr->ex_int = strlen(leftstr); +STRFUNC_END() + + +/* + * ex_strcat - strcat() takes unlimited number of arguments + */ +static void +ex_strcat(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) +{ + char *p; /* string pointer */ + int i; + int size = 0; + + /* find the size */ + for (i = 0; i < argc; i ++) { + p = ex_getstring(e, &argv[i]); + if (!p) { + optr->ex_type = ET_INT; + optr->ex_int = 0; + return; + } + size += strlen(p); + } + + if (!ex_makesymbol(e, optr, size)) { + optr->ex_type = ET_INT; + optr->ex_int = 0; + return; + } + + for (i = 0; i < argc; i ++) + strcat(optr->ex_ptr, ex_getstring(e, &argv[i])); + return; +} + + + +/* + * ex_strncat - implement strncat() + */ +STRFUNC_DEF(ex_strncat) + int num, size; + num = ex_getnumber(e, argv + 2); + size = min(num, strlen(rightstr)); + + if (!ex_makesymbol(e, optr, size)) + return; + + strcat(optr->ex_ptr, leftstr); + strncat(optr->ex_ptr, rightstr, num); + +STRFUNC_END() + +/* + * ex_strcmp - implement strcmp() + */ +STRFUNC_DEF(ex_strcmp) + optr->ex_type = ET_INT; + optr->ex_int = strcmp(leftstr, rightstr); +STRFUNC_END() + +/* + * ex_strncmp - implement strncmp() + */ +STRFUNC_DEF(ex_strncmp) + int num; + + num = ex_getnumber(e, argv + 2); + + optr->ex_type = ET_INT; + optr->ex_int = strncmp(leftstr, rightstr, num); +STRFUNC_END() + +/* + * ex_strcasecmp - implement strcasecmp() + */ +STRFUNC_DEF(ex_strcasecmp) + optr->ex_type = ET_INT; + optr->ex_int = strcasecmp(leftstr, rightstr); +STRFUNC_END() + +/* + * ex_strncasecmp - implement strncasecmp() + */ +STRFUNC_DEF(ex_strncasecmp) + int num; + + num = ex_getnumber(e, argv + 2); + optr->ex_type = ET_INT; + optr->ex_int = strncasecmp(leftstr, rightstr, num); +STRFUNC_END() + + + +/* + * ex_strpbrk - implement strpbrk() + */ +STRFUNC_DEF(ex_strpbrk) + char *result; + + result = strpbrk(leftstr, rightstr); + if (!result) { + optr->ex_type = ET_INT; + optr->ex_int = 0; + return; + } + if (!ex_makesymbol(e, optr, strlen(result) + 1)) + return; + strcpy(optr->ex_ptr, result); +STRFUNC_END() + +/* + * ex_strspn - implement strspn() + */ +STRFUNC_DEF(ex_strspn) + optr->ex_type = ET_INT; + optr->ex_int = strspn(leftstr, rightstr); +STRFUNC_END() + + +/* + * ex_strcspn - implement strcspn() + */ +STRFUNC_DEF(ex_strcspn) + optr->ex_type = ET_INT; + optr->ex_int = strcspn(leftstr, rightstr); +STRFUNC_END() + + /* * ex_imodf - extract signed integral value from floating-point number */ @@ -1367,13 +1866,10 @@ FUNC_DEF_UNARY(ex_trunc, trunc, (double), 1); */ FUNC_DEF_UNARY(ex_nearbyint, nearbyint, (double), 1); -#endif - -#ifdef notdef -/* the following will be added once they are more popular in math libraries */ /* - * ex_hypoth - Euclidean distance function + * ex_hypot - Euclidean distance function */ -FUNC_DEF(ex_hypoth, hypoth, (double), (double), 1); +FUNC_DEF(ex_hypot, hypot, (double), (double), 1); + #endif diff --git a/src/x_vexp_if.c b/src/x_vexp_if.c index ebf197e2..d23f84a6 100644 --- a/src/x_vexp_if.c +++ b/src/x_vexp_if.c @@ -22,6 +22,9 @@ #include #include #include +#include +#define MIN(a,b) (((a)<(b))?(a):(b)) +#define MAX(a,b) (((a)>(b))?(a):(b)) #include "x_vexp.h" @@ -29,6 +32,20 @@ static char *exp_version = "0.57"; extern struct ex_ex *ex_eval(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int n); +extern void ex_size(t_expr *expr, long int argc, struct ex_ex *argv, + struct ex_ex *optr); +extern void ex_sum(t_expr *expr, long int argc, struct ex_ex *argv, + struct ex_ex *optr); +extern void ex_Sum(t_expr *expr, long int argc, struct ex_ex *argv, + struct ex_ex *optr); +extern void ex_avg(t_expr *expr, long int argc, struct ex_ex *argv, + struct ex_ex *optr); +extern void ex_Avg(t_expr *expr, long int argc, struct ex_ex *argv, + struct ex_ex *optr); +extern void ex_tabread4(t_expr *expr, long int argc, struct ex_ex *argv, + struct ex_ex *optr); +extern void ex_store(t_expr *expr, long int argc, struct ex_ex *argv, + struct ex_ex *optr); #ifdef PD static t_class *expr_class; @@ -50,11 +67,11 @@ t_int *expr_perform(t_int *w); static void -expr_list(t_expr *x, t_symbol *s, int argc, const fts_atom_t *argv) +expr_list(t_expr *x, t_symbol *s, int argc, const t_atom *argv) { int i; - if (argc > MAX_VARS) argc = MAX_VARS; + if (argc > EX_MAX_INLETS) argc = EX_MAX_INLETS; for (i = 0; i < argc; i++) { @@ -65,14 +82,14 @@ expr_list(t_expr *x, t_symbol *s, int argc, const fts_atom_t *argv) else if (x->exp_var[i].ex_type == ET_II) x->exp_var[i].ex_int = argv[i].a_w.w_float; else if (x->exp_var[i].ex_type) - pd_error(x, "expr: type mismatch"); + pd_error(x, "expr: type mismatch for inlet %d", i + 1); } else if (argv[i].a_type == A_SYMBOL) { if (x->exp_var[i].ex_type == ET_SI) x->exp_var[i].ex_ptr = (char *)argv[i].a_w.w_symbol; else if (x->exp_var[i].ex_type) - pd_error(x, "expr: type mismatch"); + pd_error(x, "expr: type mismatch for inlet %d", i + 1); } } expr_bang(x); @@ -81,7 +98,7 @@ expr_list(t_expr *x, t_symbol *s, int argc, const fts_atom_t *argv) static void expr_flt(t_expr *x, t_float f, int in) { - if (in >= MAX_VARS) + if (in >= EX_MAX_INLETS) return; if (x->exp_var[in].ex_type == ET_FI) @@ -119,7 +136,7 @@ exprproxy_float(t_exprproxy *p, t_floatarg f) t_expr *x = p->p_owner; int in = p->p_index; - if (in >= MAX_VARS) + if (in >= EX_MAX_INLETS) return; if (x->exp_var[in].ex_type == ET_FI) @@ -147,14 +164,14 @@ expr_ff(t_expr *x) #endif y = x->exp_proxy; } + t_freebytes(x->exp_string, strlen(x->exp_string)); for (i = 0 ; i < x->exp_nexpr; i++) if (x->exp_stack[i]) fts_free(x->exp_stack[i]); -/* - * SDY free all the allocated buffers here for expr~ and fexpr~ - * check to see if there are others - */ - for (i = 0; i < MAX_VARS; i++) { + /* + * free all the allocated buffers here for expr~ and fexpr~ + */ + for (i = 0; i < EX_MAX_INLETS; i++) { if (x->exp_p_var[i]) fts_free(x->exp_p_var[i]); if (x->exp_p_res[i]) @@ -198,7 +215,6 @@ expr_bang(t_expr *x) /* banging a signal or filter object means nothing */ if (!IS_EXPR(x)) return; - for (i = x->exp_nexpr - 1; i > -1 ; i--) { if (!ex_eval(x, x->exp_stack[i], &x->exp_res[i], 0)) { /*fprintf(stderr,"expr_bang(error evaluation)\n"); */ @@ -218,14 +234,34 @@ expr_bang(t_expr *x) break; case ET_SYM: - /* CHANGE this will have to be taken care of */ + if (x->exp_res[i].ex_flags & EX_F_TSYM) { + outlet_symbol(x->exp_outlet[i], + gensym(x->exp_res[i].ex_ptr)); + free(x->exp_res[i].ex_ptr); + } else { + outlet_symbol(x->exp_outlet[i], + (t_symbol *) x->exp_res[i].ex_ptr); + } + break; + + case ET_SI: + if (x->exp_var[x->exp_res[i].ex_int].ex_ptr) + outlet_symbol(x->exp_outlet[i], (t_symbol *) + x->exp_var[x->exp_res[i].ex_int].ex_ptr); + else + outlet_symbol(x->exp_outlet[i], gensym("")); + break; default: - post("expr: bang: unrecognized result %ld\n", x->exp_res[i].ex_type); + post_error(x, + "expr:'%s': bang: unrecognized result %ld\n", + x->exp_string, x->exp_res[i].ex_type); } } } +static int expcount; + static t_expr * #ifdef PD expr_new(t_symbol *s, int ac, t_atom *av) @@ -240,6 +276,7 @@ Nexpr_new(t_symbol *s, int ac, t_atom *av) int dsp_index; /* keeping track of the dsp inlets */ +//printf ("expcount = %d\n", expcount++); /* * SDY - we may need to call dsp_setup() in this function */ @@ -283,7 +320,7 @@ Nexpr_new(t_symbol *s, int ac, t_atom *av) x->exp_nivec = 0; x->exp_nexpr = 0; x->exp_error = 0; - for (i = 0; i < MAX_VARS; i++) { + for (i = 0; i < EX_MAX_INLETS; i++) { x->exp_stack[i] = (struct ex_ex *)0; x->exp_outlet[i] = (t_outlet *)0; x->exp_res[i].ex_type = 0; @@ -309,7 +346,7 @@ SDY the following coredumps why? } ninlet = 1; - for (i = 0, eptr = x->exp_var; i < MAX_VARS ; i++, eptr++) + for (i = 0, eptr = x->exp_var; i < EX_MAX_INLETS ; i++, eptr++) if (eptr->ex_type) { ninlet = i + 1; } @@ -388,8 +425,14 @@ SDY the following coredumps why? x->exp_p_res[i] = fts_calloc(x->exp_vsize, sizeof (t_float)); x->exp_tmpres[i] = fts_calloc(x->exp_vsize, sizeof (t_float)); } - for (i = 0; i < MAX_VARS; i++) - x->exp_p_var[i] = fts_calloc(x->exp_vsize, sizeof (t_float)); + for (i = 0; i < EX_MAX_INLETS; i++) { + if (x->exp_var[i].ex_type == ET_VI || + x->exp_var[i].ex_type == ET_XI) + x->exp_p_var[i] = fts_calloc(x->exp_vsize, + sizeof (t_float)); + else + x->exp_p_var[i] = (t_float *) 0; + } return (x); } @@ -417,14 +460,15 @@ expr_perform(t_int *w) if (IS_EXPR_TILDE(x)) { /* - * if we have only one expression, we can right on + * if we have only one expression, we can write on * on the output directly, otherwise we have to copy * the data because, outputs could be the same buffer as * inputs */ - if ( x->exp_nexpr == 1) + if ( x->exp_nexpr == 1) { + x->exp_res[0].ex_type = ET_VEC; ex_eval(x, x->exp_stack[0], &x->exp_res[0], 0); - else { + } else { res.ex_type = ET_VEC; for (i = 0; i < x->exp_nexpr; i++) { res.ex_vec = x->exp_tmpres[i]; @@ -439,7 +483,7 @@ expr_perform(t_int *w) } if (!IS_FEXPR_TILDE(x)) { - post("expr_perform: bad x->exp_flags = %d - expecting fexpr", + post_error(x, "expr_perform: bad x->exp_flags = %d - expecting fexpr", x->exp_flags); return (w + 2); } @@ -458,6 +502,19 @@ expr_perform(t_int *w) case ET_FLT: x->exp_tmpres[j][i] = res.ex_flt; break; + case ET_SYM: + if (!(x->exp_error & EE_BADSYM)) { + x->exp_error |= EE_BADSYM; + post_error((t_object *) x, + "fexpr~: '%s': cannot convert string to sample value\n", + x->exp_string); + post_error(x, + "fexpr~: No more such errors will be reported"); + post_error(x, + "fexpr~: till the next reset"); + } + x->exp_tmpres[j][i] = 0; + break; default: post("expr_perform: bad result type %d", res.ex_type); } @@ -468,7 +525,7 @@ expr_perform(t_int *w) * same as an input buffer */ n = x->exp_vsize * sizeof(t_float); - for (i = 0; i < MAX_VARS; i++) + for (i = 0; i < EX_MAX_INLETS; i++) if (x->exp_var[i].ex_type == ET_XI) memcpy(x->exp_p_var[i], x->exp_var[i].ex_vec, n); for (i = 0; i < x->exp_nexpr; i++) { @@ -491,7 +548,7 @@ expr_dsp(t_expr *x, t_signal **sp) x->exp_res[i].ex_type = ET_VEC; x->exp_res[i].ex_vec = sp[x->exp_nivec + i]->s_vec; } - for (i = 0, nv = 0; i < MAX_VARS; i++) + for (i = 0, nv = 0; i < EX_MAX_INLETS; i++) /* * the first inlet is always a signal * @@ -538,16 +595,23 @@ expr_dsp(t_expr *x, t_signal **sp) fts_free(x->exp_p_res[i]); fts_free(x->exp_tmpres[i]); } - for (i = 0; i < MAX_VARS; i++) - fts_free(x->exp_p_var[i]); + for (i = 0; i < EX_MAX_INLETS; i++) + if (x->exp_p_var[i]) + fts_free(x->exp_p_var[i]); } for (i = 0; i < x->exp_nexpr; i++) { x->exp_p_res[i] = fts_calloc(x->exp_vsize, sizeof (t_float)); x->exp_tmpres[i] = fts_calloc(x->exp_vsize, sizeof (t_float)); } - for (i = 0; i < MAX_VARS; i++) - x->exp_p_var[i] = fts_calloc(x->exp_vsize, sizeof (t_float)); + for (i = 0; i < EX_MAX_INLETS; i++) { + if (x->exp_var[i].ex_type == ET_VI || + x->exp_var[i].ex_type == ET_XI) + x->exp_p_var[i] = fts_calloc(x->exp_vsize, + sizeof (t_float)); + else + x->exp_p_var[i] = (t_float *) 0; + } } /* @@ -625,9 +689,9 @@ fexpr_tilde_set(t_expr *x, t_symbol *s, int argc, t_atom *argv) fexpr_set_usage(); return; } - if (vecno >= MAX_VARS) { + if (vecno >= EX_MAX_INLETS) { post("fexpr~.set: no more than %d inlets", - MAX_VARS); + EX_MAX_INLETS); return; } vecno--; @@ -719,7 +783,7 @@ fexpr_tilde_clear(t_expr *x, t_symbol *s, int argc, t_atom *argv) if (!argc) { for (i = 0; i < x->exp_nexpr; i++) memset(x->exp_p_res[i], 0, x->exp_vsize*sizeof(t_float)); - for (i = 0; i < MAX_VARS; i++) + for (i = 0; i < EX_MAX_INLETS; i++) if (x->exp_var[i].ex_type == ET_XI) memset(x->exp_p_var[i], 0, x->exp_vsize*sizeof(t_float)); @@ -741,9 +805,9 @@ fexpr_tilde_clear(t_expr *x, t_symbol *s, int argc, t_atom *argv) post("fexpr~.clear: bad clear x vector number"); return; } - if (vecno >= MAX_VARS) { + if (vecno >= EX_MAX_INLETS) { post("fexpr~.clear: no more than %d inlets", - MAX_VARS); + EX_MAX_INLETS); return; } vecno--; @@ -861,20 +925,101 @@ main(void) int -ex_getsym(char *p, fts_symbol_t *s) +ex_getsym(char *p, t_symbol **s) { *s = gensym(p); return (0); } -const char * -ex_symname(fts_symbol_t s) +char * +ex_symname(t_symbol *s) { if (!s) return (0); - return (fts_symbol_name(s)); + return ((char *) s->s_name); } +#if 0 +SDY tabled code for when 4 point interpolation of vectors are implemented +/* + * ex_vectablelookup - a vector table look up with 4point interpolation + * return 0 on success + * wvec - pointer to the table + * tsize - table size + * iptr - ptr to the index vector + * optr - output pointer + */ +int +ex_vectablelookup(t_expr *e, t_word *wvec, int tsize, t_float *iptr, struct ex_ex *optr) +{ + int i; + t_float pos, a, b, c, d, cminusb, frac; + t_word *wp; + int int_pos; + int n ; /* position in the array */ + + if (optr->ex_type != ET_VEC) { + pd_error(e, "'%s': bad ooutput type", e->exp_string); + memset((void *) optr->ex_vec, 0, + e->exp_vsize * sizeof (t_float)); + return (0); + } + + if (tsize < 4) { + memset((void *) optr->ex_vec, 0, e->exp_vsize * sizeof (t_float)); + return (0); + } + for (i = 0; i < e->exp_vsize; i++) { + pos = iptr[i]; + if (pos <= 1) { + optr->ex_vec[i] = wvec[1].w_float; + continue; + } + if (pos >= tsize - 2) { + optr->ex_vec[i] = wvec[tsize - 2].w_float; + continue; + } + n = (int) pos; + if (n >= tsize - 2) + n = tsize - 3; + wp = wvec + n; + frac = pos - n; + a = wp[-1].w_float; + b = wp[0].w_float; + c = wp[1].w_float; + d = wp[2].w_float; + cminusb = c-b; + optr->ex_vec[i] = b + frac * ( cminusb - 0.1666667f * (1.-frac) * ( + (d - a - 3.0f * cminusb) * frac + (d + 2.0f*a - 3.0f*b))); + } +#if 0 + /* alternative interpolation code */ + int_pos = (int)floorl(pos); + frac_pos = pos - int_pos; + + x2 = wvec[(tsize + int_pos - 2) % tsize].w_float; + x1 = wvec[(tsize + int_pos - 1) % tsize].w_float; + x0 = wvec[(tsize + int_pos) % tsize].w_float; + xm1 = wvec[(tsize + int_pos + 1) % tsize].w_float; + if(int_pos >= tsize) + x1 = x0; + if(int_pos >= tsize - 1) + x2 = x1; + if(int_pos <= 0) + x0 = x1; + if(int_pos <= 1) + xm1 = x0; + a = (3.0f * (x0 - x1) - xm1 + x2) * 0.5f; + b = 2.0f * x1 + xm1 - (5.0f * x0 + x2) * 0.5f; + c = (x1 - xm1) * 0.5f; + optr->ex_vec[i] = + (((((a * frac_pos) + b) * frac_pos) + c) * frac_pos) + x0; +#endif + return(0); +} +#endif + + /* * max_ex_tab -- evaluate this table access * eptr is the name of the table and arg is the index we @@ -882,13 +1027,14 @@ ex_symname(fts_symbol_t s) * return 1 on error and 0 otherwise * * Arguments: - * the expr object - * table - * the argument - * the result pointer + * expr - the expr object + * s - table pointer + * arg - pointer to the the index argument + * interpol - flag to interpolate on single float index + * optr - the result pointer */ int -max_ex_tab(struct expr *expr, fts_symbol_t s, struct ex_ex *arg, +max_ex_tab(struct expr *expr, t_symbol *s, struct ex_ex *arg, int interpol, struct ex_ex *optr) { #ifdef PD @@ -898,13 +1044,13 @@ max_ex_tab(struct expr *expr, fts_symbol_t s, struct ex_ex *arg, t_word *wvec; if (!s || !(garray = (t_garray *)pd_findbyclass(s, garray_class)) || - !garray_getfloatwords(garray, &size, &wvec)) - { + !garray_getfloatwords(garray, &size, &wvec)) { optr->ex_type = ET_FLT; optr->ex_flt = 0; pd_error(expr, "no such table '%s'", ex_symname(s)); return (1); } +#if 1 optr->ex_type = ET_FLT; switch (arg->ex_type) { @@ -923,6 +1069,102 @@ max_ex_tab(struct expr *expr, fts_symbol_t s, struct ex_ex *arg, if (indx < 0) indx = 0; else if (indx >= size) indx = size - 1; optr->ex_flt = wvec[indx].w_float; +#else /* if 1 tabled code */ + The code below implement 4 point interpolation of table access + which for now I (sdy) am tabling for the next release + long n; + float flt_value; + t_float pos, a, b, c, d, cminusb, frac; + t_word *wp; + + switch (arg->ex_type) { + case ET_INT: + case ET_FLT: + if (arg->ex_type == ET_INT) { + n = arg->ex_int; + n = MAX(0, MIN(n, size - 1)); + flt_value = wvec[n].w_float; + } else if (!interpol) { + /* + * for compatibility purposes with older versions we + * do not interpolate the table lookup with float + * values, but it will be done for signal indexes, + * and in the tablelook up function + */ + n = arg->ex_flt; + n = MAX(0, MIN(n, size - 1)); + flt_value = wvec[n].w_float; + } else { /* interpolate */ + pos = arg->ex_flt; + if (size < 4) { + flt_value = 0; + } else if (pos <= 1) { + flt_value = wvec[1].w_float; + } else if (pos >= size - 2) { + flt_value = wvec[size - 2].w_float; + } else { + n = (int) pos; + if (n >= size - 2) + n = size - 3; + wp = wvec + n; + frac = pos - n; + a = wp[-1].w_float; + b = wp[0].w_float; + c = wp[1].w_float; + d = wp[2].w_float; + cminusb = c-b; + flt_value = b + frac * + ( cminusb - 0.1666667f * (1.-frac) * ( + (d - a - 3.0f * cminusb) * frac + + (d + 2.0f*a - 3.0f*b))); + } + } + + switch (optr->ex_type) { + case ET_VEC: + ex_mkvector(optr->ex_vec, flt_value, + expr->exp_vsize); + return(0); + case ET_SYM: + pd_error(expr, "expr:'%s' bad output type '%ld'\n", + expr->exp_string, optr->ex_type); + break; + case ET_INT: + case ET_FLT: + default: + optr->ex_type = ET_FLT; + optr->ex_flt = flt_value; + return(0); + } + break; + case ET_VI: + if (optr->ex_type != ET_VEC) { + pd_error(expr, + "expr:'%s': bad table arg - cannot convert vector to scalar\n", + expr->exp_string); + break; + } + return(ex_vectablelookup(expr, wvec, size, arg->ex_vec, optr)); + + case ET_VEC: + if (optr->ex_type != ET_VEC) { + pd_error(expr, + "expr:'%s': bad table arg - cannot convert vector to scalar\n", + expr->exp_string); + break; + } + return (ex_vectablelookup(expr, wvec, size, + arg->ex_vec, optr)); + default: /* do something with strings */ + pd_error(expr, + "expr:'%s' bad argument for table '%s'\n", + expr->exp_string, s->s_name); + } + optr->ex_type = ET_INT; + optr->ex_int = 0; + return(1); +#endif + #else /* MSP */ /* * table lookup not done for MSP yet @@ -936,10 +1178,10 @@ max_ex_tab(struct expr *expr, fts_symbol_t s, struct ex_ex *arg, /* * max_ex_tab_store -- store a value in a table - * tbl[arg->value] = rval.value - * eptr is the name of the table and arg is the index we - * have to put the result in optr - * return 1 on error and 0 otherwise + * tbl[arg->value] = rval.value + * eptr is the name of the table and arg is the index we + * have to put the result in optr + * return 1 on error and 0 otherwise * * Arguments: * the expr object @@ -950,7 +1192,7 @@ max_ex_tab(struct expr *expr, fts_symbol_t s, struct ex_ex *arg, */ int max_ex_tab_store(struct expr *expr, t_symbol *s, struct ex_ex *arg, - struct ex_ex *rval, struct ex_ex *optr) + struct ex_ex *rval, struct ex_ex *optr) { #ifdef PD t_garray *garray; @@ -963,9 +1205,11 @@ max_ex_tab_store(struct expr *expr, t_symbol *s, struct ex_ex *arg, optr->ex_type = ET_FLT; optr->ex_flt = 0; if (s) - pd_error(expr, "no such table to store '%s'", s->s_name); + pd_error(expr, "%s: no such table to store '%s'", + expr->exp_string, s->s_name); else - pd_error(expr, "cannot store in unnamed table"); + pd_error(expr, "%s: cannot store in unnamed table", + expr->exp_string); return (1); } optr->ex_type = ET_FLT; @@ -981,7 +1225,7 @@ max_ex_tab_store(struct expr *expr, t_symbol *s, struct ex_ex *arg, default: /* do something with strings */ pd_error(expr, "expr: bad argument for table store '%s'\n", - fts_symbol_name(s)); + s->s_name); indx = 0; } if (indx < 0) @@ -992,18 +1236,18 @@ max_ex_tab_store(struct expr *expr, t_symbol *s, struct ex_ex *arg, switch (rval->ex_type) { case ET_INT: wvec[indx].w_float = rval->ex_int; - break; + break; case ET_FLT: wvec[indx].w_float = rval->ex_flt; - break; + break; default: pd_error(expr, "expr:bad right value type '%ld'", rval->ex_type); optr->ex_type = ET_FLT; optr->ex_flt = 0; return (1); } - garray_redraw(garray); - return(0); + garray_redraw(garray); + return(0); #else /* MSP */ /* @@ -1020,10 +1264,10 @@ int max_ex_var(struct expr *expr, t_symbol *var, struct ex_ex *optr, int idx) { optr->ex_type = ET_FLT; - if (!strcmp(var->s_name, "sys_idx")) { - optr->ex_flt = idx; - return (0); - } + if (!strcmp(var->s_name, "sys_idx")) { + optr->ex_flt = idx; + return (0); + } if (value_getfloat(var, &(optr->ex_flt))) { optr->ex_type = ET_FLT; optr->ex_flt = 0; @@ -1036,14 +1280,37 @@ max_ex_var(struct expr *expr, t_symbol *var, struct ex_ex *optr, int idx) #ifdef PD /* this goes to the end of this file as the following functions * should be defined in the expr object in MSP */ -#define ISTABLE(sym, garray, size, vec) \ -if (!sym || !(garray = (t_garray *)pd_findbyclass(sym, garray_class)) || \ +#define ISTABLE(e, sym, garray, size, vec) \ + switch (argv->ex_type) { \ + case ET_SYM: \ + if (argv->ex_flags & EX_F_TSYM) { \ + /* SDY the symbol has to be freed too */ \ + s = gensym(argv->ex_ptr); \ + argv->ex_flags &= ~EX_F_TSYM; \ + free(argv->ex_ptr); \ + } else \ + s = (t_symbol *) argv->ex_ptr; \ + break; \ + case ET_SI: \ + s = (t_symbol *) e->exp_var[argv->ex_int].ex_ptr; \ + break; \ + default: \ + post( \ + "expr:'%s' arg to function needs to be a table name\n", \ + e->exp_string); \ + optr->ex_type = ET_INT; \ + optr->ex_int = 0; \ + return; \ + } \ + if (!sym || !(garray = \ + (t_garray *)pd_findbyclass(sym, garray_class)) || \ !garray_getfloatwords(garray, &size, &vec)) { \ - optr->ex_type = ET_FLT; \ - optr->ex_int = 0; \ - pd_error(0, "no such table '%s'", sym?(sym->s_name):"(null)"); \ - return; \ -} + optr->ex_type = ET_FLT; \ + optr->ex_int = 0; \ + pd_error(0, "%s: no such table '%s'", \ + e->exp_string, sym?(sym->s_name):"(null)"); \ + return; \ + } /* * ex_size -- find the size of a table @@ -1056,17 +1323,7 @@ ex_size(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) int size; t_word *wvec; - if (argv->ex_type != ET_SYM) - { - post("expr: size: need a table name\n"); - optr->ex_type = ET_INT; - optr->ex_int = 0; - return; - } - - s = (fts_symbol_t ) argv->ex_ptr; - - ISTABLE(s, garray, size, wvec); + ISTABLE(e, s, garray, size, wvec); optr->ex_type = ET_INT; optr->ex_int = size; @@ -1086,17 +1343,7 @@ ex_sum(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) t_float sum; int indx; - if (argv->ex_type != ET_SYM) - { - post("expr: sum: need a table name\n"); - optr->ex_type = ET_INT; - optr->ex_int = 0; - return; - } - - s = (fts_symbol_t ) argv->ex_ptr; - - ISTABLE(s, garray, size, wvec); + ISTABLE(e, s, garray, size, wvec); for (indx = 0, sum = 0; indx < size; indx++) sum += wvec[indx].w_float; @@ -1120,53 +1367,43 @@ ex_Sum(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) t_float sum; long indx, n1, n2; - if (argv->ex_type != ET_SYM) - { - post("expr: sum: need a table name\n"); - optr->ex_type = ET_INT; - optr->ex_int = 0; - return; - } - - s = (fts_symbol_t ) argv->ex_ptr; - - ISTABLE(s, garray, size, wvec); + ISTABLE(e, s, garray, size, wvec); - switch((++argv)->ex_type) { - case ET_INT: - n1 = argv->ex_int; - break; - case ET_FLT: - n1 = argv->ex_flt; - break; - default: - post("expr: Sum: boundaries have to be fix values\n"); - optr->ex_type = ET_INT; - optr->ex_int = 0; - return; - } - if (n1 < 0) - n1 = 0; + switch((++argv)->ex_type) { + case ET_INT: + n1 = argv->ex_int; + break; + case ET_FLT: + n1 = argv->ex_flt; + break; + default: + post("expr: Sum: boundaries have to be fix values\n"); + optr->ex_type = ET_INT; + optr->ex_int = 0; + return; + } + if (n1 < 0) + n1 = 0; - switch((++argv)->ex_type) { - case ET_INT: - n2 = argv->ex_int; - break; - case ET_FLT: - n2 = argv->ex_flt; - break; - default: - post("expr: Sum: boundaries have to be fix values\n"); - optr->ex_type = ET_INT; - optr->ex_int = 0; - return; - } - if (n2 > size) - n2 = size; + switch((++argv)->ex_type) { + case ET_INT: + n2 = argv->ex_int; + break; + case ET_FLT: + n2 = argv->ex_flt; + break; + default: + post("expr: Sum: boundaries have to be fix values\n"); + optr->ex_type = ET_INT; + optr->ex_int = 0; + return; + } + if (n2 > size) + n2 = size; for (indx = n1, sum = 0; indx <= n2; indx++) - if (indx >= 0 && indx < size) - sum += wvec[indx].w_float; + if (indx >= 0 && indx < size) + sum += wvec[indx].w_float; optr->ex_type = ET_FLT; optr->ex_flt = sum; @@ -1186,17 +1423,7 @@ ex_avg(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) t_float sum; int indx; - if (argv->ex_type != ET_SYM) - { - post("expr: avg: need a table name\n"); - optr->ex_type = ET_INT; - optr->ex_int = 0; - return; - } - - s = (fts_symbol_t ) argv->ex_ptr; - - ISTABLE(s, garray, size, wvec); + ISTABLE(e, s, garray, size, wvec); for (indx = 0, sum = 0; indx < size; indx++) sum += wvec[indx].w_float; @@ -1220,49 +1447,38 @@ ex_Avg(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) t_float sum; long indx, n1, n2; - if (argv->ex_type != ET_SYM) - { - post("expr: sum: need a table name\n"); - optr->ex_type = ET_INT; - optr->ex_int = 0; - return; - } + ISTABLE(e, s, garray, size, wvec); - s = (fts_symbol_t ) argv->ex_ptr; - - ISTABLE(s, garray, size, wvec); - - switch((++argv)->ex_type) { - case ET_INT: + switch((++argv)->ex_type) { + case ET_INT: n1 = argv->ex_int; - break; - case ET_FLT: + break; + case ET_FLT: n1 = argv->ex_flt; break; - default: - post("expr: Avg: boundaries have to be fix values\n"); - optr->ex_type = ET_INT; - optr->ex_int = 0; - return; - } - if (n1 < 0) - n1 = 0; + default: + post("expr: Avg: boundaries have to be fix values\n"); + optr->ex_type = ET_INT; + optr->ex_int = 0; + return; + } + if (n1 < 0) + n1 = 0; - switch((++argv)->ex_type) { - case ET_INT: + switch((++argv)->ex_type) { + case ET_INT: n2 = argv->ex_int; break; - case ET_FLT: + case ET_FLT: n2 = argv->ex_flt; break; - default: - post("expr: Avg: boundaries have to be fix values\n"); - optr->ex_type = ET_INT; - optr->ex_int = 0; - return; - } - if (n2 >= size) - n2 = size - 1; + default: + post("expr: Avg: boundaries have to be fix values\n"); + optr->ex_type = ET_INT; + optr->ex_int = 0; return; + } + if (n2 >= size) + n2 = size - 1; for (indx = n1, sum = 0; indx <= n2; indx++) if (indx >= 0 && indx < size) @@ -1278,22 +1494,26 @@ ex_Avg(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) int max_ex_var_store(struct expr *expr, t_symbol * var, struct ex_ex *eptr, struct ex_ex *optr) { - t_float value = 0.; + t_float value = 0.; - *optr = *eptr; - switch (eptr->ex_type) { - case ET_INT: - value = eptr->ex_int; - break; - case ET_FLT: - value = eptr->ex_flt; - break; - default: - post("do not know yet\n"); - } + *optr = *eptr; + switch (eptr->ex_type) { + case ET_INT: + value = eptr->ex_int; + break; + case ET_FLT: + value = eptr->ex_flt; + break; + default: + post("bad right value - '%s'\n", expr->exp_string); + optr->ex_int = 0; + optr->ex_type = ET_INT; + return (1); + } if (value_setfloat(var, value)) { - optr->ex_flt = 0; + optr->ex_int = 0; + optr->ex_type = ET_INT; pd_error(expr, "no such var '%s'", var->s_name); return (1); } @@ -1301,6 +1521,8 @@ max_ex_var_store(struct expr *expr, t_symbol * var, struct ex_ex *eptr, struct e } /* + * UNUSED FUNCTION + * * ex_store -- store a value in a table * if the index is greater the size of the table, * we will make a modulo the size of the table @@ -1311,7 +1533,7 @@ ex_store(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) { /* SDY - look into this function */ #if 0 - fts_symbol_t s; + t_symbol *s; fts_integer_vector_t *tw = 0; if (argv->ex_type != ET_SYM) @@ -1319,7 +1541,7 @@ ex_store(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) post("expr: store: need a table name\n"); } - s = (fts_symbol_t ) (argv++)->ex_ptr; + s = (t_symbol *) (argv++)->ex_ptr; tw = table_integer_vector_get_by_name(s); @@ -1327,7 +1549,7 @@ ex_store(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) { optr->ex_type = ET_INT; optr->ex_int = 0; - post("expr: store: no such table %s\n", fts_symbol_name(s)); + post("expr: store: no such table %s\n", s->s_name); return; } From a64c34ba544aab4caef0879c654471c742da5878 Mon Sep 17 00:00:00 2001 From: porres Date: Mon, 19 Aug 2024 14:20:05 -0300 Subject: [PATCH 58/89] improve help file of [expr] some cosmetic, typos and other minor changes in general a bigger revision on the new string functions and symbol support; updated reference; updated 'see also'; added "updated for 0.55-1" fixed typo in the code comment Improved html reference --- doc/5.reference/expr-help.pd | 504 ++++++++++++++------------- doc/5.reference/makefilename-help.pd | 4 +- doc/5.reference/symbol-help.pd | 7 +- doc/8.topics/expr.htm | 75 ++-- src/x_vexp.c | 4 +- 5 files changed, 311 insertions(+), 283 deletions(-) diff --git a/doc/5.reference/expr-help.pd b/doc/5.reference/expr-help.pd index beaff296..a30e2dc5 100644 --- a/doc/5.reference/expr-help.pd +++ b/doc/5.reference/expr-help.pd @@ -1,6 +1,6 @@ -#N canvas 1012 305 745 703 12; +#N canvas 476 52 747 707 12; #X declare -stdpath ./; -#N canvas 302 55 911 485 Arrays 0; +#N canvas 455 177 911 525 Arrays 0; #X floatatom 123 370 4 0 9 0 - - - 0; #X floatatom 123 427 10 0 0 0 - - - 0; #X obj 123 399 expr $s2[$f1]; @@ -8,12 +8,10 @@ #X floatatom 112 170 9 0 0 0 - - - 0; #X text 55 56 For instance:; #X obj 211 342 loadbang; -#X floatatom 502 232 0 0 100 0 - - - 0; -#X text 47 16 [expr] \, [expr~] and [fexpr~] can read values from array (without interpolation). The syntax is arrayname[index].; +#X floatatom 502 232 8 0 100 0 - - - 0; #X text 28 281 A symbol inlet - defined as '$s#' (# being the inlet number) - is used to receive the array names., f 55; #X text 573 218 [expr] can set values to an array index with "=" (a.k.a. "store function") as in:, f 41; #X text 27 210 Note that variables '$f#' are also possible as the array index \, but it won't make sense since there's no interpolation and float inputs are just truncated to integers., f 55; -#X text 516 325 Even though you can also use arrays in [expr~] and [fexpr~]. They cannot write values to arrays and the index values cannot be audio variables (just either '$i3' or '$f#')., f 39; #X msg 211 368 symbol array100; #X obj 112 131 expr array100[$i1]; #X obj 502 263 expr array100[1] = $f1; @@ -25,20 +23,22 @@ #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; +#A 0 1 5.59006 2 8 5 6 1 4 2 8; #X coords 0 10 9 0 220 130 1 0 0; #X restore 576 29 graph; +#X text 48 17 [expr] \, [expr~] and [fexpr~] can read values from arrays (without interpolation). The syntax is arrayname[index].; +#X text 516 325 Even though you can also use arrays in [expr~] and [fexpr~]. They cannot write values to arrays and the index values cannot be audio variables (just either '$i#' or '$f#')., f 39; #X connect 0 0 2 0; #X connect 2 0 1 0; -#X connect 3 0 14 0; -#X connect 6 0 13 0; -#X connect 7 0 15 0; -#X connect 13 0 2 1; -#X connect 14 0 4 0; -#X connect 18 0 7 0; -#X restore 505 497 pd Arrays; +#X connect 3 0 12 0; +#X connect 6 0 11 0; +#X connect 7 0 13 0; +#X connect 11 0 2 1; +#X connect 12 0 4 0; +#X connect 16 0 7 0; +#X restore 505 495 pd Arrays; #X text 88 499 Basic examples:; -#X text 429 520 Further details:, f 8; +#X text 429 518 Further details:, f 8; #N canvas 350 134 950 501 Dealing_with_"\$0" 0; #X obj 624 154 expr $s2[$f1]; #X obj 712 123 symbol \$0-x; @@ -86,11 +86,11 @@ #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~; -#X obj 339 671 value; -#N canvas 795 78 513 543 All_functions 0; +#X restore 505 522 pd Dealing_with_"\$0"; +#X text 8 607 see also:; +#X obj 117 667 block~; +#X obj 169 667 value; +#N canvas 859 72 513 543 All_functions 0; #N canvas 497 97 374 326 Arithmetic-operators 0; #X obj 57 90 expr $f1 + 4; #X floatatom 57 63 5 0 0 0 - - - 0; @@ -198,18 +198,18 @@ #X connect 7 0 1 0; #X connect 8 0 4 0; #X restore 125 286 pd Random-function; -#N canvas 1794 443 604 529 Table-functions 0; +#N canvas 778 283 604 538 Table-functions 0; #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; +#X floatatom 145 164 8 0 0 0 - - - 0; +#X floatatom 228 164 4 0 0 0 - - - 0; #X obj 63 102 expr Sum("table" \, 3 \, 9) \; sum("table") \; size("table"); -#X msg 364 402 symbol table; -#X floatatom 364 465 5 0 0 0 - - - 0; -#X text 64 187 Sums a range of indexes, f 8; -#X text 146 189 Sums all indexes, f 8; +#X msg 395 403 symbol table; +#X floatatom 395 466 5 0 0 0 - - - 0; +#X text 54 187 Sums a range of indexes, f 8; +#X text 143 189 Sums all indexes, f 8; #X text 225 189 Gives array size, f 5; -#X floatatom 47 344 0 0 0 0 - - - 0; -#X floatatom 240 344 0 0 0 0 - - - 0; +#X floatatom 47 344 8 0 0 0 - - - 0; +#X floatatom 240 344 8 0 0 0 - - - 0; #X floatatom 47 469 0 0 0 0 - - - 0; #X floatatom 212 467 0 0 0 0 - - - 0; #X obj 47 299 expr avg("table") \; sum("table") / size("table"); @@ -220,14 +220,14 @@ #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 obj 337 98 cnv 19 198 138 empty empty empty 20 12 0 12 #e0e0e0 #404040 0; +#X obj 339 87 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 98 graph; -#X obj 364 432 expr size($s1) \;; -#X text 354 256 You can use a symbol type to specify the array name. Up to expr 0.57 symbol types had to be put in double quotes. In expr verions 0.58 and up this is no longer the case., f 23; +#X restore 338 87 graph; +#X obj 395 433 expr size($s1) \;; +#X text 343 248 You can use a symbol type to specify the array name bia the inlet. Up to [expr] version 0.57 symbol types had to be put in double quotes (as in "$s1"). In [expr] versions 0.58 and up this is no longer the case but both methods will work., f 27; #X connect 3 0 0 0; #X connect 3 1 1 0; #X connect 3 2 2 0; @@ -644,147 +644,161 @@ #X connect 22 0 25 0; #X connect 25 0 23 0; #X restore 125 166 pd Relational-operators; -#N canvas 832 68 692 1083 string-functions 0; -#X obj 334 63 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X obj 54 173 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X obj 54 63 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X obj 55 87 expr "hello"; -#X obj 335 87 expr symbol(4.52); -#X obj 54 253 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X obj 55 277 expr tolower("HELLO"); -#X obj 54 333 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X obj 55 357 expr tonlower("HELLO" \, 2); -#X symbolatom 55 383 10 0 0 0 - - - 0; -#X symbolatom 55 301 10 0 0 0 - - - 0; -#X symbolatom 55 221 10 0 0 0 - - - 0; -#X symbolatom 335 111 10 0 0 0 - - - 0; -#X symbolatom 55 111 10 0 0 0 - - - 0; -#X obj 334 253 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X obj 334 333 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X symbolatom 335 383 10 0 0 0 - - - 0; -#X symbolatom 335 301 10 0 0 0 - - - 0; -#X obj 335 277 expr toupper("hello"); -#X obj 335 357 expr tonupper("hello" \, 2); -#X obj 54 423 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X obj 55 447 expr strlen("hello"); -#X floatatom 55 471 5 0 0 0 - - - 0; -#X obj 334 423 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X symbolatom 335 471 15 0 0 0 - - - 0; -#X obj 335 447 expr strcat ("hello " \, "world"); -#X obj 54 503 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X symbolatom 55 551 15 0 0 0 - - - 0; -#X obj 55 527 expr strncat ("hello " \, "world" \, 2); -#X obj 54 663 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X obj 54 687 symbol hello; -#X listbox 54 710 20 0 0 0 - - - 0; -#X floatatom 55 823 5 0 0 0 - - - 0; -#X floatatom 109 823 5 0 0 0 - - - 0; -#X floatatom 162 823 5 0 0 0 - - - 0; -#X floatatom 216 823 5 0 0 0 - - - 0; -#X obj 55 737 expr strcmp ($s1 \, "hello") \; strcmp($s1 \, "HELLO") \; strcasecmp($s1 \, "HELLO") \; strncmp($s1 \, "heWorld" \, 2) \; strncasecmp($s1 \, "HEWORLD" \, 2) \;; -#X floatatom 269 823 5 0 0 0 - - - 0; -#X obj 334 583 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X symbolatom 335 633 10 0 0 0 - - - 0; -#X obj 335 607 expr strpbrk("hello" \, "lx"); -#X obj 334 663 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X floatatom 335 710 5 0 0 0 - - - 0; -#X obj 335 687 expr strspn("hello" \, "ehx"); -#X obj 54 583 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X floatatom 55 630 5 0 0 0 - - - 0; -#X obj 55 607 expr strcspn("hello" \, "lx"); -#X obj 55 197 expr symboln(4.52 \, 6 \, 3); -#X text 46 142 symboln(flt \, length \, decimal length); -#X obj 334 173 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X symbolatom 335 221 10 0 0 0 - - - 0; -#X text 331 142 symboln(sym \, length \, sym trim length); -#X obj 335 197 expr symboln("hello" \, 5 \, 3); -#X obj 56 934 array define expr2_\$0; -#X floatatom 65 1034 5 0 0 0 - - - 0; -#X msg 409 961 symbol expr1_; -#X msg 517 960 symbol expr2_; -#X obj 65 972 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X obj 416 804 loadbang; -#X msg 416 828 50; -#X obj 65 996 expr size(strcat(if (!strcmp($s2 \, "") \, "expr0_" \, $s2) \, sym(\$0))), f 65; -#X text 53 914 table with size 200; -#X obj 466 852 array size expr2_\$0; -#X obj 416 875 array size expr1_\$0; -#X msg 466 828 200; -#X text 213 871 table with size 50; -#X text 53 871 table with size 100; -#X text 50 6 String Functions; -#X obj 216 889 array define expr1_\$0; -#X obj 56 888 array define expr0_\$0; -#X obj 334 503 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; -#X symbolatom 335 551 20 0 0 0 - - - 0; -#X obj 335 527 expr strcat ("hello " \, "world " \, "again"); -#X text 90 971 checking for null symbol input; -#X text 408 902 First bang the expr; -#X text 408 920 then click one of the below; -#X text 408 936 then bang the expr again; -#X text 48 156 for floats; -#X text 329 156 for symbols; -#X text 50 26 for more info see string functions' manuals in C language; -#X connect 0 0 4 0; -#X connect 1 0 47 0; -#X connect 2 0 3 0; -#X connect 3 0 13 0; -#X connect 4 0 12 0; -#X connect 5 0 6 0; -#X connect 6 0 10 0; -#X connect 7 0 8 0; -#X connect 8 0 9 0; -#X connect 14 0 18 0; -#X connect 15 0 19 0; -#X connect 18 0 17 0; -#X connect 19 0 16 0; -#X connect 20 0 21 0; -#X connect 21 0 22 0; -#X connect 23 0 25 0; -#X connect 25 0 24 0; -#X connect 26 0 28 0; -#X connect 28 0 27 0; -#X connect 29 0 30 0; -#X connect 30 0 31 0; -#X connect 31 0 36 0; -#X connect 36 0 32 0; -#X connect 36 1 33 0; -#X connect 36 2 34 0; -#X connect 36 3 35 0; -#X connect 36 4 37 0; -#X connect 38 0 40 0; -#X connect 40 0 39 0; -#X connect 41 0 43 0; -#X connect 43 0 42 0; -#X connect 44 0 46 0; -#X connect 46 0 45 0; -#X connect 47 0 11 0; -#X connect 49 0 52 0; -#X connect 52 0 50 0; -#X connect 55 0 60 1; -#X connect 56 0 60 1; -#X connect 57 0 60 0; -#X connect 58 0 59 0; -#X connect 58 0 64 0; -#X connect 59 0 63 0; -#X connect 60 0 54 0; -#X connect 64 0 62 0; -#X connect 70 0 72 0; -#X connect 72 0 71 0; +#N canvas 402 38 885 859 string-functions 0; +#X obj 292 90 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 600 94 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 29 114 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 292 121 expr symbol(4.52); +#X obj 31 212 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 31 240 expr tolower("HELLO"); +#X obj 31 322 expr tonlower("HELLO" \, 2); +#X symbolatom 31 348 10 0 0 0 - - - 0; +#X symbolatom 31 266 10 0 0 0 - - - 0; +#X symbolatom 600 154 10 0 0 0 - - - 0; +#X symbolatom 292 145 10 0 0 0 - - - 0; +#X symbolatom 29 170 13 0 0 0 - - - 0; +#X obj 311 212 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X symbolatom 311 348 10 0 0 0 - - - 0; +#X symbolatom 311 266 10 0 0 0 - - - 0; +#X obj 311 240 expr toupper("hello"); +#X obj 311 322 expr tonupper("hello" \, 2); +#X floatatom 318 480 5 0 0 0 - - - 0; +#X symbolatom 31 468 15 0 0 0 - - - 0; +#X symbolatom 30 660 15 0 0 0 - - - 0; +#X floatatom 601 483 4 0 0 0 - - - 0; +#X symbolatom 359 617 10 0 0 0 - - - 0; +#X obj 359 587 expr strpbrk("hello" \, "lx"); +#X floatatom 33 813 5 0 0 0 - - - 0; +#X obj 600 119 expr symboln(4.52 \, 6 \, 3); +#X text 597 70 symboln(flt \, length \, decimal length); +#X symbolatom 601 267 10 0 0 0 - - - 0; +#X text 598 190 symboln(sym \, length \, sym trim length); +#X obj 601 243 expr symboln("hello" \, 5 \, 3); +#X floatatom 357 814 5 0 0 0 - - - 0; +#X msg 613 698 symbol expr1_; +#X msg 630 725 symbol expr2_; +#X obj 357 727 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X symbolatom 32 572 20 0 0 0 - - - 0; +#X obj 32 544 expr strcat ("hello " \, "world " \, "again"); +#X text 382 726 checking for null symbol input; +#X text 629 219 for symbols; +#X obj 180 114 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X symbolatom 180 170 10 0 0 0 - - - 0; +#X obj 180 142 expr "\$0-x"; +#X text 325 83 turn a float into a symbol, f 13; +#X text 49 67 A string in quotes is output as a symbol., f 21; +#X text 339 211 turn lower case to upper case; +#X text 59 211 turn upper case to lower case; +#X obj 601 218 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 31 295 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 311 295 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 318 407 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 31 413 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 30 611 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 32 517 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 359 548 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 31 440 expr strcat("hello " \, "world"); +#X text 87 412 concatenate strings; +#X text 541 653 First bang the [expr] \, then click one of the below \, then bang [expr] again, f 34; +#X obj 636 568 array define expr0_\$0 100; +#X obj 636 591 array define expr1_\$0 50; +#X obj 636 613 array define expr2_\$0 200; +#X obj 436 96 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X symbolatom 436 146 10 0 0 0 - - - 0; +#X obj 436 121 expr sym(\$0); +#X text 465 98 abbreviation; +#X symbolatom 601 372 10 0 0 0 - - - 0; +#X text 732 325 functions to compare strings, f 15; +#X msg 640 762 symbol; +#X text 693 762 null symbol; +#X obj 30 635 expr strncat("hello " \, "world" \, 2); +#X floatatom 462 480 5 0 0 0 - - - 0; +#X text 146 719 Get span until character in string, f 19; +#X msg 33 712 symbol hello; +#X msg 51 739 symbol bang; +#X text 384 538 return string from found character, f 18; +#X floatatom 198 813 5 0 0 0 - - - 0; +#X obj 33 767 expr strcspn($s1 \, "lg") \; strspn($s1 \, "heban"); +#X obj 318 437 expr strlen("hello") \; strlen($s2); +#X symbolatom 462 410 10 0 0 0 - - - 0; +#X text 470 389 (type); +#X text 352 407 string length; +#X text 626 93 for floats; +#X text 151 14 String Functions: for more info see the HTML reference (or C language manuals), f 79; +#X obj 29 142 expr "hello world"; +#X msg 601 316 symbol hello; +#X msg 615 342 symbol HEWORLD; +#X floatatom 652 483 4 0 0 0 - - - 0; +#X floatatom 704 483 4 0 0 0 - - - 0; +#X floatatom 756 483 4 0 0 0 - - - 0; +#X floatatom 808 483 4 0 0 0 - - - 0; +#X obj 601 397 expr strcmp($s1 \, "hello") \; strcmp($s1 \, "HELLO") \; strcasecmp($s1 \, "HELLO") \; strncmp($s1 \, "heWorld" \, 2) \; strncasecmp($s1 \, "HEWORLD" \, 2); +#X obj 357 761 expr size(strcat(if(!strcmp($s2 \, "") \, "expr0_" \, $s2) \, sym(\$0))), f 37; +#X text 592 544 define arrays of different sizes; +#X text 229 37 Note that functions that ouput symbols only work in [expr]; +#X connect 0 0 3 0; +#X connect 1 0 24 0; +#X connect 2 0 80 0; +#X connect 3 0 10 0; +#X connect 4 0 5 0; +#X connect 5 0 8 0; +#X connect 6 0 7 0; +#X connect 12 0 15 0; +#X connect 15 0 14 0; +#X connect 16 0 13 0; +#X connect 22 0 21 0; +#X connect 24 0 9 0; +#X connect 28 0 26 0; +#X connect 30 0 88 1; +#X connect 31 0 88 1; +#X connect 32 0 88 0; +#X connect 34 0 33 0; +#X connect 37 0 39 0; +#X connect 39 0 38 0; +#X connect 44 0 28 0; +#X connect 45 0 6 0; +#X connect 46 0 16 0; +#X connect 47 0 74 0; +#X connect 48 0 52 0; +#X connect 49 0 66 0; +#X connect 50 0 34 0; +#X connect 51 0 22 0; +#X connect 52 0 18 0; +#X connect 58 0 60 0; +#X connect 60 0 59 0; +#X connect 62 0 87 0; +#X connect 64 0 88 1; +#X connect 66 0 19 0; +#X connect 69 0 73 0; +#X connect 70 0 73 0; +#X connect 73 0 23 0; +#X connect 73 1 72 0; +#X connect 74 0 17 0; +#X connect 74 1 67 0; +#X connect 75 0 74 1; +#X connect 80 0 11 0; +#X connect 81 0 62 0; +#X connect 82 0 62 0; +#X connect 87 0 20 0; +#X connect 87 1 83 0; +#X connect 87 2 84 0; +#X connect 87 3 85 0; +#X connect 87 4 86 0; +#X connect 88 0 29 0; #X restore 125 466 pd string-functions; -#X restore 505 549 pd All_functions \; and operators; -#N canvas 50 475 961 640 [expr] 0; +#X restore 505 547 pd All_functions \; and operators; +#N canvas 327 86 952 778 [expr] 0; #X obj 206 123 expr 1; #X floatatom 206 153 4 0 0 0 - - - 0; -#X floatatom 307 151 4 0 0 0 - - - 0; +#X floatatom 297 151 4 0 0 0 - - - 0; #X floatatom 64 406 0 0 0 0 - - - 12; -#X floatatom 557 55 6 0 0 0 - - - 0; -#X floatatom 557 135 8 0 0 0 - - - 0; -#X floatatom 573 344 0 0 0 0 - - - 0; -#X obj 573 316 expr 8 / 3; -#X floatatom 707 583 0 0 0 0 - - - 0; -#X floatatom 768 583 0 0 0 0 - - - 0; -#X obj 557 87 expr cos(2 * 3.14159 * $f1 / 360) \; sin(2 * 3.14159 * $f1 / 360); +#X floatatom 557 64 6 0 0 0 - - - 0; +#X floatatom 557 144 8 0 0 0 - - - 0; +#X floatatom 573 353 0 0 0 0 - - - 0; +#X obj 573 325 expr 8 / 3; +#X floatatom 707 592 0 0 0 0 - - - 0; +#X floatatom 768 592 0 0 0 0 - - - 0; +#X obj 557 96 expr cos(2 * 3.14159 * $f1 / 360) \; sin(2 * 3.14159 * $f1 / 360); #X floatatom 308 450 5 0 0 0 - - - 0; #X floatatom 308 558 5 0 0 0 - - - 0; #X floatatom 352 557 5 0 0 0 - - - 0; @@ -792,21 +806,18 @@ #X obj 352 597 print expr; #X obj 64 375 expr ($f1 + 2) * $i2; #X text 71 111 A bang evaluates the expression, f 17; -#X text 609 54 example of trigonometric functions; -#X floatatom 793 345 0 0 0 0 - - - 0; -#X msg 793 293 8; -#X obj 793 317 expr $f1 / 3; -#X text 542 537 '8.' becomes a float =>; -#X floatatom 679 344 0 0 0 0 - - - 0; -#X msg 679 292 8; -#X obj 679 316 expr $i1 / 3; -#X text 508 210 Integer numbers inside the [expr] object are interpreted as integers \, not floats. Hence \, the result of the division below to the left is also an integer and it's the same if you have an '$i#' variable \, but '$f#' works fine.; -#X obj 707 521 expr float(8) / 3 \; (8.) / 3 \; 8./3; -#X floatatom 830 583 0 0 0 0 - - - 0; -#X text 542 551 also becomes a float =>; -#X obj 307 123 expr 2 + 3.2; -#X text 496 180 NOTE About integers and integer variable types:; -#X text 30 31 Here are some basic examples of the [expr] object. This object only takes the variables: "$f#" \, "$i#" and "$s#" (examples of this type are presented in [pd Arrays] in the parent patch)., f 63; +#X text 609 63 example of trigonometric functions; +#X floatatom 793 354 0 0 0 0 - - - 0; +#X msg 793 302 8; +#X obj 793 326 expr $f1 / 3; +#X floatatom 679 353 0 0 0 0 - - - 0; +#X msg 679 301 8; +#X obj 679 325 expr $i1 / 3; +#X text 508 219 Integer numbers inside the [expr] object are interpreted as integers \, not floats. Hence \, the result of the division below to the left is also an integer and it's the same if you have an '$i#' variable \, but '$f#' works fine.; +#X obj 707 530 expr float(8) / 3 \; (8.) / 3 \; 8./3; +#X floatatom 830 592 0 0 0 0 - - - 0; +#X obj 297 123 expr 2 + 3.2; +#X text 496 189 NOTE About integers and integer variable types:; #X obj 169 339 t b f; #X floatatom 64 312 6 0 0 0 - - - 0; #X floatatom 169 312 6 0 0 0 - - - 0; @@ -815,48 +826,61 @@ #X text 234 364 See how '()' is used to force an operation priority for the sum. Otherwise '*' and '/' have priority., f 33; #X text 231 306 Note that a bang also evaluates the expression with the previously set values., f 34; #X text 57 470 A semicolon can be used to create and separate different expressions (up to 100). If so \, an outlet is created for each expression and they're evaluated from right to left (or bottom to up) order:, f 30; -#X text 507 390 Pd turns "8.0" into "8" and [expr] will see it as an integer. One way to deal with this is with the "float" function to convert an integer to a float. A possible workaround is to have just a decimal point and the number inside parenthesis. Pd sees this as a symbol and doesn't remove the dot and [expr] will see it as a float. Other hacks like that are possible \, see below:, f 61; +#X text 507 399 Pd turns "8.0" into "8" and [expr] will see it as an integer. One way to deal with this is with the "float" function to convert an integer to a float. A possible workaround is to have just a decimal point and the number inside parenthesis. Pd sees this as a symbol and doesn't remove the dot and [expr] will see it as a float. Other hacks like that are possible \, see below:, f 61; #X obj 206 95 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 307 95 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 573 289 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 707 494 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 560 25 hsl 162 17 0 360 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; -#X floatatom 792 135 8 0 0 0 - - - 0; +#X obj 297 95 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 573 298 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 707 503 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 560 34 hsl 162 17 0 360 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X floatatom 792 144 8 0 0 0 - - - 0; #X msg 37 268 3 4; #X text 72 262 a list input spreads values into inlets (as is common in Pd)., f 33; +#X text 30 31 Here are some basic examples of the [expr] object. This object only takes the variables: "$f#" \, "$i#" and "$s#"., f 63; +#X text 534 546 '8.' becomes a float -->; +#X text 534 560 also becomes a float -->; +#X symbolatom 143 704 10 0 0 0 - - - 0; +#X obj 143 655 expr "hello" \; $s1; +#X symbolatom 231 703 10 0 0 0 - - - 0; +#X msg 143 618 symbol world; +#X text 335 648 Symbol strings are also supported in [expr] \, which can also output symbols. You can define a symbol string if it's inside quotes., f 75; +#X text 335 682 If not inside quotes \, symbols will be either treated as variable names defined in [value] objects or as array names if you use index values inside brackets (see [pd [value] and [pd Arrays] in the parent patch for details). There are also functions for manipulating strings (see [pd All_functions \; and operators] in the parent as well)., f 75; +#X text 259 653 <---------; #X connect 0 0 1 0; #X connect 4 0 10 0; #X connect 7 0 6 0; #X connect 10 0 5 0; -#X connect 10 1 47 0; -#X connect 11 0 37 0; +#X connect 10 1 44 0; +#X connect 11 0 34 0; #X connect 12 0 15 0; #X connect 13 0 15 0; #X connect 14 0 15 0; #X connect 16 0 3 0; #X connect 20 0 21 0; #X connect 21 0 19 0; -#X connect 24 0 25 0; -#X connect 25 0 23 0; -#X connect 27 0 8 0; -#X connect 27 1 9 0; -#X connect 27 2 28 0; -#X connect 30 0 2 0; -#X connect 33 0 16 0; -#X connect 33 1 16 1; -#X connect 34 0 16 0; -#X connect 35 0 33 0; -#X connect 37 0 12 0; -#X connect 37 1 13 0; -#X connect 37 2 14 0; -#X connect 42 0 0 0; -#X connect 43 0 30 0; -#X connect 44 0 7 0; -#X connect 45 0 27 0; -#X connect 46 0 4 0; -#X connect 48 0 16 0; +#X connect 23 0 24 0; +#X connect 24 0 22 0; +#X connect 26 0 8 0; +#X connect 26 1 9 0; +#X connect 26 2 27 0; +#X connect 28 0 2 0; +#X connect 30 0 16 0; +#X connect 30 1 16 1; +#X connect 31 0 16 0; +#X connect 32 0 30 0; +#X connect 34 0 12 0; +#X connect 34 1 13 0; +#X connect 34 2 14 0; +#X connect 39 0 0 0; +#X connect 40 0 28 0; +#X connect 41 0 7 0; +#X connect 42 0 26 0; +#X connect 43 0 4 0; +#X connect 45 0 16 0; +#X connect 51 0 50 0; +#X connect 51 1 52 0; +#X connect 53 0 51 0; #X restore 226 500 pd [expr] Examples; -#N canvas 354 35 837 696 [expr~] 0; +#N canvas 354 38 837 696 [expr~] 0; #X floatatom 50 361 5 0 0 0 - - - 0; #X obj 50 468 dac~; #X text 95 361 frequency; @@ -933,7 +957,7 @@ #X connect 35 0 3 0; #X connect 36 0 30 0; #X restore 219 528 pd [expr~] Examples; -#N canvas 222 33 1094 690 [fexpr~] 0; +#N canvas 222 38 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; @@ -1122,10 +1146,10 @@ #X connect 41 0 27 0; #X connect 56 0 47 0; #X restore 212 555 pd [fexpr~] Examples; -#X obj 335 608 >; +#X obj 367 608 >; #X text 102 522 (click on the subpatches to open them), f 13; -#X obj 387 671 random; -#N canvas 411 74 872 635 [value] 0; +#X obj 215 667 random; +#N canvas 485 110 872 635 [value] 0; #X floatatom 596 202 5 0 0 0 - - - 0; #X obj 596 137 until; #X msg 719 138 0; @@ -1190,7 +1214,7 @@ #X connect 34 0 23 0; #X connect 35 0 27 0; #X connect 36 0 14 0; -#X restore 580 497 pd [value]; +#X restore 580 495 pd [value]; #X obj 105 258 expr $f1 + $s3[$i2]; #X symbolatom 235 232 7 0 0 0 - - - 0; #X floatatom 170 231 3 0 0 0 - - - 0; @@ -1200,10 +1224,10 @@ #X text 62 297 [expr~] has an exclusive input variable defined as '$v#' - which stands for an audio signal 'vector' (or block)., f 85; #X text 49 395 [fexpr~] has exclusive variable types defined as: '$x#[n]' (an input audio sample from inlet # indexed by 'n') and '$y#[n]' (an output audio sample from outlet # indexed by 'n')., f 91; #X text 307 224 First inlet is a float input that adds to an array value whose index is defined by an integer input from the second inlet and the third inlet takes a symbol for the array name., f 50; -#X obj 441 671 array; +#X obj 268 667 array; #X obj 278 355 expr~ $v1 + $f2; #X floatatom 401 355 5 0 0 0 - - - 0; -#X obj 242 671 cos~; +#X obj 315 667 cos~; #X obj 70 33 expr; #X obj 63 58 expr~; #X obj 57 96 fexpr~; @@ -1228,22 +1252,22 @@ #X restore 451 91 pd reference; #X obj 8 595 cnv 1 730 1 empty empty empty 8 12 0 13 #000000 #000000 0; #X text 655 90 <= click; -#N canvas 615 128 573 527 reference 0; +#N canvas 649 125 573 524 reference 0; #X obj 9 43 cnv 5 550 5 empty empty INLETS: 8 18 0 13 #202020 #000000 0; #X obj 9 258 cnv 2 550 2 empty empty OUTLETS: 8 12 0 13 #202020 #000000 0; -#X obj 9 347 cnv 2 550 2 empty empty ARGUMENTS: 8 12 0 13 #202020 #000000 0; -#X obj 8 498 cnv 5 550 5 empty empty empty 8 18 0 13 #202020 #000000 0; +#X obj 9 367 cnv 2 550 2 empty empty ARGUMENTS: 8 12 0 13 #202020 #000000 0; +#X obj 8 495 cnv 5 550 5 empty empty empty 8 18 0 13 #202020 #000000 0; #X obj 8 178 cnv 1 550 1 empty empty 'n': 8 12 0 13 #7c7c7c #000000 0; #X obj 22 10 expr; #X text 82 52 (arguments set 'n' number of inlets and type); #X text 77 201 symbol - if inlet type is '$s#' or '$i#'., f 44; #X obj 8 291 cnv 1 550 1 empty empty 'n': 8 12 0 13 #7c7c7c #000000 0; #X text 83 263 (number of expressions define 'n' numbers of outlets); -#X text 12 374 1) list -; +#X text 12 394 1) list -; #X obj 62 10 expr~; #X obj 110 10 fexpr~; #X text 100 298 float - (for [expr] only) expression result., f 58; -#X text 93 317 signal - (for [expr~] and [fexpr~] only) expression result.; +#X text 93 336 signal - (for [expr~] and [fexpr~] only) expression result.; #X text 164 9 - expression evaluation family of objects.; #X text 77 219 signal -; #X text 140 219 if inlet type is '$v#' ([expr~]) or '$x#' ([fexpr~]) \, leftmost inlet is always signal in [expr~]/[fexpr~].; @@ -1254,27 +1278,29 @@ #X text 60 119 stop/start - in [fexpr~]: stop/start computation., f 70; #X text 151 139 in [fexpr~]: clear input/output memory \, optional symbol specifies a specific input (such as x1) or output (y1)., f 57; #X text 84 183 float - if inlet type is '$f#' or '$i#' ('#' is inlet number)., f 62; -#X text 83 374 expression including operators \, functions \, inlet types \, float and symbols. See html reference and examples for all operators and functions. Semicolons create more expressions (and outlets). Inlet type has the format '$t#' - where 't' is type (f \, i \, s \, v and x) and # is the inlet number \, fexpr~'s 'x' type also has a sample number inside brackets and fexpr~ also has a 'y' variable for output samples with previous samples inside brackets as well (default: output zeros)., f 66; +#X text 93 316 symbol - (for [expr] only) expression result., f 59; +#X text 82 394 expression including operators \, functions \, inlet types \, float and symbols. See html reference and examples for all operators and functions. Semicolons create more expressions (and outlets). Inlet type has the format '$t#' - where 't' is type (f \, i \, s \, v and x) and # is the inlet number \, [fexpr~]'s 'x' and 'y' types also have a sample number inside brackets (default: output zeros)., f 66; #X restore 561 91 pd reference; #X text 338 328 <-- 1st inlet is an audio signal vector/block; #X text 256 443 'n' index for '$x#' is from 0 to minus "vector size - 1".; #X text 256 460 'n' index for '$x#' is from -1 to minus "vector size - 1".; #X text 474 57 <-- Open HTML reference; -#X obj 24 671 abs; -#X obj 55 671 abs~; -#X text 93 670 - unary operators; -#X obj 111 608 +; -#X text 174 607 - binary operators; -#X obj 144 608 +~; -#X obj 24 637 mtof; -#X obj 62 638 mtof~; -#X text 105 637 - acoustic conversions; -#X obj 335 638 sin; -#X text 366 607 - other binary operators (control only); -#X text 364 637 - trigonometric functions (control only); +#X obj 367 665 abs; +#X obj 398 665 abs~; +#X text 436 664 - unary operators; +#X obj 91 608 +; +#X text 154 607 - binary operators; +#X obj 124 608 +~; +#X obj 53 637 mtof; +#X obj 91 637 mtof~; +#X text 134 636 - acoustic conversions; +#X obj 367 635 sin; +#X text 398 607 - other binary operators (control only); +#X text 396 634 - trigonometric functions (control only); #X text 26 3 Expression evaluation family of objects By Shahrokh Yadegari - Version 0.58, f 75; -#X text 518 670 updated for Pd version 0.54-2; -#X text 51 147 These objects have several built in operators and functions and the syntax is quite similar to how expressions are written in C. They receive input variables via the inlets and understand the variable types: '$f#' (floats) \, '$i#' (integers) and '$s#' (symbols \, used to represent array names) - '#' is the inlet number (up to 100) as below:, f 88; +#X text 601 663 updated for Pd version 0.55-1, f 14; +#X obj 22 667 makefilename; +#X text 43 151 These objects have several built in operators and functions and the syntax is quite similar to how expressions are written in C. They receive input variables via the inlets and understand the variable types: '$f#' (floats) \, '$i#' (integers) and '$s#' (symbols) - '#' is the inlet number (up to 100) as below:, f 94; #X connect 16 0 15 2; #X connect 17 0 15 1; #X connect 18 0 15 0; diff --git a/doc/5.reference/makefilename-help.pd b/doc/5.reference/makefilename-help.pd index 25a65a47..3c976e2b 100644 --- a/doc/5.reference/makefilename-help.pd +++ b/doc/5.reference/makefilename-help.pd @@ -556,7 +556,7 @@ #X text 127 236 - string; #X text 33 366 The types can be preceded by optional fields \, which can be combined and included in the order below:; #X restore 392 379 pd possible_types_&_syntax; -#X text 412 443 updated for Pd version 0.51; +#X text 412 442 updated for Pd version 0.51; #X msg 48 209 set cat\ %d.wav; #X obj 43 263 makefilename dog\ %d.aif; #X obj 392 249 makefilename dog\ %s.aif; @@ -592,6 +592,8 @@ #X obj 24 365 makefilename %d; #X symbolatom 24 395 5 0 0 0 - - - 0; #X text 67 395 <-- number converted to symbol; +#X text 151 442 and string functions in; +#X obj 324 442 expr; #X connect 0 0 13 0; #X connect 0 0 31 0; #X connect 1 0 14 0; diff --git a/doc/5.reference/symbol-help.pd b/doc/5.reference/symbol-help.pd index 7f534b64..9ea161b8 100644 --- a/doc/5.reference/symbol-help.pd +++ b/doc/5.reference/symbol-help.pd @@ -21,7 +21,7 @@ #X obj 34 14 symbol; #X text 90 13 - store a symbol (i.e. \, string); #X text 32 455 see also:; -#X obj 207 456 float; +#X obj 245 455 float; #X text 599 453 updated for Pd version 0.52; #N canvas 685 120 581 310 reference 0; #X text 119 115 symbol -; @@ -44,13 +44,14 @@ #X obj 9 51 cnv 1 800 1 empty empty empty 8 12 0 13 #000000 #000000 0; #X obj 9 436 cnv 1 800 1 empty empty empty 8 12 0 13 #000000 #000000 0; #X text 709 16 <= click; -#X obj 257 455 int; +#X obj 295 455 int; #X text 14 66 The [symbol] object stores a symbol \, Pd's data type for handling fixed strings (often filenames \, array names \, send/receive names or the names of other objects in pd).; #X text 149 321 NOTE: unlike [float] \, [int] \, [value] \, [list store] and [pointer] \, there's no "send" message to forward to another object -- that would conflict with the function of converting arbitrary messages to symbols., f 86; -#X obj 291 455 list store; +#X obj 329 455 list store; #X obj 29 128 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; #X obj 106 455 makefilename; #X text 149 381 ALSO NOTE: You can't convert floats to symbol with [symbol] \, but if you need it you can use [makefilename] \, which is a powerful symbol formatter., f 86; +#X obj 202 455 expr; #X connect 3 0 5 0; #X connect 4 0 3 0; #X connect 5 0 15 0; diff --git a/doc/8.topics/expr.htm b/doc/8.topics/expr.htm index 1dde69a7..ee7aed06 100644 --- a/doc/8.topics/expr.htm +++ b/doc/8.topics/expr.htm @@ -167,29 +167,29 @@


              -

              Expr, Expr~, Fexpr~

              +

              [expr], [expr~], [fexpr~]

              Based on original sources from IRCAM’s jMax Released under BSD License.

              -

              The expr family is a set of C-like expression evaluation objects for the graphical music language Pure Data. It used to come as an ‘extra’ external, but it is now a built-in native object.

              +

              The [expr] family is a set of C-like expression evaluation objects for the graphical music language Pure Data. It used to come as an ‘extra’ external, but it is now a built-in native object.

              -

              expr runs in control rate and evaluates C-like expressions. See below for the list of operators. Multiple expressions separated by semicolons can be defined in a single expr object and this results in multiple outlets (up to 100, each for each expression). Expressions are evaluated from right to left (which means that the bottom expression will be the first executed.) The number of inlets in expr are defined by variables that take a few different forms: $i#, $i# and $s# for 'integers', 'floats' and 'symbols' ('#' is an inlet number from 1 up to 100, ordered from left to right). As an example, we can have 3 inlets defined as "$i1", "$f2" and "$s3", where:

              +

              [expr] runs in control rate and evaluates C-like expressions. See below for the list of operators. Multiple expressions separated by semicolons can be defined in a single [expr] object and this results in multiple outlets (up to 100, each for each expression). Expressions are evaluated from right to left (which means that the bottom expression will be the first executed.) The number of inlets in expr are defined by variables that take a few different forms: $i#, $i# and $s# for 'integers', 'floats' and 'symbols' ('#' is an inlet number from 1 up to 100, ordered from left to right). As an example, we can have 3 inlets defined as "$i1", "$f2" and "$s3", where:

              • $i1 is the input from the first (left) inlet and is treated as an integer
              • $f2 is the input from the second (middle) inlet and is treated as a float
              • -
              • $s3 is the input from the third (middle) and expects a symbol (used to define array names)
              • +
              • $s3 is the input from the third (middle) and expects a symbol
              -

              Arrays and variables (defined using the ‘value’ object) can be accessed the same way one dimensional arrays are accessed in C; for example, “valx + 10” will be evaluated to the value of variable ‘valx’ + 10 and “tabname[5]” will be evaluated to be the 5th element of an array named “tabname”. As shown above, the name of the arrays can be given by an input; for example “$s2[5]” will be evaluated to be the 5 element of the array whose symbol has been passed in inlet 2.

              +

              Arrays and variables (defined using the [value] object) can be accessed the same way one dimensional arrays are accessed in C; for example, “valx + 10” will be evaluated to the value of variable ‘valx’ + 10 and “tabname[5]” will be evaluated to be the 5th element of an array named “tabname”. The name of the arrays can also be given by an input; for example “$s2[5]” will be evaluated to be the 5 element of the array whose symbol has been passed in inlet 2.

              Type conversion from a float input to an integer is done automatically if the inlet is defined as an integer. Conversely, you can convert it explicitly by using functions (see below for the list of functions).

              -

              expr is also able to manipulate and output symbols. A symbol is written as a string with quotes around it, such as "hello", or as a symbol input $s# such as $s2. For more information about supported string manipulation functions see below. +

              [expr] is also able to manipulate and output symbols. A symbol is written as a string with quotes around it, such as "hello", or as a symbol input $s# such as $s2. For more information about supported string manipulation functions see below. -

              expr~ is designed to efficiently combine signal and control stream processing by vector operations on the basis of the audio block size. The operations, functions, and syntax for expr~ is just like expr with the addition of the $v# variable for signal vector input (also numbered up to 100). The '$v' is needed at least for the first and main input, so:

              +

              [expr~] is designed to efficiently combine signal and control stream processing by vector operations on the basis of the audio block size. The operations, functions, and syntax for [expr~] is just like [expr] with the addition of the $v# variable for signal vector input (also numbered up to 100). The '$v' is needed at least for the first and main input, so:

              • $v1 - means the first inlet is a signal input
              • @@ -199,16 +199,16 @@

                Expr, Expr~, Fexpr~

              -

              The result of an expression from expr~ is also an audio signal and multiple expressions up to 1000 can also be defined via semicolons.

              +

              The result of an expression from [expr~] is also an audio signal and multiple expressions up to 100 can also be defined via semicolons.

              -

              Note for MSP users: Currently in the MSP version all signal inputs should come first followed by other types of inlet. (There seems to be no way of mixing signal and other types of inlets in their order in Max/MSP, if you know otherwise, please let me know.) This means that signal inlets cannot be mixed with other types of inlets. For example, “expr~ $v1$f2$v3 ” is not legal. The second and third inlet should be switched and “expr~ $v1$v2$f3” should be used. In Pd you can mix them in any way you want.

              +

              Note for MSP users: Currently in the MSP version all signal inputs should come first followed by other types of inlet. (There seems to be no way of mixing signal and other types of inlets in their order in Max/MSP, if you know otherwise, please let me know.) This means that signal inlets cannot be mixed with other types of inlets. For example, [expr~ $v1 + $f2 + $v3] is not legal. The second and third inlet should be switched and [expr~ $v1 + $v2 + $f3] should be used instead. In Pd you can mix them in any way you want.

              -

              The fexpr~ object provides a flexible mechanism for building FIR and IIR filters by evaluating expressions on a sample by sample basis and providing access to prior samples of the input and output audio streams. When fractional offset is used, fexpr~ uses linear interpolation to determine the value of the indexed sample. The operations, functions, and syntax for expr~ is just like expr with the addition of $x# and $y# variables. fexpr~ can access previous input and output samples up to the block size (64 by default).

              +

              The [fexpr~] object provides a flexible mechanism for building FIR and IIR filters by evaluating expressions on a sample by sample basis and providing access to prior samples of the input and output audio streams. When fractional offset is used, [fexpr~] uses linear interpolation to determine the value of the indexed sample. The operations, functions, and syntax for [fexpr~] is just like [expr] with the addition of $x# and $y# variables. The [fexpr~] object can access previous input and output samples up to the block size (64 by default).

              -

              $x# is used to denote a signal input whose samples we would like to access. The syntax is $x followed by '#' (the inlet number up to 100) and the samples indexed by brackets, for example $x1[-1] specifies the previous sample of the first inlet. Therefore, if we are to build a simple filter which replaces every sample by the average of that sample and its previous one, we would use “fexpr~ ($x1[0]+$x1[-1])/2 ”. For ease of when the brackets are omitted, the current sample is implied, so we can write the previous filter expression as follows: “ fexpr~ ($x1+$x1[-1])/2”. To build IIR filters $y# is used to access the previous output samples indexed from -1 inside brackets. Note now that '#' here is used to define the outlet number.

              +

              $x# is used to denote a signal input whose samples we would like to access. The syntax is $x followed by '#' (the inlet number up to 100) and the samples indexed by brackets, for example $x1[-1] specifies the previous sample of the first inlet. Therefore, if we are to build a simple filter which replaces every sample by the average of that sample and its previous one, we would use [fexpr~ ($x1[0] + $x1[-1]) / 2]. For ease of when the brackets are omitted, the current sample is implied, so we can write the previous filter expression as follows: [fexpr~ ($x1 + $x1[-1]) / 2]. To build IIR filters $y# is used to access the previous output samples indexed from -1 inside brackets. Note now that '#' here is used to define the outlet number.

              -

              The first inlet also needs to be a signal input ($x1), the output of fexpr~ is a signal output and multiple expressions can also be defined via semicolons and each will correspond to an outlet that can be accessed by '$y#'. Note that '$v#' is not allowed in fexpr~, so:

              +

              The first inlet also needs to be a signal input ($x1), the output of [fexpr~] is a signal output and multiple expressions can also be defined via semicolons and each will correspond to an outlet that can be accessed by '$y#'. Note that '$v#' is not allowed in [fexpr~], so:

              • $x1[n] - means the first inlet is a signal input and 'n' is an index from 0 to -block size
              • @@ -220,7 +220,7 @@

                Expr, Expr~, Fexpr~


                -

                The operators expr, expr~ and fexpr~ support (listed from highest precedence to lowest) are as follows:

                +

                The operators [expr], [expr~] and [fexpr~] support (listed from highest precedence to lowest) are as follows:

                @@ -334,7 +334,7 @@

                The operators expr, expr~ and fexpr~ support (listed from hig

                -

                The supported functions for expr, expr~ and fexpr~ are:

                +

                The supported functions for [expr], [expr~] and [fexpr~] are:

                General Functions @@ -349,17 +349,17 @@

                The supported functions for expr, expr~ and fexpr~ are:

                - if () + if() 3 - conditional - if (condition, IfTrue-expr, IfFalse-expr) - in expr~ if ‘condition’ is a signal, the result will be determined on sample by sample basis (added in version 0.4) + conditional - if (condition, IfTrue-expr, IfFalse-expr) - in [expr~] if ‘condition’ is a signal, the result will be determined on sample by sample basis (added in version 0.4) - int () + int() 1 convert to integer - rint () + rint() 1 round a float to a nearby integer @@ -374,17 +374,17 @@

                The supported functions for expr, expr~ and fexpr~ are:

                smallest integral value not less than argument (added in version 0.4) -float () +float() 1 convert to float -min () +min() 2 minimum -max () +max() 2 maximum @@ -396,7 +396,7 @@

                The supported functions for expr, expr~ and fexpr~ are:

                if() 3 -conditional - if (condition, IfTrue-expr, IfFalse-expr) - in expr~ if ‘condition’ is a signal, the result will be determined on sample by sample basis (added in version 0.4) +conditional - if (condition, IfTrue-expr, IfFalse-expr) - in [expr~] if ‘condition’ is a signal, the result will be determined on sample by sample basis (added in version 0.4) isinf() @@ -409,7 +409,7 @@

                The supported functions for expr, expr~ and fexpr~ are:

                is the value finite (added in version 0.4) -isnan +isnan() 1 is the value non a number (added in version 0.4) @@ -419,17 +419,17 @@

                The supported functions for expr, expr~ and fexpr~ are:

                copy sign of a number(added in version 0.4) -imodf +imodf() 1 get signed integer value from floating point number(added in version 0.4) -modf +modf() 1 get signed fractional value from floating-point number(added in version 0.4) -drem +drem() 2 floating-point remainder function (added in version 0.4) @@ -456,12 +456,12 @@

                The supported functions for expr, expr~ and fexpr~ are:

                -pow () +pow() 2 raise to the power of {e.g., pow(x,y) is x to the power of y} -sqrt () +sqrt() 1 square root @@ -695,7 +695,7 @@

                The supported functions for expr, expr~ and fexpr~ are:

                - String Manipulation Functions + String Manipulation Functions (the ones that return a symbol only work for [expr]) @@ -833,9 +833,9 @@

                CHANGELOG:

                version 0.58

                  -
                • Added string functions in expr; now expr can output symbols (major redesign)
                • -
                • Provide better error messages; now expr prints the expr string when reporting errors -
                • Fixed the expr~ array[0]" bug +
                • Added string functions in [expr]; now expr can output symbols (major redesign)
                • +
                • Provide better error messages; now expr prints the [expr] string when reporting errors +
                • Fixed the [expr~] array[0]" bug
                • Fixed a memory issue were extra unused output vectors were
                  allocated for each inlet
                • NOTE: the syntax func("$s#", ...) is now deprecated and func($s#, ...) should be used @@ -854,7 +854,7 @@

                  version 0.57

                  version 0.56

                    -
                  • Fexpr~ now accepts a float in its first input.
                  • +
                  • [fexpr~] now accepts a float in its first input.
                  • Added avg() and Avg() back to the list of functions
                  @@ -862,7 +862,6 @@

                  version 0.56

                  version 0.55

                    -
                  • Expr, expr~, and fexpr~ are now built-in native objects.
                  • The arrays now redraw after a store into one of their members
                  • ex_if() (the “if()” function is reworked to only evaluate either the left or the right args depending on the truth value of the condition. However, if the condition is an audio vector, both the left and the right are evaluated regardless.
                  • priority of ‘,’ and ‘=’ was switched to fix the bug of using store “=” in functions with multiple arguments, which caused an error during execution.
                  • @@ -873,7 +872,7 @@

                    version 0.55

                    version 0.5

                      -
                    • Expr, expr~, and fexpr~ are now built-in native objects.
                    • +
                    • [expr], [expr~], and [fexpr~] are now built-in native objects.
                    • minor fixes/improvements.
                    @@ -881,18 +880,18 @@

                    version 0.5

                    version 0.4

                      -
                    • Expr, expr~, and fexpr~ now support multiple expressions separated by semicolons which results in multiple outlets.
                    • +
                    • [expr], [expr~], and [fexpr~] now support multiple expressions separated by semicolons which results in multiple outlets.
                    • Variables are supported now in the same way they are supported in C. - Variables have to be defined with the “value” object prior to execution.
                    • A new if function if (condition-expression, IfTrue-expression, IfFalse-expression) has been added.
                    • New math functions added.
                    • -
                    • New shorthand notations for fexpr~ have been added. +
                    • New shorthand notations for [fexpr~] have been added.
                      • $x ->$x1[0] $x# -> $x#[0]
                      • $y = $y1[-1] and $y# = $y#[-1]
                    • -
                    • New ‘set’ and ‘clear’ methods were added for fexpr~ +
                    • New ‘set’ and ‘clear’ methods were added for [fexpr~]
                      • clear - clears all the past input and output buffers
                      • diff --git a/src/x_vexp.c b/src/x_vexp.c index d07efb8e..85299d72 100644 --- a/src/x_vexp.c +++ b/src/x_vexp.c @@ -10,8 +10,8 @@ /* * * July 2024, Version 0.58 (major changes) - * - Added string functions in expr; now expr can output sympols - * - fixed the expr~ array[0]" bug + * - Added string functions in expr; now expr can output symbols + * - fixed the expr~ array[0] bug * - Provide better error messages; * now expr prints the expr string when reporting errors * - fixed a memory issue were extra unused vector output was From 735023174fa129ca7e65549bf10b912aa74c7215 Mon Sep 17 00:00:00 2001 From: porres Date: Thu, 22 Aug 2024 23:09:57 -0300 Subject: [PATCH 59/89] fix typos in many files and improve canvas size in [expr] closes https://github.com/pure-data/pddp/issues/246 closes https://github.com/pure-data/pddp/issues/245 --- doc/5.reference/array-object-help.pd | 2 +- doc/5.reference/canvas-help.pd | 4 +- doc/5.reference/cos~-help.pd | 2 +- doc/5.reference/expr-help.pd | 315 +++++++++++------------ doc/5.reference/file-help.pd | 2 +- doc/5.reference/gui-boxes-help.pd | 2 +- doc/5.reference/osc-format-parse-help.pd | 2 +- doc/5.reference/osc~-help.pd | 2 +- doc/5.reference/pd-messages.pd | 2 +- doc/5.reference/route-help.pd | 2 +- doc/5.reference/savepanel-help.pd | 2 +- doc/5.reference/soundfiler-help.pd | 2 +- doc/5.reference/tabwrite-help.pd | 2 +- doc/5.reference/text-object-help.pd | 2 +- doc/5.reference/vcf~-help.pd | 2 +- 15 files changed, 167 insertions(+), 178 deletions(-) diff --git a/doc/5.reference/array-object-help.pd b/doc/5.reference/array-object-help.pd index 22327034..a43ec851 100644 --- a/doc/5.reference/array-object-help.pd +++ b/doc/5.reference/array-object-help.pd @@ -196,7 +196,7 @@ #X text 68 297 -s : struct name and field name of main structure., f 67; #X text 68 315 -f : struct name and field name of element structure., f 69; #X obj 38 17 array sum; -#X text 125 16 - output the sum of the array or a range selecion.; +#X text 125 16 - output the sum of the array or a range selection.; #X text 117 110 float - onset (index to sum from \, 0 is the start).; #X obj 7 133 cnv 1 550 1 empty empty 2nd: 8 12 0 13 #7c7c7c #000000 0; #X text 65 144 float - number or points to sum from onset (-1 is the end of array)., f 68; diff --git a/doc/5.reference/canvas-help.pd b/doc/5.reference/canvas-help.pd index 18298723..f0d6c500 100644 --- a/doc/5.reference/canvas-help.pd +++ b/doc/5.reference/canvas-help.pd @@ -130,7 +130,7 @@ #X text 787 382 <-- click to open examples.; #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 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). Alternatively \, 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; #X text 91 23 - create a subpatch; #X text 271 65 - graph (subpatch with graph on parent), f 21; @@ -143,7 +143,7 @@ #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.528571 0.528571 0.5 0.428572 0.378573 0.328573 0.285716 0.24286 0.214289 0.185717 0.164289 0.142861 0.135718 0.128575 0.121432 0.11429 0.111432 0.108575 0.105718 0.102861 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.100004 0.102045 0.104086 0.106126 0.108167 0.110208 0.112249 0.11429 0.117147 0.120004 0.122861 0.125718 0.128575 0.131432 0.134289 0.137146 0.140004 0.142861 0.142861 0.142861 0.142861 0.142861 0.142861 0.142861 0.142861 0.142861 0.142861 0.142861 0.142861 0.142861 0.128575 0.128575 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 text 499 450 (using canvas [cnv] for background color), f 20; #N canvas 47 74 450 300 (subpatch) 0; #X restore 266 23 page; #X text 308 23 (deprecated alias); diff --git a/doc/5.reference/cos~-help.pd b/doc/5.reference/cos~-help.pd index df61cf8c..2d0f43dd 100644 --- a/doc/5.reference/cos~-help.pd +++ b/doc/5.reference/cos~-help.pd @@ -111,7 +111,7 @@ #X msg 257 177 \; pd compatibility 0.55; #X text 73 153 (old table size); #X text 273 153 (new table size); -#X text 38 22 Up to version 0.54 \, [cos~] relied on a 512-point cosine table \, which was adequate for most "computer music" applications in the 90s with a signal-to-noise ratio of about 110 dB. The default table size is now increased to 2048 points \, improving signal-to-noise by an additional 36 dB. To get the original 512-point tables you can run Pd with compatiblity level set to 0.54., f 56; +#X text 38 22 Up to version 0.54 \, [cos~] relied on a 512-point cosine table \, which was adequate for most "computer music" applications in the 90s with a signal-to-noise ratio of about 110 dB. The default table size is now increased to 2048 points \, improving signal-to-noise by an additional 36 dB. To get the original 512-point tables you can run Pd with compatibility level set to 0.54., f 56; #X restore 339 285 pd compatibility; #X text 345 247 compatibility note (open):, f 13; #X text 320 531 updated for Pd version 0.55; diff --git a/doc/5.reference/expr-help.pd b/doc/5.reference/expr-help.pd index a30e2dc5..a8fd83e4 100644 --- a/doc/5.reference/expr-help.pd +++ b/doc/5.reference/expr-help.pd @@ -1,4 +1,4 @@ -#N canvas 476 52 747 707 12; +#N canvas 333 41 747 707 12; #X declare -stdpath ./; #N canvas 455 177 911 525 Arrays 0; #X floatatom 123 370 4 0 9 0 - - - 0; @@ -90,7 +90,7 @@ #X text 8 607 see also:; #X obj 117 667 block~; #X obj 169 667 value; -#N canvas 859 72 513 543 All_functions 0; +#N canvas 767 72 513 543 All_functions 0; #N canvas 497 97 374 326 Arithmetic-operators 0; #X obj 57 90 expr $f1 + 4; #X floatatom 57 63 5 0 0 0 - - - 0; @@ -198,7 +198,7 @@ #X connect 7 0 1 0; #X connect 8 0 4 0; #X restore 125 286 pd Random-function; -#N canvas 778 283 604 538 Table-functions 0; +#N canvas 454 149 604 538 Table-functions 1; #X floatatom 63 163 0 0 0 0 - - - 0; #X floatatom 145 164 8 0 0 0 - - - 0; #X floatatom 228 164 4 0 0 0 - - - 0; @@ -644,147 +644,136 @@ #X connect 22 0 25 0; #X connect 25 0 23 0; #X restore 125 166 pd Relational-operators; -#N canvas 402 38 885 859 string-functions 0; -#X obj 292 90 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X obj 600 94 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X obj 29 114 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X obj 292 121 expr symbol(4.52); -#X obj 31 212 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X obj 31 240 expr tolower("HELLO"); -#X obj 31 322 expr tonlower("HELLO" \, 2); -#X symbolatom 31 348 10 0 0 0 - - - 0; -#X symbolatom 31 266 10 0 0 0 - - - 0; -#X symbolatom 600 154 10 0 0 0 - - - 0; -#X symbolatom 292 145 10 0 0 0 - - - 0; -#X symbolatom 29 170 13 0 0 0 - - - 0; -#X obj 311 212 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X symbolatom 311 348 10 0 0 0 - - - 0; -#X symbolatom 311 266 10 0 0 0 - - - 0; -#X obj 311 240 expr toupper("hello"); -#X obj 311 322 expr tonupper("hello" \, 2); -#X floatatom 318 480 5 0 0 0 - - - 0; -#X symbolatom 31 468 15 0 0 0 - - - 0; -#X symbolatom 30 660 15 0 0 0 - - - 0; -#X floatatom 601 483 4 0 0 0 - - - 0; -#X symbolatom 359 617 10 0 0 0 - - - 0; -#X obj 359 587 expr strpbrk("hello" \, "lx"); -#X floatatom 33 813 5 0 0 0 - - - 0; -#X obj 600 119 expr symboln(4.52 \, 6 \, 3); -#X text 597 70 symboln(flt \, length \, decimal length); -#X symbolatom 601 267 10 0 0 0 - - - 0; -#X text 598 190 symboln(sym \, length \, sym trim length); -#X obj 601 243 expr symboln("hello" \, 5 \, 3); -#X floatatom 357 814 5 0 0 0 - - - 0; -#X msg 613 698 symbol expr1_; -#X msg 630 725 symbol expr2_; -#X obj 357 727 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X symbolatom 32 572 20 0 0 0 - - - 0; -#X obj 32 544 expr strcat ("hello " \, "world " \, "again"); -#X text 382 726 checking for null symbol input; -#X text 629 219 for symbols; -#X obj 180 114 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X symbolatom 180 170 10 0 0 0 - - - 0; -#X obj 180 142 expr "\$0-x"; -#X text 325 83 turn a float into a symbol, f 13; -#X text 49 67 A string in quotes is output as a symbol., f 21; -#X text 339 211 turn lower case to upper case; -#X text 59 211 turn upper case to lower case; -#X obj 601 218 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X obj 31 295 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X obj 311 295 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X obj 318 407 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X obj 31 413 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X obj 30 611 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X obj 32 517 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X obj 359 548 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X obj 31 440 expr strcat("hello " \, "world"); -#X text 87 412 concatenate strings; -#X text 541 653 First bang the [expr] \, then click one of the below \, then bang [expr] again, f 34; -#X obj 636 568 array define expr0_\$0 100; -#X obj 636 591 array define expr1_\$0 50; -#X obj 636 613 array define expr2_\$0 200; -#X obj 436 96 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X symbolatom 436 146 10 0 0 0 - - - 0; -#X obj 436 121 expr sym(\$0); -#X text 465 98 abbreviation; -#X symbolatom 601 372 10 0 0 0 - - - 0; -#X text 732 325 functions to compare strings, f 15; -#X msg 640 762 symbol; -#X text 693 762 null symbol; -#X obj 30 635 expr strncat("hello " \, "world" \, 2); -#X floatatom 462 480 5 0 0 0 - - - 0; -#X text 146 719 Get span until character in string, f 19; -#X msg 33 712 symbol hello; -#X msg 51 739 symbol bang; -#X text 384 538 return string from found character, f 18; -#X floatatom 198 813 5 0 0 0 - - - 0; -#X obj 33 767 expr strcspn($s1 \, "lg") \; strspn($s1 \, "heban"); -#X obj 318 437 expr strlen("hello") \; strlen($s2); -#X symbolatom 462 410 10 0 0 0 - - - 0; -#X text 470 389 (type); -#X text 352 407 string length; -#X text 626 93 for floats; -#X text 151 14 String Functions: for more info see the HTML reference (or C language manuals), f 79; -#X obj 29 142 expr "hello world"; -#X msg 601 316 symbol hello; -#X msg 615 342 symbol HEWORLD; -#X floatatom 652 483 4 0 0 0 - - - 0; -#X floatatom 704 483 4 0 0 0 - - - 0; -#X floatatom 756 483 4 0 0 0 - - - 0; -#X floatatom 808 483 4 0 0 0 - - - 0; -#X obj 601 397 expr strcmp($s1 \, "hello") \; strcmp($s1 \, "HELLO") \; strcasecmp($s1 \, "HELLO") \; strncmp($s1 \, "heWorld" \, 2) \; strncasecmp($s1 \, "HEWORLD" \, 2); -#X obj 357 761 expr size(strcat(if(!strcmp($s2 \, "") \, "expr0_" \, $s2) \, sym(\$0))), f 37; -#X text 592 544 define arrays of different sizes; -#X text 229 37 Note that functions that ouput symbols only work in [expr]; +#N canvas 236 61 916 690 string-functions 0; +#X obj 312 90 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 620 94 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 49 114 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 312 121 expr symbol(4.52); +#X symbolatom 620 154 10 0 0 0 - - - 0; +#X symbolatom 312 145 10 0 0 0 - - - 0; +#X symbolatom 49 170 13 0 0 0 - - - 0; +#X floatatom 386 445 5 0 0 0 - - - 0; +#X symbolatom 48 442 15 0 0 0 - - - 0; +#X floatatom 621 483 4 0 0 0 - - - 0; +#X symbolatom 379 617 10 0 0 0 - - - 0; +#X obj 379 587 expr strpbrk("hello" \, "lx"); +#X floatatom 66 632 5 0 0 0 - - - 0; +#X obj 620 119 expr symboln(4.52 \, 6 \, 3); +#X text 617 70 symboln(flt \, length \, decimal length); +#X symbolatom 621 267 10 0 0 0 - - - 0; +#X text 618 190 symboln(sym \, length \, sym trim length); +#X obj 621 243 expr symboln("hello" \, 5 \, 3); +#X symbolatom 176 481 20 0 0 0 - - - 0; +#X text 649 219 for symbols; +#X obj 200 114 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X symbolatom 200 170 10 0 0 0 - - - 0; +#X obj 200 142 expr "\$0-x"; +#X text 345 83 turn a float into a symbol, f 13; +#X text 69 67 A string in quotes is output as a symbol., f 21; +#X text 89 210 turn upper case to lower case; +#X obj 621 218 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 48 348 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 379 548 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 74 349 concatenate strings; +#X obj 456 96 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X symbolatom 456 146 10 0 0 0 - - - 0; +#X obj 456 121 expr sym(\$0); +#X text 485 98 abbreviation; +#X symbolatom 621 372 10 0 0 0 - - - 0; +#X text 752 325 functions to compare strings, f 15; +#X floatatom 502 443 5 0 0 0 - - - 0; +#X text 179 538 Get span until character in string, f 19; +#X msg 66 531 symbol hello; +#X msg 84 558 symbol bang; +#X text 404 538 return string from found character, f 18; +#X floatatom 231 632 5 0 0 0 - - - 0; +#X obj 66 586 expr strcspn($s1 \, "lg") \; strspn($s1 \, "heban"); +#X text 646 93 for floats; +#X text 171 14 String Functions: for more info see the HTML reference (or C language manuals), f 79; +#X obj 49 142 expr "hello world"; +#X msg 621 316 symbol hello; +#X msg 635 342 symbol HEWORLD; +#X floatatom 672 483 4 0 0 0 - - - 0; +#X floatatom 724 483 4 0 0 0 - - - 0; +#X floatatom 776 483 4 0 0 0 - - - 0; +#X floatatom 828 483 4 0 0 0 - - - 0; +#X obj 621 397 expr strcmp($s1 \, "hello") \; strcmp($s1 \, "HELLO") \; strcasecmp($s1 \, "HELLO") \; strncmp($s1 \, "heWorld" \, 2) \; strncasecmp($s1 \, "HEWORLD" \, 2); +#X text 249 37 Note that functions that ouput symbols only work in [expr]; +#X symbolatom 223 445 15 0 0 0 - - - 0; +#X obj 48 377 expr strcat("hello " \, "world") \; strcat ("hello " \, "world " \, "again") \; strncat("hello " \, "world" \, 2); +#X obj 386 403 expr strlen($s2) \; strlen("hello"); +#X symbolatom 386 376 10 0 0 0 - - - 0; +#X floatatom 67 285 5 0 0 0 - - - 0; +#X floatatom 218 285 5 0 0 0 - - - 0; +#X obj 67 240 expr tolower("HELLO") \; tonlower("HELLO" \, 2); +#X obj 67 211 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X floatatom 334 285 5 0 0 0 - - - 0; +#X floatatom 485 285 5 0 0 0 - - - 0; +#X obj 334 211 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 334 240 expr toupper("hello") \; tonupper("hello" \, 2); +#X text 356 210 turn lower case to upper case; +#X text 385 352 string length; +#X text 463 375 (type); +#N canvas 156 126 540 373 example 0; +#X floatatom 41 304 5 0 0 0 - - - 0; +#X msg 297 188 symbol expr1_; +#X msg 314 215 symbol expr2_; +#X obj 41 217 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 66 216 checking for null symbol input; +#X text 225 143 First bang the [expr] \, then click one of the below \, then bang [expr] again, f 34; +#X obj 282 41 array define expr0_\$0 100; +#X obj 282 64 array define expr1_\$0 50; +#X obj 282 86 array define expr2_\$0 200; +#X msg 324 252 symbol; +#X text 377 252 null symbol; +#X obj 41 251 expr size(strcat(if(!strcmp($s2 \, "") \, "expr0_" \, $s2) \, sym(\$0))), f 37; +#X text 238 17 define arrays of different sizes; +#X text 62 64 Here's a bit more complicated ecample, f 20; +#X connect 1 0 11 1; +#X connect 2 0 11 1; +#X connect 3 0 11 0; +#X connect 9 0 11 1; +#X connect 11 0 0 0; +#X restore 718 580 pd example; #X connect 0 0 3 0; -#X connect 1 0 24 0; -#X connect 2 0 80 0; -#X connect 3 0 10 0; -#X connect 4 0 5 0; -#X connect 5 0 8 0; -#X connect 6 0 7 0; -#X connect 12 0 15 0; -#X connect 15 0 14 0; -#X connect 16 0 13 0; +#X connect 1 0 13 0; +#X connect 2 0 45 0; +#X connect 3 0 5 0; +#X connect 11 0 10 0; +#X connect 13 0 4 0; +#X connect 17 0 15 0; +#X connect 20 0 22 0; #X connect 22 0 21 0; -#X connect 24 0 9 0; -#X connect 28 0 26 0; -#X connect 30 0 88 1; -#X connect 31 0 88 1; -#X connect 32 0 88 0; -#X connect 34 0 33 0; -#X connect 37 0 39 0; -#X connect 39 0 38 0; -#X connect 44 0 28 0; +#X connect 26 0 17 0; +#X connect 27 0 55 0; +#X connect 28 0 11 0; +#X connect 30 0 32 0; +#X connect 32 0 31 0; +#X connect 34 0 52 0; +#X connect 38 0 42 0; +#X connect 39 0 42 0; +#X connect 42 0 12 0; +#X connect 42 1 41 0; #X connect 45 0 6 0; -#X connect 46 0 16 0; -#X connect 47 0 74 0; -#X connect 48 0 52 0; -#X connect 49 0 66 0; -#X connect 50 0 34 0; -#X connect 51 0 22 0; -#X connect 52 0 18 0; -#X connect 58 0 60 0; -#X connect 60 0 59 0; -#X connect 62 0 87 0; -#X connect 64 0 88 1; -#X connect 66 0 19 0; -#X connect 69 0 73 0; -#X connect 70 0 73 0; -#X connect 73 0 23 0; -#X connect 73 1 72 0; -#X connect 74 0 17 0; -#X connect 74 1 67 0; -#X connect 75 0 74 1; -#X connect 80 0 11 0; -#X connect 81 0 62 0; -#X connect 82 0 62 0; -#X connect 87 0 20 0; -#X connect 87 1 83 0; -#X connect 87 2 84 0; -#X connect 87 3 85 0; -#X connect 87 4 86 0; -#X connect 88 0 29 0; +#X connect 46 0 34 0; +#X connect 47 0 34 0; +#X connect 52 0 9 0; +#X connect 52 1 48 0; +#X connect 52 2 49 0; +#X connect 52 3 50 0; +#X connect 52 4 51 0; +#X connect 55 0 8 0; +#X connect 55 1 18 0; +#X connect 55 2 54 0; +#X connect 56 0 7 0; +#X connect 56 1 36 0; +#X connect 57 0 56 0; +#X connect 60 0 58 0; +#X connect 60 1 59 0; +#X connect 61 0 60 0; +#X connect 64 0 65 0; +#X connect 65 0 62 0; +#X connect 65 1 63 0; #X restore 125 466 pd string-functions; #X restore 505 547 pd All_functions \; and operators; #N canvas 327 86 952 778 [expr] 0; @@ -881,41 +870,40 @@ #X connect 53 0 51 0; #X restore 226 500 pd [expr] Examples; #N canvas 354 38 837 696 [expr~] 0; -#X floatatom 50 361 5 0 0 0 - - - 0; -#X obj 50 468 dac~; -#X text 95 361 frequency; +#X floatatom 50 374 5 0 0 0 - - - 0; +#X obj 50 481 dac~; +#X text 95 374 frequency; #X floatatom 743 257 7 0 10 0 - - - 0; #X obj 536 328 tabsend~ a1; #X obj 546 458 tabsend~ a2; #X obj 711 454 tabsend~ a3; -#X obj 50 388 osc~ 440; -#X floatatom 250 347 8 0 0 0 - - - 0; -#X text 314 347 amplitude; -#X obj 250 399 line~; -#X obj 50 429 expr~ $v1 * pow($v2 / 127 \, 4); +#X obj 50 401 osc~ 440; +#X floatatom 250 360 8 0 0 0 - - - 0; +#X text 314 360 amplitude; +#X obj 250 412 line~; +#X obj 50 442 expr~ $v1 * pow($v2 / 127 \, 4); #X obj 546 408 expr~ $v1 * $v2 \; if ($v2 > 0 \, 0 \, $v1*$v2); #X obj 546 375 osc~ 440; #X obj 536 251 osc~ 440; #X obj 536 289 expr~ max(min($v1 \, $f2) \, -$f2); #X text 518 186 Move the slider to change the limiter threshold (from 0-1)., f 29; -#X obj 147 299 print~; -#X floatatom 249 209 5 0 0 0 - - - 0; -#X floatatom 147 184 6 0 0 0 - - - 0; -#X obj 147 211 sig~ 1; +#X obj 142 323 print~; +#X floatatom 244 233 5 0 0 0 - - - 0; +#X floatatom 142 208 6 0 0 0 - - - 0; +#X obj 142 235 sig~ 1; #X obj 711 375 osc~ 550; #X text 516 162 A simple limiter/clip example:; -#X text 52 218 Examples:; +#X text 47 242 Examples:; #X text 468 21 NOTE: The vector/block size can be set with the [block~] or [switch~] objects \, and is 64 samples by default., f 49; -#X msg 250 373 \$1 20; +#X msg 250 386 \$1 20; #X obj 561 79 block~ 64; #X text 486 79 see also:; -#X obj 147 239 expr~ $v1 + $v2; -#X text 22 105 Besides '$f#' \, '$i#' and '$s#' \, [expr~] takes '$v#' variables. Note that the first inlet of [expr~] needs to be of type '$v1'. You can still send floats to this left inlet as floats sent to audio inlets are promoted to signals., f 54; +#X obj 142 263 expr~ $v1 + $v2; #X msg 290 55 \; pd dsp \$1; #X text 359 404 a semicolon also creates more expressions and outlets (up to 100), f 24; #X text 58 33 make sure to turn on the audio for the [expr~] examples ----->, f 31; -#X obj 165 270 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X obj 253 318 hsl 162 19 0 1 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; +#X obj 160 294 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 253 331 hsl 162 19 0 1 0 0 empty empty empty -2 -10 0 12 #dfdfdf #000000 #000000 0 1; #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; @@ -934,6 +922,7 @@ #X array a3 64 float 0; #X coords 0 1 63 -1 200 140 1; #X restore 540 528 graph; +#X text 16 105 Besides '$f#' \, '$i#' and '$s#' \, [expr~] takes '$v#' variables. Note that the first inlet of [expr~] needs to be of type '$v1'. The reasoning is that you must at least one signal input to justify using [expr~] \, so let it be the first one. You can still send floats to this left inlet as floats sent to audio inlets are promoted to signals., f 64; #X connect 0 0 7 0; #X connect 3 0 15 1; #X connect 7 0 11 0; @@ -952,10 +941,10 @@ #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 connect 32 0 17 0; +#X connect 33 0 8 0; +#X connect 34 0 3 0; +#X connect 35 0 29 0; #X restore 219 528 pd [expr~] Examples; #N canvas 222 38 1094 690 [fexpr~] 0; #X text 90 365 - $x1: same as $x1[0] \, $x2: same as $x2[0] (and so on)., f 60; diff --git a/doc/5.reference/file-help.pd b/doc/5.reference/file-help.pd index 1ea42b39..832f8fca 100644 --- a/doc/5.reference/file-help.pd +++ b/doc/5.reference/file-help.pd @@ -335,7 +335,7 @@ #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 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 search 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 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; diff --git a/doc/5.reference/gui-boxes-help.pd b/doc/5.reference/gui-boxes-help.pd index dc58f559..605e3ac9 100644 --- a/doc/5.reference/gui-boxes-help.pd +++ b/doc/5.reference/gui-boxes-help.pd @@ -27,7 +27,7 @@ #X text 240 272 <-- width of 7; #X text 299 506 <-- click; #X msg 197 170 0.99999; -#X text 42 15 The width is 5 characters by default. If the number has more characters \, the box shows ">" as the last character to indicated it didn't fit. Note that floating point numbers get tuncated without indication \, unless it contains scientific notation., f 59; +#X text 42 15 The width is 5 characters by default. If the number has more characters \, the box shows ">" as the last character to indicated it didn't fit. Note that floating point numbers get truncated without indication \, unless it contains scientific notation., f 59; #X msg 205 201 -1.2345e+12; #X connect 1 0 8 0; #X connect 3 0 2 0; diff --git a/doc/5.reference/osc-format-parse-help.pd b/doc/5.reference/osc-format-parse-help.pd index 9d2a39ee..aa28402a 100644 --- a/doc/5.reference/osc-format-parse-help.pd +++ b/doc/5.reference/osc-format-parse-help.pd @@ -82,7 +82,7 @@ #X msg 99 114 set 1; #X msg 60 45 4 5 horse 6; #X listbox 332 319 12 0 0 0 - - - 0; -#X text 230 34 [oscparse] outputs addresses as symbols even if they look like floats. Nonetheless \, you probably want them to be interpeted as floats \, but you need to use the '-n' flag for that. This way you can also use [route] to route the message according to the float address., f 51; +#X text 230 34 [oscparse] outputs addresses as symbols even if they look like floats. Nonetheless \, you probably want them to be interpreted as floats \, but you need to use the '-n' flag for that. This way you can also use [route] to route the message according to the float address., f 51; #X floatatom 429 198 3 0 0 0 - - - 0; #X connect 0 0 6 0; #X connect 1 0 2 0; diff --git a/doc/5.reference/osc~-help.pd b/doc/5.reference/osc~-help.pd index 84d9a074..cd7b581d 100644 --- a/doc/5.reference/osc~-help.pd +++ b/doc/5.reference/osc~-help.pd @@ -43,7 +43,7 @@ #X coords 0 1 440 -1 200 100 1 0 0; #X restore 338 217 graph; #N canvas 572 114 468 431 compatibility 0; -#X text 38 22 Up to version 0.54 \, [osc~] relied on a 512-point cosine table \, which was adequate for most "computer music" applications in the 90s with a signal-to-noise ratio of about 110 dB. The default table size is now increased to 2048 points \, improving signal-to-noise by an additional 36 dB. To get the original 512-point tables you can run Pd with compatiblity level set to 0.54., f 56; +#X text 38 22 Up to version 0.54 \, [osc~] relied on a 512-point cosine table \, which was adequate for most "computer music" applications in the 90s with a signal-to-noise ratio of about 110 dB. The default table size is now increased to 2048 points \, improving signal-to-noise by an additional 36 dB. To get the original 512-point tables you can run Pd with compatibility level set to 0.54., f 56; #X msg 61 177 \; pd compatibility 0.54; #X msg 257 177 \; pd compatibility 0.55; #X obj 181 265 osc~ 440; diff --git a/doc/5.reference/pd-messages.pd b/doc/5.reference/pd-messages.pd index d182b877..30cf6774 100644 --- a/doc/5.reference/pd-messages.pd +++ b/doc/5.reference/pd-messages.pd @@ -303,7 +303,7 @@ #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 text 91 24 A 'vis 1' message shows the window while 'vis 0' hides it (so it doesn'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; diff --git a/doc/5.reference/route-help.pd b/doc/5.reference/route-help.pd index 5864fcef..bd42d81d 100644 --- a/doc/5.reference/route-help.pd +++ b/doc/5.reference/route-help.pd @@ -200,7 +200,7 @@ #X text 17 56 The [route] object checks a message's first element against its arguments \, which may be numbers or symbols (but not a mixture of the two). If a match is found \, the rest of the message appears on the corresponding outlet. If there's no match \, the message is repeated to the last "rejection" outlet. The number of outlets is the number of arguments plus one., f 74; #X msg 663 166 1; #X msg 671 192 4; -#X text 559 426 There are ecxeptions though when we're dealing with special selectors that Pd deals with \, namely: list \, float \, symbol and bang. One byproduct of [route] is that it can also be used to route messages according to these types. Open the subpatch below for details, f 62; +#X text 559 426 There are exceptions though when we're dealing with special selectors that Pd deals with \, namely: list \, float \, symbol and bang. One byproduct of [route] is that it can also be used to route messages according to these types. Open the subpatch below for details, f 62; #X connect 3 0 37 0; #X connect 3 1 38 0; #X connect 3 2 39 0; diff --git a/doc/5.reference/savepanel-help.pd b/doc/5.reference/savepanel-help.pd index 3c6b2a92..86b4ac6f 100644 --- a/doc/5.reference/savepanel-help.pd +++ b/doc/5.reference/savepanel-help.pd @@ -30,7 +30,7 @@ #X text 395 399 updated for Pd version 0.55-0; #X msg 95 223 symbol ~; #X text 170 224 Start in home directory; -#X text 89 126 Open "save as" dialog in currnt patch's directory; +#X text 89 126 Open "save as" dialog in current patch's directory; #X text 50 63 When [savepanel] gets a "bang" a "Save As" file browser appears on the screen. You then to specify a filename \, and a symbol with the full patch is sent to the outlet., f 73; #X text 144 325 You can use this object for setting a filename to objects like [soundfiler] \, [writesf~] and others.; #X obj 165 399 writesf~; diff --git a/doc/5.reference/soundfiler-help.pd b/doc/5.reference/soundfiler-help.pd index 8762a716..0bc6aee8 100644 --- a/doc/5.reference/soundfiler-help.pd +++ b/doc/5.reference/soundfiler-help.pd @@ -146,7 +146,7 @@ #X text 27 83 -maxsize (maximum number of samples to resize to *), f 73; #X text 27 66 -resize (resizes arrays to the size of the sound file *), f 73; #X text 1043 131 read overriding the file's header, f 17; -#X text 17 288 * When loading a file \, [soundfiler] populates the array until reaching its size. If the sound file is smaller \, the remaining points are zeroed out. The -resize flag resizes the array to the sample size \, while the -maxsize flag sets a maximum size to clip to even if used in conjunction with the '-resize' flag (also \, errors are given to warn you about the truncation). The -maxsize was needed for historical reasons when its default value used to be rather small (4 million). The default now is much bigger \, hence \, this flag can just be ingored., f 78; +#X text 17 288 * When loading a file \, [soundfiler] populates the array until reaching its size. If the sound file is smaller \, the remaining points are zeroed out. The -resize flag resizes the array to the sample size \, while the -maxsize flag sets a maximum size to clip to even if used in conjunction with the '-resize' flag (also \, errors are given to warn you about the truncation). The -maxsize was needed for historical reasons when its default value used to be rather small (4 million). The default now is much bigger \, hence \, this flag can just be ignored., f 78; #X text 18 485 -nframes (maximum points to write \, default from skip point to end of array), f 83; #X text 18 503 -bytes (bytes per sample: 2 \, 3 \, 4 \, or 8 default: 2); #X connect 0 0 11 0; diff --git a/doc/5.reference/tabwrite-help.pd b/doc/5.reference/tabwrite-help.pd index 449ff388..c02b3456 100644 --- a/doc/5.reference/tabwrite-help.pd +++ b/doc/5.reference/tabwrite-help.pd @@ -91,7 +91,7 @@ #X coords 0 10 10 0 250 200 1 0 0; #X restore 373 137 graph; #X msg 65 231 5 2; -#X text 99 225 A list inut spread values into inlets as usual in Pd, f 30; +#X text 99 225 A list input spread values into inlets as usual in Pd, f 30; #X connect 1 0 14 0; #X connect 2 0 14 1; #X connect 15 0 14 0; diff --git a/doc/5.reference/text-object-help.pd b/doc/5.reference/text-object-help.pd index 107ba8ff..67ae217b 100644 --- a/doc/5.reference/text-object-help.pd +++ b/doc/5.reference/text-object-help.pd @@ -497,7 +497,7 @@ #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 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 \, which 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; diff --git a/doc/5.reference/vcf~-help.pd b/doc/5.reference/vcf~-help.pd index 38e25b27..40662e6c 100644 --- a/doc/5.reference/vcf~-help.pd +++ b/doc/5.reference/vcf~-help.pd @@ -63,7 +63,7 @@ #X msg 243 156 \; pd compatibility 0.55; #X text 59 132 (old table size); #X text 259 132 (new table size); -#X text 29 31 Up to version 0.54 \, [vcf~] relied on a 512-point cosine table. The default table size is now increased to 2048 points \, which improves th filter's frequency resolution. To get the original 512-point tables you can run Pd with compatiblity level set to 0.54., f 56; +#X text 29 31 Up to version 0.54 \, [vcf~] relied on a 512-point cosine table. The default table size is now increased to 2048 points \, which improves th filter's frequency resolution. To get the original 512-point tables you can run Pd with compatibility level set to 0.54., f 56; #X restore 483 306 pd compatibility; #X text 489 268 compatibility note (open):, f 13; #X connect 0 0 30 0; From 5fa3f638e421da05495212e8eb98d67d1cd88e38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Fri, 23 Aug 2024 10:18:58 +0200 Subject: [PATCH 60/89] expr: MSVC compat for snprintf/strcasecmp/strcasecmp Closes: https://github.com/pure-data/pure-data/issues/2406 --- src/x_vexp.h | 2 ++ src/x_vexp_fun.c | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/src/x_vexp.h b/src/x_vexp.h index cb84d8a7..5e5c6c74 100644 --- a/src/x_vexp.h +++ b/src/x_vexp.h @@ -12,6 +12,8 @@ #ifdef PD #include "m_pd.h" +#include "s_stuff.h" +#define snprintf pd_snprintf #else /* MSP */ #include "ext.h" #include "z_dsp.h" diff --git a/src/x_vexp_fun.c b/src/x_vexp_fun.c index 1aa6565e..9c493f9e 100644 --- a/src/x_vexp_fun.c +++ b/src/x_vexp_fun.c @@ -83,6 +83,15 @@ #include "x_vexp.h" +#ifdef _MSC_VER +# ifndef snprintf +/* For Pd, we already redefined snprintf() to pd_snprintf() */ +# define snprintf _snprintf +# endif +# define strcasecmp _stricmp +# define strncasecmp _strnicmp +#endif + struct ex_ex *ex_eval(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int i); From 284bec32f27eb308335b15089e02633c73dd03fa Mon Sep 17 00:00:00 2001 From: porres Date: Sat, 24 Aug 2024 11:07:29 -0300 Subject: [PATCH 61/89] improve expr help a bit more closes https://github.com/pure-data/pddp/issues/247 --- doc/5.reference/expr-help.pd | 135 ++++++++++++++++++----------------- 1 file changed, 68 insertions(+), 67 deletions(-) diff --git a/doc/5.reference/expr-help.pd b/doc/5.reference/expr-help.pd index a8fd83e4..3ff83021 100644 --- a/doc/5.reference/expr-help.pd +++ b/doc/5.reference/expr-help.pd @@ -198,7 +198,7 @@ #X connect 7 0 1 0; #X connect 8 0 4 0; #X restore 125 286 pd Random-function; -#N canvas 454 149 604 538 Table-functions 1; +#N canvas 454 149 604 538 Table-functions 0; #X floatatom 63 163 0 0 0 0 - - - 0; #X floatatom 145 164 8 0 0 0 - - - 0; #X floatatom 228 164 4 0 0 0 - - - 0; @@ -644,97 +644,98 @@ #X connect 22 0 25 0; #X connect 25 0 23 0; #X restore 125 166 pd Relational-operators; -#N canvas 236 61 916 690 string-functions 0; +#N canvas 236 61 926 686 string-functions 0; #X obj 312 90 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X obj 620 94 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 637 94 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X obj 49 114 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X obj 312 121 expr symbol(4.52); -#X symbolatom 620 154 10 0 0 0 - - - 0; +#X symbolatom 637 154 10 0 0 0 - - - 0; #X symbolatom 312 145 10 0 0 0 - - - 0; #X symbolatom 49 170 13 0 0 0 - - - 0; -#X floatatom 386 445 5 0 0 0 - - - 0; -#X symbolatom 48 442 15 0 0 0 - - - 0; -#X floatatom 621 483 4 0 0 0 - - - 0; +#X floatatom 386 446 5 0 0 0 - - - 0; +#X symbolatom 48 443 15 0 0 0 - - - 0; +#X floatatom 638 483 4 0 0 0 - - - 0; #X symbolatom 379 617 10 0 0 0 - - - 0; #X obj 379 587 expr strpbrk("hello" \, "lx"); #X floatatom 66 632 5 0 0 0 - - - 0; -#X obj 620 119 expr symboln(4.52 \, 6 \, 3); -#X text 617 70 symboln(flt \, length \, decimal length); -#X symbolatom 621 267 10 0 0 0 - - - 0; -#X text 618 190 symboln(sym \, length \, sym trim length); -#X obj 621 243 expr symboln("hello" \, 5 \, 3); -#X symbolatom 176 481 20 0 0 0 - - - 0; -#X text 649 219 for symbols; +#X obj 637 119 expr symboln(4.52 \, 6 \, 3); +#X text 634 70 symboln(flt \, length \, decimal length); +#X symbolatom 638 267 10 0 0 0 - - - 0; +#X text 635 190 symboln(sym \, length \, sym trim length); +#X obj 638 243 expr symboln("hello" \, 5 \, 3); +#X symbolatom 176 482 20 0 0 0 - - - 0; +#X text 666 219 for symbols; #X obj 200 114 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X symbolatom 200 170 10 0 0 0 - - - 0; #X obj 200 142 expr "\$0-x"; #X text 345 83 turn a float into a symbol, f 13; #X text 69 67 A string in quotes is output as a symbol., f 21; -#X text 89 210 turn upper case to lower case; -#X obj 621 218 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X obj 48 348 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 85 217 turn upper case to lower case; +#X obj 638 218 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 48 349 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X obj 379 548 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X text 74 349 concatenate strings; +#X text 74 350 concatenate strings; #X obj 456 96 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X symbolatom 456 146 10 0 0 0 - - - 0; #X obj 456 121 expr sym(\$0); #X text 485 98 abbreviation; -#X symbolatom 621 372 10 0 0 0 - - - 0; -#X text 752 325 functions to compare strings, f 15; -#X floatatom 502 443 5 0 0 0 - - - 0; +#X symbolatom 638 372 10 0 0 0 - - - 0; +#X text 769 325 functions to compare strings, f 15; +#X floatatom 502 444 5 0 0 0 - - - 0; #X text 179 538 Get span until character in string, f 19; #X msg 66 531 symbol hello; #X msg 84 558 symbol bang; #X text 404 538 return string from found character, f 18; #X floatatom 231 632 5 0 0 0 - - - 0; #X obj 66 586 expr strcspn($s1 \, "lg") \; strspn($s1 \, "heban"); -#X text 646 93 for floats; +#X text 663 93 for floats; #X text 171 14 String Functions: for more info see the HTML reference (or C language manuals), f 79; #X obj 49 142 expr "hello world"; -#X msg 621 316 symbol hello; -#X msg 635 342 symbol HEWORLD; -#X floatatom 672 483 4 0 0 0 - - - 0; -#X floatatom 724 483 4 0 0 0 - - - 0; -#X floatatom 776 483 4 0 0 0 - - - 0; -#X floatatom 828 483 4 0 0 0 - - - 0; -#X obj 621 397 expr strcmp($s1 \, "hello") \; strcmp($s1 \, "HELLO") \; strcasecmp($s1 \, "HELLO") \; strncmp($s1 \, "heWorld" \, 2) \; strncasecmp($s1 \, "HEWORLD" \, 2); +#X msg 638 316 symbol hello; +#X msg 652 342 symbol HEWORLD; +#X floatatom 689 483 4 0 0 0 - - - 0; +#X floatatom 741 483 4 0 0 0 - - - 0; +#X floatatom 793 483 4 0 0 0 - - - 0; +#X floatatom 845 483 4 0 0 0 - - - 0; +#X obj 638 397 expr strcmp($s1 \, "hello") \; strcmp($s1 \, "HELLO") \; strcasecmp($s1 \, "HELLO") \; strncmp($s1 \, "heWorld" \, 2) \; strncasecmp($s1 \, "HEWORLD" \, 2); #X text 249 37 Note that functions that ouput symbols only work in [expr]; -#X symbolatom 223 445 15 0 0 0 - - - 0; -#X obj 48 377 expr strcat("hello " \, "world") \; strcat ("hello " \, "world " \, "again") \; strncat("hello " \, "world" \, 2); -#X obj 386 403 expr strlen($s2) \; strlen("hello"); -#X symbolatom 386 376 10 0 0 0 - - - 0; -#X floatatom 67 285 5 0 0 0 - - - 0; -#X floatatom 218 285 5 0 0 0 - - - 0; -#X obj 67 240 expr tolower("HELLO") \; tonlower("HELLO" \, 2); -#X obj 67 211 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X floatatom 334 285 5 0 0 0 - - - 0; -#X floatatom 485 285 5 0 0 0 - - - 0; -#X obj 334 211 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X obj 334 240 expr toupper("hello") \; tonupper("hello" \, 2); -#X text 356 210 turn lower case to upper case; -#X text 385 352 string length; -#X text 463 375 (type); -#N canvas 156 126 540 373 example 0; -#X floatatom 41 304 5 0 0 0 - - - 0; -#X msg 297 188 symbol expr1_; -#X msg 314 215 symbol expr2_; -#X obj 41 217 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X text 66 216 checking for null symbol input; -#X text 225 143 First bang the [expr] \, then click one of the below \, then bang [expr] again, f 34; -#X obj 282 41 array define expr0_\$0 100; -#X obj 282 64 array define expr1_\$0 50; -#X obj 282 86 array define expr2_\$0 200; -#X msg 324 252 symbol; -#X text 377 252 null symbol; -#X obj 41 251 expr size(strcat(if(!strcmp($s2 \, "") \, "expr0_" \, $s2) \, sym(\$0))), f 37; -#X text 238 17 define arrays of different sizes; -#X text 62 64 Here's a bit more complicated ecample, f 20; +#X symbolatom 223 446 15 0 0 0 - - - 0; +#X obj 48 378 expr strcat("hello " \, "world") \; strcat ("hello " \, "world " \, "again") \; strncat("hello " \, "world" \, 2); +#X obj 386 404 expr strlen($s2) \; strlen("hello"); +#X symbolatom 386 377 10 0 0 0 - - - 0; +#X obj 63 247 expr tolower("HELLO") \; tonlower("HELLO" \, 2); +#X obj 63 218 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 344 218 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 344 247 expr toupper("hello") \; tonupper("hello" \, 2); +#X text 366 217 turn lower case to upper case; +#X text 385 353 string length; +#X text 463 376 (type); +#N canvas 732 357 561 376 example 0; +#X floatatom 86 314 5 0 0 0 - - - 0; +#X msg 342 198 symbol expr1_; +#X msg 359 225 symbol expr2_; +#X obj 86 227 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X text 111 226 checking for null symbol input; +#X text 270 153 First bang the [expr] \, then click one of the below \, then bang [expr] again, f 34; +#X obj 318 41 array define expr0_\$0 100; +#X obj 318 64 array define expr1_\$0 50; +#X obj 318 86 array define expr2_\$0 200; +#X msg 369 262 symbol; +#X text 422 262 null symbol; +#X obj 86 261 expr size(strcat(if(!strcmp($s2 \, "") \, "expr0_" \, $s2) \, sym(\$0))), f 37; +#X text 274 17 define arrays of different sizes; +#X text 56 49 Get the size of an array by setting the name with a message and concatenating with the "\$0" symbol. If no symbol is given \, defaults to "expr0_\$0"., f 27; #X connect 1 0 11 1; #X connect 2 0 11 1; #X connect 3 0 11 0; #X connect 9 0 11 1; #X connect 11 0 0 0; -#X restore 718 580 pd example; +#X restore 722 608 pd example; +#X symbolatom 63 292 15 0 0 0 - - - 0; +#X symbolatom 214 292 15 0 0 0 - - - 0; +#X symbolatom 344 292 15 0 0 0 - - - 0; +#X symbolatom 495 292 15 0 0 0 - - - 0; +#X text 683 562 Here's a bit more complicated ecample, f 20; #X connect 0 0 3 0; #X connect 1 0 13 0; #X connect 2 0 45 0; @@ -768,12 +769,12 @@ #X connect 56 0 7 0; #X connect 56 1 36 0; #X connect 57 0 56 0; -#X connect 60 0 58 0; -#X connect 60 1 59 0; -#X connect 61 0 60 0; -#X connect 64 0 65 0; -#X connect 65 0 62 0; -#X connect 65 1 63 0; +#X connect 58 0 66 0; +#X connect 58 1 67 0; +#X connect 59 0 58 0; +#X connect 60 0 61 0; +#X connect 61 0 68 0; +#X connect 61 1 69 0; #X restore 125 466 pd string-functions; #X restore 505 547 pd All_functions \; and operators; #N canvas 327 86 952 778 [expr] 0; @@ -1287,9 +1288,9 @@ #X text 398 607 - other binary operators (control only); #X text 396 634 - trigonometric functions (control only); #X text 26 3 Expression evaluation family of objects By Shahrokh Yadegari - Version 0.58, f 75; -#X text 601 663 updated for Pd version 0.55-1, f 14; #X obj 22 667 makefilename; #X text 43 151 These objects have several built in operators and functions and the syntax is quite similar to how expressions are written in C. They receive input variables via the inlets and understand the variable types: '$f#' (floats) \, '$i#' (integers) and '$s#' (symbols) - '#' is the inlet number (up to 100) as below:, f 94; +#X text 601 663 Updated for Pd version 0.55-1, f 14; #X connect 16 0 15 2; #X connect 17 0 15 1; #X connect 18 0 15 0; From f8a791dc695abd9b6442b1f91e9d0027f2981eb3 Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Wed, 28 Aug 2024 15:09:57 +0200 Subject: [PATCH 62/89] fix PD_BADFLOAT to return zero if argument is either 0 or "-0". --- src/m_pd.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/m_pd.h b/src/m_pd.h index 55586f27..b36b800d 100644 --- a/src/m_pd.h +++ b/src/m_pd.h @@ -893,7 +893,7 @@ PD_INLINE int PD_BADFLOAT(t_float f) /* malformed float */ t_bigorsmall32 pun; pun.f = f; pun.ui &= 0x7f800000; - return((pun.ui == 0) | (pun.ui == 0x7f800000)); + return((f != 0) && ((pun.ui == 0) | (pun.ui == 0x7f800000))); } PD_INLINE int PD_BIGORSMALL(t_float f) /* exponent outside (-64,64) */ From 12203aef6e34f21e540cffc46c1a06fece8639a0 Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Wed, 28 Aug 2024 15:52:20 +0200 Subject: [PATCH 63/89] oops, also fix PD_BADFLOAT for 64-bit compiles --- src/m_pd.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/m_pd.h b/src/m_pd.h index b36b800d..a6e73e17 100644 --- a/src/m_pd.h +++ b/src/m_pd.h @@ -916,7 +916,7 @@ PD_INLINE int PD_BADFLOAT(t_float f) /* malformed double */ t_bigorsmall64 pun; pun.f = f; pun.ui[1] &= 0x7ff00000; - return((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000)); + return((f != 0) && ((pun.ui[1] == 0) | (pun.ui[1] == 0x7ff00000))); } PD_INLINE int PD_BIGORSMALL(t_float f) /* exponent outside (-512,512) */ From 2064082f865f54bd6046aa2001743c820da25d73 Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Wed, 28 Aug 2024 16:20:22 +0200 Subject: [PATCH 64/89] workaround to prevent non-main threads from sending stuff to the GUI. This avoids a possible crash when readsf~ tries to make "verbose" output to show where it looks for soundfiles. Unfortunately this prevents the user from seeing how it searches. As a temporary fix, readsf~ could do the search twice, once on the main thread to show the verbose printout (of verbose is set) and one as it is now in the sub-thread. At least the user should get some feedback as to why there's no printout...? --- src/s_inter.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/s_inter.c b/src/s_inter.c index 65419833..74375afa 100644 --- a/src/s_inter.c +++ b/src/s_inter.c @@ -135,6 +135,9 @@ struct _instanceinter t_guiqueue *i_guiqueuehead; t_binbuf *i_inbinbuf; char *i_guibuf; +#if PDTHREADS + pthread_t i_thread; /* thread this instance was created for */ +#endif int i_guihead; int i_guitail; int i_guisize; @@ -801,7 +804,11 @@ int sys_havegui(void) int sys_havetkproc(void) { - return (INTER->i_havetkproc); + return ( +#if PDTHREADS + (INTER->i_thread == pthread_self()) && +#endif + INTER->i_havetkproc); } void sys_vgui(const char *fmt, ...) @@ -1872,6 +1879,7 @@ void s_inter_newpdinstance(void) #if PDTHREADS pthread_mutex_init(&INTER->i_mutex, NULL); pd_this->pd_islocked = 0; + INTER->i_thread = pthread_self(); #endif #ifdef _WIN32 INTER->i_freq = 0; From 699070dd247a5dffa8d13c2cc87d36a4e34d6eb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Wed, 28 Aug 2024 18:46:51 +0200 Subject: [PATCH 65/89] slight reordering of translatables --- po/az.po | 10 +++++----- po/bg.po | 10 +++++----- po/de.po | 8 ++++---- po/el.po | 8 ++++---- po/en.po | 8 ++++---- po/en_ca.po | 8 ++++---- po/eo.po | 6 +++--- po/es.po | 8 ++++---- po/eu.po | 10 +++++----- po/fr.po | 8 ++++---- po/gu.po | 10 +++++----- po/he.po | 8 ++++---- po/hi.po | 10 +++++----- po/hu.po | 8 ++++---- po/id.po | 8 ++++---- po/it.po | 8 ++++---- po/ja.po | 23 +++++++++++------------ po/ko.po | 8 ++++---- po/nl.po | 8 ++++---- po/pa.po | 10 +++++----- po/pl.po | 8 ++++---- po/pt_br.po | 8 ++++---- po/pt_pt.po | 8 ++++---- po/ru.po | 8 ++++---- po/sq.po | 10 +++++----- po/sv.po | 8 ++++---- po/template.pot | 8 ++++---- po/uk.po | 8 ++++---- po/vi.po | 10 +++++----- po/zh_tw.po | 8 ++++---- 30 files changed, 134 insertions(+), 135 deletions(-) diff --git a/po/az.po b/po/az.po index bbc768cf..f650a13b 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: 2024-07-08 15:19+0200\n" +"POT-Creation-Date: 2024-08-28 18:42+0200\n" "PO-Revision-Date: 2004-03-12 22:22+0200\n" "Last-Translator: Metin Amiroff \n" "Language-Team: Azerbaijani \n" @@ -1842,6 +1842,10 @@ msgstr "" msgid "(default language: %s)" msgstr "" +#, fuzzy +msgid "Print..." +msgstr "_Yüklə..." + #, tcl-format msgid "ignoring '%s': doesn't exist" msgstr "" @@ -1861,10 +1865,6 @@ msgstr "Qeyd Et" msgid "Save As..." msgstr "Fərqli Qeyd Et" -#, fuzzy -msgid "Print..." -msgstr "_Yüklə..." - msgid "Paste Replace" msgstr "" diff --git a/po/bg.po b/po/bg.po index 30b8b92a..76c73894 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: 2024-07-08 15:19+0200\n" +"POT-Creation-Date: 2024-08-28 18:42+0200\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" @@ -1777,6 +1777,9 @@ msgstr "" msgid "(default language: %s)" msgstr "" +msgid "Print..." +msgstr "" + #, tcl-format msgid "ignoring '%s': doesn't exist" msgstr "" @@ -1794,9 +1797,6 @@ msgstr "" msgid "Save As..." msgstr "" -msgid "Print..." -msgstr "" - msgid "Paste Replace" msgstr "" diff --git a/po/uk.po b/po/uk.po index 9e3e2f75..0b974ac0 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: 2024-07-08 15:19+0200\n" +"POT-Creation-Date: 2024-08-28 18:42+0200\n" "PO-Revision-Date: 2024-07-08 17:41+0200\n" "Last-Translator: umläute \n" "Language-Team: Ukrainian \n" "Language-Team: Vietnamese \n" "Language-Team: Chinese (Traditional) Date: Wed, 28 Aug 2024 18:56:06 +0200 Subject: [PATCH 66/89] unify spelling of translatables for esperanto --- po/eo.po | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/po/eo.po b/po/eo.po index bccca125..e50ebf3d 100644 --- a/po/eo.po +++ b/po/eo.po @@ -214,7 +214,7 @@ msgstr "Eligaj aparatoj" msgid "Use Multiple Devices" msgstr "Uzi plurajn aparatojn" -msgid "audio system" +msgid "Audio System" msgstr "sonsistemo" msgid "Settings" @@ -564,25 +564,25 @@ msgstr "" msgid "Edit existing path [%s]" msgstr "" -msgid "Patch windows" +msgid "Patch Windows" msgstr "Fliki fenestrojn" msgid "Zoom New Windows" msgstr "Zomi novajn fenestrojn" -msgid "GUI settings" +msgid "GUI Settings" msgstr "Agordoj pri grafika fasado" -msgid "preference layout (reopen the preferences to see the effect)" +msgid "Preference layout (reopen the preferences to see the effect)" msgstr "" -msgid "use tabs" +msgid "Use tabs" msgstr "uzi langetojn" -msgid "single page" +msgid "Single page" msgstr "unu paĝo" -msgid "patching helpers" +msgid "Patching helpers" msgstr "" msgid "Highlight active cord while connecting" @@ -618,7 +618,7 @@ msgstr "" msgid "Pd libraries to load on startup" msgstr "" -msgid "GUI options" +msgid "GUI Options" msgstr "Opcioj pri grafika fasado" msgid "language" @@ -642,13 +642,13 @@ msgstr "glitkoma grando" msgid "Numeric precision of Pd-core" msgstr "Nombra precizo de Pd-core" -msgid "Startup options" +msgid "Startup Options" msgstr "" msgid "Defeat real-time scheduling" msgstr "" -msgid "Startup flags:" +msgid "Startup Flags:" msgstr "" msgid "Help Browser" From e4c40f0df8765f27438a1b0e9adac1bacd34cc22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Wed, 28 Aug 2024 18:57:33 +0200 Subject: [PATCH 67/89] Fix capitalization and dump apparently wrong esperanto fuzzy-translations --- po/eo.po | 42 ++++++++++++++++-------------------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/po/eo.po b/po/eo.po index e50ebf3d..2edbc91c 100644 --- a/po/eo.po +++ b/po/eo.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Pure Data 0.54.1\n" "Report-Msgid-Bugs-To: pd-dev@iem.at\n" -"POT-Creation-Date: 2024-07-08 15:19+0200\n" -"PO-Revision-Date: 2024-07-06 17:09+0000\n" +"POT-Creation-Date: 2024-08-28 18:42+0200\n" +"PO-Revision-Date: 2024-08-28 18:54+0200\n" "Last-Translator: phlostically \n" "Language-Team: Esperanto \n" @@ -16,7 +16,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 5.7-dev\n" +"X-Generator: Poedit 3.4.4\n" msgid "linear" msgstr "lineara" @@ -215,7 +215,7 @@ msgid "Use Multiple Devices" msgstr "Uzi plurajn aparatojn" msgid "Audio System" -msgstr "sonsistemo" +msgstr "Sonsistemo" msgid "Settings" msgstr "Agordoj" @@ -577,10 +577,10 @@ msgid "Preference layout (reopen the preferences to see the effect)" msgstr "" msgid "Use tabs" -msgstr "uzi langetojn" +msgstr "Uzi langetojn" msgid "Single page" -msgstr "unu paĝo" +msgstr "Unu paĝo" msgid "Patching helpers" msgstr "" @@ -1292,13 +1292,11 @@ msgstr "" msgid "Bosnian" msgstr "" -#, fuzzy msgid "Catalan" -msgstr "fatala" +msgstr "" -#, fuzzy msgid "Chechen" -msgstr "Kontroli" +msgstr "" msgid "Chamorro" msgstr "" @@ -1318,9 +1316,8 @@ msgstr "" msgid "Welsh" msgstr "" -#, fuzzy msgid "Danish" -msgstr "Hispana" +msgstr "" msgid "German" msgstr "Germana" @@ -1364,9 +1361,8 @@ msgstr "" msgid "Basque" msgstr "Eŭska" -#, fuzzy msgid "Persian" -msgstr "Versio" +msgstr "" msgid "Fulah" msgstr "" @@ -1464,9 +1460,8 @@ msgstr "" msgid "Japanese" msgstr "Japana" -#, fuzzy msgid "Javanese" -msgstr "Japana" +msgstr "" msgid "Georgian" msgstr "" @@ -1525,9 +1520,8 @@ msgstr "" msgid "Lingala" msgstr "" -#, fuzzy msgid "Lao" -msgstr "Protokolo" +msgstr "" msgid "Lithuanian" msgstr "" @@ -1556,9 +1550,8 @@ msgstr "" msgid "Mongolian" msgstr "" -#, fuzzy msgid "Marathi" -msgstr "Guĝarata" +msgstr "" msgid "Malay" msgstr "" @@ -1587,9 +1580,8 @@ msgstr "" msgid "Navaho" msgstr "" -#, fuzzy msgid "Nyanja" -msgstr "Panĝaba" +msgstr "" msgid "Occitan" msgstr "" @@ -1636,9 +1628,8 @@ msgstr "" msgid "Rundi" msgstr "" -#, fuzzy msgid "Romanian" -msgstr "Albana" +msgstr "" msgid "Russian" msgstr "Rusa" @@ -1649,9 +1640,8 @@ msgstr "" msgid "Sanskrit" msgstr "" -#, fuzzy msgid "Sardinian" -msgstr "Ukraina" +msgstr "" msgid "Sindhi" msgstr "" From 4c939f2f1e33f16d05269898ed8e511343a754b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Wed, 28 Aug 2024 19:15:14 +0200 Subject: [PATCH 68/89] Use pthread_equal() for comparing threads for identity MSVC otherwise FTBFS with > s_inter.c(809) : error C2088: '==' : illegal for struct Closes: https://github.com/pure-data/pure-data/issues/2411 --- src/s_inter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/s_inter.c b/src/s_inter.c index 74375afa..5dc4a63b 100644 --- a/src/s_inter.c +++ b/src/s_inter.c @@ -806,7 +806,7 @@ int sys_havetkproc(void) { return ( #if PDTHREADS - (INTER->i_thread == pthread_self()) && + pthread_equal(INTER->i_thread, pthread_self()) && #endif INTER->i_havetkproc); } From d7a87223733abce1f1a771ac9c303e7424bfa4c7 Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Thu, 29 Aug 2024 09:26:44 +0200 Subject: [PATCH 69/89] Revert "Use pthread_equal() for comparing threads for identity" This reverts commit 4c939f2f1e33f16d05269898ed8e511343a754b4. --- src/s_inter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/s_inter.c b/src/s_inter.c index 5dc4a63b..74375afa 100644 --- a/src/s_inter.c +++ b/src/s_inter.c @@ -806,7 +806,7 @@ int sys_havetkproc(void) { return ( #if PDTHREADS - pthread_equal(INTER->i_thread, pthread_self()) && + (INTER->i_thread == pthread_self()) && #endif INTER->i_havetkproc); } From fb767a57c7d57bcf7da792d142679f1258db4341 Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Thu, 29 Aug 2024 09:26:55 +0200 Subject: [PATCH 70/89] As Christof writes, we can't count on gui actions being from any pre-determined thread. Some other solution is needed. Revert "workaround to prevent non-main threads from sending stuff to the GUI. This avoids" This reverts commit 2064082f865f54bd6046aa2001743c820da25d73. --- src/s_inter.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/s_inter.c b/src/s_inter.c index 74375afa..65419833 100644 --- a/src/s_inter.c +++ b/src/s_inter.c @@ -135,9 +135,6 @@ struct _instanceinter t_guiqueue *i_guiqueuehead; t_binbuf *i_inbinbuf; char *i_guibuf; -#if PDTHREADS - pthread_t i_thread; /* thread this instance was created for */ -#endif int i_guihead; int i_guitail; int i_guisize; @@ -804,11 +801,7 @@ int sys_havegui(void) int sys_havetkproc(void) { - return ( -#if PDTHREADS - (INTER->i_thread == pthread_self()) && -#endif - INTER->i_havetkproc); + return (INTER->i_havetkproc); } void sys_vgui(const char *fmt, ...) @@ -1879,7 +1872,6 @@ void s_inter_newpdinstance(void) #if PDTHREADS pthread_mutex_init(&INTER->i_mutex, NULL); pd_this->pd_islocked = 0; - INTER->i_thread = pthread_self(); #endif #ifdef _WIN32 INTER->i_freq = 0; From 95f63eb29fccd81ec188c1a0f2701a7898270939 Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Thu, 29 Aug 2024 16:09:45 +0200 Subject: [PATCH 71/89] Another try at making path searches thread-safe in readsf~. Debugging "verbose" printout is supplied by doing a fake search in main thread; the search path is copied down to the worker thread so that it doesn't access any variables not protected by readsf~'s own mutex. --- src/d_soundfile.c | 39 ++++++++++++++++++++++++++------------- src/g_canvas.c | 4 ++-- src/s_loader.c | 12 ++++++------ src/s_path.c | 42 ++++++++++++++++++++++++------------------ src/s_stuff.h | 8 ++++++-- 5 files changed, 64 insertions(+), 41 deletions(-) diff --git a/src/d_soundfile.c b/src/d_soundfile.c index 0eb8899b..2ba967c9 100644 --- a/src/d_soundfile.c +++ b/src/d_soundfile.c @@ -12,6 +12,8 @@ thread so that they can be used in real time. The readsf~ and writesf~ objects use Posix-like threads. */ #include "d_soundfile.h" +#include "g_canvas.h" +#include "s_stuff.h" #ifdef _WIN32 #include #endif @@ -405,26 +407,23 @@ int open_soundfile_via_fd(int fd, t_soundfile *sf, size_t skipframes) return -1; } - /** open a soundfile, using open_via_path(). This is used by readsf~ in - a not-perfectly-threadsafe way. LATER replace with a thread-hardened - version of open_soundfile_via_canvas(). - returns number of frames in the soundfile */ -int open_soundfile_via_path(const char *dirname, const char *filename, - t_soundfile *sf, size_t skipframes) + /* open a soundfile, using supplied path. Returns a file descriptor + or -1 on error. */ +int open_soundfile_via_namelist(const char *dirname, const char *filename, + t_namelist *nl, t_soundfile *sf, size_t skipframes) { char buf[MAXPDSTRING], *dummy; int fd, sf_fd; - fd = open_via_path(dirname, filename, "", buf, &dummy, MAXPDSTRING, 1); + fd = do_open_via_path(dirname, filename, "", buf, &dummy, MAXPDSTRING, + 1, nl, 0); if (fd < 0) return -1; sf_fd = open_soundfile_via_fd(fd, sf, skipframes); return sf_fd; } - /** open a soundfile, using open_via_canvas(). This is used by readsf~ in - a not-perfectly-threadsafe way. LATER replace with a thread-hardened - version of open_soundfile_via_canvas(). - returns number of frames in the soundfile */ + /* open a soundfile, using open_via_canvas(). Returns a file descriptor + or -1 on error. */ int open_soundfile_via_canvas(t_canvas *canvas, const char *filename, t_soundfile *sf, size_t skipframes) { @@ -1752,7 +1751,7 @@ typedef struct _readsf t_float x_insamplerate; /**< input signal sample rate, if known */ /* parameters to communicate with subthread */ t_soundfile_request x_requestcode; /**< pending request to I/O thread */ - const char *x_filename; /**< file to open (string permanently allocated) */ + const char *x_filename; /**< file to open (permanently allocated) */ int x_fileerror; /**< slot for "errno" return */ t_soundfile x_sf; /**< soundfile fd, type, and format info */ size_t x_onsetframes; /**< number of sample frames to skip */ @@ -1768,6 +1767,7 @@ typedef struct _readsf pthread_cond_t x_requestcondition; pthread_cond_t x_answercondition; pthread_t x_childthread; + t_namelist *x_namelist; #ifdef PDINSTANCE t_pdinstance *x_pd_this; /**< pointer to the owner pd instance */ #endif @@ -1864,7 +1864,8 @@ static void *readsf_child_main(void *zz) /* open the soundfile with the mutex unlocked */ pthread_mutex_unlock(&x->x_mutex); - open_soundfile_via_path(dirname, filename, &sf, onsetframes); + open_soundfile_via_namelist(dirname, filename, x->x_namelist, + &sf, onsetframes); pthread_mutex_lock(&x->x_mutex); #ifdef DEBUG_SOUNDFILE_THREADS @@ -2124,6 +2125,7 @@ static void *readsf_new(t_floatarg fnchannels, t_floatarg fbufsize) x->x_buf = buf; x->x_bufsize = bufsize; x->x_fifosize = x->x_fifohead = x->x_fifotail = x->x_requestcode = 0; + x->x_namelist = 0; #ifdef PDINSTANCE x->x_pd_this = pd_this; #endif @@ -2240,6 +2242,13 @@ static void readsf_float(t_readsf *x, t_floatarg f) else readsf_stop(x); } +static int readsf_one_iter(const char *path, t_readsf *x) +{ + fprintf(stderr, "%s\n", path); + x->x_namelist = namelist_append(x->x_namelist, path, 0); + return 1; +} + /** open method. Called as: open [flags] filename [onsetframes headersize channels bytes endianness] (if headersize is zero, header is taken to be automatically detected; @@ -2270,6 +2279,10 @@ static void readsf_open(t_readsf *x, t_symbol *s, int argc, t_atom *argv) return; /* no filename */ pthread_mutex_lock(&x->x_mutex); + if (x->x_namelist) + namelist_free(x->x_namelist), x->x_namelist = 0; + canvas_path_iterate(x->x_canvas, + (t_canvas_path_iterator)readsf_one_iter, x); soundfile_clear(&x->x_sf); x->x_requestcode = REQUEST_OPEN; x->x_filename = filesym->s_name; diff --git a/src/g_canvas.c b/src/g_canvas.c index 83a7a3ee..43392e98 100644 --- a/src/g_canvas.c +++ b/src/g_canvas.c @@ -1842,7 +1842,7 @@ static int canvas_open_iter(const char *path, t_canvasopen *co) { int fd; if ((fd = sys_trytoopenone(path, co->name, co->ext, - co->dirresult, co->nameresult, co->size, co->bin)) >= 0) + co->dirresult, co->nameresult, co->size, co->bin, 1)) >= 0) { co->fd = fd; return 0; @@ -1869,7 +1869,7 @@ int canvas_open(const t_canvas *x, const char *name, const char *ext, t_canvasopen co; /* first check if "name" is absolute (and if so, try to open) */ - if (sys_open_absolute(name, ext, dirresult, nameresult, size, bin, &fd)) + if (sys_open_absolute(name, ext, dirresult, nameresult, size, bin, &fd, 1)) return (fd); /* otherwise "name" is relative; iterate over all the search-paths */ diff --git a/src/s_loader.c b/src/s_loader.c index 6bb32373..99999758 100644 --- a/src/s_loader.c +++ b/src/s_loader.c @@ -394,7 +394,7 @@ static int sys_do_load_lib(t_canvas *canvas, const char *objectname, for(dllextent=sys_get_dllextensions(); *dllextent; dllextent++) { if ((fd = sys_trytoopenone(path, objectname, *dllextent, - dirbuf, &nameptr, MAXPDSTRING, 1)) >= 0) + dirbuf, &nameptr, MAXPDSTRING, 1, 1)) >= 0) if(sys_do_load_lib_from_file(fd, objectname, dirbuf, nameptr, symname)) return 1; } @@ -407,7 +407,7 @@ static int sys_do_load_lib(t_canvas *canvas, const char *objectname, for(dllextent=sys_get_dllextensions(); *dllextent; dllextent++) { if ((fd = sys_trytoopenone(path, filename, *dllextent, - dirbuf, &nameptr, MAXPDSTRING, 1)) >= 0) + dirbuf, &nameptr, MAXPDSTRING, 1, 1)) >= 0) if(sys_do_load_lib_from_file(fd, objectname, dirbuf, nameptr, symname)) return 1; } @@ -420,7 +420,7 @@ static int sys_do_load_lib(t_canvas *canvas, const char *objectname, strcpy(libname+len-1, "_tilde"); } if ((fd = sys_trytoopenone(path, libname, ".so", - dirbuf, &nameptr, MAXPDSTRING, 1)) >= 0) + dirbuf, &nameptr, MAXPDSTRING, 1, 1)) >= 0) if(sys_do_load_lib_from_file(fd, objectname, dirbuf, nameptr, symname)) return 1; #endif @@ -642,11 +642,11 @@ static int sys_do_load_abs(t_canvas *canvas, const char *objectname, pd_snprintf(classslashclass, MAXPDSTRING, "%s/%s", objectname, objectname); if ((fd = sys_trytoopenone(path, objectname, ".pd", - dirbuf, &nameptr, MAXPDSTRING, 1)) >= 0 || + dirbuf, &nameptr, MAXPDSTRING, 1, 1)) >= 0 || (fd = sys_trytoopenone(path, objectname, ".pat", - dirbuf, &nameptr, MAXPDSTRING, 1)) >= 0 || + dirbuf, &nameptr, MAXPDSTRING, 1, 1)) >= 0 || (fd = sys_trytoopenone(path, classslashclass, ".pd", - dirbuf, &nameptr, MAXPDSTRING, 1)) >= 0) + dirbuf, &nameptr, MAXPDSTRING, 1, 1)) >= 0) { t_class*c=0; close(fd); diff --git a/src/s_path.c b/src/s_path.c index ad7b4d52..66ea181d 100644 --- a/src/s_path.c +++ b/src/s_path.c @@ -263,7 +263,8 @@ void sys_setextrapath(const char *p) on Windows). */ int sys_trytoopenone(const char *dir, const char *name, const char* ext, - char *dirresult, char **nameresult, unsigned int size, int bin) + char *dirresult, char **nameresult, unsigned int size, int bin, + int okgui) { int fd; char buf[MAXPDSTRING]; @@ -287,8 +288,9 @@ int sys_trytoopenone(const char *dir, const char *name, const char* ext, !S_ISDIR(statbuf.st_mode)); if (!ok) { - logpost(NULL, PD_VERBOSE, "tried %s; stat failed or directory", - dirresult); + if (okgui) + logpost(NULL, PD_VERBOSE, "tried %s; stat failed or directory", + dirresult); close (fd); fd = -1; } @@ -296,7 +298,8 @@ int sys_trytoopenone(const char *dir, const char *name, const char* ext, #endif { char *slash; - logpost(NULL, PD_VERBOSE, "tried %s and succeeded", dirresult); + if (okgui) + logpost(NULL, PD_VERBOSE, "tried %s and succeeded", dirresult); sys_unbashfilename(dirresult, dirresult); slash = strrchr(dirresult, '/'); if (slash) @@ -311,7 +314,8 @@ int sys_trytoopenone(const char *dir, const char *name, const char* ext, } else { - logpost(NULL, PD_VERBOSE, "tried %s and failed", dirresult); + if (okgui) + logpost(NULL, PD_VERBOSE, "tried %s and failed", dirresult); } return (-1); } @@ -319,7 +323,8 @@ int sys_trytoopenone(const char *dir, const char *name, const char* ext, /* check if we were given an absolute pathname, if so try to open it and return 1 to signal the caller to cancel any path searches */ int sys_open_absolute(const char *name, const char* ext, - char *dirresult, char **nameresult, unsigned int size, int bin, int *fdp) + char *dirresult, char **nameresult, unsigned int size, int bin, int *fdp, + int okgui) { if (sys_isabsolutepath(name)) { @@ -333,7 +338,7 @@ int sys_open_absolute(const char *name, const char* ext, strncpy(dirbuf, name, dirlen); dirbuf[dirlen] = 0; *fdp = sys_trytoopenone(dirbuf, name+(dirlen+1), ext, - dirresult, nameresult, size, bin); + dirresult, nameresult, size, bin, okgui); return (1); } else return (0); @@ -350,37 +355,38 @@ there is no search and instead we just try to open the file literally. */ /* see also canvas_open() which, in addition, searches down the canvas-specific path. */ -static int do_open_via_path(const char *dir, const char *name, +int do_open_via_path(const char *dir, const char *name, const char *ext, char *dirresult, char **nameresult, unsigned int size, - int bin, t_namelist *searchpath) + int bin, t_namelist *searchpath, int okgui) { t_namelist *nl; int fd = -1; /* first check if "name" is absolute (and if so, try to open) */ - if (sys_open_absolute(name, ext, dirresult, nameresult, size, bin, &fd)) - return (fd); + if (sys_open_absolute(name, ext, dirresult, nameresult, size, bin, &fd, + okgui)) + return (fd); /* otherwise "name" is relative; try the directory "dir" first. */ if ((fd = sys_trytoopenone(dir, name, ext, - dirresult, nameresult, size, bin)) >= 0) + dirresult, nameresult, size, bin, okgui)) >= 0) return (fd); /* next go through the temp paths from the commandline */ for (nl = STUFF->st_temppath; nl; nl = nl->nl_next) if ((fd = sys_trytoopenone(nl->nl_string, name, ext, - dirresult, nameresult, size, bin)) >= 0) + dirresult, nameresult, size, bin, okgui)) >= 0) return (fd); /* next look in built-in paths like "extra" */ for (nl = searchpath; nl; nl = nl->nl_next) if ((fd = sys_trytoopenone(nl->nl_string, name, ext, - dirresult, nameresult, size, bin)) >= 0) + dirresult, nameresult, size, bin, okgui)) >= 0) return (fd); /* next look in built-in paths like "extra" */ if (sys_usestdpath) for (nl = STUFF->st_staticpath; nl; nl = nl->nl_next) if ((fd = sys_trytoopenone(nl->nl_string, name, ext, - dirresult, nameresult, size, bin)) >= 0) + dirresult, nameresult, size, bin, okgui)) >= 0) return (fd); *dirresult = 0; @@ -393,7 +399,7 @@ int open_via_path(const char *dir, const char *name, const char *ext, char *dirresult, char **nameresult, unsigned int size, int bin) { return (do_open_via_path(dir, name, ext, dirresult, nameresult, - size, bin, STUFF->st_searchpath)); + size, bin, STUFF->st_searchpath, 1)); } /* open a file with a UTF-8 filename @@ -502,7 +508,7 @@ void open_via_helppath(const char *name, const char *dir) strncpy(newname, realname, MAXPDSTRING-10); strcat(realname, "-help.pd"); if ((fd = do_open_via_path(usedir, realname, "", dirbuf, &basename, - MAXPDSTRING, 0, STUFF->st_helppath)) >= 0) + MAXPDSTRING, 0, STUFF->st_helppath, 1)) >= 0) goto gotone; /* 2. "help-objectname.pd" */ @@ -510,7 +516,7 @@ void open_via_helppath(const char *name, const char *dir) strncat(realname, name, MAXPDSTRING-10); realname[MAXPDSTRING-1] = 0; if ((fd = do_open_via_path(usedir, realname, "", dirbuf, &basename, - MAXPDSTRING, 0, STUFF->st_helppath)) >= 0) + MAXPDSTRING, 0, STUFF->st_helppath, 1)) >= 0) goto gotone; post("sorry, couldn't find help patch for \"%s\"", newname); return; diff --git a/src/s_stuff.h b/src/s_stuff.h index 90a87e53..42d4dbf9 100644 --- a/src/s_stuff.h +++ b/src/s_stuff.h @@ -20,13 +20,17 @@ EXTERN t_namelist *namelist_append(t_namelist *listwas, const char *s, int allow EXTERN t_namelist *namelist_append_files(t_namelist *listwas, const char *s); EXTERN void namelist_free(t_namelist *listwas); EXTERN const char *namelist_get(const t_namelist *namelist, int n); +int do_open_via_path(const char *dir, const char *name, + const char *ext, char *dirresult, char **nameresult, unsigned int size, + int bin, t_namelist *searchpath, int okgui); void sys_setextrapath(const char *p); extern int sys_usestdpath; int sys_open_absolute(const char *name, const char* ext, - char *dirresult, char **nameresult, unsigned int size, int bin, int *fdp); + char *dirresult, char **nameresult, unsigned int size, int bin, int *fdp, + int okgui); int sys_trytoopenone(const char *dir, const char *name, const char* ext, - char *dirresult, char **nameresult, unsigned int size, int bin); + char *dirresult, char **nameresult, unsigned int size, int bin, int okgui); t_symbol *sys_decodedialog(t_symbol *s); /* s_file.c */ From 9f8834f2083aafd505c6b5ebfc7b1e6ec5e98657 Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Fri, 30 Aug 2024 16:56:10 +0200 Subject: [PATCH 72/89] provide back-compatible sys_trytoopenone() with a warning message. This can go away once all old copies of pdlua in the world have been updated. --- src/d_soundfile.c | 9 +++++++++ src/g_canvas.c | 2 +- src/s_loader.c | 12 ++++++------ src/s_path.c | 22 ++++++++++++++++------ src/s_stuff.h | 2 +- 5 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/d_soundfile.c b/src/d_soundfile.c index 2ba967c9..ae1c53bc 100644 --- a/src/d_soundfile.c +++ b/src/d_soundfile.c @@ -2283,6 +2283,15 @@ static void readsf_open(t_readsf *x, t_symbol *s, int argc, t_atom *argv) namelist_free(x->x_namelist), x->x_namelist = 0; canvas_path_iterate(x->x_canvas, (t_canvas_path_iterator)readsf_one_iter, x); + if (sys_verbose) /* do a fake open just for the verbose printout */ + { + char buf[MAXPDSTRING], *dummy; + int fd; + fd = do_open_via_path(canvas_getdir(x->x_canvas)->s_name, + filesym->s_name, "", buf, &dummy, MAXPDSTRING, 1, x->x_namelist, 1); + if (fd >= 0) + close(fd); + } soundfile_clear(&x->x_sf); x->x_requestcode = REQUEST_OPEN; x->x_filename = filesym->s_name; diff --git a/src/g_canvas.c b/src/g_canvas.c index 43392e98..1d6b3fb6 100644 --- a/src/g_canvas.c +++ b/src/g_canvas.c @@ -1841,7 +1841,7 @@ typedef struct _canvasopen static int canvas_open_iter(const char *path, t_canvasopen *co) { int fd; - if ((fd = sys_trytoopenone(path, co->name, co->ext, + if ((fd = sys_trytoopenit(path, co->name, co->ext, co->dirresult, co->nameresult, co->size, co->bin, 1)) >= 0) { co->fd = fd; diff --git a/src/s_loader.c b/src/s_loader.c index 99999758..ca62f7fb 100644 --- a/src/s_loader.c +++ b/src/s_loader.c @@ -393,7 +393,7 @@ static int sys_do_load_lib(t_canvas *canvas, const char *objectname, /* try looking in the path for (objectname).(sys_dllextent) ... */ for(dllextent=sys_get_dllextensions(); *dllextent; dllextent++) { - if ((fd = sys_trytoopenone(path, objectname, *dllextent, + if ((fd = sys_trytoopenit(path, objectname, *dllextent, dirbuf, &nameptr, MAXPDSTRING, 1, 1)) >= 0) if(sys_do_load_lib_from_file(fd, objectname, dirbuf, nameptr, symname)) return 1; @@ -406,7 +406,7 @@ static int sys_do_load_lib(t_canvas *canvas, const char *objectname, filename[MAXPDSTRING-1] = 0; for(dllextent=sys_get_dllextensions(); *dllextent; dllextent++) { - if ((fd = sys_trytoopenone(path, filename, *dllextent, + if ((fd = sys_trytoopenit(path, filename, *dllextent, dirbuf, &nameptr, MAXPDSTRING, 1, 1)) >= 0) if(sys_do_load_lib_from_file(fd, objectname, dirbuf, nameptr, symname)) return 1; @@ -419,7 +419,7 @@ static int sys_do_load_lib(t_canvas *canvas, const char *objectname, if (libname[len-1] == '~' && len < MAXPDSTRING - 6) { strcpy(libname+len-1, "_tilde"); } - if ((fd = sys_trytoopenone(path, libname, ".so", + if ((fd = sys_trytoopenit(path, libname, ".so", dirbuf, &nameptr, MAXPDSTRING, 1, 1)) >= 0) if(sys_do_load_lib_from_file(fd, objectname, dirbuf, nameptr, symname)) return 1; @@ -641,11 +641,11 @@ static int sys_do_load_abs(t_canvas *canvas, const char *objectname, if (!path) return (0); pd_snprintf(classslashclass, MAXPDSTRING, "%s/%s", objectname, objectname); - if ((fd = sys_trytoopenone(path, objectname, ".pd", + if ((fd = sys_trytoopenit(path, objectname, ".pd", dirbuf, &nameptr, MAXPDSTRING, 1, 1)) >= 0 || - (fd = sys_trytoopenone(path, objectname, ".pat", + (fd = sys_trytoopenit(path, objectname, ".pat", dirbuf, &nameptr, MAXPDSTRING, 1, 1)) >= 0 || - (fd = sys_trytoopenone(path, classslashclass, ".pd", + (fd = sys_trytoopenit(path, classslashclass, ".pd", dirbuf, &nameptr, MAXPDSTRING, 1, 1)) >= 0) { t_class*c=0; diff --git a/src/s_path.c b/src/s_path.c index 66ea181d..9e21219a 100644 --- a/src/s_path.c +++ b/src/s_path.c @@ -262,7 +262,7 @@ void sys_setextrapath(const char *p) The "bin" flag requests opening for binary (which only makes a difference on Windows). */ -int sys_trytoopenone(const char *dir, const char *name, const char* ext, +int sys_trytoopenit(const char *dir, const char *name, const char* ext, char *dirresult, char **nameresult, unsigned int size, int bin, int okgui) { @@ -320,6 +320,16 @@ int sys_trytoopenone(const char *dir, const char *name, const char* ext, return (-1); } + +int sys_trytoopenone(const char *dir, const char *name, const char* ext, + char *dirresult, char **nameresult, unsigned int size, int bin) +{ + pd_error(0, + "obsolete call to sys_trytoopenone(): some extern needs an update"); + return (sys_trytoopenit(dir, name, ext, dirresult, nameresult, size, bin, + 1)); +} + /* check if we were given an absolute pathname, if so try to open it and return 1 to signal the caller to cancel any path searches */ int sys_open_absolute(const char *name, const char* ext, @@ -337,7 +347,7 @@ int sys_open_absolute(const char *name, const char* ext, dirlen = MAXPDSTRING-1; strncpy(dirbuf, name, dirlen); dirbuf[dirlen] = 0; - *fdp = sys_trytoopenone(dirbuf, name+(dirlen+1), ext, + *fdp = sys_trytoopenit(dirbuf, name+(dirlen+1), ext, dirresult, nameresult, size, bin, okgui); return (1); } @@ -368,24 +378,24 @@ int do_open_via_path(const char *dir, const char *name, return (fd); /* otherwise "name" is relative; try the directory "dir" first. */ - if ((fd = sys_trytoopenone(dir, name, ext, + if ((fd = sys_trytoopenit(dir, name, ext, dirresult, nameresult, size, bin, okgui)) >= 0) return (fd); /* next go through the temp paths from the commandline */ for (nl = STUFF->st_temppath; nl; nl = nl->nl_next) - if ((fd = sys_trytoopenone(nl->nl_string, name, ext, + if ((fd = sys_trytoopenit(nl->nl_string, name, ext, dirresult, nameresult, size, bin, okgui)) >= 0) return (fd); /* next look in built-in paths like "extra" */ for (nl = searchpath; nl; nl = nl->nl_next) - if ((fd = sys_trytoopenone(nl->nl_string, name, ext, + if ((fd = sys_trytoopenit(nl->nl_string, name, ext, dirresult, nameresult, size, bin, okgui)) >= 0) return (fd); /* next look in built-in paths like "extra" */ if (sys_usestdpath) for (nl = STUFF->st_staticpath; nl; nl = nl->nl_next) - if ((fd = sys_trytoopenone(nl->nl_string, name, ext, + if ((fd = sys_trytoopenit(nl->nl_string, name, ext, dirresult, nameresult, size, bin, okgui)) >= 0) return (fd); diff --git a/src/s_stuff.h b/src/s_stuff.h index 42d4dbf9..3a64a55a 100644 --- a/src/s_stuff.h +++ b/src/s_stuff.h @@ -29,7 +29,7 @@ extern int sys_usestdpath; int sys_open_absolute(const char *name, const char* ext, char *dirresult, char **nameresult, unsigned int size, int bin, int *fdp, int okgui); -int sys_trytoopenone(const char *dir, const char *name, const char* ext, +int sys_trytoopenit(const char *dir, const char *name, const char* ext, char *dirresult, char **nameresult, unsigned int size, int bin, int okgui); t_symbol *sys_decodedialog(t_symbol *s); From 8ae4dcf93096543b8fd9c935055b49f1ef296cc5 Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Fri, 30 Aug 2024 17:03:32 +0200 Subject: [PATCH 73/89] get rid of trailing spaces. These had started creeping in once git stopped preventing commits with trailing space by default. --- src/CHANGELOG.txt | 12 ++++++------ src/d_osc.c | 2 +- src/makefile.gnu | 32 ++++++++++++++++---------------- src/makefile.mac | 10 +++++----- src/makefile.mingw | 26 +++++++++++++------------- src/notes.txt | 2 +- src/x_vexp.c | 2 +- src/x_vexp_fun.c | 20 ++++++++++---------- src/x_vexp_if.c | 6 +++--- 9 files changed, 56 insertions(+), 56 deletions(-) diff --git a/src/CHANGELOG.txt b/src/CHANGELOG.txt index a5badf63..7397c524 100644 --- a/src/CHANGELOG.txt +++ b/src/CHANGELOG.txt @@ -2,7 +2,7 @@ This file describes implementation and API changes; stuff more visible to the user appears in the "release notes" instead. See the bottom of this file for original notes on source style and organization. -0.42.0 +0.42.0 changed definition of t_float, t_sample, t_floatarg so that they can be set via #defines (PD_FLOATTYPE, etc). @@ -20,7 +20,7 @@ by zmoelnig). canvas_dspstate and signalinlet_new() exported to m_pd.h -new function verbose() added to m_pd.h +new function verbose() added to m_pd.h 0.38.0 @@ -41,9 +41,9 @@ t_int to int in binbuf_addv prototype Pd now uses portaudio out-of-the-box; customized files are moved to "src" directory. -All "tags" are printf'd as %lx to make 64-bit safe. +All "tags" are printf'd as %lx to make 64-bit safe. -GUI queueing mechanism added: sys_queuegui() etc. +GUI queueing mechanism added: sys_queuegui() etc. massive rewrite of array code to unify arrays and scalars. @@ -112,7 +112,7 @@ I could never get sysex working in it as I had wanted.) Took bug fixes from s_midi_pm.c, s_audio_jack.c, s_inter.c from "devel" branch; also added "static" flag to configure.in (but the devel configure.in as a whole doesn't seem to work for OSX, for me at least.) - + Might have fixed a bug where labels disappear in buttons, etc, when saved and reloaded. @@ -244,7 +244,7 @@ Important packages are: class -- functions manipulating classes (other) -- functions common to the named Pd class -5. Source file prefixes. +5. Source file prefixes. PD: s system interface m message system diff --git a/src/d_osc.c b/src/d_osc.c index f1806bbe..e2f407d5 100644 --- a/src/d_osc.c +++ b/src/d_osc.c @@ -187,7 +187,7 @@ static void cos_maketable(void) /* fill in true 1s and 0s for 1/4-cycle points. These should be possible to address exactly in cos~ object. The rest are irrational anyway and hence will never be exact so we leave them - as computed by the lobrary cosine function. */ + as computed by the lobrary cosine function. */ cos_newtable[0] = cos_newtable[COSTABLESIZE] = 1; cos_newtable[COSTABLESIZE/4] = cos_newtable[3*COSTABLESIZE/4] = 0; cos_newtable[COSTABLESIZE/2] = -1; diff --git a/src/makefile.gnu b/src/makefile.gnu index 8f28410a..aad1d513 100644 --- a/src/makefile.gnu +++ b/src/makefile.gnu @@ -1,4 +1,4 @@ -# You can use this makefile to compile Pd for Gnu/linux. Masochists and +# You can use this makefile to compile Pd for Gnu/linux. Masochists and # packagers might prefer the automake route as described in ../README.txt # You can invoke this one as: $ make -f makefile.gnu # You don't have to "make install" - you can just invoke Pd from ../bin. @@ -65,7 +65,7 @@ CPPFLAGS = -DPD -DPD_INTERNAL \ -Wno-unused -Wno-unused-parameter -Wno-parentheses -Wno-switch \ -Wno-cast-function-type -Wno-stringop-truncation -Wno-format-truncation -# code generation flags (e.g., optimization). +# code generation flags (e.g., optimization). CODECFLAGS = -g -O3 -ffast-math -funroll-loops -fomit-frame-pointer # anything else you want to specify. Also passed on to "extra" makefiles. @@ -145,7 +145,7 @@ all: pd $(BIN_DIR)/pd-watchdog $(BIN_DIR)/pdsend $(BIN_DIR)/pdreceive externs \ bin: pd $(BIN_DIR)/pd-watchdog $(BIN_DIR)/pdsend $(BIN_DIR)/pdreceive $(OBJ) : %.o : %.c - $(CC) $(CFLAGS) $(INCLUDE) -c -o $(OBJ_DIR)/$*.o $*.c + $(CC) $(CFLAGS) $(INCLUDE) -c -o $(OBJ_DIR)/$*.o $*.c pd: $(PDEXEC) @@ -167,17 +167,17 @@ $(PDEXEC): $(OBJ_DIR) $(OBJ) test -d $(BIN_DIR) || mkdir -p $(BIN_DIR) cd ../obj; $(CC) $(LDFLAGS) $(MORELDFLAGS) -o $(PDEXEC) $(OBJ) $(LIB) -externs: - make -C ../extra/bonk~ MORECFLAGS="$(MORECFLAGS)" - make -C ../extra/choice MORECFLAGS="$(MORECFLAGS)" - make -C ../extra/fiddle~ MORECFLAGS="$(MORECFLAGS)" - make -C ../extra/loop~ MORECFLAGS="$(MORECFLAGS)" - make -C ../extra/lrshift~ MORECFLAGS="$(MORECFLAGS)" - make -C ../extra/pique MORECFLAGS="$(MORECFLAGS)" - make -C ../extra/sigmund~ MORECFLAGS="$(MORECFLAGS)" - make -C ../extra/pd~ MORECFLAGS="$(MORECFLAGS)" - make -C ../extra/stdout MORECFLAGS="$(MORECFLAGS)" - make -C ../extra/bob~ MORECFLAGS="$(MORECFLAGS)" +externs: + make -C ../extra/bonk~ MORECFLAGS="$(MORECFLAGS)" + make -C ../extra/choice MORECFLAGS="$(MORECFLAGS)" + make -C ../extra/fiddle~ MORECFLAGS="$(MORECFLAGS)" + make -C ../extra/loop~ MORECFLAGS="$(MORECFLAGS)" + make -C ../extra/lrshift~ MORECFLAGS="$(MORECFLAGS)" + make -C ../extra/pique MORECFLAGS="$(MORECFLAGS)" + make -C ../extra/sigmund~ MORECFLAGS="$(MORECFLAGS)" + make -C ../extra/pd~ MORECFLAGS="$(MORECFLAGS)" + make -C ../extra/stdout MORECFLAGS="$(MORECFLAGS)" + make -C ../extra/bob~ MORECFLAGS="$(MORECFLAGS)" BINARYMODE=-m755 @@ -188,7 +188,7 @@ install: all install -d $(DESTDIR)$(bindir) install $(BINARYMODE) $(PDEXEC) $(DESTDIR)$(bindir)/pd install -m755 $(BIN_DIR)/pdsend $(DESTDIR)$(bindir)/pdsend - install -m755 $(BIN_DIR)/pdreceive $(DESTDIR)$(bindir)/pdreceive + install -m755 $(BIN_DIR)/pdreceive $(DESTDIR)$(bindir)/pdreceive install -d $(DESTDIR)$(libpdtcldir) install ../tcl/* $(DESTDIR)$(libpdtcldir) for dir in $(shell ls -1 ../doc | grep -v CVS); do \ @@ -219,7 +219,7 @@ local-clean: -rm -f ../obj/* $(BIN_DIR)/pd $(BIN_DIR)/pdsend \ $(BIN_DIR)/pdreceive $(BIN_DIR)/pd-watchdog m_stamp.c \ $(BIN_DIR)/*.tcl - -rm -f `find ../portaudio -name "*.o"` + -rm -f `find ../portaudio -name "*.o"` -rm -f *~ -(cd ../doc/6.externs; rm -f *.pd_linux) -rm -f makefile.dependencies diff --git a/src/makefile.mac b/src/makefile.mac index 486a0034..da64a436 100644 --- a/src/makefile.mac +++ b/src/makefile.mac @@ -42,7 +42,7 @@ CPPFLAGS = -DINSTALL_PREFIX=\"$(prefix)\" \ -I$(PADIR)/src/os/mac_osx/ -I$(PMDIR)/pm_common \ -I$(PMDIR)/pm_mac -I$(PMDIR)/porttime \ -DUSEAPI_PORTAUDIO -DPA_USE_COREAUDIO -DNEWBUFFER -ARCH_CFLAGS = $(ARCH) +ARCH_CFLAGS = $(ARCH) WARN_CFLAGS = -Wall -W -Wstrict-prototypes -Wno-unused -Wno-unused-parameter \ -Wno-parentheses -Wno-switch MORECFLAGS = -Wno-error -ffast-math -O3 @@ -121,7 +121,7 @@ bin: pd $(BIN_DIR)/pd-watchdog gui $(BIN_DIR)/pdsend \ $(BIN_DIR)/pdreceive $(OBJ) : %.o : %.c - $(CC) $(CFLAGS) $(INCLUDE) -c -o $(OBJ_DIR)/$*.o $*.c + $(CC) $(CFLAGS) $(INCLUDE) -c -o $(OBJ_DIR)/$*.o $*.c $(OBJ): $(OBJ_DIR) @@ -148,7 +148,7 @@ $(PDEXEC): $(OBJ) $(BIN_DIR) cd ../obj; $(CC) $(LDFLAGS) $(DBG_CFLAGS) -o $(PDEXEC) $(OBJ) $(LIB) EXTERNTYPE=d_fat -externs: +externs: make -C ../extra/bonk~ DARWINARCH="$(EXTRAARCH)" $(EXTERNTYPE) make -C ../extra/choice DARWINARCH="$(EXTRAARCH)" $(EXTERNTYPE) make -C ../extra/fiddle~ DARWINARCH="$(EXTRAARCH)" $(EXTERNTYPE) @@ -169,7 +169,7 @@ install: all install -d $(DESTDIR)$(bindir) install $(BINARYMODE) $(PDEXEC) $(DESTDIR)$(bindir)/pd install -m755 $(BIN_DIR)/pdsend $(DESTDIR)$(bindir)/pdsend - install -m755 $(BIN_DIR)/pdreceive $(DESTDIR)$(bindir)/pdreceive + install -m755 $(BIN_DIR)/pdreceive $(DESTDIR)$(bindir)/pdreceive install -d $(DESTDIR)$(libpdtcldir) install ../tcl/* $(DESTDIR)$(libpdtcldir) for dir in $(shell ls -1 ../doc | grep -v CVS); do \ @@ -200,7 +200,7 @@ local-clean: -rm -f ../obj/* $(BIN_DIR)/pd $(BIN_DIR)/pdsend \ $(BIN_DIR)/pdreceive $(BIN_DIR)/pd-watchdog m_stamp.c \ $(BIN_DIR)/*.tcl - -rm -f `find ../portaudio -name "*.o"` + -rm -f `find ../portaudio -name "*.o"` -rm -f *~ -(cd ../doc/6.externs; rm -f *.pd_linux) -rm -f makefile.dependencies diff --git a/src/makefile.mingw b/src/makefile.mingw index ef186ee4..885d123d 100644 --- a/src/makefile.mingw +++ b/src/makefile.mingw @@ -51,14 +51,14 @@ ASIODIR ?= $(asiodir) ASIOINC = -I$(ASIODIR)/common -I$(ASIODIR)/host -I$(ASIODIR)/host/pc INCPA = -I$(PADIR)/include -I$(PADIR)/src/common -I$(PADIR)/src/os/win \ $(ASIOINC) -INCLUDE = -I$(pd_src)/src +INCLUDE = -I$(pd_src)/src GINCLUDE = -I/usr/local/include $(INCLUDE) -LDFLAGS = +LDFLAGS = LIBS = -lm -lws2_32 -lwinmm -lole32 -lpthread \ -static-libgcc -static-libstdc++ -OPT_CFLAGS = +OPT_CFLAGS = WARN_CFLAGS = -Wall -W -Wstrict-prototypes -Wno-unused \ -Wno-unused-parameter -Wno-parentheses -Wno-switch @@ -139,8 +139,8 @@ SRC = g_canvas.c g_graph.c g_text.c g_rtext.c g_array.c g_template.c g_io.c \ SRSRC = u_pdsend.c u_pdreceive.c s_net.c -OBJ = $(SRC:.c=.o) -SROBJ = $(SRSRC:.c=.o) +OBJ = $(SRC:.c=.o) +SROBJ = $(SRSRC:.c=.o) PAOBJ = $(PASRC:.c=.o) ASIOOBJ = $(ASIOSRC:.cpp=.o) #VOBJ = $(VSRC:.c=.o) @@ -155,25 +155,25 @@ OBJC = $(OBJ) $(PAOBJ) $(ASIOOBJ) $(PMOBJ) all: $(PDDLL) $(PDEXEC) $(PDSEND) $(PDRECEIVE) $(PDCOM) $(OBJ) : %.o : %.c - $(CC) $(CFLAGS) $(GFLAGS) $(INCLUDE) -c -o $*.o $*.c + $(CC) $(CFLAGS) $(GFLAGS) $(INCLUDE) -c -o $*.o $*.c $(GOBJ) : %.o : %.c - $(CC) $(CFLAGS) $(GFLAGS) $(GINCLUDE) -c -o $*.o $*.c + $(CC) $(CFLAGS) $(GFLAGS) $(GINCLUDE) -c -o $*.o $*.c $(SROBJ) : %.o : %.c - $(CC) $(CFLAGS) $(GFLAGS) $(INCLUDE) -c -o $*.o $*.c + $(CC) $(CFLAGS) $(GFLAGS) $(INCLUDE) -c -o $*.o $*.c $(PAOBJ) : %.o : %.c - $(CC) $(CFLAGS) $(GFLAGS) $(INCPA) -c -o $*.o $*.c + $(CC) $(CFLAGS) $(GFLAGS) $(INCPA) -c -o $*.o $*.c $(ASIOOBJ) : %.o : %.cpp $(CXX) $(CFLAGS) $(INCPA) -c -o $*.o $*.cpp $(PMOBJ) : %.o : %.c - $(CC) $(CFLAGS) $(GFLAGS) $(PMINCLUDE) -c -o $*.o $*.c + $(CC) $(CFLAGS) $(GFLAGS) $(PMINCLUDE) -c -o $*.o $*.c $(VOBJ) : %.o : %.c - $(CC) $(CFLAGS) $(GFLAGS) $(INCLUDE) -c -o $*.o $*.c + $(CC) $(CFLAGS) $(GFLAGS) $(INCLUDE) -c -o $*.o $*.c $(PDSEND): $(EXECDIR) u_pdsend.o s_net.o $(CC) $(CFLAGS) $(LDFLAGS) -o $(PDSEND) u_pdsend.o s_net.o $(LIBS) @@ -193,7 +193,7 @@ $(PDCOM): $(EXECDIR) s_entry.o $(PDDLL): $(EXECDIR) $(OBJC) $(CXX) -shared $(LDFLAGS) -o $(PDDLL) $(OBJC) $(LIBS) \ - -Wl,--export-all-symbols -Wl,--out-implib=pd.a; + -Wl,--export-all-symbols -Wl,--out-implib=pd.a; $(STRIP) $(PDDLL) pd.res: pd.rc @@ -212,7 +212,7 @@ $(EXECDIR): # $(DLLWRAP) --export-all-symbols --output-def vst.def \ # --output-lib=vst.a --dllname=vstschedlib.dll s_audio_vst.o pd.a $(LIBS) -externs: +externs: make -C ../extra all # kludge to put stuff into the pd/bin dir for testing diff --git a/src/notes.txt b/src/notes.txt index 42adf8dd..97a4cfb3 100644 --- a/src/notes.txt +++ b/src/notes.txt @@ -94,7 +94,7 @@ menu item to connect selected objects highlight connections (and I/Os) on mouse motion select line and hit "insert" to interpolate an object option-drag an outlet to make a new, connected object -make a way to make multiple connections +make a way to make multiple connections "fix width" menu item close-subwindows menu item canvas zooming (use tcl/tk canvas scale command?) diff --git a/src/x_vexp.c b/src/x_vexp.c index 85299d72..9a3ac1d0 100644 --- a/src/x_vexp.c +++ b/src/x_vexp.c @@ -738,7 +738,7 @@ ex_parse(struct expr *x, struct ex_ex *iptr, struct ex_ex *optr, long int *argc) tmpex = optr; tmpex->ex_end = ++optr; return (optr); - + } eptr = (struct ex_ex *) eptr[1].ex_ptr; break; diff --git a/src/x_vexp_fun.c b/src/x_vexp_fun.c index 9c493f9e..3904167a 100644 --- a/src/x_vexp_fun.c +++ b/src/x_vexp_fun.c @@ -1343,7 +1343,7 @@ ex_getstring(t_expr *e, struct ex_ex *eptr) if (eptr->ex_flags & EX_F_TSYM) return (eptr->ex_ptr); return (ex_symname((t_symbol *) eptr->ex_ptr)); - + case ET_SI: if (!e->exp_var[eptr->ex_int].ex_ptr) return (""); @@ -1362,7 +1362,7 @@ ex_getnumber(t_expr *e, struct ex_ex *eptr) switch (eptr->ex_type) { case ET_INT: return (eptr->ex_int); - + case ET_FLT: return ((int) eptr->ex_flt); @@ -1371,7 +1371,7 @@ ex_getnumber(t_expr *e, struct ex_ex *eptr) free(eptr->ex_ptr); eptr->ex_flags &= ~EX_F_TSYM; } - + default: return (0); } @@ -1414,7 +1414,7 @@ ex_makesymbol(t_expr *e, struct ex_ex *optr, size_t size) #define CHECK_LR_STR(left, right) \ CHECK_LEFT_STR(left) \ - CHECK_RIGHT_STR(right) + CHECK_RIGHT_STR(right) #define STRFUNC_DEF(func) \ @@ -1468,7 +1468,7 @@ ex_symbol(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) return; case ET_SI: - strp = ex_getstring(e, left); + strp = ex_getstring(e, left); if (!strp) { if (!ex_makesymbol(e, optr, 1)) goto goterror; @@ -1522,7 +1522,7 @@ ex_symboln(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) switch (left->ex_type) { case ET_SYM: case ET_SI: - strp = ex_getstring(e, left); + strp = ex_getstring(e, left); if (!strp) { if (!ex_makesymbol(e, optr, 1)) goto goterror; @@ -1587,7 +1587,7 @@ STRSINGLEFUNC_DEF(ex_tonlower) size = strlen(leftstr); if (!ex_makesymbol(e, optr, size)) return; - num = ex_getnumber(e, argv + 1); + num = ex_getnumber(e, argv + 1); strcat(optr->ex_ptr, leftstr); num = min (size, num); for (i = 0; i < num; i++) @@ -1621,7 +1621,7 @@ STRSINGLEFUNC_DEF(ex_tonupper) size = strlen(leftstr); if (!ex_makesymbol(e, optr, size)) return; - num = ex_getnumber(e, argv + 1); + num = ex_getnumber(e, argv + 1); strcat(optr->ex_ptr, leftstr); num = min (size, num); for (i = 0; i < num; i++) @@ -1646,7 +1646,7 @@ ex_strcat(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) char *p; /* string pointer */ int i; int size = 0; - + /* find the size */ for (i = 0; i < argc; i ++) { p = ex_getstring(e, &argv[i]); @@ -1676,7 +1676,7 @@ ex_strcat(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) */ STRFUNC_DEF(ex_strncat) int num, size; - num = ex_getnumber(e, argv + 2); + num = ex_getnumber(e, argv + 2); size = min(num, strlen(rightstr)); if (!ex_makesymbol(e, optr, size)) diff --git a/src/x_vexp_if.c b/src/x_vexp_if.c index d23f84a6..82606675 100644 --- a/src/x_vexp_if.c +++ b/src/x_vexp_if.c @@ -996,7 +996,7 @@ ex_vectablelookup(t_expr *e, t_word *wvec, int tsize, t_float *iptr, struct ex_e /* alternative interpolation code */ int_pos = (int)floorl(pos); frac_pos = pos - int_pos; - + x2 = wvec[(tsize + int_pos - 2) % tsize].w_float; x1 = wvec[(tsize + int_pos - 1) % tsize].w_float; x0 = wvec[(tsize + int_pos) % tsize].w_float; @@ -1130,8 +1130,8 @@ max_ex_tab(struct expr *expr, t_symbol *s, struct ex_ex *arg, int interpol, expr->exp_string, optr->ex_type); break; case ET_INT: - case ET_FLT: - default: + case ET_FLT: + default: optr->ex_type = ET_FLT; optr->ex_flt = flt_value; return(0); From 0146956031eed38d514baf37a1fcc24d4beb85c4 Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Sat, 31 Aug 2024 11:51:04 +0200 Subject: [PATCH 74/89] Version number to 0.55-1test1 --- configure.ac | 2 +- doc/1.manual/resources/chapter5.htm | 9 +++++++++ linux/release-checklist.txt | 6 +++--- src/m_pd.h | 4 ++-- src/pd.rc | 8 ++++---- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/configure.ac b/configure.ac index 09c2d73d..476c6912 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ ##### Prelude ##### AC_PREREQ(2.59) -AC_INIT([pd], [0.55.0]) +AC_INIT([pd], [0.55.1]) AC_CONFIG_SRCDIR(src/m_pd.c) AC_CONFIG_AUX_DIR([m4/config]) AC_CONFIG_MACRO_DIR([m4/generated]) diff --git a/doc/1.manual/resources/chapter5.htm b/doc/1.manual/resources/chapter5.htm index d8eaf61d..6e9c1910 100644 --- a/doc/1.manual/resources/chapter5.htm +++ b/doc/1.manual/resources/chapter5.htm @@ -25,6 +25,15 @@

                        Chapter 5: Current status

                        5.1. Release notes

                        +

                        ------------------ 0.55-1 ------------------------------ + +

                        bug fixes, notably a crasher bug when sending "open" to [readsf~] in verbose +mode, but other improvements in thread safety mostly relevant to RISC architectures. + +

                        Numerous documentation improvements + +

                        Updated "expr~" object from Shahrokh adding string handling (yay!) +

                        ------------------ 0.55-0 ------------------------------

                        The [osc~], [cos~] and [vcf~] objects now rely on a 2048 points diff --git a/linux/release-checklist.txt b/linux/release-checklist.txt index cf231fab..9acf44eb 100644 --- a/linux/release-checklist.txt +++ b/linux/release-checklist.txt @@ -3,7 +3,7 @@ release checklist test compilation on linux/msw/mac: VERSION=tmp -... later: VERSION=0.54-0test1 +... later: VERSION=0.55-1test1 ------------- remake po: ---------------- @@ -63,13 +63,13 @@ grab "macOS:archive" from https://git.iem.at/pd/pure-data/pipelines or try: https://git.iem.at/pd/pure-data/-/pipelines --> pure-data_$VERSION_macOS.zip -mv -i ~/pure-data_master_macOS.zip ~/pd/dist/pd-$VERSION.macos.zip +mv -i ~/pure-data_"$VERSION"_macOS.zip ~/pd/dist/pd-$VERSION.macos.zip --------- once the above checks out with a tmp version, proceed: update version string in ../src/m_pd.h ../configure.ac ../src/pd.rc copyright date in ../README.txt release notes: - nedit-client ../doc/1.manual/x5.htm + nedit-client ../doc/1.manual/resources/chapter5.htm git commit -a git tag $VERSION && git tag |tail !!! you can only push any given tag once !! git push origin --tags diff --git a/src/m_pd.h b/src/m_pd.h index a6e73e17..4145364a 100644 --- a/src/m_pd.h +++ b/src/m_pd.h @@ -10,8 +10,8 @@ extern "C" { #define PD_MAJOR_VERSION 0 #define PD_MINOR_VERSION 55 -#define PD_BUGFIX_VERSION 0 -#define PD_TEST_VERSION "" +#define PD_BUGFIX_VERSION 1 +#define PD_TEST_VERSION "test1" /* compile-time version check: #if PD_VERSION_CODE < PD_VERSION(0, 56, 0) diff --git a/src/pd.rc b/src/pd.rc index 1f1930ba..36d44b24 100644 --- a/src/pd.rc +++ b/src/pd.rc @@ -1,7 +1,7 @@ id ICON "../tcl/pd.ico" 1 VERSIONINFO -FILEVERSION 0,55,0,5 -PRODUCTVERSION 0,55,0,5 +FILEVERSION 0,55,1,0 +PRODUCTVERSION 0,55,1,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -9,12 +9,12 @@ BEGIN BEGIN VALUE "CompanyName", "puredata.info" VALUE "FileDescription", "Pure Data Application" - VALUE "FileVersion", "0.55-0" + VALUE "FileVersion", "0.55-1test1" VALUE "InternalName", "pd.exe" VALUE "LegalCopyright", "Miller Puckette, et al." VALUE "OriginalFilename", "pd.exe" VALUE "ProductName", "Pure Data" - VALUE "ProductVersion", "0.55-0" + VALUE "ProductVersion", "0.55-1test1" END END From cf964806075d9457124f6756367ce575c9a4a800 Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Sat, 31 Aug 2024 15:16:52 +0200 Subject: [PATCH 75/89] quieter obsoleteness warning for sys_trytoopenone() --- src/s_path.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/s_path.c b/src/s_path.c index 9e21219a..e54e8978 100644 --- a/src/s_path.c +++ b/src/s_path.c @@ -324,8 +324,14 @@ int sys_trytoopenit(const char *dir, const char *name, const char* ext, int sys_trytoopenone(const char *dir, const char *name, const char* ext, char *dirresult, char **nameresult, unsigned int size, int bin) { - pd_error(0, - "obsolete call to sys_trytoopenone(): some extern needs an update"); + if (PD_VERSION_CODE >= PD_VERSION(0, 56, 0)) + { + static int warned = 0; + if (!warned) + pd_error(0, + "obsolete call to sys_trytoopenone(): some extern needs an update"); + warned = 1; + } return (sys_trytoopenit(dir, name, ext, dirresult, nameresult, size, bin, 1)); } From 963c37641327bd9a0b557559bb448bc6459651ad Mon Sep 17 00:00:00 2001 From: Christof Ressi Date: Sun, 1 Sep 2024 00:20:55 +0200 Subject: [PATCH 76/89] export sys_trytoopenone() and explain the situation --- src/s_path.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/s_path.c b/src/s_path.c index e54e8978..c89ad62d 100644 --- a/src/s_path.c +++ b/src/s_path.c @@ -320,8 +320,9 @@ int sys_trytoopenit(const char *dir, const char *name, const char* ext, return (-1); } - -int sys_trytoopenone(const char *dir, const char *name, const char* ext, + /* keep this in the Pd app for binary compatibility + with existing loaders such as pdlua. */ +EXTERN int sys_trytoopenone(const char *dir, const char *name, const char* ext, char *dirresult, char **nameresult, unsigned int size, int bin) { if (PD_VERSION_CODE >= PD_VERSION(0, 56, 0)) From a6914de8dd3a0170f98c786b48611ba1fedff9c9 Mon Sep 17 00:00:00 2001 From: porres Date: Sun, 1 Sep 2024 14:33:32 -0300 Subject: [PATCH 77/89] fix release notes and help files of readsf~ expr mention is the 'expr' family of objects and not and not "expr~" in the release notes and fixed a typo in expr help updated readsf~ help and release notes to say it can add files form [declare] --- doc/1.manual/resources/chapter5.htm | 6 ++- doc/5.reference/expr-help.pd | 78 ++++++++++++++--------------- doc/5.reference/readsf~-help.pd | 37 +++++++------- 3 files changed, 61 insertions(+), 60 deletions(-) diff --git a/doc/1.manual/resources/chapter5.htm b/doc/1.manual/resources/chapter5.htm index 6e9c1910..c00e40ca 100644 --- a/doc/1.manual/resources/chapter5.htm +++ b/doc/1.manual/resources/chapter5.htm @@ -27,13 +27,15 @@

                        5.1. Release notes

                        ------------------ 0.55-1 ------------------------------ +

                        Shahrokh updated the "expr" family of objects and added string handling (yay!) +

                        bug fixes, notably a crasher bug when sending "open" to [readsf~] in verbose mode, but other improvements in thread safety mostly relevant to RISC architectures. +The [readsf~]'s "open" method now also searches in the canvas environment. This means +you can use paths added via [declare] (which wasn't possible before).

                        Numerous documentation improvements -

                        Updated "expr~" object from Shahrokh adding string handling (yay!) -

                        ------------------ 0.55-0 ------------------------------

                        The [osc~], [cos~] and [vcf~] objects now rely on a 2048 points diff --git a/doc/5.reference/expr-help.pd b/doc/5.reference/expr-help.pd index 3ff83021..5d497df9 100644 --- a/doc/5.reference/expr-help.pd +++ b/doc/5.reference/expr-help.pd @@ -1,4 +1,4 @@ -#N canvas 333 41 747 707 12; +#N canvas 412 76 747 707 12; #X declare -stdpath ./; #N canvas 455 177 911 525 Arrays 0; #X floatatom 123 370 4 0 9 0 - - - 0; @@ -658,8 +658,6 @@ #X symbolatom 379 617 10 0 0 0 - - - 0; #X obj 379 587 expr strpbrk("hello" \, "lx"); #X floatatom 66 632 5 0 0 0 - - - 0; -#X obj 637 119 expr symboln(4.52 \, 6 \, 3); -#X text 634 70 symboln(flt \, length \, decimal length); #X symbolatom 638 267 10 0 0 0 - - - 0; #X text 635 190 symboln(sym \, length \, sym trim length); #X obj 638 243 expr symboln("hello" \, 5 \, 3); @@ -735,46 +733,48 @@ #X symbolatom 214 292 15 0 0 0 - - - 0; #X symbolatom 344 292 15 0 0 0 - - - 0; #X symbolatom 495 292 15 0 0 0 - - - 0; -#X text 683 562 Here's a bit more complicated ecample, f 20; +#X text 683 562 Here's a bit more complicated example, f 20; +#X text 634 70 symboln(float \, length \, decimal length); +#X obj 637 119 expr symboln(4.52 \, 2 \, 3); #X connect 0 0 3 0; -#X connect 1 0 13 0; -#X connect 2 0 45 0; +#X connect 1 0 70 0; +#X connect 2 0 43 0; #X connect 3 0 5 0; #X connect 11 0 10 0; -#X connect 13 0 4 0; -#X connect 17 0 15 0; -#X connect 20 0 22 0; -#X connect 22 0 21 0; -#X connect 26 0 17 0; -#X connect 27 0 55 0; -#X connect 28 0 11 0; -#X connect 30 0 32 0; -#X connect 32 0 31 0; -#X connect 34 0 52 0; -#X connect 38 0 42 0; -#X connect 39 0 42 0; -#X connect 42 0 12 0; -#X connect 42 1 41 0; -#X connect 45 0 6 0; -#X connect 46 0 34 0; -#X connect 47 0 34 0; -#X connect 52 0 9 0; -#X connect 52 1 48 0; -#X connect 52 2 49 0; -#X connect 52 3 50 0; -#X connect 52 4 51 0; -#X connect 55 0 8 0; -#X connect 55 1 18 0; -#X connect 55 2 54 0; -#X connect 56 0 7 0; -#X connect 56 1 36 0; +#X connect 15 0 13 0; +#X connect 18 0 20 0; +#X connect 20 0 19 0; +#X connect 24 0 15 0; +#X connect 25 0 53 0; +#X connect 26 0 11 0; +#X connect 28 0 30 0; +#X connect 30 0 29 0; +#X connect 32 0 50 0; +#X connect 36 0 40 0; +#X connect 37 0 40 0; +#X connect 40 0 12 0; +#X connect 40 1 39 0; +#X connect 43 0 6 0; +#X connect 44 0 32 0; +#X connect 45 0 32 0; +#X connect 50 0 9 0; +#X connect 50 1 46 0; +#X connect 50 2 47 0; +#X connect 50 3 48 0; +#X connect 50 4 49 0; +#X connect 53 0 8 0; +#X connect 53 1 16 0; +#X connect 53 2 52 0; +#X connect 54 0 7 0; +#X connect 54 1 34 0; +#X connect 55 0 54 0; +#X connect 56 0 64 0; +#X connect 56 1 65 0; #X connect 57 0 56 0; -#X connect 58 0 66 0; -#X connect 58 1 67 0; -#X connect 59 0 58 0; -#X connect 60 0 61 0; -#X connect 61 0 68 0; -#X connect 61 1 69 0; +#X connect 58 0 59 0; +#X connect 59 0 66 0; +#X connect 59 1 67 0; +#X connect 70 0 4 0; #X restore 125 466 pd string-functions; #X restore 505 547 pd All_functions \; and operators; #N canvas 327 86 952 778 [expr] 0; diff --git a/doc/5.reference/readsf~-help.pd b/doc/5.reference/readsf~-help.pd index 2a846d34..853483fe 100644 --- a/doc/5.reference/readsf~-help.pd +++ b/doc/5.reference/readsf~-help.pd @@ -1,4 +1,4 @@ -#N canvas 340 23 705 713 12; +#N canvas 425 55 711 715 12; #X declare -stdpath ./; #X obj 503 498 print didit; #X floatatom 86 493 6 0 0 0 - - - 0; @@ -47,7 +47,6 @@ #X text 100 265 start playback; #X text 125 295 stop playback; #X text 91 11 - soundfile playback from disk; -#X obj 306 584 file which; #X text 291 229 Open takes: filename \, onset in samples \, header size to skip \, channels number \, bytes per sample and endianness., f 55; #X obj 3 670 cnv 1 695 1 empty empty empty 8 12 0 13 #000000 #000000 0; #X obj 86 466 env~; @@ -61,24 +60,24 @@ #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 389 348 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 text 21 155 The 'wave' \, 'aiff' \, 'caf' \, and 'next' formats are supported \, although only uncompressed 2- or 3-byte integer ("pcm") and 4- or 8-byte floating point samples are accepted., f 94; -#X text 476 681 updated for Pd version 0.55-0; -#X text 196 389 print info on Pd window; -#X text 56 613 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 85; +#X text 202 389 print info on Pd window; +#X text 40 548 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 89; #X obj 258 682 openpanel; #X text 21 189 HINT: The 'open' message can take "~" to define the home directory. Also note you can use [openpanel] to find sound files., f 94; -#X text 56 533 IMPORTANT: [readsf~] can find files added to the search path via preferences as usual \, but it can't find files in folders added via [declare]! In this case you can use [file which] as it can search paths added via [declare] and return the absolute path to be used with the 'open' message. See:, f 86; -#X connect 2 0 33 0; +#X text 476 681 updated for Pd version 0.55-1; +#X text 40 600 ALSO NOTE: As of Pd 0.55-1 \, [readsf~]'s "open" method searches in the canvas environment \, just like [soundfiler] and similar objects. This means you can now use paths added via [declare] (which wasn't possible before)., f 89; +#X connect 2 0 32 0; #X connect 8 0 0 0; #X connect 15 0 16 0; -#X connect 16 0 33 0; -#X connect 18 0 33 0; -#X connect 19 0 33 0; -#X connect 26 0 1 0; -#X connect 27 0 13 0; -#X connect 30 0 33 0; -#X connect 31 0 33 0; -#X connect 33 0 6 0; -#X connect 33 0 26 0; -#X connect 33 1 27 0; -#X connect 33 1 6 1; -#X connect 33 2 8 0; +#X connect 16 0 32 0; +#X connect 18 0 32 0; +#X connect 19 0 32 0; +#X connect 25 0 1 0; +#X connect 26 0 13 0; +#X connect 29 0 32 0; +#X connect 30 0 32 0; +#X connect 32 0 6 0; +#X connect 32 0 25 0; +#X connect 32 1 26 0; +#X connect 32 1 6 1; +#X connect 32 2 8 0; From 7652c332896b6a8b640f313c80adc64ad079fe51 Mon Sep 17 00:00:00 2001 From: Christof Ressi Date: Mon, 2 Sep 2024 02:27:56 +0200 Subject: [PATCH 78/89] readsf~: don't create namelist for absolute paths + remove debug printout --- src/d_soundfile.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/d_soundfile.c b/src/d_soundfile.c index ae1c53bc..5d58e033 100644 --- a/src/d_soundfile.c +++ b/src/d_soundfile.c @@ -2244,7 +2244,6 @@ static void readsf_float(t_readsf *x, t_floatarg f) static int readsf_one_iter(const char *path, t_readsf *x) { - fprintf(stderr, "%s\n", path); x->x_namelist = namelist_append(x->x_namelist, path, 0); return 1; } @@ -2281,8 +2280,10 @@ static void readsf_open(t_readsf *x, t_symbol *s, int argc, t_atom *argv) pthread_mutex_lock(&x->x_mutex); if (x->x_namelist) namelist_free(x->x_namelist), x->x_namelist = 0; - canvas_path_iterate(x->x_canvas, - (t_canvas_path_iterator)readsf_one_iter, x); + /* see open_soundfile_via_namelist() */ + if (!sys_isabsolutepath(filesym->s_name)) + canvas_path_iterate(x->x_canvas, + (t_canvas_path_iterator)readsf_one_iter, x); if (sys_verbose) /* do a fake open just for the verbose printout */ { char buf[MAXPDSTRING], *dummy; From 79305da10834f92e45912cfdf4e84040af839282 Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Thu, 5 Sep 2024 13:24:28 +0200 Subject: [PATCH 79/89] update expr to Shahrokh's 0.58-2 --- src/x_vexp.c | 50 ++--- src/x_vexp.h | 5 + src/x_vexp_fun.c | 467 ++++++++++++++++++++++++++++------------------- src/x_vexp_if.c | 145 +++++++++++---- 4 files changed, 425 insertions(+), 242 deletions(-) diff --git a/src/x_vexp.c b/src/x_vexp.c index 9a3ac1d0..85923d99 100644 --- a/src/x_vexp.c +++ b/src/x_vexp.c @@ -19,10 +19,10 @@ * - cleaned up some indentation issues * * Oct 2020, Version 0.57 - * - fixed a bug in fact() - * - fixed the bad lvalue bug - "4 + 5 = 3" was not caught before - * - fact() (factorial) now calculates and returns its value in double - * - Added mtof(), mtof(), dbtorms(), rmstodb(), powtodb(), dbtopow() + * - fixed a bug in fact() + * - fixed the bad lvalue bug - "4 + 5 = 3" was not caught before + * - fact() (factorial) now calculates and returns its value in double + * - Added mtof(), mtof(), dbtorms(), rmstodb(), powtodb(), dbtopow() * * July 2017, Version 0.55 * - The arrays now redraw after a store into one of their members @@ -833,15 +833,15 @@ ex_checklval(struct expr *e, struct ex_ex *eptr) extmp = eptr->ex_end; while (eptr->ex_type && eptr != extmp) { - if (eptr->ex_type == ET_OP && eptr->ex_op == OP_STORE) { + if (eptr->ex_type == ET_OP && eptr->ex_op == OP_STORE) { if (eptr[1].ex_type != ET_VAR && eptr[1].ex_type != ET_SI && eptr[1].ex_type != ET_TBL) { post("expr: '%s' - Bad left value: ", e->exp_string); return (1); } - } - eptr++; + } + eptr++; } return (0); } @@ -1141,17 +1141,17 @@ ex_eval(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) if (optr->ex_type == ET_VEC) { if (!(expr->exp_error & EE_BADSYM)) { expr->exp_error |= EE_BADSYM; - post_error((fts_object_t *) expr, - "expr~: '%s': cannot convert string to vector\n", - expr->exp_string); + post_error((fts_object_t *) expr, + "expr~: '%s': cannot convert string to vector\n", + expr->exp_string); post_error(expr, - "expr~: No more symbol-vector errors will be reported"); + "expr~: No more symbol-vector errors will be reported"); post_error(expr, - "expr~: till the next reset"); + "expr~: till the next reset"); } ex_mkvector(optr->ex_vec, 0, expr->exp_vsize); } else - *optr = *eptr; + *optr = *eptr; return (++eptr); case ET_II: if (eptr->ex_int == -1) { @@ -1263,20 +1263,20 @@ ex_eval(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) /* check if the symbol input is a table */ if (eptr->ex_flags & EX_F_SI_TAB) { eptr = eval_tab(expr, eptr, optr, idx); - return (eptr); + return (eptr); //return (eval_tab(expr, eptr, optr, idx)); - } + } /* it is just a symbol input */ if (optr->ex_type == ET_VEC) { if (!(expr->exp_error & EE_BADSYM)) { expr->exp_error |= EE_BADSYM; - post_error((fts_object_t *) expr, - "expr~: '%s': cannot convert string inlet to vector\n", - expr->exp_string); + post_error((fts_object_t *) expr, + "expr~: '%s': cannot convert string inlet to vector\n", + expr->exp_string); post_error(expr, - "expr~: No more symbol-vector errors will be reported"); + "expr~: No more symbol-vector errors will be reported"); post_error(expr, - "expr~: till the next reset"); + "expr~: till the next reset"); } ex_mkvector(optr->ex_vec, 0, expr->exp_vsize); return (exNULL); @@ -1623,10 +1623,16 @@ eval_var(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) } - optr->ex_type = ET_INT; - optr->ex_int = 0; if (!novar) (void)max_ex_var(expr, (t_symbol *)var, optr, idx); + else { + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, 0, expr->exp_vsize); + else { + optr->ex_type = ET_INT; + optr->ex_int = 0; + } + } return (++eptr); } diff --git a/src/x_vexp.h b/src/x_vexp.h index 5e5c6c74..f4e17508 100644 --- a/src/x_vexp.h +++ b/src/x_vexp.h @@ -13,7 +13,12 @@ #ifdef PD #include "m_pd.h" #include "s_stuff.h" +/* + * below is added to account for an anomoly in windows implementation of snprintf() + */ +#undef snprintf #define snprintf pd_snprintf + #else /* MSP */ #include "ext.h" #include "z_dsp.h" diff --git a/src/x_vexp_fun.c b/src/x_vexp_fun.c index 3904167a..467a8425 100644 --- a/src/x_vexp_fun.c +++ b/src/x_vexp_fun.c @@ -50,9 +50,9 @@ * July 2017 --sdy * * - ex_if() is reworked to only evaluate either the left or the right arg - * October 2020 --sdy - * - fact() (factorial) now calculates and returns its value in double - * - Added mtof(), mtof(), dbtorms(), rmstodb(), powtodb(), dbtopow() + * October 2020 --sdy + * - fact() (factorial) now calculates and returns its value in double + * - Added mtof(), mtof(), dbtorms(), rmstodb(), powtodb(), dbtopow() * */ @@ -155,7 +155,7 @@ static void ex_hypot(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex * static void ex_nearbyint(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); #endif -static void ex_symboln(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); +static void ex_symbol1(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); static void ex_symbol(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); static void ex_tolower(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); static void ex_tonlower(t_expr *expr, long argc, struct ex_ex *argv, struct ex_ex *optr); @@ -185,6 +185,8 @@ extern void ex_Avg(t_expr *expr, long int argc, struct ex_ex *argv, struct ex_ex *optr); extern void ex_store(t_expr *expr, long int argc, struct ex_ex *argv, struct ex_ex *optr); +extern void ex_var (t_expr *expr, long int argc, struct ex_ex *argv, + struct ex_ex *optr); extern void ex_tabread4(t_expr *expr, long int argc, struct ex_ex *argv, struct ex_ex *optr); @@ -221,12 +223,12 @@ t_ex_func ex_funcs[] = { {"ldexp", ex_ldexp, 2}, {"imodf", ex_imodf, 1}, {"modf", ex_modf, 1}, - {"mtof", ex_mtof, 1}, - {"ftom", ex_ftom, 1}, - {"dbtorms", ex_dbtorms, 1}, - {"rmstodb", ex_rmstodb, 1}, - {"dbtopow", ex_dbtopow, 1}, - {"powtodb", ex_powtodb, 1}, + {"mtof", ex_mtof, 1}, + {"ftom", ex_ftom, 1}, + {"dbtorms", ex_dbtorms, 1}, + {"rmstodb", ex_rmstodb, 1}, + {"dbtopow", ex_dbtopow, 1}, + {"powtodb", ex_powtodb, 1}, #if !defined(_MSC_VER) || (_MSC_VER >= 1700) {"asinh", ex_asinh, 1}, {"acosh", ex_acosh, 1}, @@ -247,10 +249,8 @@ t_ex_func ex_funcs[] = { {"hypot", ex_hypot, 2}, #endif /* Symbol functions */ - {"symbol", ex_symbol, 1}, - {"sym", ex_symbol, 1}, - {"symboln", ex_symboln, 3}, - {"symn", ex_symboln, 3}, + {"symbol", ex_symbol, -1}, + {"sym", ex_symbol, -1}, {"tolower", ex_tolower, 1}, {"tonlower", ex_tonlower, 2}, {"toupper", ex_toupper, 1}, @@ -265,6 +265,7 @@ t_ex_func ex_funcs[] = { {"strpbrk", ex_strpbrk, 2}, {"strspn", ex_strspn, 2}, {"strcspn", ex_strcspn, 2}, + {"var", ex_var, 1}, #ifdef PD {"size", ex_size, 1}, @@ -278,7 +279,7 @@ t_ex_func ex_funcs[] = { }; /* - * FUN_EVAL -- do type checking, evaluate a function, + * FUNC_EVAL -- do type checking, evaluate a function, * if fltret is set return float * otherwise return value based on regular typechecking, */ @@ -1393,7 +1394,7 @@ ex_makesymbol(t_expr *e, struct ex_ex *optr, size_t size) } -#define CHECK_LEFT_STR(left) \ +#define CHECK_LEFT_STR(left) \ left = argv; \ leftstr = ex_getstring(e, left); \ if (!leftstr) { \ @@ -1402,7 +1403,7 @@ ex_makesymbol(t_expr *e, struct ex_ex *optr, size_t size) return; \ } \ -#define CHECK_RIGHT_STR(right) \ +#define CHECK_RIGHT_STR(right) \ right = argv + 1; \ rightstr = ex_getstring(e, right); \ if (!rightstr) { \ @@ -1413,7 +1414,7 @@ ex_makesymbol(t_expr *e, struct ex_ex *optr, size_t size) #define CHECK_LR_STR(left, right) \ - CHECK_LEFT_STR(left) \ + CHECK_LEFT_STR(left) \ CHECK_RIGHT_STR(right) @@ -1424,7 +1425,14 @@ func(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) struct ex_ex *left = (struct ex_ex *) 0; \ struct ex_ex *right = (struct ex_ex *) 0; \ char *leftstr, *rightstr; \ - \ + struct ex_ex outval; \ + struct ex_ex *tmpoptr; \ + \ + outval.ex_type = 0; \ + outval.ex_int = 0; \ + outval.ex_flags = 0; \ + tmpoptr = &outval; \ + \ CHECK_LR_STR(left, right); /* @@ -1438,129 +1446,269 @@ func(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr)\ struct ex_ex *left = (struct ex_ex *) 0; \ struct ex_ex *right = (struct ex_ex *) 0; \ char *leftstr, *rightstr; \ - \ + struct ex_ex outval; \ + struct ex_ex *tmpoptr; \ + \ + outval.ex_type = 0; \ + outval.ex_int = 0; \ + outval.ex_flags = 0; \ + tmpoptr = &outval; \ + \ CHECK_LEFT_STR(left); /* * check to see if we need to free any buffers */ #define STRFUNC_END() \ + if (optr->ex_type == ET_VEC) { \ + switch (tmpoptr->ex_type) { \ + case ET_INT: \ + ex_mkvector(optr->ex_vec, (t_float) tmpoptr->ex_int, \ + e->exp_vsize); \ + break; \ + case ET_FLT: \ + ex_mkvector(optr->ex_vec, tmpoptr->ex_flt, \ + e->exp_vsize); \ + break; \ + case ET_SYM: \ + ex_mkvector(optr->ex_vec, 0.0, e->exp_vsize); \ + if (tmpoptr->ex_flags & EX_F_TSYM) { \ + free(tmpoptr->ex_ptr); \ + } \ + break; \ + default: \ + ex_error(e, "expr: bad return type INTERNAL ERROR", \ + e->exp_string); \ + } \ + return; \ + } \ + *optr = *tmpoptr; \ return; \ } #define EXPR_MAX_SYM_SIZE 512 /*largest symbol size, in sprintf it may be 500*/ +void +ex_var (t_expr *expr, long int argc, struct ex_ex *argv, struct ex_ex *optr) +{ + t_float retval; + + + switch(argv->ex_type) { + case ET_SYM: + if (argv->ex_flags & EX_F_TSYM) + /* + * SDY - we do not have the idx value here, so we are passing 0 + * var() cannot evaluate the sys_idx variable + */ + max_ex_var(expr, gensym(argv->ex_ptr), optr, 0); + else + max_ex_var(expr, (t_symbol *) argv->ex_ptr, optr, 0); + return; + + case ET_SI: + if (!expr->exp_var[argv->ex_int].ex_ptr) + break; + max_ex_var(expr,(t_symbol *) expr->exp_var[argv->ex_int].ex_ptr, optr, 0); + return; + + default: + ex_error(expr, "var(): argument not a string - type = %ld\n", + argv->ex_type); + break; + } + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, 0.0, expr->exp_vsize); + else { + optr->ex_type = ET_INT; + optr->ex_int = 0; + } + return; + +} + + static void -ex_symbol(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) +ex_symbol1(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) { struct ex_ex *left; - /* we will not realloc to exact size for efficiecy */ - int i; - char *strp; /* string pointer */ + /* we will not realloc to exact size for efficiecy */ + int i; + char *strp; /* string pointer */ left = argv; switch (left->ex_type) { case ET_SYM: - *optr = *left; - left->ex_type = ET_INT; - left->ex_flags = 0; - left->ex_ptr = (char *)0; - return; - - case ET_SI: - strp = ex_getstring(e, left); - if (!strp) { - if (!ex_makesymbol(e, optr, 1)) - goto goterror; - *optr->ex_ptr = 0; - return; - } - if (!ex_makesymbol(e, optr, strlen(strp))) - goto goterror; - strcpy (optr->ex_ptr, strp); - return; - - - case ET_INT: - if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) + *optr = *left; + left->ex_type = ET_INT; + left->ex_flags = 0; + left->ex_ptr = (char *)0; + return; + + case ET_SI: + strp = ex_getstring(e, left); + if (!strp) { + if (!ex_makesymbol(e, optr, 1)) + goto goterror; + *optr->ex_ptr = 0; + return; + } + if (!ex_makesymbol(e, optr, strlen(strp))) + goto goterror; + strcpy (optr->ex_ptr, strp); + return; + + + case ET_INT: + if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) goto goterror; - snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, "%ld", left->ex_int); - return; + snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, "%ld", left->ex_int); + return; - case ET_FLT: - if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) + case ET_FLT: + if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) goto goterror; - snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, "%.6f", left->ex_flt); - for (i = strlen(optr->ex_ptr) - 1; i && optr->ex_ptr[i] == '0'; i--) - if (optr->ex_ptr[i-1] != '.') - optr->ex_ptr[i] = 0; - return; - - default: - optr->ex_type = ET_INT; - optr->ex_int = 0; - post_error((fts_object_t *) e, "expr: bad argument to tosym/sym() - '%s'", e->exp_string); - } + snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, "%.6f", left->ex_flt); + for (i = strlen(optr->ex_ptr) - 1; i && optr->ex_ptr[i] == '0'; i--) + if (optr->ex_ptr[i-1] != '.') + optr->ex_ptr[i] = 0; + return; + + default: + optr->ex_type = ET_INT; + optr->ex_int = 0; + post_error((fts_object_t *) e, "expr: bad argument to tosym/sym() - '%s'", e->exp_string); + } goterror: - optr->ex_type = ET_INT; - optr->ex_int = 0; - return; + optr->ex_type = ET_INT; + optr->ex_int = 0; + return; } static void -ex_symboln(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) +ex_symbol(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) { struct ex_ex *left; - char format[25]; /* the largest int in a 64 bit is 20 characters */ - int i, num1, num2; - char *strp; /* string pointer */ + char format[25]; /* the largest int in a 64 bit is 20 characters */ + int i, num1, num2; + char *strp; /* string pointer */ + + if (!argc) { + ex_makesymbol(e, optr, 1); + return; + } + if (argc == 1) + return (ex_symbol1(e, argc, argv, optr)); + + if (argc != 2 && argc != 3) { + optr->ex_type = ET_INT; + optr->ex_int = 0; + ex_error(e, "expr: symbol/sym takes no more than 3 arguments", e->exp_string); + return; + } left = argv; - num1 = ex_getnumber(e, argv + 1); - num2 = ex_getnumber(e, argv + 2); + num1 = ex_getnumber(e, argv + 1); + if (argc == 2) + num2 = -1; + else + num2 = ex_getnumber(e, argv + 2); switch (left->ex_type) { case ET_SYM: - case ET_SI: - strp = ex_getstring(e, left); - if (!strp) { - if (!ex_makesymbol(e, optr, 1)) - goto goterror; - *optr->ex_ptr = 0; - return; - } - if (!ex_makesymbol(e, optr, strlen(strp))) - goto goterror; - snprintf(format, 25, "%%%d.%ds", num1, num2); - snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, strp); - return; - - case ET_INT: - if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) + case ET_SI: + strp = ex_getstring(e, left); + if (!strp) { + if (!ex_makesymbol(e, optr, 1)) + goto goterror; + *optr->ex_ptr = 0; + return; + } + if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) + goto goterror; + if (num2 == -1) + snprintf(format, 25, "%%.%ds", num1); + else + snprintf(format, 25, "%%%d.%ds", num2, num1); + snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, strp); + return; + + case ET_INT: + if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) goto goterror; - snprintf(format, 25, "%%%dld", num1); - snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, left->ex_int); - return; + snprintf(format, 25, "%%.%dld", num1); + snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, left->ex_int); + return; - case ET_FLT: - if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) + case ET_FLT: + if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) goto goterror; - snprintf(format, 25, "%%%d.%df", num1, num2); - snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, left->ex_flt); - return; + if (num2 == -1) + snprintf(format, 25, "%%.%df", num1); + else + snprintf(format, 25, "%%%d.%df", num2, num1); + snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, left->ex_flt); + return; - default: - optr->ex_type = ET_INT; - optr->ex_int = 0; - post_error((fts_object_t *) e, "expr: bad argument to tosym/sym() - '%s'", e->exp_string); - } + default: + optr->ex_type = ET_INT; + optr->ex_int = 0; + post_error((fts_object_t *) e, "expr: bad argument to tosym/sym() - '%s'", e->exp_string); + } goterror: - optr->ex_type = ET_INT; - optr->ex_int = 0; - return; + optr->ex_type = ET_INT; + optr->ex_int = 0; + return; } +/* + * ex_strcat - strcat() takes unlimited number of arguments + */ +static void +ex_strcat(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) +{ + char *p; /* string pointer */ + int i; + int size = 0; + + /* find the size */ + for (i = 0; i < argc; i ++) { + p = ex_getstring(e, &argv[i]); + if (!p) { + optr->ex_type = ET_INT; + optr->ex_int = 0; + return; + } + size += strlen(p); + } + + if (!ex_makesymbol(e, optr, size)) { + optr->ex_type = ET_INT; + optr->ex_int = 0; + return; + } + + for (i = 0; i < argc; i ++) + strcat(optr->ex_ptr, ex_getstring(e, &argv[i])); + return; +} + +/* + * ex_strncat - implement strncat() + */ +STRFUNC_DEF(ex_strncat) + int num, size; + num = ex_getnumber(e, argv + 2); + size = min(num, strlen(rightstr)); + + if (!ex_makesymbol(e, tmpoptr, size)) + return; + + strcat(tmpoptr->ex_ptr, leftstr); + strncat(tmpoptr->ex_ptr, rightstr, num); + +STRFUNC_END() /* * ex_tolower - replace all characters of the string with @@ -1570,11 +1718,11 @@ STRSINGLEFUNC_DEF(ex_tolower) int i, size; size = strlen(leftstr); - if (!ex_makesymbol(e, optr, size)) + if (!ex_makesymbol(e, tmpoptr, size)) return; - strcat(optr->ex_ptr, leftstr); + strcat(tmpoptr->ex_ptr, leftstr); for (i = 0; i < size +1; i++) - optr->ex_ptr[i] = tolower(optr->ex_ptr[i]); + tmpoptr->ex_ptr[i] = tolower(tmpoptr->ex_ptr[i]); STRFUNC_END() /* @@ -1585,13 +1733,13 @@ STRSINGLEFUNC_DEF(ex_tonlower) int i, size, num; size = strlen(leftstr); - if (!ex_makesymbol(e, optr, size)) + if (!ex_makesymbol(e, tmpoptr, size)) return; num = ex_getnumber(e, argv + 1); - strcat(optr->ex_ptr, leftstr); + strcat(tmpoptr->ex_ptr, leftstr); num = min (size, num); for (i = 0; i < num; i++) - optr->ex_ptr[i] = tolower(optr->ex_ptr[i]); + tmpoptr->ex_ptr[i] = tolower(tmpoptr->ex_ptr[i]); STRFUNC_END() @@ -1604,11 +1752,11 @@ STRSINGLEFUNC_DEF(ex_toupper) int i, size; size = strlen(leftstr); - if (!ex_makesymbol(e, optr, size)) + if (!ex_makesymbol(e, tmpoptr, size)) return; - strcat(optr->ex_ptr, leftstr); + strcat(tmpoptr->ex_ptr, leftstr); for (i = 0; i < size +1; i++) - optr->ex_ptr[i] = toupper(optr->ex_ptr[i]); + tmpoptr->ex_ptr[i] = toupper(tmpoptr->ex_ptr[i]); STRFUNC_END() /* @@ -1619,80 +1767,29 @@ STRSINGLEFUNC_DEF(ex_tonupper) int i, size, num; size = strlen(leftstr); - if (!ex_makesymbol(e, optr, size)) + if (!ex_makesymbol(e, tmpoptr, size)) return; num = ex_getnumber(e, argv + 1); - strcat(optr->ex_ptr, leftstr); + strcat(tmpoptr->ex_ptr, leftstr); num = min (size, num); for (i = 0; i < num; i++) - optr->ex_ptr[i] = toupper(optr->ex_ptr[i]); + tmpoptr->ex_ptr[i] = toupper(tmpoptr->ex_ptr[i]); STRFUNC_END() /* * ex_strlen - implement strlen() */ STRSINGLEFUNC_DEF(ex_strlen) - optr->ex_type = ET_INT; - optr->ex_int = strlen(leftstr); -STRFUNC_END() - - -/* - * ex_strcat - strcat() takes unlimited number of arguments - */ -static void -ex_strcat(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) -{ - char *p; /* string pointer */ - int i; - int size = 0; - - /* find the size */ - for (i = 0; i < argc; i ++) { - p = ex_getstring(e, &argv[i]); - if (!p) { - optr->ex_type = ET_INT; - optr->ex_int = 0; - return; - } - size += strlen(p); - } - - if (!ex_makesymbol(e, optr, size)) { - optr->ex_type = ET_INT; - optr->ex_int = 0; - return; - } - - for (i = 0; i < argc; i ++) - strcat(optr->ex_ptr, ex_getstring(e, &argv[i])); - return; -} - - - -/* - * ex_strncat - implement strncat() - */ -STRFUNC_DEF(ex_strncat) - int num, size; - num = ex_getnumber(e, argv + 2); - size = min(num, strlen(rightstr)); - - if (!ex_makesymbol(e, optr, size)) - return; - - strcat(optr->ex_ptr, leftstr); - strncat(optr->ex_ptr, rightstr, num); - + tmpoptr->ex_type = ET_INT; + tmpoptr->ex_int = strlen(leftstr); STRFUNC_END() /* * ex_strcmp - implement strcmp() */ STRFUNC_DEF(ex_strcmp) - optr->ex_type = ET_INT; - optr->ex_int = strcmp(leftstr, rightstr); + tmpoptr->ex_type = ET_INT; + tmpoptr->ex_int = strcmp(leftstr, rightstr); STRFUNC_END() /* @@ -1703,16 +1800,16 @@ STRFUNC_DEF(ex_strncmp) num = ex_getnumber(e, argv + 2); - optr->ex_type = ET_INT; - optr->ex_int = strncmp(leftstr, rightstr, num); + tmpoptr->ex_type = ET_INT; + tmpoptr->ex_int = strncmp(leftstr, rightstr, num); STRFUNC_END() /* * ex_strcasecmp - implement strcasecmp() */ STRFUNC_DEF(ex_strcasecmp) - optr->ex_type = ET_INT; - optr->ex_int = strcasecmp(leftstr, rightstr); + tmpoptr->ex_type = ET_INT; + tmpoptr->ex_int = strcasecmp(leftstr, rightstr); STRFUNC_END() /* @@ -1722,8 +1819,8 @@ STRFUNC_DEF(ex_strncasecmp) int num; num = ex_getnumber(e, argv + 2); - optr->ex_type = ET_INT; - optr->ex_int = strncasecmp(leftstr, rightstr, num); + tmpoptr->ex_type = ET_INT; + tmpoptr->ex_int = strncasecmp(leftstr, rightstr, num); STRFUNC_END() @@ -1736,21 +1833,25 @@ STRFUNC_DEF(ex_strpbrk) result = strpbrk(leftstr, rightstr); if (!result) { - optr->ex_type = ET_INT; - optr->ex_int = 0; + /* + * strpbrk return NULL and not a pointer to an empty string + * this can be quite cumbersome in Pd, thus, when no character is found + * we turn a pointer to an empty (NULL) string + */ + ex_makesymbol(e, tmpoptr, 1); return; } - if (!ex_makesymbol(e, optr, strlen(result) + 1)) + if (!ex_makesymbol(e, tmpoptr, strlen(result) + 1)) return; - strcpy(optr->ex_ptr, result); + strcpy(tmpoptr->ex_ptr, result); STRFUNC_END() /* * ex_strspn - implement strspn() */ STRFUNC_DEF(ex_strspn) - optr->ex_type = ET_INT; - optr->ex_int = strspn(leftstr, rightstr); + tmpoptr->ex_type = ET_INT; + tmpoptr->ex_int = strspn(leftstr, rightstr); STRFUNC_END() @@ -1758,8 +1859,8 @@ STRFUNC_END() * ex_strcspn - implement strcspn() */ STRFUNC_DEF(ex_strcspn) - optr->ex_type = ET_INT; - optr->ex_int = strcspn(leftstr, rightstr); + tmpoptr->ex_type = ET_INT; + tmpoptr->ex_int = strcspn(leftstr, rightstr); STRFUNC_END() diff --git a/src/x_vexp_if.c b/src/x_vexp_if.c index 82606675..0c9be074 100644 --- a/src/x_vexp_if.c +++ b/src/x_vexp_if.c @@ -466,9 +466,9 @@ expr_perform(t_int *w) * inputs */ if ( x->exp_nexpr == 1) { - x->exp_res[0].ex_type = ET_VEC; + x->exp_res[0].ex_type = ET_VEC; ex_eval(x, x->exp_stack[0], &x->exp_res[0], 0); - } else { + } else { res.ex_type = ET_VEC; for (i = 0; i < x->exp_nexpr; i++) { res.ex_vec = x->exp_tmpres[i]; @@ -1263,17 +1263,40 @@ max_ex_tab_store(struct expr *expr, t_symbol *s, struct ex_ex *arg, int max_ex_var(struct expr *expr, t_symbol *var, struct ex_ex *optr, int idx) { - optr->ex_type = ET_FLT; + t_float value; if (!strcmp(var->s_name, "sys_idx")) { - optr->ex_flt = idx; + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, (t_float) idx, expr->exp_vsize); + else { + optr->ex_int = idx; + optr->ex_type = ET_INT; + } return (0); } - if (value_getfloat(var, &(optr->ex_flt))) { - optr->ex_type = ET_FLT; - optr->ex_flt = 0; - pd_error(expr, "no such var '%s'", var->s_name); + if (value_getfloat(var, &value)) { + if (!(expr->exp_error & EE_NOVAR)) { + ex_error(expr, "no such var '%s'", var->s_name); + if (!IS_EXPR(expr)) { + post("expr: no more var errors will be reported"); + post("expr: till the next reset"); + expr->exp_error |= EE_NOVAR; + } + } + + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, 0.0, expr->exp_vsize); + else { + optr->ex_int = 0; + optr->ex_type = ET_INT; + } return (1); } + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, value, expr->exp_vsize); + else { + optr->ex_flt = value; + optr->ex_type = ET_FLT; + } return (0); } @@ -1325,8 +1348,12 @@ ex_size(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) ISTABLE(e, s, garray, size, wvec); - optr->ex_type = ET_INT; - optr->ex_int = size; + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, (t_float) size, e->exp_vsize); + else { + optr->ex_type = ET_INT; + optr->ex_int = size; + } } /* @@ -1348,8 +1375,12 @@ ex_sum(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) for (indx = 0, sum = 0; indx < size; indx++) sum += wvec[indx].w_float; - optr->ex_type = ET_FLT; - optr->ex_flt = sum; + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, (t_float) size, e->exp_vsize); + else { + optr->ex_type = ET_FLT; + optr->ex_flt = sum; + } } @@ -1377,9 +1408,13 @@ ex_Sum(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) n1 = argv->ex_flt; break; default: - post("expr: Sum: boundaries have to be fix values\n"); - optr->ex_type = ET_INT; - optr->ex_int = 0; + ex_error(e, "expr: Sum: boundaries have to be fix values\n"); + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, 0.0, e->exp_vsize); + else { + optr->ex_type = ET_INT; + optr->ex_int = 0; + } return; } if (n1 < 0) @@ -1393,9 +1428,13 @@ ex_Sum(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) n2 = argv->ex_flt; break; default: - post("expr: Sum: boundaries have to be fix values\n"); - optr->ex_type = ET_INT; - optr->ex_int = 0; + ex_error(e, "expr: Sum: boundaries have to be fix values\n"); + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, 0.0, e->exp_vsize); + else { + optr->ex_type = ET_INT; + optr->ex_int = 0; + } return; } if (n2 > size) @@ -1405,8 +1444,12 @@ ex_Sum(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) if (indx >= 0 && indx < size) sum += wvec[indx].w_float; - optr->ex_type = ET_FLT; - optr->ex_flt = sum; + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, sum, e->exp_vsize); + else { + optr->ex_type = ET_FLT; + optr->ex_flt = sum; + } } /* @@ -1428,8 +1471,12 @@ ex_avg(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) for (indx = 0, sum = 0; indx < size; indx++) sum += wvec[indx].w_float; - optr->ex_type = ET_FLT; - optr->ex_flt = sum / size; + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, sum / size, e->exp_vsize); + else { + optr->ex_type = ET_FLT; + optr->ex_flt = sum / size; + } } @@ -1457,9 +1504,13 @@ ex_Avg(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) n1 = argv->ex_flt; break; default: - post("expr: Avg: boundaries have to be fix values\n"); - optr->ex_type = ET_INT; - optr->ex_int = 0; + ex_error(e, "expr: Avg: boundaries have to be fix values\n"); + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, 0.0, e->exp_vsize); + else { + optr->ex_type = ET_INT; + optr->ex_int = 0; + } return; } if (n1 < 0) @@ -1473,9 +1524,14 @@ ex_Avg(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) n2 = argv->ex_flt; break; default: - post("expr: Avg: boundaries have to be fix values\n"); - optr->ex_type = ET_INT; - optr->ex_int = 0; return; + ex_error(e, "expr: Avg: boundaries have to be fix values\n"); + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, 0.0, e->exp_vsize); + else { + optr->ex_type = ET_INT; + optr->ex_int = 0; + } + return; } if (n2 >= size) n2 = size - 1; @@ -1484,8 +1540,12 @@ ex_Avg(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) if (indx >= 0 && indx < size) sum += wvec[indx].w_float; - optr->ex_type = ET_FLT; - optr->ex_flt = sum / (n2 - n1 + 1); + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, sum / (n2 - n1 + 1), e->exp_vsize); + else { + optr->ex_type = ET_FLT; + optr->ex_flt = sum / (n2 - n1 + 1); + } } /* @@ -1496,7 +1556,6 @@ max_ex_var_store(struct expr *expr, t_symbol * var, struct ex_ex *eptr, struct e { t_float value = 0.; - *optr = *eptr; switch (eptr->ex_type) { case ET_INT: value = eptr->ex_int; @@ -1505,18 +1564,30 @@ max_ex_var_store(struct expr *expr, t_symbol * var, struct ex_ex *eptr, struct e value = eptr->ex_flt; break; default: - post("bad right value - '%s'\n", expr->exp_string); - optr->ex_int = 0; - optr->ex_type = ET_INT; + ex_error(expr, "bad right value - '%s'\n", expr->exp_string); + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, 0.0, expr->exp_vsize); + else { + optr->ex_int = 0; + optr->ex_type = ET_INT; + } return (1); } if (value_setfloat(var, value)) { - optr->ex_int = 0; - optr->ex_type = ET_INT; - pd_error(expr, "no such var '%s'", var->s_name); + ex_error(expr, "no such var '%s'", var->s_name); + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, 0.0, expr->exp_vsize); + else { + optr->ex_type = ET_INT; + optr->ex_int = 0; + } return (1); } + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, value, expr->exp_vsize); + else + *optr = *eptr; return (0); } From 24749bd52faac415a0ae38f8d9b0ffd4d847910d Mon Sep 17 00:00:00 2001 From: porres Date: Thu, 5 Sep 2024 08:27:20 -0400 Subject: [PATCH 80/89] Update expr-help.pd updates to the expr help file according to last changes in the code --- doc/5.reference/expr-help.pd | 357 +++++++++++++++++++++-------------- 1 file changed, 218 insertions(+), 139 deletions(-) diff --git a/doc/5.reference/expr-help.pd b/doc/5.reference/expr-help.pd index 5d497df9..4e111a15 100644 --- a/doc/5.reference/expr-help.pd +++ b/doc/5.reference/expr-help.pd @@ -1,9 +1,9 @@ #N canvas 412 76 747 707 12; #X declare -stdpath ./; #N canvas 455 177 911 525 Arrays 0; -#X floatatom 123 370 4 0 9 0 - - - 0; -#X floatatom 123 427 10 0 0 0 - - - 0; -#X obj 123 399 expr $s2[$f1]; +#X floatatom 123 393 4 0 9 0 - - - 0; +#X floatatom 123 457 10 0 0 0 - - - 0; +#X obj 123 429 expr $s2[$f1]; #X floatatom 112 94 5 0 9 0 - - - 0; #X floatatom 112 170 9 0 0 0 - - - 0; #X text 55 56 For instance:; @@ -28,14 +28,16 @@ #X restore 576 29 graph; #X text 48 17 [expr] \, [expr~] and [fexpr~] can read values from arrays (without interpolation). The syntax is arrayname[index].; #X text 516 325 Even though you can also use arrays in [expr~] and [fexpr~]. They cannot write values to arrays and the index values cannot be audio variables (just either '$i#' or '$f#')., f 39; +#X symbolatom 211 396 10 0 0 0 - - - 0; #X connect 0 0 2 0; #X connect 2 0 1 0; #X connect 3 0 12 0; #X connect 6 0 11 0; #X connect 7 0 13 0; -#X connect 11 0 2 1; +#X connect 11 0 23 0; #X connect 12 0 4 0; #X connect 16 0 7 0; +#X connect 23 0 2 1; #X restore 505 495 pd Arrays; #X text 88 499 Basic examples:; #X text 429 518 Further details:, f 8; @@ -90,7 +92,7 @@ #X text 8 607 see also:; #X obj 117 667 block~; #X obj 169 667 value; -#N canvas 767 72 513 543 All_functions 0; +#N canvas 765 70 496 552 All_functions 0; #N canvas 497 97 374 326 Arithmetic-operators 0; #X obj 57 90 expr $f1 + 4; #X floatatom 57 63 5 0 0 0 - - - 0; @@ -203,8 +205,8 @@ #X floatatom 145 164 8 0 0 0 - - - 0; #X floatatom 228 164 4 0 0 0 - - - 0; #X obj 63 102 expr Sum("table" \, 3 \, 9) \; sum("table") \; size("table"); -#X msg 395 403 symbol table; -#X floatatom 395 466 5 0 0 0 - - - 0; +#X msg 402 413 symbol table; +#X floatatom 402 476 5 0 0 0 - - - 0; #X text 54 187 Sums a range of indexes, f 8; #X text 143 189 Sums all indexes, f 8; #X text 225 189 Gives array size, f 5; @@ -226,8 +228,8 @@ #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 338 87 graph; -#X obj 395 433 expr size($s1) \;; -#X text 343 248 You can use a symbol type to specify the array name bia the inlet. Up to [expr] version 0.57 symbol types had to be put in double quotes (as in "$s1"). In [expr] versions 0.58 and up this is no longer the case but both methods will work., f 27; +#X obj 402 443 expr size($s1) \;; +#X text 343 248 You can use a symbol type to specify the array name via the inlet. Up to [expr] version 0.57 symbol types had to be put in double quotes (as in "$s1"). In [expr] versions 0.58 and up this has been deprecated and is no longer the case. It still works but a warning is given for you to remove the quotes., f 32; #X connect 3 0 0 0; #X connect 3 1 1 0; #X connect 3 2 2 0; @@ -645,12 +647,10 @@ #X connect 25 0 23 0; #X restore 125 166 pd Relational-operators; #N canvas 236 61 926 686 string-functions 0; -#X obj 312 90 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X obj 637 94 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X obj 342 90 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X obj 49 114 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X obj 312 121 expr symbol(4.52); -#X symbolatom 637 154 10 0 0 0 - - - 0; -#X symbolatom 312 145 10 0 0 0 - - - 0; +#X obj 342 121 expr symbol(4.52); +#X symbolatom 342 145 10 0 0 0 - - - 0; #X symbolatom 49 170 13 0 0 0 - - - 0; #X floatatom 386 446 5 0 0 0 - - - 0; #X symbolatom 48 443 15 0 0 0 - - - 0; @@ -658,25 +658,20 @@ #X symbolatom 379 617 10 0 0 0 - - - 0; #X obj 379 587 expr strpbrk("hello" \, "lx"); #X floatatom 66 632 5 0 0 0 - - - 0; -#X symbolatom 638 267 10 0 0 0 - - - 0; -#X text 635 190 symboln(sym \, length \, sym trim length); -#X obj 638 243 expr symboln("hello" \, 5 \, 3); #X symbolatom 176 482 20 0 0 0 - - - 0; -#X text 666 219 for symbols; #X obj 200 114 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X symbolatom 200 170 10 0 0 0 - - - 0; #X obj 200 142 expr "\$0-x"; -#X text 345 83 turn a float into a symbol, f 13; +#X text 375 83 turn a float into a symbol, f 13; #X text 69 67 A string in quotes is output as a symbol., f 21; #X text 85 217 turn upper case to lower case; -#X obj 638 218 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X obj 48 349 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X obj 379 548 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; #X text 74 350 concatenate strings; -#X obj 456 96 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; -#X symbolatom 456 146 10 0 0 0 - - - 0; -#X obj 456 121 expr sym(\$0); -#X text 485 98 abbreviation; +#X obj 516 96 bng 19 250 50 0 empty empty empty 0 -10 0 12 #dfdfdf #000000 #000000; +#X symbolatom 516 146 10 0 0 0 - - - 0; +#X obj 516 121 expr sym(\$0); +#X text 545 98 abbreviation; #X symbolatom 638 372 10 0 0 0 - - - 0; #X text 769 325 functions to compare strings, f 15; #X floatatom 502 444 5 0 0 0 - - - 0; @@ -686,7 +681,6 @@ #X text 404 538 return string from found character, f 18; #X floatatom 231 632 5 0 0 0 - - - 0; #X obj 66 586 expr strcspn($s1 \, "lg") \; strspn($s1 \, "heban"); -#X text 663 93 for floats; #X text 171 14 String Functions: for more info see the HTML reference (or C language manuals), f 79; #X obj 49 142 expr "hello world"; #X msg 638 316 symbol hello; @@ -734,47 +728,122 @@ #X symbolatom 344 292 15 0 0 0 - - - 0; #X symbolatom 495 292 15 0 0 0 - - - 0; #X text 683 562 Here's a bit more complicated example, f 20; -#X text 634 70 symboln(float \, length \, decimal length); -#X obj 637 119 expr symboln(4.52 \, 2 \, 3); -#X connect 0 0 3 0; -#X connect 1 0 70 0; -#X connect 2 0 43 0; -#X connect 3 0 5 0; -#X connect 11 0 10 0; -#X connect 15 0 13 0; -#X connect 18 0 20 0; -#X connect 20 0 19 0; -#X connect 24 0 15 0; -#X connect 25 0 53 0; -#X connect 26 0 11 0; -#X connect 28 0 30 0; -#X connect 30 0 29 0; -#X connect 32 0 50 0; -#X connect 36 0 40 0; -#X connect 37 0 40 0; -#X connect 40 0 12 0; -#X connect 40 1 39 0; -#X connect 43 0 6 0; -#X connect 44 0 32 0; -#X connect 45 0 32 0; -#X connect 50 0 9 0; -#X connect 50 1 46 0; -#X connect 50 2 47 0; -#X connect 50 3 48 0; -#X connect 50 4 49 0; -#X connect 53 0 8 0; -#X connect 53 1 16 0; -#X connect 53 2 52 0; -#X connect 54 0 7 0; -#X connect 54 1 34 0; -#X connect 55 0 54 0; -#X connect 56 0 64 0; -#X connect 56 1 65 0; -#X connect 57 0 56 0; -#X connect 58 0 59 0; -#X connect 59 0 66 0; -#X connect 59 1 67 0; -#X connect 70 0 4 0; +#X text 682 98 symbol() takes up to 3 arguments \, see details below, f 21; +#N canvas 234 270 1073 580 symbol() 0; +#X symbolatom 55 232 8 0 0 0 - - - 0; +#X symbolatom 350 434 10 0 0 0 - - - 0; +#X text 108 168 symboln(flt \, decimal length); +#X symbolatom 826 241 10 0 0 0 - - - 0; +#X symbolatom 162 434 10 0 0 0 - - - 0; +#X obj 54 197 expr symbol(4.52 \, $i1); +#X msg 45 62 5; +#X msg 55 87 3; +#X msg 64 112 1; +#X msg 72 137 0; +#X floatatom 55 172 3 0 0 0 - - - 0; +#X msg 347 158 4.52; +#X symbolatom 347 215 5 0 0 0 - - - 0; +#X obj 347 186 makefilename %.0f; +#X msg 485 158 4.52; +#X symbolatom 485 215 6 0 0 0 - - - 0; +#X obj 485 186 makefilename %.3f; +#X text 122 62 No arguments will give you a null symbol \, a single argument is useful to turn a float into a symbol as seen in the parent example. For floats \, a second argument sets the decimal length. This is like setting 'n' in the %.nf syntax of sprintf()., f 66; +#X text 396 140 see also:; +#X text 126 287 For ints and symbols \, 2 arguments is like setting 'n' in %.nd and %.ns respectively., f 51; +#X obj 162 399 expr symbol($i1 \, 3); +#X floatatom 140 353 5 0 0 0 - - - 0; +#X symbolatom 330 513 6 0 0 0 - - - 0; +#X obj 330 478 makefilename %.4s; +#X msg 330 353 symbol hello; +#X obj 350 399 expr symbol($s1 \, 4); +#X symbolatom 140 513 10 0 0 0 - - - 0; +#X obj 140 478 makefilename %.3d; +#X text 641 61 3 arguments produces a symbol from string/symbol \, int \, float \, according to the %m.ns \, %m.nd \, %m.nf syntax in sprintf(); +#X obj 826 206 expr symbol(4.52 \, 2 \, 5); +#X obj 808 274 makefilename %5.2f; +#X msg 808 169 4.52; +#X symbolatom 808 309 10 0 0 0 - - - 0; +#X symbolatom 820 436 10 0 0 0 - - - 0; +#X symbolatom 802 504 10 0 0 0 - - - 0; +#X msg 802 364 symbol hello; +#X obj 820 401 expr symbol($s1 \, 3 \, 5); +#X obj 802 469 makefilename %5.3s; +#X floatatom 585 342 0 0 0 0 - - - 0; +#X symbolatom 605 407 12 0 0 0 - - - 0; +#X msg 585 285 1; +#X msg 547 285 10; +#X symbolatom 585 493 10 0 0 0 - - - 0; +#X obj 605 375 makefilename %5.3d; +#X obj 585 458 expr symbol($i1 \, 3 \, 5); +#X text 646 287 BUG; +#X connect 5 0 0 0; +#X connect 6 0 10 0; +#X connect 7 0 10 0; +#X connect 8 0 10 0; +#X connect 9 0 10 0; +#X connect 10 0 5 0; +#X connect 11 0 13 0; +#X connect 13 0 12 0; +#X connect 14 0 16 0; +#X connect 16 0 15 0; +#X connect 20 0 4 0; +#X connect 21 0 20 0; +#X connect 21 0 27 0; +#X connect 23 0 22 0; +#X connect 24 0 23 0; +#X connect 24 0 25 0; +#X connect 25 0 1 0; +#X connect 27 0 26 0; +#X connect 29 0 3 0; +#X connect 30 0 32 0; +#X connect 31 0 30 0; +#X connect 31 0 29 0; +#X connect 35 0 36 0; +#X connect 35 0 37 0; +#X connect 36 0 33 0; +#X connect 37 0 34 0; +#X connect 38 0 43 0; +#X connect 38 0 44 0; +#X connect 40 0 38 0; +#X connect 41 0 38 0; +#X connect 43 0 39 0; +#X connect 44 0 42 0; +#X restore 719 157 pd symbol(); +#X connect 0 0 2 0; +#X connect 1 0 35 0; +#X connect 2 0 3 0; +#X connect 9 0 8 0; +#X connect 12 0 14 0; +#X connect 14 0 13 0; +#X connect 18 0 45 0; +#X connect 19 0 9 0; +#X connect 21 0 23 0; +#X connect 23 0 22 0; +#X connect 25 0 42 0; +#X connect 29 0 33 0; +#X connect 30 0 33 0; +#X connect 33 0 10 0; +#X connect 33 1 32 0; +#X connect 35 0 4 0; +#X connect 36 0 25 0; +#X connect 37 0 25 0; +#X connect 42 0 7 0; +#X connect 42 1 38 0; +#X connect 42 2 39 0; +#X connect 42 3 40 0; +#X connect 42 4 41 0; +#X connect 45 0 6 0; +#X connect 45 1 11 0; +#X connect 45 2 44 0; +#X connect 46 0 5 0; +#X connect 46 1 27 0; +#X connect 47 0 46 0; +#X connect 48 0 56 0; +#X connect 48 1 57 0; +#X connect 49 0 48 0; +#X connect 50 0 51 0; +#X connect 51 0 58 0; +#X connect 51 1 59 0; #X restore 125 466 pd string-functions; #X restore 505 547 pd All_functions \; and operators; #N canvas 327 86 952 778 [expr] 0; @@ -833,8 +902,8 @@ #X symbolatom 231 703 10 0 0 0 - - - 0; #X msg 143 618 symbol world; #X text 335 648 Symbol strings are also supported in [expr] \, which can also output symbols. You can define a symbol string if it's inside quotes., f 75; -#X text 335 682 If not inside quotes \, symbols will be either treated as variable names defined in [value] objects or as array names if you use index values inside brackets (see [pd [value] and [pd Arrays] in the parent patch for details). There are also functions for manipulating strings (see [pd All_functions \; and operators] in the parent as well)., f 75; #X text 259 653 <---------; +#X text 335 682 If not inside quotes \, symbols will be either treated as variable names (defined in [value] objects) or as array names (if you use index values inside brackets \, more info on both cases in [pd [value] and [pd Arrays] in the parent patch). There are also functions for manipulating strings (see [pd All_functions] in the parent as well)., f 75; #X connect 0 0 1 0; #X connect 4 0 10 0; #X connect 7 0 6 0; @@ -1139,72 +1208,6 @@ #X obj 367 608 >; #X text 102 522 (click on the subpatches to open them), f 13; #X obj 215 667 random; -#N canvas 485 110 872 635 [value] 0; -#X floatatom 596 202 5 0 0 0 - - - 0; -#X obj 596 137 until; -#X msg 719 138 0; -#X obj 719 168 v i; -#X obj 596 169 expr i = i + 1; -#X msg 596 72 10; -#X obj 596 229 print; -#X obj 261 63 loadbang; -#X obj 221 176 value a; -#X obj 261 149 value b; -#X obj 304 123 value c; -#X obj 91 337 expr (a + b) / c; -#X floatatom 91 371 5 0 0 0 - - - 0; -#X obj 596 103 trigger float bang; -#X obj 697 288 expr i * 2 \; i = i + 1; -#X floatatom 697 334 5 0 0 0 - - - 0; -#X floatatom 771 335 5 0 0 0 - - - 0; -#X text 33 233 All you have to do is just use the variable name into the expression:, f 27; -#X obj 90 422 expr~ (a + b) / c; -#X obj 90 453 print~; -#X msg 221 97 5; -#X msg 261 97 3; -#X msg 304 97 2.5; -#X obj 91 533 print~; -#X obj 91 502 fexpr~ (a + b) / c; -#X obj 576 504 v last; -#X obj 450 535 fexpr~ last = $x1[-1] \; $x1[0] - last; -#X obj 601 590 print~; -#X obj 450 504 phasor~ 1000; -#X text 22 15 [expr] \, [expr~] and [fexpr~] can access variables set into [value] objects.; -#X text 471 14 It is also possible to assign values to variables inside the expr family of objects with "=" (a.k.a the "store function")., f 51; -#X text 294 395 You can also assign variables values in [expr~] and [fexpr~]. But it is not pertinent to do this in [expr~] because it deals with whole signal vectors and not single values. As for [fexpr~] \, note that they're evaluated in from top to bottom instead. This means you need to update a variable and call it in the below expression \, check the following example:, f 75; -#X obj 91 308 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 62 422 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 63 502 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 635 555 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X obj 697 253 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; -#X text 100 98 loading values into [value] objects ------->, f 16; -#X text 325 291 Expressions are output from right to left order in [expr] \, since they're evaluated from bottom to top. This means you need to update a variable and call it in the above expression \, check it ------------->, f 51; -#X connect 0 0 6 0; -#X connect 1 0 4 0; -#X connect 2 0 3 0; -#X connect 4 0 0 0; -#X connect 5 0 13 0; -#X connect 7 0 21 0; -#X connect 7 0 22 0; -#X connect 7 0 20 0; -#X connect 11 0 12 0; -#X connect 13 0 1 0; -#X connect 13 1 2 0; -#X connect 14 0 15 0; -#X connect 14 1 16 0; -#X connect 18 0 19 0; -#X connect 20 0 8 0; -#X connect 21 0 9 0; -#X connect 22 0 10 0; -#X connect 24 0 23 0; -#X connect 26 1 27 0; -#X connect 28 0 26 0; -#X connect 32 0 11 0; -#X connect 33 0 19 0; -#X connect 34 0 23 0; -#X connect 35 0 27 0; -#X connect 36 0 14 0; -#X restore 580 495 pd [value]; #X obj 105 258 expr $f1 + $s3[$i2]; #X symbolatom 235 232 7 0 0 0 - - - 0; #X floatatom 170 231 3 0 0 0 - - - 0; @@ -1291,9 +1294,85 @@ #X obj 22 667 makefilename; #X text 43 151 These objects have several built in operators and functions and the syntax is quite similar to how expressions are written in C. They receive input variables via the inlets and understand the variable types: '$f#' (floats) \, '$i#' (integers) and '$s#' (symbols) - '#' is the inlet number (up to 100) as below:, f 94; #X text 601 663 Updated for Pd version 0.55-1, f 14; -#X connect 16 0 15 2; -#X connect 17 0 15 1; -#X connect 18 0 15 0; -#X connect 19 0 25 0; -#X connect 26 0 25 1; -#X connect 37 0 38 0; +#N canvas 485 110 870 672 [value] 0; +#X floatatom 600 226 5 0 0 0 - - - 0; +#X obj 600 161 until; +#X msg 723 162 0; +#X obj 723 192 v i; +#X obj 600 193 expr i = i + 1; +#X msg 600 96 10; +#X obj 600 253 print; +#X obj 184 84 loadbang; +#X obj 144 197 value a; +#X obj 184 170 value b; +#X obj 227 144 value c; +#X obj 129 350 expr (a + b) / c; +#X floatatom 129 384 5 0 0 0 - - - 0; +#X obj 600 127 trigger float bang; +#X obj 701 312 expr i * 2 \; i = i + 1; +#X floatatom 701 358 5 0 0 0 - - - 0; +#X floatatom 775 359 5 0 0 0 - - - 0; +#X text 71 246 All you have to do is just use the variable name into the expression:, f 27; +#X obj 128 435 expr~ (a + b) / c; +#X obj 128 466 print~; +#X msg 144 118 5; +#X msg 184 118 3; +#X msg 227 118 2.5; +#X obj 129 546 print~; +#X obj 129 515 fexpr~ (a + b) / c; +#X obj 580 528 v last; +#X obj 454 559 fexpr~ last = $x1[-1] \; $x1[0] - last; +#X obj 605 614 print~; +#X obj 454 528 phasor~ 1000; +#X text 37 25 [expr] \, [expr~] and [fexpr~] can access variables set into [value] objects., f 34; +#X text 538 14 It is also possible to assign values to variables inside the expr family of objects with "=" (a.k.a the "store function")., f 38; +#X text 298 419 You can also assign variables values in [expr~] and [fexpr~]. But it is not pertinent to do this in [expr~] because it deals with whole signal vectors and not single values. As for [fexpr~] \, note that they're evaluated in from top to bottom instead. This means you need to update a variable and call it in the below expression \, check the following example:, f 75; +#X obj 129 321 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 100 435 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 101 515 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 639 579 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X obj 701 277 bng 19 250 50 0 empty empty empty 17 7 0 10 #dfdfdf #000000 #000000; +#X text 23 119 loading values into [value] objects ------->, f 16; +#X text 329 315 Expressions are output from right to left order in [expr] \, since they're evaluated from bottom to top. This means you need to update a variable and call it in the above expression \, check it ------------->, f 51; +#X obj 371 211 expr var($s1); +#X msg 371 118 symbol a; +#X floatatom 371 245 5 0 0 0 - - - 0; +#X msg 384 148 symbol b; +#X msg 394 177 symbol c; +#X text 348 37 The 'var' function takes a symbol and interprets it as a variable name., f 19; +#X connect 0 0 6 0; +#X connect 1 0 4 0; +#X connect 2 0 3 0; +#X connect 4 0 0 0; +#X connect 5 0 13 0; +#X connect 7 0 21 0; +#X connect 7 0 22 0; +#X connect 7 0 20 0; +#X connect 11 0 12 0; +#X connect 13 0 1 0; +#X connect 13 1 2 0; +#X connect 14 0 15 0; +#X connect 14 1 16 0; +#X connect 18 0 19 0; +#X connect 20 0 8 0; +#X connect 21 0 9 0; +#X connect 22 0 10 0; +#X connect 24 0 23 0; +#X connect 26 1 27 0; +#X connect 28 0 26 0; +#X connect 32 0 11 0; +#X connect 33 0 19 0; +#X connect 34 0 23 0; +#X connect 35 0 27 0; +#X connect 36 0 14 0; +#X connect 39 0 41 0; +#X connect 40 0 39 0; +#X connect 42 0 39 0; +#X connect 43 0 39 0; +#X restore 580 495 pd [value] & var(); +#X connect 15 0 14 2; +#X connect 16 0 14 1; +#X connect 17 0 14 0; +#X connect 18 0 24 0; +#X connect 25 0 24 1; +#X connect 36 0 37 0; From 87445ecf9abb98b24d07ff30334477ac238e0508 Mon Sep 17 00:00:00 2001 From: porres Date: Thu, 5 Sep 2024 10:39:58 -0400 Subject: [PATCH 81/89] fix expr bug for symbol() function with 3 args and int input --- doc/5.reference/expr-help.pd | 71 +++++++++++++++++++----------------- src/x_vexp_fun.c | 11 ++++-- 2 files changed, 44 insertions(+), 38 deletions(-) diff --git a/doc/5.reference/expr-help.pd b/doc/5.reference/expr-help.pd index 4e111a15..cf6eeb90 100644 --- a/doc/5.reference/expr-help.pd +++ b/doc/5.reference/expr-help.pd @@ -729,11 +729,11 @@ #X symbolatom 495 292 15 0 0 0 - - - 0; #X text 683 562 Here's a bit more complicated example, f 20; #X text 682 98 symbol() takes up to 3 arguments \, see details below, f 21; -#N canvas 234 270 1073 580 symbol() 0; +#N canvas 348 155 1122 577 symbol() 0; #X symbolatom 55 232 8 0 0 0 - - - 0; #X symbolatom 350 434 10 0 0 0 - - - 0; #X text 108 168 symboln(flt \, decimal length); -#X symbolatom 826 241 10 0 0 0 - - - 0; +#X symbolatom 688 245 13 0 0 0 - - - 0; #X symbolatom 162 434 10 0 0 0 - - - 0; #X obj 54 197 expr symbol(4.52 \, $i1); #X msg 45 62 5; @@ -758,24 +758,25 @@ #X obj 350 399 expr symbol($s1 \, 4); #X symbolatom 140 513 10 0 0 0 - - - 0; #X obj 140 478 makefilename %.3d; -#X text 641 61 3 arguments produces a symbol from string/symbol \, int \, float \, according to the %m.ns \, %m.nd \, %m.nf syntax in sprintf(); -#X obj 826 206 expr symbol(4.52 \, 2 \, 5); -#X obj 808 274 makefilename %5.2f; -#X msg 808 169 4.52; -#X symbolatom 808 309 10 0 0 0 - - - 0; -#X symbolatom 820 436 10 0 0 0 - - - 0; -#X symbolatom 802 504 10 0 0 0 - - - 0; -#X msg 802 364 symbol hello; -#X obj 820 401 expr symbol($s1 \, 3 \, 5); -#X obj 802 469 makefilename %5.3s; -#X floatatom 585 342 0 0 0 0 - - - 0; -#X symbolatom 605 407 12 0 0 0 - - - 0; -#X msg 585 285 1; -#X msg 547 285 10; -#X symbolatom 585 493 10 0 0 0 - - - 0; -#X obj 605 375 makefilename %5.3d; -#X obj 585 458 expr symbol($i1 \, 3 \, 5); -#X text 646 287 BUG; +#X text 647 59 3 arguments produces a symbol from string/symbol \, int \, float \, according to the %m.ns \, %m.nd \, %m.nf syntax in sprintf(); +#X obj 670 278 makefilename %5.2f; +#X symbolatom 670 313 14 0 0 0 - - - 0; +#X symbolatom 682 440 10 0 0 0 - - - 0; +#X symbolatom 664 508 10 0 0 0 - - - 0; +#X msg 664 368 symbol hello; +#X obj 682 405 expr symbol($s1 \, 3 \, 5); +#X obj 664 473 makefilename %5.3s; +#X floatatom 897 190 0 0 0 0 - - - 0; +#X symbolatom 917 255 12 0 0 0 - - - 0; +#X msg 897 133 1; +#X msg 859 133 10; +#X symbolatom 897 341 10 0 0 0 - - - 0; +#X obj 917 223 makefilename %5.3d; +#X obj 897 306 expr symbol($i1 \, 3 \, 5); +#X msg 670 137 4.52; +#X floatatom 670 173 7 0 0 0 - - - 0; +#X msg 720 138 1e+07; +#X obj 688 210 expr symbol($f1 \, 2 \, 5); #X connect 5 0 0 0; #X connect 6 0 10 0; #X connect 7 0 10 0; @@ -794,20 +795,22 @@ #X connect 24 0 25 0; #X connect 25 0 1 0; #X connect 27 0 26 0; -#X connect 29 0 3 0; -#X connect 30 0 32 0; -#X connect 31 0 30 0; -#X connect 31 0 29 0; -#X connect 35 0 36 0; -#X connect 35 0 37 0; -#X connect 36 0 33 0; -#X connect 37 0 34 0; -#X connect 38 0 43 0; -#X connect 38 0 44 0; -#X connect 40 0 38 0; -#X connect 41 0 38 0; -#X connect 43 0 39 0; -#X connect 44 0 42 0; +#X connect 29 0 30 0; +#X connect 33 0 34 0; +#X connect 33 0 35 0; +#X connect 34 0 31 0; +#X connect 35 0 32 0; +#X connect 36 0 41 0; +#X connect 36 0 42 0; +#X connect 38 0 36 0; +#X connect 39 0 36 0; +#X connect 41 0 37 0; +#X connect 42 0 40 0; +#X connect 43 0 44 0; +#X connect 44 0 29 0; +#X connect 44 0 46 0; +#X connect 45 0 44 0; +#X connect 46 0 3 0; #X restore 719 157 pd symbol(); #X connect 0 0 2 0; #X connect 1 0 35 0; diff --git a/src/x_vexp_fun.c b/src/x_vexp_fun.c index 467a8425..2b4ea6f0 100644 --- a/src/x_vexp_fun.c +++ b/src/x_vexp_fun.c @@ -1635,10 +1635,13 @@ ex_symbol(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) case ET_INT: if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) - goto goterror; - snprintf(format, 25, "%%.%dld", num1); - snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, left->ex_int); - return; + goto goterror; + if (num2 == -1) + snprintf(format, 25, "%%.%dld", num1); + else + snprintf(format, 25, "%%%d.%dld", num2, num1); + snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, left->ex_int); + return; case ET_FLT: if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) From 7f6234ff44d369d27625d81c5269e583d3609097 Mon Sep 17 00:00:00 2001 From: porres Date: Thu, 5 Sep 2024 10:41:51 -0400 Subject: [PATCH 82/89] improve release notes with new expr info on the var() function --- doc/1.manual/resources/chapter5.htm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/1.manual/resources/chapter5.htm b/doc/1.manual/resources/chapter5.htm index c00e40ca..b1b82cf1 100644 --- a/doc/1.manual/resources/chapter5.htm +++ b/doc/1.manual/resources/chapter5.htm @@ -28,6 +28,8 @@

                        5.1. Release notes

                        ------------------ 0.55-1 ------------------------------

                        Shahrokh updated the "expr" family of objects and added string handling (yay!) +There are several new functions to manipulate strings and a new var() function that +takes symbols and treats them as variables from a [value] object.

                        bug fixes, notably a crasher bug when sending "open" to [readsf~] in verbose mode, but other improvements in thread safety mostly relevant to RISC architectures. From 61c3a76f3149ba0e7c49cf30cbf395af8cd1cdee Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Fri, 6 Sep 2024 09:08:05 +0200 Subject: [PATCH 83/89] oops, fix spacing --- src/x_vexp.c | 40 +++++------ src/x_vexp_fun.c | 180 +++++++++++++++++++++++------------------------ src/x_vexp_if.c | 38 ++++++++-- 3 files changed, 142 insertions(+), 116 deletions(-) diff --git a/src/x_vexp.c b/src/x_vexp.c index 85923d99..bcc3fbb7 100644 --- a/src/x_vexp.c +++ b/src/x_vexp.c @@ -19,10 +19,10 @@ * - cleaned up some indentation issues * * Oct 2020, Version 0.57 - * - fixed a bug in fact() - * - fixed the bad lvalue bug - "4 + 5 = 3" was not caught before - * - fact() (factorial) now calculates and returns its value in double - * - Added mtof(), mtof(), dbtorms(), rmstodb(), powtodb(), dbtopow() + * - fixed a bug in fact() + * - fixed the bad lvalue bug - "4 + 5 = 3" was not caught before + * - fact() (factorial) now calculates and returns its value in double + * - Added mtof(), mtof(), dbtorms(), rmstodb(), powtodb(), dbtopow() * * July 2017, Version 0.55 * - The arrays now redraw after a store into one of their members @@ -833,15 +833,15 @@ ex_checklval(struct expr *e, struct ex_ex *eptr) extmp = eptr->ex_end; while (eptr->ex_type && eptr != extmp) { - if (eptr->ex_type == ET_OP && eptr->ex_op == OP_STORE) { + if (eptr->ex_type == ET_OP && eptr->ex_op == OP_STORE) { if (eptr[1].ex_type != ET_VAR && eptr[1].ex_type != ET_SI && eptr[1].ex_type != ET_TBL) { post("expr: '%s' - Bad left value: ", e->exp_string); return (1); } - } - eptr++; + } + eptr++; } return (0); } @@ -1141,17 +1141,17 @@ ex_eval(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) if (optr->ex_type == ET_VEC) { if (!(expr->exp_error & EE_BADSYM)) { expr->exp_error |= EE_BADSYM; - post_error((fts_object_t *) expr, - "expr~: '%s': cannot convert string to vector\n", - expr->exp_string); + post_error((fts_object_t *) expr, + "expr~: '%s': cannot convert string to vector\n", + expr->exp_string); post_error(expr, - "expr~: No more symbol-vector errors will be reported"); + "expr~: No more symbol-vector errors will be reported"); post_error(expr, - "expr~: till the next reset"); + "expr~: till the next reset"); } ex_mkvector(optr->ex_vec, 0, expr->exp_vsize); } else - *optr = *eptr; + *optr = *eptr; return (++eptr); case ET_II: if (eptr->ex_int == -1) { @@ -1263,20 +1263,20 @@ ex_eval(struct expr *expr, struct ex_ex *eptr, struct ex_ex *optr, int idx) /* check if the symbol input is a table */ if (eptr->ex_flags & EX_F_SI_TAB) { eptr = eval_tab(expr, eptr, optr, idx); - return (eptr); + return (eptr); //return (eval_tab(expr, eptr, optr, idx)); - } + } /* it is just a symbol input */ if (optr->ex_type == ET_VEC) { if (!(expr->exp_error & EE_BADSYM)) { expr->exp_error |= EE_BADSYM; - post_error((fts_object_t *) expr, - "expr~: '%s': cannot convert string inlet to vector\n", - expr->exp_string); + post_error((fts_object_t *) expr, + "expr~: '%s': cannot convert string inlet to vector\n", + expr->exp_string); post_error(expr, - "expr~: No more symbol-vector errors will be reported"); + "expr~: No more symbol-vector errors will be reported"); post_error(expr, - "expr~: till the next reset"); + "expr~: till the next reset"); } ex_mkvector(optr->ex_vec, 0, expr->exp_vsize); return (exNULL); diff --git a/src/x_vexp_fun.c b/src/x_vexp_fun.c index 467a8425..4c0e2f90 100644 --- a/src/x_vexp_fun.c +++ b/src/x_vexp_fun.c @@ -50,9 +50,9 @@ * July 2017 --sdy * * - ex_if() is reworked to only evaluate either the left or the right arg - * October 2020 --sdy - * - fact() (factorial) now calculates and returns its value in double - * - Added mtof(), mtof(), dbtorms(), rmstodb(), powtodb(), dbtopow() + * October 2020 --sdy + * - fact() (factorial) now calculates and returns its value in double + * - Added mtof(), mtof(), dbtorms(), rmstodb(), powtodb(), dbtopow() * */ @@ -223,12 +223,12 @@ t_ex_func ex_funcs[] = { {"ldexp", ex_ldexp, 2}, {"imodf", ex_imodf, 1}, {"modf", ex_modf, 1}, - {"mtof", ex_mtof, 1}, - {"ftom", ex_ftom, 1}, - {"dbtorms", ex_dbtorms, 1}, - {"rmstodb", ex_rmstodb, 1}, - {"dbtopow", ex_dbtopow, 1}, - {"powtodb", ex_powtodb, 1}, + {"mtof", ex_mtof, 1}, + {"ftom", ex_ftom, 1}, + {"dbtorms", ex_dbtorms, 1}, + {"rmstodb", ex_rmstodb, 1}, + {"dbtopow", ex_dbtopow, 1}, + {"powtodb", ex_powtodb, 1}, #if !defined(_MSC_VER) || (_MSC_VER >= 1700) {"asinh", ex_asinh, 1}, {"acosh", ex_acosh, 1}, @@ -1394,7 +1394,7 @@ ex_makesymbol(t_expr *e, struct ex_ex *optr, size_t size) } -#define CHECK_LEFT_STR(left) \ +#define CHECK_LEFT_STR(left) \ left = argv; \ leftstr = ex_getstring(e, left); \ if (!leftstr) { \ @@ -1403,7 +1403,7 @@ ex_makesymbol(t_expr *e, struct ex_ex *optr, size_t size) return; \ } \ -#define CHECK_RIGHT_STR(right) \ +#define CHECK_RIGHT_STR(right) \ right = argv + 1; \ rightstr = ex_getstring(e, right); \ if (!rightstr) { \ @@ -1414,7 +1414,7 @@ ex_makesymbol(t_expr *e, struct ex_ex *optr, size_t size) #define CHECK_LR_STR(left, right) \ - CHECK_LEFT_STR(left) \ + CHECK_LEFT_STR(left) \ CHECK_RIGHT_STR(right) @@ -1477,7 +1477,7 @@ func(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr)\ } \ break; \ default: \ - ex_error(e, "expr: bad return type INTERNAL ERROR", \ + ex_error(e, "expr: bad return type INTERNAL ERROR", \ e->exp_string); \ } \ return; \ @@ -1532,67 +1532,67 @@ static void ex_symbol1(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) { struct ex_ex *left; - /* we will not realloc to exact size for efficiecy */ - int i; - char *strp; /* string pointer */ + /* we will not realloc to exact size for efficiecy */ + int i; + char *strp; /* string pointer */ left = argv; switch (left->ex_type) { case ET_SYM: - *optr = *left; - left->ex_type = ET_INT; - left->ex_flags = 0; - left->ex_ptr = (char *)0; - return; - - case ET_SI: - strp = ex_getstring(e, left); - if (!strp) { - if (!ex_makesymbol(e, optr, 1)) - goto goterror; - *optr->ex_ptr = 0; - return; - } - if (!ex_makesymbol(e, optr, strlen(strp))) - goto goterror; - strcpy (optr->ex_ptr, strp); - return; + *optr = *left; + left->ex_type = ET_INT; + left->ex_flags = 0; + left->ex_ptr = (char *)0; + return; + case ET_SI: + strp = ex_getstring(e, left); + if (!strp) { + if (!ex_makesymbol(e, optr, 1)) + goto goterror; + *optr->ex_ptr = 0; + return; + } + if (!ex_makesymbol(e, optr, strlen(strp))) + goto goterror; + strcpy (optr->ex_ptr, strp); + return; - case ET_INT: - if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) + + case ET_INT: + if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) goto goterror; - snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, "%ld", left->ex_int); - return; + snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, "%ld", left->ex_int); + return; - case ET_FLT: - if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) + case ET_FLT: + if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) goto goterror; - snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, "%.6f", left->ex_flt); - for (i = strlen(optr->ex_ptr) - 1; i && optr->ex_ptr[i] == '0'; i--) - if (optr->ex_ptr[i-1] != '.') - optr->ex_ptr[i] = 0; - return; + snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, "%.6f", left->ex_flt); + for (i = strlen(optr->ex_ptr) - 1; i && optr->ex_ptr[i] == '0'; i--) + if (optr->ex_ptr[i-1] != '.') + optr->ex_ptr[i] = 0; + return; - default: - optr->ex_type = ET_INT; - optr->ex_int = 0; - post_error((fts_object_t *) e, "expr: bad argument to tosym/sym() - '%s'", e->exp_string); - } + default: + optr->ex_type = ET_INT; + optr->ex_int = 0; + post_error((fts_object_t *) e, "expr: bad argument to tosym/sym() - '%s'", e->exp_string); + } goterror: - optr->ex_type = ET_INT; - optr->ex_int = 0; - return; + optr->ex_type = ET_INT; + optr->ex_int = 0; + return; } static void ex_symbol(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) { struct ex_ex *left; - char format[25]; /* the largest int in a 64 bit is 20 characters */ - int i, num1, num2; - char *strp; /* string pointer */ + char format[25]; /* the largest int in a 64 bit is 20 characters */ + int i, num1, num2; + char *strp; /* string pointer */ if (!argc) { ex_makesymbol(e, optr, 1); @@ -1602,64 +1602,64 @@ ex_symbol(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) return (ex_symbol1(e, argc, argv, optr)); if (argc != 2 && argc != 3) { - optr->ex_type = ET_INT; - optr->ex_int = 0; - ex_error(e, "expr: symbol/sym takes no more than 3 arguments", e->exp_string); + optr->ex_type = ET_INT; + optr->ex_int = 0; + ex_error(e, "expr: symbol/sym takes no more than 3 arguments", e->exp_string); return; } left = argv; - num1 = ex_getnumber(e, argv + 1); + num1 = ex_getnumber(e, argv + 1); if (argc == 2) num2 = -1; else num2 = ex_getnumber(e, argv + 2); switch (left->ex_type) { case ET_SYM: - case ET_SI: - strp = ex_getstring(e, left); - if (!strp) { - if (!ex_makesymbol(e, optr, 1)) - goto goterror; - *optr->ex_ptr = 0; - return; - } - if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) - goto goterror; + case ET_SI: + strp = ex_getstring(e, left); + if (!strp) { + if (!ex_makesymbol(e, optr, 1)) + goto goterror; + *optr->ex_ptr = 0; + return; + } + if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) + goto goterror; if (num2 == -1) snprintf(format, 25, "%%.%ds", num1); else snprintf(format, 25, "%%%d.%ds", num2, num1); - snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, strp); - return; + snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, strp); + return; - case ET_INT: - if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) + case ET_INT: + if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) goto goterror; - snprintf(format, 25, "%%.%dld", num1); - snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, left->ex_int); - return; + snprintf(format, 25, "%%.%dld", num1); + snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, left->ex_int); + return; - case ET_FLT: - if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) + case ET_FLT: + if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) goto goterror; if (num2 == -1) snprintf(format, 25, "%%.%df", num1); else snprintf(format, 25, "%%%d.%df", num2, num1); - snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, left->ex_flt); - return; + snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, left->ex_flt); + return; - default: - optr->ex_type = ET_INT; - optr->ex_int = 0; - post_error((fts_object_t *) e, "expr: bad argument to tosym/sym() - '%s'", e->exp_string); - } + default: + optr->ex_type = ET_INT; + optr->ex_int = 0; + post_error((fts_object_t *) e, "expr: bad argument to tosym/sym() - '%s'", e->exp_string); + } goterror: - optr->ex_type = ET_INT; - optr->ex_int = 0; - return; + optr->ex_type = ET_INT; + optr->ex_int = 0; + return; } /* @@ -1700,7 +1700,7 @@ ex_strcat(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) STRFUNC_DEF(ex_strncat) int num, size; num = ex_getnumber(e, argv + 2); - size = min(num, strlen(rightstr)); + size = min(num, strlen(rightstr)); if (!ex_makesymbol(e, tmpoptr, size)) return; diff --git a/src/x_vexp_if.c b/src/x_vexp_if.c index 0c9be074..d32f81f5 100644 --- a/src/x_vexp_if.c +++ b/src/x_vexp_if.c @@ -1041,6 +1041,7 @@ max_ex_tab(struct expr *expr, t_symbol *s, struct ex_ex *arg, int interpol, t_garray *garray; int size; long indx; + t_float flt_value = 0.0; t_word *wvec; if (!s || !(garray = (t_garray *)pd_findbyclass(s, garray_class)) || @@ -1051,7 +1052,6 @@ max_ex_tab(struct expr *expr, t_symbol *s, struct ex_ex *arg, int interpol, return (1); } #if 1 - optr->ex_type = ET_FLT; switch (arg->ex_type) { case ET_INT: @@ -1063,12 +1063,38 @@ max_ex_tab(struct expr *expr, t_symbol *s, struct ex_ex *arg, int interpol, break; default: /* do something with strings */ - pd_error(expr, "expr: bad argument for table '%s'\n", fts_symbol_name(s)); - indx = 0; + ex_error(expr, "expr: bad argument for table '%s'\n", fts_symbol_name(s)); + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, 0.0, expr->exp_vsize); + else { + optr->ex_type = ET_INT; + optr->ex_int = 0; + } + return (1); } - if (indx < 0) indx = 0; - else if (indx >= size) indx = size - 1; - optr->ex_flt = wvec[indx].w_float; + if (indx < 0) + indx = 0; + else if (indx >= size) + indx = size - 1; + flt_value = wvec[indx].w_float; + switch (optr->ex_type) { + case ET_VEC: + ex_mkvector(optr->ex_vec, flt_value, expr->exp_vsize); + return(0); + case ET_SYM: + ex_error(expr, "expr:'%s' bad output type '%ld'\n", + expr->exp_string, optr->ex_type); + break; + case ET_INT: + case ET_FLT: + default: + optr->ex_type = ET_FLT; + optr->ex_flt = flt_value; + return(0); + } + optr->ex_type = ET_INT; + optr->ex_int = 0; + return(1); #else /* if 1 tabled code */ The code below implement 4 point interpolation of table access which for now I (sdy) am tabling for the next release From 261e660eb28cfa27f882ca2393a95b2debe78091 Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Fri, 6 Sep 2024 09:12:24 +0200 Subject: [PATCH 84/89] hand-applied Alexandre's integer-to-symbol fix and fixed some indentation --- src/x_vexp_fun.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/x_vexp_fun.c b/src/x_vexp_fun.c index 4c0e2f90..76183e2d 100644 --- a/src/x_vexp_fun.c +++ b/src/x_vexp_fun.c @@ -1627,16 +1627,19 @@ ex_symbol(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) goto goterror; if (num2 == -1) - snprintf(format, 25, "%%.%ds", num1); + snprintf(format, 25, "%%.%ds", num1); else - snprintf(format, 25, "%%%d.%ds", num2, num1); + snprintf(format, 25, "%%%d.%ds", num2, num1); snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, strp); return; case ET_INT: if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) goto goterror; - snprintf(format, 25, "%%.%dld", num1); + if (num2 == -1) + snprintf(format, 25, "%%.%dld", num1); + else + snprintf(format, 25, "%%%d.%dld", num2, num1); snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, left->ex_int); return; @@ -1644,9 +1647,9 @@ ex_symbol(t_expr *e, long int argc, struct ex_ex *argv, struct ex_ex *optr) if (!ex_makesymbol(e, optr, EXPR_MAX_SYM_SIZE)) goto goterror; if (num2 == -1) - snprintf(format, 25, "%%.%df", num1); + snprintf(format, 25, "%%.%df", num1); else - snprintf(format, 25, "%%%d.%df", num2, num1); + snprintf(format, 25, "%%%d.%df", num2, num1); snprintf(optr->ex_ptr, EXPR_MAX_SYM_SIZE, format, left->ex_flt); return; From 7f44e1a45bcf756437f78872d82ecf36c45fadb9 Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Fri, 6 Sep 2024 09:17:01 +0200 Subject: [PATCH 85/89] replace x_vexp_if.c with Sharokh's update --- src/x_vexp_if.c | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/src/x_vexp_if.c b/src/x_vexp_if.c index 0c9be074..d32f81f5 100644 --- a/src/x_vexp_if.c +++ b/src/x_vexp_if.c @@ -1041,6 +1041,7 @@ max_ex_tab(struct expr *expr, t_symbol *s, struct ex_ex *arg, int interpol, t_garray *garray; int size; long indx; + t_float flt_value = 0.0; t_word *wvec; if (!s || !(garray = (t_garray *)pd_findbyclass(s, garray_class)) || @@ -1051,7 +1052,6 @@ max_ex_tab(struct expr *expr, t_symbol *s, struct ex_ex *arg, int interpol, return (1); } #if 1 - optr->ex_type = ET_FLT; switch (arg->ex_type) { case ET_INT: @@ -1063,12 +1063,38 @@ max_ex_tab(struct expr *expr, t_symbol *s, struct ex_ex *arg, int interpol, break; default: /* do something with strings */ - pd_error(expr, "expr: bad argument for table '%s'\n", fts_symbol_name(s)); - indx = 0; + ex_error(expr, "expr: bad argument for table '%s'\n", fts_symbol_name(s)); + if (optr->ex_type == ET_VEC) + ex_mkvector(optr->ex_vec, 0.0, expr->exp_vsize); + else { + optr->ex_type = ET_INT; + optr->ex_int = 0; + } + return (1); } - if (indx < 0) indx = 0; - else if (indx >= size) indx = size - 1; - optr->ex_flt = wvec[indx].w_float; + if (indx < 0) + indx = 0; + else if (indx >= size) + indx = size - 1; + flt_value = wvec[indx].w_float; + switch (optr->ex_type) { + case ET_VEC: + ex_mkvector(optr->ex_vec, flt_value, expr->exp_vsize); + return(0); + case ET_SYM: + ex_error(expr, "expr:'%s' bad output type '%ld'\n", + expr->exp_string, optr->ex_type); + break; + case ET_INT: + case ET_FLT: + default: + optr->ex_type = ET_FLT; + optr->ex_flt = flt_value; + return(0); + } + optr->ex_type = ET_INT; + optr->ex_int = 0; + return(1); #else /* if 1 tabled code */ The code below implement 4 point interpolation of table access which for now I (sdy) am tabling for the next release From ce9e5de7626ece4762b910205120095daa1e7d58 Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Sat, 7 Sep 2024 18:18:56 +0200 Subject: [PATCH 86/89] updateed expr doc from Shahrokh --- doc/8.topics/expr.htm | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/doc/8.topics/expr.htm b/doc/8.topics/expr.htm index ee7aed06..e877a93e 100644 --- a/doc/8.topics/expr.htm +++ b/doc/8.topics/expr.htm @@ -159,10 +159,10 @@


                        Expr family objects by - Shahrokh Yadegari

                        + Shahrokh Yadegari -

                        To see a directory listing of downloadable files, which also includes older releases, click here.
                        -
                        Back to the Software Page +

                        To see a directory listing of downloadable files, which also includes older releases, click here.
                        +
                        Back to the Software Page


                        @@ -707,22 +707,37 @@

                        The supported functions for [expr], [expr~] and [fexpr~] are:

                - - + + - - - - - + + + - From ef94692919284452a23921c76b818c06168c406d Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Mon, 9 Sep 2024 12:09:54 +0200 Subject: [PATCH 87/89] change test number to force recompile attempt in IEM CI sys --- src/m_pd.h | 2 +- src/pd.rc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/m_pd.h b/src/m_pd.h index 4145364a..813ee553 100644 --- a/src/m_pd.h +++ b/src/m_pd.h @@ -11,7 +11,7 @@ extern "C" { #define PD_MAJOR_VERSION 0 #define PD_MINOR_VERSION 55 #define PD_BUGFIX_VERSION 1 -#define PD_TEST_VERSION "test1" +#define PD_TEST_VERSION "test1b" /* compile-time version check: #if PD_VERSION_CODE < PD_VERSION(0, 56, 0) diff --git a/src/pd.rc b/src/pd.rc index 36d44b24..12b92c20 100644 --- a/src/pd.rc +++ b/src/pd.rc @@ -14,7 +14,7 @@ BEGIN VALUE "LegalCopyright", "Miller Puckette, et al." VALUE "OriginalFilename", "pd.exe" VALUE "ProductName", "Pure Data" - VALUE "ProductVersion", "0.55-1test1" + VALUE "ProductVersion", "0.55-1testb1" END END From 6b0c01c25c86bafec81b74f088401269e51e2662 Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Mon, 9 Sep 2024 15:20:21 +0200 Subject: [PATCH 88/89] another fake version bump to test CI pipeline --- src/m_pd.h | 2 +- src/pd.rc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/m_pd.h b/src/m_pd.h index 813ee553..9894b808 100644 --- a/src/m_pd.h +++ b/src/m_pd.h @@ -11,7 +11,7 @@ extern "C" { #define PD_MAJOR_VERSION 0 #define PD_MINOR_VERSION 55 #define PD_BUGFIX_VERSION 1 -#define PD_TEST_VERSION "test1b" +#define PD_TEST_VERSION "test1c" /* compile-time version check: #if PD_VERSION_CODE < PD_VERSION(0, 56, 0) diff --git a/src/pd.rc b/src/pd.rc index 12b92c20..3b20dd8c 100644 --- a/src/pd.rc +++ b/src/pd.rc @@ -14,7 +14,7 @@ BEGIN VALUE "LegalCopyright", "Miller Puckette, et al." VALUE "OriginalFilename", "pd.exe" VALUE "ProductName", "Pure Data" - VALUE "ProductVersion", "0.55-1testb1" + VALUE "ProductVersion", "0.55-1test1c" END END From e586b3afd2dbfd6e24d503fabe822fbd4e0cbe6b Mon Sep 17 00:00:00 2001 From: Miller Puckette Date: Mon, 9 Sep 2024 19:40:04 +0200 Subject: [PATCH 89/89] version number to 0.55-1 --- src/m_pd.h | 2 +- src/pd.rc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/m_pd.h b/src/m_pd.h index 9894b808..0ebd4078 100644 --- a/src/m_pd.h +++ b/src/m_pd.h @@ -11,7 +11,7 @@ extern "C" { #define PD_MAJOR_VERSION 0 #define PD_MINOR_VERSION 55 #define PD_BUGFIX_VERSION 1 -#define PD_TEST_VERSION "test1c" +#define PD_TEST_VERSION "" /* compile-time version check: #if PD_VERSION_CODE < PD_VERSION(0, 56, 0) diff --git a/src/pd.rc b/src/pd.rc index 3b20dd8c..b6f08da8 100644 --- a/src/pd.rc +++ b/src/pd.rc @@ -9,12 +9,12 @@ BEGIN BEGIN VALUE "CompanyName", "puredata.info" VALUE "FileDescription", "Pure Data Application" - VALUE "FileVersion", "0.55-1test1" + VALUE "FileVersion", "0.55-1" VALUE "InternalName", "pd.exe" VALUE "LegalCopyright", "Miller Puckette, et al." VALUE "OriginalFilename", "pd.exe" VALUE "ProductName", "Pure Data" - VALUE "ProductVersion", "0.55-1test1c" + VALUE "ProductVersion", "0.55-1" END END
                symbol(int/float/symbol)
                sym(int/float/symbol)
                1 symbol(int/float/symbol [, int X, int Y])
                sym(int/float/symbol)
                0, 1, 2, or 3 symbol symbol formatted based on the type of the input + symbol formatted based on the type of the input +
                +
                +0 argument will result in an empty symbol +
                +
                + +1 argument will produce a symbol from string/symbol, int, float, according to the %s, %d, %f syntax in sprintf() respectively +
                +
                +2 argument (sym, X) will produce a symbol from string/symbol, int, float, according to the %Xs, %.Xd, %.Xf syntax in sprintf() respectively + +
                +
                + +3 arguments (sym, X, Y) will produce a symbol from string/symbol, int, float, according to the %Y.Xs, %Y.Xd, %Y.Xf syntax in sprintf() respectively
                symboln(int/float/symbol, int, int)
                symn(int/float/symbol, int, int)
                3 symbol symbol formatted using sprintf "%#.#s" formatting string construction, where the first number argument is the length of the final symbol, and the second number argument is the number of decimal point included + var(symbol) 1 float var() will treat the value of the symbol argument as a variable name and returns the value of the variable
                strlen(symbol) 1 int length of symbol + length of symbol
                tolower(symbol)