...
 
......@@ -17,7 +17,7 @@ static t_class *choice_class;
typedef struct _elem
{
float e_age;
t_float e_age;
t_float e_weight[DIMENSION];
} t_elem;
......@@ -63,7 +63,7 @@ static void choice_add(t_choice *x, t_symbol *s, int argc, t_atom *argv)
{
int oldn = x->x_n, newn = oldn + 1, i;
t_elem *e;
float sum, normal;
t_float sum, normal;
x->x_vec = (t_elem *)resizebytes(x->x_vec, oldn * sizeof(t_elem),
newn * sizeof(t_elem));
x->x_n = newn;
......@@ -72,11 +72,11 @@ static void choice_add(t_choice *x, t_symbol *s, int argc, t_atom *argv)
for (i = 0, sum = 0; i < DIMENSION; i++)
{
float f = atom_getfloatarg(i, argc, argv);
t_float f = atom_getfloatarg(i, argc, argv);
e->e_weight[i] = f;
sum += f*f;
}
normal = (float)(sum > 0 ? 1./sqrt(sum) : 1);
normal = (t_float)(sum > 0 ? 1./sqrt(sum) : 1);
for (i = 0; i < DIMENSION; i++)
e->e_weight[i] *= normal;
}
......@@ -84,7 +84,7 @@ static void choice_add(t_choice *x, t_symbol *s, int argc, t_atom *argv)
static void choice_list(t_choice *x, t_symbol *s, int argc, t_atom *argv)
{
int i, j;
float bestsum = 0;
t_float bestsum = 0;
int bestindex = -1;
t_float invec[DIMENSION];
for (i = 0; i < DIMENSION; i++)
......@@ -92,10 +92,10 @@ static void choice_list(t_choice *x, t_symbol *s, int argc, t_atom *argv)
for (j = 0; j < x->x_n; j++)
{
t_elem *e = x->x_vec + j;
float sum;
t_float sum;
for (i = 0, sum = 0; i < DIMENSION; i++)
sum += e->e_weight[i] * invec[i];
if (x->x_nonrepeat) sum *= (float)(log(e->e_age));
if (x->x_nonrepeat) sum *= (t_float)(log(e->e_age));
if (sum > bestsum)
{
bestsum = sum;
......@@ -109,7 +109,7 @@ static void choice_list(t_choice *x, t_symbol *s, int argc, t_atom *argv)
x->x_vec[j].e_age += 1.;
x->x_vec[bestindex].e_age = 1;
}
outlet_float(x->x_obj.ob_outlet, (float)bestindex);
outlet_float(x->x_obj.ob_outlet, (t_float)bestindex);
}
static void choice_free(t_choice *x)
......
......@@ -14,7 +14,8 @@ This file is downloadable from http://www.crca.ucsd.edu/~msp .
#ifdef PD
#include "m_pd.h"
#else
#define t_sample float
typedef float t_float;
typedef float t_sample;
#endif
......@@ -96,7 +97,7 @@ static void loopctl_init(t_loopctl *x)
x->l_phase = 0;
}
static void loopctl_set(t_loopctl *x, float val)
static void loopctl_set(t_loopctl *x, t_float val)
{
if (val < 0 || val > 1)
val = 0;
......
......@@ -8,7 +8,7 @@ typedef struct _lrshift_tilde
{
t_object x_obj;
int x_n;
float x_f;
t_float x_f;
} t_lrshift_tilde;
static t_int *leftshift_perform(t_int *w)
......
......@@ -8,6 +8,7 @@
#include "m_pd.h"
#define GOODINT(i) (!(i & 0xC0000000)) // used for integer overflow protection
/* ------------------------- tabwrite~ -------------------------- */
......@@ -494,76 +495,25 @@ static void tabread4_tilde_setup(void)
/******************** 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;
typedef struct _tabosc4_tilde
{
t_object x_obj;
t_float x_fnpoints;
t_float x_finvnpoints;
t_word *x_vec;
t_symbol *x_arrayname;
int looplength;
t_float oneoversamplerate;
double tabphase;
t_word *array;
t_symbol *arrayname;
t_float x_f;
double x_phase;
t_float x_conv;
} t_tabosc4_tilde;
static void *tabosc4_tilde_new(t_symbol *s)
{
t_tabosc4_tilde *x = (t_tabosc4_tilde *)pd_new(tabosc4_tilde_class);
x->x_arrayname = s;
x->x_vec = 0;
x->x_fnpoints = 512.;
x->x_finvnpoints = (1./512.);
x->arrayname = s;
x->array = 0;
x->looplength = 512.;
outlet_new(&x->x_obj, gensym("signal"));
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1"));
x->x_f = 0;
......@@ -573,96 +523,85 @@ static void *tabosc4_tilde_new(t_symbol *s)
static t_int *tabosc4_tilde_perform(t_int *w)
{
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]);
int n = (int)(w[4]);
int normhipart;
union tabfudge tf;
t_float fnpoints = x->x_fnpoints;
int mask = fnpoints - 1;
t_float conv = fnpoints * x->x_conv;
t_word *tab = x->x_vec, *addr;
double dphase = fnpoints * x->x_phase + UNITBIT32;
if (!tab) goto zero;
tf.tf_d = UNITBIT32;
normhipart = tf.tf_i[HIOFFSET];
#if 1
while (n--)
int vecsize = (int)(w[4]);
int loopmask = x->looplength - 1;
int index = 0;
t_float baseincrement = x->oneoversamplerate * (t_float)x->looplength;
double tabphase = x->tabphase;
t_word *ptab = x->array;
t_float frac = 0., a, b, c, d, cminusb;
t_float endfreq = freq[vecsize-1];
if (!ptab) goto zero;
while (vecsize--)
{
t_sample frac, a, b, c, d, cminusb;
tf.tf_d = dphase;
dphase += *in++ * conv;
addr = tab + (tf.tf_i[HIOFFSET] & mask);
tf.tf_i[HIOFFSET] = normhipart;
frac = tf.tf_d - UNITBIT32;
a = addr[0].w_float;
b = addr[1].w_float;
c = addr[2].w_float;
d = addr[3].w_float;
index = (tabphase >= 0.? (int)tabphase : (int)tabphase - 1);
frac = (GOODINT(index)? tabphase - index : 0.);
index &= loopmask;
tabphase += *freq++ * baseincrement;
// interpolation
a = ptab[index].w_float;
b = ptab[index+1].w_float;
c = ptab[index+2].w_float;
d = ptab[index+3].w_float;
cminusb = c-b;
*out++ = b + frac * (
cminusb - 0.1666667f * (1.-frac) * (
(d - a - 3.0f * cminusb) * frac + (d + 2.0f*a - 3.0f*b)
)
);
*out++ = b + frac * (cminusb - 0.166666666666667 *
(1.-frac) * ((d - a - 3.0 * cminusb) * frac + (d + 2.0*a - 3.0*b)));
}
#endif
tf.tf_d = UNITBIT32 * fnpoints;
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;
x->tabphase = frac + index + (endfreq * baseincrement); // wrap phase state
return (w+5);
zero:
while (n--) *out++ = 0;
zero:
while (vecsize--) *out++ = 0;
return (w+5);
}
void tabosc4_tilde_set(t_tabosc4_tilde *x, t_symbol *s)
{
t_garray *a;
int npoints, pointsinarray;
int looplength, pointsinarray;
x->x_arrayname = s;
if (!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class)))
x->arrayname = s;
if (!(a = (t_garray *)pd_findbyclass(x->arrayname, garray_class)))
{
if (*s->s_name)
pd_error(x, "tabosc4~: %s: no such array", x->x_arrayname->s_name);
x->x_vec = 0;
pd_error(x, "tabosc4~: %s: no such array", x->arrayname->s_name);
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);
x->x_vec = 0;
pd_error(x, "%s: bad template for tabosc4~", x->arrayname->s_name);
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",
x->x_arrayname->s_name, pointsinarray);
x->x_vec = 0;
x->arrayname->s_name, pointsinarray);
x->array = 0;
garray_usedindsp(a);
}
else
{
x->x_fnpoints = npoints;
x->x_finvnpoints = 1./npoints;
x->looplength = looplength;
garray_usedindsp(a);
}
}
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)
{
x->x_conv = 1. / sp[0]->s_sr;
tabosc4_tilde_set(x, x->x_arrayname);
x->oneoversamplerate = 1. / sp[0]->s_sr;
tabosc4_tilde_set(x, x->arrayname);
dsp_add(tabosc4_tilde_perform, 4, x,
sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
......
This diff is collapsed.
......@@ -49,6 +49,12 @@ objects use Posix-like threads. */
typedef unsigned short uint16;
typedef unsigned int uint32;
typedef union
{
float f;
uint32_t ui;
}t_aliasfloatuint;
#define FORMAT_WAVE 0
#define FORMAT_AIFF 1
#define FORMAT_NEXT 2
......@@ -463,6 +469,7 @@ static void soundfile_xferin_sample(int sfchannels, int nvecs, t_sample **vecs,
int i, j;
unsigned char *sp, *sp2;
t_sample *fp;
t_aliasfloatuint alias;
int nchannels = (sfchannels < nvecs ? sfchannels : nvecs);
int bytesperframe = bytespersamp * sfchannels;
for (i = 0, sp = buf; i < nchannels; i++, sp += bytespersamp)
......@@ -504,16 +511,22 @@ static void soundfile_xferin_sample(int sfchannels, int nvecs, t_sample **vecs,
if (bigendian)
{
for (j = 0, sp2 = sp, fp=vecs[i] + spread * itemsread;
j < nitems; j++, sp2 += bytesperframe, fp += spread)
*(long *)fp = ((sp2[0] << 24) | (sp2[1] << 16)
j < nitems; j++, sp2 += bytesperframe, fp += spread)
{
alias.ui = ((sp2[0] << 24) | (sp2[1] << 16)
| (sp2[2] << 8) | sp2[3]);
*fp = (t_float)alias.f;
}
}
else
{
for (j = 0, sp2 = sp, fp=vecs[i] + spread * itemsread;
j < nitems; j++, sp2 += bytesperframe, fp += spread)
*(long *)fp = ((sp2[3] << 24) | (sp2[2] << 16)
j < nitems; j++, sp2 += bytesperframe, fp += spread)
{
alias.ui = ((sp2[3] << 24) | (sp2[2] << 16)
| (sp2[1] << 8) | sp2[0]);
*fp = (t_float)alias.f;
}
}
}
}
......@@ -531,6 +544,7 @@ static void soundfile_xferin_float(int sfchannels, int nvecs, t_float **vecs,
int i, j;
unsigned char *sp, *sp2;
t_float *fp;
t_aliasfloatuint alias;
int nchannels = (sfchannels < nvecs ? sfchannels : nvecs);
int bytesperframe = bytespersamp * sfchannels;
for (i = 0, sp = buf; i < nchannels; i++, sp += bytespersamp)
......@@ -572,16 +586,22 @@ static void soundfile_xferin_float(int sfchannels, int nvecs, t_float **vecs,
if (bigendian)
{
for (j = 0, sp2 = sp, fp=vecs[i] + spread * itemsread;
j < nitems; j++, sp2 += bytesperframe, fp += spread)
*(long *)fp = ((sp2[0] << 24) | (sp2[1] << 16)
j < nitems; j++, sp2 += bytesperframe, fp += spread)
{
alias.ui = ((sp2[0] << 24) | (sp2[1] << 16)
| (sp2[2] << 8) | sp2[3]);
*fp = (t_float)alias.f;
}
}
else
{
for (j = 0, sp2 = sp, fp=vecs[i] + spread * itemsread;
j < nitems; j++, sp2 += bytesperframe, fp += spread)
*(long *)fp = ((sp2[3] << 24) | (sp2[2] << 16)
j < nitems; j++, sp2 += bytesperframe, fp += spread)
{
alias.ui = ((sp2[3] << 24) | (sp2[2] << 16)
| (sp2[1] << 8) | sp2[0]);
*fp = (t_float)alias.f;
}
}
}
}
......@@ -932,6 +952,7 @@ static void soundfile_xferout_sample(int nchannels, t_sample **vecs,
int i, j;
unsigned char *sp, *sp2;
t_sample *fp;
t_aliasfloatuint alias;
int bytesperframe = bytespersamp * nchannels;
long xx;
for (i = 0, sp = buf; i < nchannels; i++, sp += bytespersamp)
......@@ -1013,8 +1034,8 @@ static void soundfile_xferout_sample(int nchannels, t_sample **vecs,
for (j = 0, sp2 = sp, fp=vecs[i] + onset;
j < nitems; j++, sp2 += bytesperframe, fp += spread)
{
t_sample f2 = *fp * normalfactor;
xx = *(long *)&f2;
alias.f = (float)(*fp * normalfactor);
xx = alias.ui;
sp2[0] = (xx >> 24); sp2[1] = (xx >> 16);
sp2[2] = (xx >> 8); sp2[3] = xx;
}
......@@ -1024,8 +1045,8 @@ static void soundfile_xferout_sample(int nchannels, t_sample **vecs,
for (j = 0, sp2 = sp, fp=vecs[i] + onset;
j < nitems; j++, sp2 += bytesperframe, fp += spread)
{
t_sample f2 = *fp * normalfactor;
xx = *(long *)&f2;
alias.f = (float)(*fp * normalfactor);
xx = alias.ui;
sp2[3] = (xx >> 24); sp2[2] = (xx >> 16);
sp2[1] = (xx >> 8); sp2[0] = xx;
}
......@@ -1040,6 +1061,7 @@ static void soundfile_xferout_float(int nchannels, t_float **vecs,
int i, j;
unsigned char *sp, *sp2;
t_float *fp;
t_aliasfloatuint alias;
int bytesperframe = bytespersamp * nchannels;
long xx;
for (i = 0, sp = buf; i < nchannels; i++, sp += bytespersamp)
......@@ -1121,8 +1143,8 @@ static void soundfile_xferout_float(int nchannels, t_float **vecs,
for (j = 0, sp2 = sp, fp=vecs[i] + onset;
j < nitems; j++, sp2 += bytesperframe, fp += spread)
{
t_sample f2 = *fp * normalfactor;
xx = *(long *)&f2;
alias.f = (float)(*fp * normalfactor);
xx = alias.ui;
sp2[0] = (xx >> 24); sp2[1] = (xx >> 16);
sp2[2] = (xx >> 8); sp2[3] = xx;
}
......@@ -1132,8 +1154,8 @@ static void soundfile_xferout_float(int nchannels, t_float **vecs,
for (j = 0, sp2 = sp, fp=vecs[i] + onset;
j < nitems; j++, sp2 += bytesperframe, fp += spread)
{
t_sample f2 = *fp * normalfactor;
xx = *(long *)&f2;
alias.f = (float)(*fp * normalfactor);
xx = alias.ui;
sp2[3] = (xx >> 24); sp2[2] = (xx >> 16);
sp2[1] = (xx >> 8); sp2[0] = xx;
}
......