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 ----------------------------- */