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.