aboutsummaryrefslogtreecommitdiff
path: root/pd/src/d_misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'pd/src/d_misc.c')
-rw-r--r--pd/src/d_misc.c260
1 files changed, 260 insertions, 0 deletions
diff --git a/pd/src/d_misc.c b/pd/src/d_misc.c
new file mode 100644
index 00000000..35f4af0b
--- /dev/null
+++ b/pd/src/d_misc.c
@@ -0,0 +1,260 @@
+/* Copyright (c) 1997-1999 Miller Puckette.
+* For information on usage and redistribution, and for a DISCLAIMER OF ALL
+* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
+
+/* miscellaneous: print~; more to come.
+*/
+
+#include "m_pd.h"
+#include <stdio.h>
+#include <string.h>
+
+/* ------------------------- print~ -------------------------- */
+static t_class *print_class;
+
+typedef struct _print
+{
+ t_object x_obj;
+ float x_f;
+ t_symbol *x_sym;
+ int x_count;
+} t_print;
+
+static t_int *print_perform(t_int *w)
+{
+ t_print *x = (t_print *)(w[1]);
+ t_float *in = (t_float *)(w[2]);
+ int n = (int)(w[3]);
+ if (x->x_count)
+ {
+ post("%s:", x->x_sym->s_name);
+ if (n == 1) post("%8g", in[0]);
+ else if (n == 2) post("%8g %8g", in[0], in[1]);
+ else if (n == 4) post("%8g %8g %8g %8g",
+ in[0], in[1], in[2], in[3]);
+ else while (n > 0)
+ {
+ post("%-8.5g %-8.5g %-8.5g %-8.5g %-8.5g %-8.5g %-8.5g %-8.5g",
+ in[0], in[1], in[2], in[3], in[4], in[5], in[6], in[7]);
+ n -= 8;
+ in += 8;
+ }
+ x->x_count--;
+ }
+ return (w+4);
+}
+
+static void print_dsp(t_print *x, t_signal **sp)
+{
+ dsp_add(print_perform, 3, x, sp[0]->s_vec, sp[0]->s_n);
+}
+
+static void print_float(t_print *x, t_float f)
+{
+ if (f < 0) f = 0;
+ x->x_count = f;
+}
+
+static void print_bang(t_print *x)
+{
+ x->x_count = 1;
+}
+
+static void *print_new(t_symbol *s)
+{
+ t_print *x = (t_print *)pd_new(print_class);
+ x->x_sym = (s->s_name[0]? s : gensym("print~"));
+ x->x_count = 0;
+ x->x_f = 0;
+ return (x);
+}
+
+static void print_setup(void)
+{
+ print_class = class_new(gensym("print~"), (t_newmethod)print_new, 0,
+ sizeof(t_print), 0, A_DEFSYM, 0);
+ CLASS_MAINSIGNALIN(print_class, t_print, x_f);
+ class_addmethod(print_class, (t_method)print_dsp, gensym("dsp"), 0);
+ class_addbang(print_class, print_bang);
+ class_addfloat(print_class, print_float);
+}
+
+/* ------------------------- scope~ -------------------------- */
+/* this has been replaced by arrays; to be deleted later */
+
+#include "g_canvas.h"
+
+static t_class *scope_class;
+
+#define SCOPESIZE 256
+
+typedef struct _scope
+{
+ t_object x_obj;
+ t_sample x_samps[SCOPESIZE];
+ int x_phase;
+ int x_drawn;
+ void *x_canvas;
+} t_scope;
+
+static t_int *scope_perform(t_int *w)
+{
+ t_scope *x = (t_scope *)(w[1]);
+ t_float *in = (t_float *)(w[2]);
+ int n = (int)(w[3]), phase = x->x_phase;
+ while (n--)
+ {
+ x->x_samps[phase] = *in++;
+ phase = (phase + 1) & (SCOPESIZE-1);
+ }
+ x->x_phase = phase;
+ return (w+4);
+}
+
+static void scope_dsp(t_scope *x, t_signal **sp)
+{
+ dsp_add(scope_perform, 3, x, sp[0]->s_vec, sp[0]->s_n);
+}
+
+static void scope_erase(t_scope *x)
+{
+ if (x->x_drawn) sys_vgui(".x%x.c delete gumbo\n", x->x_canvas);
+}
+
+#define X1 10.
+#define X2 20.
+#define YC 5.
+static void scope_bang(t_scope *x)
+{
+ int n, phase;
+ char hugebuf[10000], *s = hugebuf;
+ scope_erase(x);
+ sys_vgui(".x%x.c create line 10c 5c 20c 5c -tags gumbo\n", x->x_canvas);
+ sprintf(s, ".x%x.c create line ", (t_int)x->x_canvas);
+ s += strlen(s);
+ for (n = 0, phase = x->x_phase;
+ n < SCOPESIZE; phase = ((phase+1) & (SCOPESIZE-1)), n++)
+ {
+ sprintf(s, "%fc %fc ", X1 + (X2 - X1) * (float)n * (1./SCOPESIZE),
+ YC - 5 * x->x_samps[phase]);
+ s += strlen(s);
+ /* post("phase %d", phase); */
+ }
+ sprintf(s, "-tags gumbo\n");
+ sys_gui(hugebuf);
+ x->x_drawn = 1;
+}
+
+static void scope_free(t_scope *x)
+{
+ scope_erase(x);
+}
+
+static void *scope_new(t_symbol *s)
+{
+ t_scope *x = (t_scope *)pd_new(scope_class);
+ error("scope: this is now obsolete; use arrays and tabwrite~ instead");
+ x->x_phase = 0;
+ x->x_drawn = 0;
+ x->x_canvas = canvas_getcurrent();
+ return (x);
+}
+
+static void scope_setup(void)
+{
+ scope_class = class_new(gensym("scope~"), (t_newmethod)scope_new,
+ (t_method)scope_free, sizeof(t_scope), 0, A_DEFSYM, 0);
+ class_addmethod(scope_class, nullfn, gensym("signal"), 0);
+ class_addmethod(scope_class, (t_method)scope_dsp, gensym("dsp"), 0);
+ class_addbang(scope_class, scope_bang);
+}
+
+/* ------------------------ bang~ -------------------------- */
+
+static t_class *bang_tilde_class;
+
+typedef struct _bang
+{
+ t_object x_obj;
+ t_clock *x_clock;
+} t_bang;
+
+static t_int *bang_tilde_perform(t_int *w)
+{
+ t_bang *x = (t_bang *)(w[1]);
+ clock_delay(x->x_clock, 0);
+ return (w+2);
+}
+
+static void bang_tilde_dsp(t_bang *x, t_signal **sp)
+{
+ dsp_add(bang_tilde_perform, 1, x);
+}
+
+static void bang_tilde_tick(t_bang *x)
+{
+ outlet_bang(x->x_obj.ob_outlet);
+}
+
+static void bang_tilde_free(t_bang *x)
+{
+ clock_free(x->x_clock);
+}
+
+static void *bang_tilde_new(t_symbol *s)
+{
+ t_bang *x = (t_bang *)pd_new(bang_tilde_class);
+ x->x_clock = clock_new(x, (t_method)bang_tilde_tick);
+ outlet_new(&x->x_obj, &s_bang);
+ return (x);
+}
+
+static void bang_tilde_setup(void)
+{
+ bang_tilde_class = class_new(gensym("bang~"), (t_newmethod)bang_tilde_new,
+ (t_method)bang_tilde_free, sizeof(t_bang), 0, 0);
+ class_addmethod(bang_tilde_class, (t_method)bang_tilde_dsp,
+ gensym("dsp"), 0);
+}
+
+/* ------------------------ samplerate~~ -------------------------- */
+
+static t_class *samplerate_tilde_class;
+
+typedef struct _samplerate
+{
+ t_object x_obj;
+} t_samplerate;
+
+static void samplerate_tilde_bang(t_samplerate *x)
+{
+ outlet_float(x->x_obj.ob_outlet, sys_getsr());
+}
+
+static void *samplerate_tilde_new(t_symbol *s)
+{
+ t_samplerate *x = (t_samplerate *)pd_new(samplerate_tilde_class);
+ outlet_new(&x->x_obj, &s_float);
+ return (x);
+}
+
+static void samplerate_tilde_setup(void)
+{
+ samplerate_tilde_class = class_new(gensym("samplerate~"),
+ (t_newmethod)samplerate_tilde_new, 0, sizeof(t_samplerate), 0, 0);
+ class_addbang(samplerate_tilde_class, samplerate_tilde_bang);
+}
+
+/* ------------------------ global setup routine ------------------------- */
+
+void d_misc_setup(void)
+{
+ print_setup();
+ scope_setup();
+ bang_tilde_setup();
+ samplerate_tilde_setup();
+}
+
+
+
+