ftp.nice.ch/pub/next/unix/audio/fugue.s.tar.gz#/fugue/old_table.c

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.