Update of /cvsroot/pure-data/pd/extra/sigmund~ In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29296/pd/extra/sigmund~
Modified Files: sigmund~.c Log Message: various bug fixes.
Index: sigmund~.c =================================================================== RCS file: /cvsroot/pure-data/pd/extra/sigmund~/sigmund~.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** sigmund~.c 22 Oct 2006 21:46:10 -0000 1.2 --- sigmund~.c 20 Jul 2007 03:25:20 -0000 1.3 *************** *** 182,185 **** --- 182,202 ---- }
+ static void sigmund_remask(int maxbin, int bestindex, float powmask, + float maxpower, float *maskbuf) + { + int bin; + int bin1 = (bestindex > 52 ? bestindex-50:2); + int bin2 = (maxbin < bestindex + 50 ? bestindex + 50 : maxbin); + for (bin = bin1; bin < bin2; bin++) + { + float bindiff = bin - bestindex; + float mymask; + mymask = powmask/ (1. + bindiff * bindiff * bindiff * bindiff); + if (bindiff < 2 && bindiff > -2) + mymask = 2*maxpower; + if (mymask > maskbuf[bin]) + maskbuf[bin] = mymask; + } + }
static void sigmund_getrawpeaks(int npts, float *insamps, *************** *** 192,199 **** int count, peakcount = 0; float *fp1, *fp2; ! float *rawpow, *rawreal, *rawimag, *maskbuf; ! float *bigbuf = alloca(sizeof (float ) * (2*NEGBINS + 5*npts)); int maxbin = hifreq/fperbin; - int altwind = (param3 == 1); int tweak = (param3 == 0); if (maxbin > npts - NEGBINS) --- 209,215 ---- int count, peakcount = 0; float *fp1, *fp2; ! float *rawpow, *rawreal, *rawimag, *maskbuf, *powbuf; ! float *bigbuf = alloca(sizeof (float ) * (2*NEGBINS + 6*npts)); int maxbin = hifreq/fperbin; int tweak = (param3 == 0); if (maxbin > npts - NEGBINS) *************** *** 201,205 **** if (loud) post("tweak %d", tweak); maskbuf = bigbuf + npts2; ! rawreal = maskbuf + npts+NEGBINS; rawimag = rawreal+npts+NEGBINS; for (i = 0; i < npts; i++) --- 217,222 ---- if (loud) post("tweak %d", tweak); maskbuf = bigbuf + npts2; ! powbuf = maskbuf + npts; ! rawreal = powbuf + npts+NEGBINS; rawimag = rawreal+npts+NEGBINS; for (i = 0; i < npts; i++) *************** *** 237,241 **** rawimag[-3] = -rawimag[3]; rawimag[-4] = -rawimag[4]; ! for (peakcount = 0; peakcount < npeak; peakcount++) { --- 254,265 ---- rawimag[-3] = -rawimag[3]; rawimag[-4] = -rawimag[4]; ! #if 1 ! for (i = 0, fp1 = rawreal, fp2 = rawimag; i < npts-1; i++, fp1++, fp2++) ! { ! float x1 = fp1[1] - fp1[-1], x2 = fp2[1] - fp2[-1]; ! powbuf[i] = x1*x1+x2*x2; ! } ! powbuf[npts-1] = 0; ! #endif for (peakcount = 0; peakcount < npeak; peakcount++) { *************** *** 244,274 **** ampoutreal, ampoutimag, freqout, freqcount1, freqcount2, powmask; int bestindex = -1; for (bin = 2, fp1 = rawreal+2, fp2 = rawimag+2; bin < maxbin; bin++, fp1++, fp2++) { ! float x1, x2, a1, a2, b1, b2, thresh; ! if (altwind) ! { ! x1 = fp1[0] - 0.5*(fp1[-2] +fp1[2]); ! x2 = fp2[0] - 0.5*(fp2[-2] +fp2[2]); ! a1 = fp1[4] - 0.5*(fp1[2] +fp1[6]); ! a2 = fp2[2] - 0.5*(fp2[2] +fp2[6]); ! b1 = fp1[-4] - 0.5*(fp1[-2] +fp1[-6]); ! b2 = fp2[-4] - 0.5*(fp2[-2] +fp2[-6]); ! thresh = param2 * (a1*a1+a2*a2+b1*b1+b2*b2); ! } ! else ! { ! x1 = fp1[1] - fp1[-1]; ! x2 = fp2[1] - fp2[-1]; ! a1 = fp1[3] - fp1[1]; ! a2 = fp2[3] - fp2[1]; ! b1 = fp1[-1] - fp1[-3]; ! b2 = fp2[-1] - fp2[-3]; ! thresh = param2 * (a1*a1+a2*a2+b1*b1+b2*b2); ! } ! pow1 = x1*x1+x2*x2; if (pow1 > maxpower && pow1 > maskbuf[bin]) { if (pow1 > thresh) maxpower = pow1, bestindex = bin; --- 268,279 ---- ampoutreal, ampoutimag, freqout, freqcount1, freqcount2, powmask; int bestindex = -1; + for (bin = 2, fp1 = rawreal+2, fp2 = rawimag+2; bin < maxbin; bin++, fp1++, fp2++) { ! pow1 = powbuf[bin]; if (pow1 > maxpower && pow1 > maskbuf[bin]) { + float thresh = param2 * (powbuf[bin-2]+powbuf[bin+2]); if (pow1 > thresh) maxpower = pow1, bestindex = bin; *************** *** 276,279 **** --- 281,285 ---- totalpower += pow1; } + if (totalpower <= 0 || maxpower < 1e-10*totalpower || bestindex < 0) break; *************** *** 285,328 **** post("maxpower %f, powmask %f, param1 %f", maxpower, powmask, param1); ! for (bin = 2; bin < maxbin; bin++) ! { ! float bindiff = bin - bestindex; ! float mymask = ! powmask/ (1. + bindiff * bindiff * bindiff * bindiff); ! if (bindiff < 2 && bindiff > -2) ! mymask = 2*maxpower; ! if (mymask > maskbuf[bin]) ! maskbuf[bin] = mymask; ! }
if (loud > 1) post("best index %d, total power %f", bestindex, totalpower); ! if (altwind) ! { ! windreal = W_ALPHA * fp1[0] - (0.5 * W_BETA) * (fp1[2] + fp1[-2]); ! windimag = W_ALPHA * fp2[0] - (0.5 * W_BETA) * (fp2[2] + fp2[-2]); ! windpower = windreal * windreal + windimag * windimag; ! detune = ( ! (W_BETA*(rawreal[bestindex-2] - rawreal[bestindex+2])) * ! (2.0 * W_ALPHA * rawreal[bestindex] - ! W_BETA * (rawreal[bestindex-2] + rawreal[bestindex+2])) ! + ! (W_BETA*(rawimag[bestindex-2] - rawimag[bestindex+2])) * ! (2.0 * W_ALPHA * rawimag[bestindex] - ! W_BETA * (rawimag[bestindex-2] + rawimag[bestindex+2])) ! ) / (4.0 * windpower); ! } ! else ! { ! windreal = fp1[1] - fp1[-1]; ! windimag = fp2[1] - fp2[-1]; ! windpower = windreal * windreal + windimag * windimag; ! detune = ((fp1[1] * fp1[1] - fp1[-1]*fp1[-1]) ! + (fp2[1] * fp2[1] - fp2[-1]*fp2[-1])) / (2 * windpower); ! if (loud > 2) post("(-1) %f %f; (1) %f %f", ! fp1[-1], fp2[-1], fp1[1], fp2[1]); ! if (loud > 2) post("peak %f %f", ! fp1[0], fp2[0]); ! } if (detune > 0.5) detune = 0.5; --- 291,309 ---- post("maxpower %f, powmask %f, param1 %f", maxpower, powmask, param1); ! sigmund_remask(maxbin, bestindex, powmask, maxpower, maskbuf);
if (loud > 1) post("best index %d, total power %f", bestindex, totalpower); ! ! windreal = fp1[1] - fp1[-1]; ! windimag = fp2[1] - fp2[-1]; ! windpower = windreal * windreal + windimag * windimag; ! detune = ((fp1[1] * fp1[1] - fp1[-1]*fp1[-1]) ! + (fp2[1] * fp2[1] - fp2[-1]*fp2[-1])) / (2 * windpower); ! if (loud > 2) post("(-1) %f %f; (1) %f %f", ! fp1[-1], fp2[-1], fp1[1], fp2[1]); ! if (loud > 2) post("peak %f %f", ! fp1[0], fp2[0]); ! if (detune > 0.5) detune = 0.5; *************** *** 335,341 **** sinpidetune = sin(pidetune); cospidetune = cos(pidetune); ! if (altwind) ! ampcorrect = 1.0 / window_hann_mag(pidetune, sinpidetune); ! else ampcorrect = 1.0 / window_mag(pidetune, cospidetune);
ampout = ampcorrect *sqrt(windpower); --- 316,320 ---- sinpidetune = sin(pidetune); cospidetune = cos(pidetune); ! ampcorrect = 1.0 / window_mag(pidetune, cospidetune);
ampout = ampcorrect *sqrt(windpower); *************** *** 845,852 **** { t_sigmund *x = (t_sigmund *)pd_new(sigmund_class); x->x_param1 = 0; x->x_param2 = 0.6; x->x_param3 = 0; - x->x_npts = NPOINTS_DEF; x->x_hop = HOP_DEF; x->x_mode = MODE_STREAM; --- 824,831 ---- { t_sigmund *x = (t_sigmund *)pd_new(sigmund_class); + x->x_npts = NPOINTS_DEF; x->x_param1 = 0; x->x_param2 = 0.6; x->x_param3 = 0; x->x_hop = HOP_DEF; x->x_mode = MODE_STREAM; *************** *** 864,868 **** x->x_ntrack = 0; x->x_dopitch = x->x_donote = x->x_dotracks = 0; ! while (argc > 0) { --- 843,848 ---- x->x_ntrack = 0; x->x_dopitch = x->x_donote = x->x_dotracks = 0; ! x->x_inbuf = 0; ! while (argc > 0) { *************** *** 887,891 **** else if (!strcmp(firstarg->s_name, "-npts") && argc > 1) { ! sigmund_npts(x, atom_getfloatarg(1, argc, argv)); argc -= 2; argv += 2; } --- 867,871 ---- else if (!strcmp(firstarg->s_name, "-npts") && argc > 1) { ! x->x_npts = atom_getfloatarg(1, argc, argv); argc -= 2; argv += 2; } *************** *** 1009,1027 **** x->x_clock = clock_new(&x->x_obj.ob_pd, (t_method)sigmund_clock);
- /* check parameter ranges */ - if (x->x_npts < NPOINTS_MIN) - post("sigmund~: minimum points %d", NPOINTS_MIN), - x->x_npts = NPOINTS_MIN; - if (x->x_npts != (1 << sigmund_ilog2(x->x_npts))) - post("sigmund~: adjusting analysis size to %d points", - (x->x_npts = (1 << sigmund_ilog2(x->x_npts)))); - if (x->x_hop != (1 << sigmund_ilog2(x->x_hop))) - post("sigmund~: adjusting hop size to %d points", - (x->x_hop = (1 << sigmund_ilog2(x->x_hop)))); - if (x->x_mode == MODE_STREAM) - x->x_inbuf = getbytes(sizeof(*x->x_inbuf) * x->x_npts); - else x->x_inbuf = 0; x->x_infill = 0; x->x_countdown = 0; notefinder_init(&x->x_notefinder); sigmund_clear(x); --- 989,995 ---- x->x_clock = clock_new(&x->x_obj.ob_pd, (t_method)sigmund_clock);
x->x_infill = 0; x->x_countdown = 0; + sigmund_npts(x, x->x_npts); notefinder_init(&x->x_notefinder); sigmund_clear(x); *************** *** 1159,1170 **** static void sigmund_npts(t_sigmund *x, t_floatarg f) { ! x->x_npts = f; /* check parameter ranges */ ! if (x->x_npts < NPOINTS_MIN) post("sigmund~: minimum points %d", NPOINTS_MIN), ! x->x_npts = NPOINTS_MIN; ! if (x->x_npts != (1 << sigmund_ilog2(x->x_npts))) post("sigmund~: adjusting analysis size to %d points", ! (x->x_npts = (1 << sigmund_ilog2(x->x_npts)))); }
--- 1127,1149 ---- static void sigmund_npts(t_sigmund *x, t_floatarg f) { ! int nwas = x->x_npts, npts = f; /* check parameter ranges */ ! if (npts < NPOINTS_MIN) post("sigmund~: minimum points %d", NPOINTS_MIN), ! npts = NPOINTS_MIN; ! if (npts != (1 << sigmund_ilog2(npts))) post("sigmund~: adjusting analysis size to %d points", ! (npts = (1 << sigmund_ilog2(npts)))); ! if (npts != nwas) ! x->x_countdown = x->x_infill = 0; ! if (x->x_mode == MODE_STREAM) ! { ! if (x->x_inbuf) ! x->x_inbuf = resizebytes(x->x_inbuf, ! sizeof(*x->x_inbuf) * nwas, sizeof(*x->x_inbuf) * npts); ! else x->x_inbuf = getbytes(sizeof(*x->x_inbuf) * npts); ! } ! else x->x_inbuf = 0; ! x->x_npts = npts; }
*************** *** 1262,1265 **** --- 1241,1246 ---- int n = (int)(w[3]);
+ if (x->x_hop % n) + return (w+4); if (x->x_countdown > 0) x->x_countdown -= n; *************** *** 1331,1335 **** class_addmethod(sigmund_class, (t_method)sigmund_printnext, gensym("printnext"), A_FLOAT, 0); ! post("sigmund version 0.02"); }
--- 1312,1316 ---- class_addmethod(sigmund_class, (t_method)sigmund_printnext, gensym("printnext"), A_FLOAT, 0); ! post("sigmund version 0.03"); }