From 05d113a99794fb2e5cbd9fa624e73a53e9c64882 Mon Sep 17 00:00:00 2001 From: Thomas O Fredericks Date: Wed, 2 Apr 2008 18:09:56 +0000 Subject: Added phasorshot~ external to tof svn path=/trunk/externals/tof/; revision=9674 --- help/phasorshot~-help.pd | 70 ++++++++++++++++ src/phasorshot~.c | 213 +++++++++++++++++++++++++++++++++++++++++++++++ src/w_breakpoints.h | 2 +- 3 files changed, 284 insertions(+), 1 deletion(-) create mode 100755 help/phasorshot~-help.pd create mode 100755 src/phasorshot~.c diff --git a/help/phasorshot~-help.pd b/help/phasorshot~-help.pd new file mode 100755 index 0000000..b18e457 --- /dev/null +++ b/help/phasorshot~-help.pd @@ -0,0 +1,70 @@ +#N canvas 67 5 618 599 10; +#X text 390 204 Arguments:; +#X obj 372 207 cnv 15 15 15 empty empty empty 20 12 0 14 -258113 -66577 +0; +#X obj 63 513 snapshot~; +#X obj 92 488 metro 100; +#X obj 92 464 loadbang; +#X obj 59 551 nbx 10 14 -1e+037 1e+037 0 0 empty empty empty 0 -8 0 +10 -1 -262144 -1 0 256; +#X obj 381 507 soundfiler; +#X msg 381 469 read -resize \$1 \$2; +#X obj 381 438 list append \$0table; +#X obj 381 405 openpanel; +#X obj 381 381 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 +-1 -1; +#X floatatom 381 533 10 0 0 0 - - -; +#X obj 244 471 table \$0table; +#X obj 177 297 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 +1; +#X msg 58 154 0.1; +#X msg 89 156 -0.1; +#X msg 128 156 -0.5; +#X msg 134 250 0.9; +#X msg 166 247 0; +#X msg 25 154 1; +#X obj 140 363 print UPPER; +#X obj 143 401 print LOWER; +#X obj 222 496 *~; +#X obj 220 561 dac~; +#X obj 221 525 tabread4~ \$0table; +#X msg 169 156 0.5; +#X msg 201 249 0.5; +#X obj 62 338 phasorshot~; +#X text 60 11 Description: A one shot phasor~.; +#X text 48 33 phasorshot~ is exactly like a phasor except that you +can disabling it's looping \, therefore making it a one shot lookup +signal.; +#X text 55 80 Of course line~ does something similar \, but with phasorshot~ +you can change the speed DURING the ramp.; +#X text 33 121 Inlet 1: frequency; +#X text 149 222 Inlet 2: phasee; +#X text 212 297 Inlet 3: loop off/on; +#X text 373 225 1) loop off/on; +#X text 155 329 Outlets 2 and 3 bang if looping is turned off and either +the upper (1) or lower (0) bound is reached.; +#X connect 2 0 5 0; +#X connect 3 0 2 0; +#X connect 4 0 3 0; +#X connect 6 0 11 0; +#X connect 6 0 22 1; +#X connect 7 0 6 0; +#X connect 8 0 7 0; +#X connect 9 0 8 0; +#X connect 10 0 9 0; +#X connect 13 0 27 2; +#X connect 14 0 27 0; +#X connect 15 0 27 0; +#X connect 16 0 27 0; +#X connect 17 0 27 1; +#X connect 18 0 27 1; +#X connect 19 0 27 0; +#X connect 22 0 24 0; +#X connect 24 0 23 0; +#X connect 24 0 23 1; +#X connect 25 0 27 0; +#X connect 26 0 27 1; +#X connect 27 0 2 0; +#X connect 27 0 22 0; +#X connect 27 1 21 0; +#X connect 27 2 20 0; diff --git a/src/phasorshot~.c b/src/phasorshot~.c new file mode 100755 index 0000000..a2e6423 --- /dev/null +++ b/src/phasorshot~.c @@ -0,0 +1,213 @@ +#include "m_pd.h" +#include + +#define UNITBIT32 1572864. /* 3*2^19; bit 32 has place value 1 */ + + /* machine-dependent definitions. These ifdefs really + should have been by CPU type and not by operating system! */ +#ifdef IRIX + /* big-endian. Most significant byte is at low address in memory */ +#define HIOFFSET 0 /* word offset to find MSB */ +#define LOWOFFSET 1 /* word offset to find LSB */ +#define int32 long /* a data type that has 32 bits */ +#endif /* IRIX */ + +#ifdef MSW + /* little-endian; most significant byte is at highest address */ +#define HIOFFSET 1 +#define LOWOFFSET 0 +#define int32 long +#endif + +#if defined(__FreeBSD__) || defined(__APPLE__) +#include +#endif + +#ifdef __linux__ +#include +#endif + +#if defined(__unix__) || defined(__APPLE__) +#if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) +#error No byte order defined +#endif + +#if BYTE_ORDER == LITTLE_ENDIAN +#define HIOFFSET 1 +#define LOWOFFSET 0 +#else +#define HIOFFSET 0 /* word offset to find MSB */ +#define LOWOFFSET 1 /* word offset to find LSB */ +#endif /* __BYTE_ORDER */ +#include +#define int32 int32_t +#endif /* __unix__ or __APPLE__*/ + +union tabfudge +{ + double tf_d; + int32 tf_i[2]; +}; + +/* -------------------------- phasorshot~ ------------------------------ */ +static t_class *phasorshot_class, *scalarphasorshot_class; + +#if 1 /* in the style of R. Hoeldrich (ICMC 1995 Banff) */ + +typedef struct _phasorshot +{ + t_object x_obj; + double x_phase; + float x_conv; + float x_f; /* scalar frequency */ + float loop; + t_outlet *x_outlet1; /* bang out for high thresh */ + t_outlet *x_outlet2; /* bang out for low thresh */ + t_clock *x_clock; /* wakeup for message output */ + //int previousState; + int state; +} t_phasorshot; + + + +void phasorshot_tick(t_phasorshot *x) +{ + if (x->state == 1) { + outlet_bang(x->x_outlet2); + } else if ( x->state == 0 ) { + outlet_bang(x->x_outlet1); + } + //post("bang"); +} + + t_int *phasorshot_perform(t_int *w) +{ + t_phasorshot *x = (t_phasorshot *)(w[1]); + t_float *in = (t_float *)(w[2]); + t_float *out = (t_float *)(w[3]); + int n = (int)(w[4]); + double dphase = x->x_phase + UNITBIT32; + union tabfudge tf; + int normhipart; + + float conv = x->x_conv; + + tf.tf_d = UNITBIT32; + normhipart = tf.tf_i[HIOFFSET]; + tf.tf_d = dphase; + + //clock_delay(x->x_clock, 0L); + + while (n--) + { + //wrap + if (x->loop) { + tf.tf_i[HIOFFSET] = normhipart; + } else { + if ( tf.tf_d >= UNITBIT32 + 1 ) { + tf.tf_d = UNITBIT32 + 1; + if (x->state != 1) clock_delay(x->x_clock, 0L); + x->state = 1; + } else if ( tf.tf_d <= UNITBIT32 ) { + tf.tf_d = UNITBIT32; + if (x->state != 0) clock_delay(x->x_clock, 0L); + x->state = 0; + + } else { + x->state = -1; + } + } + dphase += *in++ * conv; //increment + //dphase = UNITBIT32 + 1; //set to one + *out++ = tf.tf_d - UNITBIT32; + tf.tf_d = dphase; + } + //if (x->loop) tf.tf_i[HIOFFSET] = normhipart; //wrap + //wrap + if (x->loop) { + tf.tf_i[HIOFFSET] = normhipart; + x->state = -1; + } else { + if ( tf.tf_d > UNITBIT32 + 1 ) { + tf.tf_d = UNITBIT32 + 1; + } else if ( tf.tf_d < UNITBIT32 ) { + tf.tf_d = UNITBIT32; + } + + } + x->x_phase = tf.tf_d - UNITBIT32; + return (w+5); +} + + void phasorshot_dsp(t_phasorshot *x, t_signal **sp) +{ + x->x_conv = 1./sp[0]->s_sr; + dsp_add(phasorshot_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); +} + + void phasorshot_ft1(t_phasorshot *x, t_float f) +{ + if (f < 0) f = 0; + if (f > 1) f = 1; + x->x_phase = f; + +} + + void phasorshot_loop(t_phasorshot *x, t_float f) +{ + x->loop = f; + if (!f) x->state = -1; +} + + +void *phasorshot_new(t_symbol *s,int argc,t_atom* argv) +{ + t_phasorshot *x = (t_phasorshot *)pd_new(phasorshot_class); + + x->x_f = 0; + if (argc) x->x_f = atom_getfloat(argv++),argc--; + + inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); + + x->x_phase = 0; + x->x_conv = 0; + + outlet_new(&x->x_obj, gensym("signal")); + + inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("loop")); + x->loop = 0; + + if (argc) x->loop = atom_getfloat(argv++),argc--; + + x->state = 0; + + x->x_outlet1 = outlet_new(&x->x_obj, &s_bang); + x->x_outlet2 = outlet_new(&x->x_obj, &s_bang); + + x->x_clock = clock_new(x, (t_method)phasorshot_tick); + + + return (x); +} + + +void phasorshot_free(t_phasorshot *x) +{ + clock_free(x->x_clock); +} + + + void phasorshot_tilde_setup(void) +{ + phasorshot_class = class_new(gensym("phasorshot~"), (t_newmethod)phasorshot_new, (t_method)phasorshot_free, + sizeof(t_phasorshot), 0,A_GIMME,0); + CLASS_MAINSIGNALIN(phasorshot_class, t_phasorshot, x_f); + class_addmethod(phasorshot_class, (t_method)phasorshot_dsp, gensym("dsp"), 0); + + class_addmethod(phasorshot_class, (t_method)phasorshot_ft1, + gensym("ft1"), A_FLOAT, 0); + class_addmethod(phasorshot_class, (t_method)phasorshot_loop, + gensym("loop"), A_FLOAT, 0); +} + +#endif /* Hoeldrich version */ diff --git a/src/w_breakpoints.h b/src/w_breakpoints.h index f7d8754..672fc93 100755 --- a/src/w_breakpoints.h +++ b/src/w_breakpoints.h @@ -7,7 +7,7 @@ #define abs fabs #endif -#define BACKGROUNDCOLOR "grey" +#define BACKGROUNDCOLOR "grey86" #define LINECOLOR "grey30" #ifndef BACKGROUNDWIDTH #define BACKGROUNDWIDTH "1" -- cgit v1.2.1