Specifications

CONSTRUCTION
strcpy(&(Menu[MNU_FILE].Tip[1][0]),“Save as a
*.wav file”);
strcpy(&(Menu[MNU_FILE].Tip[2][0]),” “);
strcpy(&(Menu[MNU_FILE].Tip[3][0]),”Quit the
program”);
Menu[MNU_FILE].AtX=2;Menu[MNU_FILE].AtY=2;
// The EFFECT menu option
Menu[MNU_EFFECT].nextMenu=MNU_OPERATION;
Menu[MNU_EFFECT].prevMenu=MNU_FILE;
Menu[MNU_EFFECT].Child=FALSE;
Menu[MNU_EFFECT].num_items=5;
for(i=0;i<5;i++)
{
Menu[MNU_EFFECT].Enabled[i]=FALSE;
Menu[MNU_EFFECT].subMenu[i]=NONE;
Menu[MNU_EFFECT].String[i]=
(char*)malloc(15);
Menu[MNU_EFFECT].Tip[i]=(char *)malloc(50);
Menu[MNU_EFFECT].OptionID[i]=11+i;
}
strcpy(&(Menu[MNU_EFFECT].String[0][0]),“Fade
In”);
strcpy(&(Menu[MNU_EFFECT].String[1][0]),“Fade
Out”);
strcpy(&(Menu[MNU_EFFECT].String[2][0]),“-”);
strcpy(&(Menu[MNU_EFFECT].String[3][0]),“Reverse”);
strcpy(&(Menu[MNU_EFFECT].String[4][0]),“Playback
Rate”);
strcpy(&(Menu[MNU_EFFECT].Tip[0][0]),“Reduce
volume with increasing time”);
strcpy(&(Menu[MNU_EFFECT].Tip[1][0]),“Increase
volume with increasing time”);
strcpy(&(Menu[MNU_EFFECT].Tip[2][0]),“ ”);
strcpy(&(Menu[MNU_EFFECT].Tip[3][0]),“Reverse
the wave file”);
strcpy(&(Menu[MNU_EFFECT].Tip[4][0]),“Vary
the Playnack Rate”);
Menu[MNU_EFFECT].subMenu[0]=MNU_FADEIN;
Menu[MNU_EFFECT].subMenu[1]=MNU_FADEOUT;
Menu[MNU_EFFECT].AtX=11;Menu[MNU_EFFECT].
AtY=2;
// The OPERATION menu option
Menu[MNU_OPERATION].nextMenu=MNU_FILE;
Menu[MNU_OPERATION].prevMenu=MNU_EFFECT;
Menu[MNU_OPERATION].Child=FALSE;
Menu[MNU_OPERATION].num_items=3;
for(i=0;i<3;i++)
{
Menu[MNU_OPERATION].Enabled[i]=FALSE;
Menu[MNU_OPERATION].subMenu[i]=NONE;
Menu[MNU_OPERATION].String[i]=
(char*)malloc(15);
Menu[MNU_OPERATION].Tip[i]=
(char*)malloc(50);
Menu[MNU_OPERATION].OptionID[i]=21+i;
}
strcpy(&(Menu[MNU_OPERATION].String[0][0]),“Play”);
strcpy(&(Menu[MNU_OPERATION].String[1]
[0]),“-”);
strcpy(&(Menu[MNU_OPERATION].String[2]
[0]),“Record”);
strcpy(&(Menu[MNU_OPERATION].Tip[0][0]),“Play
the file that was opened”);
strcpy(&(Menu[MNU_OPERATION].Tip[1]
[0]),“ “);
strcpy(&(Menu[MNU_OPERATION].Tip[2][0]),
“Record sound through the microphone”);
Menu[MNU_OPERATION].AtX=23;Menu
[MNU_OPERATION].AtY=2;
// The FADE-IN menu option
Menu[MNU_FADEIN].nextMenu=Menu
[MNU_FADEIN].prevMenu=NONE;
Menu[MNU_FADEIN].Child=TRUE;
Menu[MNU_FADEIN].num_items=2;
for(i=0;i<2;i++)
{
Menu[MNU_FADEIN].Enabled[i]=FALSE;
Menu[MNU_FADEIN].subMenu[i]=NONE;
Menu[MNU_FADEIN].String[i]=
(char *)malloc(15);
Menu[MNU_FADEIN].Tip[i]=(char *)malloc(50);
Menu[MNU_FADEIN].OptionID[i]=31+i;
}
strcpy(&(Menu[MNU_FADEIN].String[0][0]),“Linear”);
strcpy(&(Menu[MNU_FADEIN].String[1][0]),”
Exponential”);
strcpy(&(Menu[MNU_FADEIN].Tip[0][0]),“Apply
Linear attenuation or amplification”);
strcpy(&(Menu[MNU_FADEIN].Tip[1][0]),“Apply
Exponential attenuation or amplification”);
Menu[MNU_FADEIN].AtX=33;Menu
[MNU_FADEIN].AtY=2;
// The FADE-OUT menu option
Menu[MNU_FADEOUT].nextMenu=Menu
[MNU_FADEOUT].prevMenu=NONE;
Menu[MNU_FADEOUT].Child=TRUE;
Menu[MNU_FADEOUT].num_items=2;
for(i=0;i<2;i++)
{
Menu[MNU_FADEOUT].Enabled[i]=FALSE;
Menu[MNU_FADEOUT].subMenu[i]=NONE;
Menu[MNU_FADEOUT].String[i]=
(char *)malloc(15);
Menu[MNU_FADEOUT].Tip[i]=
(char*)malloc(50);
Menu[MNU_FADEOUT].OptionID[i]=41+i;
}
strcpy(&(Menu[MNU_FADEOUT].String[0][0]),
“Linear”);
strcpy(&(Menu[MNU_FADEOUT].String[1][0]),
“Exponential”);
strcpy(&(Menu[MNU_FADEOUT].Tip[0][0]),“Apply
Linear attenuation or amplification”);
strcpy(&(Menu[MNU_FADEOUT].Tip[1][0]),“Apply
Exponential attenuation or amplification”);
Menu[MNU_FADEOUT].AtX=33;Menu
[MNU_FADEOUT].AtY=2;
}
void RemoveMenu(int MenuID)
{
int i,j;
textbackground(BLUE);textcolor(WHITE);
gotoxy(Menu[MenuID].AtX,Menu[MenuID].AtY);
for(i=0;i<30;i++) cprintf(“%c”,205);
for(i=1;i<=Menu[MenuID].num_items+2;i++)
{
gotoxy(Menu[MenuID].AtX,Menu[MenuID].AtY+i);
for(j=0;j<30;j++) cprintf(“ ”);
}
return;
}
int ShowMenu(int MenuID)
{
MENU *menu;
int *subMenu;
int nextMenu, prevMenu;
char **String, **Tip;
int *OptionID;
BOOL *Enabled;
char IsChild;
int num_items;
int longLength,length;
int StartX,StartY;
int i,j;
int CurSelect=0,ch,RetVal;
menu=&(Menu[MenuID]);
num_items=menu->num_items;
String=menu->String;
nextMenu=menu->nextMenu;
prevMenu=menu->prevMenu;
subMenu=menu->subMenu;
IsChild=menu->Child;
OptionID=menu->OptionID;
Tip=menu->Tip;
Enabled=menu->Enabled;
StartX=menu->AtX;
StartY=menu->AtY;
longLength=strlen(String[0]);
if(subMenu[0]!=NULL) longLength+=3;
for(i=1;i<num_items;i++)
{
length=strlen(String[i]);
if(subMenu[i]!=NULL) length+=3;
if(length>longLength) longLength=length;
}
textbackground(LIGHTGRAY);textcolor(WHITE);
for(i=StartY;i<StartY+num_items+2;i++)
{
gotoxy(StartX,i);cprintf(“ ”);
gotoxy(StartX+longLength+5,i);cprintf(“ ”);
}
StartX++;
gotoxy(StartX,StartY);cprintf(“%c”,218);
for(i=0;i<longLength+2;i++) cprintf(“%c”,196);
cprintf(“%c”,191);
gotoxy(StartX,num_items+StartY+1);cprintf(“%c”,192);
for(i=0;i<longLength+2;i++) cprintf(“%c”,196);
cprintf(“%c”,217);
for(i=0;i<num_items;i++)
{
if(String[i][0]!=‘-’)
{
textcolor(WHITE);
gotoxy(StartX,StartY+i+1);cprintf(“%c ”,179);
if(Enabled[i])
textcolor(BLACK);
else
textcolor(BROWN);
gotoxy(StartX+2,StartY+i+1);
for(j=0;j<longLength+1;j++)
if(j<strlen(String[i]))
cprintf(“%c”,String[i][j]);
else
cprintf(“ ”);
textcolor(WHITE);
cprintf(“%c”,179);
}
else
{
textcolor(WHITE);
gotoxy(StartX,StartY+i+1);cprintf(“%c”,195);
for(j=0;j<longLength+2;j++) cprintf(“%c”,196);
cprintf(“%c”,180);
}
}
for(;;)
{
DisplayTip(Tip[CurSelect]);
textbackground(GREEN);
if(Enabled[CurSelect])
textcolor(BLACK);
else
textcolor(BROWN);
gotoxy(StartX+1,StartY+CurSelect+1);
cprintf(“ ”);
for(j=0;j<longLength+1;j++)
if(j<strlen(String[CurSelect]))
cprintf(“%c”,String[CurSelect][j]);
else
cprintf(“ ”);
ch=getch();
if(ch==0) ch=getch();
ch+=300;
switch(ch)
{
case ESCAPE:
RemoveMenu(MenuID);
return(-1);
case ENTER:
RemoveMenu(MenuID);
if(Enabled[CurSelect]==TRUE)
return(OptionID[CurSelect]);
else
return(-1);
case LEFT_ARROW:
if(IsChild==TRUE)
{
78