📄 sound.c
字号:
bool soundemeraldflag=FALSE;
Sint4 soundemeraldduration,emerfreq,soundemeraldn;
Sint4 emfreqs[8]={0x8e8,0x7f0,0x712,0x6ac,0x5f2,0x54c,0x4b8,0x474};
void soundemerald(int n)
{
emerfreq=emfreqs[n];
soundemeraldduration=7;
soundemeraldn=0;
soundemeraldflag=TRUE;
}
void soundemeraldoff(void)
{
soundemeraldflag=FALSE;
}
void soundemeraldupdate(void)
{
if (soundemeraldflag)
if (soundemeraldduration!=0) {
if (soundemeraldn==0 || soundemeraldn==1)
t2val=emerfreq;
soundemeraldn++;
if (soundemeraldn>7) {
soundemeraldn=0;
soundemeraldduration--;
}
}
else
soundemeraldoff();
}
bool soundgoldflag=FALSE,soundgoldf=FALSE;
Sint4 soundgoldvalue1,soundgoldvalue2,soundgoldduration;
void soundgold(void)
{
soundgoldvalue1=500;
soundgoldvalue2=4000;
soundgoldduration=30;
soundgoldf=FALSE;
soundgoldflag=TRUE;
}
void soundgoldoff(void)
{
soundgoldflag=FALSE;
}
void soundgoldupdate(void)
{
if (soundgoldflag) {
if (soundgoldduration!=0)
soundgoldduration--;
else
soundgoldflag=FALSE;
if (soundgoldf) {
soundgoldf=FALSE;
t2val=soundgoldvalue1;
}
else {
soundgoldf=TRUE;
t2val=soundgoldvalue2;
}
soundgoldvalue1+=(soundgoldvalue1>>4);
soundgoldvalue2-=(soundgoldvalue2>>4);
}
}
bool soundeatmflag=FALSE;
Sint4 soundeatmvalue,soundeatmduration,soundeatmn;
void soundeatm(void)
{
soundeatmduration=20;
soundeatmn=3;
soundeatmvalue=2000;
soundeatmflag=TRUE;
}
void soundeatmoff(void)
{
soundeatmflag=FALSE;
}
void soundeatmupdate(void)
{
if (soundeatmflag)
if (soundeatmn!=0) {
if (soundeatmduration!=0) {
if ((soundeatmduration%4)==1)
t2val=soundeatmvalue;
if ((soundeatmduration%4)==3)
t2val=soundeatmvalue-(soundeatmvalue>>4);
soundeatmduration--;
soundeatmvalue-=(soundeatmvalue>>4);
}
else {
soundeatmduration=20;
soundeatmn--;
soundeatmvalue=2000;
}
}
else
soundeatmflag=FALSE;
}
bool soundddieflag=FALSE;
Sint4 soundddien,soundddievalue;
void soundddie(void)
{
soundddien=0;
soundddievalue=20000;
soundddieflag=TRUE;
}
void soundddieoff(void)
{
soundddieflag=FALSE;
}
void soundddieupdate(void)
{
if (soundddieflag) {
soundddien++;
if (soundddien==1)
musicoff();
if (soundddien>=1 && soundddien<=10)
soundddievalue=20000-soundddien*1000;
if (soundddien>10)
soundddievalue+=500;
if (soundddievalue>30000)
soundddieoff();
t2val=soundddievalue;
}
}
bool sound1upflag=FALSE;
Sint4 sound1upduration=0;
void sound1up(void)
{
sound1upduration=96;
sound1upflag=TRUE;
}
void sound1upoff(void)
{
sound1upflag=FALSE;
}
void sound1upupdate(void)
{
if (sound1upflag) {
if ((sound1upduration/3)%2!=0)
t2val=(sound1upduration<<2)+600;
sound1upduration--;
if (sound1upduration<1)
sound1upflag=FALSE;
}
}
bool musicplaying=FALSE;
Sint4 musicp=0,tuneno=0,noteduration=0,notevalue=0,musicmaxvol=0,
musicattackrate=0,musicsustainlevel=0,musicdecayrate=0,musicnotewidth=0,
musicreleaserate=0,musicstage=0,musicn=0;
void music(Sint4 tune)
{
tuneno=tune;
musicp=0;
noteduration=0;
switch (tune) {
case 0:
musicmaxvol=50;
musicattackrate=20;
musicsustainlevel=20;
musicdecayrate=10;
musicreleaserate=4;
break;
case 1:
musicmaxvol=50;
musicattackrate=50;
musicsustainlevel=8;
musicdecayrate=15;
musicreleaserate=1;
break;
case 2:
musicmaxvol=50;
musicattackrate=50;
musicsustainlevel=25;
musicdecayrate=5;
musicreleaserate=1;
}
musicplaying=TRUE;
if (tune==2)
soundddieoff();
}
void musicoff(void)
{
musicplaying=FALSE;
musicp=0;
}
Sint4 bonusjingle[321]={
0x11d1,2,0x11d1,2,0x11d1,4,0x11d1,2,0x11d1,2,0x11d1,4,0x11d1,2,0x11d1,2,
0xd59,4, 0xbe4,4, 0xa98,4,0x11d1,2,0x11d1,2,0x11d1,4,0x11d1,2,0x11d1,2,
0x11d1,4, 0xd59,2, 0xa98,2, 0xbe4,4, 0xe24,4,0x11d1,4,0x11d1,2,0x11d1,2,
0x11d1,4,0x11d1,2,0x11d1,2,0x11d1,4,0x11d1,2,0x11d1,2, 0xd59,4, 0xbe4,4,
0xa98,4, 0xd59,2, 0xa98,2, 0x8e8,10,0xa00,2, 0xa98,2, 0xbe4,2, 0xd59,4,
0xa98,4, 0xd59,4,0x11d1,2,0x11d1,2,0x11d1,4,0x11d1,2,0x11d1,2,0x11d1,4,
0x11d1,2,0x11d1,2, 0xd59,4, 0xbe4,4, 0xa98,4,0x11d1,2,0x11d1,2,0x11d1,4,
0x11d1,2,0x11d1,2,0x11d1,4, 0xd59,2, 0xa98,2, 0xbe4,4, 0xe24,4,0x11d1,4,
0x11d1,2,0x11d1,2,0x11d1,4,0x11d1,2,0x11d1,2,0x11d1,4,0x11d1,2,0x11d1,2,
0xd59,4, 0xbe4,4, 0xa98,4, 0xd59,2, 0xa98,2, 0x8e8,10,0xa00,2, 0xa98,2,
0xbe4,2, 0xd59,4, 0xa98,4, 0xd59,4, 0xa98,2, 0xa98,2, 0xa98,4, 0xa98,2,
0xa98,2, 0xa98,4, 0xa98,2, 0xa98,2, 0xa98,4, 0x7f0,4, 0xa98,4, 0x7f0,4,
0xa98,4, 0x7f0,4, 0xa98,4, 0xbe4,4, 0xd59,4, 0xe24,4, 0xfdf,4, 0xa98,2,
0xa98,2, 0xa98,4, 0xa98,2, 0xa98,2, 0xa98,4, 0xa98,2, 0xa98,2, 0xa98,4,
0x7f0,4, 0xa98,4, 0x7f0,4, 0xa98,4, 0x7f0,4, 0x8e8,4, 0x970,4, 0x8e8,4,
0x970,4, 0x8e8,4, 0xa98,2, 0xa98,2, 0xa98,4, 0xa98,2, 0xa98,2, 0xa98,4,
0xa98,2, 0xa98,2, 0xa98,4, 0x7f0,4, 0xa98,4, 0x7f0,4, 0xa98,4, 0x7f0,4,
0xa98,4, 0xbe4,4, 0xd59,4, 0xe24,4, 0xfdf,4, 0xa98,2, 0xa98,2, 0xa98,4,
0xa98,2, 0xa98,2, 0xa98,4, 0xa98,2, 0xa98,2, 0xa98,4, 0x7f0,4, 0xa98,4,
0x7f0,4, 0xa98,4, 0x7f0,4, 0x8e8,4, 0x970,4, 0x8e8,4, 0x970,4, 0x8e8,4,
0x7d64};
Sint4 backgjingle[291]={
0xfdf,2,0x11d1,2, 0xfdf,2,0x1530,2,0x1ab2,2,0x1530,2,0x1fbf,4, 0xfdf,2,
0x11d1,2, 0xfdf,2,0x1530,2,0x1ab2,2,0x1530,2,0x1fbf,4, 0xfdf,2, 0xe24,2,
0xd59,2, 0xe24,2, 0xd59,2, 0xfdf,2, 0xe24,2, 0xfdf,2, 0xe24,2,0x11d1,2,
0xfdf,2,0x11d1,2, 0xfdf,2,0x1400,2, 0xfdf,4, 0xfdf,2,0x11d1,2, 0xfdf,2,
0x1530,2,0x1ab2,2,0x1530,2,0x1fbf,4, 0xfdf,2,0x11d1,2, 0xfdf,2,0x1530,2,
0x1ab2,2,0x1530,2,0x1fbf,4, 0xfdf,2, 0xe24,2, 0xd59,2, 0xe24,2, 0xd59,2,
0xfdf,2, 0xe24,2, 0xfdf,2, 0xe24,2,0x11d1,2, 0xfdf,2,0x11d1,2, 0xfdf,2,
0xe24,2, 0xd59,4, 0xa98,2, 0xbe4,2, 0xa98,2, 0xd59,2,0x11d1,2, 0xd59,2,
0x1530,4, 0xa98,2, 0xbe4,2, 0xa98,2, 0xd59,2,0x11d1,2, 0xd59,2,0x1530,4,
0xa98,2, 0x970,2, 0x8e8,2, 0x970,2, 0x8e8,2, 0xa98,2, 0x970,2, 0xa98,2,
0x970,2, 0xbe4,2, 0xa98,2, 0xbe4,2, 0xa98,2, 0xd59,2, 0xa98,4, 0xa98,2,
0xbe4,2, 0xa98,2, 0xd59,2,0x11d1,2, 0xd59,2,0x1530,4, 0xa98,2, 0xbe4,2,
0xa98,2, 0xd59,2,0x11d1,2, 0xd59,2,0x1530,4, 0xa98,2, 0x970,2, 0x8e8,2,
0x970,2, 0x8e8,2, 0xa98,2, 0x970,2, 0xa98,2, 0x970,2, 0xbe4,2, 0xa98,2,
0xbe4,2, 0xa98,2, 0xd59,2, 0xa98,4, 0x7f0,2, 0x8e8,2, 0xa98,2, 0xd59,2,
0x11d1,2, 0xd59,2,0x1530,4, 0xa98,2, 0xbe4,2, 0xa98,2, 0xd59,2,0x11d1,2,
0xd59,2,0x1530,4, 0xa98,2, 0x970,2, 0x8e8,2, 0x970,2, 0x8e8,2, 0xa98,2,
0x970,2, 0xa98,2, 0x970,2, 0xbe4,2, 0xa98,2, 0xbe4,2, 0xd59,2, 0xbe4,2,
0xa98,4,0x7d64};
Sint4 dirge[]={
0x7d00, 2,0x11d1, 6,0x11d1, 4,0x11d1, 2,0x11d1, 6, 0xefb, 4, 0xfdf, 2,
0xfdf, 4,0x11d1, 2,0x11d1, 4,0x12e0, 2,0x11d1,12,0x7d00,16,0x7d00,16,
0x7d00,16,0x7d00,16,0x7d00,16,0x7d00,16,0x7d00,16,0x7d00,16,0x7d00,16,
0x7d00,16,0x7d00,16,0x7d00,16,0x7d64};
void musicupdate(void)
{
if (!musicplaying)
return;
if (noteduration!=0)
noteduration--;
else {
musicstage=musicn=0;
switch (tuneno) {
case 0:
noteduration=bonusjingle[musicp+1]*3;
musicnotewidth=noteduration-3;
notevalue=bonusjingle[musicp];
musicp+=2;
if (bonusjingle[musicp]==0x7d64)
musicp=0;
break;
case 1:
noteduration=backgjingle[musicp+1]*6;
musicnotewidth=12;
notevalue=backgjingle[musicp];
musicp+=2;
if (backgjingle[musicp]==0x7d64)
musicp=0;
break;
case 2:
noteduration=dirge[musicp+1]*10;
musicnotewidth=noteduration-10;
notevalue=dirge[musicp];
musicp+=2;
if (dirge[musicp]==0x7d64)
musicp=0;
break;
}
}
musicn++;
wavetype=1;
t0val=notevalue;
if (musicn>=musicnotewidth)
musicstage=2;
switch(musicstage) {
case 0:
if (musvol+musicattackrate>=musicmaxvol) {
musicstage=1;
musvol=musicmaxvol;
break;
}
musvol+=musicattackrate;
break;
case 1:
if (musvol-musicdecayrate<=musicsustainlevel) {
musvol=musicsustainlevel;
break;
}
musvol-=musicdecayrate;
break;
case 2:
if (musvol-musicreleaserate<=1) {
musvol=1;
break;
}
musvol-=musicreleaserate;
}
if (musvol==1)
t0val=0x7d00;
}
void soundpause(void)
{
soundpausedflag=TRUE;
#ifdef _WINDOWS
pause_windows_sound_playback();
#endif
}
void soundpauseoff(void)
{
soundpausedflag=FALSE;
#ifdef _WINDOWS
resume_windows_sound_playback();
#endif
}
void sett0(void)
{
if (sndflag) {
timer2(t2val);
if (t0val<1000 && (wavetype==1 || wavetype==2))
t0val=1000;
timer0(t0val);
timerrate=t0val;
if (musvol<1)
musvol=1;
if (musvol>50)
musvol=50;
pulsewidth=musvol*volume;
setsoundmode();
}
}
bool soundt0flag=FALSE;
void setsoundt2(void)
{
if (soundt0flag) {
spkrmode=0;
soundt0flag=FALSE;
setspkrt2();
}
}
void setsoundmode(void)
{
spkrmode=wavetype;
if (!soundt0flag && sndflag) {
soundt0flag=TRUE;
setspkrt2();
}
}
bool int8flag=FALSE;
void startint8(void)
{
if (!int8flag) {
initint8();
timerrate=0x4000;
settimer0(0x4000);
int8flag=TRUE;
}
}
void stopint8(void)
{
settimer0(0);
if (int8flag) {
restoreint8();
int8flag=FALSE;
}
sett2val(40);
setspkrt2();
}
void initsound(void)
{
settimer2(40);
setspkrt2();
settimer0(0);
wavetype=2;
t0val=12000;
musvol=8;
t2val=40;
soundt0flag=TRUE;
sndflag=TRUE;
spkrmode=0;
int8flag=FALSE;
setsoundt2();
soundstop();
setupsound();
timerrate=0x4000;
settimer0(0x4000);
randvs=getlrt();
}
void s0killsound(void)
{
setsoundt2();
timer2(40);
stopint8();
}
void s0setupsound(void)
{
inittimer();
curtime=0;
startint8();
}
void s0fillbuffer(void)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -