#include #include #include #include #include #include #include #include extern struct IntuitionBase *IntuitionBase; extern struct GfxBase *GfxBase; extern struct Window *Window; extern struct Screen *Screen; extern struct ViewPort *ViewPort; extern struct RastPort *rport; extern struct IOAudio *ioa,*audio,*finish[4],*audchan[4]; extern struct IntuiText About1; extern struct Gadget propor8; extern struct Gadget propor7; extern struct Gadget propor6; extern struct Gadget propor5; extern struct Gadget propor4; extern struct Gadget propor3; extern struct Gadget propor2; extern struct Gadget propor1; extern struct IntuiText textamp; extern struct IntuiText OK; extern struct IntuiText Answer1; extern struct Border RWave_brd5; extern struct Border UWave_brd5; extern struct Border SWave_brd5; extern SHORT sinewave[8][513]; extern BYTE *usersound,*refsound; extern char textbuf[6]; extern LONG amps[8],refamps[8]; extern USHORT userwave[513][2],refwave[513][2],selwave[513][2]; extern UBYTE selflag; extern SHORT waiting[5]; #define YES 1 #define NO 0 extern LONG maxuser,maxref; extern LONG maxamp; extern BYTE waveform[514],refform[514],selform[514]; extern BYTE *usersound,*refsound; extern SHORT gameon; extern char Answers[80]; /********************************************************************/ VOID Update(USHORT gadno) /* Update the amplitudes and screen when one amplitude has been changed */ { VOID AmpsUpdate(),DrawUser(); LONG MakeWave(); if (amps[gadno]>127) amps[gadno]=127; if (amps[gadno]<-127) amps[gadno]=-127; maxuser=MakeWave(amps,waveform,usersound); AmpsUpdate(); DrawUser(); } /*************************************************************/ VOID DoMenu(USHORT mcode) /* Does the right thing when a menu option is chosen */ { #define PROJECT_MENU 0 #define WAVE_MENU 1 #define GAME_MENU 2 #define ABOUT 0 #define FULLSCALE 1 #define SCREENBACK 2 #define SCREENFRONT 3 #define QUIT 4 #define START_EASY 0 #define START_HARD 1 #define STOP 2 switch(MENUNUM(mcode)) { LONG peak,retval; SHORT i,item,scale; LONG temp,AddWaves(),randamp(),checkval(),MakeWave(),AutoRequest(); VOID AmpsUpdate(),PropUpdate(),DrawUser(),WaveCleanup(),rescale(); static SHORT canned[4][8]={{ 0, 0, 0, 0, 0, 0, 0, 0}, {108, 0,-12, 0, 4, 0, -2, 0}, { 74,-38, 24,-20, 14,-12, 10, -9}, {124, 0, 41, 0, 25, 0, 18, 0}}; case PROJECT_MENU: switch (ITEMNUM(mcode)) { case ABOUT: { retval=AutoRequest(Window,&About1,&OK,&OK, NULL,NULL,500,130); break; } case FULLSCALE: { if ((peak=checkval(maxuser,amps))!=0) rescale(peak,amps); maxuser=AddWaves(amps,0xFF,waveform, usersound)>>15; AmpsUpdate(); PropUpdate(); DrawUser(); break; } case SCREENBACK: { ScreenToBack(Screen); break; } case SCREENFRONT: { ScreenToFront(Screen); break; } case QUIT: { WaveCleanup(); Exit(TRUE); } } break; case WAVE_MENU: item = ITEMNUM(mcode); for (i=0; i<8; ++i) { amps[i] = canned[item][i]; } if (item == 0) { for (i=0; i<4; i++) { BeginIO(finish[i]); WaitIO(finish[i]); waiting[i]=NO; } } AmpsUpdate(); PropUpdate(); maxuser=MakeWave(amps,waveform,usersound); DrawUser(); break; case GAME_MENU: switch (ITEMNUM(mcode)) { case START_EASY: gameon = YES; for (i=0; i<4; i++) { refamps[i] = randamp(); } for (i=4;i<8;i++) refamps[i]=0; maxref=MakeWave(refamps,refform,refsound); if (maxref==0) maxref=1; scale=maxamp/maxref; for (i=0;i<4;++i) { temp=refamps[i]*scale; refamps[i]=temp>>7; } maxref=AddWaves(refamps,0x0F,refform, NULL)>>15; for (i=0; i<513; ++i) { refwave[i][1]=((129-refform[i])*48)>>7; } DrawUser(); break; case START_HARD: gameon = YES; for (i=0; i<8; i++) { refamps[i] = randamp(); } maxref=MakeWave(refamps,refform,refsound); if (maxref==0) maxref=1; scale=maxamp/maxref; for (i=0;i<8;++i) { temp=refamps[i]*scale; refamps[i]=temp>>7; } maxref=AddWaves(refamps,0xFF,refform, NULL)>>15; for (i=0; i<513; ++i) { refwave[i][1]=((129-refform[i])*48)>>7; } DrawUser(); break; case STOP: gameon = NO; sprintf(Answers, "%6d %6d %6d %6d %6d %6d %6d %6d", refamps[0],refamps[1],refamps[2], refamps[3],refamps[4],refamps[5], refamps[6],refamps[7]); retval=AutoRequest(Window,&Answer1,&OK,&OK, NULL,NULL,620,80); DrawUser(); break; } break; } } /****************************************************************/ VOID AmpsUpdate() /* Update the numerical amplitude displays */ { SHORT i; SHORT boxx[8]={34,108,182,256,330,404,478,552}; for (i=0;i<8;i++) { sprintf(textbuf,"%5d",amps[i]); PrintIText(rport,&textamp,boxx[i],188); } } /****************************************************************/ VOID PropUpdate() /* Update the proportional gadgets after a rescaling */ { USHORT temp; temp=amptopot(amps[7]); ModifyProp(&propor8,Window,NULL,FREEVERT|AUTOKNOB,0xFFFF, temp,0x0800,0x0800); temp=amptopot(amps[6]); ModifyProp(&propor7,Window,NULL,FREEVERT|AUTOKNOB,0xFFFF, temp,0x0800,0x0800); temp=amptopot(amps[5]); ModifyProp(&propor6,Window,NULL,FREEVERT|AUTOKNOB,0xFFFF, temp,0x0800,0x0800); temp=amptopot(amps[4]); ModifyProp(&propor5,Window,NULL,FREEVERT|AUTOKNOB,0xFFFF, temp,0x0800,0x0800); temp=amptopot(amps[3]); ModifyProp(&propor4,Window,NULL,FREEVERT|AUTOKNOB,0xFFFF, temp,0x0800,0x0800); temp=amptopot(amps[2]); ModifyProp(&propor3,Window,NULL,FREEVERT|AUTOKNOB,0xFFFF, temp,0x0800,0x0800); temp=amptopot(amps[1]); ModifyProp(&propor2,Window,NULL,FREEVERT|AUTOKNOB,0xFFFF, temp,0x0800,0x0800); temp=amptopot(amps[0]); ModifyProp(&propor1,Window,NULL,FREEVERT|AUTOKNOB,0xFFFF, temp,0x0800,0x0800); } /*****************************************************************/ LONG MakeWave(LONG ampl[],BYTE wf[],UBYTE *ws) /* Makes the compound waveform (via AddWaves) and checks that it */ /* is not off scale. If it is, it rescales. */ { LONG peak; LONG maxnow; LONG AddWaves(); LONG checkval(); VOID rescale(); maxnow=AddWaves(ampl,0xFF,wf,ws)>>15; if ((peak=checkval(maxnow,ampl))>127) { rescale(peak,ampl); maxnow=AddWaves(ampl,0xFF,wf,ws)>>15; PropUpdate(); } return(maxnow); } /******************************************************************/ LONG checkval(LONG maxval,LONG ampl[]) /* Checks maxval, and all of the amps[i] to find the largest */ /* in absolute value. */ { SHORT i; LONG temp; temp = maxval; for (i=0; i<8; ++i) { if (abs(ampl[i])>temp) temp=abs(ampl[i]); } return(temp); } /******************************************************************/ VOID rescale(LONG peak,LONG ampl[]) /* rescale to make the amplitude a high as possible without having */ /* any ampltiude or the compound wave exceed 127 in absolute value */ { extern LONG maxamp; SHORT scale,i; LONG temp; scale=maxamp/peak; for (i=0;i<8;++i) /* Be careful not to lose bits */ { temp=ampl[i]*scale; ampl[i]=temp>>7; } } /***********************************************************************/ VOID DrawUser() /* Draws the compound waveform in the display area. */ { SHORT i; LONG maxsel; for (i=0;i<513;++i) userwave[i][1]=((129-waveform[i])*48)>>7; SetAPen(rport,1); RectFill(rport,64,14,577,109); SetAPen(rport,3); RectFill(rport,64,61,577,61); if (selflag) { maxsel=AddWaves(amps,selflag,selform,NULL); for (i=0; i<513; i++) selwave[i][1]=((129-selform[i])*48)>>7; DrawBorder(rport,&SWave_brd5,0,0); } if (gameon) DrawBorder(rport,&RWave_brd5,0,0); DrawBorder(rport,&UWave_brd5,0,0); }