diff --git a/pd/doc/5.reference/log~-help.pd b/pd/doc/5.reference/log~-help.pd index 3d5abf492187aac231622082c2b0c6a8020958f0..994ada04776c62d27e29f731ddc4319f8d091d65 100644 --- a/pd/doc/5.reference/log~-help.pd +++ b/pd/doc/5.reference/log~-help.pd @@ -17,7 +17,7 @@ for Pd-l2ork version 2013.05.28; signal; #X text 14 65 INLET_0 signal; #X text 14 105 OUTLET_0 signal; -#X restore 498 375 pd META; +#X restore 499 377 pd META; #X obj -2 296 cnv 3 550 3 empty \$0-pddp.cnv.outlets outlets 8 12 0 13 -228856 -1 0; #X obj -2 333 cnv 3 550 3 empty \$0-pddp.cnv.argument arguments 8 12 @@ -44,15 +44,15 @@ signal; #X text 109 307 signal; #X text 179 307 - log of the signal with specified base; #X text 91 346 1) float; -#X text 179 344 - set the base of the logarithm.; +#X text 179 346 - set the base of the logarithm.; #X obj 480 -56 pddp/dsp; -#X obj 7 373 pddp/pddplink all_about_help_patches.pd -text Usage Guide +#X obj 3 375 pddp/pddplink all_about_help_patches.pd -text Usage Guide ; -#X obj 54 56 sig~; +#X obj 55 56 sig~; #X obj 126 112 loadbang; #X obj 126 136 metro 100; #X obj 113 162 snapshot~; -#X floatatom 54 32 5 0 0 0 - - -, f 5; +#X floatatom 55 32 5 0 0 0 - - -, f 5; #X obj 95 56 sig~; #X floatatom 95 32 5 0 0 0 - - -, f 5; #X floatatom 113 187 7 0 0 0 - - -, f 7; @@ -126,6 +126,5 @@ input.; #X connect 24 0 25 0; #X connect 25 0 29 0; #X connect 26 0 22 0; -#X connect 27 0 31 1; #X connect 28 0 27 0; #X connect 31 0 25 0; diff --git a/pd/src/d_math.c b/pd/src/d_math.c index bed0e581619d4223d825edcf3e2eeec3369b6a74..387e0752af6895516c03f4c6cac6f70f89a54740 100644 --- a/pd/src/d_math.c +++ b/pd/src/d_math.c @@ -696,7 +696,7 @@ static void exp_tilde_setup(void) } /* ----------------------------- log ----------------------------- */ -static t_class *log_tilde_class; +static t_class *log_tilde_class, *scalarlog_tilde_class; typedef struct _log_tilde { @@ -704,13 +704,36 @@ typedef struct _log_tilde t_float x_f; } t_log_tilde; +typedef struct _scalarlog_tilde +{ + t_object x_obj; + t_float x_f; + t_float x_g; +} t_scalarlog_tilde; + +#include<stdio.h> + static void *log_tilde_new(t_symbol *s, int argc, t_atom *argv) { - t_log_tilde *x = (t_log_tilde *)pd_new(log_tilde_class); - inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); - outlet_new(&x->x_obj, &s_signal); - x->x_f = 0; - return (x); + if (argc > 1) post("log~: extra arguments ignored"); + if (argc) + { + t_scalarlog_tilde *x = + (t_scalarlog_tilde *)pd_new(scalarlog_tilde_class); + floatinlet_new(&x->x_obj, &x->x_g); + x->x_g = atom_getfloatarg(0, argc, argv); + outlet_new(&x->x_obj, &s_signal); + x->x_f = 0; + return (x); + } + else + { + t_log_tilde *x = (t_log_tilde *)pd_new(log_tilde_class); + inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); + x->x_f = 0; + outlet_new(&x->x_obj, &s_signal); + return (x); + } } t_int *log_tilde_perform(t_int *w) @@ -732,18 +755,49 @@ t_int *log_tilde_perform(t_int *w) return (w+5); } +t_int *scalarlog_tilde_perform(t_int *w) +{ + t_sample *in = (t_sample *)(w[1]); + t_float g = *(t_float *)(w[2]); + t_sample *out = (t_sample *)(w[3]); + int n = (int)(w[4]); + while (n--) + { + t_float f = *in++; + if (f <= 0) + *out = -1000; /* rather than blow up, output a number << 0 */ + else if (g <= 0) + *out = log(f); + else *out = log(f)/log(g); + out++; + } + return(w+5); +} + static void log_tilde_dsp(t_log_tilde *x, t_signal **sp) { dsp_add(log_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n); } +static void scalarlog_tilde_dsp(t_scalarlog_tilde *x, t_signal **sp) +{ + dsp_add(scalarlog_tilde_perform, 4, + sp[0]->s_vec, &x->x_g, sp[1]->s_vec, sp[0]->s_n); +} + static void log_tilde_setup(void) { log_tilde_class = class_new(gensym("log~"), (t_newmethod)log_tilde_new, 0, - sizeof(t_log_tilde), 0, A_DEFFLOAT, 0); + sizeof(t_log_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(log_tilde_class, t_log_tilde, x_f); class_addmethod(log_tilde_class, (t_method)log_tilde_dsp, gensym("dsp"), 0); + + scalarlog_tilde_class = class_new(gensym("log~"), 0, 0, + sizeof(t_scalarlog_tilde), 0, 0); + CLASS_MAINSIGNALIN(scalarlog_tilde_class, t_scalarlog_tilde, x_f); + class_addmethod(scalarlog_tilde_class, (t_method)scalarlog_tilde_dsp, + gensym("dsp"), 0); } /* ----------------------------- abs ----------------------------- */