Commit 6a37ef78 authored by Jonathan Wilkes's avatar Jonathan Wilkes

Merge branch 'pranay_36/purr-data-pd-l2ork_double_secondary'

parents 6589a5eb 0f5d6a7f
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "m_pd.h" #include "m_pd.h"
#define GOODINT(i) (!(i & 0xC0000000)) // used for integer overflow protection
/* ------------------------- tabwrite~ -------------------------- */ /* ------------------------- tabwrite~ -------------------------- */
...@@ -494,76 +495,25 @@ static void tabread4_tilde_setup(void) ...@@ -494,76 +495,25 @@ static void tabread4_tilde_setup(void)
/******************** tabosc4~ ***********************/ /******************** tabosc4~ ***********************/
/* this is all copied from d_osc.c... what include file could this go in? */
#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];
};
static t_class *tabosc4_tilde_class; static t_class *tabosc4_tilde_class;
typedef struct _tabosc4_tilde typedef struct _tabosc4_tilde
{ {
t_object x_obj; t_object x_obj;
t_float x_fnpoints; int looplength;
t_float x_finvnpoints; t_float oneoversamplerate;
t_word *x_vec; double tabphase;
t_symbol *x_arrayname; t_word *array;
t_symbol *arrayname;
t_float x_f; t_float x_f;
double x_phase;
t_float x_conv;
} t_tabosc4_tilde; } t_tabosc4_tilde;
static void *tabosc4_tilde_new(t_symbol *s) static void *tabosc4_tilde_new(t_symbol *s)
{ {
t_tabosc4_tilde *x = (t_tabosc4_tilde *)pd_new(tabosc4_tilde_class); t_tabosc4_tilde *x = (t_tabosc4_tilde *)pd_new(tabosc4_tilde_class);
x->x_arrayname = s; x->arrayname = s;
x->x_vec = 0; x->array = 0;
x->x_fnpoints = 512.; x->looplength = 512.;
x->x_finvnpoints = (1./512.);
outlet_new(&x->x_obj, gensym("signal")); outlet_new(&x->x_obj, gensym("signal"));
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1"));
x->x_f = 0; x->x_f = 0;
...@@ -573,96 +523,85 @@ static void *tabosc4_tilde_new(t_symbol *s) ...@@ -573,96 +523,85 @@ static void *tabosc4_tilde_new(t_symbol *s)
static t_int *tabosc4_tilde_perform(t_int *w) static t_int *tabosc4_tilde_perform(t_int *w)
{ {
t_tabosc4_tilde *x = (t_tabosc4_tilde *)(w[1]); t_tabosc4_tilde *x = (t_tabosc4_tilde *)(w[1]);
t_sample *in = (t_sample *)(w[2]); t_sample *freq = (t_sample *)(w[2]);
t_sample *out = (t_sample *)(w[3]); t_sample *out = (t_sample *)(w[3]);
int n = (int)(w[4]); int vecsize = (int)(w[4]);
int normhipart;
union tabfudge tf; int loopmask = x->looplength - 1;
t_float fnpoints = x->x_fnpoints; int index = 0;
int mask = fnpoints - 1; t_float baseincrement = x->oneoversamplerate * (t_float)x->looplength;
t_float conv = fnpoints * x->x_conv; double tabphase = x->tabphase;
t_word *tab = x->x_vec, *addr; t_word *ptab = x->array;
double dphase = fnpoints * x->x_phase + UNITBIT32; t_float frac = 0., a, b, c, d, cminusb;
t_float endfreq = freq[vecsize-1];
if (!tab) goto zero;
tf.tf_d = UNITBIT32; if (!ptab) goto zero;
normhipart = tf.tf_i[HIOFFSET];
while (vecsize--)
#if 1
while (n--)
{ {
t_sample frac, a, b, c, d, cminusb; index = (tabphase >= 0.? (int)tabphase : (int)tabphase - 1);
tf.tf_d = dphase; frac = (GOODINT(index)? tabphase - index : 0.);
dphase += *in++ * conv; index &= loopmask;
addr = tab + (tf.tf_i[HIOFFSET] & mask); tabphase += *freq++ * baseincrement;
tf.tf_i[HIOFFSET] = normhipart;
frac = tf.tf_d - UNITBIT32; // interpolation
a = addr[0].w_float; a = ptab[index].w_float;
b = addr[1].w_float; b = ptab[index+1].w_float;
c = addr[2].w_float; c = ptab[index+2].w_float;
d = addr[3].w_float; d = ptab[index+3].w_float;
cminusb = c-b; cminusb = c-b;
*out++ = b + frac * ( *out++ = b + frac * (cminusb - 0.166666666666667 *
cminusb - 0.1666667f * (1.-frac) * ( (1.-frac) * ((d - a - 3.0 * cminusb) * frac + (d + 2.0*a - 3.0*b)));
(d - a - 3.0f * cminusb) * frac + (d + 2.0f*a - 3.0f*b)
)
);
} }
#endif
tf.tf_d = UNITBIT32 * fnpoints; x->tabphase = frac + index + (endfreq * baseincrement); // wrap phase state
normhipart = tf.tf_i[HIOFFSET];
tf.tf_d = dphase + (UNITBIT32 * fnpoints - UNITBIT32);
tf.tf_i[HIOFFSET] = normhipart;
x->x_phase = (tf.tf_d - UNITBIT32 * fnpoints) * x->x_finvnpoints;
return (w+5); return (w+5);
zero:
while (n--) *out++ = 0;
zero:
while (vecsize--) *out++ = 0;
return (w+5); return (w+5);
} }
void tabosc4_tilde_set(t_tabosc4_tilde *x, t_symbol *s) void tabosc4_tilde_set(t_tabosc4_tilde *x, t_symbol *s)
{ {
t_garray *a; t_garray *a;
int npoints, pointsinarray; int looplength, pointsinarray;
x->x_arrayname = s; x->arrayname = s;
if (!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) if (!(a = (t_garray *)pd_findbyclass(x->arrayname, garray_class)))
{ {
if (*s->s_name) if (*s->s_name)
pd_error(x, "tabosc4~: %s: no such array", x->x_arrayname->s_name); pd_error(x, "tabosc4~: %s: no such array", x->arrayname->s_name);
x->x_vec = 0; x->array = 0;
} }
else if (!garray_getfloatwords(a, &pointsinarray, &x->x_vec)) else if (!garray_getfloatwords(a, &pointsinarray, &x->array))
{ {
pd_error(x, "%s: bad template for tabosc4~", x->x_arrayname->s_name); pd_error(x, "%s: bad template for tabosc4~", x->arrayname->s_name);
x->x_vec = 0; x->array = 0;
} }
else if ((npoints = pointsinarray - 3) != (1 << ilog2(pointsinarray - 3))) else if ((looplength = pointsinarray - 3) != (1 << ilog2(pointsinarray - 3)))
{ {
pd_error(x, "%s: number of points (%d) not a power of 2 plus three", pd_error(x, "%s: number of points (%d) not a power of 2 plus three",
x->x_arrayname->s_name, pointsinarray); x->arrayname->s_name, pointsinarray);
x->x_vec = 0; x->array = 0;
garray_usedindsp(a); garray_usedindsp(a);
} }
else else
{ {
x->x_fnpoints = npoints; x->looplength = looplength;
x->x_finvnpoints = 1./npoints;
garray_usedindsp(a); garray_usedindsp(a);
} }
} }
static void tabosc4_tilde_ft1(t_tabosc4_tilde *x, t_float f) static void tabosc4_tilde_ft1(t_tabosc4_tilde *x, t_float f)
{ {
x->x_phase = f; x->tabphase = f * x->looplength;
} }
static void tabosc4_tilde_dsp(t_tabosc4_tilde *x, t_signal **sp) static void tabosc4_tilde_dsp(t_tabosc4_tilde *x, t_signal **sp)
{ {
x->x_conv = 1. / sp[0]->s_sr; x->oneoversamplerate = 1. / sp[0]->s_sr;
tabosc4_tilde_set(x, x->x_arrayname); tabosc4_tilde_set(x, x->arrayname);
dsp_add(tabosc4_tilde_perform, 4, x, dsp_add(tabosc4_tilde_perform, 4, x,
sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment