📄 wavetab.c
字号:
#include <stdlib.h>
#include <math.h>
#include "rtdspc.h"
#include "gwave.h" /* gwave[301] array */
/* Wavetable Music Generator 4-20-94 PME */
int key;
void main()
{
int t,told,ci,k;
float ampold,rate,env,wave_size,dec,phase,frac,delta,sample;
register long int i,endi;
register float sig_out;
static float trel[5] = { 0.02 , 0.14, 0.6, 1.0, 0.0 };
static float amps[5] = { 25000.0 , 15000.0, 6000.0, 10.0, 0.0 };
static float rates[10];
static int tbreaks[10];
wave_size = 300.0; /* dimension of original wave */
endi = 22050; /* 2 second notes */
for(key = -6 ; key < 48 ; key++) {
/* decimation ratio for key semitones down */
dec = pow(2.0,0.0833333333*(float)key);
/* calculate the rates required to get the desired amps */
i = 0;
told = 0;
ampold = 1.0; /* always starts at unity */
while(amps[i] > 1.0) {
t = trel[i]*endi;
rates[i] = exp(log(amps[i]/ampold)/(t-told));
ampold = amps[i];
tbreaks[i] = told = t;
i++;
}
phase = 0.0;
rate = rates[0];
env = 1.0;
ci = 0;
for(i = 0 ; i < endi ; i++) {
/* calculate envelope amplitude */
if(i == tbreaks[ci]) rate = rates[++ci];
env = rate*env;
/* determine interpolated sample value from table */
k = (int)phase;
frac = phase - (float)k;
sample = gwave[k];
delta = gwave[k+1] - sample; /* possible wave_size+1 access */
sample += frac*delta;
/* calculate output and send to DAC */
sig_out = env*sample;
sendout(sig_out);
/* calculate next phase value */
phase += dec;
if(phase >= wave_size) phase -= wave_size;
}
}
flush();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -