From 13d9f965c738692960e82695178072c1be1012fa Mon Sep 17 00:00:00 2001
From: Miller Puckette <msp@ucsd.edu>
Date: Mon, 8 Dec 2008 10:44:57 -0800
Subject: [PATCH] test06 - bonk and sigmund improvements; deleted flush for
 stdout

---
 doc/3.audio.examples/B16.long-varispeed.pd | 30 +++++++++---------
 extra/bonk~/bonk~.c                        |  4 +--
 extra/pd~/pd~.c                            | 15 ++++++---
 extra/sigmund~/sigmund~.c                  | 36 ++++++++++++----------
 extra/stdout/stdout-help.pd                | 28 ++++++++++-------
 extra/stdout/stdout.c                      |  5 ++-
 linux/cp-to-max.sh                         |  0
 src/m_pd.h                                 |  2 +-
 8 files changed, 69 insertions(+), 51 deletions(-)
 mode change 100644 => 100755 linux/cp-to-max.sh

diff --git a/doc/3.audio.examples/B16.long-varispeed.pd b/doc/3.audio.examples/B16.long-varispeed.pd
index 5ee0afb8b..14d45825f 100644
--- a/doc/3.audio.examples/B16.long-varispeed.pd
+++ b/doc/3.audio.examples/B16.long-varispeed.pd
@@ -1,4 +1,4 @@
-#N canvas 202 17 779 858 12;
+#N canvas 31 5 779 858 12;
 #X obj 399 526 metro 100;
 #X obj 212 472 phasor~;
 #X obj 399 556 snapshot~;
@@ -7,7 +7,7 @@
 #X obj 23 461 phasor~;
 #X floatatom 23 329 5 -100 1000 0 - - -;
 #X obj 23 518 tabread4~ \$0-tab;
-#X msg 281 330 0.5;
+#X msg 290 329 0.5;
 #X msg 326 329 0.01;
 #X obj 398 455 loadbang;
 #X msg 399 478 1;
@@ -59,7 +59,6 @@
 ;
 #X text 387 739 (approximately zero but not exactly because of;
 #X text 389 753 truncation error!);
-#X msg 340 408 0.5;
 #X obj 341 383 t b f;
 #X text 400 357 convert to samples;
 #X text 385 384 set both last-onset and previous-onset;
@@ -74,13 +73,13 @@
 #X text 206 402 convert to;
 #X text 469 472 in order to change onset to reflect it;
 #X text 469 456 Each 100 msec \, poll phase of phasor~;
-#X text 24 36 Here is how to use the tabread~ "onset" input to allow
+#X text 24 29 Here is how to use the tabread~ "onset" input to allow
 clean varispeed playback from a long table. At left \, a phasor~ is
 naiveley rescaled to the size of the tble. At right \, the phasor~
 gets only a 10000-point range about a moving "onset". Ten times per
 second \, we poll tha phasor~ phase \, sum its value into the onset
 \, and back up the phase of the phasor~ correspondingly.;
-#X text 25 150 The tricky bits are \, first \, that we need to poll
+#X text 24 138 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
@@ -88,19 +87,22 @@ 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.;
-#X text 26 290 The metronome rate is arbitrary but should be fast enough
+#X text 26 281 The metronome rate is arbitrary but should be fast enough
 that the phasor~ never has time to wrap.;
 #X text 518 539 extrapolate snapshot of phase by one;
 #X text 517 552 sample to sync with next block;
 #X text 41 617 BAD;
 #X text 160 770 GOOD;
 #X text 195 9 VARIABLE SPEED PLAYBACK FROM LONG TABLES;
+#X msg 340 408 0;
+#X text 369 328 <- reset phase. 0.5 causes trouble for the "bad" way.
+;
 #X connect 0 0 2 0;
 #X connect 1 0 24 0;
 #X connect 2 0 31 0;
 #X connect 5 0 26 0;
 #X connect 6 0 45 0;
-#X connect 6 0 65 0;
+#X connect 6 0 64 0;
 #X connect 7 0 4 0;
 #X connect 7 0 4 1;
 #X connect 8 0 5 1;
@@ -147,10 +149,10 @@ that the phasor~ never has time to wrap.;
 #X connect 40 0 35 0;
 #X connect 40 0 38 0;
 #X connect 45 0 5 0;
-#X connect 51 0 58 0;
-#X connect 57 0 1 1;
-#X connect 58 0 57 0;
-#X connect 58 1 19 1;
-#X connect 58 1 12 1;
-#X connect 65 0 1 0;
-#X connect 65 0 30 0;
+#X connect 51 0 57 0;
+#X connect 57 0 79 0;
+#X connect 57 1 19 1;
+#X connect 57 1 12 1;
+#X connect 64 0 1 0;
+#X connect 64 0 30 0;
+#X connect 79 0 15 0;
diff --git a/extra/bonk~/bonk~.c b/extra/bonk~/bonk~.c
index 48e6837eb..ee59cb0f7 100644
--- a/extra/bonk~/bonk~.c
+++ b/extra/bonk~/bonk~.c
@@ -1,7 +1,7 @@
 /*
  ###########################################################################
  # bonk~ - a Max/MSP external
- # by miller puckette and ted appel
+ # by miller puckette and ted apel
  # http://crca.ucsd.edu/~msp/
  # Max/MSP port by barry threw
  # http://www.barrythrew.com
@@ -911,7 +911,7 @@ static void bonk_print(t_bonk *x, t_floatarg f)
                      h->h_before, h->h_countup);
         }
         post("filter details (frequencies are in units of %.2f-Hz. bins):",
-             x->x_sr);
+             x->x_sr/x->x_npoints);
         for (j = 0; j < x->x_nfilters; j++)
             post("%2d  cf %.2f  bw %.2f  nhops %d hop %d skip %d npoints %d",
                  j, 
diff --git a/extra/pd~/pd~.c b/extra/pd~/pd~.c
index 223f3d1ea..49b398b30 100644
--- a/extra/pd~/pd~.c
+++ b/extra/pd~/pd~.c
@@ -71,6 +71,7 @@ typedef struct _pd_tilde
     t_object x_obj;
     t_clock *x_clock;
     t_outlet *x_outlet1;        /* for messages back from subproc */
+    t_canvas *x_canvas;
 #endif /* PD */
 #ifdef MSP
     t_pxobject x_obj;
@@ -165,7 +166,8 @@ static void pd_tilde_readmessages(t_pd_tilde *x)
 }
 
 static void pd_tilde_donew(t_pd_tilde *x, char *pddir, char *schedlibdir,
-    char *pdargs, int ninsig, int noutsig, int fifo, float samplerate)
+    char *patchdir, char *pdargs, int ninsig, int noutsig, int fifo,
+    float samplerate)
 {
     int i, pid, pipe1[2], pipe2[2];
     char cmdbuf[MAXPDSTRING], pdexecbuf[MAXPDSTRING], schedbuf[MAXPDSTRING];
@@ -195,8 +197,8 @@ static void pd_tilde_donew(t_pd_tilde *x, char *pddir, char *schedlibdir,
         }       
     }
     snprintf(cmdbuf, MAXPDSTRING,
-"%s -schedlib %s/pdsched -inchannels %d -outchannels %d -r %g %s\n",
-        pdexecbuf, schedlibdir, ninsig, noutsig, samplerate, pdargs);
+"%s -schedlib %s/pdsched -path %s -inchannels %d -outchannels %d -r %g %s\n",
+        pdexecbuf, schedlibdir, patchdir, ninsig, noutsig, samplerate, pdargs);
 #if 0
 #ifdef PD
     fprintf(stderr, "%s", cmdbuf);
@@ -368,6 +370,7 @@ static void pd_tilde_pdtilde(t_pd_tilde *x, t_symbol *s,
 {
     t_symbol *sel = ((argc > 0 && argv->a_type == A_SYMBOL) ?
         argv->a_w.w_symbol : gensym("?"));
+    char *patchdir;
     if (sel == gensym("start"))
     {
         char pdargstring[MAXPDSTRING];
@@ -383,6 +386,7 @@ static void pd_tilde_pdtilde(t_pd_tilde *x, t_symbol *s,
             if (strlen(pdargstring) < MAXPDSTRING-1)
                 strcat(pdargstring, " ");
         }
+        patchdir = canvas_getdir(x->x_canvas)->s_name;
 #endif
 #ifdef MAX
         while (argc--)
@@ -401,9 +405,11 @@ static void pd_tilde_pdtilde(t_pd_tilde *x, t_symbol *s,
             strcat(pdargstring, " ");
             argv++;
         }
+        patchdir = ".";
 #endif
         pd_tilde_donew(x, x->x_pddir->s_name, x->x_schedlibdir->s_name,
-            pdargstring, x->x_ninsig, x->x_noutsig, x->x_fifo, x->x_sr);
+            patchdir, pdargstring, x->x_ninsig, x->x_noutsig, x->x_fifo,
+                x->x_sr);
     }
     else if (sel == gensym("stop"))
     {
@@ -540,6 +546,7 @@ static void *pd_tilde_new(t_symbol *s, int argc, t_atom *argv)
     x->x_outfd = 0;
     x->x_childpid = -1;
     x->x_msgbuf = 0;
+    x->x_canvas = canvas_getcurrent();
     for (j = 1, g = x->x_insig; j < ninsig; j++, g++)
         inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
     x->x_outlet1 = outlet_new(&x->x_obj, 0);
diff --git a/extra/sigmund~/sigmund~.c b/extra/sigmund~/sigmund~.c
index 776696019..0f8b9283e 100644
--- a/extra/sigmund~/sigmund~.c
+++ b/extra/sigmund~/sigmund~.c
@@ -363,7 +363,7 @@ static void sigmund_getrawpeaks(int npts, float *insamps,
 #define PITCHUNCERTAINTY 0.3
 #define HALFTONEINC 0.059
 #define SUBHARMONICS 16
-#define DBPERHALFTONE 0.5
+#define DBPERHALFTONE 0.0
 
 static void sigmund_getpitch(int npeak, t_peak *peakv, float *freqp,
     float npts, float srate, int loud)
@@ -405,8 +405,6 @@ static void sigmund_getpitch(int npeak, t_peak *peakv, float *freqp,
     for (i = 0; i < nsalient; i++)
     {
         t_peak *thispeak = bigpeaks[i];
-        float pitchuncertainty =
-            4 * PITCHUNCERTAINTY * fperbin / (HALFTONEINC * thispeak->p_freq);
         float weightindex = (48./LOG2) *
             log(thispeak->p_freq/(2.*fperbin));
         float loudness = sqrt(thispeak->p_amp);
@@ -415,8 +413,8 @@ static void sigmund_getpitch(int npeak, t_peak *peakv, float *freqp,
         {
             float subindex = weightindex -
                 (48./LOG2) * log(j + 1.);
-            int loindex = subindex - pitchuncertainty;
-            int hiindex = subindex + pitchuncertainty + 1;
+            int loindex = subindex - 0.5;
+            int hiindex = loindex+2;
             if (hiindex < 0)
                 break;
             if (hiindex >= npit)
@@ -424,7 +422,7 @@ static void sigmund_getpitch(int npeak, t_peak *peakv, float *freqp,
             if (loindex < 0)
                 loindex = 0;
             for (k = loindex; k <= hiindex; k++)
-                weights[k] += loudness * 4. / (4. + j);
+                weights[k] += loudness * 6. / (6. + j);
         }
         sumweight += loudness;
     }
@@ -441,29 +439,35 @@ static void sigmund_getpitch(int npeak, t_peak *peakv, float *freqp,
         freq = 0;
         goto done;
     }
-    for (i = bestbin+1; i < npit; i++)
+    if (bestbin > 0 && bestbin < npit-1)
     {
-        if (weights[i] < bestweight)
-            break;
-        bestbin += 0.5;
+        int ibest = bestbin;
+        bestbin += (weights[ibest+1] - weights[ibest-1]) /
+            (weights[ibest+1] +  weights[ibest] + weights[ibest-1]);
     }
     freq = 2*fperbin * exp((LOG2/48.)*bestbin);
-
     for (sumamp = sumweight = sumfreq = 0, i = 0; i < nsalient; i++)
     {
         t_peak *thispeak = bigpeaks[i];
-        float thisloudness = sqrt(thispeak->p_amp);
+        float thisloudness = thispeak->p_amp;
         float thisfreq = thispeak->p_freq;
         float harmonic = thisfreq/freq;
         float intpart = (int)(0.5 + harmonic);
-        float inharm = freq * (harmonic - intpart);
-        if (harmonic < 1)
-            continue;
-        if (inharm < 0.25*fperbin && inharm > -0.25*fperbin)
+        float inharm = harmonic - intpart;
+#if 0
+        if (loud)
+            post("freq %f intpart %f inharm %f", freq, intpart, inharm);
+#endif
+        if (intpart >= 1 && intpart <= 16 &&
+            inharm < 0.015 * intpart && inharm > - (0.015 * intpart))
         {
             float weight = thisloudness * intpart;
             sumweight += weight;
             sumfreq += weight*thisfreq/intpart;
+#if 0
+            if (loud)
+                post("weight %f freq %f", weight, thisfreq);
+#endif
         }
     }
     if (sumweight > 0)
diff --git a/extra/stdout/stdout-help.pd b/extra/stdout/stdout-help.pd
index b3d024896..91edbc417 100644
--- a/extra/stdout/stdout-help.pd
+++ b/extra/stdout/stdout-help.pd
@@ -1,13 +1,19 @@
-#N canvas 110 37 789 525 10;
-#X msg 84 147 walk the dog;
-#X msg 91 169 1;
-#X msg 90 215 flush;
-#X obj 84 240 stdout;
-#X text 472 410 updated for Pd version 0.42;
+#N canvas 121 60 488 321 12;
+#X msg 126 203 walk the dog;
+#X msg 117 156 1;
+#X obj 117 240 stdout;
+#X text 269 287 updated for Pd version 0.42;
 #X obj 14 13 stdout;
 #X text 67 14 - write messages to standard output;
-#X msg 96 192 1 2;
-#X connect 0 0 3 0;
-#X connect 1 0 3 0;
-#X connect 2 0 3 0;
-#X connect 7 0 3 0;
+#X msg 122 179 1 2;
+#X obj 119 291 pd~;
+#X text 44 291 see also:;
+#X text 34 39 Sends messages to Pd's standard output. This is useful
+in conjunction with the pd~ object \, which starts a pd sub-process.
+Messages sent to the sub-process standard output appear on the output
+of the pd~ object in the owning process. This might also be useful
+in other situations. Note that there's no corresponding "stdin" object
+- there seems to be no one canonical way such a thing should act.;
+#X connect 0 0 2 0;
+#X connect 1 0 2 0;
+#X connect 6 0 2 0;
diff --git a/extra/stdout/stdout.c b/extra/stdout/stdout.c
index 06c99308b..5cd52f25c 100644
--- a/extra/stdout/stdout.c
+++ b/extra/stdout/stdout.c
@@ -37,7 +37,7 @@ static void stdout_anything(t_stdout *x, t_symbol *s, int argc, t_atom *argv)
     printf("%s;\n", msgbuf);
 }
 
-static void stdout_flush(t_stdout *x)
+static void stdout_free(t_stdout *x)
 {
     fflush(stdout);
 }
@@ -45,7 +45,6 @@ static void stdout_flush(t_stdout *x)
 void stdout_setup(void)
 {
     stdout_class = class_new(gensym("stdout"), (t_newmethod)stdout_new,
-        (t_method)stdout_flush, sizeof(t_stdout), 0, 0);
-    class_addmethod(stdout_class, (t_method)stdout_flush, gensym("flush"), 0);
+        (t_method)stdout_free, sizeof(t_stdout), 0, 0);
     class_addanything(stdout_class, stdout_anything);
 }
diff --git a/linux/cp-to-max.sh b/linux/cp-to-max.sh
old mode 100644
new mode 100755
diff --git a/src/m_pd.h b/src/m_pd.h
index 438b9f61e..3e686aa19 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 42
 #define PD_BUGFIX_VERSION 0
-#define PD_TEST_VERSION "test5"
+#define PD_TEST_VERSION "test6"
 
 /* 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 */
-- 
GitLab