📄 mu32c.c
字号:
#include <math.h>
#include <libap.h>
#include "song.h" /* song[108][7] array */
/*
4 Voice Music Generator for 21K
2-30-93 PME
9-4-93 PME improved speed
1-12-94 PME changed structure to do everything inside note()
1-13-94 PME changed break point structure
5-25-94 LS modified for AT&T DSP32c
10-31-94 CAC adapted to CAC boards
*/
/* DSP32C code assumes a 32 KHz sampling rate */
extern void int_disable();
extern void sendout();
extern void flush();
typedef struct {
int key,t,cindex;
float cw,a,b;
float y1,y0;
} NOTE_STATE;
#define MAX_VOICES 4
float note();
NOTE_STATE notes[MAX_VOICES];
float trel[5] = { 0.1 , 0.2, 0.7, 1.0, 0.0 };
float amps[5] = { 3000.0 , 5000.0, 4000.0, 10.0, 0.0 };
float rates[10];
int tbreaks[10];
void main()
{
long int n;
int t,told,vnum,v,key;
float ampold;
register long int i,endi;
register float sig_out;
int_disable();
for(n = 0 ; n < SONG_LENGTH ; n++) {
/* number of samples per note */
#ifdef KHZ8
endi = 1*song[n][0];
#else
#ifdef KHZ16
endi = 2*song[n][0];
#else
endi = 4*song[n][0];
#endif
#endif
/* 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(loge(amps[i]/ampold)/(t-told));
ampold = amps[i];
tbreaks[i] = told = t;
i++;
}
/* set the key numbers for all voices to be played (vnum is how many) */
for(v = 0 ; v < MAX_VOICES ; v++) {
key = song[n][v+1];
if(!key) break;
notes[v].key = key;
notes[v].t = 0;
}
vnum = v;
for(i = 0 ; i < endi ; i++) {
/* replace the following with in line code for speed:
sig_out = 0.0;
for(v = 0 ; v < vnum ; v++) {
sig_out += note(¬es[v],tbreaks,rates);
}
*/
sig_out = note(¬es[0],tbreaks,rates);
sig_out += note(¬es[1],tbreaks,rates);
sig_out += note(¬es[2],tbreaks,rates);
sig_out += note(¬es[3],tbreaks,rates);
sendout(sig_out);
}
}
flush();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -