aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xhelp/phasorshot~-help.pd70
-rwxr-xr-xsrc/phasorshot~.c213
-rwxr-xr-xsrc/w_breakpoints.h2
3 files changed, 284 insertions, 1 deletions
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 <math.h>
+
+#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 <machine/endian.h>
+#endif
+
+#ifdef __linux__
+#include <endian.h>
+#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 <sys/types.h>
+#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"