diff options
Diffstat (limited to 'pd/src/d_misc.c')
-rw-r--r-- | pd/src/d_misc.c | 260 |
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(); +} + + + + |