This is cmixfuns.c in view mode; [Download] [Up]
#include <math.h> #include <stdio.h> #include "ugens.h" #include "sfheader.h" /* rand1 returns floating point values between 0 and 1 */ double rand1 (x) double *x; { register int n; n = *x * 1048576.; *x = (double)((1061 * n + 221589) % 1048576)/1048576.; return (*x); } /* randi produces interpolated linear ramps between successive random numbers at a rate determined in a setup routine. */ double randi (a) double a[6]; { double rand1(); /* a[0] is the amp. a[1] is the SI. a[2] is set to 1.0 externally. a[4] is the seed, set externally. */ /* advance counter by fraction of 512 (SI) */ a[2] += a[1]/512.0; /* every time counter exceeds 1.0, calculate new rand # */ if (a[2] >= 1.0) { a[2] -= 1.0; /* reset counter */ a[3] = a[4]; /* store old value */ a[4] = rand1(a + 4); /* get new rand val */ a[5] = 2.0 * (a[3] - a[4]); /* twice the difference */ a[3] = 1.0 - (2.0 * a[3]) - (a[5] * a[2]); } /* output is linear interpolation between old and new, centered around zero, and multiplied by the amp factor. */ return ((a[3] + a[5] * a[2]) * a[0]); } /* tone is a simple 1st order recursive lowpass filter */ double tone (sig, data) double sig, data[3]; { data[2] = data[0] * sig + data[1] * data[2]; return (data[2]); } /* toneset calculates the coefficients for tone. cutoff is -3db point in cps. flag will reset history if set to 1. */ void toneset (cutoff, flag, data) double cutoff, *data; int flag; { double x; x = 2.0 - cos(cutoff * PI2 / SR); /* feedback coeff. */ data[1] = x - sqrt(x * x - 1.0); data[0] = 1.0 - data[1]; /* gain coeff. */ if (cutoff < 0.0) data[1] *= -1.0; /* inverse function */ if (flag) data[2] = 0.0; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.