Ninja Jamm - a revolutionary new musix remix app from Ninja Tune and Seeper,
for iPhone and iPad
http://www.ninjajamm.com/
Gemnotes-0.2: Live music notation for Pure Data, now with dynamics!
http://sharktracks.co.uk/
#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];
};
/* -------------------------- phasorbars~ ------------------------------ */
static t_class *phasorbars_class;
typedef struct _phasorbars
{
t_object x_obj;
double x_phase;
t_float value, prevalue, ivalue, incr, cycle, length, pflag, nextreset;
// t_float count16, count24;
float x_conv; /* 1 / the sample rate */
float x_f; /* scalar frequency */
float looping;
t_outlet *x_bar, *x_8a, *x_8b, *x_16, *x_24, *evens;
int semiquavers, sqtriplets;
} t_phasorbars;
t_int *phasorbars_perform(t_int *w)
{
t_phasorbars *x = (t_phasorbars *)(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;
while (n--)
{
tf.tf_i[HIOFFSET] = normhipart;;
x->ivalue = *in++;
dphase += x->ivalue * conv; //increment
x->value = tf.tf_d - UNITBIT32;
if(x->pflag) {
if(x->value < x->prevalue) {
if(x->ivalue > 0) {
if(x->nextreset >= 0) {
x->cycle = x->nextreset;
outlet_float(x->x_bar, x->cycle);
x->nextreset = -1;
} else {
x->cycle++;
if(x->cycle >= x->length) x->cycle = 0;
outlet_float(x->x_bar, x->cycle);
}
}
}
else if(x->ivalue < 0) {
if(x->value > x->prevalue) {
if(x->nextreset >= 0) {
x->cycle = x->nextreset;
outlet_float(x->x_bar, x->cycle);
x->nextreset = -1;
} else {
x->cycle++;
if(x->cycle >= x->length) x->cycle = 0;
outlet_float(x->x_bar, x->cycle);
}
}
}
}
x->pflag = 1;
*out++ = x->value + x->cycle;
// here are the CLOCKS
// and you can use the EVENS outlet to make SWING happen
int squs = (int)(x->value * 16);
int squts = (int)(x->value * 24);
if(squs != x->semiquavers)
{
int even = squs % 2;
int get8ths = squs * 0.5;
float eighths = (float)get8ths;
if (!even)
{
outlet_float(x->x_8b, eighths);
outlet_float(x->x_8a, eighths);
outlet_float(x->evens, 0);
}
else
{
outlet_float(x->evens, 1);
}
outlet_float(x->x_16, (t_float)squs);
}
if(squts != x->sqtriplets)
{
outlet_float(x->x_24, (float)squts);
}
x->semiquavers = squs;
x->sqtriplets = squts;
tf.tf_d = dphase;
x->prevalue = x->value;
}
tf.tf_i[HIOFFSET] = normhipart;
x->x_phase = tf.tf_d - UNITBIT32;
return (w+5);
}
void phasorbars_dsp(t_phasorbars *y, t_signal **sp)
{
y->x_conv = 1./sp[0]->s_sr;
dsp_add(phasorbars_perform, 4, y, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
}
void phasorbars_debug(t_phasorbars *y)
{
post("phase = %f, cycles = %f",y->x_phase,y->cycle);
}
void phasorbars_nextbar(t_phasorbars *y, float f)
{
y->nextreset = (int)f;
}
void phasorbars_ft1(t_phasorbars *y, float f)
{
float fcycles = 0;
int cycles = 0;
if (f < 0) f = 0;
cycles = (int)f;
fcycles = (t_float)cycles;
f = f - fcycles;
y->x_phase = f;
y->cycle = fcycles;
y->pflag = 0;
outlet_float(y->x_bar, fcycles);
post("phase = %f, cycles = %f",y->x_phase,fcycles);
}
void phasorbars_loop(t_phasorbars *y, t_float f)
{
y->loop = f;
}
void phasorbars_length(t_phasorbars *y, t_float f)
{
y->length = f;
}
void *phasorbars_new(t_symbol *s,int argc,t_atom* argv)
{
t_phasorbars *y = (t_phasorbars *)pd_new(phasorbars_class);
y->x_f = 0;
if (argc) y->x_f = atom_getfloat(argv++),argc--;
inlet_new(&y->x_obj, &y->x_obj.ob_pd, &s_float, gensym("ft1"));
y->x_phase = 0;
y->x_conv = 0;
y->cycle = 0;
y->pflag = 1;
y->nextreset = -1;
y->semiquavers = -1;
y->sqtriplets = -1;
y->ivalue = 10;
y->value = -1;
y->prevalue = -2;
y->incr = 0;
y->length = 8;
outlet_new(&y->x_obj, gensym("signal"));
inlet_new(&y->x_obj, &y->x_obj.ob_pd, &s_float, gensym("loop"));
y->loop = 0;
if (argc) y->loop = atom_getfloat(argv++),argc--;
if (argc) y->length = atom_getfloat(argv++),argc--;
// y->state = 0;
y->x_24 = outlet_new(&y->x_obj, &s_float);
y->x_16 = outlet_new(&y->x_obj, &s_float);
y->evens = outlet_new(&y->x_obj, &s_float);
y->x_8a = outlet_new(&y->x_obj, &s_float);
y->x_8b = outlet_new(&y->x_obj, &s_float);
y->x_bar = outlet_new(&y->x_obj, &s_float);
inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("setbar"));
inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("resetbar"));
return (y);
}
/*void phasorbars_free(t_phasorbars *x)
{
clock_free(x->x_16ths);
clock_free(x->x_24ths);
}*/
void phasorbars_tilde_setup(void)
{
phasorbars_class = class_new(gensym("phasorbars~"), (t_newmethod)phasorbars_new, 0, sizeof(t_phasorbars), 0, A_GIMME, 0);
CLASS_MAINSIGNALIN(phasorbars_class, t_phasorbars, x_f);
class_addmethod(phasorbars_class, (t_method)phasorbars_dsp, gensym("dsp"), 0);
class_addmethod(phasorbars_class, (t_method)phasorbars_ft1,
gensym("ft1"), A_FLOAT, 0);
// class_addmethod(phasorbars_class, (t_method)phasorbars_blimit,
// gensym("blimit"), A_FLOAT, 0);
class_addmethod(phasorbars_class, (t_method)phasorbars_loop,
gensym("loop"), A_FLOAT, 0);
class_addmethod(phasorbars_class, (t_method)phasorbars_length,
gensym("length"), A_FLOAT, 0);
class_addmethod(phasorbars_class, (t_method)phasorbars_debug,
gensym("debug"), A_FLOAT, 0);
class_addmethod(phasorbars_class, (t_method)phasorbars_nextbar,
gensym("nextbar"), A_FLOAT, 0);
}
_______________________________________________
Pd-dev mailing list
[email protected]
http://lists.puredata.info/listinfo/pd-dev