📄 cfunc.mod
字号:
/* $Id: cfunc.tpl,v 1.1 91/03/18 19:01:04 bill Exp $ */
void *malloc(unsigned);
#define OUT_STATE 0
#define NXT_TIME 1
#define NUM_NOTES 128
/* A numerically controlled oscillator. Output frequencies */
/* are determined according to the MIDI note number at input */
void ucm_nco (ARGS)
{
double *freq;
int *output_state;
double *next_time;
int i;
int index;
int scale_factor;
double half_period;
if(INIT) {
/* Setup storage for the toggled output state */
output_state = (int *) cm_event_alloc(OUT_STATE, sizeof(int));
next_time = (double *) cm_event_alloc(NXT_TIME, sizeof(double));
/* Allocate storage for frequencies */
STATIC_VAR(freq) = malloc(NUM_NOTES * sizeof(double));
freq = STATIC_VAR(freq);
/* Initialize the frequency array */
for(i = 0; i < NUM_NOTES; i++) {
if(i == 0)
freq[0] = 8.17578 * PARAM(mult_factor);
else
freq[i] = freq[i-1] * 1.059463094;
}
}
else {
/* Get old output state */
output_state = (int *) cm_event_get_ptr(OUT_STATE, 0);
next_time = (double *) cm_event_get_ptr(NXT_TIME, 0);
}
/* Convert the input bits to an integer */
index = 0;
scale_factor = 64;
for(i = 0; i < 7; i++) {
if(INPUT_STATE(in[i]) == ONE)
index += scale_factor;
scale_factor /= 2;
}
/* Look up the frequency and compute half its period */
freq = STATIC_VAR(freq);
half_period = 1.0 / freq[index];
/* Queue up events and output the new state */
if(TIME == 0.0) {
*next_time = half_period;
cm_event_queue(*next_time);
OUTPUT_STATE(out) = *output_state;
}
else {
if(TIME == *next_time) {
*next_time = TIME + half_period;
cm_event_queue(*next_time);
*output_state = 1 - *output_state;
OUTPUT_STATE(out) = *output_state;
OUTPUT_DELAY(out) = PARAM(delay);
}
else
OUTPUT_CHANGED(out) = FALSE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -