📄 osc.c
字号:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "rtdspc.h"
float osc(float,float,int);
float rate,freq;
float amp = 30000;
void main()
{
long int i,length = 200000;
/* calculate the rate required to get to desired amp in 5000 samples */
rate = (float)exp(log(amp)/(5000.0));
/* start at 1000 Hz */
freq = 1000.0f;
/* first call to start up oscillator */
sendout(osc(freq,rate,-1));
/* special case for first 5000 samples to increase amplitude */
for(i = 0 ; i < 5000 ; i++)
sendout(osc(freq,rate,0));
/* decay the osc 10% every 5000 samples */
rate = (float)exp(log(0.9)/(5000.0));
for( ; i < length ; i++) {
if((i%1000) == 0) { /* change freq every 1000 samples */
freq = 0.98*freq;
sendout(osc(freq,rate,1));
}
else { /* normal case */
sendout(osc(freq,rate,0));
}
}
flush();
}
/* Function to generate samples from a second order oscillator
rate = envelope rate of change parameter (close to 1).
change_flag = indicates that frequency and/or rate have changed.
*/
float osc(float freq,float rate,int change_flag)
{
/* calculate this as a static so it never happens again */
static float two_pi_div_sample_rate = (float)(2.0 * PI / SAMPLE_RATE);
static float y1,y0,a,b,arg;
float out,wosc;
/* change_flag:
-1 = start new sequence from t=0
0 = no change, generate next sample in sequence
1 = change rate or frequency after start
*/
if(change_flag != 0) {
/* assume rate and freq change every time */
wosc = freq * two_pi_div_sample_rate;
arg = 2.0 * cos(wosc);
a = arg * rate;
b = -rate * rate;
if(change_flag < 0) { /* re-start case, set state variables */
y0 = 0.0f;
return(y1 = rate*sin(wosc));
}
}
/* make new sample */
out = a*y1 + b*y0;
y0 = y1;
y1 = out;
return(out);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -