📄 wavetable_generators.c
字号:
/* gdelay2.c - generalized circular delay with real-valued shift */
void gdelay2(D, c, q)
int D;
double c, *q; /* \(c\)=shift, \(q\)=offset index */
{
*q -= c; /* decrement by \(c\) */
if (*q < 0)
*q += D+1;
if (*q > D)
*q -= D+1;
}
/* sine.c - sine wavetable of length D */
#include <math.h>
double sine(D, i)
int D, i;
{
double pi = 4 * atan(1.0);
return sin(2 * pi * i / D);
}
/* square.c - square wavetable of length D, with D1 ones */
double square(D1, i)
int D1, i;
{
if (i < D1)
return 1;
else
return 0;
}
/* trapez.c - trapezoidal wavetable: D1 rising, D2 steady */
double trapez(D, D1, D2, i)
int D, D1, D2, i;
{
if (i < D1)
return i/(double) D1;
else
if (i < D1+D2)
return 1;
else
return (D - i)/(double) (D - D1 - D2);
}
/* wavgen.c - wavetable generator (truncation method) */
void gdelay2();
double wavgen(D, w, A, F, q) /* usage: y = wavgen(D, w, A, F, &q); */
int D; /* \(D\) = wavetable length */
double *w, A, F, *q; /* \(A\) = amplitude, \(F\) = frequency, \(q\) = offset index */
{
double y;
int i;
i = (int) (*q); /* truncate down */
y = A * w[i];
gdelay2(D-1, D*F, q); /* shift \(c = DF\) */
return y;
}
/* wavgenr.c - wavetable generator (rounding method) */
void gdelay2();
double wavgenr(D, w, A, F, q) /* usage: y = wavgenr(D, w, A, F, &q); */
int D; /* \(D\) = wavetable length */
double *w, A, F, *q; /* \(A\) = amplitude, \(F\) = frequency, \(q\) = offset index */
{
double y;
int k;
k = (int) (*q + 0.5); /* round */
y = A * w[k];
gdelay2(D-1, D*F, q); /* shift \(c = DF\) */
return y;
}
/* wavgeni.c - wavetable generator (interpolation method) */
void gdelay2();
double wavgeni(D, w, A, F, q) /* usage: y = wavgeni(D, w, A, F, &q); */
int D; /* \(D\) = wavetable length */
double *w, A, F, *q; /* \(A\) = amplitude, \(F\) = frequency, \(q\) = offset index */
{
double y;
int i, j;
i = (int) *q; /* interpolate between \(w[i], w[j]\) */
j = (i + 1) % D;
y = A * (w[i] + (*q - i) * (w[j] - w[i]));
gdelay2(D-1, D*F, q); /* shift \(c = DF\) */
return y;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -