This is old_table.c in view mode; [Download] [Up]
/*
* FILE: table.c
* BY: Christopher Lee Fraley
* DESC: Performs table-lookup xformations on samples
*
* 1.0 (26-APR-89) - created. (clf)
*/
#include <math.h>
#include "xlisp.h"
#include "sound.h"
SoundPtr xform(table, y)
SoundPtr table, y;
{
SoundPtr s;
SDataPtr data;
int len, tableLen;
double d;
int i;
(void)s_flatten(y);
(void)s_flatten(table);
s = s_create();
len = y->ptr.sample->length;
data = sdata_create(len);
s->ptr.sample = spl_create(data, len, y->srate);
s->tag = SAMPLES;
s->to = s->logicalTo = len / y->srate;
s->srate = y->srate;
s->shift = y->shift;
tableLen = table->ptr.sample->length;
for (i = 1; i <= len; i++)
{
d = y->ptr.sample->data[i];
d -= floor(d);
if (d < 0.0)
d += 1;
s->ptr.sample->data[i] = *(table->ptr.sample->data + 1 +
(int)(tableLen * d));
}
return (s);
}
SoundPtr s_amosc(s1, s2, pitch, srate, phase)
SoundPtr s1, s2;
double pitch, srate, phase;
{
/* s1 is modulated signal, s1 is the modulator */
SDataPtr s1_start, s2_start; /* sound starts in mem */
SoundPtr new_so; /* the newly create sound */
SDataPtr s1_ptr, sf_ptr; /* ptr to current loc */
SDataPtr s1_end, s2_end; /* end of sound data */
long s1_len, s2_len, sf_len; /* length of sounds */
double d, f; /* interpolation vars */
double step; /* ant to step through s1 */
double s2_ptr; /* pointer to current loc */
new_so = s_create();
s_flatten(s1);
s_flatten(s2);
s1_start = s1->ptr.sample->data + 1;
s2_start = s2->ptr.sample->data + 1;
s1_len = s1->ptr.sample->length;
s2_len = s2->ptr.sample->length;
sf_len = s1_len;
s1_end = s1_start + s1_len;
s2_end= s2_start + s2_len;
sf_ptr = sdata_create(sf_len);
new_so->from = 0.0;
new_so->to = new_so->logicalTo = sf_len/srate;
new_so->stretch = 1.0;
new_so->srate = srate;
new_so->tag = SAMPLES;
new_so->ptr.sample = spl_create(sf_ptr, sf_len, srate);
sf_ptr++; /* skip over initial zero */
s1_ptr = s1_start;
s2_ptr = s2_len * (phase / (double) ANGLEBASE);
step = (srate / (pitch*s2_len)) * (s1->srate/srate);
while (s1_ptr < s1_end)
{
while ( (s1_ptr < s1_end) && (s2_ptr < (s2_len - step)))
{
d = s2_ptr - floor(s2_ptr);
f = 1.0 -d;
*(sf_ptr++) = *(s1_ptr++) * (f * ( *(s2_start + (int) s2_ptr)) +
d * ( *(s2_start + (int) (s2_ptr + step))));
s2_ptr += step;
}
d = s2_ptr - floor(s2_ptr);
f = 1.0 -d;
*(sf_ptr++) = *(s1_ptr++) * (f * ( *s2_start + (int) s2_ptr)) + d * ( *(s2_start));
s2_ptr = 0;
}
return (new_so);
}
SoundPtr s_fmosc(s1, s2, pitch, srate, phase)
SoundPtr s1, s2;
double pitch, srate, phase;
{
/* s1 is modulated signal, s1 is the modulator */
SDataPtr s1_start, s2_start; /* sound starts in mem */
SoundPtr new_so; /* the newly create sound */
SDataPtr s1_ptr, sf_ptr; /* ptr to current loc */
SDataPtr s1_end, s2_end; /* end of sound data */
long s1_len, s2_len, sf_len; /* length of sounds */
double d, f; /* interpolation vars */
double dtbase, dt, dt2; /* amt to step through s1 */
double s2_ptr; /* pointer to current loc */
new_so = s_create();
s_flatten(s1);
s_flatten(s2);
s1_start = s1->ptr.sample->data + 1;
s2_start = s2->ptr.sample->data + 1;
s1_len = s1->ptr.sample->length;
s2_len = s2->ptr.sample->length;
sf_len = s1_len;
s1_end = s1_start + s1_len;
s2_end = s2_start + s2_len;
sf_ptr = sdata_create(sf_len);
new_so->from = 0.0;
new_so->to = new_so->logicalTo = sf_len/srate;
new_so->stretch = 1.0;
new_so->srate = srate;
new_so->tag = SAMPLES;
new_so->ptr.sample = spl_create(sf_ptr, sf_len, srate);
sf_ptr++; /* skip over initial zero */
s1_ptr = s1_start;
s2_ptr = s2_len * (phase / (double) ANGLEBASE);
dtbase = (srate / (pitch*s2_len)) * (s1->srate/srate);
dt2 = s1->srate / srate;
dt = dtbase;
while (s1_ptr < s1_end)
{
while ( (s1_ptr < s1_end) && (s2_ptr < (s2_len - dt)))
{
d = s2_ptr - floor(s2_ptr);
f = 1.0 -d;
*(sf_ptr++) = *(s1_ptr) ;
s1_ptr += (int) dt;
dt = (f * ( *(s2_start + (int) s2_ptr)) + d * ( *(s2_start + (int) (s2_ptr + dt2)))) + dtbase;
s2_ptr += dt2;
}
d = s2_ptr - floor(s2_ptr);
f = 1.0 -d;
*(sf_ptr++) = *(s1_ptr++);
s1_ptr += (int) dt;
dt = (f * ( *s2_start + (int) s2_ptr)) + d * ( *(s2_start)) + dtbase;
s2_ptr = 0;
}
return (new_so);
}
SoundPtr s_lowpass(s, f)
SoundPtr s;
double f;
{
SDataPtr s_start; /* start of sample data */
long s_len; /* length of sample in samples */
long n; /* number into sample */
SoundPtr new_so; /* ptr to filtered sound block*/
SDataPtr sf_start; /* ptr to filtered sound start */
double c1, c2; /* difference eq constants */
new_so = s_create();
s_flatten(s);
s_start = s->ptr.sample->data + 1;
s_len = s->ptr.sample->length;
sf_start = sdata_create(s_len);
new_so->from = 0.0;
new_so->to = new_so->logicalTo = s_len / s->srate;
new_so->stretch = 1.0;
new_so->srate = s->srate;
new_so->tag = SAMPLES;
new_so->ptr.sample = spl_create(sf_start, s_len, s->srate);
sf_start++; /* skip over initial zero */
c1 = 2.0 * 3.1415 * f;
c2 = exp( - c1 / (double) s->srate );
for (n= 0; n < s_len; ++n)
sf_start[n] = c1 * s_start[n] + c2 * sf_start[n-1];
return(new_so);
}
SoundPtr s_highpass(s, f)
SoundPtr s;
double f;
{
SDataPtr s_start; /* start of sample data */
long s_len; /* length of sample in samples */
long n; /* number into sample */
SoundPtr new_so; /* ptr to filtered sound block*/
SDataPtr sf_start; /* ptr to filtered sound start */
double c1, c2; /* difference eq constants */
new_so = s_create();
s_flatten(s);
s_start = s->ptr.sample->data + 1;
s_len = s->ptr.sample->length;
sf_start = sdata_create(s_len);
new_so->from = 0.0;
new_so->to = new_so->logicalTo = s_len / s->srate;
new_so->stretch = 1.0;
new_so->srate = s->srate;
new_so->tag = SAMPLES;
new_so->ptr.sample = spl_create(sf_start, s_len, s->srate);
sf_start++; /* skip over initial zero */
c1 = 2.0 * 3.1415 * f;
c2 = exp( - c1 / (double) s->srate );
for (n= 0; n < s_len; ++n)
sf_start[n] = c1 * s_start[n] + c2 * sf_start[n-1];
return(s);
}
SoundPtr s_bandpass(s, f_l, f_h)
SoundPtr s;
double f_l, f_h;
{
double f_c; /* band width of freq */
SDataPtr s_start; /* start of sample data */
long s_len; /* length of sample in samples */
long n; /* number into sample */
SoundPtr new_so; /* ptr to filtered sound block*/
SDataPtr sf_start; /* ptr to filtered sound start */
double c1, c2; /* difference eq constants */
f_c = f_h - f_l;
new_so = s_create();
s_flatten(s);
s_start = s->ptr.sample->data + 1;
s_len = s->ptr.sample->length;
sf_start = sdata_create(s_len);
new_so->from = 0.0;
new_so->to = new_so->logicalTo = s_len / s->srate;
new_so->stretch = 1.0;
new_so->srate = s->srate;
new_so->tag = SAMPLES;
new_so->ptr.sample = spl_create(sf_start, s_len, s->srate);
sf_start++; /* skip over initial zero */
c1 = 2.0 * 3.1415 * f_c;
c2 = exp( - c1 / (double) s->srate );
for (n= 0; n < s_len; ++n)
sf_start[n] = c1 * s_start[n] + c2 * sf_start[n-1];
return(new_so);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.